mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 01:44:06 -04:00
add angular velocity
This commit is contained in:
parent
e789201a5e
commit
12a8319f8e
@ -52,13 +52,13 @@ class Particles(ParticleSystem.ParticleSystem):
|
|||||||
self.setRenderParent(self.node)
|
self.setRenderParent(self.node)
|
||||||
self.node.addPhysical(self)
|
self.node.addPhysical(self)
|
||||||
|
|
||||||
self.factory = None
|
self.factory = None
|
||||||
self.factoryType = "undefined"
|
self.factoryType = "undefined"
|
||||||
self.setFactory("PointParticleFactory")
|
self.setFactory("PointParticleFactory")
|
||||||
self.renderer = None
|
self.renderer = None
|
||||||
self.rendererType = "undefined"
|
self.rendererType = "undefined"
|
||||||
self.setRenderer("PointParticleRenderer")
|
self.setRenderer("PointParticleRenderer")
|
||||||
self.emitter = None
|
self.emitter = None
|
||||||
self.emitterType = "undefined"
|
self.emitterType = "undefined"
|
||||||
self.setEmitter("SphereVolumeEmitter")
|
self.setEmitter("SphereVolumeEmitter")
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ class Particles(ParticleSystem.ParticleSystem):
|
|||||||
self.factory = None
|
self.factory = None
|
||||||
self.factoryType = type
|
self.factoryType = type
|
||||||
if (type == "PointParticleFactory"):
|
if (type == "PointParticleFactory"):
|
||||||
self.factory = PointParticleFactory.PointParticleFactory()
|
self.factory = PointParticleFactory.PointParticleFactory()
|
||||||
elif (type == "ZSpinParticleFactory"):
|
elif (type == "ZSpinParticleFactory"):
|
||||||
self.factory = ZSpinParticleFactory.ZSpinParticleFactory()
|
self.factory = ZSpinParticleFactory.ZSpinParticleFactory()
|
||||||
elif (type == "OrientedParticleFactory"):
|
elif (type == "OrientedParticleFactory"):
|
||||||
@ -263,31 +263,40 @@ class Particles(ParticleSystem.ParticleSystem):
|
|||||||
file.write('# Z Spin factory parameters\n')
|
file.write('# Z Spin factory parameters\n')
|
||||||
file.write(targ + '.factory.setInitialAngle(%.4f)\n' % \
|
file.write(targ + '.factory.setInitialAngle(%.4f)\n' % \
|
||||||
self.factory.getInitialAngle())
|
self.factory.getInitialAngle())
|
||||||
file.write(targ + '.factory.setFinalAngle(%.4f)\n' % \
|
|
||||||
self.factory.getFinalAngle())
|
|
||||||
file.write(targ + '.factory.setInitialAngleSpread(%.4f)\n' % \
|
file.write(targ + '.factory.setInitialAngleSpread(%.4f)\n' % \
|
||||||
self.factory.getInitialAngleSpread())
|
self.factory.getInitialAngleSpread())
|
||||||
file.write(targ + '.factory.setFinalAngleSpread(%.4f)\n' % \
|
file.write(targ + '.factory.enableAngularVelocity(%d)\n' % \
|
||||||
|
self.factory.getAngularVelocityEnabled())
|
||||||
|
if(self.factory.getAngularVelocityEnabled()):
|
||||||
|
file.write(targ + '.factory.setAngularVelocity(%.4f)\n' % \
|
||||||
|
self.factory.getAngularVelocity())
|
||||||
|
file.write(targ + '.factory.setAngularVelocitySpread(%.4f)\n' % \
|
||||||
|
self.factory.getAngularVelocitySpread())
|
||||||
|
else:
|
||||||
|
file.write(targ + '.factory.setFinalAngle(%.4f)\n' % \
|
||||||
|
self.factory.getFinalAngle())
|
||||||
|
file.write(targ + '.factory.setFinalAngleSpread(%.4f)\n' % \
|
||||||
self.factory.getFinalAngleSpread())
|
self.factory.getFinalAngleSpread())
|
||||||
|
|
||||||
elif (self.factoryType == "OrientedParticleFactory"):
|
elif (self.factoryType == "OrientedParticleFactory"):
|
||||||
file.write('# Oriented factory parameters\n')
|
file.write('# Oriented factory parameters\n')
|
||||||
file.write(targ + '.factory.setInitialOrientation(%.4f)\n' % \
|
file.write(targ + '.factory.setInitialOrientation(%.4f)\n' % \
|
||||||
self.factory.getInitialOrientation())
|
self.factory.getInitialOrientation())
|
||||||
file.write(targ + '.factory.setFinalOrientation(%.4f)\n' % \
|
file.write(targ + '.factory.setFinalOrientation(%.4f)\n' % \
|
||||||
self.factory.getFinalOrientation())
|
self.factory.getFinalOrientation())
|
||||||
|
|
||||||
file.write('# Renderer parameters\n')
|
file.write('# Renderer parameters\n')
|
||||||
alphaMode = self.renderer.getAlphaMode()
|
alphaMode = self.renderer.getAlphaMode()
|
||||||
aMode = "PRALPHANONE"
|
aMode = "PRALPHANONE"
|
||||||
if (alphaMode == BaseParticleRenderer.BaseParticleRenderer.PRALPHANONE):
|
if (alphaMode == BaseParticleRenderer.BaseParticleRenderer.PRALPHANONE):
|
||||||
aMode = "PRALPHANONE"
|
aMode = "PRALPHANONE"
|
||||||
elif (alphaMode ==
|
elif (alphaMode ==
|
||||||
BaseParticleRenderer.BaseParticleRenderer.PRALPHAOUT):
|
BaseParticleRenderer.BaseParticleRenderer.PRALPHAOUT):
|
||||||
aMode = "PRALPHAOUT"
|
aMode = "PRALPHAOUT"
|
||||||
elif (alphaMode ==
|
elif (alphaMode ==
|
||||||
BaseParticleRenderer.BaseParticleRenderer.PRALPHAIN):
|
BaseParticleRenderer.BaseParticleRenderer.PRALPHAIN):
|
||||||
aMode = "PRALPHAIN"
|
aMode = "PRALPHAIN"
|
||||||
elif (alphaMode ==
|
elif (alphaMode ==
|
||||||
BaseParticleRenderer.BaseParticleRenderer.PRALPHAUSER):
|
BaseParticleRenderer.BaseParticleRenderer.PRALPHAUSER):
|
||||||
aMode = "PRALPHAUSER"
|
aMode = "PRALPHAUSER"
|
||||||
file.write(targ + '.renderer.setAlphaMode(BaseParticleRenderer.' + aMode + ')\n')
|
file.write(targ + '.renderer.setAlphaMode(BaseParticleRenderer.' + aMode + ')\n')
|
||||||
@ -298,9 +307,9 @@ class Particles(ParticleSystem.ParticleSystem):
|
|||||||
file.write(targ + '.renderer.setPointSize(%.2f)\n' % \
|
file.write(targ + '.renderer.setPointSize(%.2f)\n' % \
|
||||||
self.renderer.getPointSize())
|
self.renderer.getPointSize())
|
||||||
sColor = self.renderer.getStartColor()
|
sColor = self.renderer.getStartColor()
|
||||||
file.write((targ + '.renderer.setStartColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
|
file.write((targ + '.renderer.setStartColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
|
||||||
sColor = self.renderer.getEndColor()
|
sColor = self.renderer.getEndColor()
|
||||||
file.write((targ + '.renderer.setEndColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
|
file.write((targ + '.renderer.setEndColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
|
||||||
blendType = self.renderer.getBlendType()
|
blendType = self.renderer.getBlendType()
|
||||||
bType = "PPONECOLOR"
|
bType = "PPONECOLOR"
|
||||||
if (blendType == PointParticleRenderer.PointParticleRenderer.PPONECOLOR):
|
if (blendType == PointParticleRenderer.PointParticleRenderer.PPONECOLOR):
|
||||||
|
@ -214,7 +214,7 @@ class ParticlePanel(AppShell):
|
|||||||
0.0, None)
|
0.0, None)
|
||||||
)
|
)
|
||||||
self.createFloaters(systemPage, systemFloaterDefs)
|
self.createFloaters(systemPage, systemFloaterDefs)
|
||||||
|
|
||||||
# Checkboxes
|
# Checkboxes
|
||||||
self.createCheckbutton(
|
self.createCheckbutton(
|
||||||
systemPage, 'System', 'Render Space Velocities',
|
systemPage, 'System', 'Render Space Velocities',
|
||||||
@ -225,7 +225,7 @@ class ParticlePanel(AppShell):
|
|||||||
systemPage, 'System', 'System Grows Older',
|
systemPage, 'System', 'System Grows Older',
|
||||||
'On: system has a lifespan',
|
'On: system has a lifespan',
|
||||||
self.toggleSystemGrowsOlder, 0)
|
self.toggleSystemGrowsOlder, 0)
|
||||||
|
|
||||||
# Vector widgets
|
# Vector widgets
|
||||||
pos = self.createVector3Entry(systemPage, 'System', 'Pos',
|
pos = self.createVector3Entry(systemPage, 'System', 'Pos',
|
||||||
'Particle system position',
|
'Particle system position',
|
||||||
@ -269,7 +269,8 @@ class ParticlePanel(AppShell):
|
|||||||
('Factory', 'Terminal Vel. Spread',
|
('Factory', 'Terminal Vel. Spread',
|
||||||
'Variation in terminal velocity',
|
'Variation in terminal velocity',
|
||||||
self.setFactoryTerminalVelocitySpread,
|
self.setFactoryTerminalVelocitySpread,
|
||||||
0.0, None))
|
0.0, None),
|
||||||
|
)
|
||||||
self.createFloaters(factoryPage, factoryWidgets)
|
self.createFloaters(factoryPage, factoryWidgets)
|
||||||
|
|
||||||
self.factoryNotebook = Pmw.NoteBook(factoryPage, tabpos = None)
|
self.factoryNotebook = Pmw.NoteBook(factoryPage, tabpos = None)
|
||||||
@ -277,6 +278,23 @@ class ParticlePanel(AppShell):
|
|||||||
factoryPointPage = self.factoryNotebook.add('PointParticleFactory')
|
factoryPointPage = self.factoryNotebook.add('PointParticleFactory')
|
||||||
# Z spin page #
|
# Z spin page #
|
||||||
zSpinPage = self.factoryNotebook.add('ZSpinParticleFactory')
|
zSpinPage = self.factoryNotebook.add('ZSpinParticleFactory')
|
||||||
|
|
||||||
|
self.createCheckbutton(
|
||||||
|
zSpinPage, 'Z Spin Factory', 'Enable Angular Velocity',
|
||||||
|
("On: angular velocity is used; " +
|
||||||
|
"Off: final angle is used"),
|
||||||
|
self.toggleAngularVelocity, 0, side = TOP),
|
||||||
|
|
||||||
|
self.createFloater(
|
||||||
|
zSpinPage, 'Z Spin Factory', 'Angular Velocity',
|
||||||
|
'How fast sprites rotate',
|
||||||
|
command = self.setFactoryZSpinAngularVelocity)
|
||||||
|
|
||||||
|
self.createFloater(
|
||||||
|
zSpinPage, 'Z Spin Factory', 'Angular Velocity Spread',
|
||||||
|
'Variation in how fast sprites rotate',
|
||||||
|
command = self.setFactoryZSpinAngularVelocitySpread)
|
||||||
|
|
||||||
self.createAngleDial(zSpinPage, 'Z Spin Factory', 'Initial Angle',
|
self.createAngleDial(zSpinPage, 'Z Spin Factory', 'Initial Angle',
|
||||||
'Starting angle in degrees',
|
'Starting angle in degrees',
|
||||||
fRollover = 1,
|
fRollover = 1,
|
||||||
@ -338,33 +356,33 @@ class ParticlePanel(AppShell):
|
|||||||
self.emissionType, BaseParticleEmitter.ETCUSTOM,
|
self.emissionType, BaseParticleEmitter.ETCUSTOM,
|
||||||
self.setEmissionType)
|
self.setEmissionType)
|
||||||
emissionFrame.pack(fill = 'x', expand = 0)
|
emissionFrame.pack(fill = 'x', expand = 0)
|
||||||
|
|
||||||
self.createFloater(
|
self.createFloater(
|
||||||
emitterPage, 'Emitter', 'Velocity Multiplier',
|
emitterPage, 'Emitter', 'Velocity Multiplier',
|
||||||
'launch velocity multiplier (all emission modes)',
|
'launch velocity multiplier (all emission modes)',
|
||||||
command = self.setEmitterAmplitude,
|
command = self.setEmitterAmplitude,
|
||||||
min = None)
|
min = None)
|
||||||
|
|
||||||
self.createFloater(
|
self.createFloater(
|
||||||
emitterPage, 'Emitter', 'Velocity Multiplier Spread',
|
emitterPage, 'Emitter', 'Velocity Multiplier Spread',
|
||||||
'spread for launch velocity multiplier (all emission modes)',
|
'spread for launch velocity multiplier (all emission modes)',
|
||||||
command = self.setEmitterAmplitudeSpread)
|
command = self.setEmitterAmplitudeSpread)
|
||||||
|
|
||||||
self.createVector3Entry(
|
self.createVector3Entry(
|
||||||
emitterPage, 'Emitter', 'Offset Velocity',
|
emitterPage, 'Emitter', 'Offset Velocity',
|
||||||
'Velocity vector applied to all particles',
|
'Velocity vector applied to all particles',
|
||||||
command = self.setEmitterOffsetForce)
|
command = self.setEmitterOffsetForce)
|
||||||
|
|
||||||
self.createVector3Entry(
|
self.createVector3Entry(
|
||||||
emitterPage, 'Emitter', 'Explicit Velocity',
|
emitterPage, 'Emitter', 'Explicit Velocity',
|
||||||
'all particles launch with this velocity in Explicit mode',
|
'all particles launch with this velocity in Explicit mode',
|
||||||
command = self.setEmitterExplicitLaunchVector)
|
command = self.setEmitterExplicitLaunchVector)
|
||||||
|
|
||||||
self.createVector3Entry(
|
self.createVector3Entry(
|
||||||
emitterPage, 'Emitter', 'Radiate Origin',
|
emitterPage, 'Emitter', 'Radiate Origin',
|
||||||
'particles launch away from this point in Radiate mode',
|
'particles launch away from this point in Radiate mode',
|
||||||
command = self.setEmitterRadiateOrigin)
|
command = self.setEmitterRadiateOrigin)
|
||||||
|
|
||||||
self.emitterNotebook = Pmw.NoteBook(emitterPage, tabpos = None)
|
self.emitterNotebook = Pmw.NoteBook(emitterPage, tabpos = None)
|
||||||
# Box page #
|
# Box page #
|
||||||
boxPage = self.emitterNotebook.add('BoxEmitter')
|
boxPage = self.emitterNotebook.add('BoxEmitter')
|
||||||
@ -399,7 +417,7 @@ class ParticlePanel(AppShell):
|
|||||||
'On: magnitude/angle interpolation from center',
|
'On: magnitude/angle interpolation from center',
|
||||||
self.toggleEmitterDiscCubicLerping, 0)
|
self.toggleEmitterDiscCubicLerping, 0)
|
||||||
customPage.pack(fill = BOTH, expand = 1)
|
customPage.pack(fill = BOTH, expand = 1)
|
||||||
|
|
||||||
# Line page #
|
# Line page #
|
||||||
linePage = self.emitterNotebook.add('LineEmitter')
|
linePage = self.emitterNotebook.add('LineEmitter')
|
||||||
self.createVector3Entry(linePage, 'Line Emitter', 'Min',
|
self.createVector3Entry(linePage, 'Line Emitter', 'Min',
|
||||||
@ -435,7 +453,7 @@ class ParticlePanel(AppShell):
|
|||||||
'Particle launch angle',
|
'Particle launch angle',
|
||||||
command = self.setEmitterRingLaunchAngle)
|
command = self.setEmitterRingLaunchAngle)
|
||||||
self.ringCustomFrame.pack(fill = BOTH, expand = 1)
|
self.ringCustomFrame.pack(fill = BOTH, expand = 1)
|
||||||
|
|
||||||
# Sphere volume #
|
# Sphere volume #
|
||||||
sphereVolumePage = self.emitterNotebook.add('SphereVolumeEmitter')
|
sphereVolumePage = self.emitterNotebook.add('SphereVolumeEmitter')
|
||||||
self.createFloater(sphereVolumePage, 'Sphere Volume Emitter', 'Radius',
|
self.createFloater(sphereVolumePage, 'Sphere Volume Emitter', 'Radius',
|
||||||
@ -449,7 +467,7 @@ class ParticlePanel(AppShell):
|
|||||||
'Radius of sphere',
|
'Radius of sphere',
|
||||||
command = self.setEmitterSphereSurfaceRadius,
|
command = self.setEmitterSphereSurfaceRadius,
|
||||||
min = 0.01)
|
min = 0.01)
|
||||||
# Tangent ring #
|
# Tangent ring #
|
||||||
tangentRingPage = self.emitterNotebook.add('TangentRingEmitter')
|
tangentRingPage = self.emitterNotebook.add('TangentRingEmitter')
|
||||||
self.createFloater(tangentRingPage, 'Tangent Ring Emitter', 'Radius',
|
self.createFloater(tangentRingPage, 'Tangent Ring Emitter', 'Radius',
|
||||||
'Radius of ring',
|
'Radius of ring',
|
||||||
@ -471,12 +489,12 @@ class ParticlePanel(AppShell):
|
|||||||
"alpha setting over particles' lifetime",
|
"alpha setting over particles' lifetime",
|
||||||
('NO_ALPHA','ALPHA_OUT','ALPHA_IN','ALPHA_USER'),
|
('NO_ALPHA','ALPHA_OUT','ALPHA_IN','ALPHA_USER'),
|
||||||
self.setRendererAlphaMode)
|
self.setRendererAlphaMode)
|
||||||
|
|
||||||
self.createSlider(
|
self.createSlider(
|
||||||
rendererPage, 'Renderer', 'User Alpha',
|
rendererPage, 'Renderer', 'User Alpha',
|
||||||
'alpha value for ALPHA_USER alpha mode',
|
'alpha value for ALPHA_USER alpha mode',
|
||||||
command = self.setRendererUserAlpha)
|
command = self.setRendererUserAlpha)
|
||||||
|
|
||||||
self.rendererNotebook = Pmw.NoteBook(rendererPage, tabpos = None)
|
self.rendererNotebook = Pmw.NoteBook(rendererPage, tabpos = None)
|
||||||
# Line page #
|
# Line page #
|
||||||
linePage = self.rendererNotebook.add('LineParticleRenderer')
|
linePage = self.rendererNotebook.add('LineParticleRenderer')
|
||||||
@ -666,7 +684,7 @@ class ParticlePanel(AppShell):
|
|||||||
# This also has: setCoef, setLength, setRadius,
|
# This also has: setCoef, setLength, setRadius,
|
||||||
forceMenu.add_command(label = 'Add Linear Cylinder Vortex Force',
|
forceMenu.add_command(label = 'Add Linear Cylinder Vortex Force',
|
||||||
command = self.addLinearCylinderVortexForce)
|
command = self.addLinearCylinderVortexForce)
|
||||||
|
|
||||||
# DERIVED FROM LINEAR DISTANCE FORCE
|
# DERIVED FROM LINEAR DISTANCE FORCE
|
||||||
# Parameters: setFalloffType, setForceCenter, setRadius
|
# Parameters: setFalloffType, setForceCenter, setRadius
|
||||||
forceMenu.add_command(label = 'Add Linear Sink Force',
|
forceMenu.add_command(label = 'Add Linear Sink Force',
|
||||||
@ -688,14 +706,14 @@ class ParticlePanel(AppShell):
|
|||||||
# Notebook to hold force widgets as the are added
|
# Notebook to hold force widgets as the are added
|
||||||
self.forceGroupNotebook = Pmw.NoteBook(self.forceFrame, tabpos = None)
|
self.forceGroupNotebook = Pmw.NoteBook(self.forceFrame, tabpos = None)
|
||||||
self.forceGroupNotebook.pack(fill = X)
|
self.forceGroupNotebook.pack(fill = X)
|
||||||
|
|
||||||
self.factoryNotebook.setnaturalsize()
|
self.factoryNotebook.setnaturalsize()
|
||||||
self.emitterNotebook.setnaturalsize()
|
self.emitterNotebook.setnaturalsize()
|
||||||
self.rendererNotebook.setnaturalsize()
|
self.rendererNotebook.setnaturalsize()
|
||||||
self.forceGroupNotebook.setnaturalsize()
|
self.forceGroupNotebook.setnaturalsize()
|
||||||
self.mainNotebook.setnaturalsize()
|
self.mainNotebook.setnaturalsize()
|
||||||
|
|
||||||
# Make sure input variables processed
|
# Make sure input variables processed
|
||||||
self.initialiseoptions(ParticlePanel)
|
self.initialiseoptions(ParticlePanel)
|
||||||
|
|
||||||
### WIDGET UTILITY FUNCTIONS ###
|
### WIDGET UTILITY FUNCTIONS ###
|
||||||
@ -712,7 +730,7 @@ class ParticlePanel(AppShell):
|
|||||||
self.widgetDict[category + '-' + text] = widget
|
self.widgetDict[category + '-' + text] = widget
|
||||||
self.variableDict[category + '-' + text] = bool
|
self.variableDict[category + '-' + text] = bool
|
||||||
return widget
|
return widget
|
||||||
|
|
||||||
def createRadiobutton(self, parent, side, category, text,
|
def createRadiobutton(self, parent, side, category, text,
|
||||||
balloonHelp, variable, value,
|
balloonHelp, variable, value,
|
||||||
command):
|
command):
|
||||||
@ -724,7 +742,7 @@ class ParticlePanel(AppShell):
|
|||||||
self.bind(widget, balloonHelp)
|
self.bind(widget, balloonHelp)
|
||||||
self.widgetDict[category + '-' + text] = widget
|
self.widgetDict[category + '-' + text] = widget
|
||||||
return widget
|
return widget
|
||||||
|
|
||||||
def createFloaters(self, parent, widgetDefinitions):
|
def createFloaters(self, parent, widgetDefinitions):
|
||||||
widgets = []
|
widgets = []
|
||||||
for category, label, balloonHelp, command, min, resolution in widgetDefinitions:
|
for category, label, balloonHelp, command, min, resolution in widgetDefinitions:
|
||||||
@ -864,7 +882,7 @@ class ParticlePanel(AppShell):
|
|||||||
self.forceGroupLabel['text'] = self.forceGroup.getName()
|
self.forceGroupLabel['text'] = self.forceGroup.getName()
|
||||||
else:
|
else:
|
||||||
self.forceGroupLabel['text'] = 'Force Group'
|
self.forceGroupLabel['text'] = 'Force Group'
|
||||||
|
|
||||||
def updateMenus(self):
|
def updateMenus(self):
|
||||||
self.updateEffectsMenus()
|
self.updateEffectsMenus()
|
||||||
self.updateParticlesMenus()
|
self.updateParticlesMenus()
|
||||||
@ -878,7 +896,7 @@ class ParticlePanel(AppShell):
|
|||||||
# Add in a checkbutton for each effect (to toggle on/off)
|
# Add in a checkbutton for each effect (to toggle on/off)
|
||||||
keys = self.effectsDict.keys()
|
keys = self.effectsDict.keys()
|
||||||
keys.sort()
|
keys.sort()
|
||||||
for name in keys:
|
for name in keys:
|
||||||
effect = self.effectsDict[name]
|
effect = self.effectsDict[name]
|
||||||
self.effectsLabelMenu.add_command(
|
self.effectsLabelMenu.add_command(
|
||||||
label = effect.getName(),
|
label = effect.getName(),
|
||||||
@ -966,7 +984,7 @@ class ParticlePanel(AppShell):
|
|||||||
effect.enable()
|
effect.enable()
|
||||||
else:
|
else:
|
||||||
effect.disable()
|
effect.disable()
|
||||||
|
|
||||||
def selectParticlesNamed(self, name):
|
def selectParticlesNamed(self, name):
|
||||||
particles = self.particleEffect.getParticlesNamed(name)
|
particles = self.particleEffect.getParticlesNamed(name)
|
||||||
if particles != None:
|
if particles != None:
|
||||||
@ -997,13 +1015,13 @@ class ParticlePanel(AppShell):
|
|||||||
force.setActive(1)
|
force.setActive(1)
|
||||||
else:
|
else:
|
||||||
force.setActive(0)
|
force.setActive(0)
|
||||||
|
|
||||||
def getWidget(self, category, text):
|
def getWidget(self, category, text):
|
||||||
return self.widgetDict[category + '-' + text]
|
return self.widgetDict[category + '-' + text]
|
||||||
|
|
||||||
def getVariable(self, category, text):
|
def getVariable(self, category, text):
|
||||||
return self.variableDict[category + '-' + text]
|
return self.variableDict[category + '-' + text]
|
||||||
|
|
||||||
def loadParticleEffectFromFile(self):
|
def loadParticleEffectFromFile(self):
|
||||||
# Find path to particle directory
|
# Find path to particle directory
|
||||||
pPath = getParticlePath()
|
pPath = getParticlePath()
|
||||||
@ -1083,7 +1101,7 @@ class ParticlePanel(AppShell):
|
|||||||
self.particleEffect.enable()
|
self.particleEffect.enable()
|
||||||
else:
|
else:
|
||||||
self.particleEffect.disable()
|
self.particleEffect.disable()
|
||||||
|
|
||||||
## SYSTEM PAGE ##
|
## SYSTEM PAGE ##
|
||||||
def updateSystemWidgets(self):
|
def updateSystemWidgets(self):
|
||||||
poolSize = self.particles.getPoolSize()
|
poolSize = self.particles.getPoolSize()
|
||||||
@ -1133,7 +1151,7 @@ class ParticlePanel(AppShell):
|
|||||||
|
|
||||||
def selectFactoryPage(self):
|
def selectFactoryPage(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def updateFactoryWidgets(self):
|
def updateFactoryWidgets(self):
|
||||||
factory = self.particles.factory
|
factory = self.particles.factory
|
||||||
lifespan = factory.getLifespanBase()
|
lifespan = factory.getLifespanBase()
|
||||||
@ -1149,7 +1167,7 @@ class ParticlePanel(AppShell):
|
|||||||
terminalVelocitySpread = factory.getTerminalVelocitySpread()
|
terminalVelocitySpread = factory.getTerminalVelocitySpread()
|
||||||
self.getWidget('Factory', 'Terminal Vel. Spread').set(
|
self.getWidget('Factory', 'Terminal Vel. Spread').set(
|
||||||
terminalVelocitySpread, 0)
|
terminalVelocitySpread, 0)
|
||||||
|
|
||||||
def setFactoryLifeSpan(self, value):
|
def setFactoryLifeSpan(self, value):
|
||||||
self.particles.factory.setLifespanBase(value)
|
self.particles.factory.setLifespanBase(value)
|
||||||
def setFactoryLifeSpanSpread(self, value):
|
def setFactoryLifeSpanSpread(self, value):
|
||||||
@ -1172,6 +1190,10 @@ class ParticlePanel(AppShell):
|
|||||||
self.particles.factory.setFinalAngle(angle)
|
self.particles.factory.setFinalAngle(angle)
|
||||||
def setFactoryZSpinFinalAngleSpread(self, spread):
|
def setFactoryZSpinFinalAngleSpread(self, spread):
|
||||||
self.particles.factory.setFinalAngleSpread(spread)
|
self.particles.factory.setFinalAngleSpread(spread)
|
||||||
|
def setFactoryZSpinAngularVelocity(self, vel):
|
||||||
|
self.particles.factory.setAngularVelocity(vel)
|
||||||
|
def setFactoryZSpinAngularVelocitySpread(self, spread):
|
||||||
|
self.particles.factory.setAngularVelocitySpread(spread)
|
||||||
|
|
||||||
## EMITTER PAGE ##
|
## EMITTER PAGE ##
|
||||||
def selectEmitterType(self, type):
|
def selectEmitterType(self, type):
|
||||||
@ -1183,7 +1205,7 @@ class ParticlePanel(AppShell):
|
|||||||
type = self.particles.emitter.__class__.__name__
|
type = self.particles.emitter.__class__.__name__
|
||||||
self.emitterNotebook.selectpage(type)
|
self.emitterNotebook.selectpage(type)
|
||||||
self.getVariable('Emitter', 'Emitter Type').set(type)
|
self.getVariable('Emitter', 'Emitter Type').set(type)
|
||||||
|
|
||||||
def updateEmitterWidgets(self):
|
def updateEmitterWidgets(self):
|
||||||
emitter = self.particles.emitter
|
emitter = self.particles.emitter
|
||||||
self.setEmissionType(self.particles.emitter.getEmissionType())
|
self.setEmissionType(self.particles.emitter.getEmissionType())
|
||||||
@ -1371,7 +1393,7 @@ class ParticlePanel(AppShell):
|
|||||||
self.rendererNotebook.selectpage(type)
|
self.rendererNotebook.selectpage(type)
|
||||||
self.particles.setRenderer(type)
|
self.particles.setRenderer(type)
|
||||||
self.updateRendererWidgets()
|
self.updateRendererWidgets()
|
||||||
|
|
||||||
def updateRendererWidgets(self):
|
def updateRendererWidgets(self):
|
||||||
renderer = self.particles.renderer
|
renderer = self.particles.renderer
|
||||||
alphaMode = renderer.getAlphaMode()
|
alphaMode = renderer.getAlphaMode()
|
||||||
@ -1571,8 +1593,8 @@ class ParticlePanel(AppShell):
|
|||||||
self.rendererSpriteFileEntry['state'] = 'disabled'
|
self.rendererSpriteFileEntry['state'] = 'disabled'
|
||||||
self.rendererSpriteNodeEntry['state'] = 'disabled'
|
self.rendererSpriteNodeEntry['state'] = 'disabled'
|
||||||
self.rendererSpriteTextureEntry['background'] = 'SystemWindow'
|
self.rendererSpriteTextureEntry['background'] = 'SystemWindow'
|
||||||
self.rendererSpriteFileEntry['background'] = '#C0C0C0'
|
self.rendererSpriteFileEntry['background'] = '#C0C0C0'
|
||||||
self.rendererSpriteNodeEntry['background'] = '#C0C0C0'
|
self.rendererSpriteNodeEntry['background'] = '#C0C0C0'
|
||||||
else:
|
else:
|
||||||
self.rendererSpriteTextureEntry['state'] = 'disabled'
|
self.rendererSpriteTextureEntry['state'] = 'disabled'
|
||||||
self.rendererSpriteFileEntry['state'] = 'normal'
|
self.rendererSpriteFileEntry['state'] = 'normal'
|
||||||
@ -1599,6 +1621,11 @@ class ParticlePanel(AppShell):
|
|||||||
def toggleRendererSpriteAnimAngle(self):
|
def toggleRendererSpriteAnimAngle(self):
|
||||||
self.particles.renderer.setAnimAngleFlag(
|
self.particles.renderer.setAnimAngleFlag(
|
||||||
self.getVariable('Sprite Renderer', 'Anim Angle').get())
|
self.getVariable('Sprite Renderer', 'Anim Angle').get())
|
||||||
|
|
||||||
|
def toggleAngularVelocity(self):
|
||||||
|
self.particles.factory.enableAngularVelocity(
|
||||||
|
self.getVariable('Z Spin Factory', 'Enable Angular Velocity').get())
|
||||||
|
|
||||||
def setRendererSpriteInitialXScale(self, xScale):
|
def setRendererSpriteInitialXScale(self, xScale):
|
||||||
self.particles.renderer.setInitialXScale(xScale)
|
self.particles.renderer.setInitialXScale(xScale)
|
||||||
def setRendererSpriteFinalXScale(self, xScale):
|
def setRendererSpriteFinalXScale(self, xScale):
|
||||||
@ -1623,7 +1650,7 @@ class ParticlePanel(AppShell):
|
|||||||
def toggleRendererSpriteAlphaDisable(self):
|
def toggleRendererSpriteAlphaDisable(self):
|
||||||
self.particles.renderer.setAlphaDisable(
|
self.particles.renderer.setAlphaDisable(
|
||||||
self.getVariable('Sprite Renderer', 'Alpha Disable').get())
|
self.getVariable('Sprite Renderer', 'Alpha Disable').get())
|
||||||
|
|
||||||
## FORCEGROUP COMMANDS ##
|
## FORCEGROUP COMMANDS ##
|
||||||
def updateForceWidgets(self):
|
def updateForceWidgets(self):
|
||||||
# Select appropriate notebook page
|
# Select appropriate notebook page
|
||||||
|
@ -51,3 +51,25 @@ INLINE float ZSpinParticle::
|
|||||||
get_final_angle(void) const {
|
get_final_angle(void) const {
|
||||||
return _final_angle;
|
return _final_angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INLINE float ZSpinParticle::
|
||||||
|
get_angular_velocity(void) const {
|
||||||
|
return _angular_velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void ZSpinParticle::
|
||||||
|
set_angular_velocity(float v) {
|
||||||
|
_angular_velocity = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void ZSpinParticle::
|
||||||
|
enable_angular_velocity(bool bEnabled) {
|
||||||
|
_bUseAngularVelocity = bEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE bool ZSpinParticle::
|
||||||
|
get_angular_velocity_enabled(void) const {
|
||||||
|
return _bUseAngularVelocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,6 +29,8 @@ ZSpinParticle(void) :
|
|||||||
_initial_angle = 0.0f;
|
_initial_angle = 0.0f;
|
||||||
_final_angle = 0.0f;
|
_final_angle = 0.0f;
|
||||||
_cur_angle = 0.0f;
|
_cur_angle = 0.0f;
|
||||||
|
_angular_velocity = 0.0f;
|
||||||
|
_bUseAngularVelocity = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -42,6 +44,8 @@ ZSpinParticle(const ZSpinParticle ©) :
|
|||||||
_initial_angle = copy._initial_angle;
|
_initial_angle = copy._initial_angle;
|
||||||
_final_angle = copy._final_angle;
|
_final_angle = copy._final_angle;
|
||||||
_cur_angle = copy._cur_angle;
|
_cur_angle = copy._cur_angle;
|
||||||
|
_angular_velocity = copy._angular_velocity;
|
||||||
|
_bUseAngularVelocity = copy._bUseAngularVelocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -79,17 +83,23 @@ init(void) {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void ZSpinParticle::
|
void ZSpinParticle::
|
||||||
update(void) {
|
update(void) {
|
||||||
float t = get_parameterized_age();
|
// if using final_angle, want age to range from [0,1] over lifespan, so use parameterized_age
|
||||||
|
// for angular velocity, should be allowed to range freely upward, use regular age
|
||||||
|
|
||||||
// interpolate the current orientation
|
if(_bUseAngularVelocity) {
|
||||||
_cur_angle = _initial_angle + (t * (_final_angle - _initial_angle));
|
// interpolate the current orientation
|
||||||
|
_cur_angle = _initial_angle + (get_age() * _angular_velocity);
|
||||||
|
} else {
|
||||||
|
_cur_angle = _initial_angle + (get_parameterized_age() * (_final_angle - _initial_angle));
|
||||||
|
}
|
||||||
|
|
||||||
// normalize the result to [0..360)
|
// normalize the result to [0..360)
|
||||||
_cur_angle = fmod(_cur_angle, 360.0f);
|
_cur_angle = fmod(_cur_angle, 360.0f);
|
||||||
|
|
||||||
// if _cur_angle was negative, it is still negative after fmod,
|
// if _cur_angle was negative, it is still negative after fmod,
|
||||||
// but greater than -360.
|
|
||||||
// wrap it around by adding 360
|
// wrap it around by adding 360
|
||||||
|
|
||||||
|
// is this really necessary? should be in range of sin/cos
|
||||||
if(_cur_angle < 0.0f)
|
if(_cur_angle < 0.0f)
|
||||||
_cur_angle += 360.0f;
|
_cur_angle += 360.0f;
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,8 @@ private:
|
|||||||
float _initial_angle;
|
float _initial_angle;
|
||||||
float _final_angle;
|
float _final_angle;
|
||||||
float _cur_angle;
|
float _cur_angle;
|
||||||
|
float _angular_velocity;
|
||||||
|
bool _bUseAngularVelocity;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ZSpinParticle(void);
|
ZSpinParticle(void);
|
||||||
@ -53,6 +55,14 @@ public:
|
|||||||
|
|
||||||
INLINE void set_final_angle(float t);
|
INLINE void set_final_angle(float t);
|
||||||
INLINE float get_final_angle(void) const;
|
INLINE float get_final_angle(void) const;
|
||||||
|
|
||||||
|
// 'set_final_angle' and 'angular_velocity' are mutually exclusive apis
|
||||||
|
// if angular-velocity is specified, final_angle is ignored
|
||||||
|
INLINE void set_angular_velocity(float v);
|
||||||
|
INLINE float get_angular_velocity(void) const;
|
||||||
|
|
||||||
|
INLINE void enable_angular_velocity(bool bEnabled);
|
||||||
|
INLINE bool get_angular_velocity_enabled(void) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "zSpinParticle.I"
|
#include "zSpinParticle.I"
|
||||||
|
@ -88,3 +88,39 @@ INLINE float ZSpinParticleFactory::
|
|||||||
get_final_angle_spread(void) const {
|
get_final_angle_spread(void) const {
|
||||||
return _final_angle_spread;
|
return _final_angle_spread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function : get_angular_velocity
|
||||||
|
// Access : public
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float ZSpinParticleFactory::
|
||||||
|
get_angular_velocity(void) const {
|
||||||
|
return _angular_velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void ZSpinParticleFactory::
|
||||||
|
set_angular_velocity(float v) {
|
||||||
|
_angular_velocity = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE float ZSpinParticleFactory::
|
||||||
|
get_angular_velocity_spread(void) const {
|
||||||
|
return _angular_velocity_spread;
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void ZSpinParticleFactory::
|
||||||
|
set_angular_velocity_spread(float spread) {
|
||||||
|
_angular_velocity_spread = spread;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
INLINE void ZSpinParticleFactory::
|
||||||
|
enable_angular_velocity(bool bEnabled) {
|
||||||
|
_bUseAngularVelocity = bEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE bool ZSpinParticleFactory::
|
||||||
|
get_angular_velocity_enabled(void) const {
|
||||||
|
return _bUseAngularVelocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -31,6 +31,9 @@ ZSpinParticleFactory(void) :
|
|||||||
_final_angle = 0.0f;
|
_final_angle = 0.0f;
|
||||||
_initial_angle_spread = 0.0f;
|
_initial_angle_spread = 0.0f;
|
||||||
_final_angle_spread = 0.0f;
|
_final_angle_spread = 0.0f;
|
||||||
|
_angular_velocity = 0.0f;
|
||||||
|
_angular_velocity_spread = 0.0f;
|
||||||
|
_bUseAngularVelocity = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -45,6 +48,9 @@ ZSpinParticleFactory(const ZSpinParticleFactory ©) :
|
|||||||
_final_angle = copy._final_angle;
|
_final_angle = copy._final_angle;
|
||||||
_initial_angle_spread = copy._initial_angle_spread;
|
_initial_angle_spread = copy._initial_angle_spread;
|
||||||
_final_angle_spread = copy._final_angle_spread;
|
_final_angle_spread = copy._final_angle_spread;
|
||||||
|
_angular_velocity = copy._angular_velocity;
|
||||||
|
_angular_velocity_spread = copy._angular_velocity_spread;
|
||||||
|
_bUseAngularVelocity = copy._bUseAngularVelocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -77,4 +83,6 @@ populate_child_particle(BaseParticle *bp) const {
|
|||||||
|
|
||||||
zsp->set_initial_angle(_initial_angle + SPREAD(_initial_angle_spread));
|
zsp->set_initial_angle(_initial_angle + SPREAD(_initial_angle_spread));
|
||||||
zsp->set_final_angle(_final_angle + SPREAD(_final_angle_spread));
|
zsp->set_final_angle(_final_angle + SPREAD(_final_angle_spread));
|
||||||
|
zsp->set_angular_velocity(_angular_velocity + SPREAD(_angular_velocity_spread));
|
||||||
|
zsp->enable_angular_velocity(_bUseAngularVelocity);
|
||||||
}
|
}
|
||||||
|
@ -31,10 +31,11 @@ private:
|
|||||||
virtual void populate_child_particle(BaseParticle *bp) const;
|
virtual void populate_child_particle(BaseParticle *bp) const;
|
||||||
virtual BaseParticle *alloc_particle(void) const;
|
virtual BaseParticle *alloc_particle(void) const;
|
||||||
|
|
||||||
float _initial_angle;
|
float _initial_angle,_initial_angle_spread;
|
||||||
float _final_angle;
|
float _final_angle,_final_angle_spread;
|
||||||
float _initial_angle_spread;
|
float _angular_velocity,_angular_velocity_spread;
|
||||||
float _final_angle_spread;
|
bool _bUseAngularVelocity;
|
||||||
|
|
||||||
|
|
||||||
PUBLISHED:
|
PUBLISHED:
|
||||||
ZSpinParticleFactory(void);
|
ZSpinParticleFactory(void);
|
||||||
@ -50,6 +51,15 @@ PUBLISHED:
|
|||||||
INLINE float get_final_angle(void) const;
|
INLINE float get_final_angle(void) const;
|
||||||
INLINE float get_initial_angle_spread(void) const;
|
INLINE float get_initial_angle_spread(void) const;
|
||||||
INLINE float get_final_angle_spread(void) const;
|
INLINE float get_final_angle_spread(void) const;
|
||||||
|
|
||||||
|
INLINE void set_angular_velocity(float v);
|
||||||
|
INLINE float get_angular_velocity(void) const;
|
||||||
|
|
||||||
|
INLINE void set_angular_velocity_spread(float spread);
|
||||||
|
INLINE float get_angular_velocity_spread(void) const;
|
||||||
|
|
||||||
|
INLINE void enable_angular_velocity(bool bEnabled);
|
||||||
|
INLINE bool get_angular_velocity_enabled(void) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "zSpinParticleFactory.I"
|
#include "zSpinParticleFactory.I"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user