*** empty log message ***

This commit is contained in:
Josh Wilson 2005-06-15 19:01:07 +00:00
parent ff6f62b0cb
commit e3ac4a7782
3 changed files with 619 additions and 58 deletions

View File

@ -6,7 +6,7 @@ from pandac.PandaModules import ParticleSystem
from pandac.PandaModules import BaseParticleFactory
from pandac.PandaModules import PointParticleFactory
from pandac.PandaModules import ZSpinParticleFactory
#import OrientedParticleFactory
#from pandac.PandaModules import OrientedParticleFactory
from pandac.PandaModules import BaseParticleRenderer
from pandac.PandaModules import PointParticleRenderer
from pandac.PandaModules import LineParticleRenderer
@ -281,16 +281,16 @@ class Particles(ParticleSystem):
file.write('# Renderer parameters\n')
alphaMode = self.renderer.getAlphaMode()
aMode = "PRALPHANONE"
if (alphaMode == BaseParticleRenderer.BaseParticleRenderer.PRALPHANONE):
if (alphaMode == BaseParticleRenderer.PRALPHANONE):
aMode = "PRALPHANONE"
elif (alphaMode ==
BaseParticleRenderer.BaseParticleRenderer.PRALPHAOUT):
BaseParticleRenderer.PRALPHAOUT):
aMode = "PRALPHAOUT"
elif (alphaMode ==
BaseParticleRenderer.BaseParticleRenderer.PRALPHAIN):
BaseParticleRenderer.PRALPHAIN):
aMode = "PRALPHAIN"
elif (alphaMode ==
BaseParticleRenderer.BaseParticleRenderer.PRALPHAUSER):
BaseParticleRenderer.PRALPHAUSER):
aMode = "PRALPHAUSER"
file.write(targ + '.renderer.setAlphaMode(BaseParticleRenderer.' + aMode + ')\n')
file.write(targ + '.renderer.setUserAlpha(%.2f)\n' % \
@ -305,20 +305,20 @@ class Particles(ParticleSystem):
file.write((targ + '.renderer.setEndColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
blendType = self.renderer.getBlendType()
bType = "PPONECOLOR"
if (blendType == PointParticleRenderer.PointParticleRenderer.PPONECOLOR):
if (blendType == PointParticleRenderer.PPONECOLOR):
bType = "PPONECOLOR"
elif (blendType == PointParticleRenderer.PointParticleRenderer.PPBLENDLIFE):
elif (blendType == PointParticleRenderer.PPBLENDLIFE):
bType = "PPBLENDLIFE"
elif (blendType == PointParticleRenderer.PointParticleRenderer.PPBLENDVEL):
elif (blendType == PointParticleRenderer.PPBLENDVEL):
bType = "PPBLENDVEL"
file.write(targ + '.renderer.setBlendType(PointParticleRenderer.' + bType + ')\n')
blendMethod = self.renderer.getBlendMethod()
bMethod = "PPNOBLEND"
if (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPNOBLEND):
if (blendMethod == BaseParticleRenderer.PPNOBLEND):
bMethod = "PPNOBLEND"
elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDLINEAR):
elif (blendMethod == BaseParticleRenderer.PPBLENDLINEAR):
bMethod = "PPBLENDLINEAR"
elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDCUBIC):
elif (blendMethod == BaseParticleRenderer.PPBLENDCUBIC):
bMethod = "PPBLENDCUBIC"
file.write(targ + '.renderer.setBlendMethod(BaseParticleRenderer.' + bMethod + ')\n')
elif (self.rendererType == "LineParticleRenderer"):
@ -331,6 +331,54 @@ class Particles(ParticleSystem):
file.write('# Geom parameters\n')
node = self.renderer.getGeomNode()
file.write(targ + '.renderer.setGeomNode(' + node.getName() + ')\n')
cbmLut = ('MNone','MAdd','MSubtract','MInvSubtract','MMin','MMax')
cboLut = ('OZero','OOne','OIncomingColor','OOneMinusIncomingColor','OFbufferColor',
'OOneMinusFbufferColor','OIncomingAlpha','OOneMinusIncomingAlpha',
'OFbufferAlpha','OOneMinusFbufferAlpha','OConstantColor',
'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
'OIncomingColorSaturate')
cbAttrib = self.renderer.getRenderNode().getAttrib(ColorBlendAttrib.getClassType())
if(cbAttrib):
cbMode = cbAttrib.getMode()
if(cbMode > 0):
if(cbMode in (ColorBlendAttrib.MAdd,ColorBlendAttrib.MSubtract,ColorBlendAttrib.MInvSubtract)):
cboa = cbAttrib.getOperandA()
cbob = cbAttrib.getOperandB()
file.write(targ+'.renderer.setColorBlendMode(ColorBlendAttrib.%s,ColorBlendAttrib.%s,ColorBlendAttrib.%s)\n' %
(cbmLut[cbMode],cboLut[cboa],cboLut[cbob]))
else:
file.write(targ+'.renderer.setColorBlendMode(ColorBlendAttrib.%s)\n' % cbmLut[cbMode])
cim = self.renderer.getColorInterpolationManager()
segIdList = eval('['+cim.getSegmentIdList().replace(' ',', ')+']')
for sid in segIdList:
seg = cim.getSegment(sid)
t_b = seg.getTimeBegin()
t_e = seg.getTimeEnd()
fun = seg.getFunction()
type = fun.getType()
if type == 'ColorInterpolationFunctionConstant':
fun = cim.downcastFunctionToConstant(fun)
c_a = fun.getColorA()
file.write(targ+'.renderer.getColorInterpolationManager().addConstant('+`t_b`+','+`t_e`+','+`c_a`+')\n')
elif type == 'ColorInterpolationFunctionLinear':
fun = cim.downcastFunctionToLinear(fun)
c_a = fun.getColorA()
c_b = fun.getColorB()
file.write(targ+'.renderer.getColorInterpolationManager().addLinear('+`t_b`+','+`t_e`+','+`c_a`+','+`c_b`+')\n')
elif type == 'ColorInterpolationFunctionStepwave':
fun = cim.downcastFunctionToStepwave(fun)
c_a = fun.getColorA()
c_b = fun.getColorB()
w_a = fun.getWidthA()
w_b = fun.getWidthB()
file.write(targ+'.renderer.getColorInterpolationManager().addStepwave('+`t_b`+','+`t_e`+','+`c_a`+','+`c_b`+','+`w_a`+','+`w_b`+')\n')
elif type == 'ColorInterpolationFunctionSinusoid':
fun = cim.downcastFunctionToSinusoid(fun)
c_a = fun.getColorA()
c_b = fun.getColorB()
per = fun.getPeriod()
file.write(targ+'.renderer.getColorInterpolationManager().addSinusoid('+`t_b`+','+`t_e`+','+`c_a`+','+`c_b`+','+`per`+')\n')
elif (self.rendererType == "SparkleParticleRenderer"):
file.write('# Sparkle parameters\n')
sColor = self.renderer.getCenterColor()
@ -341,13 +389,13 @@ class Particles(ParticleSystem):
file.write(targ + '.renderer.setDeathRadius(%.4f)\n' % self.renderer.getDeathRadius())
lifeScale = self.renderer.getLifeScale()
lScale = "SPNOSCALE"
if (lifeScale == SparkleParticleRenderer.SparkleParticleRenderer.SPSCALE):
if (lifeScale == SparkleParticleRenderer.SPSCALE):
lScale = "SPSCALE"
file.write(targ + '.renderer.setLifeScale(SparkleParticleRenderer.' + lScale + ')\n')
elif (self.rendererType == "SpriteParticleRenderer"):
file.write('# Sprite parameters\n')
if (self.renderer.getSourceType() ==
SpriteParticleRendererExt.SpriteParticleRendererExt.STTexture):
# if (self.renderer.getSourceType() == 0):
if (self.renderer.getSourceType() == SpriteParticleRendererExt.SpriteParticleRendererExt.STTexture):
tex = self.renderer.getTexture()
file.write(targ + '.renderer.setTexture(loader.loadTexture(\'' + tex.getName() + '\'))\n')
else:
@ -366,23 +414,71 @@ class Particles(ParticleSystem):
file.write(targ + '.renderer.setNonanimatedTheta(%.4f)\n' % self.renderer.getNonanimatedTheta())
blendMethod = self.renderer.getAlphaBlendMethod()
bMethod = "PPNOBLEND"
if (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPNOBLEND):
if (blendMethod == BaseParticleRenderer.PPNOBLEND):
bMethod = "PPNOBLEND"
elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDLINEAR):
elif (blendMethod == BaseParticleRenderer.PPBLENDLINEAR):
bMethod = "PPBLENDLINEAR"
elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDCUBIC):
elif (blendMethod == BaseParticleRenderer.PPBLENDCUBIC):
bMethod = "PPBLENDCUBIC"
file.write(targ + '.renderer.setAlphaBlendMethod(BaseParticleRenderer.' + bMethod + ')\n')
file.write(targ + '.renderer.setAlphaDisable(%d)\n' % self.renderer.getAlphaDisable())
# Save the color blending to file
cbmLut = ('MNone','MAdd','MSubtract','MInvSubtract','MMin','MMax')
cboLut = ('OZero','OOne','OIncomingColor','OOneMinusIncomingColor','OFbufferColor',
'OOneMinusFbufferColor','OIncomingAlpha','OOneMinusIncomingAlpha',
'OFbufferAlpha','OOneMinusFbufferAlpha','OConstantColor',
'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
'OIncomingColorSaturate')
cbAttrib = self.renderer.getRenderNode().getAttrib(ColorBlendAttrib.getClassType())
if(cbAttrib):
cbMode = cbAttrib.getMode()
if(cbMode > 0):
if(cbMode in (ColorBlendAttrib.MAdd,ColorBlendAttrib.MSubtract,ColorBlendAttrib.MInvSubtract)):
cboa = cbAttrib.getOperandA()
cbob = cbAttrib.getOperandB()
file.write(targ+'.renderer.setColorBlendMode(ColorBlendAttrib.%s,ColorBlendAttrib.%s,ColorBlendAttrib.%s)\n' %
(cbmLut[cbMode],cboLut[cboa],cboLut[cbob]))
else:
file.write(targ+'.renderer.setColorBlendMode(ColorBlendAttrib.%s)\n' % cbmLut[cbMode])
cim = self.renderer.getColorInterpolationManager()
segIdList = eval('['+cim.getSegmentIdList().replace(' ',', ')+']')
for sid in segIdList:
seg = cim.getSegment(sid)
t_b = seg.getTimeBegin()
t_e = seg.getTimeEnd()
fun = seg.getFunction()
type = fun.getType()
if type == 'ColorInterpolationFunctionConstant':
fun = cim.downcastFunctionToConstant(fun)
c_a = fun.getColorA()
file.write(targ+'.renderer.getColorInterpolationManager().addConstant('+`t_b`+','+`t_e`+','+`c_a`+')\n')
elif type == 'ColorInterpolationFunctionLinear':
fun = cim.downcastFunctionToLinear(fun)
c_a = fun.getColorA()
c_b = fun.getColorB()
file.write(targ+'.renderer.getColorInterpolationManager().addLinear('+`t_b`+','+`t_e`+','+`c_a`+','+`c_b`+')\n')
elif type == 'ColorInterpolationFunctionStepwave':
fun = cim.downcastFunctionToStepwave(fun)
c_a = fun.getColorA()
c_b = fun.getColorB()
w_a = fun.getWidthA()
w_b = fun.getWidthB()
file.write(targ+'.renderer.getColorInterpolationManager().addStepwave('+`t_b`+','+`t_e`+','+`c_a`+','+`c_b`+','+`w_a`+','+`w_b`+')\n')
elif type == 'ColorInterpolationFunctionSinusoid':
fun = cim.downcastFunctionToSinusoid(fun)
c_a = fun.getColorA()
c_b = fun.getColorB()
per = fun.getPeriod()
file.write(targ+'.renderer.getColorInterpolationManager().addSinusoid('+`t_b`+','+`t_e`+','+`c_a`+','+`c_b`+','+`per`+')\n')
file.write('# Emitter parameters\n')
emissionType = self.emitter.getEmissionType()
eType = "ETEXPLICIT"
if (emissionType == BaseParticleEmitter.BaseParticleEmitter.ETEXPLICIT):
if (emissionType == BaseParticleEmitter.ETEXPLICIT):
eType = "ETEXPLICIT"
elif (emissionType == BaseParticleEmitter.BaseParticleEmitter.ETRADIATE):
elif (emissionType == BaseParticleEmitter.ETRADIATE):
eType = "ETRADIATE"
elif (emissionType == BaseParticleEmitter.BaseParticleEmitter.ETCUSTOM):
elif (emissionType == BaseParticleEmitter.ETCUSTOM):
eType = "ETCUSTOM"
file.write(targ + '.emitter.setEmissionType(BaseParticleEmitter.' + eType + ')\n')
file.write(targ + '.emitter.setAmplitude(%.4f)\n' % self.emitter.getAmplitude())

