]> git.mxchange.org Git - simgear.git/blob - simgear/scene/material/mat.hxx
Reduce compiler.h to almost nothing (but it's worth keeping around I think, for
[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 <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    * Get the textured state.
118    */
119   osg::StateSet *get_state (int n = -1);
120
121
122   /**
123    * Get the number of textures assigned to this material.
124    */
125   inline int get_num() const { return _status.size(); }
126
127
128   /**
129    * Get the xsize of the texture, in meters.
130    */
131   inline double get_xsize() const { return xsize; }
132
133
134   /**
135    * Get the ysize of the texture, in meters.
136    */
137   inline double get_ysize() const { return ysize; }
138
139
140   /**
141    * Get the light coverage.
142    *
143    * A smaller number means more generated night lighting.
144    *
145    * @return The area (m^2) covered by each light.
146    */
147   inline double get_light_coverage () const { return light_coverage; }
148
149   /**
150    * Get the forest coverage.
151    *
152    * A smaller number means more generated forest canopy.
153    *
154    * @return The area (m^2) covered by each canopy.
155    */
156   inline double get_tree_coverage () const { return tree_coverage; }
157
158   /**
159    * Get the forest height.
160    *
161    * @return The average height of the trees.
162    */
163   inline double get_tree_height () const { return tree_height; }
164
165   /**
166    * Get the forest width.
167    *
168    * @return The average width of the trees.
169    */
170   inline double get_tree_width () const { return tree_width; }
171
172   /**
173    * Get the forest LoD range.
174    *
175    * @return The LoD range for the trees.
176    */
177   inline double get_tree_range () const { return tree_range; }
178   
179   /**
180    * Get the number of tree varieties available
181    *
182    * @return the number of different trees defined in the texture strip
183    */
184   inline int get_tree_varieties () const { return tree_varieties; }
185   
186   /**
187    * Get the texture strip to use for trees
188    *
189    * @return the texture to use for trees.
190    */
191   inline string get_tree_texture () const { return  tree_texture; }
192
193   /**
194    * Return if the surface material is solid, if it is not solid, a fluid
195    * can be assumed, that is usually water.
196    */
197   bool get_solid () const { return solid; }
198
199   /**
200    * Get the friction factor for that material
201    */
202   double get_friction_factor () const { return friction_factor; }
203
204   /**
205    * Get the rolling friction for that material
206    */
207   double get_rolling_friction () const { return rolling_friction; }
208
209   /**
210    * Get the bumpines for that material
211    */
212   double get_bumpiness () const { return bumpiness; }
213
214   /**
215    * Get the load resistance
216    */
217   double get_load_resistance () const { return load_resistance; }
218
219   /**
220    * Get the list of names for this material
221    */
222   const vector<string>& get_names() const { return _names; }
223
224   /**
225    * add the given name to the list of names this material is known
226    */
227   void add_name(const string& name) { _names.push_back(name); }
228
229   /**
230    * Get the number of randomly-placed objects defined for this material.
231    */
232   int get_object_group_count () const { return object_groups.size(); }
233
234   /**
235    * Get a randomly-placed object for this material.
236    */
237   SGMatModelGroup * get_object_group (int index) const {
238     return object_groups[index];
239   }
240
241   /**
242    * Return pointer to glyph class, or 0 if it doesn't exist.
243    */
244   SGMaterialGlyph * get_glyph (const string& name) const;
245
246   void set_light_color(const SGVec4f& color)
247   { emission = color; }
248   const SGVec4f& get_light_color() const
249   { return emission; }
250
251   SGVec2f get_tex_coord_scale() const
252   {
253     float tex_width = get_xsize();
254     float tex_height = get_ysize();
255
256     return SGVec2f((0 < tex_width) ? 1000.0f/tex_width : 1.0f,
257                    (0 < tex_height) ? 1000.0f/tex_height : 1.0f);
258   }
259
260 protected:
261
262 \f
263   ////////////////////////////////////////////////////////////////////
264   // Protected methods.
265   ////////////////////////////////////////////////////////////////////
266
267   /**
268    * Initialization method, invoked by all public constructors.
269    */
270   void init();
271
272 protected:
273
274   struct _internal_state {
275       _internal_state( osg::StateSet *s, const string &t, bool l )
276                   : state(s), texture_path(t), texture_loaded(l) {}
277       osg::ref_ptr<osg::StateSet> state;
278       string texture_path;
279       bool texture_loaded;
280   };
281
282 private:
283
284 \f
285   ////////////////////////////////////////////////////////////////////
286   // Internal state.
287   ////////////////////////////////////////////////////////////////////
288
289   // texture status
290   vector<_internal_state> _status;
291
292   // Round-robin counter
293   mutable unsigned int _current_ptr;
294
295   // texture size
296   double xsize, ysize;
297
298   // wrap texture?
299   bool wrapu, wrapv;
300
301   // use mipmapping?
302   bool mipmap;
303
304   // coverage of night lighting.
305   double light_coverage;
306   
307   // coverage of trees
308   double tree_coverage;
309   
310   // Range at which trees become visible
311   double tree_range;
312
313   // Height of the tree
314   double tree_height;
315
316   // Width of the tree
317   double tree_width;
318
319   // Number of varieties of tree texture
320   int tree_varieties;
321
322   // True if the material is solid, false if it is a fluid
323   bool solid;
324
325   // the friction factor of that surface material
326   double friction_factor;
327
328   // the rolling friction of that surface material
329   double rolling_friction;
330
331   // the bumpiness of that surface material
332   double bumpiness;
333
334   // the load resistance of that surface material
335   double load_resistance;
336
337   // material properties
338   SGVec4f ambient, diffuse, specular, emission;
339   double shininess;
340
341   // the list of names for this material. May be empty.
342   vector<string> _names;
343
344   vector<SGSharedPtr<SGMatModelGroup> > object_groups;
345
346   // taxiway-/runway-sign texture elements
347   map<string, SGSharedPtr<SGMaterialGlyph> > glyphs;
348   
349   // Tree texture, typically a strip of applicable tree textures
350   string tree_texture;
351 \f
352   ////////////////////////////////////////////////////////////////////
353   // Internal constructors and methods.
354   ////////////////////////////////////////////////////////////////////
355
356   SGMaterial( const string &fg_root, const SGMaterial &mat ); // unimplemented
357
358   void read_properties( const string &fg_root, const SGPropertyNode *props, const char *season );
359   void build_state( bool defer_tex_load );
360   void set_state( osg::StateSet *s );
361
362   void assignTexture( osg::StateSet *state, const std::string &fname, bool _wrapu = true, bool _wrapv = true, bool _mipmap = true );
363
364 };
365
366
367 class SGMaterialGlyph : public SGReferenced {
368 public:
369   SGMaterialGlyph(SGPropertyNode *);
370   inline double get_left() const { return _left; }
371   inline double get_right() const { return _right; }
372   inline double get_width() const { return _right - _left; }
373
374 protected:
375   double _left;
376   double _right;
377 };
378
379 class SGMaterialUserData : public osg::Referenced {
380 public:
381   SGMaterialUserData(const SGMaterial* material) :
382     mMaterial(material)
383   {}
384   const SGMaterial* getMaterial() const
385   { return mMaterial; }
386 private:
387   // this cannot be an SGSharedPtr since that would create a cicrular reference
388   // making it impossible to ever free the space needed by SGMaterial
389   const SGMaterial* mMaterial;
390 };
391
392 void
393 SGSetTextureFilter( int max);
394
395 int
396 SGGetTextureFilter();
397
398 #endif // _SG_MAT_HXX