Browse Source

Updated to handle animated SpriteParticleRenderer.

Josh Wilson 20 years ago
parent
commit
16e9cebc31

+ 13 - 17
direct/src/particles/Particles.py

@@ -140,15 +140,7 @@ class Particles(ParticleSystem):
             self.renderer = SparkleParticleRenderer()
             self.renderer = SparkleParticleRenderer()
         elif (type == "SpriteParticleRenderer"):
         elif (type == "SpriteParticleRenderer"):
             self.renderer = SpriteParticleRendererExt.SpriteParticleRendererExt()
             self.renderer = SpriteParticleRendererExt.SpriteParticleRendererExt()
-            if (self.renderer.getSourceType() ==
-                SpriteParticleRendererExt.SpriteParticleRendererExt.STTexture):
-                # Use current default texture 
-                # See sourceTextureName SpriteParticleRenderer-extensions.py
-                self.renderer.setTextureFromFile()
-            else:
-                # Use current default model file and node
-                # See sourceFileName and sourceNodeName in SpriteParticleRenderer-extensions.py
-                self.renderer.setTextureFromNode()
+            self.renderer.setTextureFromFile()
         else:
         else:
             print "unknown renderer type: %s" % type
             print "unknown renderer type: %s" % type
             return None
             return None
@@ -390,14 +382,18 @@ class Particles(ParticleSystem):
             file.write(targ + '.renderer.setLifeScale(SparkleParticleRenderer.' + lScale + ')\n')
             file.write(targ + '.renderer.setLifeScale(SparkleParticleRenderer.' + lScale + ')\n')
         elif (self.rendererType == "SpriteParticleRenderer"):
         elif (self.rendererType == "SpriteParticleRenderer"):
             file.write('# Sprite parameters\n')
             file.write('# Sprite parameters\n')
-#            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:
-                modelName = self.renderer.getSourceFileName()
-                nodeName = self.renderer.getSourceNodeName()
-                file.write(targ + '.renderer.setTextureFromNode("%s", "%s")\n' % (modelName, nodeName))
+            if (self.renderer.getAnimateFramesEnable()):
+                file.write(targ + '.renderer.setAnimateFramesEnable(True)\n')
+                rate = self.renderer.getAnimateFramesRate()
+                if(rate):
+                    file.write(targ + '.renderer.setAnimationFrameRate(%.3f)\n'%rate)
+            animCount = self.renderer.getNumAnims()
+            for x in range(animCount):
+                anim = self.renderer.getAnim(x)
+                if(anim.getSourceType() == SpriteAnim.STTexture):
+                    file.write(targ + '.renderer.%sTexture(loader.loadTexture(\'%s\'))\n' % ((x>0 and 'add' or 'set',)[0], anim.getTexSource()))
+                else:
+                    file.write(targ + '.renderer.%sTextureFromNode(\'%s\',\'%s\')\n' % ((x>0 and 'add' or 'set',)[0], anim.getModelSource(), anim.getNodeSource()))
             sColor = self.renderer.getColor()
             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.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())
             file.write(targ + '.renderer.setXScaleFlag(%d)\n' % self.renderer.getXScaleFlag())

+ 45 - 2
direct/src/particles/SpriteParticleRendererExt.py

@@ -32,9 +32,24 @@ class SpriteParticleRendererExt(SpriteParticleRenderer):
             fileName = self.getSourceTextureName()
             fileName = self.getSourceTextureName()
         else:
         else:
             self.setSourceTextureName(fileName)
             self.setSourceTextureName(fileName)
+
         t = loader.loadTexture(fileName)
         t = loader.loadTexture(fileName)
         if (t != None):
         if (t != None):
-            self.setTexture(t)
+            self.setTexture(t,fileName)
+        else:
+            print "Couldn't find rendererSpriteTexture file: %s" % fileName
+
+    def addTextureFromFile(self, fileName = None):
+        if(self.getNumAnims == 0):
+            self.setTextureFromFile(fileName)
+            return
+        
+        if fileName == None:
+            fileName = self.getSourceTextureName()
+
+        t = loader.loadTexture(fileName)
+        if (t != None):
+            self.addTexture(t,fileName)
         else:
         else:
             print "Couldn't find rendererSpriteTexture file: %s" % fileName
             print "Couldn't find rendererSpriteTexture file: %s" % fileName
 
 
@@ -65,10 +80,12 @@ class SpriteParticleRendererExt(SpriteParticleRenderer):
             modelName = self.getSourceFileName()
             modelName = self.getSourceFileName()
         else:
         else:
             self.setSourceFileName(modelName)
             self.setSourceFileName(modelName)
+            
         if nodeName == None:
         if nodeName == None:
             nodeName = self.getSourceNodeName()
             nodeName = self.getSourceNodeName()
         else:
         else:
             self.setSourceNodeName(nodeName)
             self.setSourceNodeName(nodeName)
+            
         # Load model and get texture
         # Load model and get texture
         m = loader.loadModelOnce(modelName)
         m = loader.loadModelOnce(modelName)
         if (m == None):
         if (m == None):
@@ -80,6 +97,32 @@ class SpriteParticleRendererExt(SpriteParticleRenderer):
             print "SpriteParticleRendererExt: Couldn't find node: %s!" % nodeName
             print "SpriteParticleRendererExt: Couldn't find node: %s!" % nodeName
             m.removeNode()
             m.removeNode()
             return None
             return None
-        self.setFromNode(np, sizeFromTexels)
+
+        self.setFromNode(np, modelName, nodeName, sizeFromTexels)
+        m.removeNode()
+        
+    def addTextureFromNode(self, modelName = None, nodeName = None, sizeFromTexels = True):
+        if(self.getNumAnims == 0):
+            self.setTextureFromNode(modelName,nodeName,sizeFromTexels)
+            return
+
+        if modelName == None:
+            modelName = self.getSourceFileName()
+            
+        if nodeName == None:
+            nodeName = self.getSourceNodeName()
+
+        # Load model and get texture
+        m = loader.loadModelOnce(modelName)
+        if (m == None):
+            print "SpriteParticleRendererExt: Couldn't find model: %s!" % modelName 
+            return None
+
+        np = m.find(nodeName)
+        if np.isEmpty():
+            print "SpriteParticleRendererExt: Couldn't find node: %s!" % nodeName
+            m.removeNode()
+            return None
+        self.addFromNode(np, modelName, nodeName, sizeFromTexels)
         m.removeNode()
         m.removeNode()
         
         

+ 226 - 71
direct/src/tkpanels/ParticlePanel.py

@@ -571,7 +571,7 @@ class ParticlePanel(AppShell):
                                'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
                                'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
                                'OZero'),
                                'OZero'),
                               self.setRendererGeomColorBlendFbufferOperand)
                               self.setRendererGeomColorBlendFbufferOperand)
-        self.getVariable('Geom Renderer','Fbuffer Op.').set('OOne')
+        self.getVariable('Geom Renderer','Fbuffer Op.').set('OOneMinusIncomingAlpha')
         p.pack(fill = X)
         p.pack(fill = X)
         p = Frame(rendererGeomInterpolationPage)
         p = Frame(rendererGeomInterpolationPage)
         p.pack(fill = X)
         p.pack(fill = X)
@@ -664,54 +664,63 @@ class ParticlePanel(AppShell):
         rendererSpriteBlendPage = rendererSpriteNotebook.add('Blend')
         rendererSpriteBlendPage = rendererSpriteNotebook.add('Blend')
         rendererSpriteInterpolationPage = rendererSpriteNotebook.add('Interpolate')
         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(
-            p, 'left',
-            'Sprite Renderer', 'Texture Type',
-            'Sprite particle renderer created from texture file',
-            self.rendererSpriteSourceType, SpriteParticleRenderer.STTexture,
-            self.setSpriteSourceType)
-        self.rendererSpriteSTTexture = self.createRadiobutton(
-            p, 'left',
-            'Sprite Renderer', 'NodePath Type',
-            'Sprite particle renderer created from node path',
-            self.rendererSpriteSourceType, SpriteParticleRenderer.STFromNode,
-            self.setSpriteSourceType)
-        self.rendererSpriteSTTexture.pack(side = LEFT, expand = 1, fill = X)
+#        p = Frame(rendererSpriteTexturePage)        
+#        p.pack(fill = X)
+#        Label(p, width = 12, text = 'Texture Type:').pack(side = LEFT)
+#        self.rendererSpriteSourceType = IntVar()
+#        self.rendererSpriteSourceType.set(0)
+#        self.rendererSpriteSTTexture = self.createRadiobutton(
+#            p, 'left',
+#            'Sprite Renderer', 'Texture Type',
+#            'Sprite particle renderer created from texture file',
+#            self.rendererSpriteSourceType, 0,
+#            self.setSpriteSourceType)
+#        self.rendererSpriteSTTexture = self.createRadiobutton(
+#            p, 'left',
+#            'Sprite Renderer', 'NodePath Type',
+#            'Sprite particle renderer created from node path',
+#            self.rendererSpriteSourceType, 1,
+#            self.setSpriteSourceType)
+#        self.rendererSpriteSTTexture.pack(side = LEFT, expand = 1, fill = X)
+##################################################################################
         p = Frame(rendererSpriteTexturePage)
         p = Frame(rendererSpriteTexturePage)
