root/OpenSceneGraph/trunk/src/osgPlugins/3ds/lib3ds/lib3ds_impl.h

Revision 14132, 14.6 kB (checked in by robert, 2 years ago)

Release OpenSceneGraph-3.5.1

  • Property svn:eol-style set to native
Line 
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    This program  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#include "lib3ds.h"
23#include <stdio.h>
24#include <stdlib.h>
25#include <stdarg.h>
26#include <string.h>
27#include <math.h>
28#include <float.h>
29#include <assert.h>
30#include <setjmp.h>
31#include <stdarg.h>
32
33#ifdef _MSC_VER
34#pragma warning ( disable : 4996 )
35#endif
36
37#ifndef _MSC_VER
38#if defined __sun || defined __hpux
39#include <inttypes.h>
40#else
41#include <stdint.h>
42#endif
43#else
44typedef unsigned __int8 uint8_t;
45typedef unsigned __int16 uint16_t;
46typedef unsigned __int32 uint32_t;
47typedef signed __int8 int8_t;
48typedef signed __int16 int16_t;
49typedef 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
67extern "C" {
68#endif
69
70typedef 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_TRANSPARENCY_FALLOFF     =0xA08A,
136  CHK_MAT_PHONGSOFT          =0xA08C,
137  CHK_MAT_WIREABS            =0xA08E,
138  CHK_MAT_WIRE_SIZE          =0xA087,
139  CHK_MAT_TEXMAP             =0xA200,
140  CHK_MAT_SXP_TEXT_DATA      =0xA320,
141  CHK_MAT_TEXMASK            =0xA33E,
142  CHK_MAT_SXP_TEXTMASK_DATA  =0xA32A,
143  CHK_MAT_TEX2MAP            =0xA33A,
144  CHK_MAT_SXP_TEXT2_DATA     =0xA321,
145  CHK_MAT_TEX2MASK           =0xA340,
146  CHK_MAT_SXP_TEXT2MASK_DATA =0xA32C,
147  CHK_MAT_OPACMAP            =0xA210,
148  CHK_MAT_SXP_OPAC_DATA      =0xA322,
149  CHK_MAT_OPACMASK           =0xA342,
150  CHK_MAT_SXP_OPACMASK_DATA  =0xA32E,
151  CHK_MAT_BUMPMAP            =0xA230,
152  CHK_MAT_SXP_BUMP_DATA      =0xA324,
153  CHK_MAT_BUMPMASK           =0xA344,
154  CHK_MAT_SXP_BUMPMASK_DATA  =0xA330,
155  CHK_MAT_SPECMAP            =0xA204,
156  CHK_MAT_SXP_SPEC_DATA      =0xA325,
157  CHK_MAT_SPECMASK           =0xA348,
158  CHK_MAT_SXP_SPECMASK_DATA  =0xA332,
159  CHK_MAT_SHINMAP            =0xA33C,
160  CHK_MAT_SXP_SHIN_DATA      =0xA326,
161  CHK_MAT_SHINMASK           =0xA346,
162  CHK_MAT_SXP_SHINMASK_DATA  =0xA334,
163  CHK_MAT_SELFIMAP           =0xA33D,
164  CHK_MAT_SXP_SELFI_DATA     =0xA328,
165  CHK_MAT_SELFIMASK          =0xA34A,
166  CHK_MAT_SXP_SELFIMASK_DATA =0xA336,
167  CHK_MAT_REFLMAP            =0xA220,
168  CHK_MAT_REFLMASK           =0xA34C,
169  CHK_MAT_SXP_REFLMASK_DATA  =0xA338,
170  CHK_MAT_ACUBIC             =0xA310,
171  CHK_MAT_MAPNAME            =0xA300,
172  CHK_MAT_MAP_TILING         =0xA351,
173  CHK_MAT_MAP_TEXBLUR        =0xA353,
174  CHK_MAT_MAP_USCALE         =0xA354,
175  CHK_MAT_MAP_VSCALE         =0xA356,
176  CHK_MAT_MAP_UOFFSET        =0xA358,
177  CHK_MAT_MAP_VOFFSET        =0xA35A,
178  CHK_MAT_MAP_ANG            =0xA35C,
179  CHK_MAT_MAP_COL1           =0xA360,
180  CHK_MAT_MAP_COL2           =0xA362,
181  CHK_MAT_MAP_RCOL           =0xA364,
182  CHK_MAT_MAP_GCOL           =0xA366,
183  CHK_MAT_MAP_BCOL           =0xA368,
184
185  CHK_NAMED_OBJECT           =0x4000,
186  CHK_N_DIRECT_LIGHT         =0x4600,
187  CHK_DL_OFF                 =0x4620,
188  CHK_DL_OUTER_RANGE         =0x465A,
189  CHK_DL_INNER_RANGE         =0x4659,
190  CHK_DL_MULTIPLIER          =0x465B,
191  CHK_DL_EXCLUDE             =0x4654,
192  CHK_DL_ATTENUATE           =0x4625,
193  CHK_DL_SPOTLIGHT           =0x4610,
194  CHK_DL_SPOT_ROLL           =0x4656,
195  CHK_DL_SHADOWED            =0x4630,
196  CHK_DL_LOCAL_SHADOW2       =0x4641,
197  CHK_DL_SEE_CONE            =0x4650,
198  CHK_DL_SPOT_RECTANGULAR    =0x4651,
199  CHK_DL_SPOT_ASPECT         =0x4657,
200  CHK_DL_SPOT_PROJECTOR      =0x4653,
201  CHK_DL_SPOT_OVERSHOOT      =0x4652,
202  CHK_DL_RAY_BIAS            =0x4658,
203  CHK_DL_RAYSHAD             =0x4627,
204  CHK_N_CAMERA               =0x4700,
205  CHK_CAM_SEE_CONE           =0x4710,
206  CHK_CAM_RANGES             =0x4720,
207  CHK_OBJ_HIDDEN             =0x4010,
208  CHK_OBJ_VIS_LOFTER         =0x4011,
209  CHK_OBJ_DOESNT_CAST        =0x4012,
210  CHK_OBJ_DONT_RCVSHADOW     =0x4017,
211  CHK_OBJ_MATTE              =0x4013,
212  CHK_OBJ_FAST               =0x4014,
213  CHK_OBJ_PROCEDURAL         =0x4015,
214  CHK_OBJ_FROZEN             =0x4016,
215  CHK_N_TRI_OBJECT           =0x4100,
216  CHK_POINT_ARRAY            =0x4110,
217  CHK_POINT_FLAG_ARRAY       =0x4111,
218  CHK_FACE_ARRAY             =0x4120,
219  CHK_MSH_MAT_GROUP          =0x4130,
220  CHK_SMOOTH_GROUP           =0x4150,
221  CHK_MSH_BOXMAP             =0x4190,
222  CHK_TEX_VERTS              =0x4140,
223  CHK_MESH_MATRIX            =0x4160,
224  CHK_MESH_COLOR             =0x4165,
225  CHK_MESH_TEXTURE_INFO      =0x4170,
226
227  CHK_KFDATA                 =0xB000,
228  CHK_KFHDR                  =0xB00A,
229  CHK_KFSEG                  =0xB008,
230  CHK_KFCURTIME              =0xB009,
231  CHK_AMBIENT_NODE_TAG       =0xB001,
232  CHK_OBJECT_NODE_TAG        =0xB002,
233  CHK_CAMERA_NODE_TAG        =0xB003,
234  CHK_TARGET_NODE_TAG        =0xB004,
235  CHK_LIGHT_NODE_TAG         =0xB005,
236  CHK_L_TARGET_NODE_TAG      =0xB006,
237  CHK_SPOTLIGHT_NODE_TAG     =0xB007,
238  CHK_NODE_ID                =0xB030,
239  CHK_NODE_HDR               =0xB010,
240  CHK_PIVOT                  =0xB013,
241  CHK_INSTANCE_NAME          =0xB011,
242  CHK_MORPH_SMOOTH           =0xB015,
243  CHK_BOUNDBOX               =0xB014,
244  CHK_POS_TRACK_TAG          =0xB020,
245  CHK_COL_TRACK_TAG          =0xB025,
246  CHK_ROT_TRACK_TAG          =0xB021,
247  CHK_SCL_TRACK_TAG          =0xB022,
248  CHK_MORPH_TRACK_TAG        =0xB026,
249  CHK_FOV_TRACK_TAG          =0xB023,
250  CHK_ROLL_TRACK_TAG         =0xB024,
251  CHK_HOT_TRACK_TAG          =0xB027,
252  CHK_FALL_TRACK_TAG         =0xB028,
253  CHK_HIDE_TRACK_TAG         =0xB029,
254
255  CHK_POLY_2D                = 0x5000,
256  CHK_SHAPE_OK               = 0x5010,
257  CHK_SHAPE_NOT_OK           = 0x5011,
258  CHK_SHAPE_HOOK             = 0x5020,
259  CHK_PATH_3D                = 0x6000,
260  CHK_PATH_MATRIX            = 0x6005,
261  CHK_SHAPE_2D               = 0x6010,
262  CHK_M_SCALE                = 0x6020,
263  CHK_M_TWIST                = 0x6030,
264  CHK_M_TEETER               = 0x6040,
265  CHK_M_FIT                  = 0x6050,
266  CHK_M_BEVEL                = 0x6060,
267  CHK_XZ_CURVE               = 0x6070,
268  CHK_YZ_CURVE               = 0x6080,
269  CHK_INTERPCT               = 0x6090,
270  CHK_DEFORM_LIMIT           = 0x60A0,
271
272  CHK_USE_CONTOUR            = 0x6100,
273  CHK_USE_TWEEN              = 0x6110,
274  CHK_USE_SCALE              = 0x6120,
275  CHK_USE_TWIST              = 0x6130,
276  CHK_USE_TEETER             = 0x6140,
277  CHK_USE_FIT                = 0x6150,
278  CHK_USE_BEVEL              = 0x6160,
279
280  CHK_DEFAULT_VIEW           = 0x3000,
281  CHK_VIEW_TOP               = 0x3010,
282  CHK_VIEW_BOTTOM            = 0x3020,
283  CHK_VIEW_LEFT              = 0x3030,
284  CHK_VIEW_RIGHT             = 0x3040,
285  CHK_VIEW_FRONT             = 0x3050,
286  CHK_VIEW_BACK              = 0x3060,
287  CHK_VIEW_USER              = 0x3070,
288  CHK_VIEW_CAMERA            = 0x3080,
289  CHK_VIEW_WINDOW            = 0x3090,
290
291  CHK_VIEWPORT_LAYOUT_OLD    = 0x7000,
292  CHK_VIEWPORT_DATA_OLD      = 0x7010,
293  CHK_VIEWPORT_LAYOUT        = 0x7001,
294  CHK_VIEWPORT_DATA          = 0x7011,
295  CHK_VIEWPORT_DATA_3        = 0x7012,
296  CHK_VIEWPORT_SIZE          = 0x7020,
297  CHK_NETWORK_VIEW           = 0x7030
298} Lib3dsChunks;
299
300typedef struct Lib3dsChunk {
301    uint16_t chunk;
302    uint32_t size;
303    uint32_t end;
304    uint32_t cur;
305} Lib3dsChunk;
306
307extern void lib3ds_chunk_read(Lib3dsChunk *c, Lib3dsIo *io);
308extern void lib3ds_chunk_read_start(Lib3dsChunk *c, uint16_t chunk, Lib3dsIo *io);
309extern void lib3ds_chunk_read_tell(Lib3dsChunk *c, Lib3dsIo *io);
310extern uint16_t lib3ds_chunk_read_next(Lib3dsChunk *c, Lib3dsIo *io);
311extern void lib3ds_chunk_read_reset(Lib3dsChunk *c, Lib3dsIo *io);
312extern void lib3ds_chunk_read_end(Lib3dsChunk *c, Lib3dsIo *io);
313extern void lib3ds_chunk_write(Lib3dsChunk *c, Lib3dsIo *io);
314extern void lib3ds_chunk_write_start(Lib3dsChunk *c, Lib3dsIo *io);
315extern void lib3ds_chunk_write_end(Lib3dsChunk *c, Lib3dsIo *io);
316extern const char* lib3ds_chunk_name(uint16_t chunk);
317extern void lib3ds_chunk_unknown(uint16_t chunk, Lib3dsIo *io);
318
319typedef struct Lib3dsIoImpl {
320    jmp_buf jmpbuf;
321    int log_indent;
322    void *tmp_mem;
323    Lib3dsNode *tmp_node;
324} Lib3dsIoImpl;
325
326extern void lib3ds_io_setup(Lib3dsIo *io);
327extern void lib3ds_io_cleanup(Lib3dsIo *io);
328
329extern long lib3ds_io_seek(Lib3dsIo *io, long offset, Lib3dsIoSeek origin);
330extern long lib3ds_io_tell(Lib3dsIo *io);
331extern size_t lib3ds_io_read(Lib3dsIo *io, void *buffer, size_t size);
332extern size_t lib3ds_io_write(Lib3dsIo *io, const void *buffer, size_t size);
333extern void lib3ds_io_log(Lib3dsIo *io, Lib3dsLogLevel level, const char *format, ...);
334extern void lib3ds_io_log_indent(Lib3dsIo *io, int indent);
335extern void lib3ds_io_read_error(Lib3dsIo *io);
336extern void lib3ds_io_write_error(Lib3dsIo *io);
337
338extern uint8_t lib3ds_io_read_byte(Lib3dsIo *io);
339extern uint16_t lib3ds_io_read_word(Lib3dsIo *io);
340extern uint32_t lib3ds_io_read_dword(Lib3dsIo *io);
341extern int8_t lib3ds_io_read_intb(Lib3dsIo *io);
342extern int16_t lib3ds_io_read_intw(Lib3dsIo *io);
343extern int32_t lib3ds_io_read_intd(Lib3dsIo *io);
344extern float lib3ds_io_read_float(Lib3dsIo *io);
345extern void lib3ds_io_read_vector(Lib3dsIo *io, float v[3]);
346extern void lib3ds_io_read_rgb(Lib3dsIo *io, float rgb[3]);
347extern void lib3ds_io_read_string(Lib3dsIo *io, char *s, int buflen);
348
349extern void lib3ds_io_write_byte(Lib3dsIo *io, uint8_t b);
350extern void lib3ds_io_write_word(Lib3dsIo *io, uint16_t w);
351extern void lib3ds_io_write_dword(Lib3dsIo *io, uint32_t d);
352extern void lib3ds_io_write_intb(Lib3dsIo *io, int8_t b);
353extern void lib3ds_io_write_intw(Lib3dsIo *io, int16_t w);
354extern void lib3ds_io_write_intd(Lib3dsIo *io, int32_t d);
355extern void lib3ds_io_write_float(Lib3dsIo *io, float l);
356extern void lib3ds_io_write_vector(Lib3dsIo *io, float v[3]);
357extern void lib3ds_io_write_rgb(Lib3dsIo *io, float rgb[3]);
358extern void lib3ds_io_write_string(Lib3dsIo *io, const char *s);
359
360extern void lib3ds_atmosphere_read(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io);
361extern void lib3ds_atmosphere_write(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io);
362extern void lib3ds_background_read(Lib3dsBackground *background, Lib3dsIo *io);
363extern void lib3ds_background_write(Lib3dsBackground *background, Lib3dsIo *io);
364extern void lib3ds_shadow_read(Lib3dsShadow *shadow, Lib3dsIo *io);
365extern void lib3ds_shadow_write(Lib3dsShadow *shadow, Lib3dsIo *io);
366extern void lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io);
367extern void lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io);
368extern void lib3ds_material_read(Lib3dsMaterial *material, Lib3dsIo *io);
369extern void lib3ds_material_write(Lib3dsMaterial *material, Lib3dsIo *io);
370extern void lib3ds_camera_read(Lib3dsCamera *camera, Lib3dsIo *io);
371extern void lib3ds_camera_write(Lib3dsCamera *camera, Lib3dsIo *io);
372extern void lib3ds_light_read(Lib3dsLight *light, Lib3dsIo *io);
373extern void lib3ds_light_write(Lib3dsLight *light, Lib3dsIo *io);
374extern void lib3ds_mesh_read(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io);
375extern void lib3ds_mesh_write(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io);
376extern void lib3ds_track_read(Lib3dsTrack *track, Lib3dsIo *io);
377extern void lib3ds_track_write(Lib3dsTrack *track, Lib3dsIo *io);
378extern void lib3ds_node_read(Lib3dsNode *node, Lib3dsIo *io);
379extern void lib3ds_node_write(Lib3dsNode *node, uint16_t node_id, uint16_t parent_id, Lib3dsIo *io);
380
381typedef void (*Lib3dsFreeFunc)(void *ptr);
382
383extern void* lib3ds_util_realloc_array(void *ptr, int old_size, int new_size, int element_size);
384extern void lib3ds_util_reserve_array(void ***ptr, int *n, int *size, int new_size, int force, Lib3dsFreeFunc free_func);
385extern void lib3ds_util_insert_array(void ***ptr, int *n, int *size, void *element, int index);
386extern void lib3ds_util_remove_array(void ***ptr, int *n, int index, Lib3dsFreeFunc free_func);
387
388#ifdef __cplusplus
389}
390#endif
391#endif
392
Note: See TracBrowser for help on using the browser.