| 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 | //osgFX - Copyright (C) 2003 Marco Jez |
|---|
| 14 | |
|---|
| 15 | #ifndef OSGFX_BUMPMAPPING_ |
|---|
| 16 | #define OSGFX_BUMPMAPPING_ |
|---|
| 17 | |
|---|
| 18 | #include <osgFX/Export> |
|---|
| 19 | #include <osgFX/Effect> |
|---|
| 20 | |
|---|
| 21 | #include <osg/ref_ptr> |
|---|
| 22 | #include <osg/Texture2D> |
|---|
| 23 | |
|---|
| 24 | namespace osgFX |
|---|
| 25 | { |
|---|
| 26 | |
|---|
| 27 | /** |
|---|
| 28 | This effect makes surfaces appear bumpy. Children nodes must use two textures, |
|---|
| 29 | one for diffuse color and one for the normal map (which can be created |
|---|
| 30 | from a height map with tools like nVIDIA's normal map generator). Furthermore, |
|---|
| 31 | tangent-space basis vectors must be created and assigned to each Geometry; this |
|---|
| 32 | can be done quickly by calling BumpMapping::prepareChildren(). Note that both |
|---|
| 33 | diffuse and normal map textures must have corresponding UV maps defined in |
|---|
| 34 | Geometry objects. |
|---|
| 35 | This effect defines a preferred technique which uses ARB vertex & fragment |
|---|
| 36 | programs, and a fallback technique which doesn't use fragment programs. The |
|---|
| 37 | latter is more limited though since it can't handle ambient and specular |
|---|
| 38 | components. |
|---|
| 39 | */ |
|---|
| 40 | class OSGFX_EXPORT BumpMapping: public Effect { |
|---|
| 41 | public: |
|---|
| 42 | BumpMapping(); |
|---|
| 43 | BumpMapping(const BumpMapping& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY); |
|---|
| 44 | |
|---|
| 45 | META_Effect(osgFX, BumpMapping, |
|---|
| 46 | |
|---|
| 47 | "Bump Mapping", |
|---|
| 48 | |
|---|
| 49 | "This effect makes surfaces appear bumpy. Children nodes must use two textures, " |
|---|
| 50 | "one for diffuse color and one for the normal map (which can be created " |
|---|
| 51 | "from a height map with tools like nVIDIA's normal map generator). Furthermore, " |
|---|
| 52 | "tangent-space basis vectors must be created and assigned to each Geometry; this " |
|---|
| 53 | "can be done quickly by calling BumpMapping::prepareChildren(). Note that both " |
|---|
| 54 | "diffuse and normal map textures must have corresponding UV maps defined in " |
|---|
| 55 | "Geometry objects.\n" |
|---|
| 56 | "This effect defines a preferred technique which uses ARB vertex & fragment " |
|---|
| 57 | "programs, and a fallback technique which doesn't use fragment programs. The " |
|---|
| 58 | "latter is more limited though since it can't handle ambient and specular " |
|---|
| 59 | "components.", |
|---|
| 60 | |
|---|
| 61 | "Marco Jez"); |
|---|
| 62 | |
|---|
| 63 | |
|---|
| 64 | /** get the OpenGL light number */ |
|---|
| 65 | inline int getLightNumber() const; |
|---|
| 66 | |
|---|
| 67 | /** set the OpenGL light number that will be used in lighting computations */ |
|---|
| 68 | inline void setLightNumber(int n); |
|---|
| 69 | |
|---|
| 70 | /** get the texture unit that contains diffuse color texture. Default is 1 */ |
|---|
| 71 | inline int getDiffuseTextureUnit() const; |
|---|
| 72 | |
|---|
| 73 | /** set the texture unit that contains diffuse color texture. Default is 1 */ |
|---|
| 74 | inline void setDiffuseTextureUnit(int n); |
|---|
| 75 | |
|---|
| 76 | /** get the texture unit that contains normal map texture. Default is 0 */ |
|---|
| 77 | inline int getNormalMapTextureUnit() const; |
|---|
| 78 | |
|---|
| 79 | /** set the texture unit that contains normal map texture. Default is 0 */ |
|---|
| 80 | inline void setNormalMapTextureUnit(int n); |
|---|
| 81 | |
|---|
| 82 | /** get the diffuse color texture that overrides children's texture */ |
|---|
| 83 | inline osg::Texture2D* getOverrideDiffuseTexture(); |
|---|
| 84 | |
|---|
| 85 | /** get the const diffuse color texture that overrides children's texture */ |
|---|
| 86 | inline const osg::Texture2D* getOverrideDiffuseTexture() const; |
|---|
| 87 | |
|---|
| 88 | /** set the diffuse color texture that overrides children's texture */ |
|---|
| 89 | inline void setOverrideDiffuseTexture(osg::Texture2D* texture); |
|---|
| 90 | |
|---|
| 91 | /** get the normal map texture that overrides children's texture */ |
|---|
| 92 | inline osg::Texture2D* getOverrideNormalMapTexture(); |
|---|
| 93 | |
|---|
| 94 | /** get the const normal map texture that overrides children's texture */ |
|---|
| 95 | inline const osg::Texture2D* getOverrideNormalMapTexture() const; |
|---|
| 96 | |
|---|
| 97 | /** set the normal map texture that overrides children's texture */ |
|---|
| 98 | inline void setOverrideNormalMapTexture(osg::Texture2D* texture); |
|---|
| 99 | |
|---|
| 100 | /** |
|---|
| 101 | prepare a Geometry for bump lighting. Tangent-space basis vectors are |
|---|
| 102 | generated and attached to the geometry as vertex attribute arrays. |
|---|
| 103 | */ |
|---|
| 104 | void prepareGeometry(osg::Geometry* geo); |
|---|
| 105 | |
|---|
| 106 | /** prepare a Node for bump lighting, calling prepareGeometry() for each Geometry */ |
|---|
| 107 | void prepareNode(osg::Node* node); |
|---|
| 108 | |
|---|
| 109 | /** prepare children for bump lighting. Actually calls prepareNode() for each child */ |
|---|
| 110 | void prepareChildren(); |
|---|
| 111 | |
|---|
| 112 | /** set up a demo environment with predefined diffuse and normal maps, as well as texture coordinates */ |
|---|
| 113 | void setUpDemo(); |
|---|
| 114 | |
|---|
| 115 | protected: |
|---|
| 116 | virtual ~BumpMapping() {} |
|---|
| 117 | BumpMapping &operator=(const BumpMapping &) { return *this; } |
|---|
| 118 | |
|---|
| 119 | bool define_techniques(); |
|---|
| 120 | |
|---|
| 121 | private: |
|---|
| 122 | int _lightnum; |
|---|
| 123 | int _diffuse_unit; |
|---|
| 124 | int _normal_unit; |
|---|
| 125 | osg::ref_ptr<osg::Texture2D> _diffuse_tex; |
|---|
| 126 | osg::ref_ptr<osg::Texture2D> _normal_tex; |
|---|
| 127 | }; |
|---|
| 128 | |
|---|
| 129 | // INLINE METHODS |
|---|
| 130 | |
|---|
| 131 | inline int BumpMapping::getLightNumber() const |
|---|
| 132 | { |
|---|
| 133 | return _lightnum; |
|---|
| 134 | } |
|---|
| 135 | |
|---|
| 136 | inline void BumpMapping::setLightNumber(int n) |
|---|
| 137 | { |
|---|
| 138 | _lightnum = n; |
|---|
| 139 | dirtyTechniques(); |
|---|
| 140 | } |
|---|
| 141 | |
|---|
| 142 | inline int BumpMapping::getDiffuseTextureUnit() const |
|---|
| 143 | { |
|---|
| 144 | return _diffuse_unit; |
|---|
| 145 | } |
|---|
| 146 | |
|---|
| 147 | inline void BumpMapping::setDiffuseTextureUnit(int n) |
|---|
| 148 | { |
|---|
| 149 | _diffuse_unit = n; |
|---|
| 150 | dirtyTechniques(); |
|---|
| 151 | } |
|---|
| 152 | |
|---|
| 153 | inline int BumpMapping::getNormalMapTextureUnit() const |
|---|
| 154 | { |
|---|
| 155 | return _normal_unit; |
|---|
| 156 | } |
|---|
| 157 | |
|---|
| 158 | inline void BumpMapping::setNormalMapTextureUnit(int n) |
|---|
| 159 | { |
|---|
| 160 | _normal_unit = n; |
|---|
| 161 | dirtyTechniques(); |
|---|
| 162 | } |
|---|
| 163 | |
|---|
| 164 | inline osg::Texture2D* BumpMapping::getOverrideDiffuseTexture() |
|---|
| 165 | { |
|---|
| 166 | return _diffuse_tex.get(); |
|---|
| 167 | } |
|---|
| 168 | |
|---|
| 169 | inline const osg::Texture2D* BumpMapping::getOverrideDiffuseTexture() const |
|---|
| 170 | { |
|---|
| 171 | return _diffuse_tex.get(); |
|---|
| 172 | } |
|---|
| 173 | |
|---|
| 174 | inline void BumpMapping::setOverrideDiffuseTexture(osg::Texture2D* texture) |
|---|
| 175 | { |
|---|
| 176 | _diffuse_tex = texture; |
|---|
| 177 | dirtyTechniques(); |
|---|
| 178 | } |
|---|
| 179 | |
|---|
| 180 | inline osg::Texture2D* BumpMapping::getOverrideNormalMapTexture() |
|---|
| 181 | { |
|---|
| 182 | return _normal_tex.get(); |
|---|
| 183 | } |
|---|
| 184 | |
|---|
| 185 | inline const osg::Texture2D* BumpMapping::getOverrideNormalMapTexture() const |
|---|
| 186 | { |
|---|
| 187 | return _normal_tex.get(); |
|---|
| 188 | } |
|---|
| 189 | |
|---|
| 190 | inline void BumpMapping::setOverrideNormalMapTexture(osg::Texture2D* texture) |
|---|
| 191 | { |
|---|
| 192 | _normal_tex = texture; |
|---|
| 193 | dirtyTechniques(); |
|---|
| 194 | } |
|---|
| 195 | |
|---|
| 196 | } |
|---|
| 197 | |
|---|
| 198 | #endif |
|---|