//C++ header - Open Scene Graph - Copyright (C) 1998-2002 Robert Osfield //Distributed under the terms of the GNU Library General Public License (LGPL) //as published by the Free Software Foundation. //osgParticle - Copyright (C) 2002 Marco Jez #ifndef OSGPARTICLE_FORCEOPERATOR_ #define OSGPARTICLE_FORCEOPERATOR_ 1 #include #include #include #include #include #include namespace osgParticle { /** An operator that applies a constant force to the particles. Remember that if the mass of particles is expressed in kg and the lengths are expressed in meters, then the force should be expressed in Newtons. */ class ForceOperator: public Operator { public: inline ForceOperator(); inline ForceOperator(const ForceOperator ©, const osg::CopyOp ©op = osg::CopyOp::SHALLOW_COPY); META_Object(osgParticle, ForceOperator); /// Get the force vector. inline const osg::Vec3 &getForce() const; /// Set the force vector. inline void setForce(const osg::Vec3 &f); /// Apply the force to a particle. Do not call this method manually. inline void operate(Particle *P, double dt); /// Perform some initialization. Do not call this method manually. inline void beginOperate(Program *prg); protected: virtual ~ForceOperator() {}; ForceOperator &operator=(const ForceOperator &) { return *this; } private: osg::Vec3 force_; osg::Vec3 xf_force_; }; // INLINE FUNCTIONS inline ForceOperator::ForceOperator() : Operator(), force_(0, 0, 0) { } inline ForceOperator::ForceOperator(const ForceOperator ©, const osg::CopyOp ©op) : Operator(copy, copyop), force_(copy.force_) { } inline const osg::Vec3 &ForceOperator::getForce() const { return force_; } inline void ForceOperator::setForce(const osg::Vec3 &v) { force_ = v; } inline void ForceOperator::operate(Particle *P, double dt) { P->addVelocity(xf_force_ * (P->getMassInv() * dt)); } inline void ForceOperator::beginOperate(Program *prg) { if (prg->getReferenceFrame() == ModularProgram::RELATIVE_TO_PARENTS) { xf_force_ = prg->rotateLocalToWorld(force_); } else { xf_force_ = force_; } } } #endif