diff --git a/src/osgPlugins/3ds/lib3ds/lib3ds.h b/src/osgPlugins/3ds/lib3ds/lib3ds.h index c92667f78..4d1218a90 100644 --- a/src/osgPlugins/3ds/lib3ds/lib3ds.h +++ b/src/osgPlugins/3ds/lib3ds/lib3ds.h @@ -1,805 +1,805 @@ -/* -*- c -*- */ -#ifndef INCLUDED_LIB3DS_H -#define INCLUDED_LIB3DS_H -/* - Copyright (C) 1996-2008 by Jan Eric Kyprianidis - All rights reserved. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation, either version 2.1 of the License, or - (at your option) any later version. - - Thisprogram is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; If not, see . - */ - -#include - -#ifndef LIB3DSAPI - #if defined(_MSC_VER) && !defined(LIB3DS_STATIC) - #ifdef LIB3DS_EXPORTS - #define LIB3DSAPI __declspec(dllexport) - #else - #define LIB3DSAPI __declspec(dllimport) - #endif - #else - #define LIB3DSAPI - #endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup api API */ -/** @{ */ - -typedef enum Lib3dsIoSeek { - LIB3DS_SEEK_SET = 0, - LIB3DS_SEEK_CUR = 1, - LIB3DS_SEEK_END = 2 -} Lib3dsIoSeek; - -typedef enum Lib3dsLogLevel { - LIB3DS_LOG_ERROR = 0, - LIB3DS_LOG_WARN = 1, - LIB3DS_LOG_INFO = 2, - LIB3DS_LOG_DEBUG = 3 -} Lib3dsLogLevel; - -typedef struct Lib3dsIo { - void* impl; - void* self; - long (*seek_func) (void *self, long offset, Lib3dsIoSeek origin); - long (*tell_func) (void *self); - size_t (*read_func) (void *self, void *buffer, size_t size); - size_t (*write_func)(void *self, const void *buffer, size_t size); - void (*log_func) (void *self, Lib3dsLogLevel level, int indent, const char *msg); -} Lib3dsIo; - -/* Atmosphere settings */ -typedef struct Lib3dsAtmosphere { - int use_fog; - float fog_color[3]; - int fog_background; - float fog_near_plane; - float fog_near_density; - float fog_far_plane; - float fog_far_density; - int use_layer_fog; - unsigned layer_fog_flags; - float layer_fog_color[3]; - float layer_fog_near_y; - float layer_fog_far_y; - float layer_fog_density; - int use_dist_cue; - int dist_cue_background; /* bool */ - float dist_cue_near_plane; - float dist_cue_near_dimming; - float dist_cue_far_plane; - float dist_cue_far_dimming; -} Lib3dsAtmosphere; - -/* Background settings */ -typedef struct Lib3dsBackground { - int use_bitmap; - char bitmap_name[64]; - int use_solid; - float solid_color[3]; - int use_gradient; - float gradient_percent; - float gradient_top[3]; - float gradient_middle[3]; - float gradient_bottom[3]; -} Lib3dsBackground; - -/* Shadow settings */ -typedef struct Lib3dsShadow { - short map_size; /* Global shadow map size that ranges from 10 to 4096 */ - float low_bias; /* Global shadow low bias */ - float hi_bias; /* Global shadow hi bias */ - float filter; /* Global shadow filter that ranges from 1 (lowest) to 10 (highest) */ - float ray_bias; /* Global raytraced shadow bias */ -} Lib3dsShadow; - -/* Layout view types */ -typedef enum Lib3dsViewType { - LIB3DS_VIEW_NOT_USED = 0, - LIB3DS_VIEW_TOP = 1, - LIB3DS_VIEW_BOTTOM = 2, - LIB3DS_VIEW_LEFT = 3, - LIB3DS_VIEW_RIGHT = 4, - LIB3DS_VIEW_FRONT = 5, - LIB3DS_VIEW_BACK = 6, - LIB3DS_VIEW_USER = 7, - LIB3DS_VIEW_SPOTLIGHT = 18, - LIB3DS_VIEW_CAMERA = 65535 -} Lib3dsViewType; - -/* Layout styles */ -typedef enum Lib3dsLayoutStyle { - LIB3DS_LAYOUT_SINGLE = 0, - LIB3DS_LAYOUT_TWO_PANE_VERT_SPLIT = 1, - LIB3DS_LAYOUT_TWO_PANE_HORIZ_SPLIT = 2, - LIB3DS_LAYOUT_FOUR_PANE = 3, - LIB3DS_LAYOUT_THREE_PANE_LEFT_SPLIT = 4, - LIB3DS_LAYOUT_THREE_PANE_BOTTOM_SPLIT = 5, - LIB3DS_LAYOUT_THREE_PANE_RIGHT_SPLIT = 6, - LIB3DS_LAYOUT_THREE_PANE_TOP_SPLIT = 7, - LIB3DS_LAYOUT_THREE_PANE_VERT_SPLIT = 8, - LIB3DS_LAYOUT_THREE_PANE_HORIZ_SPLIT = 9, - LIB3DS_LAYOUT_FOUR_PANE_LEFT_SPLIT = 10, - LIB3DS_LAYOUT_FOUR_PANE_RIGHT_SPLIT = 11 -} Lib3dsLayoutStyle; - -/* Layout view settings */ -typedef struct Lib3dsView { - int type; - unsigned axis_lock; - short position[2]; - short size[2]; - float zoom; - float center[3]; - float horiz_angle; - float vert_angle; - char camera[11]; -} Lib3dsView; - -#define LIB3DS_LAYOUT_MAX_VIEWS 32 - -/* Viewport and default view settings */ -typedef struct Lib3dsViewport { - int layout_style; - int layout_active; - int layout_swap; - int layout_swap_prior; - int layout_swap_view; - unsigned short layout_position[2]; - unsigned short layout_size[2]; - int layout_nviews; - Lib3dsView layout_views[LIB3DS_LAYOUT_MAX_VIEWS]; - int default_type; - float default_position[3]; - float default_width; - float default_horiz_angle; - float default_vert_angle; - float default_roll_angle; - char default_camera[64]; -} Lib3dsViewport; - -/* Material texture map flags */ -typedef enum Lib3dsTextureMapFlags { - LIB3DS_TEXTURE_DECALE = 0x0001, - LIB3DS_TEXTURE_MIRROR = 0x0002, - LIB3DS_TEXTURE_NEGATE = 0x0008, - LIB3DS_TEXTURE_NO_TILE = 0x0010, - LIB3DS_TEXTURE_SUMMED_AREA = 0x0020, - LIB3DS_TEXTURE_ALPHA_SOURCE = 0x0040, - LIB3DS_TEXTURE_TINT = 0x0080, - LIB3DS_TEXTURE_IGNORE_ALPHA = 0x0100, - LIB3DS_TEXTURE_RGB_TINT = 0x0200 -} Lib3dsTextureMapFlags; - -/* Material texture map */ -typedef struct Lib3dsTextureMap { - unsigned user_id; - void* user_ptr; - char name[64]; - unsigned flags; - float percent; - float blur; - float scale[2]; - float offset[2]; - float rotation; - float tint_1[3]; - float tint_2[3]; - float tint_r[3]; - float tint_g[3]; - float tint_b[3]; -} Lib3dsTextureMap; - -/* Auto reflection texture map flags */ -typedef enum Lib3dsAutoReflMapFlags { - LIB3DS_AUTOREFL_USE = 0x0001, - LIB3DS_AUTOREFL_READ_FIRST_FRAME_ONLY = 0x0004, - LIB3DS_AUTOREFL_FLAT_MIRROR = 0x0008 -} Lib3dsAutoReflMapFlags; - -/* Material shading type */ -typedef enum Lib3dsShading { - LIB3DS_SHADING_WIRE_FRAME = 0, - LIB3DS_SHADING_FLAT = 1, - LIB3DS_SHADING_GOURAUD = 2, - LIB3DS_SHADING_PHONG = 3, - LIB3DS_SHADING_METAL = 4 -} Lib3dsShading; - -/** Material */ -typedef struct Lib3dsMaterial { - unsigned user_id; - void* user_ptr; - char name[64]; /* Material name */ - float ambient[3]; /* Material ambient reflectivity */ - float diffuse[3]; /* Material diffuse reflectivity */ - float specular[3]; /* Material specular reflectivity */ - float shininess; /* Material specular exponent */ - float shin_strength; - int use_blur; - float blur; - float transparency; - float falloff; - int is_additive; - int self_illum_flag; /* bool */ - float self_illum; - int use_falloff; - int shading; - int soften; /* bool */ - int face_map; /* bool */ - int two_sided; /* Material visible from back */ - int map_decal; /* bool */ - int use_wire; - int use_wire_abs; - float wire_size; - Lib3dsTextureMap texture1_map; - Lib3dsTextureMap texture1_mask; - Lib3dsTextureMap texture2_map; - Lib3dsTextureMap texture2_mask; - Lib3dsTextureMap opacity_map; - Lib3dsTextureMap opacity_mask; - Lib3dsTextureMap bump_map; - Lib3dsTextureMap bump_mask; - Lib3dsTextureMap specular_map; - Lib3dsTextureMap specular_mask; - Lib3dsTextureMap shininess_map; - Lib3dsTextureMap shininess_mask; - Lib3dsTextureMap self_illum_map; - Lib3dsTextureMap self_illum_mask; - Lib3dsTextureMap reflection_map; - Lib3dsTextureMap reflection_mask; - unsigned autorefl_map_flags; - int autorefl_map_anti_alias; /* 0=None, 1=Low, 2=Medium, 3=High */ - int autorefl_map_size; - int autorefl_map_frame_step; -} Lib3dsMaterial; - -/** Object flags for cameras, lights and meshes */ -typedef enum Lib3dsObjectFlags { - LIB3DS_OBJECT_HIDDEN = 0x01, - LIB3DS_OBJECT_VIS_LOFTER = 0x02, - LIB3DS_OBJECT_DOESNT_CAST = 0x04, - LIB3DS_OBJECT_MATTE = 0x08, - LIB3DS_OBJECT_DONT_RCVSHADOW = 0x10, - LIB3DS_OBJECT_FAST = 0x20, - LIB3DS_OBJECT_FROZEN = 0x40 -} Lib3dsObjectFlags; - -/** Camera object */ -typedef struct Lib3dsCamera { - unsigned user_id; - void* user_ptr; - char name[64]; - unsigned object_flags; /*< @see Lib3dsObjectFlags */ - float position[3]; - float target[3]; - float roll; - float fov; - int see_cone; - float near_range; - float far_range; -} Lib3dsCamera; - -/** Light object */ -typedef struct Lib3dsLight { - unsigned user_id; - void* user_ptr; - char name[64]; - unsigned object_flags; - int spot_light; /* bool */ - int see_cone; - float color[3]; - float position[3]; - float target[3]; - float roll; - int off; /* bool */ - float outer_range; - float inner_range; - float multiplier; - /*const char** excludes;*/ - float attenuation; - int rectangular_spot; /* bool */ - int shadowed; /* bool */ - float shadow_bias; - float shadow_filter; - int shadow_size; - float spot_aspect; - int use_projector; - char projector[64]; - int spot_overshoot; /* bool */ - int ray_shadows; /* bool */ - float ray_bias; - float hotspot; - float falloff; -} Lib3dsLight; - -/* Texture map projection */ -typedef enum { - LIB3DS_MAP_NONE = -1, - LIB3DS_MAP_PLANAR = 0, - LIB3DS_MAP_CYLINDRICAL = 1, - LIB3DS_MAP_SPHERICAL = 2 -} Lib3dsMapType; - -/** Meaning of Lib3dsFace::flags. ABC are points of the current face - (A: is 1st vertex, B is 2nd vertex, C is 3rd vertex) */ -typedef enum Lib3dsFaceFlags { - LIB3DS_FACE_VIS_AC = 0x01, /**< Bit 0: Edge visibility AC */ - LIB3DS_FACE_VIS_BC = 0x02, /**< Bit 1: Edge visibility BC */ - LIB3DS_FACE_VIS_AB = 0x04, /**< Bit 2: Edge visibility AB */ - LIB3DS_FACE_WRAP_U = 0x08, /**< Bit 3: Face is at tex U wrap seam */ - LIB3DS_FACE_WRAP_V = 0x10, /**< Bit 4: Face is at tex V wrap seam */ - LIB3DS_FACE_SELECT_3 = (1<<13), /**< Bit 13: Selection of the face in selection 3*/ - LIB3DS_FACE_SELECT_2 = (1<<14), /**< Bit 14: Selection of the face in selection 2*/ - LIB3DS_FACE_SELECT_1 = (1<<15) /**< Bit 15: Selection of the face in selection 1*/ -} Lib3dsFaceFlags; - -typedef struct Lib3dsFace { - unsigned short index[3]; - unsigned short flags; - int material; - unsigned smoothing_group; -} Lib3dsFace; - -/* Triangular mesh object */ -typedef struct Lib3dsMesh { - unsigned user_id; - void* user_ptr; - char name[64]; /**< Mesh name. Don't use more than 8 characters */ - unsigned object_flags; /**< @see Lib3dsObjectFlags */ - int color; /**< Index to editor palette [0..255] */ - float matrix[4][4]; /**< Transformation matrix for mesh data */ - unsigned short nvertices; /**< Number of vertices in vertex array (max. 65535) */ - float (*vertices)[3]; - float (*texcos)[2]; - unsigned short* vflags; - unsigned short nfaces; /**< Number of faces in face array (max. 65535) */ - Lib3dsFace* faces; - char box_front[64]; - char box_back[64]; - char box_left[64]; - char box_right[64]; - char box_top[64]; - char box_bottom[64]; - int map_type; - float map_pos[3]; - float map_matrix[4][4]; - float map_scale; - float map_tile[2]; - float map_planar_size[2]; - float map_cylinder_height; -} Lib3dsMesh; - -typedef enum Lib3dsNodeType { - LIB3DS_NODE_AMBIENT_COLOR = 0, - LIB3DS_NODE_MESH_INSTANCE = 1, - LIB3DS_NODE_CAMERA = 2, - LIB3DS_NODE_CAMERA_TARGET = 3, - LIB3DS_NODE_OMNILIGHT = 4, - LIB3DS_NODE_SPOTLIGHT = 5, - LIB3DS_NODE_SPOTLIGHT_TARGET= 6 -} Lib3dsNodeType; - -typedef enum Lib3dsNodeFlags{ - LIB3DS_NODE_HIDDEN = 0x000800, - LIB3DS_NODE_SHOW_PATH = 0x010000, - LIB3DS_NODE_SMOOTHING = 0x020000, - LIB3DS_NODE_MOTION_BLUR = 0x100000, - LIB3DS_NODE_MORPH_MATERIALS = 0x400000 -} Lib3dsNodeFlags; - -typedef struct Lib3dsNode { - unsigned user_id; - void* user_ptr; - struct Lib3dsNode* next; - struct Lib3dsNode* childs; - struct Lib3dsNode* parent; - Lib3dsNodeType type; - unsigned short node_id; /**< 0..65535 */ - char name[64]; - unsigned flags; - float matrix[4][4]; -} Lib3dsNode; - -typedef enum Lib3dsKeyFlags { - LIB3DS_KEY_USE_TENS = 0x01, - LIB3DS_KEY_USE_CONT = 0x02, - LIB3DS_KEY_USE_BIAS = 0x04, - LIB3DS_KEY_USE_EASE_TO = 0x08, - LIB3DS_KEY_USE_EASE_FROM = 0x10 -} Lib3dsKeyFlags; - -typedef struct Lib3dsKey { - int frame; - unsigned flags; - float tens; - float cont; - float bias; - float ease_to; - float ease_from; - float value[4]; -} Lib3dsKey; - -typedef enum Lib3dsTrackType { - LIB3DS_TRACK_BOOL = 0, - LIB3DS_TRACK_FLOAT = 1, - LIB3DS_TRACK_VECTOR = 3, - LIB3DS_TRACK_QUAT = 4 -} Lib3dsTrackType; - -typedef enum { - LIB3DS_TRACK_REPEAT = 0x0001, - LIB3DS_TRACK_SMOOTH = 0x0002, - LIB3DS_TRACK_LOCK_X = 0x0008, - LIB3DS_TRACK_LOCK_Y = 0x0010, - LIB3DS_TRACK_LOCK_Z = 0x0020, - LIB3DS_TRACK_UNLINK_X = 0x0100, - LIB3DS_TRACK_UNLINK_Y = 0x0200, - LIB3DS_TRACK_UNLINK_Z = 0x0400 -} Lib3dsTrackFlags; - -typedef struct Lib3dsTrack { - unsigned flags; - Lib3dsTrackType type; - int nkeys; - Lib3dsKey* keys; -} Lib3dsTrack; - -typedef struct Lib3dsAmbientColorNode { - Lib3dsNode base; - float color[3]; - Lib3dsTrack color_track; -} Lib3dsAmbientColorNode; - -typedef struct Lib3dsMeshInstanceNode { - Lib3dsNode base; - float pivot[3]; - char instance_name[64]; - float bbox_min[3]; - float bbox_max[3]; - int hide; - float pos[3]; - float rot[4]; - float scl[3]; - float morph_smooth; - char morph[64]; - Lib3dsTrack pos_track; - Lib3dsTrack rot_track; - Lib3dsTrack scl_track; - Lib3dsTrack hide_track; -} Lib3dsMeshInstanceNode; - -typedef struct Lib3dsCameraNode { - Lib3dsNode base; - float pos[3]; - float fov; - float roll; - Lib3dsTrack pos_track; - Lib3dsTrack fov_track; - Lib3dsTrack roll_track; -} Lib3dsCameraNode; - -typedef struct Lib3dsTargetNode { - Lib3dsNode base; - float pos[3]; - Lib3dsTrack pos_track; -} Lib3dsTargetNode; - -typedef struct Lib3dsOmnilightNode { - Lib3dsNode base; - float pos[3]; - float color[3]; - Lib3dsTrack pos_track; - Lib3dsTrack color_track; -} Lib3dsOmnilightNode; - -typedef struct Lib3dsSpotlightNode { - Lib3dsNode base; - float pos[3]; - float color[3]; - float hotspot; - float falloff; - float roll; - Lib3dsTrack pos_track; - Lib3dsTrack color_track; - Lib3dsTrack hotspot_track; - Lib3dsTrack falloff_track; - Lib3dsTrack roll_track; -} Lib3dsSpotlightNode; - -typedef struct Lib3dsFile { - unsigned user_id; - void* user_ptr; - unsigned mesh_version; - unsigned keyf_revision; - char name[12+1]; - float master_scale; - float construction_plane[3]; - float ambient[3]; - Lib3dsShadow shadow; - Lib3dsBackground background; - Lib3dsAtmosphere atmosphere; - Lib3dsViewport viewport; - Lib3dsViewport viewport_keyf; - int frames; - int segment_from; - int segment_to; - int current_frame; - int materials_size; - int nmaterials; - Lib3dsMaterial** materials; - int cameras_size; - int ncameras; - Lib3dsCamera** cameras; - int lights_size; - int nlights; - Lib3dsLight** lights; - int meshes_size; - int nmeshes; - Lib3dsMesh** meshes; - Lib3dsNode* nodes; -} Lib3dsFile; - -extern LIB3DSAPI Lib3dsFile* lib3ds_file_open(const char *filename); -extern LIB3DSAPI int lib3ds_file_save(Lib3dsFile *file, const char *filename); -extern LIB3DSAPI Lib3dsFile* lib3ds_file_new(); -extern LIB3DSAPI void lib3ds_file_free(Lib3dsFile *file); -extern LIB3DSAPI void lib3ds_file_eval(Lib3dsFile *file, float t); -extern LIB3DSAPI int lib3ds_file_read(Lib3dsFile *file, Lib3dsIo *io); -extern LIB3DSAPI int lib3ds_file_write(Lib3dsFile *file, Lib3dsIo *io); -extern LIB3DSAPI void lib3ds_file_reserve_materials(Lib3dsFile *file, int size, int force); -extern LIB3DSAPI void lib3ds_file_insert_material(Lib3dsFile *file, Lib3dsMaterial *material, int index); -extern LIB3DSAPI void lib3ds_file_remove_material(Lib3dsFile *file, int index); -extern LIB3DSAPI int lib3ds_file_material_by_name(Lib3dsFile *file, const char *name); -extern LIB3DSAPI void lib3ds_file_reserve_cameras(Lib3dsFile *file, int size, int force); -extern LIB3DSAPI void lib3ds_file_insert_camera(Lib3dsFile *file, Lib3dsCamera *camera, int index); -extern LIB3DSAPI void lib3ds_file_remove_camera(Lib3dsFile *file, int index); -extern LIB3DSAPI int lib3ds_file_camera_by_name(Lib3dsFile *file, const char *name); -extern LIB3DSAPI void lib3ds_file_reserve_lights(Lib3dsFile *file, int size, int force); -extern LIB3DSAPI void lib3ds_file_insert_light(Lib3dsFile *file, Lib3dsLight *light, int index); -extern LIB3DSAPI void lib3ds_file_remove_light(Lib3dsFile *file, int index); -extern LIB3DSAPI int lib3ds_file_light_by_name(Lib3dsFile *file, const char *name); -extern LIB3DSAPI void lib3ds_file_reserve_meshes(Lib3dsFile *file, int size, int force); -extern LIB3DSAPI void lib3ds_file_insert_mesh(Lib3dsFile *file, Lib3dsMesh *mesh, int index); -extern LIB3DSAPI void lib3ds_file_remove_mesh(Lib3dsFile *file, int index); -extern LIB3DSAPI int lib3ds_file_mesh_by_name(Lib3dsFile *file, const char *name); -extern LIB3DSAPI Lib3dsMesh* lib3ds_file_mesh_for_node(Lib3dsFile *file, Lib3dsNode *node); -extern LIB3DSAPI Lib3dsNode* lib3ds_file_node_by_name(Lib3dsFile *file, const char* name, Lib3dsNodeType type); -extern LIB3DSAPI Lib3dsNode* lib3ds_file_node_by_id(Lib3dsFile *file, unsigned short node_id); -extern LIB3DSAPI void lib3ds_file_append_node(Lib3dsFile *file, Lib3dsNode *node, Lib3dsNode *parent); -extern LIB3DSAPI void lib3ds_file_insert_node(Lib3dsFile *file, Lib3dsNode *node, Lib3dsNode *at); -extern LIB3DSAPI void lib3ds_file_remove_node(Lib3dsFile *file, Lib3dsNode *node); -extern LIB3DSAPI void lib3ds_file_minmax_node_id(Lib3dsFile *file, unsigned short *min_id, unsigned short *max_id); -extern LIB3DSAPI void lib3ds_file_create_nodes_for_meshes(Lib3dsFile *file); - - -/** - This function computes the bounding box of meshes, cameras - and lights defined in the 3D editor. - - \param file The Lib3dsFile object to be examined. - \param include_meshes Include meshes in bounding box calculation. - \param include_cameras Include cameras in bounding box calculation. - \param include_lights Include lights in bounding box calculation. - \param bmin Returned minimum x,y,z values. - \param bmax Returned maximum x,y,z values. - */ -extern LIB3DSAPI void lib3ds_file_bounding_box_of_objects( - Lib3dsFile *file, - int include_meshes, - int include_cameras, - int include_lights, - float bmin[3], - float bmax[3]); - -/** - This function computes the bounding box of mesh, camera - and light instances defined in the Keyframer. - - \param file The Lib3dsFile object to be examined. - \param include_meshes Include meshes in bounding box calculation. - \param include_cameras Include cameras in bounding box calculation. - \param include_lights Include lights in bounding box calculation. - \param bmin Returned minimum x,y,z values. - \param bmax Returned maximum x,y,z values. - \param matrix A matrix describing the coordinate system to - calculate the bounding box in. - */ -extern LIB3DSAPI void lib3ds_file_bounding_box_of_nodes( - Lib3dsFile *file, - int include_meshes, - int include_cameras, - int include_lights, - float bmin[3], - float bmax[3], - float matrix[4][4]); - -extern LIB3DSAPI Lib3dsMaterial* lib3ds_material_new(const char *name); -extern LIB3DSAPI void lib3ds_material_free(Lib3dsMaterial *material); -extern LIB3DSAPI Lib3dsCamera* lib3ds_camera_new(const char *name); -extern LIB3DSAPI void lib3ds_camera_free(Lib3dsCamera *mesh); -extern LIB3DSAPI Lib3dsLight* lib3ds_light_new(const char *name); -extern LIB3DSAPI void lib3ds_light_free(Lib3dsLight *mesh); -extern LIB3DSAPI Lib3dsMesh* lib3ds_mesh_new(const char *name); -extern LIB3DSAPI void lib3ds_mesh_free(Lib3dsMesh *mesh); -extern LIB3DSAPI void lib3ds_mesh_resize_vertices(Lib3dsMesh *mesh, int nvertices, int use_texcos, int use_flags); -extern LIB3DSAPI void lib3ds_mesh_resize_faces(Lib3dsMesh *mesh, int nfaces); -extern LIB3DSAPI void lib3ds_mesh_bounding_box(Lib3dsMesh *mesh, float bmin[3], float bmax[3]); -extern LIB3DSAPI void lib3ds_mesh_calculate_face_normals(Lib3dsMesh *mesh, float (*face_normals)[3]); -extern LIB3DSAPI void lib3ds_mesh_calculate_vertex_normals(Lib3dsMesh *mesh, float (*normals)[3]); - -extern LIB3DSAPI Lib3dsNode* lib3ds_node_new(Lib3dsNodeType type); -extern LIB3DSAPI Lib3dsAmbientColorNode* lib3ds_node_new_ambient_color(float color0[3]); -extern LIB3DSAPI Lib3dsMeshInstanceNode* lib3ds_node_new_mesh_instance(Lib3dsMesh *mesh, const char* instance_name, float pos0[3], float scl0[3], float rot0[4]); -extern LIB3DSAPI Lib3dsCameraNode* lib3ds_node_new_camera(Lib3dsCamera *camera); -extern LIB3DSAPI Lib3dsTargetNode* lib3ds_node_new_camera_target(Lib3dsCamera *camera); -extern LIB3DSAPI Lib3dsOmnilightNode* lib3ds_node_new_omnilight(Lib3dsLight *light); -extern LIB3DSAPI Lib3dsSpotlightNode* lib3ds_node_new_spotlight(Lib3dsLight *light); -extern LIB3DSAPI Lib3dsTargetNode* lib3ds_node_new_spotlight_target(Lib3dsLight *light); -extern LIB3DSAPI void lib3ds_node_free(Lib3dsNode *node); -extern LIB3DSAPI void lib3ds_node_eval(Lib3dsNode *node, float t); -extern LIB3DSAPI Lib3dsNode* lib3ds_node_by_name(Lib3dsNode *node, const char* name, Lib3dsNodeType type); -extern LIB3DSAPI Lib3dsNode* lib3ds_node_by_id(Lib3dsNode *node, unsigned short node_id); - -extern LIB3DSAPI Lib3dsTrack* lib3ds_track_new(Lib3dsTrackType type, int nkeys); -extern LIB3DSAPI void lib3ds_track_free(Lib3dsTrack *track); -extern LIB3DSAPI void lib3ds_track_resize(Lib3dsTrack *track, int nkeys); -extern LIB3DSAPI void lib3ds_track_eval_bool(Lib3dsTrack *track, int *b, float t); -extern LIB3DSAPI void lib3ds_track_eval_float(Lib3dsTrack *track, float *f, float t); -extern LIB3DSAPI void lib3ds_track_eval_vector(Lib3dsTrack *track, float v[3], float t); -extern LIB3DSAPI void lib3ds_track_eval_quat(Lib3dsTrack *track, float q[4], float t); - -/** - Calculates the ease in/out function. See Lib3dsKey for details. - - \param fp Previous frame number. - \param fc Current frame number. - \param fn Next frame number. - \param ease_from Ease in value [0, 1.0] - \param ease_to Ease out value [0, 1.0] -*/ -extern LIB3DSAPI float lib3ds_math_ease( - float fp, - float fc, - float fn, - float ease_from, - float ease_to); - -/** - Computes a point on a n-dimensional cubic hermite spline. - \param v - [out] Result - \param a - [in] First point of the spline. - \param p - [in] Tangent at the first point of the spline. - \param q - [in] Tangent at the second point of the spline. - \param b - [in] Second point of the spline. - \param n - [in] Dimension - \param t - [in] Parameter value [0...1] -*/ -extern LIB3DSAPI void lib3ds_math_cubic_interp( - float *v, - float *a, - float *p, - float *q, - float *b, - int n, - float t); - -extern LIB3DSAPI void lib3ds_vector_make( - float c[3], - float x, - float y, - float z); - -/** - Sets all components of a vector to zero. - \param c - The Pointer to the vector. -*/ -extern LIB3DSAPI void lib3ds_vector_zero( - float c[3]); - -/** - Copies all components of a vector to another vector. - \param dst - [out] The destination vector. - \param src - [in] The source vector. -*/ -extern LIB3DSAPI void lib3ds_vector_copy( - float dst[3], - float src[3]); - -/** - Negates all components of a vector. - \param c - The Pointer to the vector. -*/ -extern LIB3DSAPI void lib3ds_vector_neg( - float c[3]); - -extern LIB3DSAPI void lib3ds_vector_make(float c[3], float x, float y, float z); -extern LIB3DSAPI void lib3ds_vector_zero(float c[3]); -extern LIB3DSAPI void lib3ds_vector_add(float c[3], float a[3], float b[3]); -extern LIB3DSAPI void lib3ds_vector_sub(float c[3], float a[3], float b[3]); -extern LIB3DSAPI void lib3ds_vector_scalar_mul(float c[3], float a[3], float k); -extern LIB3DSAPI void lib3ds_vector_cross(float c[3], float a[3], float b[3]); -extern LIB3DSAPI float lib3ds_vector_dot(float a[3], float b[3]); -extern LIB3DSAPI float lib3ds_vector_length(float c[3]); -extern LIB3DSAPI void lib3ds_vector_normalize(float c[3]); -extern LIB3DSAPI void lib3ds_vector_normal(float n[3], float a[3], float b[3], float c[3]); -extern LIB3DSAPI void lib3ds_vector_min(float c[3], float a[3]); -extern LIB3DSAPI void lib3ds_vector_max(float c[3], float a[3]); -extern LIB3DSAPI void lib3ds_vector_transform(float c[3], float m[4][4], float a[3]); - -extern LIB3DSAPI void lib3ds_quat_identity(float c[4]); -extern LIB3DSAPI void lib3ds_quat_copy(float dest[4], float src[4]); -extern LIB3DSAPI void lib3ds_quat_axis_angle(float c[4], float axis[3], float angle); -extern LIB3DSAPI void lib3ds_quat_neg(float c[4]); -extern LIB3DSAPI void lib3ds_quat_cnj(float c[4]); -extern LIB3DSAPI void lib3ds_quat_mul(float c[4], float a[4], float b[4]); -extern LIB3DSAPI void lib3ds_quat_scalar(float c[4], float k); -extern LIB3DSAPI void lib3ds_quat_normalize(float c[4]); -extern LIB3DSAPI void lib3ds_quat_inv(float c[4]); -extern LIB3DSAPI float lib3ds_quat_dot(float a[4], float b[4]); -extern LIB3DSAPI float lib3ds_quat_norm(float c[4]); -extern LIB3DSAPI void lib3ds_quat_ln(float c[4]); -extern LIB3DSAPI void lib3ds_quat_ln_dif(float c[4], float a[4], float b[4]); -extern LIB3DSAPI void lib3ds_quat_exp(float c[4]); -extern LIB3DSAPI void lib3ds_quat_slerp(float c[4], float a[4], float b[4], float t); -extern LIB3DSAPI void lib3ds_quat_squad(float c[4], float a[4], float p[4], float q[4], float b[4], float t); -extern LIB3DSAPI void lib3ds_quat_tangent(float c[4], float p[4], float q[4], float n[4]); - -extern LIB3DSAPI void lib3ds_matrix_zero(float m[4][4]); -extern LIB3DSAPI void lib3ds_matrix_identity(float m[4][4]); -extern LIB3DSAPI void lib3ds_matrix_copy(float dest[4][4], float src[4][4]); -extern LIB3DSAPI void lib3ds_matrix_neg(float m[4][4]); -extern LIB3DSAPI void lib3ds_matrix_transpose(float m[4][4]); -extern LIB3DSAPI void lib3ds_matrix_add(float m[4][4], float a[4][4], float b[4][4]); -extern LIB3DSAPI void lib3ds_matrix_sub(float m[4][4], float a[4][4], float b[4][4]); -extern LIB3DSAPI void lib3ds_matrix_mult(float m[4][4], float a[4][4], float b[4][4]); -extern LIB3DSAPI void lib3ds_matrix_scalar(float m[4][4], float k); -extern LIB3DSAPI float lib3ds_matrix_det(float m[4][4]); -extern LIB3DSAPI int lib3ds_matrix_inv(float m[4][4]); -extern LIB3DSAPI void lib3ds_matrix_translate(float m[4][4], float x, float y, float z); -extern LIB3DSAPI void lib3ds_matrix_scale(float m[4][4], float x, float y, float z); -extern LIB3DSAPI void lib3ds_matrix_rotate_quat(float m[4][4], float q[4]); -extern LIB3DSAPI void lib3ds_matrix_rotate(float m[4][4], float angle, float ax, float ay, float az); -extern LIB3DSAPI void lib3ds_matrix_camera(float m[4][4], float pos[3], float tgt[3], float roll); - -/* --- Code for OpenSceneGraph --- */ -extern LIB3DSAPI void setByteOrder(); - -/* Definitions for compatibility with previous lib3DS used: */ -typedef float Lib3dsMatrix[4][4]; -typedef float Lib3dsVector[3]; -typedef void Lib3dsUserData; -/* --- (end) Code for OpenSceneGraph --- */ - - -/** @} */ -#ifdef __cplusplus -} -#endif -#endif - +/* -*- c -*- */ +#ifndef INCLUDED_LIB3DS_H +#define INCLUDED_LIB3DS_H +/* + Copyright (C) 1996-2008 by Jan Eric Kyprianidis + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation, either version 2.1 of the License, or + (at your option) any later version. + + Thisprogram is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; If not, see . + */ + +#include + +#ifndef LIB3DSAPI + #if defined(_MSC_VER) && !defined(LIB3DS_STATIC) + #ifdef LIB3DS_EXPORTS + #define LIB3DSAPI __declspec(dllexport) + #else + #define LIB3DSAPI __declspec(dllimport) + #endif + #else + #define LIB3DSAPI + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup api API */ +/** @{ */ + +typedef enum Lib3dsIoSeek { + LIB3DS_SEEK_SET = 0, + LIB3DS_SEEK_CUR = 1, + LIB3DS_SEEK_END = 2 +} Lib3dsIoSeek; + +typedef enum Lib3dsLogLevel { + LIB3DS_LOG_ERROR = 0, + LIB3DS_LOG_WARN = 1, + LIB3DS_LOG_INFO = 2, + LIB3DS_LOG_DEBUG = 3 +} Lib3dsLogLevel; + +typedef struct Lib3dsIo { + void* impl; + void* self; + long (*seek_func) (void *self, long offset, Lib3dsIoSeek origin); + long (*tell_func) (void *self); + size_t (*read_func) (void *self, void *buffer, size_t size); + size_t (*write_func)(void *self, const void *buffer, size_t size); + void (*log_func) (void *self, Lib3dsLogLevel level, int indent, const char *msg); +} Lib3dsIo; + +/* Atmosphere settings */ +typedef struct Lib3dsAtmosphere { + int use_fog; + float fog_color[3]; + int fog_background; + float fog_near_plane; + float fog_near_density; + float fog_far_plane; + float fog_far_density; + int use_layer_fog; + unsigned layer_fog_flags; + float layer_fog_color[3]; + float layer_fog_near_y; + float layer_fog_far_y; + float layer_fog_density; + int use_dist_cue; + int dist_cue_background; /* bool */ + float dist_cue_near_plane; + float dist_cue_near_dimming; + float dist_cue_far_plane; + float dist_cue_far_dimming; +} Lib3dsAtmosphere; + +/* Background settings */ +typedef struct Lib3dsBackground { + int use_bitmap; + char bitmap_name[64]; + int use_solid; + float solid_color[3]; + int use_gradient; + float gradient_percent; + float gradient_top[3]; + float gradient_middle[3]; + float gradient_bottom[3]; +} Lib3dsBackground; + +/* Shadow settings */ +typedef struct Lib3dsShadow { + short map_size; /* Global shadow map size that ranges from 10 to 4096 */ + float low_bias; /* Global shadow low bias */ + float hi_bias; /* Global shadow hi bias */ + float filter; /* Global shadow filter that ranges from 1 (lowest) to 10 (highest) */ + float ray_bias; /* Global raytraced shadow bias */ +} Lib3dsShadow; + +/* Layout view types */ +typedef enum Lib3dsViewType { + LIB3DS_VIEW_NOT_USED = 0, + LIB3DS_VIEW_TOP = 1, + LIB3DS_VIEW_BOTTOM = 2, + LIB3DS_VIEW_LEFT = 3, + LIB3DS_VIEW_RIGHT = 4, + LIB3DS_VIEW_FRONT = 5, + LIB3DS_VIEW_BACK = 6, + LIB3DS_VIEW_USER = 7, + LIB3DS_VIEW_SPOTLIGHT = 18, + LIB3DS_VIEW_CAMERA = 65535 +} Lib3dsViewType; + +/* Layout styles */ +typedef enum Lib3dsLayoutStyle { + LIB3DS_LAYOUT_SINGLE = 0, + LIB3DS_LAYOUT_TWO_PANE_VERT_SPLIT = 1, + LIB3DS_LAYOUT_TWO_PANE_HORIZ_SPLIT = 2, + LIB3DS_LAYOUT_FOUR_PANE = 3, + LIB3DS_LAYOUT_THREE_PANE_LEFT_SPLIT = 4, + LIB3DS_LAYOUT_THREE_PANE_BOTTOM_SPLIT = 5, + LIB3DS_LAYOUT_THREE_PANE_RIGHT_SPLIT = 6, + LIB3DS_LAYOUT_THREE_PANE_TOP_SPLIT = 7, + LIB3DS_LAYOUT_THREE_PANE_VERT_SPLIT = 8, + LIB3DS_LAYOUT_THREE_PANE_HORIZ_SPLIT = 9, + LIB3DS_LAYOUT_FOUR_PANE_LEFT_SPLIT = 10, + LIB3DS_LAYOUT_FOUR_PANE_RIGHT_SPLIT = 11 +} Lib3dsLayoutStyle; + +/* Layout view settings */ +typedef struct Lib3dsView { + int type; + unsigned axis_lock; + short position[2]; + short size[2]; + float zoom; + float center[3]; + float horiz_angle; + float vert_angle; + char camera[11]; +} Lib3dsView; + +#define LIB3DS_LAYOUT_MAX_VIEWS 32 + +/* Viewport and default view settings */ +typedef struct Lib3dsViewport { + int layout_style; + int layout_active; + int layout_swap; + int layout_swap_prior; + int layout_swap_view; + unsigned short layout_position[2]; + unsigned short layout_size[2]; + int layout_nviews; + Lib3dsView layout_views[LIB3DS_LAYOUT_MAX_VIEWS]; + int default_type; + float default_position[3]; + float default_width; + float default_horiz_angle; + float default_vert_angle; + float default_roll_angle; + char default_camera[64]; +} Lib3dsViewport; + +/* Material texture map flags */ +typedef enum Lib3dsTextureMapFlags { + LIB3DS_TEXTURE_DECALE = 0x0001, + LIB3DS_TEXTURE_MIRROR = 0x0002, + LIB3DS_TEXTURE_NEGATE = 0x0008, + LIB3DS_TEXTURE_NO_TILE = 0x0010, + LIB3DS_TEXTURE_SUMMED_AREA = 0x0020, + LIB3DS_TEXTURE_ALPHA_SOURCE = 0x0040, + LIB3DS_TEXTURE_TINT = 0x0080, + LIB3DS_TEXTURE_IGNORE_ALPHA = 0x0100, + LIB3DS_TEXTURE_RGB_TINT = 0x0200 +} Lib3dsTextureMapFlags; + +/* Material texture map */ +typedef struct Lib3dsTextureMap { + unsigned user_id; + void* user_ptr; + char name[64]; + unsigned flags; + float percent; + float blur; + float scale[2]; + float offset[2]; + float rotation; + float tint_1[3]; + float tint_2[3]; + float tint_r[3]; + float tint_g[3]; + float tint_b[3]; +} Lib3dsTextureMap; + +/* Auto reflection texture map flags */ +typedef enum Lib3dsAutoReflMapFlags { + LIB3DS_AUTOREFL_USE = 0x0001, + LIB3DS_AUTOREFL_READ_FIRST_FRAME_ONLY = 0x0004, + LIB3DS_AUTOREFL_FLAT_MIRROR = 0x0008 +} Lib3dsAutoReflMapFlags; + +/* Material shading type */ +typedef enum Lib3dsShading { + LIB3DS_SHADING_WIRE_FRAME = 0, + LIB3DS_SHADING_FLAT = 1, + LIB3DS_SHADING_GOURAUD = 2, + LIB3DS_SHADING_PHONG = 3, + LIB3DS_SHADING_METAL = 4 +} Lib3dsShading; + +/** Material */ +typedef struct Lib3dsMaterial { + unsigned user_id; + void* user_ptr; + char name[64]; /* Material name */ + float ambient[3]; /* Material ambient reflectivity */ + float diffuse[3]; /* Material diffuse reflectivity */ + float specular[3]; /* Material specular reflectivity */ + float shininess; /* Material specular exponent */ + float shin_strength; + int use_blur; + float blur; + float transparency; + float falloff; + int is_additive; + int self_illum_flag; /* bool */ + float self_illum; + int use_falloff; + int shading; + int soften; /* bool */ + int face_map; /* bool */ + int two_sided; /* Material visible from back */ + int map_decal; /* bool */ + int use_wire; + int use_wire_abs; + float wire_size; + Lib3dsTextureMap texture1_map; + Lib3dsTextureMap texture1_mask; + Lib3dsTextureMap texture2_map; + Lib3dsTextureMap texture2_mask; + Lib3dsTextureMap opacity_map; + Lib3dsTextureMap opacity_mask; + Lib3dsTextureMap bump_map; + Lib3dsTextureMap bump_mask; + Lib3dsTextureMap specular_map; + Lib3dsTextureMap specular_mask; + Lib3dsTextureMap shininess_map; + Lib3dsTextureMap shininess_mask; + Lib3dsTextureMap self_illum_map; + Lib3dsTextureMap self_illum_mask; + Lib3dsTextureMap reflection_map; + Lib3dsTextureMap reflection_mask; + unsigned autorefl_map_flags; + int autorefl_map_anti_alias; /* 0=None, 1=Low, 2=Medium, 3=High */ + int autorefl_map_size; + int autorefl_map_frame_step; +} Lib3dsMaterial; + +/** Object flags for cameras, lights and meshes */ +typedef enum Lib3dsObjectFlags { + LIB3DS_OBJECT_HIDDEN = 0x01, + LIB3DS_OBJECT_VIS_LOFTER = 0x02, + LIB3DS_OBJECT_DOESNT_CAST = 0x04, + LIB3DS_OBJECT_MATTE = 0x08, + LIB3DS_OBJECT_DONT_RCVSHADOW = 0x10, + LIB3DS_OBJECT_FAST = 0x20, + LIB3DS_OBJECT_FROZEN = 0x40 +} Lib3dsObjectFlags; + +/** Camera object */ +typedef struct Lib3dsCamera { + unsigned user_id; + void* user_ptr; + char name[64]; + unsigned object_flags; /*< @see Lib3dsObjectFlags */ + float position[3]; + float target[3]; + float roll; + float fov; + int see_cone; + float near_range; + float far_range; +} Lib3dsCamera; + +/** Light object */ +typedef struct Lib3dsLight { + unsigned user_id; + void* user_ptr; + char name[64]; + unsigned object_flags; + int spot_light; /* bool */ + int see_cone; + float color[3]; + float position[3]; + float target[3]; + float roll; + int off; /* bool */ + float outer_range; + float inner_range; + float multiplier; + /*const char** excludes;*/ + float attenuation; + int rectangular_spot; /* bool */ + int shadowed; /* bool */ + float shadow_bias; + float shadow_filter; + int shadow_size; + float spot_aspect; + int use_projector; + char projector[64]; + int spot_overshoot; /* bool */ + int ray_shadows; /* bool */ + float ray_bias; + float hotspot; + float falloff; +} Lib3dsLight; + +/* Texture map projection */ +typedef enum { + LIB3DS_MAP_NONE = -1, + LIB3DS_MAP_PLANAR = 0, + LIB3DS_MAP_CYLINDRICAL = 1, + LIB3DS_MAP_SPHERICAL = 2 +} Lib3dsMapType; + +/** Meaning of Lib3dsFace::flags. ABC are points of the current face + (A: is 1st vertex, B is 2nd vertex, C is 3rd vertex) */ +typedef enum Lib3dsFaceFlags { + LIB3DS_FACE_VIS_AC = 0x01, /**< Bit 0: Edge visibility AC */ + LIB3DS_FACE_VIS_BC = 0x02, /**< Bit 1: Edge visibility BC */ + LIB3DS_FACE_VIS_AB = 0x04, /**< Bit 2: Edge visibility AB */ + LIB3DS_FACE_WRAP_U = 0x08, /**< Bit 3: Face is at tex U wrap seam */ + LIB3DS_FACE_WRAP_V = 0x10, /**< Bit 4: Face is at tex V wrap seam */ + LIB3DS_FACE_SELECT_3 = (1<<13), /**< Bit 13: Selection of the face in selection 3*/ + LIB3DS_FACE_SELECT_2 = (1<<14), /**< Bit 14: Selection of the face in selection 2*/ + LIB3DS_FACE_SELECT_1 = (1<<15) /**< Bit 15: Selection of the face in selection 1*/ +} Lib3dsFaceFlags; + +typedef struct Lib3dsFace { + unsigned short index[3]; + unsigned short flags; + int material; + unsigned smoothing_group; +} Lib3dsFace; + +/* Triangular mesh object */ +typedef struct Lib3dsMesh { + unsigned user_id; + void* user_ptr; + char name[64]; /**< Mesh name. Don't use more than 8 characters */ + unsigned object_flags; /**< @see Lib3dsObjectFlags */ + int color; /**< Index to editor palette [0..255] */ + float matrix[4][4]; /**< Transformation matrix for mesh data */ + unsigned short nvertices; /**< Number of vertices in vertex array (max. 65535) */ + float (*vertices)[3]; + float (*texcos)[2]; + unsigned short* vflags; + unsigned short nfaces; /**< Number of faces in face array (max. 65535) */ + Lib3dsFace* faces; + char box_front[64]; + char box_back[64]; + char box_left[64]; + char box_right[64]; + char box_top[64]; + char box_bottom[64]; + int map_type; + float map_pos[3]; + float map_matrix[4][4]; + float map_scale; + float map_tile[2]; + float map_planar_size[2]; + float map_cylinder_height; +} Lib3dsMesh; + +typedef enum Lib3dsNodeType { + LIB3DS_NODE_AMBIENT_COLOR = 0, + LIB3DS_NODE_MESH_INSTANCE = 1, + LIB3DS_NODE_CAMERA = 2, + LIB3DS_NODE_CAMERA_TARGET = 3, + LIB3DS_NODE_OMNILIGHT = 4, + LIB3DS_NODE_SPOTLIGHT = 5, + LIB3DS_NODE_SPOTLIGHT_TARGET= 6 +} Lib3dsNodeType; + +typedef enum Lib3dsNodeFlags{ + LIB3DS_NODE_HIDDEN = 0x000800, + LIB3DS_NODE_SHOW_PATH = 0x010000, + LIB3DS_NODE_SMOOTHING = 0x020000, + LIB3DS_NODE_MOTION_BLUR = 0x100000, + LIB3DS_NODE_MORPH_MATERIALS = 0x400000 +} Lib3dsNodeFlags; + +typedef struct Lib3dsNode { + unsigned user_id; + void* user_ptr; + struct Lib3dsNode* next; + struct Lib3dsNode* childs; + struct Lib3dsNode* parent; + Lib3dsNodeType type; + unsigned short node_id; /**< 0..65535 */ + char name[64]; + unsigned flags; + float matrix[4][4]; +} Lib3dsNode; + +typedef enum Lib3dsKeyFlags { + LIB3DS_KEY_USE_TENS = 0x01, + LIB3DS_KEY_USE_CONT = 0x02, + LIB3DS_KEY_USE_BIAS = 0x04, + LIB3DS_KEY_USE_EASE_TO = 0x08, + LIB3DS_KEY_USE_EASE_FROM = 0x10 +} Lib3dsKeyFlags; + +typedef struct Lib3dsKey { + int frame; + unsigned flags; + float tens; + float cont; + float bias; + float ease_to; + float ease_from; + float value[4]; +} Lib3dsKey; + +typedef enum Lib3dsTrackType { + LIB3DS_TRACK_BOOL = 0, + LIB3DS_TRACK_FLOAT = 1, + LIB3DS_TRACK_VECTOR = 3, + LIB3DS_TRACK_QUAT = 4 +} Lib3dsTrackType; + +typedef enum { + LIB3DS_TRACK_REPEAT = 0x0001, + LIB3DS_TRACK_SMOOTH = 0x0002, + LIB3DS_TRACK_LOCK_X = 0x0008, + LIB3DS_TRACK_LOCK_Y = 0x0010, + LIB3DS_TRACK_LOCK_Z = 0x0020, + LIB3DS_TRACK_UNLINK_X = 0x0100, + LIB3DS_TRACK_UNLINK_Y = 0x0200, + LIB3DS_TRACK_UNLINK_Z = 0x0400 +} Lib3dsTrackFlags; + +typedef struct Lib3dsTrack { + unsigned flags; + Lib3dsTrackType type; + int nkeys; + Lib3dsKey* keys; +} Lib3dsTrack; + +typedef struct Lib3dsAmbientColorNode { + Lib3dsNode base; + float color[3]; + Lib3dsTrack color_track; +} Lib3dsAmbientColorNode; + +typedef struct Lib3dsMeshInstanceNode { + Lib3dsNode base; + float pivot[3]; + char instance_name[64]; + float bbox_min[3]; + float bbox_max[3]; + int hide; + float pos[3]; + float rot[4]; + float scl[3]; + float morph_smooth; + char morph[64]; + Lib3dsTrack pos_track; + Lib3dsTrack rot_track; + Lib3dsTrack scl_track; + Lib3dsTrack hide_track; +} Lib3dsMeshInstanceNode; + +typedef struct Lib3dsCameraNode { + Lib3dsNode base; + float pos[3]; + float fov; + float roll; + Lib3dsTrack pos_track; + Lib3dsTrack fov_track; + Lib3dsTrack roll_track; +} Lib3dsCameraNode; + +typedef struct Lib3dsTargetNode { + Lib3dsNode base; + float pos[3]; + Lib3dsTrack pos_track; +} Lib3dsTargetNode; + +typedef struct Lib3dsOmnilightNode { + Lib3dsNode base; + float pos[3]; + float color[3]; + Lib3dsTrack pos_track; + Lib3dsTrack color_track; +} Lib3dsOmnilightNode; + +typedef struct Lib3dsSpotlightNode { + Lib3dsNode base; + float pos[3]; + float color[3]; + float hotspot; + float falloff; + float roll; + Lib3dsTrack pos_track; + Lib3dsTrack color_track; + Lib3dsTrack hotspot_track; + Lib3dsTrack falloff_track; + Lib3dsTrack roll_track; +} Lib3dsSpotlightNode; + +typedef struct Lib3dsFile { + unsigned user_id; + void* user_ptr; + unsigned mesh_version; + unsigned keyf_revision; + char name[12+1]; + float master_scale; + float construction_plane[3]; + float ambient[3]; + Lib3dsShadow shadow; + Lib3dsBackground background; + Lib3dsAtmosphere atmosphere; + Lib3dsViewport viewport; + Lib3dsViewport viewport_keyf; + int frames; + int segment_from; + int segment_to; + int current_frame; + int materials_size; + int nmaterials; + Lib3dsMaterial** materials; + int cameras_size; + int ncameras; + Lib3dsCamera** cameras; + int lights_size; + int nlights; + Lib3dsLight** lights; + int meshes_size; + int nmeshes; + Lib3dsMesh** meshes; + Lib3dsNode* nodes; +} Lib3dsFile; + +extern LIB3DSAPI Lib3dsFile* lib3ds_file_open(const char *filename); +extern LIB3DSAPI int lib3ds_file_save(Lib3dsFile *file, const char *filename); +extern LIB3DSAPI Lib3dsFile* lib3ds_file_new(); +extern LIB3DSAPI void lib3ds_file_free(Lib3dsFile *file); +extern LIB3DSAPI void lib3ds_file_eval(Lib3dsFile *file, float t); +extern LIB3DSAPI int lib3ds_file_read(Lib3dsFile *file, Lib3dsIo *io); +extern LIB3DSAPI int lib3ds_file_write(Lib3dsFile *file, Lib3dsIo *io); +extern LIB3DSAPI void lib3ds_file_reserve_materials(Lib3dsFile *file, int size, int force); +extern LIB3DSAPI void lib3ds_file_insert_material(Lib3dsFile *file, Lib3dsMaterial *material, int index); +extern LIB3DSAPI void lib3ds_file_remove_material(Lib3dsFile *file, int index); +extern LIB3DSAPI int lib3ds_file_material_by_name(Lib3dsFile *file, const char *name); +extern LIB3DSAPI void lib3ds_file_reserve_cameras(Lib3dsFile *file, int size, int force); +extern LIB3DSAPI void lib3ds_file_insert_camera(Lib3dsFile *file, Lib3dsCamera *camera, int index); +extern LIB3DSAPI void lib3ds_file_remove_camera(Lib3dsFile *file, int index); +extern LIB3DSAPI int lib3ds_file_camera_by_name(Lib3dsFile *file, const char *name); +extern LIB3DSAPI void lib3ds_file_reserve_lights(Lib3dsFile *file, int size, int force); +extern LIB3DSAPI void lib3ds_file_insert_light(Lib3dsFile *file, Lib3dsLight *light, int index); +extern LIB3DSAPI void lib3ds_file_remove_light(Lib3dsFile *file, int index); +extern LIB3DSAPI int lib3ds_file_light_by_name(Lib3dsFile *file, const char *name); +extern LIB3DSAPI void lib3ds_file_reserve_meshes(Lib3dsFile *file, int size, int force); +extern LIB3DSAPI void lib3ds_file_insert_mesh(Lib3dsFile *file, Lib3dsMesh *mesh, int index); +extern LIB3DSAPI void lib3ds_file_remove_mesh(Lib3dsFile *file, int index); +extern LIB3DSAPI int lib3ds_file_mesh_by_name(Lib3dsFile *file, const char *name); +extern LIB3DSAPI Lib3dsMesh* lib3ds_file_mesh_for_node(Lib3dsFile *file, Lib3dsNode *node); +extern LIB3DSAPI Lib3dsNode* lib3ds_file_node_by_name(Lib3dsFile *file, const char* name, Lib3dsNodeType type); +extern LIB3DSAPI Lib3dsNode* lib3ds_file_node_by_id(Lib3dsFile *file, unsigned short node_id); +extern LIB3DSAPI void lib3ds_file_append_node(Lib3dsFile *file, Lib3dsNode *node, Lib3dsNode *parent); +extern LIB3DSAPI void lib3ds_file_insert_node(Lib3dsFile *file, Lib3dsNode *node, Lib3dsNode *at); +extern LIB3DSAPI void lib3ds_file_remove_node(Lib3dsFile *file, Lib3dsNode *node); +extern LIB3DSAPI void lib3ds_file_minmax_node_id(Lib3dsFile *file, unsigned short *min_id, unsigned short *max_id); +extern LIB3DSAPI void lib3ds_file_create_nodes_for_meshes(Lib3dsFile *file); + + +/** + This function computes the bounding box of meshes, cameras + and lights defined in the 3D editor. + + \param file The Lib3dsFile object to be examined. + \param include_meshes Include meshes in bounding box calculation. + \param include_cameras Include cameras in bounding box calculation. + \param include_lights Include lights in bounding box calculation. + \param bmin Returned minimum x,y,z values. + \param bmax Returned maximum x,y,z values. + */ +extern LIB3DSAPI void lib3ds_file_bounding_box_of_objects( + Lib3dsFile *file, + int include_meshes, + int include_cameras, + int include_lights, + float bmin[3], + float bmax[3]); + +/** + This function computes the bounding box of mesh, camera + and light instances defined in the Keyframer. + + \param file The Lib3dsFile object to be examined. + \param include_meshes Include meshes in bounding box calculation. + \param include_cameras Include cameras in bounding box calculation. + \param include_lights Include lights in bounding box calculation. + \param bmin Returned minimum x,y,z values. + \param bmax Returned maximum x,y,z values. + \param matrix A matrix describing the coordinate system to + calculate the bounding box in. + */ +extern LIB3DSAPI void lib3ds_file_bounding_box_of_nodes( + Lib3dsFile *file, + int include_meshes, + int include_cameras, + int include_lights, + float bmin[3], + float bmax[3], + float matrix[4][4]); + +extern LIB3DSAPI Lib3dsMaterial* lib3ds_material_new(const char *name); +extern LIB3DSAPI void lib3ds_material_free(Lib3dsMaterial *material); +extern LIB3DSAPI Lib3dsCamera* lib3ds_camera_new(const char *name); +extern LIB3DSAPI void lib3ds_camera_free(Lib3dsCamera *mesh); +extern LIB3DSAPI Lib3dsLight* lib3ds_light_new(const char *name); +extern LIB3DSAPI void lib3ds_light_free(Lib3dsLight *mesh); +extern LIB3DSAPI Lib3dsMesh* lib3ds_mesh_new(const char *name); +extern LIB3DSAPI void lib3ds_mesh_free(Lib3dsMesh *mesh); +extern LIB3DSAPI void lib3ds_mesh_resize_vertices(Lib3dsMesh *mesh, int nvertices, int use_texcos, int use_flags); +extern LIB3DSAPI void lib3ds_mesh_resize_faces(Lib3dsMesh *mesh, int nfaces); +extern LIB3DSAPI void lib3ds_mesh_bounding_box(Lib3dsMesh *mesh, float bmin[3], float bmax[3]); +extern LIB3DSAPI void lib3ds_mesh_calculate_face_normals(Lib3dsMesh *mesh, float (*face_normals)[3]); +extern LIB3DSAPI void lib3ds_mesh_calculate_vertex_normals(Lib3dsMesh *mesh, float (*normals)[3]); + +extern LIB3DSAPI Lib3dsNode* lib3ds_node_new(Lib3dsNodeType type); +extern LIB3DSAPI Lib3dsAmbientColorNode* lib3ds_node_new_ambient_color(float color0[3]); +extern LIB3DSAPI Lib3dsMeshInstanceNode* lib3ds_node_new_mesh_instance(Lib3dsMesh *mesh, const char* instance_name, float pos0[3], float scl0[3], float rot0[4]); +extern LIB3DSAPI Lib3dsCameraNode* lib3ds_node_new_camera(Lib3dsCamera *camera); +extern LIB3DSAPI Lib3dsTargetNode* lib3ds_node_new_camera_target(Lib3dsCamera *camera); +extern LIB3DSAPI Lib3dsOmnilightNode* lib3ds_node_new_omnilight(Lib3dsLight *light); +extern LIB3DSAPI Lib3dsSpotlightNode* lib3ds_node_new_spotlight(Lib3dsLight *light); +extern LIB3DSAPI Lib3dsTargetNode* lib3ds_node_new_spotlight_target(Lib3dsLight *light); +extern LIB3DSAPI void lib3ds_node_free(Lib3dsNode *node); +extern LIB3DSAPI void lib3ds_node_eval(Lib3dsNode *node, float t); +extern LIB3DSAPI Lib3dsNode* lib3ds_node_by_name(Lib3dsNode *node, const char* name, Lib3dsNodeType type); +extern LIB3DSAPI Lib3dsNode* lib3ds_node_by_id(Lib3dsNode *node, unsigned short node_id); + +extern LIB3DSAPI Lib3dsTrack* lib3ds_track_new(Lib3dsTrackType type, int nkeys); +extern LIB3DSAPI void lib3ds_track_free(Lib3dsTrack *track); +extern LIB3DSAPI void lib3ds_track_resize(Lib3dsTrack *track, int nkeys); +extern LIB3DSAPI void lib3ds_track_eval_bool(Lib3dsTrack *track, int *b, float t); +extern LIB3DSAPI void lib3ds_track_eval_float(Lib3dsTrack *track, float *f, float t); +extern LIB3DSAPI void lib3ds_track_eval_vector(Lib3dsTrack *track, float v[3], float t); +extern LIB3DSAPI void lib3ds_track_eval_quat(Lib3dsTrack *track, float q[4], float t); + +/** + Calculates the ease in/out function. See Lib3dsKey for details. + + \param fp Previous frame number. + \param fc Current frame number. + \param fn Next frame number. + \param ease_from Ease in value [0, 1.0] + \param ease_to Ease out value [0, 1.0] +*/ +extern LIB3DSAPI float lib3ds_math_ease( + float fp, + float fc, + float fn, + float ease_from, + float ease_to); + +/** + Computes a point on a n-dimensional cubic hermite spline. + \param v + [out] Result + \param a + [in] First point of the spline. + \param p + [in] Tangent at the first point of the spline. + \param q + [in] Tangent at the second point of the spline. + \param b + [in] Second point of the spline. + \param n + [in] Dimension + \param t + [in] Parameter value [0...1] +*/ +extern LIB3DSAPI void lib3ds_math_cubic_interp( + float *v, + float *a, + float *p, + float *q, + float *b, + int n, + float t); + +extern LIB3DSAPI void lib3ds_vector_make( + float c[3], + float x, + float y, + float z); + +/** + Sets all components of a vector to zero. + \param c + The Pointer to the vector. +*/ +extern LIB3DSAPI void lib3ds_vector_zero( + float c[3]); + +/** + Copies all components of a vector to another vector. + \param dst + [out] The destination vector. + \param src + [in] The source vector. +*/ +extern LIB3DSAPI void lib3ds_vector_copy( + float dst[3], + float src[3]); + +/** + Negates all components of a vector. + \param c + The Pointer to the vector. +*/ +extern LIB3DSAPI void lib3ds_vector_neg( + float c[3]); + +extern LIB3DSAPI void lib3ds_vector_make(float c[3], float x, float y, float z); +extern LIB3DSAPI void lib3ds_vector_zero(float c[3]); +extern LIB3DSAPI void lib3ds_vector_add(float c[3], float a[3], float b[3]); +extern LIB3DSAPI void lib3ds_vector_sub(float c[3], float a[3], float b[3]); +extern LIB3DSAPI void lib3ds_vector_scalar_mul(float c[3], float a[3], float k); +extern LIB3DSAPI void lib3ds_vector_cross(float c[3], float a[3], float b[3]); +extern LIB3DSAPI float lib3ds_vector_dot(float a[3], float b[3]); +extern LIB3DSAPI float lib3ds_vector_length(float c[3]); +extern LIB3DSAPI void lib3ds_vector_normalize(float c[3]); +extern LIB3DSAPI void lib3ds_vector_normal(float n[3], float a[3], float b[3], float c[3]); +extern LIB3DSAPI void lib3ds_vector_min(float c[3], float a[3]); +extern LIB3DSAPI void lib3ds_vector_max(float c[3], float a[3]); +extern LIB3DSAPI void lib3ds_vector_transform(float c[3], float m[4][4], float a[3]); + +extern LIB3DSAPI void lib3ds_quat_identity(float c[4]); +extern LIB3DSAPI void lib3ds_quat_copy(float dest[4], float src[4]); +extern LIB3DSAPI void lib3ds_quat_axis_angle(float c[4], float axis[3], float angle); +extern LIB3DSAPI void lib3ds_quat_neg(float c[4]); +extern LIB3DSAPI void lib3ds_quat_cnj(float c[4]); +extern LIB3DSAPI void lib3ds_quat_mul(float c[4], float a[4], float b[4]); +extern LIB3DSAPI void lib3ds_quat_scalar(float c[4], float k); +extern LIB3DSAPI void lib3ds_quat_normalize(float c[4]); +extern LIB3DSAPI void lib3ds_quat_inv(float c[4]); +extern LIB3DSAPI float lib3ds_quat_dot(float a[4], float b[4]); +extern LIB3DSAPI float lib3ds_quat_norm(float c[4]); +extern LIB3DSAPI void lib3ds_quat_ln(float c[4]); +extern LIB3DSAPI void lib3ds_quat_ln_dif(float c[4], float a[4], float b[4]); +extern LIB3DSAPI void lib3ds_quat_exp(float c[4]); +extern LIB3DSAPI void lib3ds_quat_slerp(float c[4], float a[4], float b[4], float t); +extern LIB3DSAPI void lib3ds_quat_squad(float c[4], float a[4], float p[4], float q[4], float b[4], float t); +extern LIB3DSAPI void lib3ds_quat_tangent(float c[4], float p[4], float q[4], float n[4]); + +extern LIB3DSAPI void lib3ds_matrix_zero(float m[4][4]); +extern LIB3DSAPI void lib3ds_matrix_identity(float m[4][4]); +extern LIB3DSAPI void lib3ds_matrix_copy(float dest[4][4], float src[4][4]); +extern LIB3DSAPI void lib3ds_matrix_neg(float m[4][4]); +extern LIB3DSAPI void lib3ds_matrix_transpose(float m[4][4]); +extern LIB3DSAPI void lib3ds_matrix_add(float m[4][4], float a[4][4], float b[4][4]); +extern LIB3DSAPI void lib3ds_matrix_sub(float m[4][4], float a[4][4], float b[4][4]); +extern LIB3DSAPI void lib3ds_matrix_mult(float m[4][4], float a[4][4], float b[4][4]); +extern LIB3DSAPI void lib3ds_matrix_scalar(float m[4][4], float k); +extern LIB3DSAPI float lib3ds_matrix_det(float m[4][4]); +extern LIB3DSAPI int lib3ds_matrix_inv(float m[4][4]); +extern LIB3DSAPI void lib3ds_matrix_translate(float m[4][4], float x, float y, float z); +extern LIB3DSAPI void lib3ds_matrix_scale(float m[4][4], float x, float y, float z); +extern LIB3DSAPI void lib3ds_matrix_rotate_quat(float m[4][4], float q[4]); +extern LIB3DSAPI void lib3ds_matrix_rotate(float m[4][4], float angle, float ax, float ay, float az); +extern LIB3DSAPI void lib3ds_matrix_camera(float m[4][4], float pos[3], float tgt[3], float roll); + +/* --- Code for OpenSceneGraph --- */ +extern LIB3DSAPI void setByteOrder(); + +/* Definitions for compatibility with previous lib3DS used: */ +typedef float Lib3dsMatrix[4][4]; +typedef float Lib3dsVector[3]; +typedef void Lib3dsUserData; +/* --- (end) Code for OpenSceneGraph --- */ + + +/** @} */ +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/osgPlugins/3ds/lib3ds/lib3ds_impl.h b/src/osgPlugins/3ds/lib3ds/lib3ds_impl.h index 62d15f923..1c12e66c2 100644 --- a/src/osgPlugins/3ds/lib3ds/lib3ds_impl.h +++ b/src/osgPlugins/3ds/lib3ds/lib3ds_impl.h @@ -1,388 +1,388 @@ -/* -*- c -*- */ -#ifndef INCLUDED_LIB3DS_IMPL_H -#define INCLUDED_LIB3DS_IMPL_H -/* - Copyright (C) 1996-2008 by Jan Eric Kyprianidis - All rights reserved. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation, either version 2.1 of the License, or - (at your option) any later version. - - Thisprogram is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; If not, see . -*/ - -#include "lib3ds.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning ( disable : 4996 ) -#endif - -#ifndef _MSC_VER -#include -#else -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef signed __int8 int8_t; -typedef signed __int16 int16_t; -typedef signed __int32 int32_t; -#endif - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -#define LIB3DS_EPSILON (1e-5) -#define LIB3DS_PI 3.14159265358979323846 -#define LIB3DS_TWOPI (2.0*LIB3DS_PI) -#define LIB3DS_HALFPI (LIB3DS_PI/2.0) -#define LIB3DS_RAD_TO_DEG(x) ((180.0/LIB3DS_PI)*(x)) -#define LIB3DS_DEG_TO_RAD(x) ((LIB3DS_PI/180.0)*(x)) - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum Lib3dsChunks { - CHK_NULL_CHUNK =0x0000, - CHK_M3DMAGIC =0x4D4D, /*3DS file*/ - CHK_SMAGIC =0x2D2D, - CHK_LMAGIC =0x2D3D, - CHK_MLIBMAGIC =0x3DAA, /*MLI file*/ - CHK_MATMAGIC =0x3DFF, - CHK_CMAGIC =0xC23D, /*PRJ file*/ - CHK_M3D_VERSION =0x0002, - CHK_M3D_KFVERSION =0x0005, - - CHK_COLOR_F =0x0010, - CHK_COLOR_24 =0x0011, - CHK_LIN_COLOR_24 =0x0012, - CHK_LIN_COLOR_F =0x0013, - CHK_INT_PERCENTAGE =0x0030, - CHK_FLOAT_PERCENTAGE =0x0031, - - CHK_MDATA =0x3D3D, - CHK_MESH_VERSION =0x3D3E, - CHK_MASTER_SCALE =0x0100, - CHK_LO_SHADOW_BIAS =0x1400, - CHK_HI_SHADOW_BIAS =0x1410, - CHK_SHADOW_MAP_SIZE =0x1420, - CHK_SHADOW_SAMPLES =0x1430, - CHK_SHADOW_RANGE =0x1440, - CHK_SHADOW_FILTER =0x1450, - CHK_RAY_BIAS =0x1460, - CHK_O_CONSTS =0x1500, - CHK_AMBIENT_LIGHT =0x2100, - CHK_BIT_MAP =0x1100, - CHK_SOLID_BGND =0x1200, - CHK_V_GRADIENT =0x1300, - CHK_USE_BIT_MAP =0x1101, - CHK_USE_SOLID_BGND =0x1201, - CHK_USE_V_GRADIENT =0x1301, - CHK_FOG =0x2200, - CHK_FOG_BGND =0x2210, - CHK_LAYER_FOG =0x2302, - CHK_DISTANCE_CUE =0x2300, - CHK_DCUE_BGND =0x2310, - CHK_USE_FOG =0x2201, - CHK_USE_LAYER_FOG =0x2303, - CHK_USE_DISTANCE_CUE =0x2301, - - CHK_MAT_ENTRY =0xAFFF, - CHK_MAT_NAME =0xA000, - CHK_MAT_AMBIENT =0xA010, - CHK_MAT_DIFFUSE =0xA020, - CHK_MAT_SPECULAR =0xA030, - CHK_MAT_SHININESS =0xA040, - CHK_MAT_SHIN2PCT =0xA041, - CHK_MAT_TRANSPARENCY =0xA050, - CHK_MAT_XPFALL =0xA052, - CHK_MAT_USE_XPFALL =0xA240, - CHK_MAT_REFBLUR =0xA053, - CHK_MAT_SHADING =0xA100, - CHK_MAT_USE_REFBLUR =0xA250, - CHK_MAT_SELF_ILLUM =0xA080, - CHK_MAT_TWO_SIDE =0xA081, - CHK_MAT_DECAL =0xA082, - CHK_MAT_ADDITIVE =0xA083, - CHK_MAT_SELF_ILPCT =0xA084, - CHK_MAT_WIRE =0xA085, - CHK_MAT_FACEMAP =0xA088, - CHK_MAT_PHONGSOFT =0xA08C, - CHK_MAT_WIREABS =0xA08E, - CHK_MAT_WIRE_SIZE =0xA087, - CHK_MAT_TEXMAP =0xA200, - CHK_MAT_SXP_TEXT_DATA =0xA320, - CHK_MAT_TEXMASK =0xA33E, - CHK_MAT_SXP_TEXTMASK_DATA =0xA32A, - CHK_MAT_TEX2MAP =0xA33A, - CHK_MAT_SXP_TEXT2_DATA =0xA321, - CHK_MAT_TEX2MASK =0xA340, - CHK_MAT_SXP_TEXT2MASK_DATA =0xA32C, - CHK_MAT_OPACMAP =0xA210, - CHK_MAT_SXP_OPAC_DATA =0xA322, - CHK_MAT_OPACMASK =0xA342, - CHK_MAT_SXP_OPACMASK_DATA =0xA32E, - CHK_MAT_BUMPMAP =0xA230, - CHK_MAT_SXP_BUMP_DATA =0xA324, - CHK_MAT_BUMPMASK =0xA344, - CHK_MAT_SXP_BUMPMASK_DATA =0xA330, - CHK_MAT_SPECMAP =0xA204, - CHK_MAT_SXP_SPEC_DATA =0xA325, - CHK_MAT_SPECMASK =0xA348, - CHK_MAT_SXP_SPECMASK_DATA =0xA332, - CHK_MAT_SHINMAP =0xA33C, - CHK_MAT_SXP_SHIN_DATA =0xA326, - CHK_MAT_SHINMASK =0xA346, - CHK_MAT_SXP_SHINMASK_DATA =0xA334, - CHK_MAT_SELFIMAP =0xA33D, - CHK_MAT_SXP_SELFI_DATA =0xA328, - CHK_MAT_SELFIMASK =0xA34A, - CHK_MAT_SXP_SELFIMASK_DATA =0xA336, - CHK_MAT_REFLMAP =0xA220, - CHK_MAT_REFLMASK =0xA34C, - CHK_MAT_SXP_REFLMASK_DATA =0xA338, - CHK_MAT_ACUBIC =0xA310, - CHK_MAT_MAPNAME =0xA300, - CHK_MAT_MAP_TILING =0xA351, - CHK_MAT_MAP_TEXBLUR =0xA353, - CHK_MAT_MAP_USCALE =0xA354, - CHK_MAT_MAP_VSCALE =0xA356, - CHK_MAT_MAP_UOFFSET =0xA358, - CHK_MAT_MAP_VOFFSET =0xA35A, - CHK_MAT_MAP_ANG =0xA35C, - CHK_MAT_MAP_COL1 =0xA360, - CHK_MAT_MAP_COL2 =0xA362, - CHK_MAT_MAP_RCOL =0xA364, - CHK_MAT_MAP_GCOL =0xA366, - CHK_MAT_MAP_BCOL =0xA368, - - CHK_NAMED_OBJECT =0x4000, - CHK_N_DIRECT_LIGHT =0x4600, - CHK_DL_OFF =0x4620, - CHK_DL_OUTER_RANGE =0x465A, - CHK_DL_INNER_RANGE =0x4659, - CHK_DL_MULTIPLIER =0x465B, - CHK_DL_EXCLUDE =0x4654, - CHK_DL_ATTENUATE =0x4625, - CHK_DL_SPOTLIGHT =0x4610, - CHK_DL_SPOT_ROLL =0x4656, - CHK_DL_SHADOWED =0x4630, - CHK_DL_LOCAL_SHADOW2 =0x4641, - CHK_DL_SEE_CONE =0x4650, - CHK_DL_SPOT_RECTANGULAR =0x4651, - CHK_DL_SPOT_ASPECT =0x4657, - CHK_DL_SPOT_PROJECTOR =0x4653, - CHK_DL_SPOT_OVERSHOOT =0x4652, - CHK_DL_RAY_BIAS =0x4658, - CHK_DL_RAYSHAD =0x4627, - CHK_N_CAMERA =0x4700, - CHK_CAM_SEE_CONE =0x4710, - CHK_CAM_RANGES =0x4720, - CHK_OBJ_HIDDEN =0x4010, - CHK_OBJ_VIS_LOFTER =0x4011, - CHK_OBJ_DOESNT_CAST =0x4012, - CHK_OBJ_DONT_RCVSHADOW =0x4017, - CHK_OBJ_MATTE =0x4013, - CHK_OBJ_FAST =0x4014, - CHK_OBJ_PROCEDURAL =0x4015, - CHK_OBJ_FROZEN =0x4016, - CHK_N_TRI_OBJECT =0x4100, - CHK_POINT_ARRAY =0x4110, - CHK_POINT_FLAG_ARRAY =0x4111, - CHK_FACE_ARRAY =0x4120, - CHK_MSH_MAT_GROUP =0x4130, - CHK_SMOOTH_GROUP =0x4150, - CHK_MSH_BOXMAP =0x4190, - CHK_TEX_VERTS =0x4140, - CHK_MESH_MATRIX =0x4160, - CHK_MESH_COLOR =0x4165, - CHK_MESH_TEXTURE_INFO =0x4170, - - CHK_KFDATA =0xB000, - CHK_KFHDR =0xB00A, - CHK_KFSEG =0xB008, - CHK_KFCURTIME =0xB009, - CHK_AMBIENT_NODE_TAG =0xB001, - CHK_OBJECT_NODE_TAG =0xB002, - CHK_CAMERA_NODE_TAG =0xB003, - CHK_TARGET_NODE_TAG =0xB004, - CHK_LIGHT_NODE_TAG =0xB005, - CHK_L_TARGET_NODE_TAG =0xB006, - CHK_SPOTLIGHT_NODE_TAG =0xB007, - CHK_NODE_ID =0xB030, - CHK_NODE_HDR =0xB010, - CHK_PIVOT =0xB013, - CHK_INSTANCE_NAME =0xB011, - CHK_MORPH_SMOOTH =0xB015, - CHK_BOUNDBOX =0xB014, - CHK_POS_TRACK_TAG =0xB020, - CHK_COL_TRACK_TAG =0xB025, - CHK_ROT_TRACK_TAG =0xB021, - CHK_SCL_TRACK_TAG =0xB022, - CHK_MORPH_TRACK_TAG =0xB026, - CHK_FOV_TRACK_TAG =0xB023, - CHK_ROLL_TRACK_TAG =0xB024, - CHK_HOT_TRACK_TAG =0xB027, - CHK_FALL_TRACK_TAG =0xB028, - CHK_HIDE_TRACK_TAG =0xB029, - - CHK_POLY_2D = 0x5000, - CHK_SHAPE_OK = 0x5010, - CHK_SHAPE_NOT_OK = 0x5011, - CHK_SHAPE_HOOK = 0x5020, - CHK_PATH_3D = 0x6000, - CHK_PATH_MATRIX = 0x6005, - CHK_SHAPE_2D = 0x6010, - CHK_M_SCALE = 0x6020, - CHK_M_TWIST = 0x6030, - CHK_M_TEETER = 0x6040, - CHK_M_FIT = 0x6050, - CHK_M_BEVEL = 0x6060, - CHK_XZ_CURVE = 0x6070, - CHK_YZ_CURVE = 0x6080, - CHK_INTERPCT = 0x6090, - CHK_DEFORM_LIMIT = 0x60A0, - - CHK_USE_CONTOUR = 0x6100, - CHK_USE_TWEEN = 0x6110, - CHK_USE_SCALE = 0x6120, - CHK_USE_TWIST = 0x6130, - CHK_USE_TEETER = 0x6140, - CHK_USE_FIT = 0x6150, - CHK_USE_BEVEL = 0x6160, - - CHK_DEFAULT_VIEW = 0x3000, - CHK_VIEW_TOP = 0x3010, - CHK_VIEW_BOTTOM = 0x3020, - CHK_VIEW_LEFT = 0x3030, - CHK_VIEW_RIGHT = 0x3040, - CHK_VIEW_FRONT = 0x3050, - CHK_VIEW_BACK = 0x3060, - CHK_VIEW_USER = 0x3070, - CHK_VIEW_CAMERA = 0x3080, - CHK_VIEW_WINDOW = 0x3090, - - CHK_VIEWPORT_LAYOUT_OLD = 0x7000, - CHK_VIEWPORT_DATA_OLD = 0x7010, - CHK_VIEWPORT_LAYOUT = 0x7001, - CHK_VIEWPORT_DATA = 0x7011, - CHK_VIEWPORT_DATA_3 = 0x7012, - CHK_VIEWPORT_SIZE = 0x7020, - CHK_NETWORK_VIEW = 0x7030 -} Lib3dsChunks; - -typedef struct Lib3dsChunk { - uint16_t chunk; - uint32_t size; - uint32_t end; - uint32_t cur; -} Lib3dsChunk; - -extern void lib3ds_chunk_read(Lib3dsChunk *c, Lib3dsIo *io); -extern void lib3ds_chunk_read_start(Lib3dsChunk *c, uint16_t chunk, Lib3dsIo *io); -extern void lib3ds_chunk_read_tell(Lib3dsChunk *c, Lib3dsIo *io); -extern uint16_t lib3ds_chunk_read_next(Lib3dsChunk *c, Lib3dsIo *io); -extern void lib3ds_chunk_read_reset(Lib3dsChunk *c, Lib3dsIo *io); -extern void lib3ds_chunk_read_end(Lib3dsChunk *c, Lib3dsIo *io); -extern void lib3ds_chunk_write(Lib3dsChunk *c, Lib3dsIo *io); -extern void lib3ds_chunk_write_start(Lib3dsChunk *c, Lib3dsIo *io); -extern void lib3ds_chunk_write_end(Lib3dsChunk *c, Lib3dsIo *io); -extern const char* lib3ds_chunk_name(uint16_t chunk); -extern void lib3ds_chunk_unknown(uint16_t chunk, Lib3dsIo *io); - -typedef struct Lib3dsIoImpl { - jmp_buf jmpbuf; - int log_indent; - void *tmp_mem; - Lib3dsNode *tmp_node; -} Lib3dsIoImpl; - -extern void lib3ds_io_setup(Lib3dsIo *io); -extern void lib3ds_io_cleanup(Lib3dsIo *io); - -extern long lib3ds_io_seek(Lib3dsIo *io, long offset, Lib3dsIoSeek origin); -extern long lib3ds_io_tell(Lib3dsIo *io); -extern size_t lib3ds_io_read(Lib3dsIo *io, void *buffer, size_t size); -extern size_t lib3ds_io_write(Lib3dsIo *io, const void *buffer, size_t size); -extern void lib3ds_io_log(Lib3dsIo *io, Lib3dsLogLevel level, const char *format, ...); -extern void lib3ds_io_log_indent(Lib3dsIo *io, int indent); -extern void lib3ds_io_read_error(Lib3dsIo *io); -extern void lib3ds_io_write_error(Lib3dsIo *io); - -extern uint8_t lib3ds_io_read_byte(Lib3dsIo *io); -extern uint16_t lib3ds_io_read_word(Lib3dsIo *io); -extern uint32_t lib3ds_io_read_dword(Lib3dsIo *io); -extern int8_t lib3ds_io_read_intb(Lib3dsIo *io); -extern int16_t lib3ds_io_read_intw(Lib3dsIo *io); -extern int32_t lib3ds_io_read_intd(Lib3dsIo *io); -extern float lib3ds_io_read_float(Lib3dsIo *io); -extern void lib3ds_io_read_vector(Lib3dsIo *io, float v[3]); -extern void lib3ds_io_read_rgb(Lib3dsIo *io, float rgb[3]); -extern void lib3ds_io_read_string(Lib3dsIo *io, char *s, int buflen); - -extern void lib3ds_io_write_byte(Lib3dsIo *io, uint8_t b); -extern void lib3ds_io_write_word(Lib3dsIo *io, uint16_t w); -extern void lib3ds_io_write_dword(Lib3dsIo *io, uint32_t d); -extern void lib3ds_io_write_intb(Lib3dsIo *io, int8_t b); -extern void lib3ds_io_write_intw(Lib3dsIo *io, int16_t w); -extern void lib3ds_io_write_intd(Lib3dsIo *io, int32_t d); -extern void lib3ds_io_write_float(Lib3dsIo *io, float l); -extern void lib3ds_io_write_vector(Lib3dsIo *io, float v[3]); -extern void lib3ds_io_write_rgb(Lib3dsIo *io, float rgb[3]); -extern void lib3ds_io_write_string(Lib3dsIo *io, const char *s); - -extern void lib3ds_atmosphere_read(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io); -extern void lib3ds_atmosphere_write(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io); -extern void lib3ds_background_read(Lib3dsBackground *background, Lib3dsIo *io); -extern void lib3ds_background_write(Lib3dsBackground *background, Lib3dsIo *io); -extern void lib3ds_shadow_read(Lib3dsShadow *shadow, Lib3dsIo *io); -extern void lib3ds_shadow_write(Lib3dsShadow *shadow, Lib3dsIo *io); -extern void lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io); -extern void lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io); -extern void lib3ds_material_read(Lib3dsMaterial *material, Lib3dsIo *io); -extern void lib3ds_material_write(Lib3dsMaterial *material, Lib3dsIo *io); -extern void lib3ds_camera_read(Lib3dsCamera *camera, Lib3dsIo *io); -extern void lib3ds_camera_write(Lib3dsCamera *camera, Lib3dsIo *io); -extern void lib3ds_light_read(Lib3dsLight *light, Lib3dsIo *io); -extern void lib3ds_light_write(Lib3dsLight *light, Lib3dsIo *io); -extern void lib3ds_mesh_read(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io); -extern void lib3ds_mesh_write(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io); -extern void lib3ds_track_read(Lib3dsTrack *track, Lib3dsIo *io); -extern void lib3ds_track_write(Lib3dsTrack *track, Lib3dsIo *io); -extern void lib3ds_node_read(Lib3dsNode *node, Lib3dsIo *io); -extern void lib3ds_node_write(Lib3dsNode *node, uint16_t node_id, uint16_t parent_id, Lib3dsIo *io); - -typedef void (*Lib3dsFreeFunc)(void *ptr); - -extern void* lib3ds_util_realloc_array(void *ptr, int old_size, int new_size, int element_size); -extern void lib3ds_util_reserve_array(void ***ptr, int *n, int *size, int new_size, int force, Lib3dsFreeFunc free_func); -extern void lib3ds_util_insert_array(void ***ptr, int *n, int *size, void *element, int index); -extern void lib3ds_util_remove_array(void ***ptr, int *n, int index, Lib3dsFreeFunc free_func); - -#ifdef __cplusplus -} -#endif -#endif - - +/* -*- c -*- */ +#ifndef INCLUDED_LIB3DS_IMPL_H +#define INCLUDED_LIB3DS_IMPL_H +/* + Copyright (C) 1996-2008 by Jan Eric Kyprianidis + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation, either version 2.1 of the License, or + (at your option) any later version. + + Thisprogram is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; If not, see . +*/ + +#include "lib3ds.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning ( disable : 4996 ) +#endif + +#ifndef _MSC_VER +#include +#else +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef signed __int8 int8_t; +typedef signed __int16 int16_t; +typedef signed __int32 int32_t; +#endif + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define LIB3DS_EPSILON (1e-5) +#define LIB3DS_PI 3.14159265358979323846 +#define LIB3DS_TWOPI (2.0*LIB3DS_PI) +#define LIB3DS_HALFPI (LIB3DS_PI/2.0) +#define LIB3DS_RAD_TO_DEG(x) ((180.0/LIB3DS_PI)*(x)) +#define LIB3DS_DEG_TO_RAD(x) ((LIB3DS_PI/180.0)*(x)) + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum Lib3dsChunks { + CHK_NULL_CHUNK =0x0000, + CHK_M3DMAGIC =0x4D4D, /*3DS file*/ + CHK_SMAGIC =0x2D2D, + CHK_LMAGIC =0x2D3D, + CHK_MLIBMAGIC =0x3DAA, /*MLI file*/ + CHK_MATMAGIC =0x3DFF, + CHK_CMAGIC =0xC23D, /*PRJ file*/ + CHK_M3D_VERSION =0x0002, + CHK_M3D_KFVERSION =0x0005, + + CHK_COLOR_F =0x0010, + CHK_COLOR_24 =0x0011, + CHK_LIN_COLOR_24 =0x0012, + CHK_LIN_COLOR_F =0x0013, + CHK_INT_PERCENTAGE =0x0030, + CHK_FLOAT_PERCENTAGE =0x0031, + + CHK_MDATA =0x3D3D, + CHK_MESH_VERSION =0x3D3E, + CHK_MASTER_SCALE =0x0100, + CHK_LO_SHADOW_BIAS =0x1400, + CHK_HI_SHADOW_BIAS =0x1410, + CHK_SHADOW_MAP_SIZE =0x1420, + CHK_SHADOW_SAMPLES =0x1430, + CHK_SHADOW_RANGE =0x1440, + CHK_SHADOW_FILTER =0x1450, + CHK_RAY_BIAS =0x1460, + CHK_O_CONSTS =0x1500, + CHK_AMBIENT_LIGHT =0x2100, + CHK_BIT_MAP =0x1100, + CHK_SOLID_BGND =0x1200, + CHK_V_GRADIENT =0x1300, + CHK_USE_BIT_MAP =0x1101, + CHK_USE_SOLID_BGND =0x1201, + CHK_USE_V_GRADIENT =0x1301, + CHK_FOG =0x2200, + CHK_FOG_BGND =0x2210, + CHK_LAYER_FOG =0x2302, + CHK_DISTANCE_CUE =0x2300, + CHK_DCUE_BGND =0x2310, + CHK_USE_FOG =0x2201, + CHK_USE_LAYER_FOG =0x2303, + CHK_USE_DISTANCE_CUE =0x2301, + + CHK_MAT_ENTRY =0xAFFF, + CHK_MAT_NAME =0xA000, + CHK_MAT_AMBIENT =0xA010, + CHK_MAT_DIFFUSE =0xA020, + CHK_MAT_SPECULAR =0xA030, + CHK_MAT_SHININESS =0xA040, + CHK_MAT_SHIN2PCT =0xA041, + CHK_MAT_TRANSPARENCY =0xA050, + CHK_MAT_XPFALL =0xA052, + CHK_MAT_USE_XPFALL =0xA240, + CHK_MAT_REFBLUR =0xA053, + CHK_MAT_SHADING =0xA100, + CHK_MAT_USE_REFBLUR =0xA250, + CHK_MAT_SELF_ILLUM =0xA080, + CHK_MAT_TWO_SIDE =0xA081, + CHK_MAT_DECAL =0xA082, + CHK_MAT_ADDITIVE =0xA083, + CHK_MAT_SELF_ILPCT =0xA084, + CHK_MAT_WIRE =0xA085, + CHK_MAT_FACEMAP =0xA088, + CHK_MAT_PHONGSOFT =0xA08C, + CHK_MAT_WIREABS =0xA08E, + CHK_MAT_WIRE_SIZE =0xA087, + CHK_MAT_TEXMAP =0xA200, + CHK_MAT_SXP_TEXT_DATA =0xA320, + CHK_MAT_TEXMASK =0xA33E, + CHK_MAT_SXP_TEXTMASK_DATA =0xA32A, + CHK_MAT_TEX2MAP =0xA33A, + CHK_MAT_SXP_TEXT2_DATA =0xA321, + CHK_MAT_TEX2MASK =0xA340, + CHK_MAT_SXP_TEXT2MASK_DATA =0xA32C, + CHK_MAT_OPACMAP =0xA210, + CHK_MAT_SXP_OPAC_DATA =0xA322, + CHK_MAT_OPACMASK =0xA342, + CHK_MAT_SXP_OPACMASK_DATA =0xA32E, + CHK_MAT_BUMPMAP =0xA230, + CHK_MAT_SXP_BUMP_DATA =0xA324, + CHK_MAT_BUMPMASK =0xA344, + CHK_MAT_SXP_BUMPMASK_DATA =0xA330, + CHK_MAT_SPECMAP =0xA204, + CHK_MAT_SXP_SPEC_DATA =0xA325, + CHK_MAT_SPECMASK =0xA348, + CHK_MAT_SXP_SPECMASK_DATA =0xA332, + CHK_MAT_SHINMAP =0xA33C, + CHK_MAT_SXP_SHIN_DATA =0xA326, + CHK_MAT_SHINMASK =0xA346, + CHK_MAT_SXP_SHINMASK_DATA =0xA334, + CHK_MAT_SELFIMAP =0xA33D, + CHK_MAT_SXP_SELFI_DATA =0xA328, + CHK_MAT_SELFIMASK =0xA34A, + CHK_MAT_SXP_SELFIMASK_DATA =0xA336, + CHK_MAT_REFLMAP =0xA220, + CHK_MAT_REFLMASK =0xA34C, + CHK_MAT_SXP_REFLMASK_DATA =0xA338, + CHK_MAT_ACUBIC =0xA310, + CHK_MAT_MAPNAME =0xA300, + CHK_MAT_MAP_TILING =0xA351, + CHK_MAT_MAP_TEXBLUR =0xA353, + CHK_MAT_MAP_USCALE =0xA354, + CHK_MAT_MAP_VSCALE =0xA356, + CHK_MAT_MAP_UOFFSET =0xA358, + CHK_MAT_MAP_VOFFSET =0xA35A, + CHK_MAT_MAP_ANG =0xA35C, + CHK_MAT_MAP_COL1 =0xA360, + CHK_MAT_MAP_COL2 =0xA362, + CHK_MAT_MAP_RCOL =0xA364, + CHK_MAT_MAP_GCOL =0xA366, + CHK_MAT_MAP_BCOL =0xA368, + + CHK_NAMED_OBJECT =0x4000, + CHK_N_DIRECT_LIGHT =0x4600, + CHK_DL_OFF =0x4620, + CHK_DL_OUTER_RANGE =0x465A, + CHK_DL_INNER_RANGE =0x4659, + CHK_DL_MULTIPLIER =0x465B, + CHK_DL_EXCLUDE =0x4654, + CHK_DL_ATTENUATE =0x4625, + CHK_DL_SPOTLIGHT =0x4610, + CHK_DL_SPOT_ROLL =0x4656, + CHK_DL_SHADOWED =0x4630, + CHK_DL_LOCAL_SHADOW2 =0x4641, + CHK_DL_SEE_CONE =0x4650, + CHK_DL_SPOT_RECTANGULAR =0x4651, + CHK_DL_SPOT_ASPECT =0x4657, + CHK_DL_SPOT_PROJECTOR =0x4653, + CHK_DL_SPOT_OVERSHOOT =0x4652, + CHK_DL_RAY_BIAS =0x4658, + CHK_DL_RAYSHAD =0x4627, + CHK_N_CAMERA =0x4700, + CHK_CAM_SEE_CONE =0x4710, + CHK_CAM_RANGES =0x4720, + CHK_OBJ_HIDDEN =0x4010, + CHK_OBJ_VIS_LOFTER =0x4011, + CHK_OBJ_DOESNT_CAST =0x4012, + CHK_OBJ_DONT_RCVSHADOW =0x4017, + CHK_OBJ_MATTE =0x4013, + CHK_OBJ_FAST =0x4014, + CHK_OBJ_PROCEDURAL =0x4015, + CHK_OBJ_FROZEN =0x4016, + CHK_N_TRI_OBJECT =0x4100, + CHK_POINT_ARRAY =0x4110, + CHK_POINT_FLAG_ARRAY =0x4111, + CHK_FACE_ARRAY =0x4120, + CHK_MSH_MAT_GROUP =0x4130, + CHK_SMOOTH_GROUP =0x4150, + CHK_MSH_BOXMAP =0x4190, + CHK_TEX_VERTS =0x4140, + CHK_MESH_MATRIX =0x4160, + CHK_MESH_COLOR =0x4165, + CHK_MESH_TEXTURE_INFO =0x4170, + + CHK_KFDATA =0xB000, + CHK_KFHDR =0xB00A, + CHK_KFSEG =0xB008, + CHK_KFCURTIME =0xB009, + CHK_AMBIENT_NODE_TAG =0xB001, + CHK_OBJECT_NODE_TAG =0xB002, + CHK_CAMERA_NODE_TAG =0xB003, + CHK_TARGET_NODE_TAG =0xB004, + CHK_LIGHT_NODE_TAG =0xB005, + CHK_L_TARGET_NODE_TAG =0xB006, + CHK_SPOTLIGHT_NODE_TAG =0xB007, + CHK_NODE_ID =0xB030, + CHK_NODE_HDR =0xB010, + CHK_PIVOT =0xB013, + CHK_INSTANCE_NAME =0xB011, + CHK_MORPH_SMOOTH =0xB015, + CHK_BOUNDBOX =0xB014, + CHK_POS_TRACK_TAG =0xB020, + CHK_COL_TRACK_TAG =0xB025, + CHK_ROT_TRACK_TAG =0xB021, + CHK_SCL_TRACK_TAG =0xB022, + CHK_MORPH_TRACK_TAG =0xB026, + CHK_FOV_TRACK_TAG =0xB023, + CHK_ROLL_TRACK_TAG =0xB024, + CHK_HOT_TRACK_TAG =0xB027, + CHK_FALL_TRACK_TAG =0xB028, + CHK_HIDE_TRACK_TAG =0xB029, + + CHK_POLY_2D = 0x5000, + CHK_SHAPE_OK = 0x5010, + CHK_SHAPE_NOT_OK = 0x5011, + CHK_SHAPE_HOOK = 0x5020, + CHK_PATH_3D = 0x6000, + CHK_PATH_MATRIX = 0x6005, + CHK_SHAPE_2D = 0x6010, + CHK_M_SCALE = 0x6020, + CHK_M_TWIST = 0x6030, + CHK_M_TEETER = 0x6040, + CHK_M_FIT = 0x6050, + CHK_M_BEVEL = 0x6060, + CHK_XZ_CURVE = 0x6070, + CHK_YZ_CURVE = 0x6080, + CHK_INTERPCT = 0x6090, + CHK_DEFORM_LIMIT = 0x60A0, + + CHK_USE_CONTOUR = 0x6100, + CHK_USE_TWEEN = 0x6110, + CHK_USE_SCALE = 0x6120, + CHK_USE_TWIST = 0x6130, + CHK_USE_TEETER = 0x6140, + CHK_USE_FIT = 0x6150, + CHK_USE_BEVEL = 0x6160, + + CHK_DEFAULT_VIEW = 0x3000, + CHK_VIEW_TOP = 0x3010, + CHK_VIEW_BOTTOM = 0x3020, + CHK_VIEW_LEFT = 0x3030, + CHK_VIEW_RIGHT = 0x3040, + CHK_VIEW_FRONT = 0x3050, + CHK_VIEW_BACK = 0x3060, + CHK_VIEW_USER = 0x3070, + CHK_VIEW_CAMERA = 0x3080, + CHK_VIEW_WINDOW = 0x3090, + + CHK_VIEWPORT_LAYOUT_OLD = 0x7000, + CHK_VIEWPORT_DATA_OLD = 0x7010, + CHK_VIEWPORT_LAYOUT = 0x7001, + CHK_VIEWPORT_DATA = 0x7011, + CHK_VIEWPORT_DATA_3 = 0x7012, + CHK_VIEWPORT_SIZE = 0x7020, + CHK_NETWORK_VIEW = 0x7030 +} Lib3dsChunks; + +typedef struct Lib3dsChunk { + uint16_t chunk; + uint32_t size; + uint32_t end; + uint32_t cur; +} Lib3dsChunk; + +extern void lib3ds_chunk_read(Lib3dsChunk *c, Lib3dsIo *io); +extern void lib3ds_chunk_read_start(Lib3dsChunk *c, uint16_t chunk, Lib3dsIo *io); +extern void lib3ds_chunk_read_tell(Lib3dsChunk *c, Lib3dsIo *io); +extern uint16_t lib3ds_chunk_read_next(Lib3dsChunk *c, Lib3dsIo *io); +extern void lib3ds_chunk_read_reset(Lib3dsChunk *c, Lib3dsIo *io); +extern void lib3ds_chunk_read_end(Lib3dsChunk *c, Lib3dsIo *io); +extern void lib3ds_chunk_write(Lib3dsChunk *c, Lib3dsIo *io); +extern void lib3ds_chunk_write_start(Lib3dsChunk *c, Lib3dsIo *io); +extern void lib3ds_chunk_write_end(Lib3dsChunk *c, Lib3dsIo *io); +extern const char* lib3ds_chunk_name(uint16_t chunk); +extern void lib3ds_chunk_unknown(uint16_t chunk, Lib3dsIo *io); + +typedef struct Lib3dsIoImpl { + jmp_buf jmpbuf; + int log_indent; + void *tmp_mem; + Lib3dsNode *tmp_node; +} Lib3dsIoImpl; + +extern void lib3ds_io_setup(Lib3dsIo *io); +extern void lib3ds_io_cleanup(Lib3dsIo *io); + +extern long lib3ds_io_seek(Lib3dsIo *io, long offset, Lib3dsIoSeek origin); +extern long lib3ds_io_tell(Lib3dsIo *io); +extern size_t lib3ds_io_read(Lib3dsIo *io, void *buffer, size_t size); +extern size_t lib3ds_io_write(Lib3dsIo *io, const void *buffer, size_t size); +extern void lib3ds_io_log(Lib3dsIo *io, Lib3dsLogLevel level, const char *format, ...); +extern void lib3ds_io_log_indent(Lib3dsIo *io, int indent); +extern void lib3ds_io_read_error(Lib3dsIo *io); +extern void lib3ds_io_write_error(Lib3dsIo *io); + +extern uint8_t lib3ds_io_read_byte(Lib3dsIo *io); +extern uint16_t lib3ds_io_read_word(Lib3dsIo *io); +extern uint32_t lib3ds_io_read_dword(Lib3dsIo *io); +extern int8_t lib3ds_io_read_intb(Lib3dsIo *io); +extern int16_t lib3ds_io_read_intw(Lib3dsIo *io); +extern int32_t lib3ds_io_read_intd(Lib3dsIo *io); +extern float lib3ds_io_read_float(Lib3dsIo *io); +extern void lib3ds_io_read_vector(Lib3dsIo *io, float v[3]); +extern void lib3ds_io_read_rgb(Lib3dsIo *io, float rgb[3]); +extern void lib3ds_io_read_string(Lib3dsIo *io, char *s, int buflen); + +extern void lib3ds_io_write_byte(Lib3dsIo *io, uint8_t b); +extern void lib3ds_io_write_word(Lib3dsIo *io, uint16_t w); +extern void lib3ds_io_write_dword(Lib3dsIo *io, uint32_t d); +extern void lib3ds_io_write_intb(Lib3dsIo *io, int8_t b); +extern void lib3ds_io_write_intw(Lib3dsIo *io, int16_t w); +extern void lib3ds_io_write_intd(Lib3dsIo *io, int32_t d); +extern void lib3ds_io_write_float(Lib3dsIo *io, float l); +extern void lib3ds_io_write_vector(Lib3dsIo *io, float v[3]); +extern void lib3ds_io_write_rgb(Lib3dsIo *io, float rgb[3]); +extern void lib3ds_io_write_string(Lib3dsIo *io, const char *s); + +extern void lib3ds_atmosphere_read(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io); +extern void lib3ds_atmosphere_write(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io); +extern void lib3ds_background_read(Lib3dsBackground *background, Lib3dsIo *io); +extern void lib3ds_background_write(Lib3dsBackground *background, Lib3dsIo *io); +extern void lib3ds_shadow_read(Lib3dsShadow *shadow, Lib3dsIo *io); +extern void lib3ds_shadow_write(Lib3dsShadow *shadow, Lib3dsIo *io); +extern void lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io); +extern void lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io); +extern void lib3ds_material_read(Lib3dsMaterial *material, Lib3dsIo *io); +extern void lib3ds_material_write(Lib3dsMaterial *material, Lib3dsIo *io); +extern void lib3ds_camera_read(Lib3dsCamera *camera, Lib3dsIo *io); +extern void lib3ds_camera_write(Lib3dsCamera *camera, Lib3dsIo *io); +extern void lib3ds_light_read(Lib3dsLight *light, Lib3dsIo *io); +extern void lib3ds_light_write(Lib3dsLight *light, Lib3dsIo *io); +extern void lib3ds_mesh_read(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io); +extern void lib3ds_mesh_write(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io); +extern void lib3ds_track_read(Lib3dsTrack *track, Lib3dsIo *io); +extern void lib3ds_track_write(Lib3dsTrack *track, Lib3dsIo *io); +extern void lib3ds_node_read(Lib3dsNode *node, Lib3dsIo *io); +extern void lib3ds_node_write(Lib3dsNode *node, uint16_t node_id, uint16_t parent_id, Lib3dsIo *io); + +typedef void (*Lib3dsFreeFunc)(void *ptr); + +extern void* lib3ds_util_realloc_array(void *ptr, int old_size, int new_size, int element_size); +extern void lib3ds_util_reserve_array(void ***ptr, int *n, int *size, int new_size, int force, Lib3dsFreeFunc free_func); +extern void lib3ds_util_insert_array(void ***ptr, int *n, int *size, void *element, int index); +extern void lib3ds_util_remove_array(void ***ptr, int *n, int index, Lib3dsFreeFunc free_func); + +#ifdef __cplusplus +} +#endif +#endif + +