Просмотр исходного кода

better behavior when frame counts are mismatched

David Rose 22 лет назад
Родитель
Сommit
9d137295f6
1 измененных файлов с 26 добавлено и 13 удалено
  1. 26 13
      direct/src/interval/ActorInterval.py

+ 26 - 13
direct/src/interval/ActorInterval.py

@@ -71,7 +71,17 @@ class ActorInterval(Interval.Interval):
             elif endTime != None:
                 self.endFrame = int(math.floor(endTime * self.frameRate + 0.0001))
             else:
-                self.endFrame = self.controls[0].getNumFrames() - 1
+                # No end frame specified.  Choose the maximum of all
+                # of the controls' numbers of frames.
+                maxFrames = self.controls[0].getNumFrames()
+                warned = 0
+                for i in range(1, len(self.controls)):
+                    numFrames = self.controls[i].getNumFrames()
+                    if numFrames != maxFrames and not warned:
+                        self.notify.warning("Animations '%s' on %s have an inconsistent number of frames." % (animName, actor.getName()))
+                        warned = 1
+                    maxFrames = max(maxFrames, numFrames)
+                self.endFrame = maxFrames - 1
 
         # Must we play the animation backwards?
         self.reverse = 0
@@ -81,29 +91,20 @@ class ActorInterval(Interval.Interval):
             self.endFrame = self.startFrame
             self.startFrame = t
 
-        self.numFrames = self.endFrame - self.startFrame + 1
+        numFrames = self.endFrame - self.startFrame + 1
 
         # Compute duration if no duration specified
         self.implicitDuration = 0
         if duration == None:
             self.implicitDuration = 1
-            duration = float(self.numFrames) / self.frameRate
+            duration = float(numFrames) / self.frameRate
 
         # Initialize superclass
         Interval.Interval.__init__(self, name, duration)
 
     def privStep(self, t):
         # Calc integer frame number
-        frame = int(math.floor(t * self.frameRate + 0.0001))
-        if self.loopAnim:
-            frame = frame % self.numFrames
-        else:
-            frame = max(min(frame, self.numFrames - 1), 0)
-
-        if self.reverse:
-            frame = self.endFrame - frame
-        else:
-            frame = self.startFrame + frame
+        absFrame = int(math.floor(t * self.frameRate + 0.0001))
 
         # Pose anim
 
@@ -111,6 +112,18 @@ class ActorInterval(Interval.Interval):
         # efficiency's sake, rather than going through the relatively
         # expensive Actor interface every frame.
         for control in self.controls:
+            # Each animControl might have a different number of frames.
+            numFrames = control.getNumFrames()
+            if self.loopAnim:
+                frame = absFrame % numFrames
+            else:
+                frame = max(min(absFrame, numFrames - 1), 0)
+
+            if self.reverse:
+                frame = self.endFrame - frame
+            else:
+                frame = self.startFrame + frame
+
             control.pose(frame)
             
         self.state = CInterval.SStarted