Browse Source

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 years ago
parent
commit
cfd7181deb
1 changed files with 50 additions and 32 deletions
  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
     # create ParticleInterval DirectNotify category
     notify = directNotify.newCategory('ParticleInterval')
     notify = directNotify.newCategory('ParticleInterval')
     # Class methods
     # 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
         worldRelative is a boolean
-        loop is a boolean
+        renderParent is a NodePath
         duration is a float for the time
         duration is a float for the time
-        name is ??
+        softStopT is a float
+        cleanup is a boolean
+        name is a string
         """
         """
+        
         # Generate unique name
         # Generate unique name
         id = 'Particle-%d' % ParticleInterval.particleNum
         id = 'Particle-%d' % ParticleInterval.particleNum
         ParticleInterval.particleNum += 1
         ParticleInterval.particleNum += 1
@@ -31,25 +41,39 @@ class ParticleInterval(Interval):
             name = id
             name = id
         # Record instance variables
         # Record instance variables
         self.particleEffect = particleEffect 
         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
         # Initialize superclass
         Interval.__init__(self, name, duration)
         Interval.__init__(self, name, duration)
 
 
-    def __del__(self):
+    def __step(self,dt):
         if self.particleEffect:
         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):
     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:
         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
         self.currT = t
 
 
     def privStep(self, t):
     def privStep(self, t):
@@ -58,22 +82,16 @@ class ParticleInterval(Interval):
             self.privInitialize(t)
             self.privInitialize(t)
         else:
         else:
             self.state = CInterval.SStarted
             self.state = CInterval.SStarted
+            self.__step(t-self.currT)
             self.currT = t
             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.cleanup()
             self.particleEffect = None
             self.particleEffect = None
-        self.currT = self.getDuration()
-        self.state = CInterval.SFinal
-
-    def privInterrupt(self):
-        self.particleEffect.disable()
-        self.state = CInterval.SPaused
+