]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/particles.cxx
Merge branch 'jmt/waypt' into next
[simgear.git] / simgear / scene / model / particles.cxx
index 0194e960c4ff9a91a712e659efdf04f1758aa840..b5687ed41e2f04465620da3927d67af118cf7af6 100644 (file)
@@ -26,6 +26,7 @@
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/props/props.hxx>
 #include <simgear/props/props_io.hxx>
+#include <simgear/structure/OSGVersion.hxx>
 
 #include <osgParticle/SmokeTrailEffect>
 #include <osgParticle/FireEffect>
 
 #include "particles.hxx"
 
+#if SG_OSG_VERSION >= 27004
+#define OSG_PARTICLE_FIX 1
+#endif
+
 namespace simgear
 {
 void GlobalParticleCallback::operator()(osg::Node* node, osg::NodeVisitor* nv)
 {
+    enabled = !enabledNode || enabledNode->getBoolValue();
+    if (!enabled)
+        return;
     SGQuatd q
         = SGQuatd::fromLonLatDeg(modelRoot->getFloatValue("/position/longitude-deg",0),
                                  modelRoot->getFloatValue("/position/latitude-deg",0));
-    osg::Matrix om(q.osg());
+    osg::Matrix om(toOsg(q));
     osg::Vec3 v(0,0,9.81);
     gravity = om.preMult(v);
     const osg::Vec3& zUpWind = Particles::getWindVector();
@@ -65,6 +73,8 @@ void GlobalParticleCallback::operator()(osg::Node* node, osg::NodeVisitor* nv)
 //static members
 osg::Vec3 GlobalParticleCallback::gravity;
 osg::Vec3 GlobalParticleCallback::wind;
+bool GlobalParticleCallback::enabled = true;
+SGConstPropertyNode_ptr GlobalParticleCallback::enabledNode = 0;
 
 osg::ref_ptr<osg::Group> Particles::commonRoot;
 osg::ref_ptr<osgParticle::ParticleSystemUpdater> Particles::psu = new osgParticle::ParticleSystemUpdater;
@@ -106,8 +116,6 @@ osg::Group* Particles::getCommonRoot()
     return commonRoot.get();
 }
 
-// Enable this once particle fix is in OSG.
-// #define OSG_PARTICLE_FIX 1
 void transformParticles(osgParticle::ParticleSystem* particleSys,
                         const osg::Matrix& mat)
 {
@@ -513,7 +521,7 @@ void Particles::operator()(osg::Node* node, osg::NodeVisitor* nv)
     else if (counterCond)
         counter->setRateRange(counterStaticValue,
                               counterStaticValue + counterStaticExtraRange);
-    if (counterCond && !counterCond->test())
+    if (!GlobalParticleCallback::getEnabled() || (counterCond && !counterCond->test()))
         counter->setRateRange(0, 0);
     bool colorchange=false;
     for (int i = 0; i < 8; ++i) {
@@ -544,7 +552,7 @@ void Particles::operator()(osg::Node* node, osg::NodeVisitor* nv)
             if (displace * displace > 10000.0 * 10000.0) {
                 // Make new frame for particle system, coincident with
                 // the emitter frame, but oriented with local Z.
-                SGGeod geod = SGGeod::fromCart(SGVec3d(emitOrigin));
+                SGGeod geod = SGGeod::fromCart(toSG(emitOrigin));
                 Matrix newParticleMat = geod.makeZUpFrame();
                 Matrix changeParticleFrame
                     = particleMat * Matrix::inverse(newParticleMat);