void x3ds_definition::ensure_lights() { // No lights in the file? Add one. if (m_file->lights == NULL) { Lib3dsLight* light = lib3ds_light_new("light0"); float size; Lib3dsVector bmin, bmax; get_bounding_center(bmin, bmax, light->position, &size); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .6f; light->position[0] += size * 0.75f; light->position[1] -= size * 1.f; light->position[2] += size * 1.5f; light->position[3] = 0.f; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(m_file, light); } }
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); }
// load the model, and if the texture has textures, then apply them on the geometric primitives void Model::LoadFile(const char *name) { if(glIsEnabled(GL_LIGHTING)) lightEnabled = true; else lightEnabled = false; filename = name; // load file file = lib3ds_file_load(filename); if(!file) // if we were not able to load the file { // give some errors string event = "Error loading: "; event.append(filename); cout << event << endl; exit(1); } //Node: /* No nodes? Fabricate nodes to display all the meshes. */ if( !file->nodes ) { cout << "No node found"<< endl; Lib3dsMesh *mesh; Lib3dsNode *node; for(mesh = file->meshes; mesh != NULL; mesh = mesh->next) { node = lib3ds_node_new_object(); strcpy(node->name, mesh->name); node->parent_id = LIB3DS_NO_PARENT; lib3ds_file_insert_node(file, node); } //goto Node; } static Lib3dsVector bmin, bmax; static float sx, sy, sz, size; /* bounding box dimensions */ static float cx, cy, cz; /* bounding box center */ lib3ds_file_bounding_box_of_nodes(file, LIB3DS_TRUE, LIB3DS_FALSE, LIB3DS_FALSE, bmin, bmax); sx = bmax[0] - bmin[0]; sy = bmax[1] - bmin[1]; sz = bmax[2] - bmin[2]; size = MAX(sx, sy); size = MAX(size, sz); cx = (bmin[0] + bmax[0])/2; cy = (bmin[1] + bmax[1])/2; cz = (bmin[2] + bmax[2])/2; lib3ds_file_eval(file, 0); // set current frame to 0 // apply texture to all meshes that have texels if (file->lights == NULL) { Lib3dsLight *light; light = lib3ds_light_new("light0"); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .6; light->position[0] = cx + size * .75; light->position[1] = cy - size * 1.; light->position[2] = cz + size * 1.5; light->position[3] = 0.; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(file, light); light = lib3ds_light_new("light1"); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .3; light->position[0] = cx - size; light->position[1] = cy - size; light->position[2] = cz + size * .75; light->position[3] = 0.; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(file, light); light = lib3ds_light_new("light2"); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .3; light->position[0] = cx; light->position[1] = cy + size; light->position[2] = cz + size; light->position[3] = 0.; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(file, light); } Lib3dsMesh *mesh; for(mesh = file->meshes;mesh != 0;mesh = mesh->next) { if(mesh->texels) //if there's texels for the mesh ApplyTexture(mesh); //then apply texture to it } if(file->lights) //if we have lights in our model CreateLightList(); }
/*! * Load the model from .3ds file. */ static void load_model(void) { file=lib3ds_file_load(filepath); if (!file) { puts("3dsplayer: Error: Loading 3DS file failed.\n"); exit(1); } /* No nodes? Fabricate nodes to display all the meshes. */ if( !file->nodes ) { Lib3dsMesh *mesh; Lib3dsNode *node; for(mesh = file->meshes; mesh != NULL; mesh = mesh->next) { node = lib3ds_node_new_object(); strcpy(node->name, mesh->name); node->parent_id = LIB3DS_NO_PARENT; lib3ds_file_insert_node(file, node); } } lib3ds_file_eval(file, 1.0f); lib3ds_file_bounding_box_of_nodes(file, LIB3DS_TRUE, LIB3DS_FALSE, LIB3DS_FALSE, bmin, bmax); sx = bmax[0] - bmin[0]; sy = bmax[1] - bmin[1]; sz = bmax[2] - bmin[2]; size = MAX(sx, sy); size = MAX(size, sz); cx = (bmin[0] + bmax[0])/2; cy = (bmin[1] + bmax[1])/2; cz = (bmin[2] + bmax[2])/2; /* No cameras in the file? Add four */ if( !file->cameras ) { /* Add some cameras that encompass the bounding box */ Lib3dsCamera *camera = lib3ds_camera_new("Camera_X"); camera->target[0] = cx; camera->target[1] = cy; camera->target[2] = cz; memcpy(camera->position, camera->target, sizeof(camera->position)); camera->position[0] = bmax[0] + 1.5 * MAX(sy,sz); camera->near_range = ( camera->position[0] - bmax[0] ) * .5; camera->far_range = ( camera->position[0] - bmin[0] ) * 2; lib3ds_file_insert_camera(file, camera); /* Since lib3ds considers +Y to be into the screen, we'll put * this camera on the -Y axis, looking in the +Y direction. */ camera = lib3ds_camera_new("Camera_Y"); camera->target[0] = cx; camera->target[1] = cy; camera->target[2] = cz; memcpy(camera->position, camera->target, sizeof(camera->position)); camera->position[1] = bmin[1] - 1.5 * MAX(sx,sz); camera->near_range = ( bmin[1] - camera->position[1] ) * .5; camera->far_range = ( bmax[1] - camera->position[1] ) * 2; lib3ds_file_insert_camera(file, camera); camera = lib3ds_camera_new("Camera_Z"); camera->target[0] = cx; camera->target[1] = cy; camera->target[2] = cz; memcpy(camera->position, camera->target, sizeof(camera->position)); camera->position[2] = bmax[2] + 1.5 * MAX(sx,sy); camera->near_range = ( camera->position[2] - bmax[2] ) * .5; camera->far_range = ( camera->position[2] - bmin[2] ) * 2; lib3ds_file_insert_camera(file, camera); camera = lib3ds_camera_new("Camera_ISO"); camera->target[0] = cx; camera->target[1] = cy; camera->target[2] = cz; memcpy(camera->position, camera->target, sizeof(camera->position)); camera->position[0] = bmax[0] + .75 * size; camera->position[1] = bmin[1] - .75 * size; camera->position[2] = bmax[2] + .75 * size; camera->near_range = ( camera->position[0] - bmax[0] ) * .5; camera->far_range = ( camera->position[0] - bmin[0] ) * 3; lib3ds_file_insert_camera(file, camera); } /* No lights in the file? Add some. */ if (file->lights == NULL) { Lib3dsLight *light; light = lib3ds_light_new("light0"); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .6; light->position[0] = cx + size * .75; light->position[1] = cy - size * 1.; light->position[2] = cz + size * 1.5; light->position[3] = 0.; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(file, light); light = lib3ds_light_new("light1"); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .3; light->position[0] = cx - size; light->position[1] = cy - size; light->position[2] = cz + size * .75; light->position[3] = 0.; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(file, light); light = lib3ds_light_new("light2"); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .3; light->position[0] = cx; light->position[1] = cy + size; light->position[2] = cz + size; light->position[3] = 0.; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(file, light); } if (!file->cameras) { fputs("3dsplayer: Error: No Camera found.\n", stderr); lib3ds_file_free(file); file=0; exit(1); } if (!camera) { camera=file->cameras->name; } lib3ds_file_eval(file,0.); }
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); }
/*! * Load the model from .3ds file. */ static void load_model(void) { file = lib3ds_file_open(filepath); if (!file) { puts("3dsplayer: Error: Loading 3DS file failed.\n"); exit(1); } /* No nodes? Fabricate nodes to display all the meshes. */ if (!file->nodes) { Lib3dsNode *node; int i; for (i = 0; i < file->nmeshes; ++i) { Lib3dsMesh *mesh = file->meshes[i]; node = lib3ds_node_new(LIB3DS_NODE_MESH_INSTANCE); strcpy(node->name, mesh->name); lib3ds_file_insert_node(file, node, NULL); } } lib3ds_file_eval(file, 0.0f); lib3ds_file_bounding_box_of_nodes(file, 1, 0, 0, bmin, bmax, NULL); sx = bmax[0] - bmin[0]; sy = bmax[1] - bmin[1]; sz = bmax[2] - bmin[2]; size = MAX(sx, sy); size = MAX(size, sz); cx = (bmin[0] + bmax[0]) / 2; cy = (bmin[1] + bmax[1]) / 2; cz = (bmin[2] + bmax[2]) / 2; /* No cameras in the file? Add four */ if (!file->ncameras) { /* Add some cameras that encompass the bounding box */ Lib3dsCamera *camera = lib3ds_camera_new("Camera_X"); camera->target[0] = cx; camera->target[1] = cy; camera->target[2] = cz; memcpy(camera->position, camera->target, sizeof(camera->position)); camera->position[0] = bmax[0] + 1.5 * MAX(sy, sz); camera->near_range = (camera->position[0] - bmax[0]) * .5; camera->far_range = (camera->position[0] - bmin[0]) * 2; lib3ds_file_insert_camera(file, camera, -1); /* Since lib3ds considers +Y to be into the screen, we'll put * this camera on the -Y axis, looking in the +Y direction. */ camera = lib3ds_camera_new("Camera_Y"); camera->target[0] = cx; camera->target[1] = cy; camera->target[2] = cz; memcpy(camera->position, camera->target, sizeof(camera->position)); camera->position[1] = bmin[1] - 1.5 * MAX(sx, sz); camera->near_range = (bmin[1] - camera->position[1]) * .5; camera->far_range = (bmax[1] - camera->position[1]) * 2; lib3ds_file_insert_camera(file, camera, -1); camera = lib3ds_camera_new("Camera_Z"); camera->target[0] = cx; camera->target[1] = cy; camera->target[2] = cz; memcpy(camera->position, camera->target, sizeof(camera->position)); camera->position[2] = bmax[2] + 1.5 * MAX(sx, sy); camera->near_range = (camera->position[2] - bmax[2]) * .5; camera->far_range = (camera->position[2] - bmin[2]) * 2; lib3ds_file_insert_camera(file, camera, -1); camera = lib3ds_camera_new("Camera_ISO"); camera->target[0] = cx; camera->target[1] = cy; camera->target[2] = cz; memcpy(camera->position, camera->target, sizeof(camera->position)); camera->position[0] = bmax[0] + .75 * size; camera->position[1] = bmin[1] - .75 * size; camera->position[2] = bmax[2] + .75 * size; camera->near_range = (camera->position[0] - bmax[0]) * .5; camera->far_range = (camera->position[0] - bmin[0]) * 3; lib3ds_file_insert_camera(file, camera, -1); } /* No lights in the file? Add some. */ if (!file->nlights) { Lib3dsLight *light; light = lib3ds_light_new("light0"); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .6; light->position[0] = cx + size * .75; light->position[1] = cy - size * 1.; light->position[2] = cz + size * 1.5; light->position[3] = 0.; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(file, light, -1); light = lib3ds_light_new("light1"); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .3; light->position[0] = cx - size; light->position[1] = cy - size; light->position[2] = cz + size * .75; light->position[3] = 0.; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(file, light, -1); light = lib3ds_light_new("light2"); light->spot_light = 0; light->see_cone = 0; light->color[0] = light->color[1] = light->color[2] = .3; light->position[0] = cx; light->position[1] = cy + size; light->position[2] = cz + size; light->position[3] = 0.; light->outer_range = 100; light->inner_range = 10; light->multiplier = 1; lib3ds_file_insert_light(file, light, -1); } camera = file->cameras[0]->name; lib3ds_file_eval(file, 0); }
static void named_object_read(Lib3dsFile *file, Lib3dsIo *io) { Lib3dsChunk c; char name[64]; uint16_t chunk; Lib3dsMesh *mesh = NULL; Lib3dsCamera *camera = NULL; Lib3dsLight *light = NULL; uint32_t object_flags; lib3ds_chunk_read_start(&c, CHK_NAMED_OBJECT, io); lib3ds_io_read_string(io, name, 64); lib3ds_io_log(io, LIB3DS_LOG_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 CHK_N_TRI_OBJECT: { mesh = lib3ds_mesh_new(name); lib3ds_file_insert_mesh(file, mesh, -1); lib3ds_chunk_read_reset(&c, io); lib3ds_mesh_read(file, mesh, io); break; } case CHK_N_CAMERA: { camera = lib3ds_camera_new(name); lib3ds_file_insert_camera(file, camera, -1); lib3ds_chunk_read_reset(&c, io); lib3ds_camera_read(camera, io); break; } case CHK_N_DIRECT_LIGHT: { light = lib3ds_light_new(name); lib3ds_file_insert_light(file, light, -1); lib3ds_chunk_read_reset(&c, io); lib3ds_light_read(light, io); break; } case CHK_OBJ_HIDDEN: object_flags |= LIB3DS_OBJECT_HIDDEN; break; case CHK_OBJ_DOESNT_CAST: object_flags |= LIB3DS_OBJECT_DOESNT_CAST; break; case CHK_OBJ_VIS_LOFTER: object_flags |= LIB3DS_OBJECT_VIS_LOFTER; break; case CHK_OBJ_MATTE: object_flags |= LIB3DS_OBJECT_MATTE; break; case CHK_OBJ_DONT_RCVSHADOW: object_flags |= LIB3DS_OBJECT_DONT_RCVSHADOW; break; case CHK_OBJ_FAST: object_flags |= LIB3DS_OBJECT_FAST; break; case CHK_OBJ_FROZEN: object_flags |= LIB3DS_OBJECT_FROZEN; break; default: lib3ds_chunk_unknown(chunk, io); } } 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); }