00001 /************************************************************************/ 00002 /* Ex Nihlo Engine by Hermanns Christophe */ 00003 /************************************************************************/ 00004 /* This program is free software; you can redistribute it and/or */ 00005 /* modify it under the terms of the GNU General Public License */ 00006 /* as published by the Free Software Foundation; either version 2 */ 00007 /* of the License, or (at your option) any later version. */ 00008 /* */ 00009 /* This program is distributed in the hope that it will be useful, */ 00010 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ 00011 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ 00012 /* */ 00013 /* See the GNU General Public License for more details. */ 00014 /* */ 00015 /* You should have received a copy of the GNU General Public License */ 00016 /* along with this program; if not, write to the Free Software */ 00017 /* Foundation, Inc., 59 Temple Place - Suite 330, */ 00018 /* Boston, MA 02111-1307, USA. */ 00019 /* */ 00020 /* If you use a important part of this code please send me a mail */ 00021 /* I just want to see where my code go thks :) */ 00022 /************************************************************************/ 00023 00024 /************************************************************************/ 00025 /* Contact */ 00026 /************************************************************************/ 00027 /* ExNihilo Website :www.ploksoftware.org */ 00028 /* */ 00029 /* Hermanns Christophe ExNihilo creator and main programmer */ 00030 /* */ 00031 /* Mail : Data@ploksoftware.org */ 00032 /* ICQ : 8030901 */ 00033 /* MSN Messenger : Data_7@hotmail.com */ 00034 /* */ 00035 /* */ 00036 /************************************************************************/ 00037 00038 /************************************************************************/ 00039 /* File Description */ 00040 /************************************************************************/ 00041 /* File Name :ExCModel3DS.h */ 00042 /* */ 00043 /* Start Date :06/20/2003 */ 00044 /* */ 00045 /* Last Update :06/20/2003 */ 00046 /* */ 00047 /* File Description : */ 00048 /* */ 00049 /* For update of this file check : www.ploksoftware.org */ 00050 /************************************************************************/ 00051 00052 #ifndef __EXCMODEL3DS_H__ 00053 #define __EXCMODEL3DS_H__ 00054 //------------------------------------------------------------------------ 00055 //Includes 00056 //------------------------------------------------------------------------ 00057 #include "ExDefine.h" 00058 //------------------------------------------------------------------------ 00059 #include "Math/ExMath.h" 00060 #include "Math/ExCFrustum.h" 00061 //------------------------------------------------------------------------ 00062 #include "Object/Object3D/Model/ExCModel.h" 00063 //------------------------------------------------------------------------ 00064 #include "Object/Object3D/Gizmo/ExCGizmoRectangle.h" 00065 //------------------------------------------------------------------------ 00066 00067 //define relative to 3ds file format 00068 00069 //>------ Primary Chunk, at the beginning of each file 00070 #define PRIMARY 0x4D4D 00071 //>------ Main Chunks 00072 #define OBJECTINFO 0x3D3D // This gives the version of the mesh and is found right before the material and object information 00073 #define EDITKEYFRAME 0xB000 // This is the header for all of the key frame info 00074 #define FILEVERSION 0x0002 00075 //>------ common chunk 00076 #define INT_PERCENTAGE 0x0030 00077 #define PERCENTAGE 0x0031 00078 //>------ sub defines of OBJECTINFO 00079 #define MATERIAL 0xAFFF // This stored the texture info 00080 #define OBJECT 0x4000 // This stores the faces, vertices, etc... 00081 #define MESH_VERSION 0x3D3E 00082 #define MASTER_SCALE 0x0100 00083 00084 //>------ sub defines of MATERIAL 00085 00086 00087 #define MATNAME 0xA000 // The material name TYPE:ascii 00088 #define MATAMBIENTCOLOR 0xA010 // The material ambient color TYPE:s 00089 #define MATDIFFUSE 0xA020 // The material diffuse color TYPE:s 00090 #define MATSPECULAR 0xA030 // The material specular color TYPE:s 00091 #define MATSHININESS 0xA040 // The shininess TYPE:s 00092 #define MATSHININESSSTR 0xA041 // The shininess strenght TYPE:s 00093 #define MATTRANSPARENCY 0xA050 00094 #define MATTRANSFALLOFF 0xA052 00095 #define MATREFLECTBLUR 0xA053 00096 #define MATTWOSIDED 0xA081 00097 #define MATTRANSPARENCYADD 0xA083 00098 #define MATSELFILUM 0xA084 00099 #define MATWIREON 0xA085 00100 #define MATWIRETHICKNESS 0xA087 00101 #define MATFACEMAP 0xA088 00102 #define MATTRANSFALLOFFIN 0xA08A 00103 #define MATSOFTEN 0xA08C 00104 #define MAT3DWIRETHICKNESS 0xA08E 00105 #define MATTYPE 0xA100 00106 #define MATMAP 0xA200 // This is a header for a new material 00107 #define MATMAPFILE 0xA300 // This holds the file name of the texture 00108 #define MATMAPOPTION 0xA351 00109 #define MATMAPFILTERINGBLUR 0xA353 00110 00111 00112 #define OBJECT_MESH 0x4100 // This lets us know that we are reading a new object 00113 //>------ sub defines of OBJECT_MESH 00114 #define OBJECT_VERTICES 0x4110 // The objects vertices 00115 #define OBJECT_FACES 0x4120 // The objects faces 00116 #define OBJECT_MATERIAL 0x4130 // This is found if the object has a material, either texture map or color 00117 #define OBJECT_UV 0x4140 // The UV texture coordinates 00118 #define OBJECT_SMOOTH_GROUP 0x4150 00119 #define OBJECT_MESH_MATRIX 0x4160 00120 00121 struct tChunk 00122 { 00123 unsigned short int ID; // The chunk's ID 00124 unsigned int length; // The length of the chunk 00125 unsigned int bytesRead; // The amount of bytes read within that chunk 00126 }; 00127 struct tFace 00128 { 00129 int vertIndex[3]; // indicies for the verts that make up this triangle 00130 int coordIndex[3]; // indicies for the tex coords to texture this face 00131 }; 00132 struct tMaterialInfo 00133 { 00134 char strName[255]; // The texture name 00135 char strFile[255]; // The texture file name (If this is set it's a texture map) 00136 BYTE color[3]; // The color of the object (R, G, B) 00137 int texureId; // the texture ID 00138 float uTile; // u tiling of texture (Currently not used) 00139 float vTile; // v tiling of texture (Currently not used) 00140 float uOffset; // u offset of texture (Currently not used) 00141 float vOffset; // v offset of texture (Currently not used) 00142 } ; 00143 struct t3DObject 00144 { 00145 int numOfVerts; // The number of verts in the model 00146 int numOfFaces; // The number of faces in the model 00147 int numTexVertex; // The number of texture coordinates 00148 int materialID; // The texture ID to use, which is the index into our texture array 00149 bool bHasTexture; // This is TRUE if there is a texture map for this object 00150 char strName[255]; // The name of the object 00151 std::string Material; 00152 std::vector<ExCVec3D> Verts; // The object's vertices 00153 std::vector<ExCVec3D> Normals; // The object's normals 00154 std::vector<ExCVec2D> TexVerts; // The texture's UV coordinates 00155 std::vector<tFace> Faces; // The faces information of the object 00156 00157 float *TabVertices; 00158 float *TabTextures; 00159 00160 ExCGizmoRectangle m_BoxForFrustrum; 00161 GLuint m_ListId; 00162 }; 00163 //-------------------------------- 00164 class ExCModel3DS : public ExCModel 00165 { 00166 protected: 00167 00168 //-------------------------------- 00169 // Variable 00170 //-------------------------------- 00171 FILE *m_filePtr; 00172 //-------------------------------- 00173 // Methode 00174 //-------------------------------- 00175 void ReadObjectInfo(tChunk *chunk); 00176 void ReadObject(tChunk *chunk); 00177 void ReadObjectMaterial(tChunk *chunk); 00178 00179 void ReadChunk(tChunk *chunk); 00180 void Skip(tChunk *chunk); 00181 00182 void ReadVertices(t3DObject *pObject, tChunk *chunk); 00183 void ReadFace(t3DObject *pObject, tChunk *chunk); 00184 void ReadUVCoordinates(t3DObject *pObject, tChunk *chunk); 00185 void ReadObjectMaterial(t3DObject *pObject, tChunk *chunk); 00186 00187 int numOfObjects; // The number of objects in the model 00188 int numOfMaterials; // The number of materials for the model 00189 std::vector<tMaterialInfo> m_VecMaterials; // The list of material information (Textures and colors) 00190 00191 00192 tChunk *m_CurrentChunk; 00193 tChunk *m_TempChunk; 00194 GLuint m_ListId; 00195 00196 00197 00198 float *m_VertexArray; //vertex Arrray 00199 unsigned int *m_FaceArray; //Faces Array 00200 float *m_TextureArray; //texture Arrray 00201 void BuildArray(int Rendu); 00202 std::vector<std::string> m_VecAction; 00203 std::vector<std::string>::iterator m_IVecAction; 00204 00205 00206 PFNGLBINDBUFFERARBPROC glBindBufferARB ; 00207 PFNGLGENBUFFERSARBPROC glGenBuffersARB ; 00208 PFNGLBUFFERDATAARBPROC glBufferDataARB ; 00209 public: 00210 bool HasList; 00211 bool HasArray; 00212 std::vector<t3DObject> *m_VecObject; // The object list for our model 00213 //-------------------------------- 00214 // Constructor // Destructor 00215 //-------------------------------- 00216 ExCModel3DS(void); 00217 ~ExCModel3DS(void); 00218 //-------------------------------- 00219 // Methode 00220 //-------------------------------- 00221 void BuildList(int Rendu); 00222 void Draw(void); 00223 void CallAllList(void); 00224 void CallAllArray(void); 00225 bool Load(std::string FileName); 00226 void StartAction(std::string Action); 00227 void StopAction(std::string Action); 00228 void Process(std::string Action); 00229 void ProcessAllAction(void); 00230 ExCAction InputAction(ExCAction Action); 00231 bool IsAction(std::string Action); 00232 }; 00233 #endif //__EXCMODEL3DS_H__