/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 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. */ //osgParticle - Copyright (C) 2002 Marco Jez #ifndef OSGPARTICLE_RANGE_ #define OSGPARTICLE_RANGE_ 1 // include Export simply to disable Visual Studio silly warnings. #include #ifndef __sgi #include #else #include #endif #include #include #include //using std::rand; namespace osgParticle { /** A simple struct template useful to store ranges of values as min/max pairs. This struct template helps storing min/max ranges for values of any kind; class T_ is the type of values to be stored, and it must support operations T_ + T_, T_ - T_, and T_ * float, otherwise the get_random() method will not compile. This struct could be extended to customize the random number generator (now it uses only std::rand()). */ template struct range { /// Lower bound. T_ minimum; /// Higher bound. T_ maximum; /// Construct the object by calling default constructors for min and max. range() : minimum(T_()), maximum(T_()) {} /// Construct and initialize min and max directly. range(const T_ &mn, const T_ &mx) : minimum(mn), maximum(mx) {} /// Set min and max. void set(const T_ &mn, const T_ &mx) { minimum = mn; maximum = mx; } /// Get a random value between min and max. T_ get_random() const { return minimum + (maximum - minimum) * rand() / RAND_MAX; } /// Get a random square root value between min and max. T_ get_random_sqrtf() const { return minimum + (maximum - minimum) * sqrtf( static_cast(rand()) / static_cast(RAND_MAX) ); } }; /// Range of floats. typedef range rangef; /// Range of osg::Vec2s. typedef range rangev2; /// Range of osg::Vec3s. typedef range rangev3; /// Range of osg::Vec4s. typedef range rangev4; } #endif