Explorar el Código

*** empty log message ***

Mike Goslin hace 24 años
padre
commit
99094b4a9d
Se han modificado 2 ficheros con 28 adiciones y 9 borrados
  1. 25 7
      direct/src/interval/ActorInterval.py
  2. 3 2
      direct/src/interval/Interval.py

+ 25 - 7
direct/src/interval/ActorInterval.py

@@ -24,7 +24,7 @@ class ActorInterval(Interval):
     # will play once and then nothing will happen for the remainder of the
     # interval
     def __init__(self, actor, animName, loop=0, duration=0.0,
-                 startTime = 0.0, name=None):
+                 startTime=0.0, endTime=None, name=None):
         """__init__(name)
         """
         # Generate unique id
@@ -42,19 +42,37 @@ class ActorInterval(Interval):
 	if (name == None):
 	    name = id
         # Compute duration if no duration specified
+	reverse = 0
         if duration == 0.0:
-	    duration = max(self.actor.getDuration(self.animName) - startTime,
-                           0.0)
+	    if (endTime == None):
+	    	duration = max(self.actor.getDuration(self.animName) - \
+				startTime, 0.0)
+	    else:
+		duration = endTime - startTime
+		if (duration < 0.0):
+	    	    duration = -duration
+	if (endTime == None):
+	    self.finishTime = self.startTime + duration
+	else:
+	    self.finishTime = endTime
+	if (self.startTime > self.finishTime):
+	    reverse = 1
+		
         # Initialize superclass
-	Interval.__init__(self, name, duration)
+	Interval.__init__(self, name, duration, reverse=reverse)
         # Update stopEvent
         if self.loop:
             self.stopEvent = id + '_stopEvent'
             self.stopEventList = [self.stopEvent]
 
     def calcFrame(self, t):
+	offset = t % abs(self.finishTime - self.startTime)
         # Compute current frame based upon current time
-        floatFrame = self.frameRate * (self.startTime + t)
+	if (self.reverse == 0):
+            floatFrame = self.frameRate * (self.startTime + offset)
+	else:
+	    negOffset = (self.startTime - self.finishTime) - offset
+	    floatFrame = self.frameRate * (self.finishTime + negOffset)
         # Need max to avoid frame = -1 when t = 0
         frame = max(0, int(math.ceil(floatFrame)) - 1)
         # Modulo in case of looping anim
@@ -70,7 +88,7 @@ class ActorInterval(Interval):
                           (self.name,frame))
         return frame
 
-    def updateFunc(self, t, event = IVAL_NONE):
+    def updateFunc(self, t, event=IVAL_NONE):
 	""" updateFunc(t, event)
 	    Go to time t
 	"""
@@ -79,7 +97,7 @@ class ActorInterval(Interval):
 	    return
         # Update animation based upon current time
         # Pose or stop anim
-        if (t >= (self.startTime + self.getDuration())):
+	if (t >= self.getDuration()):
             self.actor.stop()
             frame = self.goToT(self.getDuration())
             if self.loop:

+ 3 - 2
direct/src/interval/Interval.py

@@ -20,8 +20,8 @@ class Interval(DirectObject):
     clock = ClockObject.ClockObject.getGlobalClock()
 
     # Class methods
-    def __init__(self, name, duration, openEnded = 1):
-        """__init__(name, duration)
+    def __init__(self, name, duration, openEnded=1, reverse=0):
+        """__init__(name, duration, openEnded, reverse)
         """
 	self.name = name
 	self.duration = duration
@@ -31,6 +31,7 @@ class Interval(DirectObject):
         self.setTHooks = []
         # Set true if interval responds to setT(t): t>duration
         self.fOpenEnded = openEnded
+	self.reverse = reverse
 
     def getName(self):
 	""" getName()