View File

@ -15,11 +15,13 @@ from direct.particles import ForceGroup
from direct.particles import Particles
from direct.particles import ParticleEffect
from pandac.PandaModules import ColorBlendAttrib
class ParticlePanel(AppShell):
# Override class variables
appname = 'Particle Panel'
frameWidth = 375
frameHeight = 575
frameHeight = 675
usecommandarea = 0
usestatusarea = 0
balloonState = 'both'
@ -511,6 +513,8 @@ class ParticlePanel(AppShell):
command = self.setRendererUserAlpha)
self.rendererNotebook = Pmw.NoteBook(rendererPage, tabpos = None)
self.rendererNotebook.pack(fill = BOTH, expand = 1)
# Line page #
linePage = self.rendererNotebook.add('LineParticleRenderer')
self.createColorEntry(linePage, 'Line Renderer', 'Head Color',
@ -526,13 +530,77 @@ class ParticlePanel(AppShell):
geomPage = self.rendererNotebook.add('GeomParticleRenderer')
f = Frame(geomPage)
f.pack(fill = X)
Label(f, width = 12, text = 'Geom Node').pack(side = LEFT)
Label(f, width = 12, text = 'Geom Node', pady = 3).pack(side = LEFT)
self.rendererGeomNode = StringVar()
self.rendererGeomNodeEntry = Entry(
f, width = 12,
textvariable = self.rendererGeomNode)
self.rendererGeomNodeEntry.bind('<Return>', self.setRendererGeomNode)
self.rendererGeomNodeEntry.pack(side = LEFT, expand = 1, fill = X)
f = Frame(geomPage)
f.pack(fill = BOTH, expand = 1)
rendererGeomNotebook = Pmw.NoteBook(f)
rendererGeomNotebook.pack(fill = BOTH, expand = 1)
rendererGeomBlendPage = rendererGeomNotebook.add('Blend')
rendererGeomInterpolationPage = rendererGeomNotebook.add('Interpolate')
p = Frame(rendererGeomBlendPage)
self.createOptionMenu(p, 'Geom Renderer',
'Color Blend',
'How to render semi-transparent colors',
('MNone','MAdd','MSubtract','MInvSubtract','MMin','MMax'),
self.setRendererGeomColorBlendMethod)
self.createOptionMenu(p, 'Geom Renderer',
'Incoming Op.',
'See ColorBlendAttrib.h for explanation',
('OOne','OIncomingColor','OOneMinusIncomingColor','OFbufferColor',
'OOneMinusFbufferColor','OIncomingAlpha','OOneMinusIncomingAlpha',
'OFbufferAlpha','OOneMinusFbufferAlpha','OConstantColor',
'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
'OIncomingColorSaturate','OZero'),
self.setRendererGeomColorBlendIncomingOperand)
self.createOptionMenu(p, 'Geom Renderer',
'Fbuffer Op.',
'See ColorBlendAttrib.h for explanation',
('OOne','OIncomingColor','OOneMinusIncomingColor','OFbufferColor',
'OOneMinusFbufferColor','OIncomingAlpha','OOneMinusIncomingAlpha',
'OFbufferAlpha','OOneMinusFbufferAlpha','OConstantColor',
'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
'OZero'),
self.setRendererGeomColorBlendFbufferOperand)
p.pack(fill = X)
p = Frame(rendererGeomInterpolationPage)
p.pack(fill = X)
addSegmentButton = Menubutton(p, text = 'Add Segment',
relief = RAISED,
borderwidth = 2,
font=('MSSansSerif', 14, 'bold'),
activebackground = '#909090')
segmentMenu = Menu(addSegmentButton)
addSegmentButton['menu'] = segmentMenu
segmentMenu.add_command(label = 'Add Constant segment',
command = self.addConstantInterpolationSegment)
segmentMenu.add_command(label = 'Add Linear segment',
command = self.addLinearInterpolationSegment)
segmentMenu.add_command(label = 'Add Stepwave segment',
command = self.addStepwaveInterpolationSegment)
segmentMenu.add_command(label = 'Add Sinusoid segment',
command = self.addSinusoidInterpolationSegment)
addSegmentButton.pack(expand = 0)
sf = Pmw.ScrolledFrame(p, horizflex = 'elastic')
sf.pack(fill = BOTH, expand = 1)
self.rendererGeomSegmentFrame = sf.interior()
self.rendererGeomSegmentFrame.pack(fill = BOTH, expand = 1)
self.rendererGeomSegmentWidgetList = []
rendererGeomNotebook.setnaturalsize()
# Point #
rendererPointPage = self.rendererNotebook.add('PointParticleRenderer')
self.createFloater(rendererPointPage, 'Point Renderer', 'Point Size',
@ -584,101 +652,168 @@ class ParticlePanel(AppShell):
# Sprite #
spritePage = self.rendererNotebook.add('SpriteParticleRenderer')
f = Frame(spritePage)
Label(f, width = 12, text = 'Texture Type:').pack(side = LEFT)
f.pack(fill = BOTH, expand = 1)
rendererSpriteNotebook = Pmw.NoteBook(f)
rendererSpriteNotebook.pack(fill = BOTH, expand = 1)
rendererSpriteTexturePage = rendererSpriteNotebook.add('Texture')
rendererSpriteScalePage = rendererSpriteNotebook.add('Scale')
rendererSpriteBlendPage = rendererSpriteNotebook.add('Blend')
rendererSpriteInterpolationPage = rendererSpriteNotebook.add('Interpolate')
p = Frame(rendererSpriteTexturePage)
p.pack(fill = X)
Label(p, width = 12, text = 'Texture Type:').pack(side = LEFT)
self.rendererSpriteSourceType = IntVar()
self.rendererSpriteSourceType.set(SpriteParticleRenderer.STTexture)
self.rendererSpriteSTTexture = self.createRadiobutton(
f, 'left',
p, 'left',
'Sprite Renderer', 'Texture Type',
'Sprite particle renderer created from texture file',
self.rendererSpriteSourceType, SpriteParticleRenderer.STTexture,
self.setSpriteSourceType)
self.rendererSpriteSTTexture = self.createRadiobutton(
f, 'left',
p, 'left',
'Sprite Renderer', 'NodePath Type',
'Sprite particle renderer created from node path',
self.rendererSpriteSourceType, SpriteParticleRenderer.STFromNode,
self.setSpriteSourceType)
f.pack(fill = X)
f = Frame(spritePage)
Label(f, width = 6, text = 'Texture:').pack(side = LEFT)
self.rendererSpriteSTTexture.pack(side = LEFT, expand = 1, fill = X)
p = Frame(rendererSpriteTexturePage)
Label(p, width = 6, text = 'Texture:').pack(side = LEFT)
p.pack(fill = X)
self.rendererSpriteTexture = StringVar()
self.rendererSpriteTexture.set(SpriteParticleRenderer.sourceTextureName)
# self.rendererSpriteTexture.set(SpriteParticleRenderer.sourcetexturename)
self.rendererSpriteTextureEntry = Entry(
f, width = 12,
p, width = 12,
textvariable = self.rendererSpriteTexture)
self.rendererSpriteTextureEntry.pack(side = LEFT, expand = 1, fill = X)
f.pack(fill = X)
f = Frame(spritePage)
Label(f, width = 6, text = 'File:').pack(side = LEFT)
p = Frame(rendererSpriteTexturePage)
p.pack(fill = X)
Label(p, width = 6, text = 'file:').pack(side = LEFT)
self.rendererSpriteFile = StringVar()
self.rendererSpriteFile.set(SpriteParticleRenderer.sourceFileName)
# self.rendererspritefile.set(spriteparticlerenderer.sourcefilename)
self.rendererSpriteFileEntry = Entry(
f, width = 12,
p, width = 12,
textvariable = self.rendererSpriteFile)
self.rendererSpriteFileEntry.pack(side = LEFT, expand = 1, fill = X)
Label(f, width = 6, text = 'Node:').pack(side = LEFT)
Label(p, width = 6, text = 'Node:').pack(side = LEFT)
self.rendererSpriteNode = StringVar()
self.rendererSpriteNode.set(SpriteParticleRenderer.sourceNodeName)
# self.rendererSpriteNode.set(SpriteParticleRenderer.sourceNodeName)
self.rendererSpriteNodeEntry = Entry(
f, width = 6,
p, width = 6,
textvariable = self.rendererSpriteNode)
self.rendererSpriteNodeEntry.pack(side = LEFT, expand = 1, fill = X)
f.pack(fill = X)
# Init entries
self.setSpriteSourceType()
self.setTextureButton = Button(spritePage, text = 'Set Texture',
self.setTextureButton = Button(rendererSpriteTexturePage, text = 'Set Texture',
command = self.setRendererSpriteTexture)
self.setTextureButton.pack(fill = X)
f = Frame(spritePage)
self.setTextureButton.pack(fill = X, pady = 3)
p = Frame(rendererSpriteScalePage)
p.pack(fill = X)
self.createCheckbutton(
f, 'Sprite Renderer', 'X Scale',
p, 'Sprite Renderer', 'X Scale',
("On: x scale is interpolated over particle's life; " +
"Off: stays as start_X_Scale"),
self.toggleRendererSpriteXScale, 0, side = LEFT)
self.createCheckbutton(
f, 'Sprite Renderer', 'Y Scale',
p, 'Sprite Renderer', 'Y Scale',
("On: y scale is interpolated over particle's life; " +
"Off: stays as start_Y_Scale"),
self.toggleRendererSpriteYScale, 0, side = LEFT)
self.createCheckbutton(
f, 'Sprite Renderer', 'Anim Angle',
p, 'Sprite Renderer', 'Anim Angle',
("On: particles that are set to spin on the Z axis will " +
"spin appropriately"),
self.toggleRendererSpriteAnimAngle, 0, side = LEFT)
f.pack(fill = X)
self.createFloater(spritePage, 'Sprite Renderer',
p = Frame(rendererSpriteScalePage)
p.pack(fill = X)
self.createFloater(p, 'Sprite Renderer',
'Initial X Scale',
'Initial X scaling factor',
command = self.setRendererSpriteInitialXScale)
self.createFloater(spritePage, 'Sprite Renderer',
self.createFloater(p, 'Sprite Renderer',
'Final X Scale',
'Final X scaling factor, if xScale enabled',
command = self.setRendererSpriteFinalXScale)
self.createFloater(spritePage, 'Sprite Renderer',
self.createFloater(p, 'Sprite Renderer',
'Initial Y Scale',
'Initial Y scaling factor',
command = self.setRendererSpriteInitialYScale)
self.createFloater(spritePage, 'Sprite Renderer',
self.createFloater(p, 'Sprite Renderer',
'Final Y Scale',
'Final Y scaling factor, if yScale enabled',
command = self.setRendererSpriteFinalYScale)
self.createAngleDial(spritePage, 'Sprite Renderer',
self.createAngleDial(p, 'Sprite Renderer',
'Non Animated Theta',
('If animAngle is false: counter clockwise ' +
'Z rotation of all sprites'),
command = self.setRendererSpriteNonAnimatedTheta)
self.createOptionMenu(spritePage, 'Sprite Renderer',
p = Frame(rendererSpriteBlendPage)
p.pack(fill = X)
self.createOptionMenu(p, 'Sprite Renderer',
'Blend Type',
'Interpolation blend type for X and Y scaling',
('PP_NO_BLEND', 'PP_LINEAR', 'PP_CUBIC'),
self.setRendererSpriteBlendMethod)
self.createCheckbutton(
spritePage, 'Sprite Renderer', 'Alpha Disable',
p, 'Sprite Renderer', 'Alpha Disable',
'On: alpha blending is disabled',
self.toggleRendererSpriteAlphaDisable, 0)
self.rendererNotebook.pack(fill = X)
self.createOptionMenu(p, 'Sprite Renderer',
'Color Blend',
'How to render semi-transparent colors',
('MNone','MAdd','MSubtract','MInvSubtract','MMin','MMax'),
self.setRendererSpriteColorBlendMethod)
self.createOptionMenu(p, 'Sprite Renderer',
'Incoming Op.',
'See ColorBlendAttrib.h for explanation',
('OOne','OIncomingColor','OOneMinusIncomingColor','OFbufferColor',
'OOneMinusFbufferColor','OIncomingAlpha','OOneMinusIncomingAlpha',
'OFbufferAlpha','OOneMinusFbufferAlpha','OConstantColor',
'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
'OIncomingColorSaturate','OZero'),
self.setRendererSpriteColorBlendIncomingOperand)
self.createOptionMenu(p, 'Sprite Renderer',
'Fbuffer Op.',
'See ColorBlendAttrib.h for explanation',
('OOne','OIncomingColor','OOneMinusIncomingColor','OFbufferColor',
'OOneMinusFbufferColor','OIncomingAlpha','OOneMinusIncomingAlpha',
'OFbufferAlpha','OOneMinusFbufferAlpha','OConstantColor',
'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
'OZero'),
self.setRendererSpriteColorBlendFbufferOperand)
p = Frame(rendererSpriteInterpolationPage)
p.pack(fill = BOTH, expand = 1)
addSegmentButton = Menubutton(p, text = 'Add Segment',
relief = RAISED,
borderwidth = 2,
font=('MSSansSerif', 14, 'bold'),
activebackground = '#909090')
segmentMenu = Menu(addSegmentButton)
addSegmentButton['menu'] = segmentMenu
segmentMenu.add_command(label = 'Add Constant segment',
command = self.addConstantInterpolationSegment)
segmentMenu.add_command(label = 'Add Linear segment',
command = self.addLinearInterpolationSegment)
segmentMenu.add_command(label = 'Add Stepwave segment',
command = self.addStepwaveInterpolationSegment)
segmentMenu.add_command(label = 'Add Sinusoid segment',
command = self.addSinusoidInterpolationSegment)
addSegmentButton.pack(expand = 0)
pp = Frame(p)
pp.pack(fill = BOTH, expand = 1, pady = 3)
sf = Pmw.ScrolledFrame(pp, horizflex = 'elastic')
sf.pack(fill = BOTH, expand = 1)
self.rendererSpriteSegmentFrame = sf.interior()
self.rendererSpriteSegmentFrame.pack(fill = BOTH, expand = 1)
self.rendererSpriteSegmentWidgetList = []
rendererSpriteNotebook.setnaturalsize()
##########################################################
## FORCE PAGE WIDGETS ##
self.addForceButton = Menubutton(forcePage, text = 'Add Force',
relief = RAISED,
@ -725,6 +860,7 @@ class ParticlePanel(AppShell):
self.forceGroupNotebook = Pmw.NoteBook(self.forceFrame, tabpos = None)
self.forceGroupNotebook.pack(fill = X)
########################################################################
self.factoryNotebook.setnaturalsize()
self.emitterNotebook.setnaturalsize()
self.rendererNotebook.setnaturalsize()
@ -1323,6 +1459,7 @@ class ParticlePanel(AppShell):
'Emitter', 'Radiate Origin')['state'] = 'normal'
self.getWidget(
'Emitter', 'Explicit Velocity')['state'] = 'disabled'
# Hide custom widgets
if isinstance(self.particles.emitter, DiscEmitter):
self.discCustomFrame.pack_forget()
@ -1422,6 +1559,21 @@ class ParticlePanel(AppShell):
self.particles.setRenderer(type)
self.updateRendererWidgets()
# if(type is 'SpriteParticleRenderer'):
# if(self.getVariable('Sprite Renderer','Color Blend').get() in ['MAdd','MSubtract','MInvSubtract']):
# self.getWidget('Sprite Renderer','Incoming Op.').pack(fill = X)
# self.getWidget('Sprite Renderer','Fbuffer Op.').pack(fill = X)
# else:
# self.getWidget('Sprite Renderer','Incoming Op.').pack_forget()
# self.getWidget('Sprite Renderer','Fbuffer Op.').pack_forget()
# elif(type is 'GeomParticleRenderer'):
# if(self.getVariable('Geom Renderer','Color Blend').get() in ['MAdd','MSubtract','MInvSubtract']):
# self.getWidget('Geom Renderer','Incoming Op.').pack(fill = X)
# self.getWidget('Geom Renderer','Fbuffer Op.').pack(fill = X)
# else:
# self.getWidget('Geom Renderer','Incoming Op.').pack_forget()
# self.getWidget('Geom Renderer','Fbuffer Op.').pack_forget()
def updateRendererWidgets(self):
renderer = self.particles.renderer
alphaMode = renderer.getAlphaMode()
@ -1448,7 +1600,16 @@ class ParticlePanel(AppShell):
self.getWidget('Line Renderer', 'Line Scale Factor').set(
renderer.getLineScaleFactor())
elif isinstance(renderer, GeomParticleRenderer):
pass
if(self.getVariable('Geom Renderer','Color Blend').get() in ['MAdd','MSubtract','MInvSubtract']):
self.getWidget('Geom Renderer','Incoming Op.').pack(fill = X)
self.getWidget('Geom Renderer','Fbuffer Op.').pack(fill = X)
else:
self.getWidget('Geom Renderer','Incoming Op.').pack_forget()
self.getWidget('Geom Renderer','Fbuffer Op.').pack_forget()
for x in self.rendererGeomSegmentWidgetList:
x.pack_forget()
x.destroy()
self.rendererGeomSegmentWidgetList = []
elif isinstance(renderer, PointParticleRenderer):
pointSize = renderer.getPointSize()
self.getWidget('Point Renderer', 'Point Size').set(pointSize)
@ -1538,9 +1699,21 @@ class ParticlePanel(AppShell):
bMethod = "PP_BLEND_CUBIC"
self.getVariable('Sprite Renderer', 'Alpha Disable').set(
renderer.getAlphaDisable())
if(self.getVariable('Sprite Renderer','Color Blend').get() in ['MAdd','MSubtract','MInvSubtract']):
self.getWidget('Sprite Renderer','Incoming Op.').pack(fill = X)
self.getWidget('Sprite Renderer','Fbuffer Op.').pack(fill = X)
else:
self.getWidget('Sprite Renderer','Incoming Op.').pack_forget()
self.getWidget('Sprite Renderer','Fbuffer Op.').pack_forget()
for x in self.rendererSpriteSegmentWidgetList:
x.pack_forget()
x.destroy()
self.rendererSpriteSegmentWidgetList = []
def selectRendererPage(self):
type = self.particles.renderer.__class__.__name__
if(type == 'SpriteParticleRendererExt'):
type = 'SpriteParticleRenderer'
self.rendererNotebook.selectpage(type)
self.getVariable('Renderer', 'Renderer Type').set(type)
@ -1682,11 +1855,301 @@ class ParticlePanel(AppShell):
bMethod = BaseParticleRenderer.PPBLENDCUBIC
else:
bMethod = BaseParticleRenderer.PPNOBLEND
self.particles.renderer.setAlphaBlendMethod(bMethod)
def toggleRendererSpriteAlphaDisable(self):
self.particles.renderer.setAlphaDisable(
self.getVariable('Sprite Renderer', 'Alpha Disable').get())
def setRendererColorBlendAttrib(self,rendererName,blendMethodStr,incomingOperandStr,fbufferOperandStr):
self.particles.getRenderer().setColorBlendMode(eval('ColorBlendAttrib.'+blendMethodStr),
eval('ColorBlendAttrib.'+incomingOperandStr),
eval('ColorBlendAttrib.'+fbufferOperandStr))
if(blendMethodStr in ['MAdd','MSubtract','MInvSubtract']):
self.getWidget(rendererName,'Incoming Op.').pack(fill = X)
self.getWidget(rendererName,'Fbuffer Op.').pack(fill = X)
else:
self.getWidget(rendererName,'Incoming Op.').pack_forget()
self.getWidget(rendererName,'Fbuffer Op.').pack_forget()
self.updateRendererWidgets()
def setRendererSpriteColorBlendMethod(self, blendMethod):
print blendMethod
blendMethodStr = blendMethod
incomingOperandStr = self.getVariable('Sprite Renderer','Incoming Op.').get()
fbufferOperandStr = self.getVariable('Sprite Renderer','Fbuffer Op.').get()
self.setRendererColorBlendAttrib('Sprite Renderer',blendMethodStr,incomingOperandStr,fbufferOperandStr)
def setRendererSpriteColorBlendIncomingOperand(self, operand):
print 'incoming operand->'+operand
blendMethodStr = self.getVariable('Sprite Renderer','Color Blend').get()
incomingOperandStr = operand
fbufferOperandStr = self.getVariable('Sprite Renderer','Fbuffer Op.').get()
self.setRendererColorBlendAttrib('Sprite Renderer',blendMethodStr,incomingOperandStr,fbufferOperandStr)
def setRendererSpriteColorBlendFbufferOperand(self, operand):
print 'fbuffer operand->'+operand
blendMethodStr = self.getVariable('Sprite Renderer','Color Blend').get()
incomingOperandStr = self.getVariable('Sprite Renderer','Incoming Op.').get()
fbufferOperandStr = operand
self.setRendererColorBlendAttrib('Sprite Renderer',blendMethodStr,incomingOperandStr,fbufferOperandStr)
def setRendererGeomColorBlendMethod(self, blendMethod):
print blendMethod
blendMethodStr = blendMethod
incomingOperandStr = self.getVariable('Geom Renderer','Incoming Op.').get()
fbufferOperandStr = self.getVariable('Geom Renderer','Fbuffer Op.').get()
self.setRendererColorBlendAttrib('Geom Renderer',blendMethodStr,incomingOperandStr,fbufferOperandStr)
def setRendererGeomColorBlendIncomingOperand(self, operand):
print 'incoming operand->'+operand
blendMethodStr = self.getVariable('Geom Renderer','Color Blend').get()
incomingOperandStr = operand
fbufferOperandStr = self.getVariable('Geom Renderer','Fbuffer Op.').get()
self.setRendererColorBlendAttrib('Geom Renderer',blendMethodStr,incomingOperandStr,fbufferOperandStr)
def setRendererGeomColorBlendFbufferOperand(self, operand):
print 'fbuffer operand->'+operand
blendMethodStr = self.getVariable('Geom Renderer','Color Blend').get()
incomingOperandStr = self.getVariable('Geom Renderer','Incoming Op.').get()
fbufferOperandStr = operand
self.setRendererColorBlendAttrib('Geom Renderer',blendMethodStr,incomingOperandStr,fbufferOperandStr)
def addConstantInterpolationSegment(self):
print 'adding constant'
ren = self.particles.getRenderer()
cim = ren.getColorInterpolationManager()
seg = cim.getSegment(cim.addConstant())
if(ren.__class__.__name__ == 'SpriteParticleRendererExt'):
parent = self.rendererSpriteSegmentFrame
segName = `len(self.rendererSpriteSegmentWidgetList)`+':Constant'
self.rendererSpriteSegmentWidgetList.append(
self.createConstantInterpolationSegmentWidget(parent,segName,cim,seg))
elif(ren.__class__.__name__ == 'GeomParticleRenderer'):
parent = self.rendererGeomSegmentFrame
segName = `len(self.rendererGeomSegmentWidgetList)`+':Constant'
self.rendererGeomSegmentWidgetList.append(
self.createConstantInterpolationSegmentWidget(parent,segName,cim,seg))
parent.pack(fill=BOTH, expand=1)
def addLinearInterpolationSegment(self):
print 'adding linear'
ren = self.particles.getRenderer()
cim = ren.getColorInterpolationManager()
seg = cim.getSegment(cim.addLinear())
if(ren.__class__.__name__ == 'SpriteParticleRendererExt'):
parent = self.rendererSpriteSegmentFrame
segName = `len(self.rendererSpriteSegmentWidgetList)`+':Linear'
self.rendererSpriteSegmentWidgetList.append(
self.createLinearInterpolationSegmentWidget(parent,segName,cim,seg))
elif(ren.__class__.__name__ == 'GeomParticleRenderer'):
parent = self.rendererGeomSegmentFrame
segName = `len(self.rendererGeomSegmentWidgetList)`+':Linear'
self.rendererGeomSegmentWidgetList.append(
self.createLinearInterpolationSegmentWidget(parent,segName,cim,seg))
parent.pack(fill=BOTH, expand=1)
def addStepwaveInterpolationSegment(self):
print 'adding stepwave'
ren = self.particles.getRenderer()
cim = ren.getColorInterpolationManager()
seg = cim.getSegment(cim.addStepwave())
if(ren.__class__.__name__ == 'SpriteParticleRendererExt'):
parent = self.rendererSpriteSegmentFrame
segName = `len(self.rendererSpriteSegmentWidgetList)`+':Stepwave'
self.rendererSpriteSegmentWidgetList.append(
self.createStepwaveInterpolationSegmentWidget(parent,segName,cim,seg))
elif(ren.__class__.__name__ == 'GeomParticleRenderer'):
parent = self.rendererGeomSegmentFrame
segName = `len(self.rendererGeomSegmentWidgetList)`+':Stepwave'
self.rendererGeomSegmentWidgetList.append(
self.createStepwaveInterpolationSegmentWidget(parent,segName,cim,seg))
parent.pack(fill=BOTH, expand=1)
def addSinusoidInterpolationSegment(self):
print 'adding sinusoid'
ren = self.particles.getRenderer()
cim = ren.getColorInterpolationManager()
seg = cim.getSegment(cim.addSinusoid())
if(ren.__class__.__name__ == 'SpriteParticleRendererExt'):
parent = self.rendererSpriteSegmentFrame
segName = `len(self.rendererSpriteSegmentWidgetList)`+':Sinusoid'
self.rendererSpriteSegmentWidgetList.append(
self.createSinusoidInterpolationSegmentWidget(parent,segName,cim,seg))
elif(ren.__class__.__name__ == 'GeomParticleRenderer'):
parent = self.rendererGeomSegmentFrame
segName = `len(self.rendererGeomSegmentWidgetList)`+':Sinusoid'
self.rendererGeomSegmentWidgetList.append(
self.createSinusoidInterpolationSegmentWidget(parent,segName,cim,seg))
parent.pack(fill=BOTH, expand=1)
def createInterpolationSegmentFrame(self, parent, segName, seg):
frame = Frame(parent, relief = RAISED, borderwidth = 2)
lFrame = Frame(frame, relief = FLAT)
def removeInterpolationSegmentFrame(s = self, seg = seg, fr = frame):
s.particles.getRenderer().getColorInterpolationManager().clearSegment(seg.getId())
fr.pack_forget()
def setSegBegin(time):
seg.setTimeBegin(time)
def setSegEnd(time):
seg.setTimeEnd(time)
Button(lFrame, text = 'X',
command = removeInterpolationSegmentFrame).pack(side = RIGHT, expand = 0)
Label(lFrame, text = segName,
foreground = 'Blue',
font = ('MSSansSerif', 12, 'bold'),
).pack(fill = X, expand = 1)
lFrame.pack(fill = X, expand = 1)
f = Frame(frame)
self.createSlider(f,
'Sprite Renderer',segName + ' Begin',
'',
command = setSegBegin,
value = seg.getTimeBegin())
self.createSlider(f,'Sprite Renderer',segName + ' End',
'',
command = setSegEnd,
value = seg.getTimeEnd())
f.pack(fill = X, expand = 0)
frame.pack(pady = 3, fill = X, expand = 0)
return frame
def createConstantInterpolationSegmentWidget(self, parent, segName, cim, segment):
fun = cim.downcastFunctionToConstant(segment.getFunction())
def setSegColorA(color):
fun.setColorA(
Vec4(color[0]/255.0,color[1]/255.0,
color[2]/255.0,color[3]/255.0))
frame = self.createInterpolationSegmentFrame(parent, segName, segment)
f = Frame(frame)
c = fun.getColorA()
c = [c[0]*255.0,c[1]*255.0,c[2]*255.0,c[3]*255.0]
self.createColorEntry(f,'Sprite Renderer',segName + ' Color A',
'',
command = setSegColorA,
value = c)
f.pack(fill = X)
return frame
def createLinearInterpolationSegmentWidget(self, parent, segName, cim, segment):
fun = cim.downcastFunctionToLinear(segment.getFunction())
def setSegColorA(color):
fun.setColorA(
Vec4(color[0]/255.0,color[1]/255.0,
color[2]/255.0,color[3]/255.0))
def setSegColorB(color):
fun.setColorB(
Vec4(color[0]/255.0,color[1]/255.0,
color[2]/255.0,color[3]/255.0))
frame = self.createInterpolationSegmentFrame(parent, segName, segment)
f = Frame(frame)
c = fun.getColorA()
c = [c[0]*255.0,c[1]*255.0,c[2]*255.0,c[3]*255.0]
self.createColorEntry(f,'Sprite Renderer',segName + ' Color A',
'',
command = setSegColorA,
value = c)
c = fun.getColorB()
c = [c[0]*255.0,c[1]*255.0,c[2]*255.0,c[3]*255.0]
self.createColorEntry(f,'Sprite Renderer',segName + ' Color B',
'',
command = setSegColorB,
value = c)
f.pack(fill = X)
return frame
def createStepwaveInterpolationSegmentWidget(self, parent, segName, cim, segment):
fun = cim.downcastFunctionToStepwave(segment.getFunction())
def setColorA(color):
fun.setColorA(
Vec4(color[0]/255.0,color[1]/255.0,
color[2]/255.0,color[3]/255.0))
def setColorB(color):
fun.setColorB(
Vec4(color[0]/255.0,color[1]/255.0,
color[2]/255.0,color[3]/255.0))
def setWidthA(width):
fun.setWidthA(width)
def setWidthB(width):
fun.setWidthB(width)
frame = self.createInterpolationSegmentFrame(parent, segName, segment)
f = Frame(frame)
c = fun.getColorA()
c = [c[0]*255.0,c[1]*255.0,c[2]*255.0,c[3]*255.0]
self.createColorEntry(f,'Sprite Renderer',segName + ' Color A',
'',
command = setColorA,
value = c)
c = fun.getColorB()
c = [c[0]*255.0,c[1]*255.0,c[2]*255.0,c[3]*255.0]
self.createColorEntry(f,'Sprite Renderer',segName + ' Color B',
'',
command = setColorB,
value = c)
w = fun.getWidthA()
self.createSlider(f,'Sprite Renderer', segName + ' Width A',
'',
command = setWidthA,
value = w)
w = fun.getWidthB()
self.createSlider(f,'Sprite Renderer', segName + ' Width B',
'',
command = setWidthB,
value = w)
f.pack(fill = X)
return frame
def createSinusoidInterpolationSegmentWidget(self, parent, segName, cim, segment):
fun = cim.downcastFunctionToSinusoid(segment.getFunction())
def setColorA(color):
fun.setColorA(
Vec4(color[0]/255.0,color[1]/255.0,
color[2]/255.0,color[3]/255.0))
def setColorB(color):
fun.setColorB(
Vec4(color[0]/255.0,color[1]/255.0,
color[2]/255.0,color[3]/255.0))
def setPeriod(period):
fun.setPeriod(period)
frame = self.createInterpolationSegmentFrame(parent, segName, segment)
f = Frame(frame)
c = fun.getColorA()
c = [c[0]*255.0,c[1]*255.0,c[2]*255.0,c[3]*255.0]
self.createColorEntry(f,'Sprite Renderer',segName + ' Color A',
'',
command = setColorA,
value = c)
c = fun.getColorB()
c = [c[0]*255.0,c[1]*255.0,c[2]*255.0,c[3]*255.0]
self.createColorEntry(f,'Sprite Renderer',segName + ' Color B',
'',
command = setColorB,
value = c)
p = fun.getPeriod()
self.createFloater(f,'Sprite Renderer', segName + ' Period',
'',
command = setPeriod,
value = p)
f.pack(fill = X)
return frame
# def updateRendererSpriteSegments(self):
# ren = self.particles.getRenderer()
# cim = ren.getColorInterpolationManager()
# seg = cim.getSegment(cim.addConstant())
## FORCEGROUP COMMANDS ##
def updateForceWidgets(self):
# Select appropriate notebook page

View File

@ -321,10 +321,12 @@ class SliderWidget(Pmw.MegaWidget):
# Arrow button
# Find screen space position of bottom/center of arrow button
x = (self._arrowBtn.winfo_rootx() + self._arrowBtn.winfo_width()/2.0 -
string.atoi(self.interior()['bd']))
self.interior()['bd'])
# string.atoi(self.interior()['bd']))
y = self._arrowBtn.winfo_rooty() + self._arrowBtn.winfo_height()
# Popup border width
bd = string.atoi(self._popup['bd'])
bd = self._popup['bd']
# bd = string.atoi(self._popup['bd'])
# Get width of label
minW = self._minLabel.winfo_width()
# Width of canvas to adjust for