]> git.mxchange.org Git - simgear.git/blob - simgear/scene/material/mat.hxx
A patch from Frederic Bouvier to correct a naming problem caused bu Curts work. This...
[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  - curt@flightgear.org
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., 675 Mass Ave, Cambridge, MA 02139, 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
37 #include <plib/sg.h>
38 #include <plib/ssg.h>
39
40 #include <simgear/props/props.hxx>
41 #include <simgear/scene/model/modellib.hxx>
42
43 #include "matmodel.hxx"
44
45 SG_USING_STD(string);
46
47
48 /**
49  * A material in the scene graph.
50  *
51  * A material represents information about a single surface type
52  * in the 3D scene graph, including texture, colour, lighting,
53  * tiling, and so on; most of the materials in FlightGear are
54  * defined in the $FG_ROOT/materials.xml file, and can be changed
55  * at runtime.
56  */
57 class SGMaterial {
58
59 public:
60
61 \f
62   ////////////////////////////////////////////////////////////////////
63   // Public Constructors.
64   ////////////////////////////////////////////////////////////////////
65
66   /**
67    * Construct a material from a set of properties.
68    *
69    * @param props A property node containing subnodes with the
70    * state information for the material.  This node is usually
71    * loaded from the $FG_ROOT/materials.xml file.
72    */
73   SGMaterial( const string &fg_root, const SGPropertyNode *props );
74
75
76   /**
77    * Construct a material from an absolute texture path.
78    *
79    * @param texture_path A string containing an absolute path
80    * to a texture file (usually RGB).
81    */
82   SGMaterial( const string &texpath );
83
84
85   /**
86    * Construct a material around an existing SSG state.
87    *
88    * This constructor allows the application to create a custom,
89    * low-level state for the scene graph and wrap a material around
90    * it.  Note: the pointer ownership is transferred to the material.
91    *
92    * @param s The SSG state for this material.
93    */
94   SGMaterial( ssgSimpleState *s );
95
96   /**
97    * Destructor.
98    */
99   virtual ~SGMaterial( void );
100
101
102 \f
103   ////////////////////////////////////////////////////////////////////
104   // Public methods.
105   ////////////////////////////////////////////////////////////////////
106
107   /**
108    * Force the texture to load if it hasn't already.
109    *
110    * @return true if the texture loaded, false if it was loaded
111    * already.
112    */
113   virtual bool load_texture ();
114
115
116   /**
117    * Get the textured state.
118    */
119   virtual inline ssgSimpleState *get_state () const { return state; }
120
121
122   /**
123    * Get the xsize of the texture, in meters.
124    */
125   virtual inline double get_xsize() const { return xsize; }
126
127
128   /**
129    * Get the ysize of the texture, in meters.
130    */
131   virtual inline double get_ysize() const { return ysize; }
132
133
134   /**
135    * Get the light coverage.
136    *
137    * A smaller number means more generated night lighting.
138    *
139    * @return The area (m^2?) covered by each light.
140    */
141   virtual inline double get_light_coverage () const { return light_coverage; }
142
143
144   /**
145    * Get the number of randomly-placed objects defined for this material.
146    */
147   virtual int get_object_group_count () const { return object_groups.size(); }
148
149
150   /**
151    * Get a randomly-placed object for this material.
152    */
153   virtual SGMatModelGroup * get_object_group (int index) const {
154     return object_groups[index];
155   }
156
157
158   /**
159    * Increment the reference count for this material.
160    *
161    * A material with 0 references may be deleted by the
162    * material library.
163    */
164   virtual inline void ref () { refcount++; }
165
166
167   /**
168    * Decrement the reference count for this material.
169    */
170   virtual inline void deRef () { refcount--; }
171
172
173   /**
174    * Get the reference count for this material.
175    *
176    * @return The number of references (0 if none).
177    */
178   virtual inline int getRef () const { return refcount; }
179
180 protected:
181
182 \f
183   ////////////////////////////////////////////////////////////////////
184   // Protected methods.
185   ////////////////////////////////////////////////////////////////////
186
187   /**
188    * Initialization method, invoked by all public constructors.
189    */
190   virtual void init();
191
192
193 private:
194
195 \f
196   ////////////////////////////////////////////////////////////////////
197   // Internal state.
198   ////////////////////////////////////////////////////////////////////
199
200   // names
201   string texture_path;
202
203   // pointers to ssg states
204   ssgSimpleState *state;
205
206   // texture size
207   double xsize, ysize;
208
209   // wrap texture?
210   bool wrapu, wrapv;
211
212   // use mipmapping?
213   int mipmap;
214
215   // coverage of night lighting.
216   double light_coverage;
217
218   // material properties
219   sgVec4 ambient, diffuse, specular, emission;
220   double shininess;
221
222   // true if texture loading deferred, and not yet loaded
223   bool texture_loaded;
224
225   vector<SGMatModelGroup *> object_groups;
226
227   // ref count so we can properly delete if we have multiple
228   // pointers to this record
229   int refcount;
230
231
232 \f
233   ////////////////////////////////////////////////////////////////////
234   // Internal constructors and methods.
235   ////////////////////////////////////////////////////////////////////
236
237   SGMaterial( const string &fg_root, const SGMaterial &mat ); // unimplemented
238
239   void read_properties( const string &fg_root, const SGPropertyNode *props );
240   void build_ssg_state( bool defer_tex_load );
241   void set_ssg_state( ssgSimpleState *s );
242
243
244 };
245
246 #endif // _SG_MAT_HXX