1 /*
2  *  JLib - Jacob's Library.
3  *  Copyright (C) 2003, 2004  Juan Carlos Seijo P�rez
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Library General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Library General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Library General Public
16  *  License along with this library; if not, write to the Free
17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  *
19  *  Juan Carlos Seijo P�rez
20  *  jacob@mainreactor.net
21  */
22 
23 /** Definiciones para geometr�a 3D para OpenGL.
24  * @file    JGLMesh.h
25  * @author  Juan Carlos Seijo P�rez
26  * @date    10/05/2004
27  * @version 0.0.1 - 10/05/2004 - Primera versi�n.
28  * @notes: Ficheros ASE - Curiosidad de MAX 5, pongo el ejemplo:
29  * Supongamos una escena con tres bolas que comparten el mismo material multi/subobjeto
30  * compuesto de tres submateriales de id 1, 2 y 3, respectivamente. Si las bolas
31  * tienen id's 1, 2 y 3 respectivamente se asignar�n de esa forma los submateriales
32  * a cada una de ellas. Sin embargo si alguna de ellas tiene un valor diferente (mayor),
33  * el material que aplica MAX es el resto de dividir el id de la bola menos uno entre el n�mero
34  * de submateriales del material y todo eso m�s uno.
35  * As� si las bolas tienen id's 1, 22 y 7, respectivamente,
36  * - a la bola con MTLID 1 se le asigna el submaterial: ((1-1)%3) + 1 = (0%3) + 1 = 0 + 1 = 1
37  * - a la bola con MTLID 23 se le asigna el submaterial: ((23-1)%3) + 1 = (21%3) + 1 = 0 + 1 = 1
38  * - a la bola con MTLID 7 se le asigna el submaterial: ((8-1)%3) + 1 = (7%3) + 1 = 1 + 1 = 2
39  *
40  * Notad que en el fichero ASE el MTLID es uno menos que en la escena ya.
41  */
42 
43 #ifndef _JGLMESH_INCLUDED
44 #define _JGLMESH_INCLUDED
45 
46 #include <JLib/Util/JTypes.h>
47 #include <JLib/Util/JString.h>
48 #include <JLib/Util/JTextFile.h>
49 #include <JLib/Math/JVector.h>
50 #include <JLib/Graphics/JDrawable.h>
51 #include <JLib/Graphics/JASEFormat.h>
52 #include <JLib/Graphics/JGLTexture.h>
53 
54 /** Color RGB. Todas las componentes van de 0.0f a 1.0f.
55  */
56 struct JColor
57 {
58   float r;                              /**< Componente roja. */
59   float g;                              /**< Componente verde. */
60   float b;                              /**< Componente azul. */
61   float a;                              /**< Componente alfa. */
62 };
63 
64 class JMaterial
65 {
66  public:
67 	/** Crea un material vac�o.
68 	 */
JMaterial()69 	JMaterial(): texture(0)
70 	{}
71 
72   JGLTexture *texture;                  /**< Textura asociada. */
73   s32 parentId;                         /**< Id del padre. */
74   s32 id;                               /**< Id. */
75   bool isSubMaterial;                   /**< Indica si es submaterial. */
76   bool isMulti;                         /**< Indica si es Multi/sub-objeto. */
77   s32 numSubMaterials;                  /**< N�meor de submateriales. */
78   s8 mtlClass[32];                      /**< Tipo de material. */
79   JColor ambient;                       /**< Color ambiente. */
80   JColor diffuse;                       /**< Color difuso. */
81   JColor specular;                      /**< Color especular. */
82   float shine;                          /**< Cantidad de brillo. */
83   float shineStrenght;                  /**< Intensidad de brillo. */
84   float transparency;                   /**< Transparencia. */
85   float selfIllum;                      /**< Iluminaci�n propia. */
86 
87 	/** Devuelve la textura asociada a este material.
88 	 * @return La textura asociada a este material.
89 	 */
Texture()90 	JGLTexture * Texture()
91 	{
92 		return texture;
93 	}
94 
95 	/** Libera los recursos asociados.
96 	 */
97 	void Destroy();
98 
99 	/** Destruye el material y libera los recursos asociados.
100 	 */
~JMaterial()101 	~JMaterial() {Destroy();}
102 };
103 
104 typedef JVector JVertex;
105 
106 /** Coordenada de textura.
107  */
108 struct JTextureVertex
109 {
110   float u;                              /**< Componente u. */
111   float v;                              /**< Componente v. */
112 };
113 
114 /** Cara.
115  */
116 class JFace
117 {
118  public:
119   /** Crea el objeto.
120 	 */
JFace()121   JFace() : material(0) {}
122   s32 v1;                               /**< V�rtice 1. */
123   s32 v2;                               /**< V�rtice 2. */
124   s32 v3;                               /**< V�rtice 3. */
125   JMaterial *material;                  /**< material asociado. */
126   JVector normal;                       /**< Vector normal. */
127 };
128 
129 /** Cara con textura.
130  */
131 struct JTextureFace
132 {
133   s32 v1;                               /**< V�rtice 1. */
134   s32 v2;                               /**< V�rtice 2. */
135   s32 v3;                               /**< V�rtice 3. */
136 };
137 
138 /** Clase de objeto 3D para OpenGL. Un objeto se compone de
139  * v�rtices agrupados en caras, posiblemente texturizadas.
140  * N�tese que los materiales se asignan a nivel de geometr�a.
141  */
142 class JGLMeshObject
143 {
144  public:
145   JString name;                         /**< Nombre. */
146   s32 numVertices;                      /**< N�mero de v�rtices. */
147   s32 numTVertices;                     /**< N�mero de v�rtices de textura. */
148   s32 numFaces;                         /**< N�mero de caras. */
149   s32 numTFaces;                        /**< N�mero de caras de textura. */
150   JVertex *vertices;                    /**< V�rtices. */
151   JTextureVertex *tVertices;            /**< V�rtices de textura. */
152   JVector *vertexNormals;               /**< Normales a los v�rtices. */
153   JFace *faces;                         /**< Caras. */
154   JTextureFace *tFaces;                 /**< Caras de textura. */
155 
156   /** Crea el objeto vac�o.
157 	 */
JGLMeshObject()158   JGLMeshObject() : vertices(0), tVertices(0), vertexNormals(0), faces(0), tFaces(0)
159 	{}
160 
161 	/** Devuelve el nombre de esta geometr�a.
162 	 * @return nombre de esta geometr�a.
163 	 */
Name()164 	const JString & Name()
165 	{
166 		return name;
167 	}
168 
169 	/** Establece el nombre de esta geometr�a.
170 	 * @param  newName nombre de esta geometr�a.
171 	 */
Name(const JString & newName)172 	void Name(const JString & newName)
173 	{
174 		name = newName;
175 	}
176 
177 	/** Devuelve el n�mero de v�rtices de la geometr�a.
178 	 * @return N�mero de v�rtices de la geometr�a.
179 	 */
NumVertices()180 	s32 NumVertices()
181 	{
182 		return numVertices;
183 	}
184 
185 	/** Devuelve el n�mero de v�rtices de textura de la geometr�a.
186 	 * @return El n�mero de v�rtices de textura de la geometr�a.
187 	 */
NumTVertices()188 	s32 NumTVertices()
189 	{
190 		return numTVertices;
191 	}
192 
193 	/** Devuelve el n�mero de caras de la geometr�a.
194 	 * @return El n�mero de caras de la geometr�a.
195 	 */
NumFaces()196 	s32 NumFaces()
197 	{
198 		return numFaces;
199 	}
200 
201 	/** Devuelve el n�mero de caras de textura de la geometr�a.
202 	 * @return El n�mero de caras de textura de la geometr�a.
203 	 */
NumTFaces()204 	s32 NumTFaces()
205 	{
206 		return numTFaces;
207 	}
208 
209 	/** Devuelve los v�rtices de la geometr�a.
210 	 * @return V�rtices de la geometr�a.
211 	 */
Vertices()212 	JVertex * Vertices()
213 	{
214 		return vertices;
215 	}
216 
217 	/** Devuelve los v�rtices de textura de la geometr�a.
218 	 * @return V�rtices De Textura de la geometr�a.
219 	 */
TVertices()220 	JTextureVertex * TVertices()
221 	{
222 		return tVertices;
223 	}
224 
225 	/** Devuelve las normales a los v�rtices de la geometr�a.
226 	 * @return Las normales a los v�rtices de la geometr�a.
227 	 */
VertexNormals()228 	JVector * VertexNormals()
229 	{
230 		return vertexNormals;
231 	}
232 
233 	/** Devuelve las caras de la geometr�a.
234 	 * @return Las caras de la geometr�a.
235 	 */
Faces()236 	JFace * Faces()
237 	{
238 		return faces;
239 	}
240 
241 	/** Devuelve las caras de textura de la geometr�a.
242 	 * @return Las caras de textura de la geometr�a.
243 	 */
TFaces()244 	JTextureFace * TFaces()
245 	{
246 		return tFaces;
247 	}
248 
249 	/** Libera los recursos asociados a este objeto.
250 	 */
251 	void Destroy();
252 
253 	/** Destruye el objeto.
254 	 */
~JGLMeshObject()255 	virtual ~JGLMeshObject() {Destroy();}
256 };
257 
258 /** Clase de geometr�a 3D para OpenGL. Consiste de una serie de objetos 3D
259  * y sus correspondientes materiales.
260  */
261 class JGLMesh : public JDrawable
262 {
263  protected:
264   s32 numMaterials;                     /**< N�mero de materiales. */
265   s32 numObjects;                       /**< N�mero de objetos. */
266   JMaterial *materials;                 /**< Materiales. */
267   JGLMeshObject *objects;               /**< Objetos 3D de esta geometr�a. */
268 
269 	JTextFile f;                          /**< Fichero de carga de objetos. */
270 
271 	/** Carga los materiales de la geometr�a desde el fichero ASE abierto por LoadASE.
272 	 * @return <b>true</b> si se pudieron cargar, <b>false</b> si no.
273 	 */
274 	bool LoadASEMaterials();
275 
276 	/** Carga los objetos de la geometr�a desde el fichero ASE abierto por LoadASE.
277 	 * @return <b>true</b> si se pudieron cargar, <b>false</b> si no.
278 	 */
279 	bool LoadASEObjects();
280 
281  public:
282 	/** Construye la geometr�a vac�a, lista para cargarse con Load().
283 	 */
JGLMesh()284 	JGLMesh() : materials(0), objects(0)
285 	{}
286 
287 	/** Devuelve el n�mero de materiales de la geometr�a.
288 	 * @return El n�mero de materiales de la geometr�a.
289 	 */
NumMaterials()290 	s32 NumMaterials()
291 	{
292 		return numMaterials;
293 	}
294 
295 	/** Devuelve el n�mero de objetos de esta geometr�a.
296 	 * @return El n�mero de objetos de esta geometr�a.
297 	 */
NumObjects()298 	s32 NumObjects()
299 	{
300 		return numObjects;
301 	}
302 
303 	/** Devuelve los materiales de la geometr�a.
304 	 * @return Los materiales de la geometr�a.
305 	 */
Materials()306 	JMaterial * Materials()
307 	{
308 		return materials;
309 	}
310 
311 	/** Devuelve los objetos de esta geometr�a.
312 	 * @return los objetos de esta geometr�a.
313 	 */
Objects()314 	JGLMeshObject * Objects()
315 	{
316 		return objects;
317 	}
318 
319 	/** Dibuja la geometr�a.
320 	 */
321 	void Draw();
322 
323 	/** Carga la geometr�a desde el fichero dado.
324 	 * Por ahora el fichero puede ser formato ASE �nicamente.
325 	 * @return <b>true</b> si se pudo cargar, <b>false</b> si no.
326 	 */
327 	bool LoadASE(const JString &filename);
328 
329 	/** Carga la geometr�a desde el fichero J3D dado. Los ficheros J3D se generan a partir de Blender (www.blender.org)
330    * con ayuda del script de exportaci�n 'JExporter'.
331 	 * @return <b>true</b> si se pudo cargar, <b>false</b> si no.
332 	 */
333 	bool LoadJ3D(const JString &filename);
334 
335 	/** Libera los recursos asociados a este objeto.
336 	 */
337 	void Destroy();
338 
339 	/** Destruye el objeto.
340 	 */
~JGLMesh()341 	virtual ~JGLMesh() {Destroy();}
342 };
343 
344 #endif // _JGLMESH_INCLUDED
345