""" Showutil Effects module: contains code for useful showcode effects. """
from panda3d.core import Vec3
from direct.interval.IntervalGlobal import (
LerpHprInterval,
LerpPosInterval,
LerpScaleInterval,
Sequence,
)
# 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
#
[docs]def createScaleXBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
return createBounce(nodeObj, numBounces, startValues, totalTime,
amplitude, SX_BOUNCE)
[docs]def createScaleYBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
return createBounce(nodeObj, numBounces, startValues, totalTime,
amplitude, SY_BOUNCE)
[docs]def createScaleZBounce(nodeObj, numBounces, startValue, totalTime, amplitude):
return createBounce(nodeObj, numBounces, startValue, totalTime,
amplitude, SZ_BOUNCE)
[docs]def createXBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
return createBounce(nodeObj, numBounces, startValues, totalTime,
amplitude, TX_BOUNCE)
[docs]def createYBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
return createBounce(nodeObj, numBounces, startValues, totalTime,
amplitude, TY_BOUNCE)
[docs]def createZBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
return createBounce(nodeObj, numBounces, startValues, totalTime,
amplitude, TZ_BOUNCE)
[docs]def createHBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
return createBounce(nodeObj, numBounces, startValues, totalTime,
amplitude, H_BOUNCE)
[docs]def createPBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
return createBounce(nodeObj, numBounces, startValues, totalTime,
amplitude, P_BOUNCE)
[docs]def createRBounce(nodeObj, numBounces, startValues, totalTime, amplitude):
return createBounce(nodeObj, numBounces, startValues, totalTime,
amplitude, R_BOUNCE)
[docs]def createBounce(nodeObj, numBounces, startValues, totalTime, amplitude,
bounceType=SZ_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.
"""
if not nodeObj or numBounces < 1 or totalTime == 0:
raise ValueError("createBounce called with invalid parameter")
result = Sequence()
# calculate how long, in seconds, each bounce should last
bounceTime = totalTime / 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
#
index = bounceType % 3
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 * 2):
# 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 and bounceType <= SZ_BOUNCE:
result.append(LerpScaleInterval(
nodeObj, currTime, newVec3, blendType=blend))
elif bounceType >= TX_BOUNCE and bounceType <= TZ_BOUNCE:
result.append(LerpPosInterval(
nodeObj, currTime, newVec3, blendType=blend))
elif bounceType >= H_BOUNCE and 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