1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
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.
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.
18#include <osg/StateAttribute>
20#if defined(OSG_GLES1_AVAILABLE) || defined(OSG_GLES2_AVAILABLE) || defined(OSG_GLES3_AVAILABLE) || defined(OSG_GL3_AVAILABLE)
21 #define GL_OBJECT_LINEAR 0x2401
22 #define GL_EYE_LINEAR 0x2400
23 #define GL_SPHERE_MAP 0x2402
24 #define GL_TEXTURE_GEN_S 0x0C60
25 #define GL_TEXTURE_GEN_T 0x0C61
26 #define GL_TEXTURE_GEN_R 0x0C62
27 #define GL_TEXTURE_GEN_Q 0x0C63
30#ifndef GL_NORMAL_MAP_ARB
31 #define GL_NORMAL_MAP_ARB 0x8511
34#ifndef GL_REFLECTION_MAP_ARB
35 #define GL_REFLECTION_MAP_ARB 0x8512
40/** TexGen encapsulates the OpenGL glTexGen (texture coordinate generation)
42class OSG_EXPORT TexGen : public StateAttribute
48 /** Copy constructor using CopyOp to manage deep vs shallow copy. */
49 TexGen(const TexGen& texgen,const CopyOp& copyop=CopyOp::SHALLOW_COPY):
50 StateAttribute(texgen,copyop),
52 _plane_s(texgen._plane_s),
53 _plane_t(texgen._plane_t),
54 _plane_r(texgen._plane_r),
55 _plane_q(texgen._plane_q) {}
57 META_StateAttribute(osg, TexGen, TEXGEN);
59 virtual bool isTextureAttribute() const { return true; }
61 /** Return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */
62 virtual int compare(const StateAttribute& sa) const
64 // Check for equal types, then create the rhs variable
65 // used by the COMPARE_StateAttribute_Parameter macros below.
66 COMPARE_StateAttribute_Types(TexGen,sa)
68 // Compare each parameter in turn against the rhs.
69 COMPARE_StateAttribute_Parameter(_mode)
70 COMPARE_StateAttribute_Parameter(_plane_s)
71 COMPARE_StateAttribute_Parameter(_plane_t)
72 COMPARE_StateAttribute_Parameter(_plane_r)
73 COMPARE_StateAttribute_Parameter(_plane_q)
75 return 0; // Passed all the above comparison macros, so must be equal.
78 virtual bool getModeUsage(StateAttribute::ModeUsage& usage) const
80 usage.usesTextureMode(GL_TEXTURE_GEN_S);
81 usage.usesTextureMode(GL_TEXTURE_GEN_T);
83 // Not happy with turning all tex gen parameters on
84 // as the OSG currently only supports 2D textures and therefore
85 // only S and T will be required, R&Q would be redundant...
86 // So commenting out the following until OSG supports 3D textures.
87 // I plan to revamp the OpenGL state management later so will
88 // tidy up then. Robert Osfield. Jan 2001.
90 // The tidy up is now happening, but will have a think before
91 // resolving the below parameters.
93 usage.usesTextureMode(GL_TEXTURE_GEN_R);
94 usage.usesTextureMode(GL_TEXTURE_GEN_Q);
98 virtual void apply(State& state) const;
101 OBJECT_LINEAR = GL_OBJECT_LINEAR,
102 EYE_LINEAR = GL_EYE_LINEAR,
103 SPHERE_MAP = GL_SPHERE_MAP,
104 NORMAL_MAP = GL_NORMAL_MAP_ARB,
105 REFLECTION_MAP = GL_REFLECTION_MAP_ARB
108 inline void setMode( Mode mode ) { _mode = mode; }
110 Mode getMode() const { return _mode; }
116 void setPlane(Coord which, const Plane& plane);
118 Plane& getPlane(Coord which);
120 const Plane& getPlane(Coord which) const;
122 /** Set the tex gen planes from specified matrix.
123 * Typical usage would be to pass in a projection
124 * matrix to set up projective texturing.
126 void setPlanesFromMatrix(const Matrixd& matrix);
130 virtual ~TexGen( void );
134 /** Additional texgen coefficients for GL_OBJECT_PLANE or
136 Plane _plane_s, _plane_t, _plane_r, _plane_q;