OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Material.h
Go to the documentation of this file.
1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2004 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 
14 #ifndef OSG_MATERIAL
15 #define OSG_MATERIAL 1
16 
17 #include <osg/Vec4>
18 #include <osg/StateAttribute>
19 
20 #ifndef OSG_GL_FIXED_FUNCTION_AVAILABLE
21  #define GL_AMBIENT 0x1200
22  #define GL_DIFFUSE 0x1201
23  #define GL_SPECULAR 0x1202
24  #define GL_EMISSION 0x1600
25  #define GL_AMBIENT_AND_DIFFUSE 0x1602
26  #define GL_COLOR_MATERIAL 0x0B57
27 #endif
28 
29 namespace osg {
32 {
33  public :
34 
35  Material();
36 
38  Material(const Material& mat,const CopyOp& copyop=CopyOp::SHALLOW_COPY):
39  StateAttribute(mat,copyop),
40  _colorMode(mat._colorMode),
41  _ambientFrontAndBack(mat._ambientFrontAndBack),
42  _ambientFront(mat._ambientFront),
43  _ambientBack(mat._ambientBack),
44  _diffuseFrontAndBack(mat._diffuseFrontAndBack),
45  _diffuseFront(mat._diffuseFront),
46  _diffuseBack(mat._diffuseBack),
47  _specularFrontAndBack(mat._specularFrontAndBack),
48  _specularFront(mat._specularFront),
49  _specularBack(mat._specularBack),
50  _emissionFrontAndBack(mat._emissionFrontAndBack),
51  _emissionFront(mat._emissionFront),
52  _emissionBack(mat._emissionBack),
53  _shininessFrontAndBack(mat._shininessFrontAndBack),
54  _shininessFront(mat._shininessFront),
55  _shininessBack(mat._shininessBack) {}
56 
57  META_StateAttribute(osg, Material, MATERIAL);
58 
60  virtual int compare(const StateAttribute& sa) const
61  {
62  // check the types are equal and then create the rhs variable
63  // used by the COMPARE_StateAttribute_Parameter macros below.
65 
66  // compare each parameter in turn against the rhs.
68  COMPARE_StateAttribute_Parameter(_ambientFrontAndBack)
71  COMPARE_StateAttribute_Parameter(_diffuseFrontAndBack)
74  COMPARE_StateAttribute_Parameter(_specularFrontAndBack)
75  COMPARE_StateAttribute_Parameter(_specularFront)
77  COMPARE_StateAttribute_Parameter(_emissionFrontAndBack)
78  COMPARE_StateAttribute_Parameter(_emissionFront)
80  COMPARE_StateAttribute_Parameter(_shininessFrontAndBack)
81  COMPARE_StateAttribute_Parameter(_shininessFront)
82  COMPARE_StateAttribute_Parameter(_shininessBack)
83 
84  return 0; // passed all the above comparison macros, must be equal.
85  }
86 
87  Material& operator = (const Material& rhs);
88 
89  virtual bool getModeUsage(StateAttribute::ModeUsage& /*usage*/) const
90  {
91  // note, since Material does it's own glEnable/glDisable of GL_COLOR_MATERIAL
92  // we shouldn't declare usage of that mode, so commenting out the below usage.
93  // usage.usesMode(GL_COLOR_MATERIAL);
94  return true;
95  }
96 
97  virtual void apply(State& state) const;
98 
99  enum Face {
100  FRONT = GL_FRONT,
101  BACK = GL_BACK,
102  FRONT_AND_BACK = GL_FRONT_AND_BACK
103  };
104 
105  enum ColorMode {
106  AMBIENT = GL_AMBIENT,
107  DIFFUSE = GL_DIFFUSE,
108  SPECULAR = GL_SPECULAR,
109  EMISSION = GL_EMISSION,
110  AMBIENT_AND_DIFFUSE = GL_AMBIENT_AND_DIFFUSE,
111  OFF
112  };
113 
114  inline void setColorMode(ColorMode mode) { _colorMode = mode; }
115  inline ColorMode getColorMode() const { return _colorMode; }
116 
117  void setAmbient( Face face, const Vec4& ambient );
118  const Vec4& getAmbient(Face face) const;
119  inline bool getAmbientFrontAndBack() const { return _ambientFrontAndBack; }
120 
121  void setDiffuse( Face face, const Vec4& diffuse );
122  const Vec4& getDiffuse(Face face) const;
123  inline bool getDiffuseFrontAndBack() const { return _diffuseFrontAndBack; }
124 
128  void setSpecular( Face face, const Vec4& specular );
129 
131  const Vec4& getSpecular(Face face) const;
132 
136  inline bool getSpecularFrontAndBack() const { return _specularFrontAndBack; }
137 
141  void setEmission( Face face, const Vec4& emission );
142 
144  const Vec4& getEmission(Face face) const;
145 
149  inline bool getEmissionFrontAndBack() const { return _emissionFrontAndBack; }
150 
154  void setShininess(Face face, float shininess );
155 
157  float getShininess(Face face) const;
158 
162  inline bool getShininessFrontAndBack() const { return _shininessFrontAndBack; }
163 
168  void setTransparency(Face face,float trans);
169 
173  void setAlpha(Face face,float alpha);
174 
175  protected :
176 
177  virtual ~Material();
178 
180 
182  Vec4 _ambientFront; // r, g, b, w
183  Vec4 _ambientBack; // r, g, b, w
184 
186  Vec4 _diffuseFront; // r, g, b, w
187  Vec4 _diffuseBack; // r, g, b, w
188 
190  Vec4 _specularFront; // r, g, b, w
191  Vec4 _specularBack; // r, g, b, w
192 
194  Vec4 _emissionFront; // r, g, b, w
195  Vec4 _emissionBack; // r, g, b, w
196 
198  float _shininessFront; // values 0 - 128.0
199  float _shininessBack; // values 0 - 128.0
200 
201 };
202 
203 }
204 
205 #endif
Vec4 _diffuseBack
Definition: Material.h:187
bool getDiffuseFrontAndBack() const
Definition: Material.h:123
#define OSG_EXPORT
Definition: Export.h:43
Vec4 _emissionFront
Definition: Material.h:194
#define GL_SPECULAR
Definition: Material.h:23
#define COMPARE_StateAttribute_Types(TYPE, rhs_attribute)
void setColorMode(ColorMode mode)
Definition: Material.h:114
virtual bool getModeUsage(StateAttribute::ModeUsage &) const
Definition: Material.h:89
#define GL_DIFFUSE
Definition: Material.h:22
ColorMode _colorMode
Definition: Material.h:179
#define GL_EMISSION
Definition: Material.h:24
#define GL_AMBIENT_AND_DIFFUSE
Definition: Material.h:25
bool _emissionFrontAndBack
Definition: Material.h:193
bool _diffuseFrontAndBack
Definition: Material.h:185
Vec4 _specularFront
Definition: Material.h:190
Vec4 _emissionBack
Definition: Material.h:195
bool _specularFrontAndBack
Definition: Material.h:189
Vec4 _ambientBack
Definition: Material.h:183
Vec4 _ambientFront
Definition: Material.h:182
#define GL_AMBIENT
Definition: Material.h:21
bool getShininessFrontAndBack() const
Definition: Material.h:162
bool getSpecularFrontAndBack() const
Definition: Material.h:136
bool _shininessFrontAndBack
Definition: Material.h:197
Vec4 _diffuseFront
Definition: Material.h:186
bool _ambientFrontAndBack
Definition: Material.h:181
#define META_StateAttribute(library, name, type)
virtual int compare(const StateAttribute &sa) const
Definition: Material.h:60
Definition: AlphaFunc.h:19
bool getAmbientFrontAndBack() const
Definition: Material.h:119
#define COMPARE_StateAttribute_Parameter(parameter)
Vec4 _specularBack
Definition: Material.h:191
float _shininessBack
Definition: Material.h:199
bool getEmissionFrontAndBack() const
Definition: Material.h:149
Material(const Material &mat, const CopyOp &copyop=CopyOp::SHALLOW_COPY)
Definition: Material.h:38
float _shininessFront
Definition: Material.h:198
ColorMode getColorMode() const
Definition: Material.h:115