diff --git a/direct/src/interval/Interval.py b/direct/src/interval/Interval.py index 55df46bb85..f565672f07 100644 --- a/direct/src/interval/Interval.py +++ b/direct/src/interval/Interval.py @@ -20,6 +20,7 @@ class Interval(DirectObject): """ self.name = name self.duration = duration + assert(t >= 0.0) self.startTime = t0 self.type = type @@ -38,6 +39,13 @@ class Interval(DirectObject): """ return self.startTime + def setStartTime(self, t, rel=PrevEndRelative): + """ setStartTime() + """ + assert(t >= 0.0) + self.startTime = t + self.type = rel + def getType(self): """ getType() """ diff --git a/direct/src/interval/IntervalTest.py b/direct/src/interval/IntervalTest.py index ce483d9b3c..e3c09fe3c7 100644 --- a/direct/src/interval/IntervalTest.py +++ b/direct/src/interval/IntervalTest.py @@ -5,7 +5,7 @@ from IntervalGlobal import * import Mopath import IntervalPlayer -AudioManager.spawnUpdate() +#AudioManager.spawnUpdate() boat = loader.loadModel('models/directmodels/smiley') boat.reparentTo(render) @@ -13,24 +13,29 @@ boat.reparentTo(render) dock = loader.loadModel('models/directmodels/smiley') dock.reparentTo(render) +sound = loader.loadSound('phase_6/audio/sfx/SZ_DD_waterlap.mp3') + mp = Mopath.Mopath() mp.loadFile(Filename('phase_6/paths/dd-e-w')) boatMopath = MopathInterval('boatpath', mp, boat) -sound = loader.loadSound('phase_6/audio/sfx/SZ_DD_waterlap.mp3') -waterSound = SoundInterval('watersound', sound) +boatTrack = Track.Track([boatMopath], 'boattrack') +# Make the dock lerp up so that it's up when the boat reaches the end of +# its mopath pos = Point3(0, 0, -5) hpr = Vec3(0, 0, 0) dockLerp = LerpPosHprInterval('lerp', dock, pos, hpr, 5.0) +dockUpTime = boatTrack.getTrackRelativeEndTime('boatpath') - dockLerp.getDuration() +dockLerp.setStartTime(dockUpTime, Interval.Interval.TrackStartRelative) +dockTrack = Track.Track([dockLerp], 'docktrack') -boatTrack = Track.Track([boatMopath], 'boattrack') -dockWaitTime = boatMopath.getDuration() - dockLerp.getDuration() -dockTrack = Track.Track([Wait(dockWaitTime), dockLerp], 'docktrack') -postSoundWaitTime = 3.0 -preSoundWaitTime = boatMopath.getDuration() - (waterSound.getDuration() + postSoundWaitTime) -soundTrack = Track.Track([Wait(preSoundWaitTime), waterSound, Wait(postSoundWaitTime)], 'soundtrack') +# Start the water sound 5 seconds after the boat starts moving +waterStartTime = boatTrack.getTrackRelativeStartTime('boatpath') + 5.0 +waterSound = SoundInterval('watersound', sound, loop=1) +waterSound.setStartTime(waterStartTime, Interval.Interval.TrackStartRelative) +soundTrack = Track.Track([waterSound], 'soundtrack') mtrack = MultiTrack.MultiTrack([boatTrack, dockTrack, soundTrack]) diff --git a/direct/src/interval/SoundInterval.py b/direct/src/interval/SoundInterval.py index 509ecc5e5a..80bcca7d50 100644 --- a/direct/src/interval/SoundInterval.py +++ b/direct/src/interval/SoundInterval.py @@ -16,6 +16,10 @@ class SoundInterval(Interval.Interval): self.name = name self.sound = sound self.duration = self.sound.length() + if (self.duration == 0.0): + Interval.Interval.notify.warning( + 'SoundInterval(): zero length sound - setting duration = 1.0') + self.duration = 1.0 self.loop = loop self.isPlaying = 0 self.startTime = t0 @@ -25,8 +29,9 @@ class SoundInterval(Interval.Interval): """ setT(t) Go to time t """ - print 'SoundInterval.setT(): t: %f' % t if (t > self.duration): + if (self.isPlaying == 1): + AudioManager.stop(self.sound) return assert(t >= 0) if (t == 0): diff --git a/direct/src/interval/Track.py b/direct/src/interval/Track.py index d460ca4df2..e7bac550b1 100644 --- a/direct/src/interval/Track.py +++ b/direct/src/interval/Track.py @@ -56,7 +56,7 @@ class Track(Interval.Interval): """ for i in range(len(self.ilist)): if (self.ilist[i].getName() == name): - return self.__computeDuration(i) - self.ilist[i].getDuration() + return self.__computeDuration(i+1) - self.ilist[i].getDuration() Interval.notify.warning( 'Track.getRelativeStartTime(): no Interval named: %s' % name) return 0.0 @@ -72,7 +72,7 @@ class Track(Interval.Interval): """ for i in range(len(self.ilist)): if (self.ilist[i].getName() == name): - return self.__computeDuration(i) + return self.__computeDuration(i+1) Interval.notify.warning( 'Track.getRelativeEndTime(): no Interval named: %s' % name) return 0.0 @@ -88,11 +88,9 @@ class Track(Interval.Interval): # Anything beyond the end of the track is assumed to be the # final state of the last Interval on the track self.ilist[len(self.ilist)-1].setT(t) - print self.name + ': t > self.duration' else: # Find out which Interval applies prev = None - print self.name for i in self.ilist: # Calculate the track relative start time for the interval t0 = self.__getTrackRelativeStartTime(i) @@ -100,7 +98,6 @@ class Track(Interval.Interval): # Determine if the Interval is applicable if (t < t0): if (prev != None): - print 'in a gap at t: %f' % t # Gaps between Intervals take the final state of # the previous Interval prev.setT(t) @@ -110,8 +107,6 @@ class Track(Interval.Interval): 'Track.setT(): state undefined at t: %f' % t) return elif (t0 <= t) and (t <= t0 + i.getDuration()): - print 'in interval: ' + i.getName() + ' at t: %f' % t i.setT(t - t0) return prev = i - print 'no intervals apply at t: %f' % t