static Lib3dsBool named_object_read(Lib3dsFile *file, FILE *f) { Lib3dsChunk c; char name[64]; Lib3dsWord chunk; if (!lib3ds_chunk_read_start(&c, LIB3DS_NAMED_OBJECT, f)) { return(LIB3DS_FALSE); } if (!lib3ds_string_read(name, 64, f)) { return(LIB3DS_FALSE); } lib3ds_chunk_dump_info(" NAME=%s", name); lib3ds_chunk_read_tell(&c, f); while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) { switch (chunk) { case LIB3DS_N_TRI_OBJECT: { Lib3dsMesh *mesh; mesh=lib3ds_mesh_new(name); if (!mesh) { return(LIB3DS_FALSE); } lib3ds_chunk_read_reset(&c, f); if (!lib3ds_mesh_read(mesh, f)) { return(LIB3DS_FALSE); } lib3ds_file_insert_mesh(file, mesh); } break; case LIB3DS_N_CAMERA: { Lib3dsCamera *camera; camera=lib3ds_camera_new(name); if (!camera) { return(LIB3DS_FALSE); } lib3ds_chunk_read_reset(&c, f); if (!lib3ds_camera_read(camera, f)) { return(LIB3DS_FALSE); } lib3ds_file_insert_camera(file, camera); } break; case LIB3DS_N_DIRECT_LIGHT: { Lib3dsLight *light; light=lib3ds_light_new(name); if (!light) { return(LIB3DS_FALSE); } lib3ds_chunk_read_reset(&c, f); if (!lib3ds_light_read(light, f)) { return(LIB3DS_FALSE); } lib3ds_file_insert_light(file, light); } break; default: lib3ds_chunk_unknown(chunk); } } lib3ds_chunk_read_end(&c, f); return(LIB3DS_TRUE); }
/*! * \ingroup node */ Lib3dsBool lib3ds_node_read(Lib3dsNode *node, Lib3dsFile *file, Lib3dsIo *io) { Lib3dsChunk c; Lib3dsWord chunk; ASSERT(node); if (!lib3ds_chunk_read_start(&c, 0, io)) { return(LIB3DS_FALSE); } switch (c.chunk) { case LIB3DS_AMBIENT_NODE_TAG: case LIB3DS_OBJECT_NODE_TAG: case LIB3DS_CAMERA_NODE_TAG: case LIB3DS_TARGET_NODE_TAG: case LIB3DS_LIGHT_NODE_TAG: case LIB3DS_SPOTLIGHT_NODE_TAG: case LIB3DS_L_TARGET_NODE_TAG: break; default: return(LIB3DS_FALSE); } while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) { switch (chunk) { case LIB3DS_NODE_ID: { node->node_id=lib3ds_io_read_word(io); lib3ds_chunk_dump_info(" ID = %d", (short)node->node_id); } break; case LIB3DS_NODE_HDR: { if (!lib3ds_io_read_string(io, node->name, 64)) { return(LIB3DS_FALSE); } node->flags1=lib3ds_io_read_word(io); node->flags2=lib3ds_io_read_word(io); node->parent_id=lib3ds_io_read_word(io); lib3ds_chunk_dump_info(" NAME =%s", node->name); lib3ds_chunk_dump_info(" PARENT=%d", (short)node->parent_id); } break; case LIB3DS_PIVOT: { if (node->type==LIB3DS_OBJECT_NODE) { int i; for (i=0; i<3; ++i) { node->data.object.pivot[i]=lib3ds_io_read_float(io); } } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_INSTANCE_NAME: { if (node->type==LIB3DS_OBJECT_NODE) { if (!lib3ds_io_read_string(io, node->data.object.instance, 64)) { return(LIB3DS_FALSE); } } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_BOUNDBOX: { if (node->type==LIB3DS_OBJECT_NODE) { int i; for (i=0; i<3; ++i) { node->data.object.bbox_min[i]=lib3ds_io_read_float(io); } for (i=0; i<3; ++i) { node->data.object.bbox_max[i]=lib3ds_io_read_float(io); } } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_COL_TRACK_TAG: { Lib3dsBool result=LIB3DS_TRUE; switch (node->type) { case LIB3DS_AMBIENT_NODE: result=lib3ds_lin3_track_read(&node->data.ambient.col_track, io); break; case LIB3DS_LIGHT_NODE: result=lib3ds_lin3_track_read(&node->data.light.col_track, io); break; default: lib3ds_chunk_unknown(chunk); } if (!result) { return(LIB3DS_FALSE); } } break; case LIB3DS_POS_TRACK_TAG: { Lib3dsBool result=LIB3DS_TRUE; switch (node->type) { case LIB3DS_OBJECT_NODE: result=lib3ds_lin3_track_read(&node->data.object.pos_track, io); break; case LIB3DS_CAMERA_NODE: result=lib3ds_lin3_track_read(&node->data.camera.pos_track, io); break; case LIB3DS_TARGET_NODE: result=lib3ds_lin3_track_read(&node->data.target.pos_track, io); break; case LIB3DS_LIGHT_NODE: result=lib3ds_lin3_track_read(&node->data.light.pos_track, io); break; case LIB3DS_SPOT_NODE: result=lib3ds_lin3_track_read(&node->data.spot.pos_track, io); break; default: lib3ds_chunk_unknown(chunk); } if (!result) { return(LIB3DS_FALSE); } } break; case LIB3DS_ROT_TRACK_TAG: { if (node->type==LIB3DS_OBJECT_NODE) { if (!lib3ds_quat_track_read(&node->data.object.rot_track, io)) { return(LIB3DS_FALSE); } } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_SCL_TRACK_TAG: { if (node->type==LIB3DS_OBJECT_NODE) { if (!lib3ds_lin3_track_read(&node->data.object.scl_track, io)) { return(LIB3DS_FALSE); } } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_FOV_TRACK_TAG: { if (node->type==LIB3DS_CAMERA_NODE) { if (!lib3ds_lin1_track_read(&node->data.camera.fov_track, io)) { return(LIB3DS_FALSE); } } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_HOT_TRACK_TAG: { if (node->type==LIB3DS_LIGHT_NODE) { if (!lib3ds_lin1_track_read(&node->data.light.hotspot_track, io)) { return(LIB3DS_FALSE); } } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_FALL_TRACK_TAG: { if (node->type==LIB3DS_LIGHT_NODE) { if (!lib3ds_lin1_track_read(&node->data.light.falloff_track, io)) { return(LIB3DS_FALSE); } } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_ROLL_TRACK_TAG: { Lib3dsBool result=LIB3DS_TRUE; switch (node->type) { case LIB3DS_CAMERA_NODE: result=lib3ds_lin1_track_read(&node->data.camera.roll_track, io); break; case LIB3DS_LIGHT_NODE: result=lib3ds_lin1_track_read(&node->data.light.roll_track, io); break; default: lib3ds_chunk_unknown(chunk); } if (!result) { return(LIB3DS_FALSE); } } break; case LIB3DS_HIDE_TRACK_TAG: { if (node->type==LIB3DS_OBJECT_NODE) { if (!lib3ds_bool_track_read(&node->data.object.hide_track, io)) { return(LIB3DS_FALSE); } } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_MORPH_SMOOTH: { if (node->type==LIB3DS_OBJECT_NODE) { node->data.object.morph_smooth=lib3ds_io_read_float(io); } else { lib3ds_chunk_unknown(chunk); } } break; case LIB3DS_MORPH_TRACK_TAG: { if (node->type==LIB3DS_OBJECT_NODE) { if (!lib3ds_morph_track_read(&node->data.object.morph_track, io)) { return(LIB3DS_FALSE); } } else { lib3ds_chunk_unknown(chunk); } } break; default: lib3ds_chunk_unknown(chunk); } } lib3ds_chunk_read_end(&c, io); return(LIB3DS_TRUE); }
/*! * \ingroup material */ Lib3dsBool lib3ds_material_read(Lib3dsMaterial *material, Lib3dsIo *io) { Lib3dsChunk c; Lib3dsWord chunk; ASSERT(material); if (!lib3ds_chunk_read_start(&c, LIB3DS_MAT_ENTRY, io)) { return(LIB3DS_FALSE); } while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) { switch (chunk) { case LIB3DS_MAT_NAME: { if (!lib3ds_io_read_string(io, material->name, 64)) { return(LIB3DS_FALSE); } lib3ds_chunk_dump_info(" NAME=%s", material->name); } break; case LIB3DS_MAT_AMBIENT: { lib3ds_chunk_read_reset(&c, io); if (!color_read(material->ambient, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_DIFFUSE: { lib3ds_chunk_read_reset(&c, io); if (!color_read(material->diffuse, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SPECULAR: { lib3ds_chunk_read_reset(&c, io); if (!color_read(material->specular, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SHININESS: { lib3ds_chunk_read_reset(&c, io); if (!int_percentage_read(&material->shininess, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SHIN2PCT: { lib3ds_chunk_read_reset(&c, io); if (!int_percentage_read(&material->shin_strength, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_TRANSPARENCY: { lib3ds_chunk_read_reset(&c, io); if (!int_percentage_read(&material->transparency, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_XPFALL: { lib3ds_chunk_read_reset(&c, io); if (!int_percentage_read(&material->falloff, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SELF_ILPCT: { lib3ds_chunk_read_reset(&c, io); if (!int_percentage_read(&material->self_ilpct, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_USE_XPFALL: { material->use_falloff=LIB3DS_TRUE; } break; case LIB3DS_MAT_REFBLUR: { lib3ds_chunk_read_reset(&c, io); if (!int_percentage_read(&material->blur, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_USE_REFBLUR: { material->use_blur=LIB3DS_TRUE; } break; case LIB3DS_MAT_SHADING: { material->shading=lib3ds_io_read_intw(io); } break; case LIB3DS_MAT_SELF_ILLUM: { material->self_illum=LIB3DS_TRUE; } break; case LIB3DS_MAT_TWO_SIDE: { material->two_sided=LIB3DS_TRUE; } break; case LIB3DS_MAT_DECAL: { material->map_decal=LIB3DS_TRUE; } break; case LIB3DS_MAT_ADDITIVE: { material->additive=LIB3DS_TRUE; } break; case LIB3DS_MAT_FACEMAP: { material->face_map=LIB3DS_TRUE; } break; case LIB3DS_MAT_PHONGSOFT: { material->soften=LIB3DS_TRUE; } break; case LIB3DS_MAT_WIRE: { material->use_wire=LIB3DS_TRUE; } break; case LIB3DS_MAT_WIREABS: { material->use_wire_abs=LIB3DS_TRUE; } break; case LIB3DS_MAT_WIRE_SIZE: { material->wire_size=lib3ds_io_read_float(io); } break; case LIB3DS_MAT_TEXMAP: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->texture1_map, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_TEXMASK: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->texture1_mask, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_TEX2MAP: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->texture2_map, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_TEX2MASK: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->texture2_mask, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_OPACMAP: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->opacity_map, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_OPACMASK: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->opacity_mask, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_BUMPMAP: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->bump_map, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_BUMPMASK: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->bump_mask, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SPECMAP: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->specular_map, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SPECMASK: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->specular_mask, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SHINMAP: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->shininess_map, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SHINMASK: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->shininess_mask, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SELFIMAP: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->self_illum_map, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_SELFIMASK: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->self_illum_mask, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_REFLMAP: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->reflection_map, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_REFLMASK: { lib3ds_chunk_read_reset(&c, io); if (!texture_map_read(&material->reflection_mask, io)) { return(LIB3DS_FALSE); } } break; case LIB3DS_MAT_ACUBIC: { lib3ds_io_read_intb(io); material->autorefl_map.level=lib3ds_io_read_intb(io); material->autorefl_map.flags=lib3ds_io_read_intw(io); material->autorefl_map.size=lib3ds_io_read_intd(io); material->autorefl_map.frame_step=lib3ds_io_read_intd(io); } break; default: lib3ds_chunk_unknown(chunk); } } lib3ds_chunk_read_end(&c, io); return(LIB3DS_TRUE); }
static Lib3dsBool named_object_read(Lib3dsFile *file, Lib3dsIo *io) { Lib3dsChunk c; char name[64]; Lib3dsWord chunk; Lib3dsMesh *mesh = NULL; Lib3dsCamera *camera = NULL; Lib3dsLight *light = NULL; Lib3dsDword object_flags; if (!lib3ds_chunk_read_start(&c, LIB3DS_NAMED_OBJECT, io)) { return(LIB3DS_FALSE); } if (!lib3ds_io_read_string(io, name, 64)) { return(LIB3DS_FALSE); } lib3ds_chunk_dump_info(" NAME=%s", name); lib3ds_chunk_read_tell(&c, io); object_flags = 0; while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) { switch (chunk) { case LIB3DS_N_TRI_OBJECT: { mesh=lib3ds_mesh_new(name); if (!mesh) { return(LIB3DS_FALSE); } lib3ds_chunk_read_reset(&c, io); if (!lib3ds_mesh_read(mesh, io)) { return(LIB3DS_FALSE); } lib3ds_file_insert_mesh(file, mesh); } break; case LIB3DS_N_CAMERA: { camera=lib3ds_camera_new(name); if (!camera) { return(LIB3DS_FALSE); } lib3ds_chunk_read_reset(&c, io); if (!lib3ds_camera_read(camera, io)) { return(LIB3DS_FALSE); } lib3ds_file_insert_camera(file, camera); } break; case LIB3DS_N_DIRECT_LIGHT: { light=lib3ds_light_new(name); if (!light) { return(LIB3DS_FALSE); } lib3ds_chunk_read_reset(&c, io); if (!lib3ds_light_read(light, io)) { return(LIB3DS_FALSE); } lib3ds_file_insert_light(file, light); } break; case LIB3DS_OBJ_HIDDEN: object_flags |= LIB3DS_OBJECT_HIDDEN; break; case LIB3DS_OBJ_DOESNT_CAST: object_flags |= LIB3DS_OBJECT_DOESNT_CAST; break; case LIB3DS_OBJ_VIS_LOFTER: object_flags |= LIB3DS_OBJECT_VIS_LOFTER; break; case LIB3DS_OBJ_MATTE: object_flags |= LIB3DS_OBJECT_MATTE; break; case LIB3DS_OBJ_DONT_RCVSHADOW: object_flags |= LIB3DS_OBJECT_DONT_RCVSHADOW; break; case LIB3DS_OBJ_FAST: object_flags |= LIB3DS_OBJECT_FAST; break; case LIB3DS_OBJ_FROZEN: object_flags |= LIB3DS_OBJECT_FROZEN; break; default: lib3ds_chunk_unknown(chunk); } } if (mesh) mesh->object_flags = object_flags; if (camera) camera->object_flags = object_flags; if (light) light->object_flags = object_flags; lib3ds_chunk_read_end(&c, io); return(LIB3DS_TRUE); }
static Lib3dsBool texture_map_read(Lib3dsTextureMap *map, Lib3dsIo *io) { Lib3dsChunk c; Lib3dsWord chunk; if (!lib3ds_chunk_read_start(&c, 0, io)) { return(LIB3DS_FALSE); } while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) { switch (chunk) { case LIB3DS_INT_PERCENTAGE: { map->percent=1.0f*lib3ds_io_read_intw(io)/100.0f; } break; case LIB3DS_MAT_MAPNAME: { if (!lib3ds_io_read_string(io, map->name, 64)) { return(LIB3DS_FALSE); } lib3ds_chunk_dump_info(" NAME=%s", map->name); } break; case LIB3DS_MAT_MAP_TILING: { map->flags=lib3ds_io_read_word(io); } break; case LIB3DS_MAT_MAP_TEXBLUR: { map->blur=lib3ds_io_read_float(io); } break; case LIB3DS_MAT_MAP_USCALE: { map->scale[0]=lib3ds_io_read_float(io); } break; case LIB3DS_MAT_MAP_VSCALE: { map->scale[1]=lib3ds_io_read_float(io); } break; case LIB3DS_MAT_MAP_UOFFSET: { map->offset[0]=lib3ds_io_read_float(io); } break; case LIB3DS_MAT_MAP_VOFFSET: { map->offset[1]=lib3ds_io_read_float(io); } break; case LIB3DS_MAT_MAP_ANG: { map->rotation=lib3ds_io_read_float(io); } break; case LIB3DS_MAT_MAP_COL1: { map->tint_1[0]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_1[1]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_1[2]=1.0f*lib3ds_io_read_byte(io)/255.0f; } break; case LIB3DS_MAT_MAP_COL2: { map->tint_2[0]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_2[1]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_2[2]=1.0f*lib3ds_io_read_byte(io)/255.0f; } break; case LIB3DS_MAT_MAP_RCOL: { map->tint_r[0]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_r[1]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_r[2]=1.0f*lib3ds_io_read_byte(io)/255.0f; } break; case LIB3DS_MAT_MAP_GCOL: { map->tint_g[0]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_g[1]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_g[2]=1.0f*lib3ds_io_read_byte(io)/255.0f; } break; case LIB3DS_MAT_MAP_BCOL: { map->tint_b[0]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_b[1]=1.0f*lib3ds_io_read_byte(io)/255.0f; map->tint_b[2]=1.0f*lib3ds_io_read_byte(io)/255.0f; } break; default: lib3ds_chunk_unknown(chunk); } } lib3ds_chunk_read_end(&c, io); return(LIB3DS_TRUE); }