//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_PROGRAM_ #define OSGPARTICLE_PROGRAM_ 1 #include #include #include #include #include #include namespace osgParticle { /** An abstract ParticleProcessor descendant for modifying particles "on the fly" during the cull traversal. Descendants of this class must implement the execute() method, which should iterate through all particles in the linked particle system and modify them somehow (usually updating their velocity vector). */ class OSGPARTICLE_EXPORT Program: public ParticleProcessor { public: Program(); Program(const Program ©, const osg::CopyOp ©op = osg::CopyOp::SHALLOW_COPY); virtual const char *libraryName() const { return "osgParticle"; } virtual const char *className() const { return "Program"; } virtual bool isSameKindAs(const osg::Object *obj) { return dynamic_cast(obj) != 0; } virtual void accept(osg::NodeVisitor& nv) { if (nv.validNodeMask(*this)) { nv.pushOntoNodePath(this); nv.apply(*this); nv.popFromNodePath(); } } protected: virtual ~Program() {} Program &operator=(const Program &) { return *this; } /// Implementation of ParticleProcessor::process(). Do not call this method by yourself. inline void process(double dt); /// Execute the program on the particle system. Must be overriden in descendant classes. virtual void execute(double dt) = 0; private: }; // INLINE FUNCTIONS inline void Program::process(double dt) { execute(dt); } } #endif