diff --git a/direct/src/interval/ActorInterval.py b/direct/src/interval/ActorInterval.py index 932edcb790..7f483d403c 100644 --- a/direct/src/interval/ActorInterval.py +++ b/direct/src/interval/ActorInterval.py @@ -30,9 +30,13 @@ class ActorInterval(Interval.Interval): # Note: if loop == 0 and duration > anim duration then the # animation will play once and then hold its final pose for the # remainder of the interval. + + # loop = 1 implies a loop within the entire range of animation, + # while constrainedLoop = 1 implies a loop within startFrame and + # endFrame only. - def __init__(self, actor, animName, loop=0, duration=None, - startTime=None, endTime=None, + def __init__(self, actor, animName, loop=0, constrainedLoop=0, + duration=None, startTime=None, endTime=None, startFrame=None, endFrame=None, playRate=1.0, name=None, forceUpdate=0, partName=None, lodName=None): @@ -47,6 +51,7 @@ class ActorInterval(Interval.Interval): self.controls = self.actor.getAnimControls( self.animName, partName = partName, lodName = lodName) self.loopAnim = loop + self.constrainedLoop = constrainedLoop self.forceUpdate = forceUpdate # If no name specified, use id as name @@ -101,22 +106,26 @@ class ActorInterval(Interval.Interval): self.endFrame = self.startFrame self.startFrame = t - numFrames = self.endFrame - self.startFrame + 1 + self.numFrames = self.endFrame - self.startFrame + 1 # Compute duration if no duration specified self.implicitDuration = 0 if duration == None: self.implicitDuration = 1 - duration = float(numFrames) / self.frameRate + duration = float(self.numFrames) / self.frameRate # Initialize superclass Interval.Interval.__init__(self, name, duration) def privStep(self, t): + frameCount = t * self.frameRate + if self.constrainedLoop: + frameCount = frameCount % self.numFrames + if self.reverse: - absFrame = self.endFrame - t * self.frameRate + absFrame = self.endFrame - frameCount else: - absFrame = self.startFrame + t * self.frameRate + absFrame = self.startFrame + frameCount # Calc integer frame number absFrame = int(math.floor(absFrame + 0.0001))