diff --git a/include/osg/Math b/include/osg/Math index c16b8af91..7bbe7b954 100644 --- a/include/osg/Math +++ b/include/osg/Math @@ -138,6 +138,9 @@ inline T clampAbove(T v,T minimum) { return v inline T clampBelow(T v,T maximum) { return v>maximum?maximum:v; } +template +inline T clampBetween(T v,T minimum, T maximum) { return clampBelow(clampAbove(v,minimum),maximum); } + template inline T sign(T v) { return v<(T)0?(T)-1:(T)1; } diff --git a/include/osgUtil/CubeMapGenerator b/include/osgUtil/CubeMapGenerator index 56e200106..358406043 100644 --- a/include/osgUtil/CubeMapGenerator +++ b/include/osgUtil/CubeMapGenerator @@ -28,93 +28,93 @@ namespace osgUtil { - /** This is the base class for cube map generators. - It exposes the necessary interface to access the six generated images; - descendants should only override the compute_color() method. - */ - class OSGUTIL_EXPORT CubeMapGenerator: public osg::Referenced { - public: - explicit CubeMapGenerator(int texture_size = 64); - CubeMapGenerator(const CubeMapGenerator ©, const osg::CopyOp ©op = osg::CopyOp::SHALLOW_COPY); + /** This is the base class for cube map generators. + It exposes the necessary interface to access the six generated images; + descendants should only override the compute_color() method. + */ + class OSGUTIL_EXPORT CubeMapGenerator: public osg::Referenced { + public: + explicit CubeMapGenerator(int texture_size = 64); + CubeMapGenerator(const CubeMapGenerator ©, const osg::CopyOp ©op = osg::CopyOp::SHALLOW_COPY); - inline osg::Image *getImage(osg::TextureCubeMap::Face face); - inline const osg::Image *getImage(osg::TextureCubeMap::Face face) const; + inline osg::Image *getImage(osg::TextureCubeMap::Face face); + inline const osg::Image *getImage(osg::TextureCubeMap::Face face) const; - /** generate the six cube images. - If use_osg_system is true, then the OSG's coordinate system is used instead - of the default OpenGL one. - */ - void generateMap(bool use_osg_system = true); + /** generate the six cube images. + If use_osg_system is true, then the OSG's coordinate system is used instead + of the default OpenGL one. + */ + void generateMap(bool use_osg_system = true); - protected: - virtual ~CubeMapGenerator() {} - CubeMapGenerator &operator=(const CubeMapGenerator &) { return *this; } + protected: + virtual ~CubeMapGenerator() {} + CubeMapGenerator &operator=(const CubeMapGenerator &) { return *this; } - inline void set_pixel(int index, int c, int r, const osg::Vec4 &color); - inline static osg::Vec4 vector_to_color(const osg::Vec3 &vec); + inline void set_pixel(int index, int c, int r, const osg::Vec4 &color); + inline static osg::Vec4 vector_to_color(const osg::Vec3 &vec); - /** override this method to define how colors are computed. - The parameter R is the reflection vector, pointing from the center of the cube. - The return value should be the RGBA color associated with that reflection ray. - */ - virtual osg::Vec4 compute_color(const osg::Vec3 &R) const = 0; + /** override this method to define how colors are computed. + The parameter R is the reflection vector, pointing from the center of the cube. + The return value should be the RGBA color associated with that reflection ray. + */ + virtual osg::Vec4 compute_color(const osg::Vec3 &R) const = 0; - private: - int texture_size_; + private: + int texture_size_; - typedef std::vector > Image_list; - Image_list images_; - }; + typedef std::vector > Image_list; + Image_list images_; + }; - // INLINE METHODS + // INLINE METHODS - inline osg::Image *CubeMapGenerator::getImage(osg::TextureCubeMap::Face face) - { - switch (face) { - case osg::TextureCubeMap::POSITIVE_X: return images_[0].get(); - case osg::TextureCubeMap::NEGATIVE_X: return images_[1].get(); - case osg::TextureCubeMap::POSITIVE_Y: return images_[2].get(); - case osg::TextureCubeMap::NEGATIVE_Y: return images_[3].get(); - case osg::TextureCubeMap::POSITIVE_Z: return images_[4].get(); - case osg::TextureCubeMap::NEGATIVE_Z: return images_[5].get(); - default: return 0; - } - } + inline osg::Image *CubeMapGenerator::getImage(osg::TextureCubeMap::Face face) + { + switch (face) { + case osg::TextureCubeMap::POSITIVE_X: return images_[0].get(); + case osg::TextureCubeMap::NEGATIVE_X: return images_[1].get(); + case osg::TextureCubeMap::POSITIVE_Y: return images_[2].get(); + case osg::TextureCubeMap::NEGATIVE_Y: return images_[3].get(); + case osg::TextureCubeMap::POSITIVE_Z: return images_[4].get(); + case osg::TextureCubeMap::NEGATIVE_Z: return images_[5].get(); + default: return 0; + } + } - inline const osg::Image *CubeMapGenerator::getImage(osg::TextureCubeMap::Face face) const - { - switch (face) { - case osg::TextureCubeMap::POSITIVE_X: return images_[0].get(); - case osg::TextureCubeMap::NEGATIVE_X: return images_[1].get(); - case osg::TextureCubeMap::POSITIVE_Y: return images_[2].get(); - case osg::TextureCubeMap::NEGATIVE_Y: return images_[3].get(); - case osg::TextureCubeMap::POSITIVE_Z: return images_[4].get(); - case osg::TextureCubeMap::NEGATIVE_Z: return images_[5].get(); - default: return 0; - } - } + inline const osg::Image *CubeMapGenerator::getImage(osg::TextureCubeMap::Face face) const + { + switch (face) { + case osg::TextureCubeMap::POSITIVE_X: return images_[0].get(); + case osg::TextureCubeMap::NEGATIVE_X: return images_[1].get(); + case osg::TextureCubeMap::POSITIVE_Y: return images_[2].get(); + case osg::TextureCubeMap::NEGATIVE_Y: return images_[3].get(); + case osg::TextureCubeMap::POSITIVE_Z: return images_[4].get(); + case osg::TextureCubeMap::NEGATIVE_Z: return images_[5].get(); + default: return 0; + } + } - inline void CubeMapGenerator::set_pixel(int index, int c, int r, const osg::Vec4 &color) - { - osg::Image *i = images_[index].get(); - if (i) { - *(i->data(c, r)+0) = static_cast(color.x() * 255); - *(i->data(c, r)+1) = static_cast(color.y() * 255); - *(i->data(c, r)+2) = static_cast(color.z() * 255); - *(i->data(c, r)+3) = static_cast(color.w() * 255); - } else { - osg::notify(osg::WARN) << "Warning: CubeMapGenerator::set_pixel(): invalid image index\n"; - } - } + inline void CubeMapGenerator::set_pixel(int index, int c, int r, const osg::Vec4 &color) + { + osg::Image *i = images_[index].get(); + if (i) { + *(i->data(c, r)+0) = static_cast(osg::clampBetween(color.x(),0.0f,1.0f) * 255); + *(i->data(c, r)+1) = static_cast(osg::clampBetween(color.y(),0.0f,1.0f) * 255); + *(i->data(c, r)+2) = static_cast(osg::clampBetween(color.z(),0.0f,1.0f) * 255); + *(i->data(c, r)+3) = static_cast(osg::clampBetween(color.w(),0.0f,1.0f) * 255); + } else { + osg::notify(osg::WARN) << "Warning: CubeMapGenerator::set_pixel(): invalid image index\n"; + } + } - inline osg::Vec4 CubeMapGenerator::vector_to_color(const osg::Vec3 &vec) - { - return osg::Vec4( - vec.x() / vec.length() / 2 + 0.5f, - vec.y() / vec.length() / 2 + 0.5f, - vec.z() / vec.length() / 2 + 0.5f, - 1); - } + inline osg::Vec4 CubeMapGenerator::vector_to_color(const osg::Vec3 &vec) + { + return osg::Vec4( + vec.x() / vec.length() / 2 + 0.5f, + vec.y() / vec.length() / 2 + 0.5f, + vec.z() / vec.length() / 2 + 0.5f, + 1); + } } diff --git a/include/osgUtil/HighlightMapGenerator b/include/osgUtil/HighlightMapGenerator index 012e3fc66..ab7033177 100644 --- a/include/osgUtil/HighlightMapGenerator +++ b/include/osgUtil/HighlightMapGenerator @@ -20,43 +20,43 @@ namespace osgUtil { - /** This cube map generator produces a specular highlight map. - The vector-color association is: C = (R dot (-L)) ^ n, where C is the - resulting color, R is the reflection vector, L is the light direction - and n is the specular exponent. - */ - class OSGUTIL_EXPORT HighlightMapGenerator: public CubeMapGenerator { - public: - HighlightMapGenerator( - const osg::Vec3 &light_direction, - const osg::Vec4 &light_color, - float specular_exponent, - int texture_size = 64); + /** This cube map generator produces a specular highlight map. + The vector-color association is: C = (R dot (-L)) ^ n, where C is the + resulting color, R is the reflection vector, L is the light direction + and n is the specular exponent. + */ + class OSGUTIL_EXPORT HighlightMapGenerator: public CubeMapGenerator { + public: + HighlightMapGenerator( + const osg::Vec3 &light_direction, + const osg::Vec4 &light_color, + float specular_exponent, + int texture_size = 64); - HighlightMapGenerator(const HighlightMapGenerator ©, const osg::CopyOp ©op = osg::CopyOp::SHALLOW_COPY); + HighlightMapGenerator(const HighlightMapGenerator ©, const osg::CopyOp ©op = osg::CopyOp::SHALLOW_COPY); - protected: - virtual ~HighlightMapGenerator() {} - HighlightMapGenerator &operator=(const HighlightMapGenerator &) { return *this; } + protected: + virtual ~HighlightMapGenerator() {} + HighlightMapGenerator &operator=(const HighlightMapGenerator &) { return *this; } - inline virtual osg::Vec4 compute_color(const osg::Vec3 &R) const; + inline virtual osg::Vec4 compute_color(const osg::Vec3 &R) const; - private: - osg::Vec3 ldir_; - osg::Vec4 lcol_; - float sexp_; - }; + private: + osg::Vec3 ldir_; + osg::Vec4 lcol_; + float sexp_; + }; - // INLINE METHODS + // INLINE METHODS - inline osg::Vec4 HighlightMapGenerator::compute_color(const osg::Vec3 &R) const - { - float v = -ldir_ * (R / R.length()); - if (v < 0) v = 0; - osg::Vec4 color(lcol_ * powf(v, sexp_)); - color.w() = 1; - return color; - } + inline osg::Vec4 HighlightMapGenerator::compute_color(const osg::Vec3 &R) const + { + float v = -ldir_ * (R / R.length()); + if (v < 0) v = 0; + osg::Vec4 color(lcol_ * powf(v, sexp_)); + color.w() = 1; + return color; + } } diff --git a/src/osgUtil/CubeMapGenerator.cpp b/src/osgUtil/CubeMapGenerator.cpp index 84e748dcf..ca511db65 100644 --- a/src/osgUtil/CubeMapGenerator.cpp +++ b/src/osgUtil/CubeMapGenerator.cpp @@ -43,13 +43,13 @@ CubeMapGenerator::CubeMapGenerator(const CubeMapGenerator ©, const osg::Copy void CubeMapGenerator::generateMap(bool use_osg_system) { - osg::Matrix M; - - if (use_osg_system) { - M = osg::Matrix::rotate(osg::PI_2, osg::Vec3(1, 0, 0)); - } else { - M = osg::Matrix::identity(); - } + osg::Matrix M; + + if (use_osg_system) { + M = osg::Matrix::rotate(osg::PI_2, osg::Vec3(1, 0, 0)); + } else { + M = osg::Matrix::identity(); + } const float dst = 2.0f/(texture_size_-1); @@ -57,7 +57,7 @@ void CubeMapGenerator::generateMap(bool use_osg_system) for (int i=0; i