00001
00002 #ifndef INCLUDED_LIB3DS_IMPL_H
00003 #define INCLUDED_LIB3DS_IMPL_H
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00025 #include "lib3ds.h"
00026 #include <stdio.h>
00027 #include <stdlib.h>
00028 #include <stdarg.h>
00029 #include <string.h>
00030 #include <math.h>
00031 #include <float.h>
00032 #include <assert.h>
00033 #include <setjmp.h>
00034 #include <stdarg.h>
00035
00036 #ifdef _MSC_VER
00037 #pragma warning ( disable : 4996 )
00038 #endif
00039
00040 #ifndef _MSC_VER
00041 #include <stdint.h>
00042 #else
00043 typedef unsigned __int8 uint8_t;
00044 typedef unsigned __int16 uint16_t;
00045 typedef unsigned __int32 uint32_t;
00046 typedef signed __int8 int8_t;
00047 typedef signed __int16 int16_t;
00048 typedef signed __int32 int32_t;
00049 #endif
00050
00051 #ifndef TRUE
00052 #define TRUE 1
00053 #endif
00054 #ifndef FALSE
00055 #define FALSE 0
00056 #endif
00057
00058 #define LIB3DS_EPSILON (1e-5)
00059 #define LIB3DS_PI 3.14159265358979323846
00060 #define LIB3DS_TWOPI (2.0*LIB3DS_PI)
00061 #define LIB3DS_HALFPI (LIB3DS_PI/2.0)
00062 #define LIB3DS_RAD_TO_DEG(x) ((180.0/LIB3DS_PI)*(x))
00063 #define LIB3DS_DEG_TO_RAD(x) ((LIB3DS_PI/180.0)*(x))
00064
00065 #ifdef __cplusplus
00066 extern "C" {
00067 #endif
00068
00069 typedef enum Lib3dsChunks {
00070 CHK_NULL_CHUNK =0x0000,
00071 CHK_M3DMAGIC =0x4D4D,
00072 CHK_SMAGIC =0x2D2D,
00073 CHK_LMAGIC =0x2D3D,
00074 CHK_MLIBMAGIC =0x3DAA,
00075 CHK_MATMAGIC =0x3DFF,
00076 CHK_CMAGIC =0xC23D,
00077 CHK_M3D_VERSION =0x0002,
00078 CHK_M3D_KFVERSION =0x0005,
00079
00080 CHK_COLOR_F =0x0010,
00081 CHK_COLOR_24 =0x0011,
00082 CHK_LIN_COLOR_24 =0x0012,
00083 CHK_LIN_COLOR_F =0x0013,
00084 CHK_INT_PERCENTAGE =0x0030,
00085 CHK_FLOAT_PERCENTAGE =0x0031,
00086
00087 CHK_MDATA =0x3D3D,
00088 CHK_MESH_VERSION =0x3D3E,
00089 CHK_MASTER_SCALE =0x0100,
00090 CHK_LO_SHADOW_BIAS =0x1400,
00091 CHK_HI_SHADOW_BIAS =0x1410,
00092 CHK_SHADOW_MAP_SIZE =0x1420,
00093 CHK_SHADOW_SAMPLES =0x1430,
00094 CHK_SHADOW_RANGE =0x1440,
00095 CHK_SHADOW_FILTER =0x1450,
00096 CHK_RAY_BIAS =0x1460,
00097 CHK_O_CONSTS =0x1500,
00098 CHK_AMBIENT_LIGHT =0x2100,
00099 CHK_BIT_MAP =0x1100,
00100 CHK_SOLID_BGND =0x1200,
00101 CHK_V_GRADIENT =0x1300,
00102 CHK_USE_BIT_MAP =0x1101,
00103 CHK_USE_SOLID_BGND =0x1201,
00104 CHK_USE_V_GRADIENT =0x1301,
00105 CHK_FOG =0x2200,
00106 CHK_FOG_BGND =0x2210,
00107 CHK_LAYER_FOG =0x2302,
00108 CHK_DISTANCE_CUE =0x2300,
00109 CHK_DCUE_BGND =0x2310,
00110 CHK_USE_FOG =0x2201,
00111 CHK_USE_LAYER_FOG =0x2303,
00112 CHK_USE_DISTANCE_CUE =0x2301,
00113
00114 CHK_MAT_ENTRY =0xAFFF,
00115 CHK_MAT_NAME =0xA000,
00116 CHK_MAT_AMBIENT =0xA010,
00117 CHK_MAT_DIFFUSE =0xA020,
00118 CHK_MAT_SPECULAR =0xA030,
00119 CHK_MAT_SHININESS =0xA040,
00120 CHK_MAT_SHIN2PCT =0xA041,
00121 CHK_MAT_TRANSPARENCY =0xA050,
00122 CHK_MAT_XPFALL =0xA052,
00123 CHK_MAT_USE_XPFALL =0xA240,
00124 CHK_MAT_REFBLUR =0xA053,
00125 CHK_MAT_SHADING =0xA100,
00126 CHK_MAT_USE_REFBLUR =0xA250,
00127 CHK_MAT_SELF_ILLUM =0xA080,
00128 CHK_MAT_TWO_SIDE =0xA081,
00129 CHK_MAT_DECAL =0xA082,
00130 CHK_MAT_ADDITIVE =0xA083,
00131 CHK_MAT_SELF_ILPCT =0xA084,
00132 CHK_MAT_WIRE =0xA085,
00133 CHK_MAT_FACEMAP =0xA088,
00134 CHK_MAT_PHONGSOFT =0xA08C,
00135 CHK_MAT_WIREABS =0xA08E,
00136 CHK_MAT_WIRE_SIZE =0xA087,
00137 CHK_MAT_TEXMAP =0xA200,
00138 CHK_MAT_SXP_TEXT_DATA =0xA320,
00139 CHK_MAT_TEXMASK =0xA33E,
00140 CHK_MAT_SXP_TEXTMASK_DATA =0xA32A,
00141 CHK_MAT_TEX2MAP =0xA33A,
00142 CHK_MAT_SXP_TEXT2_DATA =0xA321,
00143 CHK_MAT_TEX2MASK =0xA340,
00144 CHK_MAT_SXP_TEXT2MASK_DATA =0xA32C,
00145 CHK_MAT_OPACMAP =0xA210,
00146 CHK_MAT_SXP_OPAC_DATA =0xA322,
00147 CHK_MAT_OPACMASK =0xA342,
00148 CHK_MAT_SXP_OPACMASK_DATA =0xA32E,
00149 CHK_MAT_BUMPMAP =0xA230,
00150 CHK_MAT_SXP_BUMP_DATA =0xA324,
00151 CHK_MAT_BUMPMASK =0xA344,
00152 CHK_MAT_SXP_BUMPMASK_DATA =0xA330,
00153 CHK_MAT_SPECMAP =0xA204,
00154 CHK_MAT_SXP_SPEC_DATA =0xA325,
00155 CHK_MAT_SPECMASK =0xA348,
00156 CHK_MAT_SXP_SPECMASK_DATA =0xA332,
00157 CHK_MAT_SHINMAP =0xA33C,
00158 CHK_MAT_SXP_SHIN_DATA =0xA326,
00159 CHK_MAT_SHINMASK =0xA346,
00160 CHK_MAT_SXP_SHINMASK_DATA =0xA334,
00161 CHK_MAT_SELFIMAP =0xA33D,
00162 CHK_MAT_SXP_SELFI_DATA =0xA328,
00163 CHK_MAT_SELFIMASK =0xA34A,
00164 CHK_MAT_SXP_SELFIMASK_DATA =0xA336,
00165 CHK_MAT_REFLMAP =0xA220,
00166 CHK_MAT_REFLMASK =0xA34C,
00167 CHK_MAT_SXP_REFLMASK_DATA =0xA338,
00168 CHK_MAT_ACUBIC =0xA310,
00169 CHK_MAT_MAPNAME =0xA300,
00170 CHK_MAT_MAP_TILING =0xA351,
00171 CHK_MAT_MAP_TEXBLUR =0xA353,
00172 CHK_MAT_MAP_USCALE =0xA354,
00173 CHK_MAT_MAP_VSCALE =0xA356,
00174 CHK_MAT_MAP_UOFFSET =0xA358,
00175 CHK_MAT_MAP_VOFFSET =0xA35A,
00176 CHK_MAT_MAP_ANG =0xA35C,
00177 CHK_MAT_MAP_COL1 =0xA360,
00178 CHK_MAT_MAP_COL2 =0xA362,
00179 CHK_MAT_MAP_RCOL =0xA364,
00180 CHK_MAT_MAP_GCOL =0xA366,
00181 CHK_MAT_MAP_BCOL =0xA368,
00182
00183 CHK_NAMED_OBJECT =0x4000,
00184 CHK_N_DIRECT_LIGHT =0x4600,
00185 CHK_DL_OFF =0x4620,
00186 CHK_DL_OUTER_RANGE =0x465A,
00187 CHK_DL_INNER_RANGE =0x4659,
00188 CHK_DL_MULTIPLIER =0x465B,
00189 CHK_DL_EXCLUDE =0x4654,
00190 CHK_DL_ATTENUATE =0x4625,
00191 CHK_DL_SPOTLIGHT =0x4610,
00192 CHK_DL_SPOT_ROLL =0x4656,
00193 CHK_DL_SHADOWED =0x4630,
00194 CHK_DL_LOCAL_SHADOW2 =0x4641,
00195 CHK_DL_SEE_CONE =0x4650,
00196 CHK_DL_SPOT_RECTANGULAR =0x4651,
00197 CHK_DL_SPOT_ASPECT =0x4657,
00198 CHK_DL_SPOT_PROJECTOR =0x4653,
00199 CHK_DL_SPOT_OVERSHOOT =0x4652,
00200 CHK_DL_RAY_BIAS =0x4658,
00201 CHK_DL_RAYSHAD =0x4627,
00202 CHK_N_CAMERA =0x4700,
00203 CHK_CAM_SEE_CONE =0x4710,
00204 CHK_CAM_RANGES =0x4720,
00205 CHK_OBJ_HIDDEN =0x4010,
00206 CHK_OBJ_VIS_LOFTER =0x4011,
00207 CHK_OBJ_DOESNT_CAST =0x4012,
00208 CHK_OBJ_DONT_RCVSHADOW =0x4017,
00209 CHK_OBJ_MATTE =0x4013,
00210 CHK_OBJ_FAST =0x4014,
00211 CHK_OBJ_PROCEDURAL =0x4015,
00212 CHK_OBJ_FROZEN =0x4016,
00213 CHK_N_TRI_OBJECT =0x4100,
00214 CHK_POINT_ARRAY =0x4110,
00215 CHK_POINT_FLAG_ARRAY =0x4111,
00216 CHK_FACE_ARRAY =0x4120,
00217 CHK_MSH_MAT_GROUP =0x4130,
00218 CHK_SMOOTH_GROUP =0x4150,
00219 CHK_MSH_BOXMAP =0x4190,
00220 CHK_TEX_VERTS =0x4140,
00221 CHK_MESH_MATRIX =0x4160,
00222 CHK_MESH_COLOR =0x4165,
00223 CHK_MESH_TEXTURE_INFO =0x4170,
00224
00225 CHK_KFDATA =0xB000,
00226 CHK_KFHDR =0xB00A,
00227 CHK_KFSEG =0xB008,
00228 CHK_KFCURTIME =0xB009,
00229 CHK_AMBIENT_NODE_TAG =0xB001,
00230 CHK_OBJECT_NODE_TAG =0xB002,
00231 CHK_CAMERA_NODE_TAG =0xB003,
00232 CHK_TARGET_NODE_TAG =0xB004,
00233 CHK_LIGHT_NODE_TAG =0xB005,
00234 CHK_L_TARGET_NODE_TAG =0xB006,
00235 CHK_SPOTLIGHT_NODE_TAG =0xB007,
00236 CHK_NODE_ID =0xB030,
00237 CHK_NODE_HDR =0xB010,
00238 CHK_PIVOT =0xB013,
00239 CHK_INSTANCE_NAME =0xB011,
00240 CHK_MORPH_SMOOTH =0xB015,
00241 CHK_BOUNDBOX =0xB014,
00242 CHK_POS_TRACK_TAG =0xB020,
00243 CHK_COL_TRACK_TAG =0xB025,
00244 CHK_ROT_TRACK_TAG =0xB021,
00245 CHK_SCL_TRACK_TAG =0xB022,
00246 CHK_MORPH_TRACK_TAG =0xB026,
00247 CHK_FOV_TRACK_TAG =0xB023,
00248 CHK_ROLL_TRACK_TAG =0xB024,
00249 CHK_HOT_TRACK_TAG =0xB027,
00250 CHK_FALL_TRACK_TAG =0xB028,
00251 CHK_HIDE_TRACK_TAG =0xB029,
00252
00253 CHK_POLY_2D = 0x5000,
00254 CHK_SHAPE_OK = 0x5010,
00255 CHK_SHAPE_NOT_OK = 0x5011,
00256 CHK_SHAPE_HOOK = 0x5020,
00257 CHK_PATH_3D = 0x6000,
00258 CHK_PATH_MATRIX = 0x6005,
00259 CHK_SHAPE_2D = 0x6010,
00260 CHK_M_SCALE = 0x6020,
00261 CHK_M_TWIST = 0x6030,
00262 CHK_M_TEETER = 0x6040,
00263 CHK_M_FIT = 0x6050,
00264 CHK_M_BEVEL = 0x6060,
00265 CHK_XZ_CURVE = 0x6070,
00266 CHK_YZ_CURVE = 0x6080,
00267 CHK_INTERPCT = 0x6090,
00268 CHK_DEFORM_LIMIT = 0x60A0,
00269
00270 CHK_USE_CONTOUR = 0x6100,
00271 CHK_USE_TWEEN = 0x6110,
00272 CHK_USE_SCALE = 0x6120,
00273 CHK_USE_TWIST = 0x6130,
00274 CHK_USE_TEETER = 0x6140,
00275 CHK_USE_FIT = 0x6150,
00276 CHK_USE_BEVEL = 0x6160,
00277
00278 CHK_DEFAULT_VIEW = 0x3000,
00279 CHK_VIEW_TOP = 0x3010,
00280 CHK_VIEW_BOTTOM = 0x3020,
00281 CHK_VIEW_LEFT = 0x3030,
00282 CHK_VIEW_RIGHT = 0x3040,
00283 CHK_VIEW_FRONT = 0x3050,
00284 CHK_VIEW_BACK = 0x3060,
00285 CHK_VIEW_USER = 0x3070,
00286 CHK_VIEW_CAMERA = 0x3080,
00287 CHK_VIEW_WINDOW = 0x3090,
00288
00289 CHK_VIEWPORT_LAYOUT_OLD = 0x7000,
00290 CHK_VIEWPORT_DATA_OLD = 0x7010,
00291 CHK_VIEWPORT_LAYOUT = 0x7001,
00292 CHK_VIEWPORT_DATA = 0x7011,
00293 CHK_VIEWPORT_DATA_3 = 0x7012,
00294 CHK_VIEWPORT_SIZE = 0x7020,
00295 CHK_NETWORK_VIEW = 0x7030
00296 } Lib3dsChunks;
00297
00298 typedef struct Lib3dsChunk {
00299 uint16_t chunk;
00300 uint32_t size;
00301 uint32_t end;
00302 uint32_t cur;
00303 } Lib3dsChunk;
00304
00305 extern void lib3ds_chunk_read(Lib3dsChunk *c, Lib3dsIo *io);
00306 extern void lib3ds_chunk_read_start(Lib3dsChunk *c, uint16_t chunk, Lib3dsIo *io);
00307 extern void lib3ds_chunk_read_tell(Lib3dsChunk *c, Lib3dsIo *io);
00308 extern uint16_t lib3ds_chunk_read_next(Lib3dsChunk *c, Lib3dsIo *io);
00309 extern void lib3ds_chunk_read_reset(Lib3dsChunk *c, Lib3dsIo *io);
00310 extern void lib3ds_chunk_read_end(Lib3dsChunk *c, Lib3dsIo *io);
00311 extern void lib3ds_chunk_write(Lib3dsChunk *c, Lib3dsIo *io);
00312 extern void lib3ds_chunk_write_start(Lib3dsChunk *c, Lib3dsIo *io);
00313 extern void lib3ds_chunk_write_end(Lib3dsChunk *c, Lib3dsIo *io);
00314 extern const char* lib3ds_chunk_name(uint16_t chunk);
00315 extern void lib3ds_chunk_unknown(uint16_t chunk, Lib3dsIo *io);
00316
00317 typedef struct Lib3dsIoImpl {
00318 jmp_buf jmpbuf;
00319 int log_indent;
00320 void *tmp_mem;
00321 Lib3dsNode *tmp_node;
00322 } Lib3dsIoImpl;
00323
00324 extern void lib3ds_io_setup(Lib3dsIo *io);
00325 extern void lib3ds_io_cleanup(Lib3dsIo *io);
00326
00327 extern long lib3ds_io_seek(Lib3dsIo *io, long offset, Lib3dsIoSeek origin);
00328 extern long lib3ds_io_tell(Lib3dsIo *io);
00329 extern size_t lib3ds_io_read(Lib3dsIo *io, void *buffer, size_t size);
00330 extern size_t lib3ds_io_write(Lib3dsIo *io, const void *buffer, size_t size);
00331 extern void lib3ds_io_log(Lib3dsIo *io, Lib3dsLogLevel level, const char *format, ...);
00332 extern void lib3ds_io_log_indent(Lib3dsIo *io, int indent);
00333 extern void lib3ds_io_read_error(Lib3dsIo *io);
00334 extern void lib3ds_io_write_error(Lib3dsIo *io);
00335
00336 extern uint8_t lib3ds_io_read_byte(Lib3dsIo *io);
00337 extern uint16_t lib3ds_io_read_word(Lib3dsIo *io);
00338 extern uint32_t lib3ds_io_read_dword(Lib3dsIo *io);
00339 extern int8_t lib3ds_io_read_intb(Lib3dsIo *io);
00340 extern int16_t lib3ds_io_read_intw(Lib3dsIo *io);
00341 extern int32_t lib3ds_io_read_intd(Lib3dsIo *io);
00342 extern float lib3ds_io_read_float(Lib3dsIo *io);
00343 extern void lib3ds_io_read_vector(Lib3dsIo *io, float v[3]);
00344 extern void lib3ds_io_read_rgb(Lib3dsIo *io, float rgb[3]);
00345 extern void lib3ds_io_read_string(Lib3dsIo *io, char *s, int buflen);
00346
00347 extern void lib3ds_io_write_byte(Lib3dsIo *io, uint8_t b);
00348 extern void lib3ds_io_write_word(Lib3dsIo *io, uint16_t w);
00349 extern void lib3ds_io_write_dword(Lib3dsIo *io, uint32_t d);
00350 extern void lib3ds_io_write_intb(Lib3dsIo *io, int8_t b);
00351 extern void lib3ds_io_write_intw(Lib3dsIo *io, int16_t w);
00352 extern void lib3ds_io_write_intd(Lib3dsIo *io, int32_t d);
00353 extern void lib3ds_io_write_float(Lib3dsIo *io, float l);
00354 extern void lib3ds_io_write_vector(Lib3dsIo *io, float v[3]);
00355 extern void lib3ds_io_write_rgb(Lib3dsIo *io, float rgb[3]);
00356 extern void lib3ds_io_write_string(Lib3dsIo *io, const char *s);
00357
00358 extern void lib3ds_atmosphere_read(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io);
00359 extern void lib3ds_atmosphere_write(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io);
00360 extern void lib3ds_background_read(Lib3dsBackground *background, Lib3dsIo *io);
00361 extern void lib3ds_background_write(Lib3dsBackground *background, Lib3dsIo *io);
00362 extern void lib3ds_shadow_read(Lib3dsShadow *shadow, Lib3dsIo *io);
00363 extern void lib3ds_shadow_write(Lib3dsShadow *shadow, Lib3dsIo *io);
00364 extern void lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io);
00365 extern void lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io);
00366 extern void lib3ds_material_read(Lib3dsMaterial *material, Lib3dsIo *io);
00367 extern void lib3ds_material_write(Lib3dsMaterial *material, Lib3dsIo *io);
00368 extern void lib3ds_camera_read(Lib3dsCamera *camera, Lib3dsIo *io);
00369 extern void lib3ds_camera_write(Lib3dsCamera *camera, Lib3dsIo *io);
00370 extern void lib3ds_light_read(Lib3dsLight *light, Lib3dsIo *io);
00371 extern void lib3ds_light_write(Lib3dsLight *light, Lib3dsIo *io);
00372 extern void lib3ds_mesh_read(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io);
00373 extern void lib3ds_mesh_write(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io);
00374 extern void lib3ds_track_read(Lib3dsTrack *track, Lib3dsIo *io);
00375 extern void lib3ds_track_write(Lib3dsTrack *track, Lib3dsIo *io);
00376 extern void lib3ds_node_read(Lib3dsNode *node, Lib3dsIo *io);
00377 extern void lib3ds_node_write(Lib3dsNode *node, uint16_t node_id, uint16_t parent_id, Lib3dsIo *io);
00378
00379 typedef void (*Lib3dsFreeFunc)(void *ptr);
00380
00381 extern void* lib3ds_util_realloc_array(void *ptr, int old_size, int new_size, int element_size);
00382 extern void lib3ds_util_reserve_array(void ***ptr, int *n, int *size, int new_size, int force, Lib3dsFreeFunc free_func);
00383 extern void lib3ds_util_insert_array(void ***ptr, int *n, int *size, void *element, int index);
00384 extern void lib3ds_util_remove_array(void ***ptr, int *n, int index, Lib3dsFreeFunc free_func);
00385
00386 #ifdef __cplusplus
00387 }
00388 #endif
00389 #endif
00390
00391