polish interval interface
This commit is contained in:
parent
e4dc6de96f
commit
8a168bfa2e
|
|
@ -4,6 +4,17 @@
|
|||
of the CInterval class
|
||||
"""
|
||||
|
||||
def setT(self, t):
|
||||
t = min(max(t, 0.0), self.getDuration())
|
||||
state = self.getState()
|
||||
if state == CInterval.SInitial:
|
||||
self.privInitialize(t)
|
||||
elif state == CInterval.SFinal:
|
||||
self.privReverseInitialize(t)
|
||||
else:
|
||||
self.privStep(t)
|
||||
self.privPostEvent()
|
||||
|
||||
def start(self, t0 = 0.0, duration = None, scale = 1.0):
|
||||
if self.isPlaying():
|
||||
self.finish()
|
||||
|
|
@ -11,8 +22,9 @@
|
|||
self.setupPlay(t0, t0 + duration, scale)
|
||||
else:
|
||||
self.setupPlay(t0, -1, scale)
|
||||
self.privPostEvent()
|
||||
self.__loop = 0
|
||||
self.resume()
|
||||
self.__spawnTask()
|
||||
|
||||
def loop(self, t0 = 0.0, duration = None, scale = 1.0):
|
||||
self.start(t0, duration, scale)
|
||||
|
|
@ -20,35 +32,29 @@
|
|||
return
|
||||
|
||||
def pause(self):
|
||||
self.interrupt()
|
||||
# Kill old task(s), including those from a similarly-named but
|
||||
# different interval.
|
||||
taskName = self.getName() + '-play'
|
||||
oldTasks = taskMgr.getTasksNamed(taskName)
|
||||
for task in oldTasks:
|
||||
if hasattr(task, "interval"):
|
||||
task.interval.interrupt()
|
||||
taskMgr.remove(task)
|
||||
if self.getState() == CInterval.SStarted:
|
||||
self.privInterrupt()
|
||||
self.privPostEvent()
|
||||
self.__removeTask()
|
||||
return self.getT()
|
||||
|
||||
def resume(self):
|
||||
# Spawn task
|
||||
import Task
|
||||
taskName = self.getName() + '-play'
|
||||
task = Task.Task(self.__playTask)
|
||||
task.interval = self
|
||||
taskMgr.add(task, taskName)
|
||||
|
||||
def resume(self, t0 = None):
|
||||
if not hasattr(self, "_CInterval__loop"):
|
||||
self.__loop = 0
|
||||
if t0 != None:
|
||||
self.setT(t0)
|
||||
self.setupResume()
|
||||
if not self.isPlaying():
|
||||
self.__spawnTask()
|
||||
|
||||
def finish(self):
|
||||
# Nowadays, finish() will implicitly set the interval to its
|
||||
# terminal state, like setFinalT() used to. Use pause()
|
||||
# instead if you just want to leave the interval in its
|
||||
# current state, whatever that may be.
|
||||
self.pause()
|
||||
self.finalize()
|
||||
if hasattr(self, "setTHooks"):
|
||||
for func in self.setTHooks:
|
||||
func(self.getT())
|
||||
state = self.getState()
|
||||
if state == CInterval.SInitial:
|
||||
self.privInstant()
|
||||
elif state != CInterval.SFinal:
|
||||
self.privFinalize()
|
||||
self.privPostEvent()
|
||||
self.__removeTask()
|
||||
|
||||
def play(self, *args, **kw):
|
||||
self.start(*args, **kw)
|
||||
|
|
@ -59,23 +65,39 @@
|
|||
def setFinalT(self):
|
||||
self.finish()
|
||||
|
||||
def setT(self, t, event = ETStep):
|
||||
# Overridden from the C++ layer. We rename the C++ function
|
||||
# in FFIRename to make this possible.
|
||||
self.__cSetT(t, event)
|
||||
def isPlaying(self):
|
||||
return taskMgr.hasTaskNamed(self.getName() + '-play')
|
||||
|
||||
def privPostEvent(self):
|
||||
# Call after calling any of the priv* methods to do any required
|
||||
# Python finishing steps.
|
||||
t = self.getT()
|
||||
if hasattr(self, "setTHooks"):
|
||||
for func in self.setTHooks:
|
||||
func(t)
|
||||
|
||||
def isPlaying(self):
|
||||
return taskMgr.hasTaskNamed(self.getName() + '-play')
|
||||
def __spawnTask(self):
|
||||
# Spawn task
|
||||
import Task
|
||||
taskName = self.getName() + '-play'
|
||||
task = Task.Task(self.__playTask)
|
||||
task.interval = self
|
||||
taskMgr.add(task, taskName)
|
||||
|
||||
def __removeTask(self):
|
||||
# Kill old task(s), including those from a similarly-named but
|
||||
# different interval.
|
||||
taskName = self.getName() + '-play'
|
||||
oldTasks = taskMgr.getTasksNamed(taskName)
|
||||
for task in oldTasks:
|
||||
if hasattr(task, "interval"):
|
||||
task.interval.privInterrupt()
|
||||
taskMgr.remove(task)
|
||||
|
||||
def __playTask(self, task):
|
||||
import Task
|
||||
loopCount = self.stepPlay()
|
||||
if hasattr(self, "setTHooks"):
|
||||
for func in self.setTHooks:
|
||||
func(self.getT())
|
||||
self.privPostEvent()
|
||||
if loopCount == 0 or self.__loop:
|
||||
return Task.cont
|
||||
else:
|
||||
|
|
@ -86,8 +108,7 @@
|
|||
Popup control panel for interval.
|
||||
"""
|
||||
import TkGlobal
|
||||
import fpformat
|
||||
import string
|
||||
import math
|
||||
# I moved this here because Toontown does not ship Tk
|
||||
from Tkinter import Toplevel, Frame, Button, LEFT, X
|
||||
import Pmw
|
||||
|
|
@ -96,40 +117,33 @@
|
|||
tl = Toplevel()
|
||||
tl.title('Interval Controls')
|
||||
outerFrame = Frame(tl)
|
||||
def entryScaleCommand(t,s=self):
|
||||
s.pause()
|
||||
s.setT(t)
|
||||
self.es = es = EntryScale.EntryScale(
|
||||
outerFrame, text = self.getName(),
|
||||
min = 0, max = string.atof(fpformat.fix(self.getDuration(), 2)),
|
||||
command = lambda t, s = self: s.setT(t))
|
||||
# So when you drag scale with mouse its like you started a playback
|
||||
def onPress(s=self,es=es):
|
||||
# Kill playback task
|
||||
s.pause()
|
||||
# INIT interval
|
||||
s.setT(es.get(), CInterval.ETInitialize)
|
||||
es.onPress = onPress
|
||||
# To make sure you stop free running intervals
|
||||
es.onRelease = lambda s=self: s.pause()
|
||||
# To update scale and execute intervals with ETInitialize
|
||||
def onReturn(s = self, es = es):
|
||||
s.setT(es.get(), CInterval.ETInitialize)
|
||||
s.pause()
|
||||
es.onReturnRelease = onReturn
|
||||
min = 0, max = math.floor(self.getDuration() * 100) / 100,
|
||||
command = entryScaleCommand)
|
||||
es.set(self.getT(), fCommand = 0)
|
||||
es.pack(expand = 1, fill = X)
|
||||
bf = Frame(outerFrame)
|
||||
# Jump to start and end
|
||||
def toStart(s=self, es=es):
|
||||
s.setT(0.0, CInterval.ETInitialize)
|
||||
s.pause()
|
||||
s.setT(0.0)
|
||||
def toEnd(s=self):
|
||||
s.setT(s.getDuration(), CInterval.ETInitialize)
|
||||
s.pause()
|
||||
s.setT(s.getDuration())
|
||||
jumpToStart = Button(bf, text = '<<', command = toStart)
|
||||
# Stop/play buttons
|
||||
def doPlay(s=self, es=es):
|
||||
s.resume(es.get())
|
||||
|
||||
stop = Button(bf, text = 'Stop',
|
||||
command = lambda s=self: s.pause())
|
||||
play = Button(
|
||||
bf, text = 'Play',
|
||||
command = lambda s=self, es=es: s.start(es.get()))
|
||||
command = doPlay)
|
||||
jumpToEnd = Button(bf, text = '>>', command = toEnd)
|
||||
jumpToStart.pack(side = LEFT, expand = 1, fill = X)
|
||||
play.pack(side = LEFT, expand = 1, fill = X)
|
||||
|
|
@ -148,6 +162,3 @@
|
|||
if u in s.setTHooks:
|
||||
s.setTHooks.remove(u)
|
||||
tl.bind('<Destroy>', onDestroy)
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@ methodRenameDictionary = {
|
|||
'operator<<=' : '__ilshift__',
|
||||
'operator>>=' : '__irshift__',
|
||||
'print' : 'Cprint',
|
||||
'CInterval.setT' : '__cSetT',
|
||||
}
|
||||
|
||||
classRenameDictionary = {
|
||||
|
|
|
|||
|
|
@ -95,29 +95,29 @@ class ActorInterval(Interval.Interval):
|
|||
|
||||
return frame
|
||||
|
||||
def updateFunc(self, t, event=Interval.IVAL_NONE):
|
||||
""" updateFunc(t, event)
|
||||
Go to time t
|
||||
"""
|
||||
if (self.actor.isEmpty()):
|
||||
self.notify.warning('updateFunc() - %s empty actor!' % self.name)
|
||||
return
|
||||
# Update animation based upon current time
|
||||
# Pose or stop anim
|
||||
if (t >= self.duration):
|
||||
self.actor.stop(self.animName)
|
||||
frame = self.goToT(self.duration)
|
||||
elif self.loopAnim == 1:
|
||||
if event == Interval.IVAL_INIT:
|
||||
# Pose anim
|
||||
self.goToT(t)
|
||||
# And start loop, restart flag says continue from current frame
|
||||
self.actor.loop(self.animName, restart=0)
|
||||
def privInitialize(self, t):
|
||||
self.state = CInterval.SStarted
|
||||
self.goToT(t)
|
||||
if self.loopAnim:
|
||||
self.actor.loop(self.animName, restart = 0)
|
||||
self.currT = t
|
||||
|
||||
def privFinalize(self):
|
||||
if self.loopAnim:
|
||||
self.actor.stop()
|
||||
else:
|
||||
# Pose anim
|
||||
self.goToT(self.getDuration())
|
||||
self.currT = self.getDuration()
|
||||
self.state = CInterval.SFinal
|
||||
|
||||
def privStep(self, t):
|
||||
if not self.loopAnim:
|
||||
self.goToT(t)
|
||||
|
||||
def interrupt(self):
|
||||
self.state = CInterval.SStarted
|
||||
self.currT = t
|
||||
|
||||
def privInterrupt(self):
|
||||
if self.loopAnim:
|
||||
self.actor.stop
|
||||
|
||||
|
|
|
|||
|
|
@ -33,16 +33,13 @@ class FunctionInterval(Interval.Interval):
|
|||
# Record any arguments
|
||||
self.extraArgs = extraArgs
|
||||
# Initialize superclass
|
||||
# Set openEnded true if IVAL_INIT calls after end time cause interval
|
||||
# function to be called. If false, IVAL_INIT calls have no effect
|
||||
# Set openEnded true if privInitialize after end time cause interval
|
||||
# function to be called. If false, privInitialize calls have no effect
|
||||
# Event, Accept, Ignore intervals default to openEnded = 0
|
||||
# Parent, Pos, Hpr, etc intervals default to openEnded = 1
|
||||
Interval.Interval.__init__(self, name, duration = 0.0, openEnded = openEnded)
|
||||
|
||||
def updateFunc(self, t, event = Interval.IVAL_NONE):
|
||||
""" updateFunc(t, event)
|
||||
Go to time t
|
||||
"""
|
||||
def privInstant(self):
|
||||
# Evaluate the function
|
||||
apply(self.function, self.extraArgs)
|
||||
# Print debug information
|
||||
|
|
|
|||
|
|
@ -3,11 +3,7 @@
|
|||
from DirectObject import *
|
||||
from PandaModules import *
|
||||
import Task
|
||||
|
||||
# Interval events
|
||||
IVAL_NONE = CInterval.ETStep
|
||||
IVAL_INIT = CInterval.ETInitialize
|
||||
IVAL_DONE = CInterval.ETFinalize
|
||||
import math
|
||||
|
||||
class Interval(DirectObject):
|
||||
"""Interval class: Base class for timeline functionality"""
|
||||
|
|
@ -23,147 +19,185 @@ class Interval(DirectObject):
|
|||
"""
|
||||
self.name = name
|
||||
self.duration = duration
|
||||
self.curr_t = 0.0
|
||||
self.prev_t = -1
|
||||
self.state = CInterval.SInitial
|
||||
self.currT = 0.0
|
||||
self.setTHooks = []
|
||||
# Set true if interval responds to setT(t): t>duration
|
||||
self.__startT = 0
|
||||
self.__startTAtStart = 1
|
||||
self.__endT = duration
|
||||
self.__endTAtEnd = 1
|
||||
|
||||
# Set true if the interval should be invoked if it was
|
||||
# completely skipped over during initialize or finalize, false
|
||||
# if it should be ignored in this case.
|
||||
self.openEnded = openEnded
|
||||
|
||||
self.__loop = 0
|
||||
|
||||
def getName(self):
|
||||
""" getName()
|
||||
"""
|
||||
return self.name
|
||||
|
||||
def getDuration(self):
|
||||
""" getDuration()
|
||||
"""
|
||||
return self.duration
|
||||
|
||||
def getOpenEnded(self):
|
||||
""" getOpenEnded()
|
||||
"""
|
||||
return self.openEnded
|
||||
|
||||
def setT(self, t, event = IVAL_NONE):
|
||||
""" setT(t, event)
|
||||
Go to time t
|
||||
"""
|
||||
# Update current time
|
||||
self.curr_t = t
|
||||
# Perform interval actions
|
||||
self.updateFunc(t, event)
|
||||
# Call setT Hook
|
||||
for func in self.setTHooks:
|
||||
func(t)
|
||||
# Record t for next time around
|
||||
self.prev_t = self.curr_t
|
||||
def getState(self):
|
||||
return self.state
|
||||
|
||||
def isStopped(self):
|
||||
# Returns true if the interval has not been started, has already
|
||||
# played to its completion, or has been explicitly stopped via
|
||||
# finish().
|
||||
return (self.getState() == CInterval.SInitial or \
|
||||
self.getState() == CInterval.SFinal)
|
||||
|
||||
def getT(self):
|
||||
return self.curr_t
|
||||
return self.currT
|
||||
|
||||
def updateFunc(self, t, event = IVAL_NONE):
|
||||
""" updateFunc(t, event)
|
||||
"""
|
||||
# Subclasses define this function
|
||||
pass
|
||||
|
||||
def interrupt(self):
|
||||
# Subclasses define this function
|
||||
pass
|
||||
|
||||
def setTHook(self, t):
|
||||
# Used by control panel to update scale
|
||||
pass
|
||||
|
||||
def start(self, t0=0.0, duration=0.0, scale=1.0):
|
||||
# Starts playing the interval from the beginning, or at the
|
||||
# indicated time if specified.
|
||||
|
||||
# Make sure the start time is sensible.
|
||||
if t0 > self.duration:
|
||||
t0 = self.duration
|
||||
|
||||
# Kill ongoing play task
|
||||
if self.isPlaying():
|
||||
self.finish()
|
||||
# Start new one
|
||||
self.offset = t0
|
||||
self.startT = globalClock.getFrameTime()
|
||||
assert(scale > 0.0)
|
||||
self.scale = scale
|
||||
self.firstTime = 1
|
||||
if (duration == 0.0):
|
||||
# If no play duration specified, use duration of Interval
|
||||
self.endTime = self.duration
|
||||
def privDoEvent(self, t, event):
|
||||
if event == CInterval.ETStep:
|
||||
self.privStep(t)
|
||||
elif event == CInterval.ETFinalize:
|
||||
self.privFinalize()
|
||||
elif event == CInterval.ETInterrupt:
|
||||
self.privInterrupt()
|
||||
elif event == CInterval.ETInstant:
|
||||
self.privInstant()
|
||||
elif event == CInterval.ETInitialize:
|
||||
self.privInitialize(t)
|
||||
elif event == CInterval.ETReverseFinalize:
|
||||
self.privReverseFinalize()
|
||||
elif event == CInterval.ETReverseInstant:
|
||||
self.privReverseInstant()
|
||||
elif event == CInterval.ETReverseInitialize:
|
||||
self.privReverseInitialize(t)
|
||||
else:
|
||||
# Otherwise use min of interval duration and offset + play duration
|
||||
self.endTime = min(self.duration, self.offset + duration)
|
||||
assert(t0 <= self.endTime)
|
||||
self.notify.error('Invalid event type: %s' % (event))
|
||||
|
||||
self.resume()
|
||||
|
||||
def loop(self, t0=0.0, duration=0.0, scale=1.0):
|
||||
self.accept(self.name + '-loop', self.play,
|
||||
extraArgs=[t0, duration, scale])
|
||||
self.start(t0, duration, scale)
|
||||
return
|
||||
def privInitialize(self, t):
|
||||
# Subclasses may redefine this function
|
||||
self.state = CInterval.SStarted
|
||||
self.privStep(t)
|
||||
|
||||
def pause(self):
|
||||
# First send event to stop freerunning (e.g. sound and anim) intervals
|
||||
self.interrupt()
|
||||
# Kill task
|
||||
taskMgr.remove(self.name + '-play')
|
||||
# No more looping.
|
||||
self.ignore(self.name + '-loop')
|
||||
return self.curr_t
|
||||
def privInstant(self):
|
||||
# Subclasses may redefine this function
|
||||
self.state = CInterval.SStarted
|
||||
self.privStep(self.getDuration())
|
||||
self.state = CInterval.SFinal
|
||||
|
||||
def resume(self):
|
||||
# Spawn task
|
||||
taskMgr.add(self.__playTask, self.getName() + '-play')
|
||||
def privStep(self, t):
|
||||
# Subclasses may redefine this function
|
||||
self.state = CInterval.SStarted
|
||||
self.currT = t
|
||||
|
||||
def finish(self):
|
||||
# Nowadays, finish() will implicitly set the interval to its
|
||||
# terminal state, like setFinalT() used to. Use pause()
|
||||
# instead if you just want to leave the interval in its
|
||||
# current state, whatever that may be.
|
||||
self.pause()
|
||||
self.setT(self.getDuration(), IVAL_DONE)
|
||||
def privFinalize(self):
|
||||
# Subclasses may redefine this function
|
||||
self.privStep(self.getDuration())
|
||||
self.state = CInterval.SFinal
|
||||
|
||||
def play(self, *args, **kw):
|
||||
self.start(*args, **kw)
|
||||
def privReverseInitialize(self, t):
|
||||
# Subclasses may redefine this function
|
||||
self.state = CInterval.SStarted
|
||||
self.privStep(t)
|
||||
|
||||
def privReverseInstant(self):
|
||||
# Subclasses may redefine this function
|
||||
self.state = CInterval.SStarted
|
||||
self.privStep(self.getDuration())
|
||||
self.state = CInterval.SInitial
|
||||
|
||||
def privReverseFinalize(self):
|
||||
# Subclasses may redefine this function
|
||||
self.privStep(0)
|
||||
self.state = CInterval.SInitial
|
||||
|
||||
def privInterrupt(self):
|
||||
# Subclasses may redefine this function
|
||||
self.state = CInterval.SPaused
|
||||
|
||||
def setupPlay(self, startT, endT, playRate):
|
||||
duration = self.getDuration()
|
||||
|
||||
def stop(self):
|
||||
self.finish()
|
||||
|
||||
def setFinalT(self):
|
||||
self.finish()
|
||||
|
||||
def isPlaying(self):
|
||||
return taskMgr.hasTaskNamed(self.name + '-play')
|
||||
|
||||
def __playTask(self, task):
|
||||
""" __playTask(task)
|
||||
"""
|
||||
t = globalClock.getFrameTime()
|
||||
te = self.offset + ((t - self.startT) * self.scale)
|
||||
if (te < self.endTime):
|
||||
if (self.firstTime):
|
||||
# If first call, init intervals
|
||||
self.setT(te, IVAL_INIT)
|
||||
self.firstTime = 0
|
||||
else:
|
||||
self.setT(te)
|
||||
return Task.cont
|
||||
if startT <= 0:
|
||||
self.__startT = 0
|
||||
self.__startTAtStart = 1
|
||||
elif startT > duration:
|
||||
self.__startT = duration
|
||||
self.__startTAtStart = 0
|
||||
else:
|
||||
te = self.endTime
|
||||
if (self.firstTime):
|
||||
# If first call, init intervals
|
||||
self.setT(te, IVAL_INIT)
|
||||
self.firstTime = 0
|
||||
self.__startT = startT
|
||||
self.__startTAtStart = 0
|
||||
|
||||
if endT < 0 or endT >= duration:
|
||||
self.__endT = duration
|
||||
self.__endTAtEnd = 1
|
||||
else:
|
||||
self.__endT = endT
|
||||
self.__endTAtEnd = 0
|
||||
|
||||
self.__clockStart = globalClock.getFrameTime()
|
||||
self.__playRate = playRate
|
||||
self.__loopCount = 0
|
||||
|
||||
def setupResume(self):
|
||||
now = globalClock.getFrameTime()
|
||||
if self.__playRate > 0:
|
||||
self.__clockStart = now - ((self.getT() - self.__startT) / self.__playRate)
|
||||
elif self.__playRate < 0:
|
||||
self.__clockStart = now - ((self.getT() - self.__endT) / self.__playRate)
|
||||
self.__loopCount = 0
|
||||
|
||||
def stepPlay(self):
|
||||
now = globalClock.getFrameTime()
|
||||
if self.__playRate >= 0:
|
||||
t = (now - self.__clockStart) * self.__playRate + self.__startT
|
||||
|
||||
if self.__endTAtEnd:
|
||||
self.__endT = self.getDuration()
|
||||
|
||||
if t < self.__endT:
|
||||
# In the middle of the interval, not a problem.
|
||||
if self.isStopped():
|
||||
self.privInitialize(t)
|
||||
else:
|
||||
self.prevStep(t)
|
||||
|
||||
else:
|
||||
self.setT(te, IVAL_DONE)
|
||||
messenger.send(self.name + "-loop")
|
||||
return Task.done
|
||||
# Past the ending point; time to finalize.
|
||||
if self.__endTAtEnd:
|
||||
# Only finalize if the playback cycle includes the
|
||||
# whole interval.
|
||||
if self.isStopped():
|
||||
if self.getOpenEnded() or self.__loopCount != 0:
|
||||
self.privInstant()
|
||||
else:
|
||||
self.privFinalize()
|
||||
else:
|
||||
if self.isStopped():
|
||||
self.privInitialize(self.__endT)
|
||||
else:
|
||||
self.privStep(self.__endT)
|
||||
|
||||
# Advance the clock for the next loop cycle.
|
||||
if self.__endT == self.__startT:
|
||||
# If the interval has no length, we loop exactly once.
|
||||
self.__loopCount += 1
|
||||
|
||||
else:
|
||||
# Otherwise, figure out how many loops we need to
|
||||
# skip.
|
||||
timePerLoop = (self.__endT - self.__startT) / self.__playRate
|
||||
numLoops = math.floor((now - self.__clockStart) / timePerLoop)
|
||||
self.__loopCount += numLoops
|
||||
self.__clockStart += numLoops * timePerLoop
|
||||
|
||||
else:
|
||||
# Playing backwards.
|
||||
# Not supported at the moment.
|
||||
pass
|
||||
|
||||
def __repr__(self, indent=0):
|
||||
""" __repr__(indent)
|
||||
|
|
@ -173,13 +207,115 @@ class Interval(DirectObject):
|
|||
space = space + ' '
|
||||
return (space + self.name + ' dur: %.2f' % self.duration)
|
||||
|
||||
|
||||
# The rest of these methods are duplicates of functions defined
|
||||
# for the CInterval class via the file CInterval-extensions.py.
|
||||
|
||||
def setT(self, t):
|
||||
t = min(max(t, 0.0), self.getDuration())
|
||||
state = self.getState()
|
||||
if state == CInterval.SInitial:
|
||||
self.privInitialize(t)
|
||||
elif state == CInterval.SFinal:
|
||||
self.privReverseInitialize(t)
|
||||
else:
|
||||
self.privStep(t)
|
||||
self.privPostEvent()
|
||||
|
||||
def start(self, t0 = 0.0, duration = None, scale = 1.0):
|
||||
if self.isPlaying():
|
||||
self.finish()
|
||||
if duration: # None or 0 implies full length
|
||||
self.setupPlay(t0, t0 + duration, scale)
|
||||
else:
|
||||
self.setupPlay(t0, -1, scale)
|
||||
self.privPostEvent()
|
||||
self.__loop = 0
|
||||
self.__spawnTask()
|
||||
|
||||
def loop(self, t0 = 0.0, duration = None, scale = 1.0):
|
||||
self.start(t0, duration, scale)
|
||||
self.__loop = 1
|
||||
return
|
||||
|
||||
def pause(self):
|
||||
if self.getState() == CInterval.SStarted:
|
||||
self.privInterrupt()
|
||||
self.privPostEvent()
|
||||
self.__removeTask()
|
||||
return self.getT()
|
||||
|
||||
def resume(self, t0 = None):
|
||||
if not hasattr(self, "_CInterval__loop"):
|
||||
self.__loop = 0
|
||||
if t0 != None:
|
||||
self.setT(t0)
|
||||
self.setupResume()
|
||||
if not self.isPlaying():
|
||||
self.__spawnTask()
|
||||
|
||||
def finish(self):
|
||||
state = self.getState()
|
||||
if state == CInterval.SInitial:
|
||||
self.privInstant()
|
||||
elif state != CInterval.SFinal:
|
||||
self.privFinalize()
|
||||
self.privPostEvent()
|
||||
self.__removeTask()
|
||||
|
||||
def play(self, *args, **kw):
|
||||
self.start(*args, **kw)
|
||||
|
||||
def stop(self):
|
||||
self.finish()
|
||||
|
||||
def setFinalT(self):
|
||||
self.finish()
|
||||
|
||||
def isPlaying(self):
|
||||
return taskMgr.hasTaskNamed(self.getName() + '-play')
|
||||
|
||||
def privPostEvent(self):
|
||||
# Call after calling any of the priv* methods to do any required
|
||||
# Python finishing steps.
|
||||
t = self.getT()
|
||||
if hasattr(self, "setTHooks"):
|
||||
for func in self.setTHooks:
|
||||
func(t)
|
||||
|
||||
def __spawnTask(self):
|
||||
# Spawn task
|
||||
import Task
|
||||
taskName = self.getName() + '-play'
|
||||
task = Task.Task(self.__playTask)
|
||||
task.interval = self
|
||||
taskMgr.add(task, taskName)
|
||||
|
||||
def __removeTask(self):
|
||||
# Kill old task(s), including those from a similarly-named but
|
||||
# different interval.
|
||||
taskName = self.getName() + '-play'
|
||||
oldTasks = taskMgr.getTasksNamed(taskName)
|
||||
for task in oldTasks:
|
||||
if hasattr(task, "interval"):
|
||||
task.interval.privInterrupt()
|
||||
taskMgr.remove(task)
|
||||
|
||||
def __playTask(self, task):
|
||||
import Task
|
||||
loopCount = self.stepPlay()
|
||||
self.privPostEvent()
|
||||
if loopCount == 0 or self.__loop:
|
||||
return Task.cont
|
||||
else:
|
||||
return Task.done
|
||||
|
||||
def popupControls(self, tl = None):
|
||||
""" popupControls()
|
||||
Popup control panel for interval.
|
||||
"""
|
||||
import TkGlobal
|
||||
import fpformat
|
||||
import string
|
||||
import math
|
||||
# I moved this here because Toontown does not ship Tk
|
||||
from Tkinter import Toplevel, Frame, Button, LEFT, X
|
||||
import Pmw
|
||||
|
|
@ -188,40 +324,33 @@ class Interval(DirectObject):
|
|||
tl = Toplevel()
|
||||
tl.title('Interval Controls')
|
||||
outerFrame = Frame(tl)
|
||||
def entryScaleCommand(t,s=self):
|
||||
s.pause()
|
||||
s.setT(t)
|
||||
self.es = es = EntryScale.EntryScale(
|
||||
outerFrame, text = self.getName(),
|
||||
min = 0, max = string.atof(fpformat.fix(self.duration, 2)),
|
||||
command = lambda t, s = self: s.setT(t))
|
||||
# So when you drag scale with mouse its like you started a playback
|
||||
def onPress(s=self,es=es):
|
||||
# Kill playback task
|
||||
self.pause()
|
||||
# INIT interval
|
||||
s.setT(es.get(), IVAL_INIT)
|
||||
es.onPress = onPress
|
||||
# To make sure you stop free running intervals
|
||||
es.onRelease = lambda s=self: s.pause()
|
||||
# To update scale and execute intervals with IVAL_INIT
|
||||
def onReturn(s = self, es = es):
|
||||
s.setT(es.get(), IVAL_INIT)
|
||||
s.pause()
|
||||
es.onReturnRelease = onReturn
|
||||
min = 0, max = math.floor(self.getDuration() * 100) / 100,
|
||||
command = entryScaleCommand)
|
||||
es.set(self.getT(), fCommand = 0)
|
||||
es.pack(expand = 1, fill = X)
|
||||
bf = Frame(outerFrame)
|
||||
# Jump to start and end
|
||||
def toStart(s=self, es=es):
|
||||
s.setT(0.0, IVAL_INIT)
|
||||
s.pause()
|
||||
s.setT(0.0)
|
||||
def toEnd(s=self):
|
||||
s.setT(s.getDuration(), IVAL_INIT)
|
||||
s.pause()
|
||||
s.setT(s.getDuration())
|
||||
jumpToStart = Button(bf, text = '<<', command = toStart)
|
||||
# Stop/play buttons
|
||||
def doPlay(s=self, es=es):
|
||||
s.resume(es.get())
|
||||
|
||||
stop = Button(bf, text = 'Stop',
|
||||
command = lambda s=self: s.pause())
|
||||
play = Button(
|
||||
bf, text = 'Play',
|
||||
command = lambda s=self, es=es: s.start(es.get()))
|
||||
command = doPlay)
|
||||
jumpToEnd = Button(bf, text = '>>', command = toEnd)
|
||||
jumpToStart.pack(side = LEFT, expand = 1, fill = X)
|
||||
play.pack(side = LEFT, expand = 1, fill = X)
|
||||
|
|
@ -232,12 +361,11 @@ class Interval(DirectObject):
|
|||
# Add function to update slider during setT calls
|
||||
def update(t,es=es):
|
||||
es.set(t, fCommand = 0)
|
||||
if not hasattr(self, "setTHooks"):
|
||||
self.setTHooks = []
|
||||
self.setTHooks.append(update)
|
||||
# Clear out function on destroy
|
||||
def onDestroy(e, s=self, u=update):
|
||||
if u in s.setTHooks:
|
||||
s.setTHooks.remove(u)
|
||||
tl.bind('<Destroy>', onDestroy)
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -81,13 +81,13 @@ class LerpPosInterval(LerpNodePathInterval):
|
|||
if startPos != None:
|
||||
self.setStartPos(startPos)
|
||||
|
||||
def setT(self, t, event = Interval.IVAL_NONE):
|
||||
def privDoEvent(self, t, event):
|
||||
# This function is only used if Python functors were passed in
|
||||
# for some of the input parameters.
|
||||
if self.paramSetup and event == Interval.IVAL_INIT:
|
||||
if self.paramSetup and event == CInterval.ETInitialize:
|
||||
self.setupParam(self.setEndPos, self.endPos)
|
||||
self.setupParam(self.setStartPos, self.startPos)
|
||||
LerpNodePathInterval.setT(self, t, event)
|
||||
LerpNodePathInterval.privDoEvent(self, t, event)
|
||||
|
||||
|
||||
class LerpHprInterval(LerpNodePathInterval):
|
||||
|
|
@ -107,13 +107,13 @@ class LerpHprInterval(LerpNodePathInterval):
|
|||
if startHpr != None:
|
||||
self.setStartHpr(startHpr)
|
||||
|
||||
def setT(self, t, event = Interval.IVAL_NONE):
|
||||
def privDoEvent(self, t, event):
|
||||
# This function is only used if Python functors were passed in
|
||||
# for some of the input parameters.
|
||||
if self.paramSetup and event == Interval.IVAL_INIT:
|
||||
if self.paramSetup and event == CInterval.ETInitialize:
|
||||
self.setupParam(self.setEndHpr, self.endHpr)
|
||||
self.setupParam(self.setStartHpr, self.startHpr)
|
||||
LerpNodePathInterval.setT(self, t, event)
|
||||
LerpNodePathInterval.privDoEvent(self, t, event)
|
||||
|
||||
class LerpScaleInterval(LerpNodePathInterval):
|
||||
def __init__(self, node, duration, scale, startScale = None,
|
||||
|
|
@ -131,13 +131,13 @@ class LerpScaleInterval(LerpNodePathInterval):
|
|||
if startScale != None:
|
||||
self.setStartScale(startScale)
|
||||
|
||||
def setT(self, t, event = Interval.IVAL_NONE):
|
||||
def privDoEvent(self, t, event):
|
||||
# This function is only used if Python functors were passed in
|
||||
# for some of the input parameters.
|
||||
if self.paramSetup and event == Interval.IVAL_INIT:
|
||||
if self.paramSetup and event == CInterval.ETInitialize:
|
||||
self.setupParam(self.setEndScale, self.endScale)
|
||||
self.setupParam(self.setStartScale, self.startScale)
|
||||
LerpNodePathInterval.setT(self, t, event)
|
||||
LerpNodePathInterval.privDoEvent(self, t, event)
|
||||
|
||||
class LerpPosHprInterval(LerpNodePathInterval):
|
||||
def __init__(self, node, duration, pos, hpr,
|
||||
|
|
@ -161,15 +161,15 @@ class LerpPosHprInterval(LerpNodePathInterval):
|
|||
if startHpr != None:
|
||||
self.setStartHpr(startHpr)
|
||||
|
||||
def setT(self, t, event = Interval.IVAL_NONE):
|
||||
def privDoEvent(self, t, event):
|
||||
# This function is only used if Python functors were passed in
|
||||
# for some of the input parameters.
|
||||
if self.paramSetup and event == Interval.IVAL_INIT:
|
||||
if self.paramSetup and event == CInterval.ETInitialize:
|
||||
self.setupParam(self.setEndPos, self.endPos)
|
||||
self.setupParam(self.setStartPos, self.startPos)
|
||||
self.setupParam(self.setEndHpr, self.endHpr)
|
||||
self.setupParam(self.setStartHpr, self.startHpr)
|
||||
LerpNodePathInterval.setT(self, t, event)
|
||||
LerpNodePathInterval.privDoEvent(self, t, event)
|
||||
|
||||
class LerpHprScaleInterval(LerpNodePathInterval):
|
||||
def __init__(self, node, duration, hpr, scale,
|
||||
|
|
@ -194,15 +194,15 @@ class LerpHprScaleInterval(LerpNodePathInterval):
|
|||
if startScale != None:
|
||||
self.setStartScale(startScale)
|
||||
|
||||
def setT(self, t, event = Interval.IVAL_NONE):
|
||||
def privDoEvent(self, t, event):
|
||||
# This function is only used if Python functors were passed in
|
||||
# for some of the input parameters.
|
||||
if self.paramSetup and event == Interval.IVAL_INIT:
|
||||
if self.paramSetup and event == CInterval.ETInitialize:
|
||||
self.setupParam(self.setEndHpr, self.endHpr)
|
||||
self.setupParam(self.setStartHpr, self.startHpr)
|
||||
self.setupParam(self.setEndScale, self.endScale)
|
||||
self.setupParam(self.setStartScale, self.startScale)
|
||||
LerpNodePathInterval.setT(self, t, event)
|
||||
LerpNodePathInterval.privDoEvent(self, t, event)
|
||||
|
||||
class LerpPosHprScaleInterval(LerpNodePathInterval):
|
||||
def __init__(self, node, duration, pos, hpr, scale,
|
||||
|
|
@ -231,17 +231,17 @@ class LerpPosHprScaleInterval(LerpNodePathInterval):
|
|||
if startScale != None:
|
||||
self.setStartScale(startScale)
|
||||
|
||||
def setT(self, t, event = Interval.IVAL_NONE):
|
||||
def privDoEvent(self, t, event):
|
||||
# This function is only used if Python functors were passed in
|
||||
# for some of the input parameters.
|
||||
if self.paramSetup and event == Interval.IVAL_INIT:
|
||||
if self.paramSetup and event == CInterval.ETInitialize:
|
||||
self.setupParam(self.setEndPos, self.endPos)
|
||||
self.setupParam(self.setStartPos, self.startPos)
|
||||
self.setupParam(self.setEndHpr, self.endHpr)
|
||||
self.setupParam(self.setStartHpr, self.startHpr)
|
||||
self.setupParam(self.setEndScale, self.endScale)
|
||||
self.setupParam(self.setStartScale, self.startScale)
|
||||
LerpNodePathInterval.setT(self, t, event)
|
||||
LerpNodePathInterval.privDoEvent(self, t, event)
|
||||
|
||||
class LerpColorScaleInterval(LerpNodePathInterval):
|
||||
def __init__(self, node, duration, colorScale, startColorScale = None,
|
||||
|
|
@ -267,53 +267,6 @@ class LerpColorInterval(LerpNodePathInterval):
|
|||
# Python-based intervals.
|
||||
#
|
||||
|
||||
class LerpInterval(Interval.Interval):
|
||||
# create LerpInterval DirectNotify category
|
||||
notify = directNotify.newCategory('LerpInterval')
|
||||
# Class methods
|
||||
def __init__(self, name, duration, functorFunc, blendType='noBlend'):
|
||||
"""__init__(name, duration, functorFunc, blendType)
|
||||
"""
|
||||
# Record instance variables
|
||||
self.lerp = None
|
||||
self.functorFunc = functorFunc
|
||||
self.blendType = self.getBlend(blendType)
|
||||
# Initialize superclass
|
||||
Interval.Interval.__init__(self, name, duration)
|
||||
|
||||
def updateFunc(self, t, event = Interval.IVAL_NONE):
|
||||
""" updateFunc(t, event)
|
||||
"""
|
||||
# Check to see if we need to create the lerp
|
||||
if (event == Interval.IVAL_INIT):
|
||||
self.lerp = Lerp(self.functorFunc(), self.duration,
|
||||
self.blendType)
|
||||
# Make sure lerp exists
|
||||
if (not self.lerp):
|
||||
self.lerp = Lerp(self.functorFunc(), self.duration,
|
||||
self.blendType)
|
||||
# Evaluate the lerp
|
||||
self.lerp.setT(t)
|
||||
# Print debug information
|
||||
self.notify.debug('updateFunc() - %s: t = %f' % (self.name, t))
|
||||
|
||||
def getBlend(self, blendType):
|
||||
"""__getBlend(self, string)
|
||||
Return the C++ blend class corresponding to blendType string
|
||||
"""
|
||||
if (blendType == "easeIn"):
|
||||
return LerpBlendHelpers.easeIn
|
||||
elif (blendType == "easeOut"):
|
||||
return LerpBlendHelpers.easeOut
|
||||
elif (blendType == "easeInOut"):
|
||||
return LerpBlendHelpers.easeInOut
|
||||
elif (blendType == "noBlend"):
|
||||
return LerpBlendHelpers.noBlend
|
||||
else:
|
||||
raise Exception(
|
||||
'Error: LerpInterval.__getBlend: Unknown blend type')
|
||||
|
||||
|
||||
class LerpFunctionInterval(Interval.Interval):
|
||||
"""
|
||||
Class used to execute a function over time. Function can access fromData
|
||||
|
|
@ -344,9 +297,7 @@ class LerpFunctionInterval(Interval.Interval):
|
|||
# Initialize superclass
|
||||
Interval.Interval.__init__(self, name, duration)
|
||||
|
||||
def updateFunc(self, t, event = Interval.IVAL_NONE):
|
||||
""" updateFunc(t, event)
|
||||
"""
|
||||
def privStep(self, t):
|
||||
# Evaluate the function
|
||||
if (t >= self.duration):
|
||||
# Set to end value
|
||||
|
|
@ -362,6 +313,8 @@ class LerpFunctionInterval(Interval.Interval):
|
|||
apply(self.function, [data] + self.extraArgs)
|
||||
# Print debug information
|
||||
self.notify.debug('updateFunc() - %s: t = %f' % (self.name, t))
|
||||
self.state = CInterval.SStarted
|
||||
self.currT = t
|
||||
|
||||
def getBlend(self, blendType):
|
||||
"""__getBlend(self, string)
|
||||
|
|
|
|||
|
|
@ -272,66 +272,18 @@ class MetaInterval(CMetaInterval):
|
|||
self.popEvent()
|
||||
|
||||
ival = self.pythonIvals[index]
|
||||
if eventType == CInterval.ETStep:
|
||||
ival.setT(t, Interval.IVAL_NONE)
|
||||
ival.privDoEvent(t, eventType)
|
||||
ival.privPostEvent()
|
||||
|
||||
elif eventType == CInterval.ETFinalize:
|
||||
ival.setT(ival.getDuration(), Interval.IVAL_DONE)
|
||||
|
||||
elif eventType == CInterval.ETReverseFinalize:
|
||||
ival.setT(0, Interval.IVAL_NONE)
|
||||
|
||||
elif eventType == CInterval.ETInitialize or \
|
||||
eventType == CInterval.ETReverseInitialize:
|
||||
ival.setT(t, Interval.IVAL_INIT)
|
||||
|
||||
elif eventType == CInterval.ETInstant:
|
||||
ival.setT(ival.getDuration(), Interval.IVAL_INIT)
|
||||
|
||||
elif eventType == CInterval.ETReverseInstant:
|
||||
ival.setT(0, Interval.IVAL_INIT)
|
||||
|
||||
elif eventType == CInterval.ETInterrupt:
|
||||
ival.interrupt()
|
||||
|
||||
else:
|
||||
self.notify.error("Unhandled event type %s" % (eventType))
|
||||
|
||||
def stepPlay(self):
|
||||
# This function overrides the function defined in the C++
|
||||
# CInterval code that is called every frame while the interval
|
||||
# is playing, to check for Python callbacks aftwards.
|
||||
result = CMetaInterval.stepPlay(self)
|
||||
self.__doPythonCallbacks()
|
||||
return result
|
||||
|
||||
def setT(self, t, event = Interval.IVAL_NONE):
|
||||
# This function overrides the C++ function to check for Python
|
||||
# callbacks afterwards.
|
||||
def privDoEvent(self, t, event):
|
||||
# This function overrides the C++ function to initialize the
|
||||
# intervals first if necessary.
|
||||
self.__updateIvals()
|
||||
CMetaInterval.setT(self, t, event)
|
||||
self.__doPythonCallbacks()
|
||||
CMetaInterval.privDoEvent(self, t, event)
|
||||
|
||||
def interrupt(self):
|
||||
# This function overrides the C++ function to check for Python
|
||||
# callbacks afterwards.
|
||||
self.__updateIvals()
|
||||
CMetaInterval.interrupt(self)
|
||||
self.__doPythonCallbacks()
|
||||
|
||||
def finish(self):
|
||||
# This function overrides from the parent level to check for Python
|
||||
# callbacks afterwards.
|
||||
self.__updateIvals()
|
||||
CMetaInterval.finish(self)
|
||||
self.__doPythonCallbacks()
|
||||
|
||||
def setFinalT(self):
|
||||
# This function overrides from the parent level to check for Python
|
||||
# callbacks afterwards.
|
||||
self.__updateIvals()
|
||||
CMetaInterval.setFinalT(self)
|
||||
def privPostEvent(self):
|
||||
self.__doPythonCallbacks()
|
||||
CMetaInterval.privPostEvent(self)
|
||||
|
||||
def setIntervalStartTime(self, *args, **kw):
|
||||
# This function overrides from the parent level to force it to
|
||||
|
|
|
|||
|
|
@ -24,11 +24,11 @@ class MopathInterval(Interval.Interval):
|
|||
# Initialize superclass
|
||||
Interval.Interval.__init__(self, name, duration)
|
||||
|
||||
def updateFunc(self, t, event = Interval.IVAL_NONE):
|
||||
def privStep(self, t):
|
||||
""" updateFunc(t, event)
|
||||
Go to time t
|
||||
"""
|
||||
self.mopath.goTo(self.node, t)
|
||||
# Print debug information
|
||||
self.notify.debug('updateFunc() - %s: t = %f' % (self.name, t))
|
||||
self.state = CInterval.SStarted
|
||||
self.currT = t
|
||||
|
||||
|
|
|
|||
|
|
@ -30,30 +30,28 @@ class ParticleInterval(Interval.Interval):
|
|||
Interval.Interval.__init__(self, name, duration)
|
||||
self.cleanedUp = 0
|
||||
|
||||
def updateFunc(self, t, event=Interval.IVAL_NONE):
|
||||
""" updateFunc(t, event)
|
||||
Go to time t
|
||||
"""
|
||||
if (self.cleanedUp == 1):
|
||||
self.notify.warning('updateFunc() - already cleaned up!')
|
||||
return
|
||||
# Update particle effect based on current time
|
||||
if (t >= self.getDuration()):
|
||||
# If duration reached or stop event received, stop particle effect
|
||||
self.particleEffect.cleanup()
|
||||
self.cleanedUp = 1
|
||||
elif (event == Interval.IVAL_INIT):
|
||||
# IVAL_INIT event, start new particle effect
|
||||
renderParent = None
|
||||
if self.worldRelative:
|
||||
renderParent = render
|
||||
self.particleEffect.start(self.parent, renderParent)
|
||||
# Print debug information
|
||||
assert(self.notify.debug('updateFunc() - %s: t = %f' % (self.name, t)))
|
||||
def privInitialize(self, t):
|
||||
renderParent = None
|
||||
if self.worldRelative:
|
||||
renderParent = render
|
||||
self.particleEffect.start(self.parent, renderParent)
|
||||
self.state = CInterval.SStarted
|
||||
self.currT = t
|
||||
|
||||
def interrupt(self):
|
||||
def privStep(self, t):
|
||||
if self.state == CInterval.SPaused:
|
||||
# Restarting from a pause.
|
||||
self.particleEffect.start(self.parent, renderParent)
|
||||
self.state = CInterval.SStarted
|
||||
self.currT = t
|
||||
|
||||
def privFinalize(self):
|
||||
self.particleEffect.cleanup()
|
||||
self.cleanedUp = 1
|
||||
self.currT = self.getDuration()
|
||||
self.state = CInterval.SFinal
|
||||
|
||||
|
||||
|
||||
def privInterrupt(self):
|
||||
self.particleEffect.cleanup()
|
||||
self.cleanedUp = 1
|
||||
self.state = CInterval.SPaused
|
||||
|
|
|
|||
|
|
@ -45,32 +45,31 @@ class SoundInterval(Interval.Interval):
|
|||
# Initialize superclass
|
||||
Interval.Interval.__init__(self, name, duration)
|
||||
|
||||
def updateFunc(self, t, event = Interval.IVAL_NONE):
|
||||
""" updateFunc(t, event)
|
||||
Go to time t
|
||||
"""
|
||||
# Update sound based on current time
|
||||
if (t >= self.getDuration()):
|
||||
# If end of sound reached, stop sound
|
||||
if self.sound:
|
||||
self.sound.stop()
|
||||
elif (event == Interval.IVAL_INIT):
|
||||
# IVAL_INIT event, start new sound
|
||||
# If its within a 10th of a second of the start,
|
||||
# start at the beginning
|
||||
t1 = t + self.startTime
|
||||
if (t1 < 0.1):
|
||||
t1 = 0.0
|
||||
if self.sound:
|
||||
# Start sound
|
||||
self.sound.setVolume(self.volume)
|
||||
self.sound.setTime(t1)
|
||||
self.sound.setLoop(self.loop)
|
||||
self.sound.play()
|
||||
def privInitialize(self, t):
|
||||
# If its within a 10th of a second of the start,
|
||||
# start at the beginning
|
||||
t1 = t + self.startTime
|
||||
if (t1 < 0.1):
|
||||
t1 = 0.0
|
||||
self.sound.setVolume(self.volume)
|
||||
self.sound.setTime(t1)
|
||||
self.sound.setLoop(self.loop)
|
||||
self.sound.play()
|
||||
self.state = CInterval.SStarted
|
||||
self.currT = t1
|
||||
|
||||
# Print debug information
|
||||
self.notify.debug('updateFunc() - %s: t = %f' % (self.name, t))
|
||||
|
||||
def interrupt(self):
|
||||
if self.sound:
|
||||
self.sound.stop()
|
||||
def privStep(self, t):
|
||||
if self.state == CInterval.SPaused:
|
||||
# Restarting from a pause.
|
||||
self.sound.play()
|
||||
self.state = CInterval.SStarted
|
||||
self.currT = t
|
||||
|
||||
def privFinalize(self):
|
||||
self.sound.stop()
|
||||
self.currT = self.getDuration()
|
||||
self.state = CInterval.SFinal
|
||||
|
||||
def privInterrupt(self):
|
||||
self.sound.stop()
|
||||
self.state = CInterval.SPaused
|
||||
|
|
|
|||
|
|
@ -67,56 +67,23 @@ get_state() const {
|
|||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::set_t
|
||||
// Function: CInterval::is_stopped
|
||||
// Access: Published
|
||||
// Description: Advances the interval. This function is provided
|
||||
// mainly to provide compatibility with the Python
|
||||
// Interval class; you should use initialize(), step(),
|
||||
// and finalize() instead.
|
||||
// Description: Returns true if the interval is in either its initial
|
||||
// or final states (but not in a running or paused
|
||||
// state).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void CInterval::
|
||||
set_t(double t, CInterval::EventType event) {
|
||||
switch (event) {
|
||||
case ET_initialize:
|
||||
initialize(t);
|
||||
break;
|
||||
|
||||
case ET_instant:
|
||||
instant();
|
||||
break;
|
||||
|
||||
case ET_step:
|
||||
step(t);
|
||||
break;
|
||||
|
||||
case ET_finalize:
|
||||
finalize();
|
||||
break;
|
||||
|
||||
case ET_reverse_initialize:
|
||||
reverse_initialize(t);
|
||||
break;
|
||||
|
||||
case ET_reverse_instant:
|
||||
reverse_instant();
|
||||
break;
|
||||
|
||||
case ET_reverse_finalize:
|
||||
reverse_finalize();
|
||||
break;
|
||||
|
||||
case ET_interrupt:
|
||||
interrupt();
|
||||
break;
|
||||
}
|
||||
INLINE bool CInterval::
|
||||
is_stopped() const {
|
||||
return (_state == S_initial || _state == S_final);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::get_t
|
||||
// Access: Published
|
||||
// Description: Returns the current time of the interval: the last
|
||||
// value of t passed to initialize(), step(), or
|
||||
// finalize() (or set_t()).
|
||||
// value of t passed to priv_initialize(), priv_step(), or
|
||||
// priv_finalize().
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE double CInterval::
|
||||
get_t() const {
|
||||
|
|
|
|||
|
|
@ -39,12 +39,11 @@ CInterval(const string &name, double duration, bool open_ended) :
|
|||
{
|
||||
_clock_start = 0.0;
|
||||
_start_t = 0.0;
|
||||
_end_t = 0.0;
|
||||
_start_t_at_start = false;
|
||||
_end_t_at_end = false;
|
||||
_end_t = _duration;
|
||||
_start_t_at_start = true;
|
||||
_end_t_at_end = true;
|
||||
_play_rate = 1.0;
|
||||
_loop_count = 0;
|
||||
_restart = true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -70,7 +69,7 @@ setup_play(double start_t, double end_t, double play_rate) {
|
|||
|
||||
double duration = get_duration();
|
||||
|
||||
if (start_t < 0.0) {
|
||||
if (start_t <= 0.0) {
|
||||
_start_t = 0.0;
|
||||
_start_t_at_start = true;
|
||||
} else if (start_t > duration) {
|
||||
|
|
@ -91,7 +90,25 @@ setup_play(double start_t, double end_t, double play_rate) {
|
|||
_clock_start = ClockObject::get_global_clock()->get_frame_time();
|
||||
_play_rate = play_rate;
|
||||
_loop_count = 0;
|
||||
_restart = true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::setup_resume
|
||||
// Access: Published
|
||||
// Description: Called to prepare the interval for restarting at the
|
||||
// current point within the interval after an
|
||||
// interruption.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
setup_resume() {
|
||||
double now = ClockObject::get_global_clock()->get_frame_time();
|
||||
if (_play_rate > 0.0) {
|
||||
_clock_start = now - ((get_t() - _start_t) / _play_rate);
|
||||
|
||||
} else if (_play_rate < 0.0) {
|
||||
_clock_start = now - ((get_t() - _end_t) / _play_rate);
|
||||
}
|
||||
_loop_count = 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -109,14 +126,17 @@ step_play() {
|
|||
|
||||
if (_play_rate >= 0.0) {
|
||||
double t = (now - _clock_start) * _play_rate + _start_t;
|
||||
|
||||
if (_end_t_at_end) {
|
||||
_end_t = get_duration();
|
||||
}
|
||||
|
||||
if (t < _end_t) {
|
||||
// In the middle of the interval, not a problem.
|
||||
if (_restart) {
|
||||
initialize(t);
|
||||
_restart = false;
|
||||
if (is_stopped()) {
|
||||
priv_initialize(t);
|
||||
} else {
|
||||
step(t);
|
||||
priv_step(t);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
|
@ -124,20 +144,18 @@ step_play() {
|
|||
if (_end_t_at_end) {
|
||||
// Only finalize if the playback cycle includes the whole
|
||||
// interval.
|
||||
if (_restart) {
|
||||
if (is_stopped()) {
|
||||
if (get_open_ended() || _loop_count != 0) {
|
||||
instant();
|
||||
priv_instant();
|
||||
}
|
||||
} else {
|
||||
finalize();
|
||||
_restart = true;
|
||||
priv_finalize();
|
||||
}
|
||||
} else {
|
||||
if (_restart) {
|
||||
initialize(_end_t);
|
||||
_restart = false;
|
||||
if (is_stopped()) {
|
||||
priv_initialize(_end_t);
|
||||
} else {
|
||||
step(_end_t);
|
||||
priv_step(_end_t);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -165,11 +183,10 @@ step_play() {
|
|||
|
||||
if (t >= _start_t) {
|
||||
// In the middle of the interval, not a problem.
|
||||
if (_restart) {
|
||||
reverse_initialize(t);
|
||||
_restart = false;
|
||||
if (is_stopped()) {
|
||||
priv_reverse_initialize(t);
|
||||
} else {
|
||||
step(t);
|
||||
priv_step(t);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
|
@ -177,20 +194,18 @@ step_play() {
|
|||
if (_start_t_at_start) {
|
||||
// Only finalize if the playback cycle includes the whole
|
||||
// interval.
|
||||
if (_restart) {
|
||||
if (is_stopped()) {
|
||||
if (get_open_ended() || _loop_count != 0) {
|
||||
reverse_instant();
|
||||
priv_reverse_instant();
|
||||
}
|
||||
} else {
|
||||
reverse_finalize();
|
||||
_restart = true;
|
||||
priv_reverse_finalize();
|
||||
}
|
||||
} else {
|
||||
if (_restart) {
|
||||
reverse_initialize(_start_t);
|
||||
_restart = false;
|
||||
if (is_stopped()) {
|
||||
priv_reverse_initialize(_start_t);
|
||||
} else {
|
||||
step(_start_t);
|
||||
priv_step(_start_t);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -217,54 +232,100 @@ step_play() {
|
|||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::initialize
|
||||
// Function: CInterval::priv_do_event
|
||||
// Access: Published
|
||||
// Description: Calls the appropriate event function indicated by the
|
||||
// EventType.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
priv_do_event(double t, EventType event) {
|
||||
switch (event) {
|
||||
case ET_initialize:
|
||||
priv_initialize(t);
|
||||
return;
|
||||
|
||||
case ET_instant:
|
||||
priv_instant();
|
||||
return;
|
||||
|
||||
case ET_step:
|
||||
priv_step(t);
|
||||
return;
|
||||
|
||||
case ET_finalize:
|
||||
priv_finalize();
|
||||
return;
|
||||
|
||||
case ET_reverse_initialize:
|
||||
priv_reverse_initialize(t);
|
||||
return;
|
||||
|
||||
case ET_reverse_instant:
|
||||
priv_reverse_instant();
|
||||
return;
|
||||
|
||||
case ET_reverse_finalize:
|
||||
priv_reverse_finalize();
|
||||
return;
|
||||
|
||||
case ET_interrupt:
|
||||
priv_interrupt();
|
||||
return;
|
||||
}
|
||||
|
||||
interval_cat.warning()
|
||||
<< "Invalid event type: " << (int)event << "\n";
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::priv_initialize
|
||||
// Access: Published, Virtual
|
||||
// Description: This replaces the first call to step(), and indicates
|
||||
// Description: This replaces the first call to priv_step(), and indicates
|
||||
// that the interval has just begun. This may be
|
||||
// overridden by derived classes that need to do some
|
||||
// explicit initialization on the first call.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
initialize(double t) {
|
||||
check_stopped("initialize");
|
||||
priv_initialize(double t) {
|
||||
check_stopped("priv_initialize");
|
||||
recompute();
|
||||
_state = S_started;
|
||||
step(t);
|
||||
priv_step(t);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::instant
|
||||
// Function: CInterval::priv_instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of initialize() .. step()
|
||||
// .. finalize(), when everything is to happen within
|
||||
// Description: This is called in lieu of priv_initialize() .. priv_step()
|
||||
// .. priv_finalize(), when everything is to happen within
|
||||
// one frame. The interval should initialize itself,
|
||||
// then leave itself in the final state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
instant() {
|
||||
check_stopped("instant");
|
||||
priv_instant() {
|
||||
check_stopped("priv_instant");
|
||||
recompute();
|
||||
_state = S_started;
|
||||
step(get_duration());
|
||||
priv_step(get_duration());
|
||||
_state = S_final;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::step
|
||||
// Function: CInterval::priv_step
|
||||
// Access: Published, Virtual
|
||||
// Description: Advances the time on the interval. The time may
|
||||
// either increase (the normal case) or decrease
|
||||
// (e.g. if the interval is being played by a slider).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
step(double t) {
|
||||
check_started("step");
|
||||
priv_step(double t) {
|
||||
check_started("priv_step");
|
||||
_state = S_started;
|
||||
_curr_t = t;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::finalize
|
||||
// Function: CInterval::priv_finalize
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called to stop an interval, forcing it to
|
||||
// whatever state it would be after it played all the
|
||||
|
|
@ -272,86 +333,79 @@ step(double t) {
|
|||
// set_final_t().
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
finalize() {
|
||||
priv_finalize() {
|
||||
check_started("priv_step");
|
||||
double duration = get_duration();
|
||||
if (_state == S_initial) {
|
||||
initialize(duration);
|
||||
}
|
||||
|
||||
step(duration);
|
||||
priv_step(duration);
|
||||
_state = S_final;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::reverse_initialize
|
||||
// Access: Published, Virtual
|
||||
// Description: Similar to initialize(), but this is called when the
|
||||
// Description: Similar to priv_initialize(), but this is called when the
|
||||
// interval is being played backwards; it indicates that
|
||||
// the interval should start at the finishing state and
|
||||
// undo any intervening intervals.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
reverse_initialize(double t) {
|
||||
check_stopped("reverse_initialize");
|
||||
priv_reverse_initialize(double t) {
|
||||
check_stopped("priv_reverse_initialize");
|
||||
recompute();
|
||||
_state = S_started;
|
||||
step(t);
|
||||
priv_step(t);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::reverse_instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of reverse_initialize()
|
||||
// .. step() .. reverse_finalize(), when everything is
|
||||
// Description: This is called in lieu of priv_reverse_initialize()
|
||||
// .. priv_step() .. priv_reverse_finalize(), when everything is
|
||||
// to happen within one frame. The interval should
|
||||
// initialize itself, then leave itself in the initial
|
||||
// state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
reverse_instant() {
|
||||
check_stopped("reverse_instant");
|
||||
priv_reverse_instant() {
|
||||
check_stopped("priv_reverse_instant");
|
||||
recompute();
|
||||
_state = S_started;
|
||||
step(0.0);
|
||||
priv_step(0.0);
|
||||
_state = S_initial;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::reverse_finalize
|
||||
// Access: Published, Virtual
|
||||
// Description: Called generally following a reverse_initialize(),
|
||||
// Description: Called generally following a priv_reverse_initialize(),
|
||||
// this indicates the interval should set itself to the
|
||||
// initial state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
reverse_finalize() {
|
||||
if (_state == S_initial) {
|
||||
initialize(0.0);
|
||||
}
|
||||
|
||||
step(0.0);
|
||||
priv_reverse_finalize() {
|
||||
check_started("priv_reverse_finalize");
|
||||
priv_step(0.0);
|
||||
_state = S_initial;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CInterval::interrupt
|
||||
// Function: CInterval::priv_interrupt
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called while the interval is playing to
|
||||
// indicate that it is about to be interrupted; that is,
|
||||
// step() will not be called for a length of time. But
|
||||
// priv_step() will not be called for a length of time. But
|
||||
// the interval should remain in its current state in
|
||||
// anticipation of being eventually restarted when the
|
||||
// calls to step() eventually resume.
|
||||
// calls to priv_step() eventually resume.
|
||||
//
|
||||
// The purpose of this function is to allow self-running
|
||||
// intervals like sound intervals to stop the actual
|
||||
// sound playback during the pause.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CInterval::
|
||||
interrupt() {
|
||||
if (_state == S_started) {
|
||||
_state = S_paused;
|
||||
}
|
||||
priv_interrupt() {
|
||||
check_started("priv_interrupt");
|
||||
_state = S_paused;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -65,25 +65,30 @@ PUBLISHED:
|
|||
};
|
||||
|
||||
INLINE State get_state() const;
|
||||
|
||||
INLINE void set_t(double t, EventType event = ET_step);
|
||||
INLINE bool is_stopped() const;
|
||||
INLINE double get_t() const;
|
||||
|
||||
void setup_play(double start_time, double end_time, double play_rate);
|
||||
void setup_resume();
|
||||
int step_play();
|
||||
|
||||
// These functions control the actual playback of the interval.
|
||||
// Don't call them directly; they're intended to be called from a
|
||||
// supervising object, e.g. the Python start() .. finish()
|
||||
// interface.
|
||||
virtual void initialize(double t);
|
||||
virtual void instant();
|
||||
virtual void step(double t);
|
||||
virtual void finalize();
|
||||
virtual void reverse_initialize(double t);
|
||||
virtual void reverse_instant();
|
||||
virtual void reverse_finalize();
|
||||
virtual void interrupt();
|
||||
|
||||
// These cannot be declared private because they must be accessible
|
||||
// Python, but the method names are prefixed with priv_ to remind
|
||||
// you that you probably don't want to be using them directly.
|
||||
void priv_do_event(double t, EventType event);
|
||||
virtual void priv_initialize(double t);
|
||||
virtual void priv_instant();
|
||||
virtual void priv_step(double t);
|
||||
virtual void priv_finalize();
|
||||
virtual void priv_reverse_initialize(double t);
|
||||
virtual void priv_reverse_instant();
|
||||
virtual void priv_reverse_finalize();
|
||||
virtual void priv_interrupt();
|
||||
|
||||
virtual void output(ostream &out) const;
|
||||
virtual void write(ostream &out, int indent_level) const;
|
||||
|
|
@ -110,7 +115,6 @@ protected:
|
|||
bool _start_t_at_start;
|
||||
double _play_rate;
|
||||
int _loop_count;
|
||||
bool _restart;
|
||||
|
||||
private:
|
||||
bool _open_ended;
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ TypeHandle CLerpAnimEffectInterval::_type_handle;
|
|||
// (e.g. if the interval is being played by a slider).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CLerpAnimEffectInterval::
|
||||
step(double t) {
|
||||
priv_step(double t) {
|
||||
check_started("step");
|
||||
_state = S_started;
|
||||
double d = compute_delta(t);
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ PUBLISHED:
|
|||
INLINE void add_control(AnimControl *control, const string &name,
|
||||
float begin_effect, float end_effect);
|
||||
|
||||
virtual void step(double t);
|
||||
virtual void priv_step(double t);
|
||||
|
||||
virtual void output(ostream &out) const;
|
||||
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ set_start_pos(const LVecBase3f &pos) {
|
|||
// Access: Published
|
||||
// Description: Indicates that the position of the node should be
|
||||
// lerped, and specifies the final position of the node.
|
||||
// This should be called before initialize(). If this
|
||||
// This should be called before priv_initialize(). If this
|
||||
// is not called, the node's position will not be
|
||||
// affected by the lerp.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -90,7 +90,7 @@ set_start_hpr(const LVecBase3f &hpr) {
|
|||
// Access: Published
|
||||
// Description: Indicates that the rotation of the node should be
|
||||
// lerped, and specifies the final rotation of the node.
|
||||
// This should be called before initialize(). If this
|
||||
// This should be called before priv_initialize(). If this
|
||||
// is not called, the node's rotation will not be
|
||||
// affected by the lerp.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -134,7 +134,7 @@ set_start_scale(float scale) {
|
|||
// Access: Published
|
||||
// Description: Indicates that the scale of the node should be
|
||||
// lerped, and specifies the final scale of the node.
|
||||
// This should be called before initialize(). If this
|
||||
// This should be called before priv_initialize(). If this
|
||||
// is not called, the node's scale will not be
|
||||
// affected by the lerp.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -149,7 +149,7 @@ set_end_scale(const LVecBase3f &scale) {
|
|||
// Access: Published
|
||||
// Description: Indicates that the scale of the node should be
|
||||
// lerped, and specifies the final scale of the node.
|
||||
// This should be called before initialize(). If this
|
||||
// This should be called before priv_initialize(). If this
|
||||
// is not called, the node's scale will not be
|
||||
// affected by the lerp.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -178,7 +178,7 @@ set_start_color(const LVecBase4f &color) {
|
|||
// Access: Published
|
||||
// Description: Indicates that the color of the node should be
|
||||
// lerped, and specifies the final color of the node.
|
||||
// This should be called before initialize(). If this
|
||||
// This should be called before priv_initialize(). If this
|
||||
// is not called, the node's color will not be
|
||||
// affected by the lerp.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -208,7 +208,7 @@ set_start_color_scale(const LVecBase4f &color_scale) {
|
|||
// Access: Published
|
||||
// Description: Indicates that the color scale of the node should be
|
||||
// lerped, and specifies the final color scale of the node.
|
||||
// This should be called before initialize(). If this
|
||||
// This should be called before priv_initialize(). If this
|
||||
// is not called, the node's color scale will not be
|
||||
// affected by the lerp.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ TypeHandle CLerpNodePathInterval::_type_handle;
|
|||
//
|
||||
// You must call set_end_pos(), etc. for the various
|
||||
// properties you wish to lerp before the first call to
|
||||
// initialize(). If you want to set a starting value
|
||||
// priv_initialize(). If you want to set a starting value
|
||||
// for any of the properties, you may call
|
||||
// set_start_pos(), etc.; otherwise, the starting value
|
||||
// is taken from the actual node's value at the time the
|
||||
|
|
@ -57,35 +57,35 @@ CLerpNodePathInterval(const string &name, double duration,
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CLerpNodePathInterval::initialize
|
||||
// Access: Published, Virtual
|
||||
// Description: This replaces the first call to step(), and indicates
|
||||
// Description: This replaces the first call to priv_step(), and indicates
|
||||
// that the interval has just begun. This may be
|
||||
// overridden by derived classes that need to do some
|
||||
// explicit initialization on the first call.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CLerpNodePathInterval::
|
||||
initialize(double t) {
|
||||
priv_initialize(double t) {
|
||||
check_stopped("initialize");
|
||||
recompute();
|
||||
_prev_d = 0.0;
|
||||
_state = S_started;
|
||||
step(t);
|
||||
priv_step(t);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CLerpNodePathInterval::instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of initialize() .. step()
|
||||
// .. finalize(), when everything is to happen within
|
||||
// Description: This is called in lieu of priv_initialize() .. priv_step()
|
||||
// .. priv_finalize(), when everything is to happen within
|
||||
// one frame. The interval should initialize itself,
|
||||
// then leave itself in the final state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CLerpNodePathInterval::
|
||||
instant() {
|
||||
priv_instant() {
|
||||
check_stopped("instant");
|
||||
recompute();
|
||||
_prev_d = 0.0;
|
||||
_state = S_started;
|
||||
step(get_duration());
|
||||
priv_step(get_duration());
|
||||
_state = S_final;
|
||||
}
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ instant() {
|
|||
// (e.g. if the interval is being played by a slider).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CLerpNodePathInterval::
|
||||
step(double t) {
|
||||
priv_step(double t) {
|
||||
check_started("step");
|
||||
_state = S_started;
|
||||
double d = compute_delta(t);
|
||||
|
|
@ -187,7 +187,7 @@ step(double t) {
|
|||
|
||||
default:
|
||||
interval_cat.error()
|
||||
<< "Internal error in CLerpNodePathInterval::step().\n";
|
||||
<< "Internal error in CLerpNodePathInterval::priv_step().\n";
|
||||
}
|
||||
|
||||
// Now apply the new transform back to the node.
|
||||
|
|
@ -278,36 +278,36 @@ step(double t) {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CLerpNodePathInterval::reverse_initialize
|
||||
// Access: Published, Virtual
|
||||
// Description: Similar to initialize(), but this is called when the
|
||||
// Description: Similar to priv_initialize(), but this is called when the
|
||||
// interval is being played backwards; it indicates that
|
||||
// the interval should start at the finishing state and
|
||||
// undo any intervening intervals.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CLerpNodePathInterval::
|
||||
reverse_initialize(double t) {
|
||||
priv_reverse_initialize(double t) {
|
||||
check_stopped("reverse_initialize");
|
||||
recompute();
|
||||
_state = S_started;
|
||||
_prev_d = 1.0;
|
||||
step(t);
|
||||
priv_step(t);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CLerpNodePathInterval::reverse_instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of reverse_initialize()
|
||||
// .. step() .. reverse_finalize(), when everything is
|
||||
// Description: This is called in lieu of priv_reverse_initialize()
|
||||
// .. priv_step() .. priv_reverse_finalize(), when everything is
|
||||
// to happen within one frame. The interval should
|
||||
// initialize itself, then leave itself in the initial
|
||||
// state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CLerpNodePathInterval::
|
||||
reverse_instant() {
|
||||
priv_reverse_instant() {
|
||||
check_stopped("reverse_initialize");
|
||||
recompute();
|
||||
_state = S_started;
|
||||
_prev_d = 1.0;
|
||||
step(0.0);
|
||||
priv_step(0.0);
|
||||
_state = S_initial;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -50,11 +50,11 @@ PUBLISHED:
|
|||
INLINE void set_start_color_scale(const LVecBase4f &color_scale);
|
||||
INLINE void set_end_color_scale(const LVecBase4f &color_scale);
|
||||
|
||||
virtual void initialize(double t);
|
||||
virtual void instant();
|
||||
virtual void step(double t);
|
||||
virtual void reverse_initialize(double t);
|
||||
virtual void reverse_instant();
|
||||
virtual void priv_initialize(double t);
|
||||
virtual void priv_instant();
|
||||
virtual void priv_step(double t);
|
||||
virtual void priv_reverse_initialize(double t);
|
||||
virtual void priv_reverse_instant();
|
||||
|
||||
virtual void output(ostream &out) const;
|
||||
|
||||
|
|
|
|||
|
|
@ -101,8 +101,8 @@ get_ext_index(int n) const {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CMetaInterval::is_event_ready
|
||||
// Access: Published
|
||||
// Description: Returns true if a recent call to initialize(),
|
||||
// step(), or finalize() has left some external
|
||||
// Description: Returns true if a recent call to priv_initialize(),
|
||||
// priv_step(), or priv_finalize() has left some external
|
||||
// intervals ready to play. If this returns true, call
|
||||
// get_event_index(), get_event_t(), and pop_event() to
|
||||
// retrieve the relevant information.
|
||||
|
|
|
|||
|
|
@ -323,14 +323,14 @@ get_interval_end_time(const string &name) const {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CMetaInterval::initialize
|
||||
// Access: Published, Virtual
|
||||
// Description: This replaces the first call to step(), and indicates
|
||||
// Description: This replaces the first call to priv_step(), and indicates
|
||||
// that the interval has just begun. This may be
|
||||
// overridden by derived classes that need to do some
|
||||
// explicit initialization on the first call.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CMetaInterval::
|
||||
initialize(double t) {
|
||||
check_stopped("initialize");
|
||||
priv_initialize(double t) {
|
||||
check_stopped("priv_initialize");
|
||||
// It may be tempting to flush the event_queue here, but don't do
|
||||
// it. Those are events that must still be serviced from some
|
||||
// previous interval operation. Throwing them away would be a
|
||||
|
|
@ -361,14 +361,14 @@ initialize(double t) {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CMetaInterval::instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of initialize() .. step()
|
||||
// .. finalize(), when everything is to happen within
|
||||
// Description: This is called in lieu of priv_initialize() .. priv_step()
|
||||
// .. priv_finalize(), when everything is to happen within
|
||||
// one frame. The interval should initialize itself,
|
||||
// then leave itself in the final state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CMetaInterval::
|
||||
instant() {
|
||||
check_stopped("instant");
|
||||
priv_instant() {
|
||||
check_stopped("priv_instant");
|
||||
recompute();
|
||||
_active.clear();
|
||||
|
||||
|
|
@ -395,8 +395,8 @@ instant() {
|
|||
// (e.g. if the interval is being played by a slider).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CMetaInterval::
|
||||
step(double t) {
|
||||
check_started("step");
|
||||
priv_step(double t) {
|
||||
check_started("priv_step");
|
||||
int now = double_to_int_time(t);
|
||||
|
||||
// Now look for events between the last time we ran and the current
|
||||
|
|
@ -438,14 +438,14 @@ step(double t) {
|
|||
// Function: CMetaInterval::finalize
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called when an interval is interrupted. It
|
||||
// should advance the time as if step() were called, and
|
||||
// should advance the time as if priv_step() were called, and
|
||||
// also perform whatever cleanup might be required.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CMetaInterval::
|
||||
finalize() {
|
||||
priv_finalize() {
|
||||
double duration = get_duration();
|
||||
if (_state == S_initial) {
|
||||
initialize(duration);
|
||||
priv_initialize(duration);
|
||||
}
|
||||
|
||||
// Do all remaining events.
|
||||
|
|
@ -465,14 +465,14 @@ finalize() {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CMetaInterval::reverse_initialize
|
||||
// Access: Published, Virtual
|
||||
// Description: Similar to initialize(), but this is called when the
|
||||
// Description: Similar to priv_initialize(), but this is called when the
|
||||
// interval is being played backwards; it indicates that
|
||||
// the interval should start at the finishing state and
|
||||
// undo any intervening intervals.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CMetaInterval::
|
||||
reverse_initialize(double t) {
|
||||
check_stopped("reverse_initialize");
|
||||
priv_reverse_initialize(double t) {
|
||||
check_stopped("priv_reverse_initialize");
|
||||
// It may be tempting to flush the event_queue here, but don't do
|
||||
// it. Those are events that must still be serviced from some
|
||||
// previous interval operation. Throwing them away would be a
|
||||
|
|
@ -503,15 +503,15 @@ reverse_initialize(double t) {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CMetaInterval::reverse_instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of reverse_initialize()
|
||||
// .. step() .. reverse_finalize(), when everything is
|
||||
// Description: This is called in lieu of priv_reverse_initialize()
|
||||
// .. priv_step() .. priv_reverse_finalize(), when everything is
|
||||
// to happen within one frame. The interval should
|
||||
// initialize itself, then leave itself in the initial
|
||||
// state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CMetaInterval::
|
||||
reverse_instant() {
|
||||
check_stopped("reverse_instant");
|
||||
priv_reverse_instant() {
|
||||
check_stopped("priv_reverse_instant");
|
||||
recompute();
|
||||
_active.clear();
|
||||
|
||||
|
|
@ -533,14 +533,14 @@ reverse_instant() {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CMetaInterval::reverse_finalize
|
||||
// Access: Published, Virtual
|
||||
// Description: Called generally following a reverse_initialize(),
|
||||
// Description: Called generally following a priv_reverse_initialize(),
|
||||
// this indicates the interval should set itself to the
|
||||
// initial state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CMetaInterval::
|
||||
reverse_finalize() {
|
||||
priv_reverse_finalize() {
|
||||
if (_state == S_initial) {
|
||||
initialize(0.0);
|
||||
priv_initialize(0.0);
|
||||
}
|
||||
|
||||
// Do all remaining events at the beginning.
|
||||
|
|
@ -562,17 +562,17 @@ reverse_finalize() {
|
|||
// Access: Published, Virtual
|
||||
// Description: This is called while the interval is playing to
|
||||
// indicate that it is about to be interrupted; that is,
|
||||
// step() will not be called for a length of time. But
|
||||
// priv_step() will not be called for a length of time. But
|
||||
// the interval should remain in its current state in
|
||||
// anticipation of being eventually restarted when the
|
||||
// calls to step() eventually resume.
|
||||
// calls to priv_step() eventually resume.
|
||||
//
|
||||
// The purpose of this function is to allow self-running
|
||||
// intervals like sound intervals to stop the actual
|
||||
// sound playback during the pause.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CMetaInterval::
|
||||
interrupt() {
|
||||
priv_interrupt() {
|
||||
ActiveEvents::iterator ai;
|
||||
for (ai = _active.begin(); ai != _active.end(); ++ai) {
|
||||
PlaybackEvent *event = (*ai);
|
||||
|
|
@ -744,8 +744,8 @@ do_event_forward(CMetaInterval::PlaybackEvent *event,
|
|||
// Access: Private
|
||||
// Description: After walking through the event list and adding a
|
||||
// bunch of new events to new_active, finished up by
|
||||
// calling step() on all of the events still in _active
|
||||
// and initialize() on all the events in new_active,
|
||||
// calling priv_step() on all of the events still in _active
|
||||
// and priv_initialize() on all the events in new_active,
|
||||
// then copying the events from new_active to active.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CMetaInterval::
|
||||
|
|
@ -824,8 +824,8 @@ do_event_reverse(CMetaInterval::PlaybackEvent *event,
|
|||
// Access: Private
|
||||
// Description: After walking through the event list and adding a
|
||||
// bunch of new events to new_active, finishes up by
|
||||
// calling step() on all of the events still in _active
|
||||
// and reverse_initialize() on all the events in
|
||||
// calling priv_step() on all of the events still in _active
|
||||
// and priv_reverse_initialize() on all the events in
|
||||
// new_active, then copying the events from new_active
|
||||
// to active.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -856,8 +856,8 @@ finish_events_reverse(int now, CMetaInterval::ActiveEvents &new_active) {
|
|||
//
|
||||
// is_initial is only relevant for event types
|
||||
// ET_instant or ET_reverse_instant, and indicates
|
||||
// whether we are in the initialize() (or
|
||||
// reverse_initialize()) call, and should therefore only
|
||||
// whether we are in the priv_initialize() (or
|
||||
// priv_reverse_initialize()) call, and should therefore only
|
||||
// invoke open-ended intervals.
|
||||
//
|
||||
// time is only relevant for ET_initialize,
|
||||
|
|
@ -873,7 +873,7 @@ enqueue_event(int n, CInterval::EventType event_type, bool is_initial, int time)
|
|||
(event_type == ET_instant || event_type == ET_reverse_instant) &&
|
||||
!def._c_interval->get_open_ended()) {
|
||||
// Ignore a non-open-ended interval that we skipped completely
|
||||
// past on initialize().
|
||||
// past on priv_initialize().
|
||||
return;
|
||||
} else {
|
||||
if (_event_queue.empty()) {
|
||||
|
|
@ -881,7 +881,7 @@ enqueue_event(int n, CInterval::EventType event_type, bool is_initial, int time)
|
|||
// interval immediately. We only need to defer it if there
|
||||
// are external (e.g. Python) intervals in the queue that need
|
||||
// to be processed first.
|
||||
def._c_interval->set_t(int_to_double_time(time), event_type);
|
||||
def._c_interval->priv_do_event(int_to_double_time(time), event_type);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -892,7 +892,7 @@ enqueue_event(int n, CInterval::EventType event_type, bool is_initial, int time)
|
|||
(event_type == ET_instant || event_type == ET_reverse_instant) &&
|
||||
!def._ext_open_ended) {
|
||||
// Ignore a non-open-ended interval that we skipped completely
|
||||
// past on initialize().
|
||||
// past on priv_initialize().
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
|
@ -925,7 +925,7 @@ service_event_queue() {
|
|||
switch (def._type) {
|
||||
case DT_c_interval:
|
||||
// Handle the C++ event.
|
||||
def._c_interval->set_t(int_to_double_time(entry._time), entry._event_type);
|
||||
def._c_interval->priv_do_event(int_to_double_time(entry._time), entry._event_type);
|
||||
break;
|
||||
|
||||
case DT_ext_index:
|
||||
|
|
|
|||
|
|
@ -74,14 +74,14 @@ PUBLISHED:
|
|||
INLINE CInterval *get_c_interval(int n) const;
|
||||
INLINE int get_ext_index(int n) const;
|
||||
|
||||
virtual void initialize(double t);
|
||||
virtual void instant();
|
||||
virtual void step(double t);
|
||||
virtual void finalize();
|
||||
virtual void reverse_initialize(double t);
|
||||
virtual void reverse_instant();
|
||||
virtual void reverse_finalize();
|
||||
virtual void interrupt();
|
||||
virtual void priv_initialize(double t);
|
||||
virtual void priv_instant();
|
||||
virtual void priv_step(double t);
|
||||
virtual void priv_finalize();
|
||||
virtual void priv_reverse_initialize(double t);
|
||||
virtual void priv_reverse_instant();
|
||||
virtual void priv_reverse_finalize();
|
||||
virtual void priv_interrupt();
|
||||
|
||||
INLINE bool is_event_ready();
|
||||
INLINE int get_event_index() const;
|
||||
|
|
@ -167,7 +167,7 @@ private:
|
|||
size_t _next_event_index;
|
||||
|
||||
// This is the queue of events that have occurred due to a recent
|
||||
// initialize(), step(), etc., but have not yet been serviced, due
|
||||
// priv_initialize(), priv_step(), etc., but have not yet been serviced, due
|
||||
// to an embedded external (e.g. Python) interval that the scripting
|
||||
// language must service. This queue should be considered precious,
|
||||
// and should never be arbitrarily flushed without servicing all of
|
||||
|
|
|
|||
|
|
@ -43,26 +43,26 @@ HideInterval(const NodePath &node, const string &name) :
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: HideInterval::instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of initialize() .. step()
|
||||
// .. finalize(), when everything is to happen within
|
||||
// Description: This is called in lieu of priv_initialize() .. priv_step()
|
||||
// .. priv_finalize(), when everything is to happen within
|
||||
// one frame. The interval should initialize itself,
|
||||
// then leave itself in the final state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void HideInterval::
|
||||
instant() {
|
||||
priv_instant() {
|
||||
_node.hide();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: HideInterval::reverse_instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of reverse_initialize()
|
||||
// .. step() .. reverse_finalize(), when everything is
|
||||
// Description: This is called in lieu of priv_reverse_initialize()
|
||||
// .. priv_step() .. priv_reverse_finalize(), when everything is
|
||||
// to happen within one frame. The interval should
|
||||
// initialize itself, then leave itself in the initial
|
||||
// state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void HideInterval::
|
||||
reverse_instant() {
|
||||
priv_reverse_instant() {
|
||||
_node.show();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ class EXPCL_DIRECT HideInterval : public CInterval {
|
|||
PUBLISHED:
|
||||
HideInterval(const NodePath &node, const string &name = string());
|
||||
|
||||
virtual void instant();
|
||||
virtual void reverse_instant();
|
||||
virtual void priv_instant();
|
||||
virtual void priv_reverse_instant();
|
||||
|
||||
private:
|
||||
NodePath _node;
|
||||
|
|
|
|||
|
|
@ -43,13 +43,13 @@ ShowInterval(const NodePath &node, const string &name) :
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: ShowInterval::instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of initialize() .. step()
|
||||
// .. finalize(), when everything is to happen within
|
||||
// Description: This is called in lieu of priv_initialize() .. priv_step()
|
||||
// .. priv_finalize(), when everything is to happen within
|
||||
// one frame. The interval should initialize itself,
|
||||
// then leave itself in the final state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void ShowInterval::
|
||||
instant() {
|
||||
priv_instant() {
|
||||
check_stopped("instant");
|
||||
_node.show();
|
||||
_state = S_final;
|
||||
|
|
@ -58,14 +58,14 @@ instant() {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Function: ShowInterval::reverse_instant
|
||||
// Access: Published, Virtual
|
||||
// Description: This is called in lieu of reverse_initialize()
|
||||
// .. step() .. reverse_finalize(), when everything is
|
||||
// Description: This is called in lieu of priv_reverse_initialize()
|
||||
// .. priv_step() .. priv_reverse_finalize(), when everything is
|
||||
// to happen within one frame. The interval should
|
||||
// initialize itself, then leave itself in the initial
|
||||
// state.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void ShowInterval::
|
||||
reverse_instant() {
|
||||
priv_reverse_instant() {
|
||||
check_stopped("instant");
|
||||
_node.hide();
|
||||
_state = S_initial;
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ class EXPCL_DIRECT ShowInterval : public CInterval {
|
|||
PUBLISHED:
|
||||
ShowInterval(const NodePath &node, const string &name = string());
|
||||
|
||||
virtual void instant();
|
||||
virtual void reverse_instant();
|
||||
virtual void priv_instant();
|
||||
virtual void priv_reverse_instant();
|
||||
|
||||
private:
|
||||
NodePath _node;
|
||||
|
|
|
|||
Loading…
Reference in New Issue