2
0
Эх сурвалжийг харах

*** empty log message ***

Mike Goslin 25 жил өмнө
parent
commit
5db7fe32a8

+ 21 - 24
direct/src/particles/ForceGroup.py

@@ -20,41 +20,34 @@ class ForceGroup(DirectObject):
  	self.node = ForceNode.ForceNode(self.name)
 	self.nodePath = hidden.attachNewNode(self.node)
         self.fEnabled = 0
+	
+	# Default to enabled
+	self.enable()
 
     def enable(self):
-	"""enable(self)"""
-	for i in range(self.node.getNumForces()):
-	    f = self.node.getForce(i)
-	    if (f.isLinear() == 1):
-		physicsMgr.addLinearForce(f)
-	    else:
-		physicsMgr.addAngularForce(f)
-        self.fEnabled = 1
+	"""enable(self)
+	   Convenience function to enable all forces in force group"""
+	if (self.fEnabled == 0):
+	    for i in range(self.node.getNumForces()):
+	    	f = self.node.getForce(i)
+	    	f.setActive(1)	
+            self.fEnabled = 1
 
     def disable(self):
-	"""disable(self)"""
-	for i in range(self.node.getNumForces()):
-	    f = self.node.getForce(i)
-	    if (f.isLinear() == 1):
-		physicsMgr.removeLinearForce(f)
-	    else:
-		physicsMgr.removeAngularForce(f)
-        self.fEnabled = 0
+	"""disable(self)
+	   Convenience function to disable all forces in force group"""
+	if (self.fEnabled == 1):
+	    for i in range(self.node.getNumForces()):
+	    	f = self.node.getForce(i)
+		f.setActive(0)
+            self.fEnabled = 0
 
     def isEnabled(self):
         return self.fEnabled
 
     def addForce(self, force):
 	"""addForce(self, force)"""
-	if (force.isLinear() == 0):
-	    # Physics manager will need an angular integrator
-	    base.addAngularIntegrator()
 	self.node.addForce(force)
-        if self.fEnabled:
-	    if (force.isLinear() == 1):
-		physicsMgr.addLinearForce(force)
-	    else:
-		physicsMgr.addAngularForce(force)
 
     def removeForce(self, force):
 	"""removeForce(self, force)"""
@@ -122,5 +115,9 @@ class ForceGroup(DirectObject):
 		elif isinstance(f, LinearVectorForce):
 		    vec = f.getVector()
 		    file.write(fname + ' = LinearVectorForce(Vec3(%.4f, %.4f, %.4f), %.4f, %d)\n' % (vec[0], vec[1], vec[2], amplitude, massDependent))
+	    elif isinstance(f, AngularForce):
+		if isinstance(f, AngularVectorForce):
+		    vec = f.getVector()
+		    file.write(fname + ' = AngularVectorForce(Vec3(%.4f, %.4f, %.4f))\n' % (vec[0], vec[1], vec[2]))
 	    file.write(fname + '.setActive(%d)\n' % f.getActive())
 	    file.write(targ + '.addForce(%s)\n' % fname)

+ 26 - 0
direct/src/particles/GlobalForceGroup.py

@@ -0,0 +1,26 @@
+import ForceGroup
+
+class GlobalForceGroup(ForceGroup.ForceGroup):
+
+    def __init__(self, name = None):
+	"""__init__(self)"""
+	ForceGroup.ForceGroup.__init__(self, name)
+
+    def addForce(self, force):
+	"""addForce(self, force)"""
+	ForceGroup.ForceGroup.addForce(force)
+	if (force.isLinear() == 0):
+	    # Physics manager will need an angular integrator
+	    base.addAngularIntegrator()
+	if (force.isLinear() == 1):
+	    physicsMgr.addLinearForce(force)
+	else:
+	    physicsMgr.addAngularForce(force)
+
+    def removeForce(self, force):
+	"""removeForce(self, force)"""
+	ForceGroup.ForceGroup.removeForce(force)
+	if (force.isLinear() == 1):
+	    physicsMgr.removeLinearForce(force)
+	else:
+	    physicsMgr.removeAngularForce(force)

