Browse Source

tweaks to actor

Zachary Pavlov 18 years ago
parent
commit
0109caeeed
1 changed files with 24 additions and 18 deletions
  1. 24 18
      direct/src/actor/Actor.py

+ 24 - 18
direct/src/actor/Actor.py

@@ -38,7 +38,7 @@ class Actor(DirectObject, NodePath):
             self.partBundleNP = partBundleNP
             self.partBundleNP = partBundleNP
             self.partBundle = partBundle
             self.partBundle = partBundle
             self.partModel = partModel
             self.partModel = partModel
-
+        
         def __repr__(self):
         def __repr__(self):
             return 'Actor.PartDef(%s, %s)' % (repr(self.partBundleNP), repr(self.partModel))
             return 'Actor.PartDef(%s, %s)' % (repr(self.partBundleNP), repr(self.partModel))
 
 
@@ -301,7 +301,7 @@ class Actor(DirectObject, NodePath):
     def copyActor(self, other, overwrite=False):
     def copyActor(self, other, overwrite=False):
             # act like a copy constructor
             # act like a copy constructor
             self.gotName = other.gotName
             self.gotName = other.gotName
-
+            
             # copy the scene graph elements of other
             # copy the scene graph elements of other
             if (overwrite):
             if (overwrite):
                 otherCopy = other.copyTo(NodePath())
                 otherCopy = other.copyTo(NodePath())
@@ -325,7 +325,7 @@ class Actor(DirectObject, NodePath):
             self.__copyPartBundles(other)
             self.__copyPartBundles(other)
             self.__copySubpartDict(other)
             self.__copySubpartDict(other)
             self.__subpartsComplete = other.__subpartsComplete
             self.__subpartsComplete = other.__subpartsComplete
-
+            
             # copy the anim dictionary from other
             # copy the anim dictionary from other
             self.__copyAnimControls(other)
             self.__copyAnimControls(other)
 
 
@@ -446,8 +446,9 @@ class Actor(DirectObject, NodePath):
         self.stop(None)
         self.stop(None)
         self.__frozenJoints = {}
         self.__frozenJoints = {}
         self.flush()
         self.flush()
-        self.__geomNode.removeNode()
-        self.__geomNode = None
+        if(self.__geomNode):
+            self.__geomNode.removeNode()
+            self.__geomNode = None
         if not self.isEmpty():
         if not self.isEmpty():
             self.removeNode()
             self.removeNode()
 
 
@@ -474,7 +475,8 @@ class Actor(DirectObject, NodePath):
             self.__LODNode = None
             self.__LODNode = None
 
 
         # remove all its children
         # remove all its children
-        self.__geomNode.removeChildren()
+        if(self.__geomNode):
+            self.__geomNode.removeChildren()
 
 
         
         
         self.__hasLOD = 0
         self.__hasLOD = 0
@@ -1002,6 +1004,17 @@ class Actor(DirectObject, NodePath):
         else:
         else:
             Actor.notify.warning("no joint named %s!" % (jointName))
             Actor.notify.warning("no joint named %s!" % (jointName))
 
 
+    def getJoints(self, jointName):
+        joints=[]
+        for lod in self.__partBundleDict.values():
+            for part in lod.values():
+                partBundle=part.partBundle
+                joint=partBundle.findChild(jointName)
+                if(joint):
+                    joints.append(joint)
+
+        return joints
+    
     def getJointTransform(self,partName, jointName, lodName='lodRoot'):
     def getJointTransform(self,partName, jointName, lodName='lodRoot'):
         partBundleDict=self.__partBundleDict.get(lodName)
         partBundleDict=self.__partBundleDict.get(lodName)
         if not partBundleDict:
         if not partBundleDict:
@@ -1076,20 +1089,9 @@ class Actor(DirectObject, NodePath):
         #trueName = self.__subpartDict[partName].truePartName
         #trueName = self.__subpartDict[partName].truePartName
         subpartDef = self.__subpartDict.get(partName, Actor.SubpartDef(partName))
         subpartDef = self.__subpartDict.get(partName, Actor.SubpartDef(partName))
         trueName = subpartDef.truePartName
         trueName = subpartDef.truePartName
-
         for bundleDict in self.__partBundleDict.values():     
         for bundleDict in self.__partBundleDict.values():     
             bundleDict[trueName].partBundle.findChild(jointName).freezeJoint(transform)
             bundleDict[trueName].partBundle.findChild(jointName).freezeJoint(transform)
             
             
-#            self.__frozenJoints[bundle.this][jointName] = transform
-            
-
-    #This is an alternate method to control joints, which can be copied
-    #This function is optimal in a non control jointed actor 
-    def freezeJointMat(self, partName, jointName, mat):
-        subpartDef = self.__subpartDict.get(partName, Actor.SubpartDef(partName))
-        trueName = subpartDef.truePartName
-        for bundleDict in self.__partBundleDict.values():     
-            bundleDict[trueName].partBundle.findChild(jointName).freezeJoint(Mat4(mat))
 
 
     def instance(self, path, partName, jointName, lodName="lodRoot"):
     def instance(self, path, partName, jointName, lodName="lodRoot"):
         """instance(self, NodePath, string, string, key="lodRoot")
         """instance(self, NodePath, string, string, key="lodRoot")
@@ -1301,6 +1303,7 @@ class Actor(DirectObject, NodePath):
         is given then try to loop on all parts. NOTE: loops on
         is given then try to loop on all parts. NOTE: loops on
         all LOD's
         all LOD's
         """
         """
+    
         if fromFrame == None:
         if fromFrame == None:
             for control in self.getAnimControls(animName, partName):
             for control in self.getAnimControls(animName, partName):
                 control.loop(restart)
                 control.loop(restart)
@@ -1455,6 +1458,7 @@ class Actor(DirectObject, NodePath):
         a given anim and part. If none specified, try the first part and lod.
         a given anim and part. If none specified, try the first part and lod.
         Return the animControl if present, or None otherwise
         Return the animControl if present, or None otherwise
         """
         """
+    
         if not partName:
         if not partName:
             partName = 'modelRoot'
             partName = 'modelRoot'
 
 
@@ -1962,7 +1966,7 @@ class Actor(DirectObject, NodePath):
         # Before we apply any control joints, we have to make a
         # Before we apply any control joints, we have to make a
         # copy of the bundle hierarchy, so we don't modify other
         # copy of the bundle hierarchy, so we don't modify other
         # Actors that share the same bundle.
         # Actors that share the same bundle.
-        animBundle = animBundle.copyBundle()
+
 
 
 
 
         # Are there any controls requested for joints in this bundle?
         # Are there any controls requested for joints in this bundle?
@@ -1970,6 +1974,8 @@ class Actor(DirectObject, NodePath):
         assert Actor.notify.debug('actor bundle %s, %s'% (bundle,bundle.this))
         assert Actor.notify.debug('actor bundle %s, %s'% (bundle,bundle.this))
         controlDict = self.__controlJoints.get(bundle.this, None)
         controlDict = self.__controlJoints.get(bundle.this, None)
 
 
+        animBundle = animBundle.copyBundle()
+
         if controlDict:
         if controlDict:
             for jointName, node in controlDict.items():
             for jointName, node in controlDict.items():
                 if node:
                 if node: