X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmodel%2Fparticles.cxx;h=a7fee2ded106e3dbb4c69bd8570bd6f930ddd6f6;hb=32a6bd78d8bf143f40922f1a0bc7a88ea7706a7d;hp=08037900a4c51dddc335efd0512b010bd3004ebd;hpb=5d04cb81ba3c3779ad6dad5780fb7554d5f3865a;p=simgear.git diff --git a/simgear/scene/model/particles.cxx b/simgear/scene/model/particles.cxx index 08037900..a7fee2de 100644 --- a/simgear/scene/model/particles.cxx +++ b/simgear/scene/model/particles.cxx @@ -1,6 +1,6 @@ // particles.cxx - classes to manage particles -// started in 2008 by Tiago Gusmão, using animation.hxx as reference -// Copyright (C) 2008 Tiago Gusmão +// started in 2008 by Tiago Gusm�o, using animation.hxx as reference +// Copyright (C) 2008 Tiago Gusm�o // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -21,11 +21,10 @@ # include #endif -#include -#include #include #include #include +#include #include #include @@ -45,10 +44,6 @@ #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) @@ -62,11 +57,13 @@ void GlobalParticleCallback::operator()(osg::Node* node, osg::NodeVisitor* nv) 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:"< Particles::commonRoot; osg::ref_ptr Particles::psu = new osgParticle::ParticleSystemUpdater; -osg::ref_ptr Particles::commonGeode = new osg::Geode;; +osg::ref_ptr Particles::commonGeode = new osg::Geode; osg::Vec3 Particles::_wind; bool Particles::_frozen = false; @@ -113,6 +110,7 @@ osg::Group* Particles::getCommonRoot() commonGeode.get()->setName("common particle system geode"); commonRoot.get()->addChild(commonGeode.get()); commonRoot.get()->addChild(psu.get()); + commonRoot->setNodeMask( ~simgear::MODELLIGHT_BIT ); } return commonRoot.get(); } @@ -133,7 +131,7 @@ void transformParticles(osgParticle::ParticleSystem* particleSys, osg::Group * Particles::appendParticles(const SGPropertyNode* configNode, SGPropertyNode* modelRoot, - const osgDB::ReaderWriter::Options* + const osgDB::Options* options) { SG_LOG(SG_GENERAL, SG_DEBUG, "Setting up a particle system!\n"); @@ -190,19 +188,12 @@ osg::Group * Particles::appendParticles(const SGPropertyNode* configNode, osg::Geode* g = new osg::Geode; align->addChild(g); g->addDrawable(particleSys); -#ifndef OSG_PARTICLE_FIX - emitter->setReferenceFrame(osgParticle::Emitter::ABSOLUTE_RF); -#endif } else { -#ifdef OSG_PARTICLE_FIX callback()->particleFrame = new osg::MatrixTransform(); osg::Geode* g = new osg::Geode; g->addDrawable(particleSys); callback()->particleFrame->addChild(g); getCommonRoot()->addChild(callback()->particleFrame.get()); -#else - getCommonGeode()->addDrawable(particleSys); -#endif } std::string textureFile; if (configNode->hasValue("texture")) { @@ -475,14 +466,7 @@ osg::Group * Particles::appendParticles(const SGPropertyNode* configNode, program->setFluidToWater(); if (programnode->getBoolValue("gravity", true)) { -#ifdef OSG_PARTICLE_FIX program->setToGravity(); -#else - if (attach == "world") - callback()->setupProgramGravity(true); - else - program->setToGravity(); -#endif } else program->setAcceleration(osg::Vec3(0,0,0)); @@ -543,7 +527,7 @@ void Particles::operator()(osg::Node* node, osg::NodeVisitor* nv) particleSys->getDefaultParticleTemplate().setSizeRange(osgParticle::rangef(startSize, endSize)); if (lifeValue) particleSys->getDefaultParticleTemplate().setLifeTime(lifeValue->getValue()); -#ifdef OSG_PARTICLE_FIX + if (particleFrame.valid()) { MatrixList mlist = node->getWorldMatrices(); if (!mlist.empty()) { @@ -556,7 +540,7 @@ void Particles::operator()(osg::Node* node, osg::NodeVisitor* nv) // Make new frame for particle system, coincident with // the emitter frame, but oriented with local Z. SGGeod geod = SGGeod::fromCart(toSG(emitOrigin)); - Matrix newParticleMat = geod.makeZUpFrame(); + Matrix newParticleMat = makeZUpFrame(geod); Matrix changeParticleFrame = particleMat * Matrix::inverse(newParticleMat); particleFrame->setMatrix(newParticleMat); @@ -566,13 +550,5 @@ void Particles::operator()(osg::Node* node, osg::NodeVisitor* nv) } if (program.valid() && useWind) program->setWind(_wind); -#else - if (program.valid()) { - if (useGravity) - program->setAcceleration(GlobalParticleCallback::getGravityVector()); - if (useWind) - program->setWind(GlobalParticleCallback::getWindVector()); - } -#endif } } // namespace simgear