Jelajahi Sumber

MAJOR OVERHAUL: The particle interval now behaves like a normal interval. The particle system is removed from the global particle and physics managers and its stepping is controlled by the interval itself.

Josh Wilson 19 tahun lalu
induk
melakukan
cfd7181deb
1 mengubah file dengan 50 tambahan dan 32 penghapusan
  1. 50 32
      direct/src/interval/ParticleInterval.py

+ 50 - 32
direct/src/interval/ParticleInterval.py

@@ -14,16 +14,26 @@ class ParticleInterval(Interval):
     # create ParticleInterval DirectNotify category
     notify = directNotify.newCategory('ParticleInterval')
     # Class methods
-    def __init__(self, particleEffect, parent, worldRelative=1, loop=0, 
-            duration=0.0, name=None):
+    def __init__(self,
+                 particleEffect,
+                 parent,
+                 worldRelative=1,
+                 renderParent = None,
+                 duration=0.0,
+                 softStopT = 0.0,
+                 cleanup = False,
+                 name=None):
         """
-        particleEffect is ??
-        parent is ??
+        particleEffect is a ParticleEffect
+        parent is a NodePath
         worldRelative is a boolean
-        loop is a boolean
+        renderParent is a NodePath
         duration is a float for the time
-        name is ??
+        softStopT is a float
+        cleanup is a boolean
+        name is a string
         """
+        
         # Generate unique name
         id = 'Particle-%d' % ParticleInterval.particleNum
         ParticleInterval.particleNum += 1
@@ -31,25 +41,39 @@ class ParticleInterval(Interval):
             name = id
         # Record instance variables
         self.particleEffect = particleEffect 
-        self.parent = parent
-        self.worldRelative = worldRelative
-        self.fLoop = loop
-        assert duration > 0.0 or loop == 1
+        self.softStopT = softStopT
+        self.cleanup = cleanup
+        
+        if parent != None:
+            self.particleEffect.reparentTo(parent)
+        if worldRelative:
+            self.particleEffect.setRenderParent(render.node())
+        
         # Initialize superclass
         Interval.__init__(self, name, duration)
 
-    def __del__(self):
+    def __step(self,dt):
         if self.particleEffect:
-            self.particleEffect.cleanup()
-            self.particleEffect = None
+            self.particleEffect.accelerate(dt,1,0.05)
+
+    def start(self, *args, **kwargs):
+        self.state = CInterval.SInitial
+        if self.particleEffect:
+            self.particleEffect.softStart()
+        Interval.start(self, *args, **kwargs)        
 
     def privInitialize(self, t):
-        renderParent = None
-        if self.worldRelative:
-            renderParent = render
+        if self.state == CInterval.SInitial:
+            if self.particleEffect:
+                self.particleEffect.clearToInitial()
+            self.currT = 0
+
         if self.particleEffect:
-            self.particleEffect.start(self.parent, renderParent)
-        self.state = CInterval.SStarted
+            for f in self.particleEffect.forceGroupDict.values():
+                f.enable()
+
+        self.state = CInterval.SStarted        
+        self.__step(t-self.currT)
         self.currT = t
 
     def privStep(self, t):
@@ -58,22 +82,16 @@ class ParticleInterval(Interval):
             self.privInitialize(t)
         else:
             self.state = CInterval.SStarted
+            self.__step(t-self.currT)
             self.currT = t
 
-    def privFinalize(self):
-        if self.particleEffect:
-            self.particleEffect.cleanup()
-            self.particleEffect = None
-        self.currT = self.getDuration()
-        self.state = CInterval.SFinal
+        if self.currT > (self.getDuration() - self.softStopT):
+            if self.particleEffect:
+                self.particleEffect.softStop()
 
-    def privInstant(self):
-        if self.particleEffect:
+    def privFinalize(self):
+        Interval.privFinalize(self)
+        if self.cleanup and self.particleEffect:
             self.particleEffect.cleanup()
             self.particleEffect = None
-        self.currT = self.getDuration()
-        self.state = CInterval.SFinal
-
-    def privInterrupt(self):
-        self.particleEffect.disable()
-        self.state = CInterval.SPaused
+