+ 21 - 10
direct/src/particles/ParticleEffect.py

@@ -47,12 +47,23 @@ class ParticleEffect(NodePath):
 	forceGroup.nodePath.reparentTo(self)
 	self.forceGroupDict[forceGroup.getName()] = forceGroup
 
+	# Associate the force group with all particles
+	flist = forceGroup.asList()
+	for p in self.particlesDict.values():
+	    for f in flist:
+	    	p.addForce(f)	
+
     def addParticles(self, particles):
 	"""addParticles(particles)"""
 	particles.nodePath.reparentTo(self)
-	particles.forceNodePath.reparentTo(self)
 	self.particlesDict[particles.getName()] = particles
 
+	# Associate all forces in all force groups with the particles
+	for fg in self.forceGroupDict.values():
+	    flist = fg.asList()
+	    for f in flist:
+		particles.addForce(f)
+
     def getParticlesList(self):
         """getParticles()"""
         return self.particlesDict.values()
@@ -86,15 +97,6 @@ class ParticleEffect(NodePath):
         # Add a blank line
         f.write('\n')
 
-	# Save all the forces to file
-	num = 0
-	for fg in self.forceGroupDict.values():
-	    target = 'f%d' % num
-	    num = num + 1
-	    f.write(target + ' = ForceGroup.ForceGroup(\'%s\')\n' % fg.getName())
-	    fg.printParams(f, target)	
-	    f.write('self.addForceGroup(%s)\n' % target)
-
         # Save all the particles to file
 	f.write('self.particlesDict = {}\n')
 	num = 0
@@ -105,6 +107,15 @@ class ParticleEffect(NodePath):
 	    p.printParams(f, target)
 	    f.write('self.addParticles(%s)\n' % target)
 
+	# Save all the forces to file
+	num = 0
+	for fg in self.forceGroupDict.values():
+	    target = 'f%d' % num
+	    num = num + 1
+	    f.write(target + ' = ForceGroup.ForceGroup(\'%s\')\n' % fg.getName())
+	    fg.printParams(f, target)	
+	    f.write('self.addForceGroup(%s)\n' % target)
+
         # Close the file
         f.close()
 

+ 2 - 2
direct/src/particles/ParticleTest.py

@@ -10,13 +10,13 @@ base.enableParticles()
 # ForceGroup
 gravity = LinearVectorForce(Vec3(0.0, 0.0, -10.0))
 fg = ForceGroup.ForceGroup()
-#fg.addForce(gravity)
+fg.addForce(gravity)
 
 # Particle effect
 pe = ParticleEffect.ParticleEffect('particle-fx')
 pe.reparentTo(render)
 pe.setPos(0.0, 5.0, 4.0)
-#pe.addForceGroup(fg)
+pe.addForceGroup(fg)
 pe.enable()
 
 # Particle Panel

+ 3 - 45
direct/src/particles/Particles.py

@@ -53,10 +53,6 @@ class Particles(ParticleSystem.ParticleSystem):
 	self.setRenderParent(self.node)
 	self.node.addPhysical(self)
 
-	# Set up a force node
-	self.forceNode = ForceNode(self.name + '-force')
-	self.forceNodePath = hidden.attachNewNode(self.forceNode)
-
 	self.factory = None 
 	self.factoryType = "undefined"
 	self.setFactory("PointParticleFactory")
@@ -66,7 +62,9 @@ class Particles(ParticleSystem.ParticleSystem):
 	self.emitter = None 
 	self.emitterType = "undefined"
 	self.setEmitter("SphereVolumeEmitter")
-        self.fEnabled = 0
+
+	# Enable particles by default
+	self.enable()
 
     def enable(self):
 	"""enable()"""
