From 44cdf7429aed6fab73161112fec3c330e1efeb63 Mon Sep 17 00:00:00 2001 From: Mark Mine Date: Tue, 19 Jun 2001 02:39:59 +0000 Subject: [PATCH] *** empty log message *** --- .../SpriteParticleRenderer-extensions.py | 50 ++++++++++ direct/src/particles/Particles.py | 29 ++++-- direct/src/tkpanels/ParticlePanel.py | 94 +++++++++++++++---- 3 files changed, 144 insertions(+), 29 deletions(-) create mode 100644 direct/src/extensions/SpriteParticleRenderer-extensions.py diff --git a/direct/src/extensions/SpriteParticleRenderer-extensions.py b/direct/src/extensions/SpriteParticleRenderer-extensions.py new file mode 100644 index 0000000000..220da21651 --- /dev/null +++ b/direct/src/extensions/SpriteParticleRenderer-extensions.py @@ -0,0 +1,50 @@ + + """ + SpriteParticleRenderer-extensions module: contains methods to extend functionality + of the SpriteParticleRenderer class + """ + + # Initialize class variable for source file and node for node path textures + # Will use instance copy of this in functions below + sourceFileName = 'models/directmodels/smiley' + sourceNodeName = 'Happy' + + def getSourceFileName(self): + # Return instance copy of class variable + return self.sourceFileName + + def setSourceFileName(self, name): + # Set instance copy of class variable + self.sourceFileName = name + + def getSourceNodeName(self): + # Return instance copy of class variable + return self.sourceNodeName + + def setSourceNodeName(self, name): + # Set instance copy of class variable + self.sourceNodeName = name + + def setTextureFromNode(self, modelName = None, nodeName = None): + if modelName == None: + modelName = self.getSourceFileName() + else: + self.setSourceFileName(modelName) + if nodeName == None: + nodeName = self.getSourceNodeName() + else: + self.setSourceNodeName(nodeName) + # Load model and get texture + m = loader.loadModelOnce(modelName) + if (m == None): + print "SpriteParticleRenderer: Couldn't find model: %s!" % modelName + return None + nodeName = self.renderer.getSourceNodeName() + np = m.find(nodeName) + if np.isEmpty(): + print "SpriteParticleRenderer: Couldn't find node: %s!" % nodeName + return None + self.renderer.setNodePath(np) + m.removeNode() + + diff --git a/direct/src/particles/Particles.py b/direct/src/particles/Particles.py index e3161121b2..c59ade643a 100644 --- a/direct/src/particles/Particles.py +++ b/direct/src/particles/Particles.py @@ -27,9 +27,6 @@ import string import os import DirectNotifyGlobal -SparkleParticleRenderer.SparkleParticleRenderer.SPNOSCALE = 0 -SparkleParticleRenderer.SparkleParticleRenderer.SPSCALE = 1 - class Particles(ParticleSystem.ParticleSystem): notify = DirectNotifyGlobal.directNotify.newCategory('Particles') @@ -143,11 +140,17 @@ class Particles(ParticleSystem.ParticleSystem): self.renderer = SparkleParticleRenderer.SparkleParticleRenderer() elif (type == "SpriteParticleRenderer"): self.renderer = SpriteParticleRenderer.SpriteParticleRenderer() - t = loader.loadTexture('phase_3/maps/eyes.jpg') - if (t == None): - print "Couldn't find default texture: evil_eye.rgb!" - return None - self.renderer.setTexture(t) + if (self.renderer.getSourceType() == + SpriteParticleRenderer.SpriteParticleRenderer.STTexture): + t = loader.loadTexture('phase_3/maps/eyes.jpg') + if (t == None): + print "Couldn't find default texture: evil_eye.rgb!" + return None + self.renderer.setTexture(t) + else: + # Use default model file and node + # See SpriteParticleRenderer-extensions.py + self.renderer.setTextureFromNode() else: print "unknown renderer type: %s" % type return None @@ -340,8 +343,14 @@ class Particles(ParticleSystem.ParticleSystem): file.write(targ + '.renderer.setLifeScale(SparkleParticleRenderer.' + lScale + ')\n') elif (self.rendererType == "SpriteParticleRenderer"): file.write('# Sprite parameters\n') - tex = self.renderer.getTexture() - file.write(targ + '.renderer.setTexture(loader.loadTexture(\'' + tex.getName() + '\'))\n') + if (self.renderer.getSourceType() == + SpriteParticleRenderer.SpriteParticleRenderer.STTexture): + tex = self.renderer.getTexture() + file.write(targ + '.renderer.setTexture(loader.loadTexture(\'' + tex.getName() + '\'))\n') + else: + modelName = self.renderer.getSourceFileName() + nodeName = self.renderer.getSourceNodeName() + file.write(targ + '.renderer.setTextureFromNode(%s, %s)' % (modelName, nodeName)) sColor = self.renderer.getColor() file.write((targ + '.renderer.setColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3]))) file.write(targ + '.renderer.setXScaleFlag(%d)\n' % self.renderer.getXScaleFlag()) diff --git a/direct/src/tkpanels/ParticlePanel.py b/direct/src/tkpanels/ParticlePanel.py index 1ab3871250..2fcbb2fcdd 100644 --- a/direct/src/tkpanels/ParticlePanel.py +++ b/direct/src/tkpanels/ParticlePanel.py @@ -548,32 +548,69 @@ class ParticlePanel(AppShell): # Sprite # spritePage = self.rendererNotebook.add('SpriteParticleRenderer') f = Frame(spritePage) + Label(f, width = 12, text = 'Texture Type:').pack(side = LEFT) + self.rendererSpriteSourceType = IntVar() + self.rendererSpriteSourceType.set(SpriteParticleRenderer.STTexture) + self.rendererSpriteSTTexture = self.createRadiobutton( + f, 'left', + 'Sprite Renderer', 'Texture Type', + 'Sprite particle renderer created from texture file', + self.rendererSpriteSourceType, SpriteParticleRenderer.STTexture, + self.setSpriteSourceType) + self.rendererSpriteSTTexture = self.createRadiobutton( + f, 'left', + 'Sprite Renderer', 'NodePath Type', + 'Sprite particle renderer created from node path', + self.rendererSpriteSourceType, SpriteParticleRenderer.STFromNode, + self.setSpriteSourceType) f.pack(fill = X) - Label(f, width = 12, text = 'Texture').pack(side = LEFT) + f = Frame(spritePage) + Label(f, width = 6, text = 'Texture:').pack(side = LEFT) self.rendererSpriteTexture = StringVar() self.rendererSpriteTexture.set('phase_3/maps/eyes.jpg') self.rendererSpriteTextureEntry = Entry( f, width = 12, textvariable = self.rendererSpriteTexture) - self.rendererSpriteTextureEntry.bind( - '', self.setRendererSpriteTexture) - self.rendererSpriteTextureEntry.pack( - side = LEFT, expand = 1, fill = X) + 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) + self.rendererSpriteFile = StringVar() + self.rendererSpriteFile.set(SpriteParticleRenderer.sourceFileName) + self.rendererSpriteFileEntry = Entry( + f, width = 12, + textvariable = self.rendererSpriteFile) + self.rendererSpriteFileEntry.pack(side = LEFT, expand = 1, fill = X) + Label(f, width = 6, text = 'Node:').pack(side = LEFT) + self.rendererSpriteNode = StringVar() + self.rendererSpriteNode.set(SpriteParticleRenderer.sourceNodeName) + self.rendererSpriteNodeEntry = Entry( + f, 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', + command = self.setRendererSpriteTexture) + self.setTextureButton.pack(fill = X) + f = Frame(spritePage) self.createCheckbutton( - spritePage, 'Sprite Renderer', 'X Scale', + f, 'Sprite Renderer', 'X Scale', ("On: x scale is interpolated over particle's life; " + "Off: stays as start_X_Scale"), - self.toggleRendererSpriteXScale, 0) + self.toggleRendererSpriteXScale, 0, side = LEFT) self.createCheckbutton( - spritePage, 'Sprite Renderer', 'Y Scale', + f, 'Sprite Renderer', 'Y Scale', ("On: y scale is interpolated over particle's life; " + "Off: stays as start_Y_Scale"), - self.toggleRendererSpriteYScale, 0) + self.toggleRendererSpriteYScale, 0, side = LEFT) self.createCheckbutton( - spritePage, 'Sprite Renderer', 'Anim Angle', + f, 'Sprite Renderer', 'Anim Angle', ("On: particles that are set to spin on the Z axis will " + "spin appropriately"), - self.toggleRendererSpriteAnimAngle, 0) + self.toggleRendererSpriteAnimAngle, 0, side = LEFT) + f.pack(fill = X) self.createFloater(spritePage, 'Sprite Renderer', 'Initial X Scale', 'Initial X scaling factor', @@ -663,14 +700,14 @@ class ParticlePanel(AppShell): ### WIDGET UTILITY FUNCTIONS ### def createCheckbutton(self, parent, category, text, - balloonHelp, command, initialState): + balloonHelp, command, initialState, side = 'top'): bool = BooleanVar() bool.set(initialState) widget = Checkbutton(parent, text = text, anchor = W, variable = bool) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = X, side = side) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget self.variableDict[category + '-' + text] = bool @@ -1521,12 +1558,31 @@ class ParticlePanel(AppShell): lScale = SparkleParticleRenderer.SPSCALE self.particles.renderer.setLifeScale(lScale) # Sprite # - def setRendererSpriteTexture(self, event): - t = loader.loadTexture(self.rendererSpriteTexture.get()) - if (t != None): - self.particles.renderer.setTexture(t) - else: - print "Couldn't find rendererSpriteTexture" + def setSpriteSourceType(self): + if self.rendererSpriteSourceType.get() == SpriteParticleRenderer.STTexture: + self.rendererSpriteTextureEntry['state'] = 'normal' + self.rendererSpriteFileEntry['state'] = 'disabled' + self.rendererSpriteNodeEntry['state'] = 'disabled' + self.rendererSpriteTextureEntry['background'] = 'SystemWindow' + self.rendererSpriteFileEntry['background'] = '#C0C0C0' + self.rendererSpriteNodeEntry['background'] = '#C0C0C0' + else: + self.rendererSpriteTextureEntry['state'] = 'disabled' + self.rendererSpriteFileEntry['state'] = 'normal' + self.rendererSpriteNodeEntry['state'] = 'normal' + self.rendererSpriteTextureEntry['background'] = '#C0C0C0' + self.rendererSpriteFileEntry['background'] = 'SystemWindow' + self.rendererSpriteNodeEntry['background'] = 'SystemWindow' + def setRendererSpriteTexture(self): + if self.rendererSpriteSourceType.get() == SpriteParticleRenderer.STTexture: + t = loader.loadTexture(self.rendererSpriteTexture.get()) + if (t != None): + self.particles.renderer.setTexture(t) + else: + print "Couldn't find rendererSpriteTexture" + else: + self.particles.renderer.setTextureFromNode( + self.rendererSpriteFile.get(), self.rendererSpriteNode.get()) def toggleRendererSpriteXScale(self): self.particles.renderer.setXScaleFlag( self.getVariable('Sprite Renderer', 'X Scale').get())