diff --git a/direct/src/interval/Interval.py b/direct/src/interval/Interval.py index 6ea262398d..a22b72170b 100644 --- a/direct/src/interval/Interval.py +++ b/direct/src/interval/Interval.py @@ -62,8 +62,19 @@ class Interval(DirectObject): state = self.getState() if state == CInterval.SInitial: self.privInitialize(t) + if self.isPlaying(): + self.setupResume() elif state == CInterval.SFinal: self.privReverseInitialize(t) + if self.isPlaying(): + self.setupResume() + elif state == CInterval.SStarted: + # Support modifying t while the interval is playing. We + # assume is_playing() will be true in this state. + assert(self.isPlaying()) + self.privInterrupt() + self.privStep(t) + self.setupResume() else: self.privStep(t) self.privPostEvent() diff --git a/direct/src/interval/cInterval.cxx b/direct/src/interval/cInterval.cxx index c0884774ea..12bf5f73a8 100644 --- a/direct/src/interval/cInterval.cxx +++ b/direct/src/interval/cInterval.cxx @@ -70,10 +70,25 @@ set_t(double t) { switch (get_state()) { case S_initial: priv_initialize(t); + if (is_playing()) { + setup_resume(); + } break; case S_final: priv_reverse_initialize(t); + if (is_playing()) { + setup_resume(); + } + break; + + case S_started: + // Support modifying t while the interval is playing. We assume + // is_playing() will be true in this state. + nassertv(is_playing()); + priv_interrupt(); + priv_step(t); + setup_resume(); break; default: