Răsfoiți Sursa

Added better handling of situations where textures or models are not found on model path.

Josh Wilson 20 ani în urmă
părinte
comite
2218f79963
1 a modificat fișierele cu 97 adăugiri și 46 ștergeri
  1. 97 46
      direct/src/tkpanels/ParticlePanel.py

+ 97 - 46
direct/src/tkpanels/ParticlePanel.py

@@ -15,7 +15,7 @@ from direct.particles import ForceGroup
 from direct.particles import Particles
 from direct.particles import ParticleEffect
 
-from pandac.PandaModules import ColorBlendAttrib
+from pandac.PandaModules import ColorBlendAttrib,getModelPath
 
 class ParticlePanel(AppShell):
     # Override class variables
@@ -1828,23 +1828,33 @@ class ParticlePanel(AppShell):
         ren = self.particles.getRenderer()
         parent = self.rendererSpriteAnimationFrame
 
-        ren.addTextureFromFile()
-        animId = len(self.rendererSpriteAnimationWidgetList)
-        anim = ren.getAnim(animId)
+        if ren.addTextureFromFile():
+            animId = len(self.rendererSpriteAnimationWidgetList)
+            anim = ren.getAnim(animId)
         
-        self.rendererSpriteAnimationWidgetList.append(
-            self.createSpriteAnimationTextureWidget(parent,anim,`animId`))
+            self.rendererSpriteAnimationWidgetList.append(
+                self.createSpriteAnimationTextureWidget(parent,anim,`animId`))
+        else:
+            animId = len(self.rendererSpriteAnimationWidgetList)
+            anim = SpriteAnim.STTexture
+            self.rendererSpriteAnimationWidgetList.append(
+                self.createSpriteAnimationTextureWidget(parent,anim,`animId`))
         parent.pack(fill=BOTH, expand=1)
     def addRendererSpriteAnimationFromNode(self):
         ren = self.particles.getRenderer()
         parent = self.rendererSpriteAnimationFrame
 
-        ren.addTextureFromNode()
-        animId = len(self.rendererSpriteAnimationWidgetList)
-        anim = ren.getAnim(animId)
+        if ren.addTextureFromNode():
+            animId = len(self.rendererSpriteAnimationWidgetList)
+            anim = ren.getAnim(animId)
             
-        self.rendererSpriteAnimationWidgetList.append(
-            self.createSpriteAnimationNodeWidget(parent,anim,`animId`))
+            self.rendererSpriteAnimationWidgetList.append(
+                self.createSpriteAnimationNodeWidget(parent,anim,`animId`))
+        else:
+            animId = len(self.rendererSpriteAnimationWidgetList)
+            anim = SpriteAnim.STFromNode
+            self.rendererSpriteAnimationWidgetList.append(
+                self.createSpriteAnimationNodeWidget(parent,anim,`animId`))
         parent.pack(fill=BOTH, expand=1)
         
     def toggleRendererSpriteXScale(self):
@@ -2180,7 +2190,6 @@ class ParticlePanel(AppShell):
         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()
@@ -2190,16 +2199,30 @@ class ParticlePanel(AppShell):
 
         Button(lFrame, text = 'X', foreground = 'Red', font = ('MSSansSerif', 8, 'bold'),
                command = delete).pack(side = RIGHT, expand = 0)
-        if(anim.getSourceType()==SpriteAnim.STTexture):
-            type = 'Texture'
+
+        if(anim == SpriteAnim.STTexture or
+           anim == SpriteAnim.STFromNode):
+            frame.ready = False
+            frame.animSourceType = anim
+            if(anim == SpriteAnim.STTexture):
+                type = 'Texture'
+            else:
+                type = 'From Node'
         else:
-            type = 'From Node'
+            frame.ready = True
+            
+            if(anim.getSourceType()==SpriteAnim.STTexture):
+                frame.animSourceType = SpriteAnim.STTexture
+                type = 'Texture'
+            else:
+                frame.animSourceType = SpriteAnim.STFromNode
+                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):
@@ -2211,9 +2234,19 @@ class ParticlePanel(AppShell):
         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())
+        if frame.ready:
+            strVar.set(anim.getTexSource())
+        else:
+            strVar.set('Base model path: ' + `getModelPath().getValue()`)
+
+        def checkForTexture(strVar = strVar):
+            tex = loader.loadTexture(strVar.get())
+            if tex:
+                frame.ready = True
+            self.writeSpriteRendererAnimations()
+
         Button(f, text = 'Update',
-               command = self.writeSpriteRendererAnimations).pack(side=LEFT)
+               command = checkForTexture).pack(side=LEFT)
         self.variableDict['Sprite Renderer-'+animName+' Anim Texture'] = strVar
         self.widgetDict['Sprite Renderer-'+animName+' Anim Texture'] = entry
 
@@ -2228,27 +2261,45 @@ class ParticlePanel(AppShell):
         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)
+        mStrVar = StringVar()
+        entry = Entry(lf,textvariable = mStrVar).pack(padx=3, pady=3,side=LEFT,fill=X,expand=1)
+        if frame.ready:
+            mStrVar.set(anim.getModelSource())
+        else:
+            mStrVar.set('Base model path: ' + `getModelPath().getValue()`)
+
+        mlf = lf
         
-        self.variableDict['Sprite Renderer-'+animName+' Anim Model'] = strVar
+        self.variableDict['Sprite Renderer-'+animName+' Anim Model'] = mStrVar
         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)
+        nStrVar = StringVar()
+        entry = Entry(lf,textvariable = nStrVar).pack(padx=3, pady=3,side=LEFT,fill=X,expand=1)
+        if frame.ready:
+            nStrVar.set(anim.getNodeSource())
+        else:
+            nStrVar.set('**/*')
+        nlf = lf
         
-        self.variableDict['Sprite Renderer-'+animName+' Anim Node'] = strVar
+        self.variableDict['Sprite Renderer-'+animName+' Anim Node'] = nStrVar
         self.widgetDict['Sprite Renderer-'+animName+' Anim Node'] = entry
 
+        def checkForNode(modelStrVar=mStrVar,nodeStrVar=nStrVar):
+            mod = loader.loadModelCopy(modelStrVar.get())
+            if mod:
+                node = mod.find(nodeStrVar.get())
+                if node:
+                    frame.ready = True
+            self.writeSpriteRendererAnimations()
+
+        Button(mlf, text = 'Update',
+               command = checkForNode).pack(side=LEFT)
+        Button(nlf, text = 'Update',
+               command = checkForNode).pack(side=LEFT)
+
         return frame
 
     def readSpriteRendererAnimations(self):
@@ -2260,7 +2311,7 @@ class ParticlePanel(AppShell):
                 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)`)
@@ -2274,21 +2325,21 @@ class ParticlePanel(AppShell):
         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)
+        widgetList = [x for x in self.rendererSpriteAnimationWidgetList if x and x.ready]
+        for x in range(len(widgetList)):
+            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:
-                    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)
+                    ren.addTextureFromNode(modelSource,nodeSource)
     
     ## FORCEGROUP COMMANDS ##
     def updateForceWidgets(self):