#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)
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);
+ // NOTE: THIS WIND COMPUTATION DOESN'T SEEM TO AFFECT PARTICLES
const osg::Vec3& zUpWind = Particles::getWindVector();
- osg::Vec3 w(zUpWind.y(), zUpWind.x(), - zUpWind.z());
+ osg::Vec3 w(zUpWind.y(), zUpWind.x(), -zUpWind.z());
wind = om.preMult(w);
- //SG_LOG(SG_GENERAL, SG_ALERT, "wind vector:"<<w[0]<<","<<w[1]<<","<<w[2]<<"\n");
+ // SG_LOG(SG_GENERAL, SG_ALERT,
+ // "wind vector:" << w[0] << "," <<w[1] << "," << w[2]);
}
osg::ref_ptr<osgParticle::ParticleSystemUpdater> Particles::psu = new osgParticle::ParticleSystemUpdater;
osg::ref_ptr<osg::Geode> Particles::commonGeode = new osg::Geode;;
osg::Vec3 Particles::_wind;
+bool Particles::_frozen = false;
Particles::Particles() :
useGravity(false),
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)
{
void Particles::operator()(osg::Node* node, osg::NodeVisitor* nv)
{
//SG_LOG(SG_GENERAL, SG_ALERT, "callback!\n");
+ this->particleSys->setFrozen(_frozen);
+
using namespace osg;
if (shooterValue)
shooter->setInitialSpeedRange(shooterValue->getValue(),
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);