From 7a0c6949a47f7244757c67429c97b8af2ac27259 Mon Sep 17 00:00:00 2001 From: Mark Mine Date: Mon, 1 Apr 2002 05:16:19 +0000 Subject: [PATCH] Added ability to remotely specify camera frustum, cleaned up config code --- direct/src/cluster/ClusterClient.py | 36 ++++++++- direct/src/cluster/ClusterConfig.py | 111 +++++++++++++++++++++++----- direct/src/cluster/ClusterMsgs.py | 19 ++++- direct/src/cluster/ClusterServer.py | 70 +++++++++++------- 4 files changed, 182 insertions(+), 54 deletions(-) diff --git a/direct/src/cluster/ClusterClient.py b/direct/src/cluster/ClusterClient.py index 475024c1c6..971fa3154c 100644 --- a/direct/src/cluster/ClusterClient.py +++ b/direct/src/cluster/ClusterClient.py @@ -11,12 +11,26 @@ from ClusterMsgs import * import time class ClusterConfigItem: - def __init__(self, serverFunction, serverName, pos, hpr, port): + def __init__(self, serverFunction, serverName, port): self.serverName = serverName self.serverFunction = serverFunction - self.xyz = pos - self.hpr = hpr 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: def __init__(self,qcm,serverName,port,msgHandler): @@ -43,6 +57,18 @@ class DisplayConnection: datagram = self.msgHandler.makeCamOffsetDatagram(xyz, hpr) 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): ClusterManager.notify.debug("send cam move...") ClusterManager.notify.debug( ("packet %d xyz,hpr=%f %f %f %f %f %f" % @@ -84,6 +110,10 @@ class ClusterManager(DirectObject.DirectObject): serverConfig.port)) ) else: server.sendCamOffset(serverConfig.xyz,serverConfig.hpr) + if serverConfig.fFrustum: + server.sendCamFrustum(serverConfig.focalLength, + serverConfig.filmSize, + serverConfig.filmOffset) self.serverList.append(server) self.startMoveCamTask() diff --git a/direct/src/cluster/ClusterConfig.py b/direct/src/cluster/ClusterConfig.py index d14b7a3a94..8be19e6e0a 100644 --- a/direct/src/cluster/ClusterConfig.py +++ b/direct/src/cluster/ClusterConfig.py @@ -11,18 +11,81 @@ import string # Note: If server chan-config consists of multiple display regions # each display region can have an additional offset as specified in # DirectCamConfig.py -ClientConfigs = {'mono-modelcave-pipe0': [ [Vec3(0),Vec3(0)] ], - 'single-server': [ [Vec3(0),Vec3(0)] ], - 'two-server' : [ [Vec3(0),Vec3(-60,0,0)], - [Vec3(0),Vec3(60,0,0)] - ], - 'cavetest' : [ [Vec3(0), Vec3(0)], - [Vec3(0), Vec3(0)], - [Vec3(0), Vec3(0)], - [Vec3(0), Vec3(0)] - ], - } - +ClientConfigs = { + 'mono-modelcave-pipe0': [{'pos' : Vec3(0), + 'hpr' : Vec3(0)} + ], + 'single-server' : [{'pos' : Vec3(0), + 'hpr' : 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(): # setup camera offsets based on cluster-config @@ -35,9 +98,10 @@ def createClusterManager(): return None # Get display config for each server in the cluster displayConfigs = [] - configData = ClientConfigs[clusterConfig] - numConfigs = len(configData) + configList = ClientConfigs[clusterConfig] + numConfigs = len(configList) for i in range(numConfigs): + configData = configList[i] serverConfigName = 'display%d' % i serverString = base.config.GetString(serverConfigName, '') if serverString == '': @@ -53,14 +117,21 @@ def createClusterManager(): else: # Use default port port = CLUSTER_PORT - displayConfigs.append(ClusterConfigItem( + cci = ClusterConfigItem( serverConfigName, serverName, - # Pos Offset - configData[i][0], - # Hpr Offset - configData[i][1], - port)) + port) + # Init Cam Offset + pos = configData.get('pos', Vec3(0)) + hpr = configData.get('hpr', Vec3(0)) + 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) # Are the servers going to be synced? synced = base.config.GetBool('sync-display', 0) diff --git a/direct/src/cluster/ClusterMsgs.py b/direct/src/cluster/ClusterMsgs.py index b859092ee3..9fd17eae4d 100644 --- a/direct/src/cluster/ClusterMsgs.py +++ b/direct/src/cluster/ClusterMsgs.py @@ -10,9 +10,10 @@ #these are the types of messages that are currently supported. CLUSTER_NOTHING = -1 CLUSTER_CAM_OFFSET = 1 -CLUSTER_POS_UPDATE = 2 -CLUSTER_SWAP_READY = 3 -CLUSTER_SWAP_NOW = 4 +CLUSTER_CAM_FRUSTUM = 2 +CLUSTER_POS_UPDATE = 3 +CLUSTER_SWAP_READY = 4 +CLUSTER_SWAP_NOW = 5 #Port number for cluster rendering CLUSTER_PORT = 1970 @@ -89,6 +90,18 @@ class MsgHandler: datagram.addFloat32(hpr[2]) 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): datagram = Datagram.Datagram() datagram.addUint32(self.packetNumber) diff --git a/direct/src/cluster/ClusterServer.py b/direct/src/cluster/ClusterServer.py index 9bf6a84e52..b9959c00f4 100644 --- a/direct/src/cluster/ClusterServer.py +++ b/direct/src/cluster/ClusterServer.py @@ -35,6 +35,7 @@ class ClusterServer(DirectObject.DirectObject): print self.tcpRendezvous self.cameraGroup = cameraGroup self.camera = camera + self.lens = camera.node().getLens() self.qcl.addConnection(self.tcpRendezvous) self.msgHandler = MsgHandler(ClusterServer.MSG_NUM,self.notify) self.startListenerPollTask() @@ -89,39 +90,52 @@ class ClusterServer(DirectObject.DirectObject): return availGetVal def handleCamOffset(self,dgi): - x=dgi.getFloat32() - y=dgi.getFloat32() - z=dgi.getFloat32() - h=dgi.getFloat32() - p=dgi.getFloat32() - r=dgi.getFloat32() - self.notify.debug((' new offset=%f %f %f %f %f %f' % - (x,y,z,h,p,r))) - self.posOffset = Vec3(x,y,z) - self.hprOffset = Vec3(h,p,r) + x=dgi.getFloat32() + y=dgi.getFloat32() + z=dgi.getFloat32() + h=dgi.getFloat32() + p=dgi.getFloat32() + r=dgi.getFloat32() + self.notify.debug((' new offset=%f %f %f %f %f %f' % + (x,y,z,h,p,r))) + self.posOffset = Vec3(x,y,z) + 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): - x=dgi.getFloat32() - y=dgi.getFloat32() - z=dgi.getFloat32() - h=dgi.getFloat32() - p=dgi.getFloat32() - r=dgi.getFloat32() - self.notify.debug((' new position=%f %f %f %f %f %f' % - (x,y,z,h,p,r))) - finalX = x + self.posOffset[0] - finalY = y + self.posOffset[1] - finalZ = z + self.posOffset[2] - finalH = h + self.hprOffset[0] - finalP = p + self.hprOffset[1] - finalR = r + self.hprOffset[2] - self.cameraGroup.setPosHpr(render,finalX,finalY,finalZ, - finalH,finalP,finalR) - + x=dgi.getFloat32() + y=dgi.getFloat32() + z=dgi.getFloat32() + h=dgi.getFloat32() + p=dgi.getFloat32() + r=dgi.getFloat32() + self.notify.debug((' new position=%f %f %f %f %f %f' % + (x,y,z,h,p,r))) + finalX = x + self.posOffset[0] + finalY = y + self.posOffset[1] + finalZ = z + self.posOffset[2] + finalH = h + self.hprOffset[0] + finalP = p + self.hprOffset[1] + finalR = r + self.hprOffset[2] + self.cameraGroup.setPosHpr(render,finalX,finalY,finalZ, + finalH,finalP,finalR) + def handleDatagram(self, datagram): - (type, dgi) = msgHandler.nonBlockingRead(self.qcr) + (type, dgi) = self.msgHandler.nonBlockingRead(self.qcr) if type==CLUSTER_CAM_OFFSET: self.handleCamOffset(dgi) + elif type==CLUSTER_CAM_FRUSTUM: + self.handleCamFrustum(dgi) elif type==CLUSTER_POS_UPDATE: self.handleCamMovement(dgi) elif type==CLUSTER_SWAP_READY: