Pārlūkot izejas kodu

*** empty log message ***

Mark Mine 24 gadi atpakaļ
vecāks
revīzija
44cdf7429a

+ 50 - 0
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()
+        
+

+ 19 - 10
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())

+ 75 - 19
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(
-            '<Return>', 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())