BoxPlacer 5.02 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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.
*/
//Build by Zach Deedler

#ifndef OSGPARTICLE_BOX_PLACER
#define OSGPARTICLE_BOX_PLACER 1

#include <osgParticle/CenteredPlacer>
#include <osgParticle/Particle>
#include <osgParticle/range>

#include <osg/CopyOp>
#include <osg/Object>
#include <osg/Vec3>
#include <osg/Math>

namespace osgParticle
{

    /** A box-shaped particle placer.
        This placer sets the initial position of incoming particle by choosing a random position 
        within the volume of a box; this placer is defined by four parameters: a <I>center point</I>, 
        which is inherited directly from <CODE>osgParticle::CenteredPlacer</CODE>, and three ranges of values 
    for the valid <I>X</I>, <I>Y</I>, and <I>Z</I> coordinates.
    */
    class BoxPlacer: public CenteredPlacer {
    public:
        inline BoxPlacer();
        inline BoxPlacer(const BoxPlacer& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
        
        /// Get the range of possible values along the X axis.
        inline const rangef& getXRange() const;
        
        /// Set the range of possible values along the X axis.
        inline void setXRange(const rangef& r);
        
        /// Set the range of possible values along the X axis.
        inline void setXRange(float r1, float r2);
        
        /// Get the range of possible values along the Y axis.
        inline const rangef& getYRange() const;        
        
        /// Set the range of possible values along the Y axis.
        inline void setYRange(const rangef& r);
        
        /// Set the range of possible values along the Y axis.
        inline void setYRange(float r1, float r2);    

        /// Get the range of possible values along the Z axis.
        inline const rangef& getZRange() const;   

        /// Set the range of possible values along the Z axis.
        inline void setZRange(const rangef& r);
        
        /// Set the range of possible values along the Z axis.
        inline void setZRange(float r1, float r2);  

        META_Object(osgParticle, BoxPlacer);
        
        /// Place a particle. Do not call it manually.
        inline void place(Particle* P) const;
        
        /// return the volume of the box
        inline float volume() const;

        /// return the control position
        inline osg::Vec3 getControlPosition() const;

    protected:
        virtual ~BoxPlacer() {}
        BoxPlacer& operator=(const BoxPlacer&) { return *this; }        
        
    private:
        rangef _x_range;
        rangef _y_range;
        rangef _z_range;
    };

    // INLINE FUNCTIONS
    
    inline BoxPlacer::BoxPlacer()
    : CenteredPlacer(), _x_range(-1, 1), _y_range(-1, 1), _z_range(-1, 1)
    {
    }
    
    inline BoxPlacer::BoxPlacer(const BoxPlacer& copy, const osg::CopyOp& copyop)
    : CenteredPlacer(copy, copyop), 
    _x_range(copy._x_range), _y_range(copy._y_range), _z_range(copy._z_range)
    {
    }
    
    inline const rangef& BoxPlacer::getXRange() const
    {
        return _x_range;
    }

    inline void BoxPlacer::setXRange(const rangef& r)
    {
        _x_range = r;
    }
    
    inline void BoxPlacer::setXRange(float r1, float r2)
    {
        _x_range.minimum = r1;
        _x_range.maximum = r2;
    }

    inline const rangef& BoxPlacer::getYRange() const
    {
        return _y_range;
    }
    
    inline void BoxPlacer::setYRange(const rangef& r)
    {
        _y_range = r;
    }
    
    inline void BoxPlacer::setYRange(float r1, float r2)
    {
        _y_range.minimum = r1;
        _y_range.maximum = r2;
    }

    inline const rangef& BoxPlacer::getZRange() const
    {
        return _z_range;
    }

    inline void BoxPlacer::setZRange(const rangef& r)
    {
        _z_range = r;
    }
    
    inline void BoxPlacer::setZRange(float r1, float r2)
    {
        _z_range.minimum = r1;
        _z_range.maximum = r2;
    }

    inline void BoxPlacer::place(Particle* P) const
    {
        osg::Vec3 pos(
            getCenter().x() + _x_range.get_random(), 
            getCenter().y() + _y_range.get_random(), 
            getCenter().z() + _z_range.get_random());
        
        P->setPosition(pos);
    }
    
    inline float BoxPlacer::volume() const
    {
        return (_x_range.maximum - _x_range.minimum) *
               (_y_range.maximum - _y_range.minimum) *
               (_z_range.maximum - _z_range.minimum);
    }

    inline osg::Vec3 BoxPlacer::getControlPosition() const
    {
        return getCenter();
    }

}

#endif