فهرست منبع

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

Przemyslaw Iwanowski 18 سال پیش
والد
کامیت
2f9f3b1b0b
2فایلهای تغییر یافته به همراه13 افزوده شده و 9 حذف شده
  1. 11 7
      direct/src/showbase/SfxPlayer.py
  2. 2 2
      direct/src/showbase/ShowBase.py

+ 11 - 7
direct/src/showbase/SfxPlayer.py

@@ -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:

+ 2 - 2
direct/src/showbase/ShowBase.py

@@ -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: