diff --git a/direct/src/cluster/ClusterClient.py b/direct/src/cluster/ClusterClient.py index acfdfe0989..0153013b58 100644 --- a/direct/src/cluster/ClusterClient.py +++ b/direct/src/cluster/ClusterClient.py @@ -31,11 +31,7 @@ class ClusterClient(DirectObject.DirectObject): serverConfig.filmOffset) self.serverList.append(server) self.startMoveCamTask() - - def moveCamera(self, xyz, hpr): - self.notify.debug('moving unsynced camera') - for server in self.serverList: - server.sendMoveCam(xyz,hpr) + self.startMoveSelectedTask() def startMoveCamTask(self): taskMgr.add(self.moveCameraTask, "moveCamTask", 49) @@ -45,7 +41,27 @@ class ClusterClient(DirectObject.DirectObject): base.camera.getPos(render), base.camera.getHpr(render)) return Task.cont - + + def moveCamera(self, xyz, hpr): + self.notify.debug('moving unsynced camera') + for server in self.serverList: + server.sendMoveCam(xyz,hpr) + + def startMoveSelectedTask(self): + taskMgr.add(self.moveSelectedTask, "moveSelectedTask", 48) + + def moveSelectedTask(self, state): + # Update cluster if current display is a cluster client + if (last is not None): + self.notify.debug('moving selected node path') + xyz = Point3(0) + hpr = VBase3(0) + scale = VBase3(1) + decomposeMatrix(last.getMat(), scale, hpr, xyz) + for server in self.serverList: + server.sendMoveSelected(xyz,hpr) + return Task.cont + def getNodePathFindCmd(self, nodePath): import string pathString = `nodePath` @@ -165,6 +181,15 @@ class DisplayConnection: datagram = self.msgHandler.makeCamMovementDatagram(xyz, hpr) self.cw.send(datagram, self.tcpConn) + def sendMoveSelected(self,xyz,hpr): + ClusterClient.notify.debug("send move selected...") + ClusterClient.notify.debug("packet %d xyz,hpr=%f %f %f %f %f %f" % + (self.msgHandler.packetNumber, + xyz[0],xyz[1],xyz[2], + hpr[0],hpr[1],hpr[2])) + datagram = self.msgHandler.makeSelectedMovementDatagram(xyz, hpr) + self.cw.send(datagram, self.tcpConn) + # the following should only be called by a synchronized cluster manger def getSwapReady(self): while 1: diff --git a/direct/src/cluster/ClusterMsgs.py b/direct/src/cluster/ClusterMsgs.py index d258546c27..fc8b3cda6b 100644 --- a/direct/src/cluster/ClusterMsgs.py +++ b/direct/src/cluster/ClusterMsgs.py @@ -15,6 +15,7 @@ CLUSTER_CAM_MOVEMENT = 3 CLUSTER_SWAP_READY = 4 CLUSTER_SWAP_NOW = 5 CLUSTER_COMMAND_STRING = 6 +CLUSTER_SELECTED_MOVEMENT = 7 CLUSTER_EXIT = 100 #Port number for cluster rendering @@ -143,6 +144,30 @@ class ClusterMsgHandler: (x,y,z,h,p,r))) return (x,y,z,h,p,r) + def makeSelectedMovementDatagram(self,xyz,hpr): + datagram = Datagram.Datagram() + datagram.addUint32(self.packetNumber) + self.packetNumber = self.packetNumber + 1 + datagram.addUint8(CLUSTER_SELECTED_MOVEMENT) + datagram.addFloat32(xyz[0]) + datagram.addFloat32(xyz[1]) + datagram.addFloat32(xyz[2]) + datagram.addFloat32(hpr[0]) + datagram.addFloat32(hpr[1]) + datagram.addFloat32(hpr[2]) + return datagram + + def parseSelectedMovementDatagram(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)) + return (x,y,z,h,p,r) + def makeCommandStringDatagram(self, commandString): datagram = Datagram.Datagram() datagram.addUint32(self.packetNumber) diff --git a/direct/src/cluster/ClusterServer.py b/direct/src/cluster/ClusterServer.py index d2d7e05f27..623e14e1e2 100644 --- a/direct/src/cluster/ClusterServer.py +++ b/direct/src/cluster/ClusterServer.py @@ -86,6 +86,8 @@ class ClusterServer(DirectObject.DirectObject): self.handleCamFrustum(dgi) elif (type == CLUSTER_CAM_MOVEMENT): self.handleCamMovement(dgi) + elif (type == CLUSTER_SELECTED_MOVEMENT): + self.handleSelectedMovement(dgi) elif (type == CLUSTER_COMMAND_STRING): self.handleCommandString(dgi) elif (type == CLUSTER_SWAP_READY): @@ -117,6 +119,12 @@ class ClusterServer(DirectObject.DirectObject): self.cameraJig.setPosHpr(render,x,y,z,h,p,r) self.fPosReceived = 1 + def handleSelectedMovement(self,dgi): + """ Update cameraJig position to reflect latest position """ + (x,y,z,h,p,r) = self.msgHandler.parseSelectedMovementDatagram(dgi) + if last: + last.setPosHpr(x,y,z,h,p,r) + def handleCommandString(self, dgi): """ Handle arbitrary command string from client """ command = self.msgHandler.parseCommandStringDatagram(dgi)