SinkOperator
Go to the documentation of this file.
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2010 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
// Written by Wang Rui, (C) 2010
#ifndef OSGPARTICLE_SINKOPERATOR
#define OSGPARTICLE_SINKOPERATOR
#include <osgParticle/Particle>
#include <osgParticle/DomainOperator>
namespace osgParticle
{
class OSGPARTICLE_EXPORT SinkOperator : public DomainOperator
{
public:
enum SinkTarget { SINK_POSITION, SINK_VELOCITY, SINK_ANGULAR_VELOCITY };
enum SinkStrategy { SINK_INSIDE, SINK_OUTSIDE };
SinkOperator()
: DomainOperator(), _sinkTarget(SINK_POSITION), _sinkStrategy(SINK_INSIDE)
{}
SinkOperator( const SinkOperator& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY )
: DomainOperator(copy, copyop), _sinkTarget(copy._sinkTarget), _sinkStrategy(copy._sinkStrategy)
{}
META_Object( osgParticle, SinkOperator );
void setSinkTarget( SinkTarget so ) { _sinkTarget = so; }
SinkTarget getSinkTarget() const { return _sinkTarget; }
void setSinkStrategy( SinkStrategy ss ) { _sinkStrategy = ss; }
SinkStrategy getSinkStrategy() const { return _sinkStrategy; }
void beginOperate( Program* prg );
protected:
virtual ~SinkOperator() {}
SinkOperator& operator=( const SinkOperator& ) { return *this; }
virtual void handlePoint( const Domain& domain, Particle* P, double dt );
virtual void handleLineSegment( const Domain& domain, Particle* P, double dt );
virtual void handleTriangle( const Domain& domain, Particle* P, double dt );
virtual void handleRectangle( const Domain& domain, Particle* P, double dt );
virtual void handlePlane( const Domain& domain, Particle* P, double dt );
virtual void handleSphere( const Domain& domain, Particle* P, double dt );
virtual void handleBox( const Domain& domain, Particle* P, double dt );
virtual void handleDisk( const Domain& domain, Particle* P, double dt );
inline const osg::Vec3& getValue( Particle* P );
inline void kill( Particle* P, bool insideDomain );
SinkTarget _sinkTarget;
SinkStrategy _sinkStrategy;
};
// INLINE METHODS
inline const osg::Vec3& SinkOperator::getValue( Particle* P )
{
switch ( _sinkTarget )
{
case SINK_VELOCITY: return P->getVelocity();
case SINK_ANGULAR_VELOCITY: return P->getAngularVelocity();
case SINK_POSITION: default: return P->getPosition();
}
}
inline void SinkOperator::kill( Particle* P, bool insideDomain )
{
if ( !((_sinkStrategy==SINK_INSIDE) ^ insideDomain) )
P->kill();
}
}
#endif
DomainOperator
Particle
osgParticle::DomainOperator::DomainOperator
DomainOperator()
Definition DomainOperator:60
osgParticle::Particle
Definition Particle:47
osgParticle::Particle::kill
void kill()
Definition Particle:443
osgParticle::Particle::getPosition
const osg::Vec3 & getPosition() const
Get the position vector.
Definition Particle:403
osgParticle::Particle::getVelocity
const osg::Vec3 & getVelocity() const
Definition Particle:408
osgParticle::Particle::getAngularVelocity
const osg::Vec3 & getAngularVelocity() const
Get the rotational velocity vector.
Definition Particle:423
osgParticle::Program
Definition osgParticle/Program:36
osgParticle::SinkOperator::handleLineSegment
virtual void handleLineSegment(const Domain &domain, Particle *P, double dt)
osgParticle::SinkOperator::handleBox
virtual void handleBox(const Domain &domain, Particle *P, double dt)
osgParticle::SinkOperator::SinkOperator
SinkOperator(const SinkOperator &copy, const osg::CopyOp &copyop=osg::CopyOp::SHALLOW_COPY)
Definition SinkOperator:38
osgParticle::SinkOperator::META_Object
META_Object(osgParticle, SinkOperator)
osgParticle::SinkOperator::SinkTarget
SinkTarget
Definition SinkOperator:31
osgParticle::SinkOperator::SINK_POSITION
@ SINK_POSITION
Definition SinkOperator:31
osgParticle::SinkOperator::SINK_ANGULAR_VELOCITY
@ SINK_ANGULAR_VELOCITY
Definition SinkOperator:31
osgParticle::SinkOperator::SINK_VELOCITY
@ SINK_VELOCITY
Definition SinkOperator:31
osgParticle::SinkOperator::setSinkTarget
void setSinkTarget(SinkTarget so)
Set the sink strategy.
Definition SinkOperator:45
osgParticle::SinkOperator::SinkOperator
SinkOperator()
Definition SinkOperator:34
osgParticle::SinkOperator::operator=
SinkOperator & operator=(const SinkOperator &)
Definition SinkOperator:61
osgParticle::SinkOperator::handleRectangle
virtual void handleRectangle(const Domain &domain, Particle *P, double dt)
osgParticle::SinkOperator::kill
void kill(Particle *P, bool insideDomain)
Definition SinkOperator:91
osgParticle::SinkOperator::getValue
const osg::Vec3 & getValue(Particle *P)
Definition SinkOperator:81
osgParticle::SinkOperator::setSinkStrategy
void setSinkStrategy(SinkStrategy ss)
Set the sink strategy.
Definition SinkOperator:51
osgParticle::SinkOperator::~SinkOperator
virtual ~SinkOperator()
Definition SinkOperator:60
osgParticle::SinkOperator::beginOperate
void beginOperate(Program *prg)
Perform some initializations. Do not call this method manually.
osgParticle::SinkOperator::_sinkTarget
SinkTarget _sinkTarget
Definition SinkOperator:75
osgParticle::SinkOperator::getSinkStrategy
SinkStrategy getSinkStrategy() const
Get the sink strategy.
Definition SinkOperator:54
osgParticle::SinkOperator::_sinkStrategy
SinkStrategy _sinkStrategy
Definition SinkOperator:76
osgParticle::SinkOperator::handlePlane
virtual void handlePlane(const Domain &domain, Particle *P, double dt)
osgParticle::SinkOperator::handleDisk
virtual void handleDisk(const Domain &domain, Particle *P, double dt)
osgParticle::SinkOperator::SinkStrategy
SinkStrategy
Definition SinkOperator:32
osgParticle::SinkOperator::SINK_OUTSIDE
@ SINK_OUTSIDE
Definition SinkOperator:32
osgParticle::SinkOperator::SINK_INSIDE
@ SINK_INSIDE
Definition SinkOperator:32
osgParticle::SinkOperator::handleSphere
virtual void handleSphere(const Domain &domain, Particle *P, double dt)
osgParticle::SinkOperator::handleTriangle
virtual void handleTriangle(const Domain &domain, Particle *P, double dt)
osgParticle::SinkOperator::getSinkTarget
SinkTarget getSinkTarget() const
Get the sink strategy.
Definition SinkOperator:48
osgParticle::SinkOperator::handlePoint
virtual void handlePoint(const Domain &domain, Particle *P, double dt)
osg::CopyOp
Definition CopyOp:41
osg::CopyOp::SHALLOW_COPY
@ SHALLOW_COPY
Definition CopyOp:47
osgParticle
Definition AccelOperator:27
osg::Vec3
Vec3f Vec3
Definition Vec3:21
OSGPARTICLE_EXPORT
#define OSGPARTICLE_EXPORT
Definition osgParticle/Export:40
osgParticle::DomainOperator::Domain
Definition DomainOperator:34