changed sfx player so that now a cutoff distance can be specified on per sound basis as an optional argument to the player

This commit is contained in:
Przemyslaw Iwanowski 2007-10-08 21:10:28 +00:00
parent 81735f8dee
commit 2f9f3b1b0b
2 changed files with 13 additions and 9 deletions

View File

@ -41,7 +41,7 @@ class SfxPlayer:
"""Return the curent cutoff distance.""" """Return the curent cutoff distance."""
return self.cutoffDistance return self.cutoffDistance
def getLocalizedVolume(self, node, listenerNode = None): def getLocalizedVolume(self, node, listenerNode = None, cutoff = None):
""" """
Get the volume that a sound should be played at if it is Get the volume that a sound should be played at if it is
localized at this node. We compute this wrt the camera localized at this node. We compute this wrt the camera
@ -53,7 +53,7 @@ class SfxPlayer:
d = node.getDistance(listenerNode) d = node.getDistance(listenerNode)
else: else:
d = node.getDistance(base.cam) d = node.getDistance(base.cam)
if d == None or d > self.cutoffDistance: if d == None or d > cutoff:
volume = 0 volume = 0
else: else:
if SfxPlayer.UseInverseSquare: if SfxPlayer.UseInverseSquare:
@ -61,16 +61,20 @@ class SfxPlayer:
volume = min(1, 1 / (sd*sd or 1)) volume = min(1, 1 / (sd*sd or 1))
#print d, sd, volume #print d, sd, volume
else: else:
volume = 1 - (d / (self.cutoffDistance or 1)) volume = 1 - (d / (cutoff or 1))
#print d, volume #print d, volume
return volume return volume
def playSfx( def playSfx(
self, sfx, looping = 0, interrupt = 1, volume = None, self, sfx, looping = 0, interrupt = 1, volume = None,
time = 0.0, node=None, listenerNode = None): time = 0.0, node=None, listenerNode = None, cutoff = None):
if sfx: if sfx:
self.setFinalVolume(sfx, node, volume, listenerNode) if not cutoff:
cutoff = self.cutoffDistance
self.setFinalVolume(sfx, node, volume, listenerNode, cutoff)
# dont start over if it's already playing, unless # dont start over if it's already playing, unless
# "interrupt" was specified # "interrupt" was specified
if interrupt or (sfx.status() != AudioSound.PLAYING): if interrupt or (sfx.status() != AudioSound.PLAYING):
@ -78,13 +82,13 @@ class SfxPlayer:
sfx.setLoop(looping) sfx.setLoop(looping)
sfx.play() sfx.play()
def setFinalVolume(self, sfx, node, volume, listenerNode): def setFinalVolume(self, sfx, node, volume, listenerNode, cutoff = None):
"""Calculate the final volume based on all contributed factors.""" """Calculate the final volume based on all contributed factors."""
# If we have either a node or a volume, we need to adjust the sfx # If we have either a node or a volume, we need to adjust the sfx
# The volume passed in multiplies the distance base volume # The volume passed in multiplies the distance base volume
if node or (volume is not None): if node or (volume is not None):
if node: if node:
finalVolume = self.getLocalizedVolume(node, listenerNode) finalVolume = self.getLocalizedVolume(node, listenerNode, cutoff)
else: else:
finalVolume = 1 finalVolume = 1
if volume is not None: if volume is not None:

View File

@ -1412,9 +1412,9 @@ class ShowBase(DirectObject.DirectObject):
def playSfx( def playSfx(
self, sfx, looping = 0, interrupt = 1, volume = None, self, sfx, looping = 0, interrupt = 1, volume = None,
time = 0.0, node = None): time = 0.0, node = None, listener = None, cutoff = None):
# This goes through a special player for potential localization # This goes through a special player for potential localization
return self.sfxPlayer.playSfx(sfx, looping, interrupt, volume, time, node) return self.sfxPlayer.playSfx(sfx, looping, interrupt, volume, time, node, listener, cutoff)
def playMusic(self, music, looping = 0, interrupt = 1, volume = None, time = 0.0): def playMusic(self, music, looping = 0, interrupt = 1, volume = None, time = 0.0):
if music: if music: