#import "model.h" #import "vector.h" #import "memory.h" #import "oops.h" #import "array_utilities.h" #import "gl_headers.h" #include #include #include #include #include typedef struct { int vertex_1, vertex_2, vertex_3; } triangle_indices; typedef struct { vector *vertices; triangle_indices *triangles; } autodesk_3ds_model; void add_node_to_3ds_model(Lib3dsFile *file, Lib3dsNode *node, autodesk_3ds_model *m) { if ((node->type == LIB3DS_OBJECT_NODE) && (strcmp(node->name,"$$$DUMMY") != 0)) { Lib3dsMesh *mesh; mesh = lib3ds_file_mesh_by_name(file, node->name); if (mesh) { unsigned int last_count = array_count(m->triangles); m->triangles = resize_array(m->triangles, last_count + mesh->faces); int i; for (i=0; ifaces; i++) { Lib3dsFace *face = &mesh->faceL[i]; triangle_indices new_tri; new_tri.vertex_1 = face->points[0]; new_tri.vertex_2 = face->points[1]; new_tri.vertex_3 = face->points[2]; m->triangles[last_count + i] = new_tri; } last_count = array_count(m->vertices); m->vertices = resize_array(m->vertices, last_count + mesh->points); for (i=0; ipoints; i++) { float *pos = mesh->pointL[i].pos; m->vertices[i + last_count] = make_vector(pos[0], pos[1], pos[2]); } } } } void draw_3ds(autodesk_3ds_model *m) { glBegin(GL_TRIANGLES); triangle_indices triangle; foreach (m->triangles, i, triangle) { glVertex3f(UNPACK_VECTOR(m->vertices[triangle.vertex_1])); glVertex3f(UNPACK_VECTOR(m->vertices[triangle.vertex_2])); glVertex3f(UNPACK_VECTOR(m->vertices[triangle.vertex_3])); } glEnd(); } autodesk_3ds_model *load_3ds(char *filename) { Lib3dsFile *file = lib3ds_file_load(filename); if (file == NULL) { oops(recoverable_error, "Couldn't load file."); return NULL; } // Read the first frame only. lib3ds_file_eval(file, 0); autodesk_3ds_model *m = alloc(sizeof(autodesk_3ds_model)); m->vertices = alloc_array(sizeof(vector), 0); m->triangles = alloc_array(sizeof(triangle_indices), 0); Lib3dsNode *node; for (node = file->nodes; node != NULL; node = node->next) { add_node_to_3ds_model(file, node, m); } #warning following line is probably important lib3ds_file_free(file); return autorelease(m); } model_class autodesk_3ds = {&load_3ds, &draw_3ds};