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