-        Label(p, width = 6, text = 'Texture:').pack(side = LEFT)
-        p.pack(fill = X)
+        p.pack(fill = BOTH, expand = 1)
+
+        bp = Frame(p)
+        bp.pack(expand = 0, side = TOP)
+
+        bbp = Frame(bp)
+        bbp.pack()
+        self.createCheckbutton(
+            bbp, 'Sprite Renderer', 'Enable Animation',
+            ("On: Multitexture node will be animated; " +
+             "Off: Only the first frame of a node is rendered"),
+            self.setRendererSpriteAnimationEnable, 0, side = LEFT)
+        self.createFloater(bbp, 'Sprite Renderer', 'Frame Rate', 'Animation frame rate',
+                           resolution=0.25,
+                           command = self.setRendererSpriteAnimationFrameRate).pack(side = LEFT)
+        
+        bbp = Frame(bp)
+        bbp.pack(pady=3)
+        Button(bbp, text = 'Add Texture',
+               command = self.addRendererSpriteAnimationTexture).pack(pady = 3, padx = 15, side = LEFT)
+        Button(bbp, text = 'Add Animation',
+               command = self.addRendererSpriteAnimationFromNode).pack(pady = 3, padx = 15, side = LEFT)
+        
+        pp = Frame(p)
+        pp.pack(fill = BOTH, expand = 1, pady = 3)
+        sf = Pmw.ScrolledFrame(pp, horizflex = 'elastic')
+        sf.pack(fill = BOTH, expand = 1)
+
+        self.rendererSpriteAnimationFrame = sf.interior()
+        self.rendererSpriteAnimationFrame.pack(fill = BOTH, expand = 1)
+        self.rendererSpriteAnimationWidgetList = []
+
         self.rendererSpriteTexture = StringVar()
         self.rendererSpriteTexture = StringVar()
-#        self.rendererSpriteTexture.set(SpriteParticleRenderer.sourcetexturename)
-        self.rendererSpriteTextureEntry = Entry(
-            p, width = 12,
-            textvariable = self.rendererSpriteTexture)
-        self.rendererSpriteTextureEntry.pack(side = LEFT, expand = 1, fill = X)
-        p = Frame(rendererSpriteTexturePage)
-        p.pack(fill = X)
-        Label(p, width = 6, text = 'file:').pack(side = LEFT)
         self.rendererSpriteFile = StringVar()
         self.rendererSpriteFile = StringVar()
-#        self.rendererspritefile.set(spriteparticlerenderer.sourcefilename)
-        self.rendererSpriteFileEntry = Entry(
-            p, width = 12,
-            textvariable = self.rendererSpriteFile)
-        self.rendererSpriteFileEntry.pack(side = LEFT, expand = 1, fill = X)
-        Label(p, width = 6, text = 'Node:').pack(side = LEFT)
         self.rendererSpriteNode = StringVar()
         self.rendererSpriteNode = StringVar()
-#        self.rendererSpriteNode.set(SpriteParticleRenderer.sourceNodeName)
-        self.rendererSpriteNodeEntry = Entry(
-            p, width = 6,
-            textvariable = self.rendererSpriteNode)
-        self.rendererSpriteNodeEntry.pack(side = LEFT, expand = 1, fill = X)
-        # Init entries
-        self.setSpriteSourceType()
-        self.setTextureButton = Button(rendererSpriteTexturePage, text = 'Set Texture',
-                                       command = self.setRendererSpriteTexture)
-        self.setTextureButton.pack(fill = X, pady = 3)
+
+##################################################################################
         p = Frame(rendererSpriteScalePage)
         p = Frame(rendererSpriteScalePage)
         p.pack(fill = X)
         p.pack(fill = X)
         self.createCheckbutton(
         self.createCheckbutton(
@@ -787,7 +796,7 @@ class ParticlePanel(AppShell):
                                'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
                                'OOneMinusConstantColor','OConstantAlpha','OOneMinusConstantAlpha',
                                'OZero'),
                                'OZero'),
                               self.setRendererSpriteColorBlendFbufferOperand)
                               self.setRendererSpriteColorBlendFbufferOperand)
