00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __3DSLOAD__
00021 #define __3DSLOAD__
00022
00023 #include "jed_defs.h"
00024 #include "color.h"
00025 #include "toolkits/geom/mesh.h"
00026 #include "arreglo.h"
00027
00028 #define MAXNAMESIZE 50
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 enum ENUM_CHUNKS_3DS {
00043
00044 CHUNK3DS_MAIN = 0x4D4D,
00045
00046
00047
00048
00049 CHUNK3DS_OBJMESH = 0x3D3D,
00050 CHUNK3DS_BKGCOLOR = 0x1200,
00051 CHUNK3DS_AMBCOLOR = 0x2100,
00052 CHUNK3DS_OBJBLOCK = 0x4000,
00053 CHUNK3DS_TRIMESH = 0x4100,
00054 CHUNK3DS_VERTLIST = 0x4110,
00055 CHUNK3DS_FACELIST = 0x4120,
00056 CHUNK3DS_FACEMAT = 0x4130,
00057 CHUNK3DS_SMOOLIST = 0x4150,
00058 CHUNK3DS_MAPLIST = 0x4140,
00059 CHUNK3DS_TRMATRIX = 0x4160,
00060 CHUNK3DS_LIGHT = 0x4600,
00061 CHUNK3DS_SPOTLIGHT = 0x4610,
00062 CHUNK3DS_CAMERA = 0x4700,
00063 CHUNK3DS_MATERIAL = 0xAFFF,
00064 CHUNK3DS_MATNAME = 0xA000,
00065 CHUNK3DS_SHININESS = 0xA040,
00066 CHUNK3DS_SHINE_STRENGTH = 0xA041,
00067 CHUNK3DS_DOUBLESIDED = 0xA081,
00068 CHUNK3DS_TRANSPARENCY = 0xA050,
00069 CHUNK3DS_AMOUNT = 0x0030,
00070 CHUNK3DS_AMBIENT = 0xA010,
00071 CHUNK3DS_DIFFUSE = 0xA020,
00072 CHUNK3DS_SPECULAR = 0xA030,
00073 CHUNK3DS_TEXTURE = 0xA200,
00074 CHUNK3DS_BUMPMAP = 0xA230,
00075 CHUNK3DS_MAPFILENAME = 0xA300,
00076 CHUNK3DS_MAPOPTIONS = 0xA351,
00077
00078
00079 CHUNK3DS_KEYFRAMER = 0xB000,
00080 CHUNK3DS_FRAMES = 0xB008,
00081
00082
00083 CHUNK3DS_RGB1 = 0x0010,
00084 CHUNK3DS_RGB2 = 0x0011,
00085 CHUNK3DS_RGB3 = 0x0012,
00086
00087
00088 CHUNK3DS_JEDILINK = 0x0002
00089 };
00090
00091 class MESH_3DS;
00092 class ESCENA_3DS;
00093
00094 class TEXTURE_DATA {
00095 public:
00096 char texturename[MAXNAMESIZE];
00097 WORD options;
00098 };
00099
00100 class VERTLIST_DATA {
00101 private:
00102 FLOAT32 x;
00103 FLOAT32 y;
00104 FLOAT32 z;
00105 public:
00106 friend class MESH_3DS;
00107 friend void importar_3DS(ESCENA_3DS *Scene,MESH *Geometria,BOOLEAN *b,
00108 double *Escala_optima);
00109 };
00110
00111 class FACELIST_DATA {
00112 private:
00113 WORD p0,p1,p2;
00114 WORD flags;
00115 public:
00116 friend class MESH_3DS;
00117 friend void importar_3DS(ESCENA_3DS *Scene,MESH *Geometria,BOOLEAN *b,
00118 double *Escala_optima);
00119 };
00120
00121 class MAPLIST_DATA {
00122 private:
00123 FLOAT32 u;
00124 FLOAT32 v;
00125 public:
00126 friend class MESH_3DS;
00127 friend void importar_3DS(ESCENA_3DS *Scene,MESH *Geometria,BOOLEAN *b,
00128 double *Escala_optima);
00129 };
00130
00131 class MATERIAL_3DS {
00132 public:
00133 char name[MAXNAMESIZE];
00134 COLOR ambient;
00135 COLOR diffuse;
00136 COLOR specular;
00137 WORD mat_type;
00138 int doublesided;
00139 TEXTURE_DATA texture;
00140 int offset;
00141 FLOAT32 alpha;
00142 };
00143
00144 class MATERIAL_ARR {
00145 private:
00146 char name[MAXNAMESIZE];
00147 unsigned int NumFaces;
00148 UWORD *faces;
00149 public:
00150 friend class MESH_3DS;
00151 friend class ESCENA_3DS;
00152 friend void importar_3DS(ESCENA_3DS *Scene,MESH *Geometria,BOOLEAN *b,
00153 double *Escala_optima);
00154 };
00155
00156
00157 class MESH_3DS {
00158 private:
00159
00160 FILE *fd;
00161 char name[MAXNAMESIZE];
00162 int NumFaces;
00163 int vertices_tam;
00164 int NumMaps;
00165 BOOLEAN con_matriz;
00166 FACELIST_DATA *facelist;
00167 VERTLIST_DATA *vertices_arr;
00168 MAPLIST_DATA *maplist;
00169 FLOAT32 TraMatrix[3*4];
00170 int offset;
00171 MATERIAL_ARR *anx_data(void);
00172
00173 int jed_tam;
00174 MATERIAL_ARR *jed_arr;
00175
00176
00177
00178 void leer_trozo_VERTLIST(void);
00179 WORD leer_trozo_FACELIST(void);
00180 void leer_trozo_MAPLIST(void);
00181 void leer_trozo_TRMATRIX(void);
00182 void leer_trozo_FACEMAT(void);
00183 void asignar_material_por_defecto(WORD nf);
00184
00185 friend class ESCENA_3DS;
00186 friend void importar_3DS(ESCENA_3DS *Scene,MESH *Geometria,BOOLEAN *b,
00187 double *Escala_optima);
00188
00189 public:
00190 MESH_3DS();
00191 };
00192
00193 class ESCENA_3DS {
00194 private:
00195
00196
00197 ARREGLO <MESH_3DS> arr_mesh;
00198 ARREGLO <MATERIAL_3DS> arr_material;
00199
00200 BOOLEAN flag_caras_dobles;
00201 BOOLEAN flag_alpha_blending;
00202 BOOLEAN flag_material_por_defecto;
00203
00204 BOOLEAN _muerta;
00205 char *_nombre_de_archivo;
00206 FILE *fd;
00207
00208
00209 void leer_trozo_MAIN(DWORD p);
00210 void leer_trozo_OBJMESH(DWORD p);
00211 void leer_trozo_OBJBLOCK(DWORD p);
00212 void leer_trozo_MATERIAL(DWORD p);
00213 void leer_trozo_TRIMESH(DWORD p, char *name);
00214 void leer_trozo_SHADING(DWORD p, COLOR *rgb);
00215 void leer_trozo_MATNAME(DWORD p, MATERIAL_3DS *mat);
00216 void leer_trozo_DOUBLESIDED(int *material_doublesided);
00217 void leer_trozo_TRANSPARENCY(DWORD p, FLOAT32 *alpha);
00218 void leer_trozo_TEXTURE(DWORD p, TEXTURE_DATA *texture);
00219 void leer_trozo_RGBByte(COLOR *rgb);
00220 void leer_trozo_RGBFloat(COLOR *rgb);
00221 void leer_trozo_AMOUNT(WORD *amount);
00222 void leer_trozo_MAPFILENAME(DWORD p, TEXTURE_DATA *texture);
00223
00224 MESH_3DS *anx_mesh(void);
00225 MATERIAL_3DS *anx_material(void);
00226
00227 public:
00228
00229 ESCENA_3DS(char *archivo);
00230 ~ESCENA_3DS();
00231 BOOLEAN leer(FILE *_fd);
00232 BOOLEAN muerta(void);
00233
00234
00235 friend ESCENA_3DS *HRead3dsScene(DWORD size);
00236 friend void importar_3DS(ESCENA_3DS *Scene,MESH *Geometria,BOOLEAN *b,
00237 double *Escala_optima);
00238 };
00239
00240 extern void importar_3DS(ESCENA_3DS *Scene,MESH *Geometria,BOOLEAN *b,
00241 double *Escala_optima);
00242
00243 #endif // __3DSLOAD__
00244
00245
00246
00247
00248