From 5db7fe32a898d51999d2f99d63184afea93016fa Mon Sep 17 00:00:00 2001 From: Mike Goslin Date: Tue, 30 Jan 2001 20:23:24 +0000 Subject: [PATCH] *** empty log message *** --- direct/src/particles/ForceGroup.py | 45 +++++++++++----------- direct/src/particles/GlobalForceGroup.py | 26 +++++++++++++ direct/src/particles/ParticleEffect.py | 31 ++++++++++----- direct/src/particles/ParticleTest.py | 4 +- direct/src/particles/Particles.py | 48 ++---------------------- 5 files changed, 73 insertions(+), 81 deletions(-) create mode 100644 direct/src/particles/GlobalForceGroup.py diff --git a/direct/src/particles/ForceGroup.py b/direct/src/particles/ForceGroup.py index e16e2db973..a97df96726 100644 --- a/direct/src/particles/ForceGroup.py +++ b/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) diff --git a/direct/src/particles/GlobalForceGroup.py b/direct/src/particles/GlobalForceGroup.py new file mode 100644 index 0000000000..fe0d5cc373 --- /dev/null +++ b/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) diff --git a/direct/src/particles/ParticleEffect.py b/direct/src/particles/ParticleEffect.py index 381a0e8337..3158746398 100644 --- a/direct/src/particles/ParticleEffect.py +++ b/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() diff --git a/direct/src/particles/ParticleTest.py b/direct/src/particles/ParticleTest.py index e77125d75c..317022f72b 100644 --- a/direct/src/particles/ParticleTest.py +++ b/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 diff --git a/direct/src/particles/Particles.py b/direct/src/particles/Particles.py index 8ca0b475ba..8739c69eaf 100644 --- a/direct/src/particles/Particles.py +++ b/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)