diff --git a/src/osgParticle/ExplosionDebriEffect.cpp b/src/osgParticle/ExplosionDebriEffect.cpp index eda46f5ac..a2273624c 100644 --- a/src/osgParticle/ExplosionDebriEffect.cpp +++ b/src/osgParticle/ExplosionDebriEffect.cpp @@ -55,8 +55,6 @@ void ExplosionDebriEffect::setDefaults() // set up unit particle. _defaultParticleTemplate.setLifeTime(1.0+0.6*_scale); - _defaultParticleTemplate.setRadius(1.0f); - _defaultParticleTemplate.setMass(osg::PI*4.0f/3.0f); _defaultParticleTemplate.setSizeRange(osgParticle::rangef(0.75f, 3.0f)); _defaultParticleTemplate.setAlphaRange(osgParticle::rangef(0.0f, 1.0f)); _defaultParticleTemplate.setColorRange(osgParticle::rangev4( @@ -93,9 +91,8 @@ void ExplosionDebriEffect::setUpEmitterAndProgram() ptemplate.setColorRange(_defaultParticleTemplate.getColorRange()); // these are physical properties of the particle - float r = _defaultParticleTemplate.getRadius()*radius; - ptemplate.setRadius(r); - ptemplate.setMass(density*r*r*r*_defaultParticleTemplate.getMass()); + ptemplate.setRadius(radius); + ptemplate.setMass(density*radius*radius*radius*osg::PI*4.0f/3.0f); } diff --git a/src/osgParticle/ExplosionEffect.cpp b/src/osgParticle/ExplosionEffect.cpp index c0e473274..e0f06a4e9 100644 --- a/src/osgParticle/ExplosionEffect.cpp +++ b/src/osgParticle/ExplosionEffect.cpp @@ -54,13 +54,11 @@ void ExplosionEffect::setDefaults() // set up unit particle. _defaultParticleTemplate.setLifeTime(0.5+0.1*_scale); - _defaultParticleTemplate.setRadius(1.0f); - _defaultParticleTemplate.setMass(osg::PI*4.0f/3.0f); _defaultParticleTemplate.setSizeRange(osgParticle::rangef(0.75f, 3.0f)); _defaultParticleTemplate.setAlphaRange(osgParticle::rangef(0.1f, 1.0f)); _defaultParticleTemplate.setColorRange(osgParticle::rangev4( - osg::Vec4(1.0f, 0.8f, 0.2f, 1.0f), - osg::Vec4(1.0f, 0.4f, 0.1f, 0.0f))); + osg::Vec4(1.0f, 0.8f, 0.2f, 1.0f), + osg::Vec4(1.0f, 0.4f, 0.1f, 0.0f))); } @@ -92,9 +90,8 @@ void ExplosionEffect::setUpEmitterAndProgram() ptemplate.setColorRange(_defaultParticleTemplate.getColorRange()); // these are physical properties of the particle - float r = _defaultParticleTemplate.getRadius()*radius; - ptemplate.setRadius(r); - ptemplate.setMass(density*r*r*r*_defaultParticleTemplate.getMass()); + ptemplate.setRadius(radius); + ptemplate.setMass(density*radius*radius*radius*osg::PI*4.0f/3.0f); } diff --git a/src/osgParticle/FireEffect.cpp b/src/osgParticle/FireEffect.cpp index 9b49df35e..2c1c35d78 100644 --- a/src/osgParticle/FireEffect.cpp +++ b/src/osgParticle/FireEffect.cpp @@ -54,8 +54,6 @@ void FireEffect::setDefaults() // set up unit particle. _defaultParticleTemplate.setLifeTime(0.5+0.1*_scale); - _defaultParticleTemplate.setRadius(1.0f); - _defaultParticleTemplate.setMass(osg::PI*4.0f/3.0f); _defaultParticleTemplate.setSizeRange(osgParticle::rangef(0.75f, 3.0f)); _defaultParticleTemplate.setAlphaRange(osgParticle::rangef(0.1f, 1.0f)); _defaultParticleTemplate.setColorRange(osgParticle::rangev4( @@ -91,9 +89,9 @@ void FireEffect::setUpEmitterAndProgram() ptemplate.setColorRange(_defaultParticleTemplate.getColorRange()); // these are physical properties of the particle - float r = _defaultParticleTemplate.getRadius()*radius; - ptemplate.setRadius(r); - ptemplate.setMass(density*r*r*r*_defaultParticleTemplate.getMass()); + // these are physical properties of the particle + ptemplate.setRadius(radius); + ptemplate.setMass(density*radius*radius*radius*osg::PI*4.0f/3.0f); } diff --git a/src/osgParticle/SmokeEffect.cpp b/src/osgParticle/SmokeEffect.cpp index 7de9b2df8..1074582ae 100644 --- a/src/osgParticle/SmokeEffect.cpp +++ b/src/osgParticle/SmokeEffect.cpp @@ -50,8 +50,6 @@ void SmokeEffect::setDefaults() // set up unit particle. _defaultParticleTemplate.setLifeTime(5.0*_scale); - _defaultParticleTemplate.setRadius(1.0f); - _defaultParticleTemplate.setMass(osg::PI*4.0f/3.0f); _defaultParticleTemplate.setSizeRange(osgParticle::rangef(0.75f, 3.0f)); _defaultParticleTemplate.setAlphaRange(osgParticle::rangef(0.1f, 1.0f)); _defaultParticleTemplate.setColorRange(osgParticle::rangev4( @@ -88,9 +86,8 @@ void SmokeEffect::setUpEmitterAndProgram() ptemplate.setColorRange(_defaultParticleTemplate.getColorRange()); // these are physical properties of the particle - float r = _defaultParticleTemplate.getRadius()*radius; - ptemplate.setRadius(r); - ptemplate.setMass(density*r*r*r*_defaultParticleTemplate.getMass()); + ptemplate.setRadius(radius); + ptemplate.setMass(density*radius*radius*radius*osg::PI*4.0f/3.0f); } diff --git a/src/osgPlugins/osgParticle/IO_ParticleEffect.cpp b/src/osgPlugins/osgParticle/IO_ParticleEffect.cpp index 57a453fc4..4168e597c 100644 --- a/src/osgPlugins/osgParticle/IO_ParticleEffect.cpp +++ b/src/osgPlugins/osgParticle/IO_ParticleEffect.cpp @@ -24,6 +24,13 @@ bool ParticleEffect_readLocalData(osg::Object& object, osgDB::Input& fr) osgParticle::ParticleEffect& effect = static_cast(object); bool itrAdvanced = false; + if (fr.matchSequence("position %s")) + { + effect.setTextureFileName(fr[1].getStr()); + fr += 2; + itrAdvanced = true; + } + if (fr.matchSequence("position %f %f %f")) { osg::Vec3 position; @@ -77,16 +84,59 @@ bool ParticleEffect_readLocalData(osg::Object& object, osgDB::Input& fr) itrAdvanced = true; } + osgParticle::Particle particle = effect.getDefaultParticleTemplate(); + bool particleSet = false; + if (fr.matchSequence("particleDuration %f")) { float particleDuration; fr[1].getFloat(particleDuration); - effect.setParticleDuration(particleDuration); - + particle.setLifeTime(particleDuration); + particleSet = true; fr += 2; itrAdvanced = true; } - + + if (fr[0].matchWord("particleSizeRange")) + { + osgParticle::rangef r; + if (fr[1].getFloat(r.minimum) && fr[2].getFloat(r.maximum)) + { + particle.setSizeRange(r); + particleSet = true; + fr += 3; + itrAdvanced = true; + } + } + if (fr[0].matchWord("particleAlphaRange")) + { + osgParticle::rangef r; + if (fr[1].getFloat(r.minimum) && fr[2].getFloat(r.maximum)) + { + particle.setAlphaRange(r); + particleSet = true; + fr += 3; + itrAdvanced = true; + } + } + if (fr[0].matchWord("particleColorRange")) + { + osgParticle::rangev4 r; + if (fr[1].getFloat(r.minimum.x()) && fr[2].getFloat(r.minimum.y()) && fr[3].getFloat(r.minimum.z()) && fr[4].getFloat(r.minimum.w()) && + fr[5].getFloat(r.maximum.x()) && fr[6].getFloat(r.maximum.y()) && fr[7].getFloat(r.maximum.z()) && fr[8].getFloat(r.maximum.w())) + { + particle.setColorRange(r); + particleSet = true; + fr += 9; + itrAdvanced = true; + } + } + + if (particleSet) + { + effect.setDefaultParticleTemplate(particle); + } + if (fr.matchSequence("wind %f %f %f")) { @@ -136,12 +186,25 @@ bool ParticleEffect_writeLocalData(const osg::Object& object, osgDB::Output& fw) { const osgParticle::ParticleEffect& effect = static_cast(object); + fw.indent()<<"textFileName "<