]> git.mxchange.org Git - flightgear.git/blob - src/Objects/newmat.hxx
Substantial rewrite of FGNewMat, the material class. Most of the
[flightgear.git] / src / Objects / newmat.hxx
1 // newmat.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 _NEWMAT_HXX
27 #define _NEWMAT_HXX
28
29 #ifndef __cplusplus                                                          
30 # error This library requires C++
31 #endif                                   
32
33 #ifdef HAVE_CONFIG_H
34 #  include <config.h>
35 #endif
36
37 #ifdef HAVE_WINDOWS_H
38 #  include <windows.h>
39 #endif
40
41 #include <plib/sg.h>
42 #include <plib/ssg.h>
43
44 #include <simgear/compiler.h>
45 #include <simgear/misc/props.hxx>
46
47 #include <GL/glut.h>
48
49 #include STL_STRING      // Standard C++ string library
50
51 SG_USING_STD(string);
52
53
54 /**
55  * A material in the scene graph.
56  *
57  * A material represents information about a single surface type
58  * in the 3D scene graph, including texture, colour, lighting,
59  * tiling, and so on; most of the materials in FlightGear are
60  * defined in the $FG_ROOT/materials.xml file, and can be changed
61  * at runtime.
62  */
63 class FGNewMat {
64
65 public:
66
67 \f
68   ////////////////////////////////////////////////////////////////////
69   // Public Constructors.
70   ////////////////////////////////////////////////////////////////////
71
72   /**
73    * Construct a material from a set of properties.
74    *
75    * @param props A property node containing subnodes with the
76    * state information for the material.  This node is usually
77    * loaded from the $FG_ROOT/materials.xml file.
78    */
79   FGNewMat (const SGPropertyNode * props);
80
81
82   /**
83    * Construct a material from an absolute texture path.
84    *
85    * @param texture_path A string containing an absolute path
86    * to a texture file (usually RGB).
87    */
88   FGNewMat (const string &texture_path);
89
90
91   /**
92    * Construct a material around an existing SSG state.
93    *
94    * This constructor allows the application to create a custom,
95    * low-level state for the scene graph and wrap a material around
96    * it.  Note: the pointer ownership is transferred to the material.
97    *
98    * @param s The SSG state for this material.
99    */
100   FGNewMat (ssgSimpleState * s);
101
102   /**
103    * Destructor.
104    */
105   virtual ~FGNewMat ( void );
106
107
108 \f
109   ////////////////////////////////////////////////////////////////////
110   // Public methods.
111   ////////////////////////////////////////////////////////////////////
112
113   /**
114    * Force the texture to load if it hasn't already.
115    *
116    * @return true if the texture loaded, false if it was loaded
117    * already.
118    */
119   virtual bool load_texture ();
120
121
122   /**
123    * Get the textured state.
124    */
125   virtual inline ssgSimpleState *get_textured () { return textured; }
126
127
128   /**
129    * Get the xsize of the texture, in meters.
130    */
131   virtual inline double get_xsize() const { return xsize; }
132
133
134   /**
135    * Get the ysize of the texture, in meters.
136    */
137   virtual 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   virtual inline double get_light_coverage () const { return light_coverage; }
148
149
150   /**
151    * Get the current state.
152    */
153   virtual inline ssgStateSelector *get_state() const { return state; }
154
155
156   /**
157    * Add a reference to the texture.
158    */
159   virtual inline void ref() { refcount++; }
160
161
162   /**
163    * Remove a reference from the texture.
164    */
165   virtual inline void deRef() { refcount--; }
166
167
168   /**
169    * Get the number of references to the texture.
170    */
171   virtual inline int getRef() const { return refcount; }
172
173
174 private:
175
176 \f
177   ////////////////////////////////////////////////////////////////////
178   // Internal state.
179   ////////////////////////////////////////////////////////////////////
180
181   // names
182   string texture_path;
183
184   // pointers to ssg states
185   ssgStateSelector *state;
186   ssgSimpleState *textured;
187   ssgSimpleState *nontextured;
188
189   // alpha texture?
190   bool alpha;
191   
192   // texture size
193   double xsize, ysize;
194
195   // wrap texture?
196   bool wrapu, wrapv;
197
198   // use mipmapping?
199   int mipmap;
200
201   // coverage of night lighting.
202   double light_coverage;
203
204   // material properties
205   sgVec4 ambient, diffuse, specular, emission;
206
207   // true if texture loading deferred, and not yet loaded
208   bool texture_loaded;
209
210   // ref count so we can properly delete if we have multiple
211   // pointers to this record
212   int refcount;
213
214
215 \f
216   ////////////////////////////////////////////////////////////////////
217   // Internal constructors and methods.
218   ////////////////////////////////////////////////////////////////////
219
220   FGNewMat ();
221   FGNewMat (const FGNewMat &mat); // unimplemented
222
223   void read_properties (const SGPropertyNode * props);
224   void build_ssg_state(bool defer_tex_load = false);
225   void set_ssg_state( ssgSimpleState *s );
226
227 };
228
229 #endif // _NEWMAT_HXX