@@ -170,7 +168,6 @@ class Particles(ParticleSystem.ParticleSystem):
 	    self.addLinearForce(force)
 	else:
 	    self.addAngularForce(force)
-	self.forceNode.addForce(force)
 
     def removeForce(self, force):
 	"""removeForce(force)"""
@@ -178,7 +175,6 @@ class Particles(ParticleSystem.ParticleSystem):
 	    self.removeLinearForce(force)
 	else:
 	    self.removeAngularForce(force)
-	self.forceNode.removeForce(force)
 
     ## Getters ##
     def getName(self):
@@ -374,41 +370,3 @@ class Particles(ParticleSystem.ParticleSystem):
 	elif (self.emitterType == "TangentRingEmitter"):
 	    file.write('# Tangent Ring parameters\n')
 	    file.write(targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())
-
-	file.write('# Local Forces\n')
-	for i in range(self.getNumLinearForces()):
-	    f = self.getLinearForce(i)
-            fname = 'force%d' % i
-            if isinstance(f, LinearForce):
-                amplitude = f.getAmplitude()
-                massDependent = f.getMassDependent()
-                if isinstance(f, LinearCylinderVortexForce):
-                    file.write(fname + ' = LinearCylinderVortexForce(%.4f, %.4f, %.4f, %.4f, %d)\n' % (f.getRadius(), f.getLength(), f.getCoef(), amplitude, massDependent))
-                elif isinstance(f, LinearDistanceForce):
-                    radius = f.getRadius()
-                    falloffType = f.getFalloffType()
-                    ftype = 'FTONEOVERR'
-                    if (falloffType == LinearDistanceForce.LinearDistanceForce.FTONEOVERR):
-                        ftype = 'FTONEOVERR'
-                    elif (falloffType == LinearDistanceForce.LinearDistanceForce.FTONEOVERRSQUARED):
-                        ftype = 'FTONEOVERRSQUARED'
-                    elif (falloffType == LinearDistanceForce.LinearDistanceForce.FTONEOVERRCUBED):
-                        ftype = 'FTONEOVERRCUBED'
-                    forceCenter = f.getForceCenter()
-                    if isinstance(f, LinearSinkForce):
-                        file.write(fname + ' = LinearSinkForce(Vec3(%.4f, %.4f, %.4f), LinearDistanceForce.%s, %.4f, %.4f, %d)\n' % (forceCenter[0], forceCenter[1], forceCenter[2], ftype, radius, amplitude, massDependent))
-                    elif isinstance(f, LinearSourceForce):
-                        file.write(fname + ' = LinearSourceForce(Vec3(%.4f, %.4f, %.4f), LinearDistanceForce.%s, %.4f, %.4f, %d)\n' % (forceCenter[0], forceCenter[1], forceCenter[2], ftype, radius, amplitude, massDependent))
-                elif isinstance(f, LinearFrictionForce):
-                    file.write(fname + ' = LinearFrictionForce(%.4f, %.4f, %d)\n' % (f.getCoef(), amplitude, massDependent))
-                elif isinstance(f, LinearJitterForce):
-                    file.write(fname + ' = LinearJitterForce(%.4f, %d)\n' % (amplitude, massDependent))
-                elif isinstance(f, LinearNoiseForce):
-                    file.write(fname + ' = LinearNoiseForce(%.4f, %d)\n' % (amplitude, massDependent))
-                elif isinstance(f, LinearVectorForce):
-                    vec = f.getVector()
-                    file.write(fname + ' = LinearVectorForce(Vec3(%.4f, %.4f, %.4f), %.4f, %d)\n' % (vec[0], vec[1], vec[2], amplitude, massDependent))
-            file.write(fname + '.setActive(%d)\n' % f.getActive())
-            file.write(targ + '.addForce(%s)\n' % fname)
-	for i in range(self.getNumAngularForces()):
-	    f = self.getAngularForce(i)