root/OpenSceneGraph/trunk/include/osgFX/BumpMapping @ 13041

Revision 13041, 6.8 kB (checked in by robert, 2 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
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
24namespace 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
Note: See TracBrowser for help on using the browser.