Program 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
  2. *
  3. * This library is open source and may be redistributed and/or modified under
  4. * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
  5. * (at your option) any later version. The full license is in LICENSE file
  6. * included with this distribution, and on the openscenegraph.org website.
  7. *
  8. * This library is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * OpenSceneGraph Public License for more details.
  12. */
  13. //osgParticle - Copyright (C) 2002 Marco Jez
  14. #ifndef OSGPARTICLE_PROGRAM
  15. #define OSGPARTICLE_PROGRAM 1
  16. #include <osgParticle/Export>
  17. #include <osgParticle/ParticleProcessor>
  18. #include <osg/Object>
  19. #include <osg/Node>
  20. #include <osg/NodeVisitor>
  21. #include <osg/CopyOp>
  22. namespace osgParticle
  23. {
  24. /** An abstract <CODE>ParticleProcessor</CODE> descendant for modifying particles "on the fly"
  25. during the cull traversal.
  26. Descendants of this class must implement the <CODE>execute()</CODE> method, which should iterate
  27. through all particles in the linked particle system and modify them somehow
  28. (usually updating their velocity vector).
  29. */
  30. class OSGPARTICLE_EXPORT Program: public ParticleProcessor
  31. {
  32. public:
  33. Program();
  34. Program(const Program& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
  35. virtual const char* libraryName() const { return "osgParticle"; }
  36. virtual const char* className() const { return "Program"; }
  37. virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const Program*>(obj) != 0; }
  38. virtual void accept(osg::NodeVisitor& nv) { if (nv.validNodeMask(*this)) { nv.pushOntoNodePath(this); nv.apply(*this); nv.popFromNodePath(); } }
  39. protected:
  40. virtual ~Program() {}
  41. Program& operator=(const Program&) { return *this; }
  42. /// Implementation of <CODE>ParticleProcessor::process()</CODE>. Do not call this method by yourself.
  43. inline void process(double dt);
  44. /// Execute the program on the particle system. Must be overridden in descendant classes.
  45. virtual void execute(double dt) = 0;
  46. private:
  47. };
  48. // INLINE FUNCTIONS
  49. inline void Program::process(double dt)
  50. {
  51. execute(dt);
  52. }
  53. }
  54. #endif