diff --git a/direct/src/showutil/Effects.py b/direct/src/showutil/Effects.py new file mode 100644 index 0000000000..f091c559e5 --- /dev/null +++ b/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 + +