void lib3ds_track_read(Lib3dsTrack *track, Lib3dsIo *io) { unsigned nkeys; unsigned i; track->flags = lib3ds_io_read_word(io); lib3ds_io_read_dword(io); lib3ds_io_read_dword(io); nkeys = lib3ds_io_read_intd(io); lib3ds_track_resize(track, nkeys); switch (track->type) { case LIB3DS_TRACK_BOOL: for (i = 0; i < nkeys; ++i) { track->keys[i].frame = lib3ds_io_read_intd(io); tcb_read(&track->keys[i], io); } break; case LIB3DS_TRACK_FLOAT: for (i = 0; i < nkeys; ++i) { track->keys[i].frame = lib3ds_io_read_intd(io); tcb_read(&track->keys[i], io); track->keys[i].value[0] = lib3ds_io_read_float(io); } break; case LIB3DS_TRACK_VECTOR: for (i = 0; i < nkeys; ++i) { track->keys[i].frame = lib3ds_io_read_intd(io); tcb_read(&track->keys[i], io); lib3ds_io_read_vector(io, track->keys[i].value); } break; case LIB3DS_TRACK_QUAT: for (i = 0; i < nkeys; ++i) { track->keys[i].frame = lib3ds_io_read_intd(io); tcb_read(&track->keys[i], io); track->keys[i].value[3] = lib3ds_io_read_float(io); lib3ds_io_read_vector(io, track->keys[i].value); } break; /*case LIB3DS_TRACK_MORPH: for (i = 0; i < nkeys; ++i) { track->keys[i].frame = lib3ds_io_read_intd(io); tcb_read(&track->keys[i].tcb, io); lib3ds_io_read_string(io, track->keys[i].data.m.name, 64); } break;*/ default: break; } }
void lib3ds_mesh_read(Lib3dsFile *file, Lib3dsMesh *mesh, Lib3dsIo *io) { Lib3dsChunk c; uint16_t chunk; lib3ds_chunk_read_start(&c, CHK_N_TRI_OBJECT, io); while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) { switch (chunk) { case CHK_MESH_MATRIX: { int i, j; lib3ds_matrix_identity(mesh->matrix); for (i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { mesh->matrix[i][j] = lib3ds_io_read_float(io); } } break; } case CHK_MESH_COLOR: { mesh->color = lib3ds_io_read_byte(io); break; } case CHK_POINT_ARRAY: { int i; uint16_t nvertices = lib3ds_io_read_word(io); lib3ds_mesh_resize_vertices(mesh, nvertices, mesh->texcos != NULL, mesh->vflags != NULL); for (i = 0; i < mesh->nvertices; ++i) { lib3ds_io_read_vector(io, mesh->vertices[i]); } break; } case CHK_POINT_FLAG_ARRAY: { int i; uint16_t nflags = lib3ds_io_read_word(io); uint16_t nvertices = (mesh->nvertices >= nflags)? mesh->nvertices : nflags; lib3ds_mesh_resize_vertices(mesh, nvertices, mesh->texcos != NULL, 1); for (i = 0; i < nflags; ++i) { mesh->vflags[i] = lib3ds_io_read_word(io); } break; } case CHK_FACE_ARRAY: { lib3ds_chunk_read_reset(&c, io); face_array_read(file, mesh, io); break; } case CHK_MESH_TEXTURE_INFO: { int i, j; //FIXME: mesh->map_type = lib3ds_io_read_word(io); for (i = 0; i < 2; ++i) { mesh->map_tile[i] = lib3ds_io_read_float(io); } for (i = 0; i < 3; ++i) { mesh->map_pos[i] = lib3ds_io_read_float(io); } mesh->map_scale = lib3ds_io_read_float(io); lib3ds_matrix_identity(mesh->map_matrix); for (i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { mesh->map_matrix[i][j] = lib3ds_io_read_float(io); } } for (i = 0; i < 2; ++i) { mesh->map_planar_size[i] = lib3ds_io_read_float(io); } mesh->map_cylinder_height = lib3ds_io_read_float(io); break; } case CHK_TEX_VERTS: { int i; uint16_t ntexcos = lib3ds_io_read_word(io); uint16_t nvertices = (mesh->nvertices >= ntexcos)? mesh->nvertices : ntexcos;; if (!mesh->texcos) { lib3ds_mesh_resize_vertices(mesh, nvertices, 1, mesh->vflags != NULL); } for (i = 0; i < ntexcos; ++i) { mesh->texcos[i][0] = lib3ds_io_read_float(io); mesh->texcos[i][1] = lib3ds_io_read_float(io); } break; } default: lib3ds_chunk_unknown(chunk, io); } } if (lib3ds_matrix_det(mesh->matrix) < 0.0) { /* Flip X coordinate of vertices if mesh matrix has negative determinant */ float inv_matrix[4][4], M[4][4]; float tmp[3]; int i; lib3ds_matrix_copy(inv_matrix, mesh->matrix); lib3ds_matrix_inv(inv_matrix); lib3ds_matrix_copy(M, mesh->matrix); lib3ds_matrix_scale(M, -1.0f, 1.0f, 1.0f); lib3ds_matrix_mult(M, M, inv_matrix); for (i = 0; i < mesh->nvertices; ++i) { lib3ds_vector_transform(tmp, M, mesh->vertices[i]); lib3ds_vector_copy(mesh->vertices[i], tmp); } } lib3ds_chunk_read_end(&c, io); }
void lib3ds_node_read(Lib3dsNode *node, Lib3dsIo *io) { Lib3dsChunk c; uint16_t chunk; assert(node); lib3ds_chunk_read_start(&c, 0, io); switch (c.chunk) { case CHK_AMBIENT_NODE_TAG: case CHK_OBJECT_NODE_TAG: case CHK_CAMERA_NODE_TAG: case CHK_TARGET_NODE_TAG: case CHK_LIGHT_NODE_TAG: case CHK_SPOTLIGHT_NODE_TAG: case CHK_L_TARGET_NODE_TAG: break; default: return; } while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) { switch (chunk) { case CHK_NODE_ID: { node->node_id = lib3ds_io_read_word(io); lib3ds_io_log_indent(io, 1); lib3ds_io_log(io, LIB3DS_LOG_INFO, "ID=%d", (short)node->node_id); lib3ds_io_log_indent(io, -1); break; } case CHK_NODE_HDR: { lib3ds_io_read_string(io, node->name, 64); node->flags = lib3ds_io_read_word(io); node->flags |= ((uint32_t)lib3ds_io_read_word(io)) << 16; node->user_id = lib3ds_io_read_word(io); lib3ds_io_log_indent(io, 1); lib3ds_io_log(io, LIB3DS_LOG_INFO, "NAME=%s", node->name); lib3ds_io_log(io, LIB3DS_LOG_INFO, "PARENT=%d", (short)node->user_id); lib3ds_io_log_indent(io, -1); break; } case CHK_PIVOT: { if (node->type == LIB3DS_NODE_MESH_INSTANCE) { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; lib3ds_io_read_vector(io, n->pivot); } else { lib3ds_chunk_unknown(chunk, io); } break; } case CHK_INSTANCE_NAME: { if (node->type == LIB3DS_NODE_MESH_INSTANCE) { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; lib3ds_io_read_string(io, n->instance_name, 64); } else { lib3ds_chunk_unknown(chunk, io); } break; } case CHK_BOUNDBOX: { if (node->type == LIB3DS_NODE_MESH_INSTANCE) { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; lib3ds_io_read_vector(io, n->bbox_min); lib3ds_io_read_vector(io, n->bbox_max); } else { lib3ds_chunk_unknown(chunk, io); } break; } case CHK_COL_TRACK_TAG: { Lib3dsTrack *track = 0; switch (node->type) { case LIB3DS_NODE_AMBIENT_COLOR: { Lib3dsAmbientColorNode *n = (Lib3dsAmbientColorNode*)node; track = &n->color_track; break; } case LIB3DS_NODE_OMNILIGHT: { Lib3dsOmnilightNode *n = (Lib3dsOmnilightNode*)node; track = &n->color_track; break; } case LIB3DS_NODE_SPOTLIGHT: { Lib3dsSpotlightNode *n = (Lib3dsSpotlightNode*)node; track = &n->color_track; break; } default: lib3ds_chunk_unknown(chunk, io); } if (track) { lib3ds_track_read(track, io); } break; } case CHK_POS_TRACK_TAG: { Lib3dsTrack *track = 0; switch (node->type) { case LIB3DS_NODE_MESH_INSTANCE: { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; track = &n->pos_track; break; } case LIB3DS_NODE_CAMERA: { Lib3dsCameraNode *n = (Lib3dsCameraNode*)node; track = &n->pos_track; break; } case LIB3DS_NODE_CAMERA_TARGET: { Lib3dsTargetNode *n = (Lib3dsTargetNode*)node; track = &n->pos_track; break; } case LIB3DS_NODE_OMNILIGHT: { Lib3dsOmnilightNode *n = (Lib3dsOmnilightNode*)node; track = &n->pos_track; break; } case LIB3DS_NODE_SPOTLIGHT: { Lib3dsSpotlightNode *n = (Lib3dsSpotlightNode*)node; track = &n->pos_track; break; } case LIB3DS_NODE_SPOTLIGHT_TARGET: { Lib3dsTargetNode *n = (Lib3dsTargetNode*)node; track = &n->pos_track; break; } default: lib3ds_chunk_unknown(chunk, io); } if (track) { lib3ds_track_read(track, io); } break; } case CHK_ROT_TRACK_TAG: { if (node->type == LIB3DS_NODE_MESH_INSTANCE) { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; n->rot_track.type = LIB3DS_TRACK_QUAT; lib3ds_track_read(&n->rot_track, io); } else { lib3ds_chunk_unknown(chunk, io); } break; } case CHK_SCL_TRACK_TAG: { if (node->type == LIB3DS_NODE_MESH_INSTANCE) { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; n->scl_track.type = LIB3DS_TRACK_VECTOR; lib3ds_track_read(&n->scl_track, io); } else { lib3ds_chunk_unknown(chunk, io); } break; } case CHK_FOV_TRACK_TAG: { if (node->type == LIB3DS_NODE_CAMERA) { Lib3dsCameraNode *n = (Lib3dsCameraNode*)node; n->fov_track.type = LIB3DS_TRACK_FLOAT; lib3ds_track_read(&n->fov_track, io); } else { lib3ds_chunk_unknown(chunk, io); } break; } case CHK_HOT_TRACK_TAG: { if (node->type == LIB3DS_NODE_SPOTLIGHT) { Lib3dsSpotlightNode *n = (Lib3dsSpotlightNode*)node; n->hotspot_track.type = LIB3DS_TRACK_FLOAT; lib3ds_track_read(&n->hotspot_track, io); } else { lib3ds_chunk_unknown(chunk, io); } break; } case CHK_FALL_TRACK_TAG: { if (node->type == LIB3DS_NODE_SPOTLIGHT) { Lib3dsSpotlightNode *n = (Lib3dsSpotlightNode*)node; n->falloff_track.type= LIB3DS_TRACK_FLOAT; lib3ds_track_read(&n->falloff_track, io); } else { lib3ds_chunk_unknown(chunk, io); } break; } case CHK_ROLL_TRACK_TAG: { switch (node->type) { case LIB3DS_NODE_CAMERA: { Lib3dsCameraNode *n = (Lib3dsCameraNode*)node; n->roll_track.type = LIB3DS_TRACK_FLOAT; lib3ds_track_read(&n->roll_track, io); break; } case LIB3DS_NODE_SPOTLIGHT: { Lib3dsSpotlightNode *n = (Lib3dsSpotlightNode*)node; n->roll_track.type = LIB3DS_TRACK_FLOAT; lib3ds_track_read(&n->roll_track, io); break; } default: lib3ds_chunk_unknown(chunk, io); } break; } case CHK_HIDE_TRACK_TAG: { if (node->type == LIB3DS_NODE_MESH_INSTANCE) { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; n->hide_track.type = LIB3DS_TRACK_BOOL; lib3ds_track_read(&n->hide_track, io); } else { lib3ds_chunk_unknown(chunk, io); } break; } case CHK_MORPH_SMOOTH: { if (node->type == LIB3DS_NODE_MESH_INSTANCE) { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; n->morph_smooth = lib3ds_io_read_float(io); } else { lib3ds_chunk_unknown(chunk, io); } } break; /* case LIB3DS_MORPH_TRACK_TAG: { if (node->type == LIB3DS_NODE_MESH_INSTANCE) { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; n->morph_track = lib3ds_track_new(node, LIB3DS_TRACK_MORPH, 0); lib3ds_track_read(n->morph_track, io); } else { lib3ds_chunk_unknown(chunk, io); } } break; */ default: lib3ds_chunk_unknown(chunk, io); } } lib3ds_chunk_read_end(&c, io); }
/*! * \ingroup viewport */ Lib3dsBool lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io) { Lib3dsChunk c; Lib3dsWord chunk; if (!lib3ds_chunk_read_start(&c, 0, io)) { return(LIB3DS_FALSE); } switch (c.chunk) { case LIB3DS_VIEWPORT_LAYOUT: { int cur=0; viewport->layout.style=lib3ds_io_read_word(io); viewport->layout.active=lib3ds_io_read_intw(io); lib3ds_io_read_intw(io); viewport->layout.swap=lib3ds_io_read_intw(io); lib3ds_io_read_intw(io); viewport->layout.swap_prior=lib3ds_io_read_intw(io); viewport->layout.swap_view=lib3ds_io_read_intw(io); lib3ds_chunk_read_tell(&c, io); while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) { switch (chunk) { case LIB3DS_VIEWPORT_SIZE: { viewport->layout.position[0]=lib3ds_io_read_word(io); viewport->layout.position[1]=lib3ds_io_read_word(io); viewport->layout.size[0]=lib3ds_io_read_word(io); viewport->layout.size[1]=lib3ds_io_read_word(io); } break; case LIB3DS_VIEWPORT_DATA_3: { lib3ds_viewport_set_views(viewport,cur+1); lib3ds_io_read_intw(io); viewport->layout.viewL[cur].axis_lock=lib3ds_io_read_word(io); viewport->layout.viewL[cur].position[0]=lib3ds_io_read_intw(io); viewport->layout.viewL[cur].position[1]=lib3ds_io_read_intw(io); viewport->layout.viewL[cur].size[0]=lib3ds_io_read_intw(io); viewport->layout.viewL[cur].size[1]=lib3ds_io_read_intw(io); viewport->layout.viewL[cur].type=lib3ds_io_read_word(io); viewport->layout.viewL[cur].zoom=lib3ds_io_read_float(io); lib3ds_io_read_vector(io, viewport->layout.viewL[cur].center); viewport->layout.viewL[cur].horiz_angle=lib3ds_io_read_float(io); viewport->layout.viewL[cur].vert_angle=lib3ds_io_read_float(io); lib3ds_io_read(io, viewport->layout.viewL[cur].camera, 11); ++cur; } break; case LIB3DS_VIEWPORT_DATA: /* 3DS R2 & R3 chunk unsupported */ break; default: lib3ds_chunk_unknown(chunk); } } } break; case LIB3DS_DEFAULT_VIEW: { memset(&viewport->default_view,0,sizeof(Lib3dsDefaultView)); while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) { switch (chunk) { case LIB3DS_VIEW_TOP: { viewport->default_view.type=LIB3DS_VIEW_TYPE_TOP; lib3ds_io_read_vector(io, viewport->default_view.position); viewport->default_view.width=lib3ds_io_read_float(io); } break; case LIB3DS_VIEW_BOTTOM: { viewport->default_view.type=LIB3DS_VIEW_TYPE_BOTTOM; lib3ds_io_read_vector(io, viewport->default_view.position); viewport->default_view.width=lib3ds_io_read_float(io); } break; case LIB3DS_VIEW_LEFT: { viewport->default_view.type=LIB3DS_VIEW_TYPE_LEFT; lib3ds_io_read_vector(io, viewport->default_view.position); viewport->default_view.width=lib3ds_io_read_float(io); } break; case LIB3DS_VIEW_RIGHT: { viewport->default_view.type=LIB3DS_VIEW_TYPE_RIGHT; lib3ds_io_read_vector(io, viewport->default_view.position); viewport->default_view.width=lib3ds_io_read_float(io); } break; case LIB3DS_VIEW_FRONT: { viewport->default_view.type=LIB3DS_VIEW_TYPE_FRONT; lib3ds_io_read_vector(io, viewport->default_view.position); viewport->default_view.width=lib3ds_io_read_float(io); } break; case LIB3DS_VIEW_BACK: { viewport->default_view.type=LIB3DS_VIEW_TYPE_BACK; lib3ds_io_read_vector(io, viewport->default_view.position); viewport->default_view.width=lib3ds_io_read_float(io); } break; case LIB3DS_VIEW_USER: { viewport->default_view.type=LIB3DS_VIEW_TYPE_USER; lib3ds_io_read_vector(io, viewport->default_view.position); viewport->default_view.width=lib3ds_io_read_float(io); viewport->default_view.horiz_angle=lib3ds_io_read_float(io); viewport->default_view.vert_angle=lib3ds_io_read_float(io); viewport->default_view.roll_angle=lib3ds_io_read_float(io); } break; case LIB3DS_VIEW_CAMERA: { viewport->default_view.type=LIB3DS_VIEW_TYPE_CAMERA; lib3ds_io_read(io, viewport->default_view.camera, 11); } break; default: lib3ds_chunk_unknown(chunk); } } } break; } lib3ds_chunk_read_end(&c, io); return(LIB3DS_TRUE); }