-        self.getVariable('Sprite Renderer','Fbuffer Op.').set('OOne')
+        self.getVariable('Sprite Renderer','Fbuffer Op.').set('OOneMinusIncomingAlpha')
         p = Frame(rendererSpriteInterpolationPage)
         p = Frame(rendererSpriteInterpolationPage)
         p.pack(fill = BOTH, expand = 1)
         p.pack(fill = BOTH, expand = 1)
         addSegmentButton = Menubutton(p, text = 'Add Segment',
         addSegmentButton = Menubutton(p, text = 'Add Segment',
@@ -1643,20 +1652,10 @@ class ParticlePanel(AppShell):
                 lScale = "SP_SCALE"
                 lScale = "SP_SCALE"
             self.getVariable('Sparkle Renderer', 'Life Scale').set(lScale)
             self.getVariable('Sparkle Renderer', 'Life Scale').set(lScale)
         elif isinstance(renderer, SpriteParticleRenderer):
         elif isinstance(renderer, SpriteParticleRenderer):
-            color = renderer.getColor() * 255.0
-            # Update widgets to reflect current default values
-            # Texture
-            textureName = renderer.getSourceTextureName()
-            if textureName != None:
-                self.rendererSpriteTexture.set(textureName)
-            # File
-            fileName = renderer.getSourceFileName()
-            if fileName != None:
-                self.rendererSpriteFile.set(fileName)
-            # Node
-            nodeName = renderer.getSourceNodeName()
-            if nodeName != None:
-                self.rendererSpriteNode.set(nodeName)
+            self.getWidget('Sprite Renderer','Frame Rate').set(renderer.getAnimateFramesRate(),0)
+            self.getVariable('Sprite Renderer','Enable Animation').set(
+                renderer.getAnimateFramesEnable())
+            self.readSpriteRendererAnimations() # Updates widgets with renderer data.
             self.getVariable('Sprite Renderer', 'X Scale').set(
             self.getVariable('Sprite Renderer', 'X Scale').set(
                 renderer.getXScaleFlag())
                 renderer.getXScaleFlag())
             self.getVariable('Sprite Renderer', 'Y Scale').set(
             self.getVariable('Sprite Renderer', 'Y Scale').set(
@@ -1790,7 +1789,7 @@ class ParticlePanel(AppShell):
         self.particles.renderer.setLifeScale(lScale)
         self.particles.renderer.setLifeScale(lScale)
     # Sprite #
     # Sprite #
     def setSpriteSourceType(self):
     def setSpriteSourceType(self):
-        if self.rendererSpriteSourceType.get() == SpriteParticleRenderer.STTexture:
+        if self.rendererSpriteSourceType.get() == 0:
             self.rendererSpriteTextureEntry['state'] = 'normal'
             self.rendererSpriteTextureEntry['state'] = 'normal'
             self.rendererSpriteFileEntry['state'] = 'disabled'
             self.rendererSpriteFileEntry['state'] = 'disabled'
             self.rendererSpriteNodeEntry['state'] = 'disabled'
             self.rendererSpriteNodeEntry['state'] = 'disabled'
@@ -1804,12 +1803,54 @@ class ParticlePanel(AppShell):
             self.rendererSpriteTextureEntry['background'] = '#C0C0C0'
             self.rendererSpriteTextureEntry['background'] = '#C0C0C0'
             self.rendererSpriteFileEntry['background'] = '#FFFFFF'
             self.rendererSpriteFileEntry['background'] = '#FFFFFF'
             self.rendererSpriteNodeEntry['background'] = '#FFFFFF'
             self.rendererSpriteNodeEntry['background'] = '#FFFFFF'
-    def setRendererSpriteTexture(self):
-        if self.rendererSpriteSourceType.get() == SpriteParticleRenderer.STTexture:
-            self.particles.renderer.setTextureFromFile(self.rendererSpriteTexture.get())
-        else:
-            self.particles.renderer.setTextureFromNode(
-                self.rendererSpriteFile.get(), self.rendererSpriteNode.get())
+    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,seg))
+        elif(ren.__class__.__name__ == 'GeomParticleRenderer'):
+            parent = self.rendererGeomSegmentFrame
+            segName = `len(self.rendererGeomSegmentWidgetList)`+':Constant'
+            self.rendererGeomSegmentWidgetList.append(
+                self.createConstantInterpolationSegmentWidget(parent,segName,seg))
+        parent.pack(fill=BOTH, expand=1)
+
+    def setRendererSpriteAnimationFrameRate(self,rate):
+        self.particles.renderer.setAnimateFramesRate(rate)
+    def setRendererSpriteAnimationEnable(self):
+        self.particles.renderer.setAnimateFramesEnable(
+            self.getVariable('Sprite Renderer','Enable Animation').get())
+    def addRendererSpriteAnimationTexture(self):
+        print 'adding texture'
+        ren = self.particles.getRenderer()
+        parent = self.rendererSpriteAnimationFrame
+
+        ren.addTextureFromFile()
+        animId = len(self.rendererSpriteAnimationWidgetList)
+        anim = ren.getAnim(animId)
+        
+        self.rendererSpriteAnimationWidgetList.append(
+            self.createSpriteAnimationTextureWidget(parent,anim,`animId`))
+        parent.pack(fill=BOTH, expand=1)
+    def addRendererSpriteAnimationFromNode(self):
+        print 'adding animation'
+        ren = self.particles.getRenderer()
+        parent = self.rendererSpriteAnimationFrame
+
+        ren.addTextureFromNode()
+        animId = len(self.rendererSpriteAnimationWidgetList)
+        anim = ren.getAnim(animId)
+            
+        self.rendererSpriteAnimationWidgetList.append(
+            self.createSpriteAnimationNodeWidget(parent,anim,`animId`))
+        parent.pack(fill=BOTH, expand=1)
+        
     def toggleRendererSpriteXScale(self):
     def toggleRendererSpriteXScale(self):
         self.particles.renderer.setXScaleFlag(
         self.particles.renderer.setXScaleFlag(
             self.getVariable('Sprite Renderer', 'X Scale').get())
             self.getVariable('Sprite Renderer', 'X Scale').get())
@@ -2145,12 +2186,126 @@ class ParticlePanel(AppShell):
         f.pack(fill = X)
         f.pack(fill = X)
         return frame
         return frame
 
 
-#    def updateRendererSpriteSegments(self):
-#        ren = self.particles.getRenderer()
-#        cim = ren.getColorInterpolationManager()
-#        seg = cim.getSegment(cim.addConstant())
+    def createSpriteAnimationFrame(self, parent, anim, animName):
+        ren = self.particles.getRenderer()
+        pass
+        frame = Frame(parent, relief = RAISED, borderwidth = 2)
+        frame.pack(pady = 1, fill = X, expand = 0)
+
+        lFrame = Frame(frame, relief = FLAT)
+        lFrame.pack(fill = X, expand = 1)
 
 
+        def delete(s = self, fr = frame):
+#            import pdb; pdb.set_trace()
+            i = s.rendererSpriteAnimationWidgetList.index(fr)
+            s.rendererSpriteAnimationWidgetList[i] = None
+            fr.pack_forget()
+            fr.destroy()
+            s.writeSpriteRendererAnimations()
+            s.readSpriteRendererAnimations()
+
+        Button(lFrame, text = 'X', foreground = 'Red', font = ('MSSansSerif', 8, 'bold'),
+               command = delete).pack(side = RIGHT, expand = 0)
+        if(anim.getSourceType()==SpriteAnim.STTexture):
+            type = 'Texture'
+        else:
+            type = 'From Node'
+        Label(lFrame, text = animName+': '+type,
+              foreground = 'Blue',
+              font = ('MSSansSerif', 12, 'bold'),
+              ).pack(fill = X, expand = 1)
         
         
+        frame.animSourceType = anim.getSourceType()
+        return frame
+    
+    def createSpriteAnimationTextureWidget(self, parent, anim, animName):
+        ren = self.particles.getRenderer()
+        frame = self.createSpriteAnimationFrame(parent,anim,animName)
+        f = Frame(frame)
+        f.pack(fill=X)
+
+        Label(f, text = 'Texture: ', font = ('MSSansSerif',12), width=7).pack(side = LEFT)
+        strVar = StringVar()
+        entry = Entry(f,textvariable = strVar).pack(padx=3, pady=3,side=LEFT,fill=X,expand=1)
+        strVar.set(anim.getTexSource())
+        Button(f, text = 'Update',
+               command = self.writeSpriteRendererAnimations).pack(side=LEFT)
+        self.variableDict['Sprite Renderer-'+animName+' Anim Texture'] = strVar
+        self.widgetDict['Sprite Renderer-'+animName+' Anim Texture'] = entry
+
+        return frame
+
+    def createSpriteAnimationNodeWidget(self, parent, anim, animName):
+        ren = self.particles.getRenderer()
+        frame = self.createSpriteAnimationFrame(parent,anim, animName)
+        f = Frame(frame)
+        f.pack(fill=X)
+
+        lf = Frame(f)
+        lf.pack(fill=X, expand=1)
+        Label(lf, text = 'Model: ', font = ('MSSansSerif',12), width=7).pack(side = LEFT)
+        strVar = StringVar()
+        entry = Entry(lf,textvariable = strVar).pack(padx=3, pady=3,side=LEFT,fill=X,expand=1)
+        strVar.set(anim.getModelSource())
+        Button(lf, text = 'Update',
+               command = self.writeSpriteRendererAnimations).pack(side=LEFT)
+        
+        self.variableDict['Sprite Renderer-'+animName+' Anim Model'] = strVar
+        self.widgetDict['Sprite Renderer-'+animName+' Anim Model'] = entry
+
+        lf = Frame(f)
+        lf.pack(fill=X, expand=1)
+        Label(lf, text = 'Node: ', font = ('MSSansSerif',12), width=7).pack(side = LEFT)
+        strVar = StringVar()
+        entry = Entry(lf,textvariable = strVar).pack(padx=3, pady=3,side=LEFT,fill=X,expand=1)
+        strVar.set(anim.getNodeSource())
+        Button(lf, text = 'Update',
+               command = self.writeSpriteRendererAnimations).pack(side=LEFT)
+        
+        self.variableDict['Sprite Renderer-'+animName+' Anim Node'] = strVar
+        self.widgetDict['Sprite Renderer-'+animName+' Anim Node'] = entry
+
+        return frame
+
+    def readSpriteRendererAnimations(self):
+        ren = self.particles.getRenderer()
+
+        for widget in self.rendererSpriteAnimationWidgetList:
+            if(widget):
+                widget.pack_forget()
+                widget.destroy()
+
+        self.rendererSpriteAnimationWidgetList = []
+#        import pdb; pdb.set_trace()
+        for anim in [ren.getAnim(x) for x in range(ren.getNumAnims())]:
+            if(anim.getSourceType() == SpriteAnim.STTexture):
+                w = self.createSpriteAnimationTextureWidget(self.rendererSpriteAnimationFrame,anim,`len(self.rendererSpriteAnimationWidgetList)`)
+            else:
+                w = self.createSpriteAnimationNodeWidget(self.rendererSpriteAnimationFrame,anim,`len(self.rendererSpriteAnimationWidgetList)`)
+            self.rendererSpriteAnimationWidgetList.append(w)
+        
+    def writeSpriteRendererAnimations(self):
+        ren = self.particles.getRenderer()
+
+        for x in range(ren.getNumAnims()):
+            ren.removeAnimation(0)
+
+        for x in range(len(self.rendererSpriteAnimationWidgetList)):
+            if(self.rendererSpriteAnimationWidgetList[x]):
+                if(self.rendererSpriteAnimationWidgetList[x].animSourceType == SpriteAnim.STTexture):
+                    texSource = self.getVariable('Sprite Renderer', `x` + ' Anim Texture').get()
+                    if(x == 0):
+                        ren.setTextureFromFile(texSource)
+                    else:
+                        ren.addTextureFromFile(texSource)
+                else:
+                    modelSource = self.getVariable('Sprite Renderer', `x` + ' Anim Model').get()
+                    nodeSource = self.getVariable('Sprite Renderer', `x` + ' Anim Node').get()
+                    if(x == 0):
+                        ren.setTextureFromNode(modelSource,nodeSource)
+                    else:
+                        ren.addTextureFromNode(modelSource,nodeSource)
+    
     ## FORCEGROUP COMMANDS ##
     ## FORCEGROUP COMMANDS ##
     def updateForceWidgets(self):
     def updateForceWidgets(self):
         # Select appropriate notebook page
         # Select appropriate notebook page