Procházet zdrojové kódy

Added message to move selected

Mark Mine před 24 roky
rodič
revize
edabd48a6f

+ 31 - 6
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:

+ 25 - 0
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)

+ 8 - 0
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)