LOD_QSDecimator * LOD_QSDecimator:: New( LOD_ManMesh2 &mesh, LOD_ExternNormalEditor &face_editor, LOD_ExternBufferEditor &extern_editor ){ MEM_SmartPtr<LOD_QSDecimator> output = new LOD_QSDecimator(mesh,face_editor,extern_editor); MEM_SmartPtr<LOD_EdgeCollapser > collapser(LOD_EdgeCollapser::New()); MEM_SmartPtr<LOD_QuadricEditor> q_editor(LOD_QuadricEditor::New(mesh)); if ( output == NULL || collapser == NULL || q_editor == NULL ) { return NULL; } output->m_collapser = collapser.Release(); output->m_quadric_editor = q_editor.Release(); return output.Release(); }
MEM_SmartPtr<BSP_TMesh> NewTestMesh( int x, int y, MT_Scalar fx, MT_Scalar fy, MT_Scalar ampx, MT_Scalar ampy, MT_Scalar sx, MT_Scalar sy ) { MEM_SmartPtr<BSP_TMesh> output = new BSP_TMesh; std::vector<BSP_TVertex> &verts = output->VertexSet(); int i,j; MT_Scalar x_scale = fx*MT_PI/x; MT_Scalar y_scale = fy*MT_PI/y; MT_Scalar fsx = sx/x; MT_Scalar fsy = sy/y; for (j = 0; j < y; j++) { for (i = 0; i < x; i++) { float z = ampx*sin(x_scale * i) + ampy*sin(y_scale * j); MT_Vector3 val(i*fsx - sx/2,j*fsy - sy/2,z); BSP_TVertex chuff; chuff.m_pos = val; verts.push_back(chuff); } } int poly[4]; for (j = 0; j < (y-1); j++) { for (i = 0; i < (x-1); i++) { poly[0] = j*x + i; poly[1] = poly[0] + 1; poly[2] = poly[1] + y; poly[3] = poly[2] -1; output->AddFace(poly,4); } } output->m_min = MT_Vector3(-sx/2,-sy/2,-ampx -ampy); output->m_max = MT_Vector3(sx/2,sy/2,ampx + ampy); return output; }
MEM_SmartPtr<BSP_TMesh> BSP_PlyLoader:: NewMeshFromFile( char * file_name, MT_Vector3 &min, MT_Vector3 &max ) { min = MT_Vector3(MT_INFINITY,MT_INFINITY,MT_INFINITY); max = MT_Vector3(-MT_INFINITY,-MT_INFINITY,-MT_INFINITY); PlyProperty vert_props[] = { /* list of property information for a vertex */ {"x", PLY_FLOAT, PLY_FLOAT, offsetof(LoadVertex,x), 0, 0, 0, 0}, {"y", PLY_FLOAT, PLY_FLOAT, offsetof(LoadVertex,y), 0, 0, 0, 0}, {"z", PLY_FLOAT, PLY_FLOAT, offsetof(LoadVertex,z), 0, 0, 0, 0}, }; PlyProperty face_props[] = { /* list of property information for a vertex */ {"vertex_indices", PLY_INT, PLY_INT, offsetof(LoadFace,verts), 1, PLY_UCHAR, PLY_UCHAR, offsetof(LoadFace,nverts)}, }; MEM_SmartPtr<BSP_TMesh> mesh = new BSP_TMesh; if (mesh == NULL) return NULL; int i,j; PlyFile *ply; int nelems; char **elist; int file_type; float version; int nprops; int num_elems; PlyProperty **plist; char *elem_name; LoadVertex load_vertex; LoadFace load_face; /* open a PLY file for reading */ ply = ply_open_for_reading( file_name, &nelems, &elist, &file_type, &version ); if (ply == NULL) return NULL; /* go through each kind of element that we learned is in the file */ /* and read them */ for (i = 0; i < nelems; i++) { /* get the description of the first element */ elem_name = elist[i]; plist = ply_get_element_description (ply, elem_name, &num_elems, &nprops); /* print the name of the element, for debugging */ /* if we're on vertex elements, read them in */ if (equal_strings ("vertex", elem_name)) { /* set up for getting vertex elements */ ply_get_property (ply, elem_name, &vert_props[0]); ply_get_property (ply, elem_name, &vert_props[1]); ply_get_property (ply, elem_name, &vert_props[2]); // make some memory for the vertices mesh->VertexSet().reserve(num_elems); /* grab all the vertex elements */ for (j = 0; j < num_elems; j++) { /* grab and element from the file */ ply_get_element (ply, (void *)&load_vertex); // pass the vertex into the mesh builder. if (load_vertex.x < min.x()) { min.x() = load_vertex.x; } else if (load_vertex.x > max.x()) { max.x()= load_vertex.x; } if (load_vertex.y < min.y()) { min.y() = load_vertex.y; } else if (load_vertex.y > max.y()) { max.y()= load_vertex.y; } if (load_vertex.z < min.z()) { min.z() = load_vertex.z; } else if (load_vertex.z > max.z()) { max.z()= load_vertex.z; } BSP_TVertex my_vert; my_vert.m_pos = MT_Vector3(load_vertex.x,load_vertex.y,load_vertex.z); mesh->VertexSet().push_back(my_vert); } } /* if we're on face elements, read them in */ if (equal_strings ("face", elem_name)) { /* set up for getting face elements */ ply_get_property (ply, elem_name, &face_props[0]); /* grab all the face elements */ for (j = 0; j < num_elems; j++) { ply_get_element (ply, (void *)&load_face); int v; for (v = 2; v< load_face.nverts; v++) { BSP_TFace f; f.m_verts[0] = load_face.verts[0]; f.m_verts[1] = load_face.verts[v-1]; f.m_verts[2] = load_face.verts[v]; mesh->BuildNormal(f); mesh->FaceSet().push_back(f); } // free up the memory this pile of shit used to allocate the polygon's vertices free (load_face.verts); } } } /* close the PLY file */ ply_close (ply); return mesh; }
LOD_Decimation_InfoPtr NewVertsFromFile( char * file_name, MT_Vector3 &min, MT_Vector3 &max ) { min = MT_Vector3(MT_INFINITY,MT_INFINITY,MT_INFINITY); max = MT_Vector3(-MT_INFINITY,-MT_INFINITY,-MT_INFINITY); PlyProperty vert_props[] = { /* list of property information for a vertex */ {"x", PLY_FLOAT, PLY_FLOAT, offsetof(LoadVertex,x), 0, 0, 0, 0}, {"y", PLY_FLOAT, PLY_FLOAT, offsetof(LoadVertex,y), 0, 0, 0, 0}, {"z", PLY_FLOAT, PLY_FLOAT, offsetof(LoadVertex,z), 0, 0, 0, 0}, }; PlyProperty face_props[] = { /* list of property information for a vertex */ {"intensity", PLY_UCHAR, PLY_UCHAR, offsetof(LoadFace,intensity), 0, 0, 0, 0}, {"vertex_indices", PLY_INT, PLY_INT, offsetof(LoadFace,verts), 1, PLY_UCHAR, PLY_UCHAR, offsetof(LoadFace,nverts)}, }; #if 0 MEM_SmartPtr<std::vector<float> > verts = new std::vector<float>; MEM_SmartPtr<std::vector<float> > vertex_normals = new std::vector<float>; MEM_SmartPtr<std::vector<int> > faces = new std::vector<int>; #else std::vector<float>* verts = new std::vector<float>; std::vector<float>* vertex_normals = new std::vector<float>; std::vector<int> * faces = new std::vector<int>; #endif int i,j; PlyFile *ply; int nelems; char **elist; int file_type; float version; int nprops; int num_elems; PlyProperty **plist; char *elem_name; LoadVertex load_vertex; LoadFace load_face; /* open a PLY file for reading */ ply = ply_open_for_reading(file_name, &nelems, &elist, &file_type, &version); if (ply == NULL) return NULL; /* go through each kind of element that we learned is in the file */ /* and read them */ for (i = 0; i < nelems; i++) { /* get the description of the first element */ elem_name = elist[i]; plist = ply_get_element_description (ply, elem_name, &num_elems, &nprops); /* print the name of the element, for debugging */ /* if we're on vertex elements, read them in */ if (equal_strings ("vertex", elem_name)) { /* set up for getting vertex elements */ ply_get_property (ply, elem_name, &vert_props[0]); ply_get_property (ply, elem_name, &vert_props[1]); ply_get_property (ply, elem_name, &vert_props[2]); // make some memory for the vertices verts->reserve(num_elems); /* grab all the vertex elements */ for (j = 0; j < num_elems; j++) { /* grab and element from the file */ ply_get_element (ply, (void *)&load_vertex); // pass the vertex into the mesh builder. if (load_vertex.x < min.x()) { min.x() = load_vertex.x; } else if (load_vertex.x > max.x()) { max.x()= load_vertex.x; } if (load_vertex.y < min.y()) { min.y() = load_vertex.y; } else if (load_vertex.y > max.y()) { max.y()= load_vertex.y; } if (load_vertex.z < min.z()) { min.z() = load_vertex.z; } else if (load_vertex.z > max.z()) { max.z()= load_vertex.z; } verts->push_back(load_vertex.x); verts->push_back(load_vertex.y); verts->push_back(load_vertex.z); vertex_normals->push_back(1.0f); vertex_normals->push_back(0.0f); vertex_normals->push_back(0.0f); } } /* if we're on face elements, read them in */ if (equal_strings ("face", elem_name)) { /* set up for getting face elements */ // ply_get_property (ply, elem_name, &face_props[0]); ply_get_property (ply, elem_name, &face_props[1]); /* grab all the face elements */ for (j = 0; j < num_elems; j++) { ply_get_element (ply, (void *)&load_face); faces->push_back(load_face.verts[0]); faces->push_back(load_face.verts[1]); faces->push_back(load_face.verts[2]); // free up the memory this pile of shit used to allocate the polygon's vertices free (load_face.verts); } } } /* close the PLY file */ ply_close (ply); LOD_Decimation_InfoPtr output = new LOD_Decimation_Info; output->vertex_buffer = verts->begin(); output->vertex_num = verts->size()/3; output->triangle_index_buffer = faces->begin(); output->face_num = faces->size()/3; output->intern = NULL; output->vertex_normal_buffer = vertex_normals->begin(); // memory leaks 'r' us #if 0 verts.Release(); vertex_normals.Release(); faces.Release(); #endif return output; }
int main(int argc, char **argv) { const int seg_num = 5; const MT_Scalar seg_length = 15; const float seg_startA[3] = {0,0,0}; const float seg_startB[3] = {0,-20,0}; // create some segments to solve with // First chain ////////////// IK_Segment_ExternPtr const segmentsA = new IK_Segment_Extern[seg_num]; IK_Segment_ExternPtr const segmentsB = new IK_Segment_Extern[seg_num]; IK_Segment_ExternPtr seg_it = segmentsA; IK_Segment_ExternPtr seg_itB = segmentsB; { // MT_Quaternion qmat(MT_Vector3(0,0,1),-3.141/2); MT_Quaternion qmat(MT_Vector3(0,0,1),0); MT_Matrix3x3 mat(qmat); seg_it->seg_start[0] = seg_startA[0]; seg_it->seg_start[1] = seg_startA[1]; seg_it->seg_start[2] = seg_startA[2]; float temp[12]; mat.getValue(temp); seg_it->basis[0] = temp[0]; seg_it->basis[1] = temp[1]; seg_it->basis[2] = temp[2]; seg_it->basis[3] = temp[4]; seg_it->basis[4] = temp[5]; seg_it->basis[5] = temp[6]; seg_it->basis[6] = temp[8]; seg_it->basis[7] = temp[9]; seg_it->basis[8] = temp[10]; seg_it->length = seg_length; MT_Quaternion q; q.setEuler(0,0,0); MT_Matrix3x3 qrot(q); seg_it->basis_change[0] = 1; seg_it->basis_change[1] = 0; seg_it->basis_change[2] = 0; seg_it->basis_change[3] = 0; seg_it->basis_change[4] = 1; seg_it->basis_change[5] = 0; seg_it->basis_change[6] = 0; seg_it->basis_change[7] = 0; seg_it->basis_change[8] = 1; seg_it ++; seg_itB->seg_start[0] = seg_startA[0]; seg_itB->seg_start[1] = seg_startA[1]; seg_itB->seg_start[2] = seg_startA[2]; seg_itB->basis[0] = temp[0]; seg_itB->basis[1] = temp[1]; seg_itB->basis[2] = temp[2]; seg_itB->basis[3] = temp[4]; seg_itB->basis[4] = temp[5]; seg_itB->basis[5] = temp[6]; seg_itB->basis[6] = temp[8]; seg_itB->basis[7] = temp[9]; seg_itB->basis[8] = temp[10]; seg_itB->length = seg_length; seg_itB->basis_change[0] = 1; seg_itB->basis_change[1] = 0; seg_itB->basis_change[2] = 0; seg_itB->basis_change[3] = 0; seg_itB->basis_change[4] = 1; seg_itB->basis_change[5] = 0; seg_itB->basis_change[6] = 0; seg_itB->basis_change[7] = 0; seg_itB->basis_change[8] = 1; seg_itB ++; } int i; for (i=1; i < seg_num; ++i, ++seg_it,++seg_itB) { MT_Quaternion qmat(MT_Vector3(0,0,1),0.3); MT_Matrix3x3 mat(qmat); seg_it->seg_start[0] = 0; seg_it->seg_start[1] = 0; seg_it->seg_start[2] = 0; float temp[12]; mat.getValue(temp); seg_it->basis[0] = temp[0]; seg_it->basis[1] = temp[1]; seg_it->basis[2] = temp[2]; seg_it->basis[3] = temp[4]; seg_it->basis[4] = temp[5]; seg_it->basis[5] = temp[6]; seg_it->basis[6] = temp[8]; seg_it->basis[7] = temp[9]; seg_it->basis[8] = temp[10]; seg_it->length = seg_length; MT_Quaternion q; q.setEuler(0,0,0); MT_Matrix3x3 qrot(q); seg_it->basis_change[0] = 1; seg_it->basis_change[1] = 0; seg_it->basis_change[2] = 0; seg_it->basis_change[3] = 0; seg_it->basis_change[4] = 1; seg_it->basis_change[5] = 0; seg_it->basis_change[6] = 0; seg_it->basis_change[7] = 0; seg_it->basis_change[8] = 1; /////////////////////////////// seg_itB->seg_start[0] = 0; seg_itB->seg_start[1] = 0; seg_itB->seg_start[2] = 0; seg_itB->basis[0] = temp[0]; seg_itB->basis[1] = temp[1]; seg_itB->basis[2] = temp[2]; seg_itB->basis[3] = temp[4]; seg_itB->basis[4] = temp[5]; seg_itB->basis[5] = temp[6]; seg_itB->basis[6] = temp[8]; seg_itB->basis[7] = temp[9]; seg_itB->basis[8] = temp[10]; seg_itB->length = seg_length; seg_itB->basis_change[0] = 1; seg_itB->basis_change[1] = 0; seg_itB->basis_change[2] = 0; seg_itB->basis_change[3] = 0; seg_itB->basis_change[4] = 1; seg_itB->basis_change[5] = 0; seg_itB->basis_change[6] = 0; seg_itB->basis_change[7] = 0; seg_itB->basis_change[8] = 1; } // create the chains const int num_chains = 2; IK_Chain_ExternPtr chains[num_chains]; chains[0] = IK_CreateChain(); chains[1] = IK_CreateChain(); // load segments into chain IK_LoadChain(chains[0],segmentsA,seg_num); IK_LoadChain(chains[1],segmentsB,seg_num); // make and install a mouse handler MEM_SmartPtr<MyGlutMouseHandler> mouse_handler (MyGlutMouseHandler::New()); GlutMouseManager::Instance()->InstallHandler(mouse_handler); mouse_handler->SetChain(chains,num_chains); // make and install a keyhandler MEM_SmartPtr<MyGlutKeyHandler> key_handler (MyGlutKeyHandler::New()); GlutKeyboardManager::Instance()->InstallHandler(key_handler); // instantiate the drawing class MEM_SmartPtr<ChainDrawer> drawer (ChainDrawer::New()); GlutDrawManager::Instance()->InstallDrawer(drawer); drawer->SetMouseHandler(mouse_handler); drawer->SetChain(chains,num_chains); drawer->SetKeyHandler(key_handler); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow("ik"); glutDisplayFunc(GlutDrawManager::Draw); glutMouseFunc(GlutMouseManager::Mouse); glutMotionFunc(GlutMouseManager::Motion); glutKeyboardFunc(GlutKeyboardManager::HandleKeyboard); init(MT_Vector3(-50,-50,-50),MT_Vector3(50,50,50)); glutMainLoop(); return 0; /* ANSI C requires main to return int. */ }