Home | API | File List | Examples | Download

lib3ds_impl.h

00001 /* -*- c -*- */
00002 #ifndef INCLUDED_LIB3DS_IMPL_H
00003 #define INCLUDED_LIB3DS_IMPL_H
00004 /*
00005     Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
00006     All rights reserved.
00007     
00008     This program is free  software: you can redistribute it and/or modify 
00009     it under the terms of the GNU Lesser General Public License as published 
00010     by the Free Software Foundation, either version 2.1 of the License, or 
00011     (at your option) any later version.
00012 
00013     Thisprogram  is  distributed in the hope that it will be useful, 
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of 
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
00016     GNU Lesser General Public License for more details.
00017     
00018     You should  have received a copy of the GNU Lesser General Public License
00019     along with  this program; If not, see <http://www.gnu.org/licenses/>. 
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,    /*3DS file*/
00072   CHK_SMAGIC                 =0x2D2D,    
00073   CHK_LMAGIC                 =0x2D3D,    
00074   CHK_MLIBMAGIC              =0x3DAA,    /*MLI file*/
00075   CHK_MATMAGIC               =0x3DFF,    
00076   CHK_CMAGIC                 =0xC23D,    /*PRJ file*/
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