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

Revision 10853, 14.9 kB (checked in by robert, 5 years ago)

From Sukender,
"Here is our freshly baked 3DS reader/writer (named 'v0.5' to differentiate from previous one). Changes are against trunk rev. 10819.
Short changelog (from rev 10819):
- Added 3DS writer
- Sync'd with latest lib3DS
- Added options, especially "flattenMatrixTransforms" to get the "old" behaviour (else the reader correctly maps to OSG the transforms from the 3DS file).

What should be done:
- Check with pivot points, with and without "flattenMatrixTransforms" option.
- We ran tests on it, but we can never be 100% sure there is no bug. Testing from the community would of course be helpful."

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