]> git.mxchange.org Git - flightgear.git/blob - src/Objects/newmat.hxx
0aaee654f6e7feec0cc284a821524a78a2712570
[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 protected:
174
175 \f
176   ////////////////////////////////////////////////////////////////////
177   // Protected methods.
178   ////////////////////////////////////////////////////////////////////
179
180   /**
181    * Initialization method, invoked by all public constructors.
182    */
183   virtual void init();
184
185
186 private:
187
188 \f
189   ////////////////////////////////////////////////////////////////////
190   // Internal state.
191   ////////////////////////////////////////////////////////////////////
192
193   // names
194   string texture_path;
195
196   // pointers to ssg states
197   ssgStateSelector *state;
198   ssgSimpleState *textured;
199   ssgSimpleState *nontextured;
200
201   // alpha texture?
202   bool alpha;
203   
204   // texture size
205   double xsize, ysize;
206
207   // wrap texture?
208   bool wrapu, wrapv;
209
210   // use mipmapping?
211   int mipmap;
212
213   // coverage of night lighting.
214   double light_coverage;
215
216   // material properties
217   sgVec4 ambient, diffuse, specular, emission;
218
219   // true if texture loading deferred, and not yet loaded
220   bool texture_loaded;
221
222   // ref count so we can properly delete if we have multiple
223   // pointers to this record
224   int refcount;
225
226
227 \f
228   ////////////////////////////////////////////////////////////////////
229   // Internal constructors and methods.
230   ////////////////////////////////////////////////////////////////////
231
232   FGNewMat (const FGNewMat &mat); // unimplemented
233
234   void read_properties (const SGPropertyNode * props);
235   void build_ssg_state(bool defer_tex_load = false);
236   void set_ssg_state( ssgSimpleState *s );
237
238 };
239
240 #endif // _NEWMAT_HXX