mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 19:08:55 -04:00
Added ability to remotely specify camera frustum, cleaned up config code
This commit is contained in:
parent
d72136e596
commit
7a0c6949a4
@ -11,12 +11,26 @@ from ClusterMsgs import *
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
class ClusterConfigItem:
|
class ClusterConfigItem:
|
||||||
def __init__(self, serverFunction, serverName, pos, hpr, port):
|
def __init__(self, serverFunction, serverName, port):
|
||||||
self.serverName = serverName
|
self.serverName = serverName
|
||||||
self.serverFunction = serverFunction
|
self.serverFunction = serverFunction
|
||||||
self.xyz = pos
|
|
||||||
self.hpr = hpr
|
|
||||||
self.port = port
|
self.port = port
|
||||||
|
# Camera Offset
|
||||||
|
self.xyz = Vec3(0)
|
||||||
|
self.hpr = Vec3(0)
|
||||||
|
# Camera Frustum Data
|
||||||
|
self.fFrustum = 0
|
||||||
|
self.focalLength = None
|
||||||
|
self.filmSize = None
|
||||||
|
self.filmOffset = None
|
||||||
|
def setCamOffset(self, xyz, hpr):
|
||||||
|
self.xyz = xyz
|
||||||
|
self.hpr = hpr
|
||||||
|
def setCamFrustum(self, focalLength, filmSize, filmOffset):
|
||||||
|
self.fFrustum = 1
|
||||||
|
self.focalLength = focalLength
|
||||||
|
self.filmSize = filmSize
|
||||||
|
self.filmOffset = filmOffset
|
||||||
|
|
||||||
class DisplayConnection:
|
class DisplayConnection:
|
||||||
def __init__(self,qcm,serverName,port,msgHandler):
|
def __init__(self,qcm,serverName,port,msgHandler):
|
||||||
@ -43,6 +57,18 @@ class DisplayConnection:
|
|||||||
datagram = self.msgHandler.makeCamOffsetDatagram(xyz, hpr)
|
datagram = self.msgHandler.makeCamOffsetDatagram(xyz, hpr)
|
||||||
self.cw.send(datagram, self.tcpConn)
|
self.cw.send(datagram, self.tcpConn)
|
||||||
|
|
||||||
|
def sendCamFrustum(self,focalLength, filmSize, filmOffset):
|
||||||
|
ClusterManager.notify.debug("send cam frustum...")
|
||||||
|
ClusterManager.notify.debug(
|
||||||
|
(("packet %d" % self.msgHandler.packetNumber) +
|
||||||
|
(" fl, fs, fo=%0.3f, (%0.3f, %0.3f), (%0.3f, %0.3f)" %
|
||||||
|
(focalLength, filmSize[0], filmSize[1],
|
||||||
|
filmOffset[0], filmOffset[1])))
|
||||||
|
)
|
||||||
|
datagram = self.msgHandler.makeCamFrustumDatagram(
|
||||||
|
focalLength, filmSize, filmOffset)
|
||||||
|
self.cw.send(datagram, self.tcpConn)
|
||||||
|
|
||||||
def sendMoveCam(self,xyz,hpr):
|
def sendMoveCam(self,xyz,hpr):
|
||||||
ClusterManager.notify.debug("send cam move...")
|
ClusterManager.notify.debug("send cam move...")
|
||||||
ClusterManager.notify.debug( ("packet %d xyz,hpr=%f %f %f %f %f %f" %
|
ClusterManager.notify.debug( ("packet %d xyz,hpr=%f %f %f %f %f %f" %
|
||||||
@ -84,6 +110,10 @@ class ClusterManager(DirectObject.DirectObject):
|
|||||||
serverConfig.port)) )
|
serverConfig.port)) )
|
||||||
else:
|
else:
|
||||||
server.sendCamOffset(serverConfig.xyz,serverConfig.hpr)
|
server.sendCamOffset(serverConfig.xyz,serverConfig.hpr)
|
||||||
|
if serverConfig.fFrustum:
|
||||||
|
server.sendCamFrustum(serverConfig.focalLength,
|
||||||
|
serverConfig.filmSize,
|
||||||
|
serverConfig.filmOffset)
|
||||||
self.serverList.append(server)
|
self.serverList.append(server)
|
||||||
self.startMoveCamTask()
|
self.startMoveCamTask()
|
||||||
|
|
||||||
|
@ -11,19 +11,82 @@ import string
|
|||||||
# Note: If server chan-config consists of multiple display regions
|
# Note: If server chan-config consists of multiple display regions
|
||||||
# each display region can have an additional offset as specified in
|
# each display region can have an additional offset as specified in
|
||||||
# DirectCamConfig.py
|
# DirectCamConfig.py
|
||||||
ClientConfigs = {'mono-modelcave-pipe0': [ [Vec3(0),Vec3(0)] ],
|
ClientConfigs = {
|
||||||
'single-server': [ [Vec3(0),Vec3(0)] ],
|
'mono-modelcave-pipe0': [{'pos' : Vec3(0),
|
||||||
'two-server' : [ [Vec3(0),Vec3(-60,0,0)],
|
'hpr' : Vec3(0)}
|
||||||
[Vec3(0),Vec3(60,0,0)]
|
|
||||||
],
|
],
|
||||||
'cavetest' : [ [Vec3(0), Vec3(0)],
|
'single-server' : [{'pos' : Vec3(0),
|
||||||
[Vec3(0), Vec3(0)],
|
'hpr' : Vec3(0)}
|
||||||
[Vec3(0), Vec3(0)],
|
],
|
||||||
[Vec3(0), Vec3(0)]
|
'two-server' : [{'pos' : Vec3(0),
|
||||||
|
'hpr' : Vec3(-60,0,0)},
|
||||||
|
{'pos' : Vec3(0),
|
||||||
|
'hpr' : Vec3(60,0,0)}
|
||||||
|
],
|
||||||
|
'cavetest' : [{'pos' : Vec3(-0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(51.213, 0.000, 0.000),
|
||||||
|
'focal length' : 0.809,
|
||||||
|
'film size' : (1.000, 0.831),
|
||||||
|
'film offset' : (0.000, 0.173),
|
||||||
|
},
|
||||||
|
{'pos' : Vec3(-0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(-0.370, 0.000, 0.000),
|
||||||
|
'focal length' : 0.815,
|
||||||
|
'film size' : (1.000, 0.831),
|
||||||
|
'film offset' : (0.000, 0.173),
|
||||||
|
},
|
||||||
|
{'pos' : Vec3(-0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(-51.675, 0.000, 0.000),
|
||||||
|
'focal length' : 0.820,
|
||||||
|
'film size' : (1.000, 0.830),
|
||||||
|
'film offset' : (-0.000, 0.173),
|
||||||
|
},
|
||||||
|
{'pos' : Vec3(0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(51.675, 0.000, 0.000),
|
||||||
|
'focal length' : 0.820,
|
||||||
|
'film size' : (1.000, 0.830),
|
||||||
|
'film offset' : (0.000, 0.173),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'cavetest-all' : [{'pos' : Vec3(-0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(51.213, 0.000, 0.000),
|
||||||
|
'focal length' : 0.809,
|
||||||
|
'film size' : (1.000, 0.831),
|
||||||
|
'film offset' : (0.000, 0.173),
|
||||||
|
},
|
||||||
|
{'pos' : Vec3(-0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(-0.370, 0.000, 0.000),
|
||||||
|
'focal length' : 0.815,
|
||||||
|
'film size' : (1.000, 0.831),
|
||||||
|
'film offset' : (0.000, 0.173),
|
||||||
|
},
|
||||||
|
{'pos' : Vec3(-0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(-51.675, 0.000, 0.000),
|
||||||
|
'focal length' : 0.820,
|
||||||
|
'film size' : (1.000, 0.830),
|
||||||
|
'film offset' : (-0.000, 0.173),
|
||||||
|
},
|
||||||
|
{'pos' : Vec3(0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(51.675, 0.000, 0.000),
|
||||||
|
'focal length' : 0.820,
|
||||||
|
'film size' : (1.000, 0.830),
|
||||||
|
'film offset' : (0.000, 0.173),
|
||||||
|
},
|
||||||
|
{'pos' : Vec3(0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(0.370, 0.000, 0.000),
|
||||||
|
'focal length' : 0.815,
|
||||||
|
'film size' : (1.000, 0.831),
|
||||||
|
'film offset' : (0.000, 0.173),
|
||||||
|
},
|
||||||
|
{'pos' : Vec3(0.105, -0.020, 5.000),
|
||||||
|
'hpr' : Vec3(-51.213, 0.000, 0.000),
|
||||||
|
'focal length' : 0.809,
|
||||||
|
'film size' : (1.000, 0.831),
|
||||||
|
'film offset' : (-0.000, 0.173),
|
||||||
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def createClusterManager():
|
def createClusterManager():
|
||||||
# setup camera offsets based on cluster-config
|
# setup camera offsets based on cluster-config
|
||||||
clusterConfig = base.config.GetString('cluster-config', 'single-server')
|
clusterConfig = base.config.GetString('cluster-config', 'single-server')
|
||||||
@ -35,9 +98,10 @@ def createClusterManager():
|
|||||||
return None
|
return None
|
||||||
# Get display config for each server in the cluster
|
# Get display config for each server in the cluster
|
||||||
displayConfigs = []
|
displayConfigs = []
|
||||||
configData = ClientConfigs[clusterConfig]
|
configList = ClientConfigs[clusterConfig]
|
||||||
numConfigs = len(configData)
|
numConfigs = len(configList)
|
||||||
for i in range(numConfigs):
|
for i in range(numConfigs):
|
||||||
|
configData = configList[i]
|
||||||
serverConfigName = 'display%d' % i
|
serverConfigName = 'display%d' % i
|
||||||
serverString = base.config.GetString(serverConfigName, '')
|
serverString = base.config.GetString(serverConfigName, '')
|
||||||
if serverString == '':
|
if serverString == '':
|
||||||
@ -53,14 +117,21 @@ def createClusterManager():
|
|||||||
else:
|
else:
|
||||||
# Use default port
|
# Use default port
|
||||||
port = CLUSTER_PORT
|
port = CLUSTER_PORT
|
||||||
displayConfigs.append(ClusterConfigItem(
|
cci = ClusterConfigItem(
|
||||||
serverConfigName,
|
serverConfigName,
|
||||||
serverName,
|
serverName,
|
||||||
# Pos Offset
|
port)
|
||||||
configData[i][0],
|
# Init Cam Offset
|
||||||
# Hpr Offset
|
pos = configData.get('pos', Vec3(0))
|
||||||
configData[i][1],
|
hpr = configData.get('hpr', Vec3(0))
|
||||||
port))
|
cci.setCamOffset(pos, hpr)
|
||||||
|
# Init Frustum if specified
|
||||||
|
fl = configData.get('focalLength', None)
|
||||||
|
fs = configData.get('filmSize', None)
|
||||||
|
fo = configData.get('filmOffset', None)
|
||||||
|
if fl and fs and fo:
|
||||||
|
cci.setCamFrustum(fl, fs, fo)
|
||||||
|
displayConfigs.append(cci)
|
||||||
# Create Cluster Managers (opening connections to servers)
|
# Create Cluster Managers (opening connections to servers)
|
||||||
# Are the servers going to be synced?
|
# Are the servers going to be synced?
|
||||||
synced = base.config.GetBool('sync-display', 0)
|
synced = base.config.GetBool('sync-display', 0)
|
||||||
|
@ -10,9 +10,10 @@
|
|||||||
#these are the types of messages that are currently supported.
|
#these are the types of messages that are currently supported.
|
||||||
CLUSTER_NOTHING = -1
|
CLUSTER_NOTHING = -1
|
||||||
CLUSTER_CAM_OFFSET = 1
|
CLUSTER_CAM_OFFSET = 1
|
||||||
CLUSTER_POS_UPDATE = 2
|
CLUSTER_CAM_FRUSTUM = 2
|
||||||
CLUSTER_SWAP_READY = 3
|
CLUSTER_POS_UPDATE = 3
|
||||||
CLUSTER_SWAP_NOW = 4
|
CLUSTER_SWAP_READY = 4
|
||||||
|
CLUSTER_SWAP_NOW = 5
|
||||||
|
|
||||||
#Port number for cluster rendering
|
#Port number for cluster rendering
|
||||||
CLUSTER_PORT = 1970
|
CLUSTER_PORT = 1970
|
||||||
@ -89,6 +90,18 @@ class MsgHandler:
|
|||||||
datagram.addFloat32(hpr[2])
|
datagram.addFloat32(hpr[2])
|
||||||
return datagram
|
return datagram
|
||||||
|
|
||||||
|
def makeCamFrustumDatagram(self,focalLength, filmSize, filmOffset):
|
||||||
|
datagram = Datagram.Datagram()
|
||||||
|
datagram.addUint32(self.packetNumber)
|
||||||
|
self.packetNumber = self.packetNumber + 1
|
||||||
|
datagram.addUint8(CLUSTER_CAM_FRUSTUM)
|
||||||
|
datagram.addFloat32(focalLength)
|
||||||
|
datagram.addFloat32(filmSize[0])
|
||||||
|
datagram.addFloat32(filmSize[1])
|
||||||
|
datagram.addFloat32(filmOffset[0])
|
||||||
|
datagram.addFloat32(filmOffset[1])
|
||||||
|
return datagram
|
||||||
|
|
||||||
def makeMoveCamDatagram(self,xyz,hpr):
|
def makeMoveCamDatagram(self,xyz,hpr):
|
||||||
datagram = Datagram.Datagram()
|
datagram = Datagram.Datagram()
|
||||||
datagram.addUint32(self.packetNumber)
|
datagram.addUint32(self.packetNumber)
|
||||||
|
@ -35,6 +35,7 @@ class ClusterServer(DirectObject.DirectObject):
|
|||||||
print self.tcpRendezvous
|
print self.tcpRendezvous
|
||||||
self.cameraGroup = cameraGroup
|
self.cameraGroup = cameraGroup
|
||||||
self.camera = camera
|
self.camera = camera
|
||||||
|
self.lens = camera.node().getLens()
|
||||||
self.qcl.addConnection(self.tcpRendezvous)
|
self.qcl.addConnection(self.tcpRendezvous)
|
||||||
self.msgHandler = MsgHandler(ClusterServer.MSG_NUM,self.notify)
|
self.msgHandler = MsgHandler(ClusterServer.MSG_NUM,self.notify)
|
||||||
self.startListenerPollTask()
|
self.startListenerPollTask()
|
||||||
@ -100,6 +101,17 @@ class ClusterServer(DirectObject.DirectObject):
|
|||||||
self.posOffset = Vec3(x,y,z)
|
self.posOffset = Vec3(x,y,z)
|
||||||
self.hprOffset = Vec3(h,p,r)
|
self.hprOffset = Vec3(h,p,r)
|
||||||
|
|
||||||
|
def handleCamFrustum(self,dgi):
|
||||||
|
focalLength=dgi.getFloat32()
|
||||||
|
filmSize=(dgi.getFloat32(), dgi.getFloat32())
|
||||||
|
filmOffset=(dgi.getFloat32(),dgi.getFloat32())
|
||||||
|
self.notify.debug(' fl, fs, fo=%f, (%f, %f), (%f, %f)' %
|
||||||
|
(focalLength, filmSize[0], filmSize[1],
|
||||||
|
filmOffset[0], filmOffset[1]))
|
||||||
|
self.lens.setFocalLength(focalLength)
|
||||||
|
self.lens.setFilmSize(filmSize[0], filmSize[1])
|
||||||
|
self.lens.setFilmOffset(filmOffset[0], filmOffset[1])
|
||||||
|
|
||||||
def handleCamMovement(self,dgi):
|
def handleCamMovement(self,dgi):
|
||||||
x=dgi.getFloat32()
|
x=dgi.getFloat32()
|
||||||
y=dgi.getFloat32()
|
y=dgi.getFloat32()
|
||||||
@ -119,9 +131,11 @@ class ClusterServer(DirectObject.DirectObject):
|
|||||||
finalH,finalP,finalR)
|
finalH,finalP,finalR)
|
||||||
|
|
||||||
def handleDatagram(self, datagram):
|
def handleDatagram(self, datagram):
|
||||||
(type, dgi) = msgHandler.nonBlockingRead(self.qcr)
|
(type, dgi) = self.msgHandler.nonBlockingRead(self.qcr)
|
||||||
if type==CLUSTER_CAM_OFFSET:
|
if type==CLUSTER_CAM_OFFSET:
|
||||||
self.handleCamOffset(dgi)
|
self.handleCamOffset(dgi)
|
||||||
|
elif type==CLUSTER_CAM_FRUSTUM:
|
||||||
|
self.handleCamFrustum(dgi)
|
||||||
elif type==CLUSTER_POS_UPDATE:
|
elif type==CLUSTER_POS_UPDATE:
|
||||||
self.handleCamMovement(dgi)
|
self.handleCamMovement(dgi)
|
||||||
elif type==CLUSTER_SWAP_READY:
|
elif type==CLUSTER_SWAP_READY:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user