mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
added a pseudo-generic bounce effect
This commit is contained in:
parent
5b0d17f5be
commit
b7b7e9b9d7
140
direct/src/showutil/Effects.py
Normal file
140
direct/src/showutil/Effects.py
Normal file
@ -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
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user