1 /* -*- c -*- */ 2 #ifndef INCLUDED_LIB3DS_IMPL_H 3 #define INCLUDED_LIB3DS_IMPL_H 4 /* 5 Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com> 6 All rights reserved. 7 8 This program is free software: you can redistribute it and/or modify 9 it under the terms of the GNU Lesser General Public License as published 10 by the Free Software Foundation, either version 2.1 of the License, or 11 (at your option) any later version. 12 13 Thisprogram is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU Lesser General Public License for more details. 17 18 You should have received a copy of the GNU Lesser General Public License 19 along with this program; If not, see <http://www.gnu.org/licenses/>. 20 */ 21 22 /** @file lib3ds_impl.h 23 Private header file used internally by lib3ds */ 24 25 #include "lib3ds.h" 26 #include <stdio.h> 27 #include <stdlib.h> 28 #include <stdarg.h> 29 #include <string.h> 30 #include <math.h> 31 #include <float.h> 32 #include <assert.h> 33 #include <setjmp.h> 34 #include <stdarg.h> 35 36 #ifdef _MSC_VER 37 #pragma warning ( disable : 4996 ) 38 #pragma warning ( disable : 4100 ) 39 #endif 40 41 #ifndef _MSC_VER 42 #include <stdint.h> 43 #else 44 typedef unsigned __int8 uint8_t; 45 typedef unsigned __int16 uint16_t; 46 typedef unsigned __int32 uint32_t; 47 typedef signed __int8 int8_t; 48 typedef signed __int16 int16_t; 49 typedef signed __int32 int32_t; 50 #endif 51 52 #ifndef TRUE 53 #define TRUE 1 54 #endif 55 #ifndef FALSE 56 #define FALSE 0 57 #endif 58 59 #define LIB3DS_EPSILON (1e-5) 60 #define LIB3DS_PI 3.14159265358979323846 61 #define LIB3DS_TWOPI (2.0*LIB3DS_PI) 62 #define LIB3DS_HALFPI (LIB3DS_PI/2.0) 63 #define LIB3DS_RAD_TO_DEG(x) ((180.0/LIB3DS_PI)*(x)) 64 #define LIB3DS_DEG_TO_RAD(x) ((LIB3DS_PI/180.0)*(x)) 65 66 #ifdef __cplusplus 67 extern "C" { 68 #endif 69 70 typedef enum Lib3dsChunks { 71 CHK_NULL_CHUNK =0x0000, 72 CHK_M3DMAGIC =0x4D4D, /*3DS file*/ 73 CHK_SMAGIC =0x2D2D, 74 CHK_LMAGIC =0x2D3D, 75 CHK_MLIBMAGIC =0x3DAA, /*MLI file*/ 76 CHK_MATMAGIC =0x3DFF, 77 CHK_CMAGIC =0xC23D, /*PRJ file*/ 78 CHK_M3D_VERSION =0x0002, 79 CHK_M3D_KFVERSION =0x0005, 80 81 CHK_COLOR_F =0x0010, 82 CHK_COLOR_24 =0x0011, 83 CHK_LIN_COLOR_24 =0x0012, 84 CHK_LIN_COLOR_F =0x0013, 85 CHK_INT_PERCENTAGE =0x0030, 86 CHK_FLOAT_PERCENTAGE =0x0031, 87 88 CHK_MDATA =0x3D3D, 89 CHK_MESH_VERSION =0x3D3E, 90 CHK_MASTER_SCALE =0x0100, 91 CHK_LO_SHADOW_BIAS =0x1400, 92 CHK_HI_SHADOW_BIAS =0x1410, 93 CHK_SHADOW_MAP_SIZE =0x1420, 94 CHK_SHADOW_SAMPLES =0x1430, 95 CHK_SHADOW_RANGE =0x1440, 96 CHK_SHADOW_FILTER =0x1450, 97 CHK_RAY_BIAS =0x1460, 98 CHK_O_CONSTS =0x1500, 99 CHK_AMBIENT_LIGHT =0x2100, 100 CHK_BIT_MAP =0x1100, 101 CHK_SOLID_BGND =0x1200, 102 CHK_V_GRADIENT =0x1300, 103 CHK_USE_BIT_MAP =0x1101, 104 CHK_USE_SOLID_BGND =0x1201, 105 CHK_USE_V_GRADIENT =0x1301, 106 CHK_FOG =0x2200, 107 CHK_FOG_BGND =0x2210, 108 CHK_LAYER_FOG =0x2302, 109 CHK_DISTANCE_CUE =0x2300, 110 CHK_DCUE_BGND =0x2310, 111 CHK_USE_FOG =0x2201, 112 CHK_USE_LAYER_FOG =0x2303, 113 CHK_USE_DISTANCE_CUE =0x2301, 114 115 CHK_MAT_ENTRY =0xAFFF, 116 CHK_MAT_NAME =0xA000, 117 CHK_MAT_AMBIENT =0xA010, 118 CHK_MAT_DIFFUSE =0xA020, 119 CHK_MAT_SPECULAR =0xA030, 120 CHK_MAT_SHININESS =0xA040, 121 CHK_MAT_SHIN2PCT =0xA041, 122 CHK_MAT_TRANSPARENCY =0xA050, 123 CHK_MAT_XPFALL =0xA052, 124 CHK_MAT_USE_XPFALL =0xA240, 125 CHK_MAT_REFBLUR =0xA053, 126 CHK_MAT_SHADING =0xA100, 127 CHK_MAT_USE_REFBLUR =0xA250, 128 CHK_MAT_SELF_ILLUM =0xA080, 129 CHK_MAT_TWO_SIDE =0xA081, 130 CHK_MAT_DECAL =0xA082, 131 CHK_MAT_ADDITIVE =0xA083, 132 CHK_MAT_SELF_ILPCT =0xA084, 133 CHK_MAT_WIRE =0xA085, 134 CHK_MAT_FACEMAP =0xA088, 135 CHK_MAT_PHONGSOFT =0xA08C, 136 CHK_MAT_WIREABS =0xA08E, 137 CHK_MAT_WIRE_SIZE =0xA087, 138 CHK_MAT_TEXMAP =0xA200, 139 CHK_MAT_SXP_TEXT_DATA =0xA320, 140 CHK_MAT_TEXMASK =0xA33E, 141 CHK_MAT_SXP_TEXTMASK_DATA =0xA32A, 142 CHK_MAT_TEX2MAP =0xA33A, 143 CHK_MAT_SXP_TEXT2_DATA =0xA321, 144 CHK_MAT_TEX2MASK =0xA340, 145 CHK_MAT_SXP_TEXT2MASK_DATA =0xA32C, 146 CHK_MAT_OPACMAP =0xA210, 147 CHK_MAT_SXP_OPAC_DATA =0xA322, 148 CHK_MAT_OPACMASK =0xA342, 149 CHK_MAT_SXP_OPACMASK_DATA =0xA32E, 150 CHK_MAT_BUMPMAP =0xA230, 151 CHK_MAT_SXP_BUMP_DATA =0xA324, 152 CHK_MAT_BUMPMASK =0xA344, 153 CHK_MAT_SXP_BUMPMASK_DATA =0xA330, 154 CHK_MAT_SPECMAP =0xA204, 155 CHK_MAT_SXP_SPEC_DATA =0xA325, 156 CHK_MAT_SPECMASK =0xA348, 157 CHK_MAT_SXP_SPECMASK_DATA =0xA332, 158 CHK_MAT_SHINMAP =0xA33C, 159 CHK_MAT_SXP_SHIN_DATA =0xA326, 160 CHK_MAT_SHINMASK =0xA346, 161 CHK_MAT_SXP_SHINMASK_DATA =0xA334, 162 CHK_MAT_SELFIMAP =0xA33D, 163 CHK_MAT_SXP_SELFI_DATA =0xA328, 164 CHK_MAT_SELFIMASK =0xA34A, 165 CHK_MAT_SXP_SELFIMASK_DATA =0xA336, 166 CHK_MAT_REFLMAP =0xA220, 167 CHK_MAT_REFLMASK =0xA34C, 168 CHK_MAT_SXP_REFLMASK_DATA =0xA338, 169 CHK_MAT_ACUBIC =0xA310, 170 CHK_MAT_MAPNAME =0xA300, 171 CHK_MAT_MAP_TILING =0xA351, 172 CHK_MAT_MAP_TEXBLUR =0xA353, 173 CHK_MAT_MAP_USCALE =0xA354, 174 CHK_MAT_MAP_VSCALE =0xA356, 175 CHK_MAT_MAP_UOFFSET =0xA358, 176 CHK_MAT_MAP_VOFFSET =0xA35A, 177 CHK_MAT_MAP_ANG =0xA35C, 178 CHK_MAT_MAP_COL1 =0xA360, 179 CHK_MAT_MAP_COL2 =0xA362, 180 CHK_MAT_MAP_RCOL =0xA364, 181 CHK_MAT_MAP_GCOL =0xA366, 182 CHK_MAT_MAP_BCOL =0xA368, 183 184 CHK_NAMED_OBJECT =0x4000, 185 CHK_N_DIRECT_LIGHT =0x4600, 186 CHK_DL_OFF =0x4620, 187 CHK_DL_OUTER_RANGE =0x465A, 188 CHK_DL_INNER_RANGE =0x4659, 189 CHK_DL_MULTIPLIER =0x465B, 190 CHK_DL_EXCLUDE =0x4654, 191 CHK_DL_ATTENUATE =0x4625, 192 CHK_DL_SPOTLIGHT =0x4610, 193 CHK_DL_SPOT_ROLL =0x4656, 194 CHK_DL_SHADOWED =0x4630, 195 CHK_DL_LOCAL_SHADOW2 =0x4641, 196 CHK_DL_SEE_CONE =0x4650, 197 CHK_DL_SPOT_RECTANGULAR =0x4651, 198 CHK_DL_SPOT_ASPECT =0x4657, 199 CHK_DL_SPOT_PROJECTOR =0x4653, 200 CHK_DL_SPOT_OVERSHOOT =0x4652, 201 CHK_DL_RAY_BIAS =0x4658, 202 CHK_DL_RAYSHAD =0x4627, 203 CHK_N_CAMERA =0x4700, 204 CHK_CAM_SEE_CONE =0x4710, 205 CHK_CAM_RANGES =0x4720, 206 CHK_OBJ_HIDDEN =0x4010, 207 CHK_OBJ_VIS_LOFTER =0x4011, 208 CHK_OBJ_DOESNT_CAST =0x4012, 209 CHK_OBJ_DONT_RCVSHADOW =0x4017, 210 CHK_OBJ_MATTE =0x4013, 211 CHK_OBJ_FAST =0x4014, 212 CHK_OBJ_PROCEDURAL =0x4015, 213 CHK_OBJ_FROZEN =0x4016, 214 CHK_N_TRI_OBJECT =0x4100, 215 CHK_POINT_ARRAY =0x4110, 216 CHK_POINT_FLAG_ARRAY =0x4111, 217 CHK_FACE_ARRAY =0x4120, 218 CHK_MSH_MAT_GROUP =0x4130, 219 CHK_SMOOTH_GROUP =0x4150, 220 CHK_MSH_BOXMAP =0x4190, 221 CHK_TEX_VERTS =0x4140, 222 CHK_MESH_MATRIX =0x4160, 223 CHK_MESH_COLOR =0x4165, 224 CHK_MESH_TEXTURE_INFO =0x4170, 225 226 CHK_KFDATA =0xB000, 227 CHK_KFHDR =0xB00A, 228 CHK_KFSEG =0xB008, 229 CHK_KFCURTIME =0xB009, 230 CHK_AMBIENT_NODE_TAG =0xB001, 231 CHK_OBJECT_NODE_TAG =0xB002, 232 CHK_CAMERA_NODE_TAG =0xB003, 233 CHK_TARGET_NODE_TAG =0xB004, 234 CHK_LIGHT_NODE_TAG =0xB005, 235 CHK_L_TARGET_NODE_TAG =0xB006, 236 CHK_SPOTLIGHT_NODE_TAG =0xB007, 237 CHK_NODE_ID =0xB030, 238 CHK_NODE_HDR =0xB010, 239 CHK_PIVOT =0xB013, 240 CHK_INSTANCE_NAME =0xB011, 241 CHK_MORPH_SMOOTH =0xB015, 242 CHK_BOUNDBOX =0xB014, 243 CHK_POS_TRACK_TAG =0xB020, 244 CHK_COL_TRACK_TAG =0xB025, 245 CHK_ROT_TRACK_TAG =0xB021, 246 CHK_SCL_TRACK_TAG =0xB022, 247 CHK_MORPH_TRACK_TAG =0xB026, 248 CHK_FOV_TRACK_TAG =0xB023, 249 CHK_ROLL_TRACK_TAG =0xB024, 250 CHK_HOT_TRACK_TAG =0xB027, 251 CHK_FALL_TRACK_TAG =0xB028, 252 CHK_HIDE_TRACK_TAG =0xB029, 253 254 CHK_POLY_2D = 0x5000, 255 CHK_SHAPE_OK = 0x5010, 256 CHK_SHAPE_NOT_OK = 0x5011, 257 CHK_SHAPE_HOOK = 0x5020, 258 CHK_PATH_3D = 0x6000, 259 CHK_PATH_MATRIX = 0x6005, 260 CHK_SHAPE_2D = 0x6010, 261 CHK_M_SCALE = 0x6020, 262 CHK_M_TWIST = 0x6030, 263 CHK_M_TEETER = 0x6040, 264 CHK_M_FIT = 0x6050, 265 CHK_M_BEVEL = 0x6060, 266 CHK_XZ_CURVE = 0x6070, 267 CHK_YZ_CURVE = 0x6080, 268 CHK_INTERPCT = 0x6090, 269 CHK_DEFORM_LIMIT = 0x60A0, 270 271 CHK_USE_CONTOUR = 0x6100, 272 CHK_USE_TWEEN = 0x6110, 273 CHK_USE_SCALE = 0x6120, 274 CHK_USE_TWIST = 0x6130, 275 CHK_USE_TEETER = 0x6140, 276 CHK_USE_FIT = 0x6150, 277 CHK_USE_BEVEL = 0x6160, 278 279 CHK_DEFAULT_VIEW = 0x3000, 280 CHK_VIEW_TOP = 0x3010, 281 CHK_VIEW_BOTTOM = 0x3020, 282 CHK_VIEW_LEFT = 0x3030, 283 CHK_VIEW_RIGHT = 0x3040, 284 CHK_VIEW_FRONT = 0x3050, 285 CHK_VIEW_BACK = 0x3060, 286 CHK_VIEW_USER = 0x3070, 287 CHK_VIEW_CAMERA = 0x3080, 288 CHK_VIEW_WINDOW = 0x3090, 289 290 CHK_VIEWPORT_LAYOUT_OLD = 0x7000, 291 CHK_VIEWPORT_DATA_OLD = 0x7010, 292 CHK_VIEWPORT_LAYOUT = 0x7001, 293 CHK_VIEWPORT_DATA = 0x7011, 294 CHK_VIEWPORT_DATA_3 = 0x7012, 295 CHK_VIEWPORT_SIZE = 0x7020, 296 CHK_NETWORK_VIEW = 0x7030 297 } Lib3dsChunks; 298 299 typedef struct Lib3dsChunk { 300 uint16_t chunk; 301 uint32_t size; 302 uint32_t end; 303 uint32_t cur; 304 } Lib3dsChunk; 305 306 extern void lib3ds_chunk_read(Lib3dsChunk *c, Lib3dsIo *io); 307 extern void lib3ds_chunk_read_start(Lib3dsChunk *c, uint16_t chunk, Lib3dsIo *io); 308 extern void lib3ds_chunk_read_tell(Lib3dsChunk *c, Lib3dsIo *io); 309 extern uint16_t lib3ds_chunk_read_next(Lib3dsChunk *c, Lib3dsIo *io); 310 extern void lib3ds_chunk_read_reset(Lib3dsChunk *c, Lib3dsIo *io); 311 extern void lib3ds_chunk_read_end(Lib3dsChunk *c, Lib3dsIo *io); 312 extern void lib3ds_chunk_write(Lib3dsChunk *c, Lib3dsIo *io); 313 extern void lib3ds_chunk_write_start(Lib3dsChunk *c, Lib3dsIo *io); 314 extern void lib3ds_chunk_write_end(Lib3dsChunk *c, Lib3dsIo *io); 315 extern const char* lib3ds_chunk_name(uint16_t chunk); 316 extern void lib3ds_chunk_unknown(uint16_t chunk, Lib3dsIo *io); 317 318 typedef struct Lib3dsIoImpl { 319 jmp_buf jmpbuf; 320 int log_indent; 321 void *tmp_mem; 322 Lib3dsNode *tmp_node; 323 } Lib3dsIoImpl; 324 325 extern void lib3ds_io_setup(Lib3dsIo *io); 326 extern void lib3ds_io_cleanup(Lib3dsIo *io); 327 328 extern long lib3ds_io_seek(Lib3dsIo *io, long offset, Lib3dsIoSeek origin); 329 extern long lib3ds_io_tell(Lib3dsIo *io); 330 extern size_t lib3ds_io_read(Lib3dsIo *io, void *buffer, size_t size); 331 extern size_t lib3ds_io_write(Lib3dsIo *io, const void *buffer, size_t size); 332 extern void lib3ds_io_log(Lib3dsIo *io, Lib3dsLogLevel level, const char *format, ...); 333 extern void lib3ds_io_log_indent(Lib3dsIo *io, int indent); 334 extern void lib3ds_io_read_error(Lib3dsIo *io); 335 extern void lib3ds_io_write_error(Lib3dsIo *io); 336 337 extern uint8_t lib3ds_io_read_byte(Lib3dsIo *io); 338 extern uint16_t lib3ds_io_read_word(Lib3dsIo *io); 339 extern uint32_t lib3ds_io_read_dword(Lib3dsIo *io); 340 extern int8_t lib3ds_io_read_intb(Lib3dsIo *io); 341 extern int16_t lib3ds_io_read_intw(Lib3dsIo *io); 342 extern int32_t lib3ds_io_read_intd(Lib3dsIo *io); 343 extern float lib3ds_io_read_float(Lib3dsIo *io); 344 extern void lib3ds_io_read_vector(Lib3dsIo *io, float v[3]); 345 extern void lib3ds_io_read_rgb(Lib3dsIo *io, float rgb[3]); 346 extern void lib3ds_io_read_string(Lib3dsIo *io, char *s, int buflen); 347 348 extern void lib3ds_io_write_byte(Lib3dsIo *io, uint8_t b); 349 extern void lib3ds_io_write_word(Lib3dsIo *io, uint16_t w); 350 extern void lib3ds_io_write_dword(Lib3dsIo *io, uint32_t d); 351 extern void lib3ds_io_write_intb(Lib3dsIo *io, int8_t b); 352 extern void lib3ds_io_write_intw(Lib3dsIo *io, int16_t w); 353 extern void lib3ds_io_write_intd(Lib3dsIo *io, int32_t d); 354 extern void lib3ds_io_write_float(Lib3dsIo *io, float l); 355 extern void lib3ds_io_write_vector(Lib3dsIo *io, float v[3]); 356 extern void lib3ds_io_write_rgb(Lib3dsIo *io, float rgb[3]); 357 extern void lib3ds_io_write_string(Lib3dsIo *io, const char *s); 358 359 extern void lib3ds_atmosphere_read(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io); 360 extern void lib3ds_atmosphere_write(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io); 361 extern void lib3ds_background_read(Lib3dsBackground *background, Lib3dsIo *io); 362 extern void lib3ds_background_write(Lib3dsBackground *background, Lib3dsIo *io); 363 extern void lib3ds_shadow_read(Lib3dsShadow *shadow, Lib3dsIo *io); 364 extern void lib3ds_shadow_write(Lib3dsShadow *shadow, Lib3dsIo *io); 365 extern void lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io); 366 extern void lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io); 367 extern void lib3ds_material_read(Lib3dsMaterial *material, Lib3dsIo *io); 368 extern void lib3ds_material_write(Lib3dsMaterial *material, Lib3dsIo *io); 369 extern void lib3ds_camera_read(Lib3dsCamera *camera, Lib3dsIo *io); 370 extern void lib3ds_camera_write(Lib3dsCamera *camera, Lib3dsIo *io); 371 extern void lib3ds_light_read(Lib3dsLight *light, Lib3dsIo *io); 372 extern void lib3ds_light_write(Lib3dsLight *light, Lib3dsIo *io); 373 extern void lib3ds_mesh_read(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io); 374 extern void lib3ds_mesh_write(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io); 375 extern void lib3ds_track_read(Lib3dsTrack *track, Lib3dsIo *io); 376 extern void lib3ds_track_write(Lib3dsTrack *track, Lib3dsIo *io); 377 extern void lib3ds_node_read(Lib3dsNode *node, Lib3dsIo *io); 378 extern void lib3ds_node_write(Lib3dsNode *node, uint16_t node_id, uint16_t parent_id, Lib3dsIo *io); 379 380 typedef void (*Lib3dsFreeFunc)(void *ptr); 381 382 extern void* lib3ds_util_realloc_array(void *ptr, int old_size, int new_size, int element_size); 383 extern void lib3ds_util_reserve_array(void ***ptr, int *n, int *size, int new_size, int force, Lib3dsFreeFunc free_func); 384 extern void lib3ds_util_insert_array(void ***ptr, int *n, int *size, void *element, int index); 385 extern void lib3ds_util_remove_array(void ***ptr, int *n, int index, Lib3dsFreeFunc free_func); 386 387 #ifdef __cplusplus 388 } 389 #endif 390 #endif 391 392 393