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