浏览代码

added a pseudo-generic bounce effect

gregw 23 年之前
父节点
当前提交
b7b7e9b9d7
共有 1 个文件被更改,包括 140 次插入0 次删除
  1. 140 0
      direct/src/showutil/Effects.py

+ 140 - 0
direct/src/showutil/Effects.py

@@ -0,0 +1,140 @@
+""" Showutil Effects module: contains code for useful showcode effects. """
+from DirectObject import *
+from PandaModules import *
+from IntervalGlobal import *
+
+# bounce types
+SX_BOUNCE = 0
+SY_BOUNCE = 1
+SZ_BOUNCE = 2
+TX_BOUNCE = 3
+TY_BOUNCE = 4
+TZ_BOUNCE = 5
+H_BOUNCE = 6
+P_BOUNCE = 7
+R_BOUNCE = 8
+
+
+# convenience funcs
+#
+def createScaleXBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
+    return createBounce(nodeObj, numBounces, startValues, totalTime,
+                        amplitude, SX_BOUNCE)
+
+def createScaleYBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
+    return createBounce(nodeObj, numBounces, startValues, totalTime,
+                        amplitude, SY_BOUNCE)
+
+def createScaleZBounce(nodeObj, numBounces, startValue, totalTime, amplitude):
+    return createBounce(nodeObj, numBounces, startValue, totalTime,
+                        amplitude, SZ_BOUNCE)
+
+def createXBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
+    return createBounce(nodeObj, numBounces, startValues, totalTime,
+                        amplitude, TX_BOUNCE)
+
+def createYBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
+    return createBounce(nodeObj, numBounces, startValues, totalTime,
+                        amplitude, TY_BOUNCE)
+
+def createZBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
+    return createBounce(nodeObj, numBounces, startValues, totalTime,
+                        amplitude, TZ_BOUNCE)
+
+def createHBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
+    return createBounce(nodeObj, numBounces, startValues, totalTime,
+                        amplitude, H_BOUNCE)
+
+def createPBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
+    return createBounce(nodeObj, numBounces, startValues, totalTime,
+                        amplitude, P_BOUNCE)
+
+def createRBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
+    return createBounce(nodeObj, numBounces, startValues, totalTime,
+                        amplitude, R_BOUNCE)
+
+    
+# createBounce: create and return a list of intervals to make a
+# given nodePath bounce a given number of times over a give total time.
+#
+def createBounce(nodeObj, numBounces, startValues, totalTime, amplitude,
+                 bounceType=SZ_BOUNCE):
+    """
+    ////////////////////////////////////////////////////////////////////
+    // Function: createBounce
+    // Parameters: 
+    // Changes:
+    ////////////////////////////////////////////////////////////////////
+    """
+    if not nodeObj or numBounces < 1 or totalTime == 0:
+        self.notify.warning(
+            "createBounceIvals called with invalid parameter")
+        return
+    
+    result = []
+        
+    # calculate how long, in seconds, each bounce should last
+    bounceTime = totalTime/float(numBounces)
+    currTime = bounceTime
+    currAmplitude = amplitude
+    
+    # determine the how much of a change in value the first bounce
+    # will produce based on the given start value and amplitude 
+    #
+    if ((bounceType == SX_BOUNCE) or (bounceType == TX_BOUNCE) or
+        (bounceType == H_BOUNCE)):
+        index = 0        
+    elif ((bounceType == SY_BOUNCE) or (bounceType == TY_BOUNCE) or
+          (bounceType == P_BOUNCE)):
+        index = 1        
+    elif ((bounceType == SZ_BOUNCE) or (bounceType == TZ_BOUNCE) or
+          (bounceType == R_BOUNCE)):
+        index = 2        
+    currBounceVal = startValues[index]
+
+    # create a lerp interval for each bounce, making sure to
+    # figure out the new value, which progressively gets closer
+    # to our start value
+    #
+    for bounceNum in range(numBounces):
+        # determine the direction that this value should go,
+        # alternating for each lerp interval to simulate
+        # a spring effect
+        #
+        if bounceNum % 2:
+            # bounce down
+            currBounceVal = startValues[index]
+            blend = 'easeIn'
+        else:
+            # bounce up
+            currBounceVal = startValues[index] + currAmplitude
+            blend = 'easeOut'
+
+        newVec3 = Vec3(startValues)
+        newVec3.setCell(index, currBounceVal)
+        
+        # create the right type of lerp
+        if ((bounceType == SX_BOUNCE) or (bounceType == SY_BOUNCE) or
+            (bounceType == SZ_BOUNCE)):
+            result.append(LerpScaleInterval(
+                nodeObj, currTime, newVec3, blendType=blend))
+        elif ((bounceType == TX_BOUNCE) or (bounceType == TY_BOUNCE) or
+              (bounceType == TZ_BOUNCE)):
+            result.append(LerpPosInterval(
+                nodeObj, currTime, newVec3, blendType=blend))
+        elif ((bounceType == H_BOUNCE) or (bounceType == P_BOUNCE) or
+              (bounceType == R_BOUNCE)):
+            result.append(LerpHprInterval(
+                nodeObj, currTime, newVec3, blendType=blend))
+
+        # the value diff from the base gets smaller for each
+        # consecutive bounce, and make sure to update for
+        # possibly a new amount of time the next bounce will
+        # take
+        #
+        currAmplitude *= 0.5
+        currTime = bounceTime
+
+    return result
+
+