better behavior when frame counts are mismatched

This commit is contained in:
David Rose 2003-08-21 16:57:44 +00:00
parent 25977a911d
commit 9d137295f6

View File

@ -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