]> git.mxchange.org Git - simgear.git/blob - simgear/scene/material/mat.hxx
Modified Files:
[simgear.git] / simgear / scene / material / mat.hxx
1 // mat.hxx -- a material in the scene graph.
2 // TODO: this class needs to be renamed.
3 //
4 // Written by Curtis Olson, started May 1998.
5 // Overhauled by David Megginson, December 2001
6 //
7 // Copyright (C) 1998 - 2000  Curtis L. Olson  - http://www.flightgear.org/~curt
8 //
9 // This program is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU General Public License as
11 // published by the Free Software Foundation; either version 2 of the
12 // License, or (at your option) any later version.
13 //
14 // This program is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 // General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
22 //
23 // $Id$
24
25
26 #ifndef _SG_MAT_HXX
27 #define _SG_MAT_HXX
28
29 #ifndef __cplusplus
30 # error This library requires C++
31 #endif
32
33 #include <simgear/compiler.h>
34
35 #include STL_STRING      // Standard C++ string library
36 #include <vector>
37 #include <map>
38
39 #include <simgear/math/SGMath.hxx>
40
41 #include <osg/ref_ptr>
42 #include <osg/StateSet>
43
44 #include <simgear/props/props.hxx>
45 #include <simgear/structure/SGSharedPtr.hxx>
46 #include <simgear/scene/util/SGSceneFeatures.hxx>
47
48 #include "matmodel.hxx"
49
50 SG_USING_STD(string);
51 SG_USING_STD(vector);
52 SG_USING_STD(map);
53
54
55 class SGMaterialGlyph;
56
57 /**
58  * A material in the scene graph.
59  *
60  * A material represents information about a single surface type
61  * in the 3D scene graph, including texture, colour, lighting,
62  * tiling, and so on; most of the materials in FlightGear are
63  * defined in the $FG_ROOT/materials.xml file, and can be changed
64  * at runtime.
65  */
66 class SGMaterial : public SGReferenced {
67
68 public:
69
70 \f
71   ////////////////////////////////////////////////////////////////////
72   // Public Constructors.
73   ////////////////////////////////////////////////////////////////////
74
75   /**
76    * Construct a material from a set of properties.
77    *
78    * @param props A property node containing subnodes with the
79    * state information for the material.  This node is usually
80    * loaded from the $FG_ROOT/materials.xml file.
81    */
82   SGMaterial( const string &fg_root, const SGPropertyNode *props, const char *season );
83
84
85   /**
86    * Construct a material from an absolute texture path.
87    *
88    * @param texture_path A string containing an absolute path
89    * to a texture file (usually RGB).
90    */
91   SGMaterial( const string &texpath );
92
93
94   /**
95    * Construct a material around an existing state.
96    *
97    * This constructor allows the application to create a custom,
98    * low-level state for the scene graph and wrap a material around
99    * it.  Note: the pointer ownership is transferred to the material.
100    *
101    * @param s The state for this material.
102    */
103   SGMaterial( osg::StateSet *s );
104
105   /**
106    * Destructor.
107    */
108   ~SGMaterial( void );
109
110
111 \f
112   ////////////////////////////////////////////////////////////////////
113   // Public methods.
114   ////////////////////////////////////////////////////////////////////
115
116   /**
117    * Force the texture to load if it hasn't already.
118    *
119    * @return true if the texture loaded, false if it was loaded
120    * already.
121    */
122   bool load_texture (int n = -1);
123
124   /**
125    * Get the textured state.
126    */
127   osg::StateSet *get_state (int n = -1) const;
128
129
130   /**
131    * Get the number of textures assigned to this material.
132    */
133   inline int get_num() const { return _status.size(); }
134
135
136   /**
137    * Get the xsize of the texture, in meters.
138    */
139   inline double get_xsize() const { return xsize; }
140
141
142   /**
143    * Get the ysize of the texture, in meters.
144    */
145   inline double get_ysize() const { return ysize; }
146
147
148   /**
149    * Get the light coverage.
150    *
151    * A smaller number means more generated night lighting.
152    *
153    * @return The area (m^2?) covered by each light.
154    */
155   inline double get_light_coverage () const { return light_coverage; }
156
157   /**
158    * Return if the surface material is solid, if it is not solid, a fluid
159    * can be assumed, that is usually water.
160    */
161   bool get_solid () const { return solid; }
162
163   /**
164    * Get the friction factor for that material
165    */
166   double get_friction_factor () const { return friction_factor; }
167
168   /**
169    * Get the rolling friction for that material
170    */
171   double get_rolling_friction () const { return rolling_friction; }
172
173   /**
174    * Get the bumpines for that material
175    */
176   double get_bumpiness () const { return bumpiness; }
177
178   /**
179    * Get the load resistance
180    */
181   double get_load_resistance () const { return load_resistance; }
182
183   /**
184    * Get the list of names for this material
185    */
186   const vector<string>& get_names() const { return _names; }
187
188   /**
189    * add the given name to the list of names this material is known
190    */
191   void add_name(const string& name) { _names.push_back(name); }
192
193   /**
194    * Get the number of randomly-placed objects defined for this material.
195    */
196   int get_object_group_count () const { return object_groups.size(); }
197
198   /**
199    * Get a randomly-placed object for this material.
200    */
201   SGMatModelGroup * get_object_group (int index) const {
202     return object_groups[index];
203   }
204
205   /**
206    * Return pointer to glyph class, or 0 if it doesn't exist.
207    */
208   SGMaterialGlyph * get_glyph (const string& name) const;
209
210   void set_light_color(const SGVec4f& color)
211   { emission = color; }
212   const SGVec4f& get_light_color() const
213   { return emission; }
214
215   SGVec2f get_tex_coord_scale() const
216   {
217     float tex_width = get_xsize();
218     float tex_height = get_ysize();
219
220     return SGVec2f((0 < tex_width) ? 1000.0f/tex_width : 1.0f,
221                    (0 < tex_height) ? 1000.0f/tex_height : 1.0f);
222   }
223
224 protected:
225
226 \f
227   ////////////////////////////////////////////////////////////////////
228   // Protected methods.
229   ////////////////////////////////////////////////////////////////////
230
231   /**
232    * Initialization method, invoked by all public constructors.
233    */
234   void init();
235
236 protected:
237
238   struct _internal_state {
239       _internal_state( osg::StateSet *s, const string &t, bool l )
240                   : state(s), texture_path(t), texture_loaded(l) {}
241       osg::ref_ptr<osg::StateSet> state;
242       string texture_path;
243       bool texture_loaded;
244   };
245
246 private:
247
248 \f
249   ////////////////////////////////////////////////////////////////////
250   // Internal state.
251   ////////////////////////////////////////////////////////////////////
252
253   // texture status
254   vector<_internal_state> _status;
255
256   // Round-robin counter
257   mutable unsigned int _current_ptr;
258
259   // texture size
260   double xsize, ysize;
261
262   // wrap texture?
263   bool wrapu, wrapv;
264
265   // use mipmapping?
266   int mipmap;
267
268   // coverage of night lighting.
269   double light_coverage;
270
271   // True if the material is solid, false if it is a fluid
272   bool solid;
273
274   // the friction factor of that surface material
275   double friction_factor;
276
277   // the rolling friction of that surface material
278   double rolling_friction;
279
280   // the bumpiness of that surface material
281   double bumpiness;
282
283   // the load resistance of that surface material
284   double load_resistance;
285
286   // material properties
287   SGVec4f ambient, diffuse, specular, emission;
288   double shininess;
289
290   // the list of names for this material. May be empty.
291   vector<string> _names;
292
293   vector<SGSharedPtr<SGMatModelGroup> > object_groups;
294
295   // taxiway-/runway-sign texture elements
296   map<string, SGSharedPtr<SGMaterialGlyph> > glyphs;
297
298 \f
299   ////////////////////////////////////////////////////////////////////
300   // Internal constructors and methods.
301   ////////////////////////////////////////////////////////////////////
302
303   SGMaterial( const string &fg_root, const SGMaterial &mat ); // unimplemented
304
305   void read_properties( const string &fg_root, const SGPropertyNode *props, const char *season );
306   void build_state( bool defer_tex_load );
307   void set_state( osg::StateSet *s );
308
309   void assignTexture( osg::StateSet *state, const std::string &fname, int _wrapu = TRUE, int _wrapv = TRUE, int _mipmap = TRUE );
310
311 };
312
313
314 class SGMaterialGlyph : public SGReferenced {
315 public:
316   SGMaterialGlyph(SGPropertyNode *);
317   inline double get_left() const { return _left; }
318   inline double get_right() const { return _right; }
319   inline double get_width() const { return _right - _left; }
320
321 protected:
322   double _left;
323   double _right;
324 };
325
326 class SGMaterialUserData : public osg::Referenced {
327 public:
328   SGMaterialUserData(const SGMaterial* material) :
329     mMaterial(material)
330   {}
331   const SGMaterial* getMaterial() const
332   { return mMaterial; }
333 private:
334   SGSharedPtr<const SGMaterial> mMaterial;
335 };
336
337 void
338 SGSetTextureFilter( int max);
339
340 int
341 SGGetTextureFilter();
342
343 #endif // _SG_MAT_HXX