#pragma once #include #include #include #include #include #include #include class SimplificationMethod { private: Geometry::Mesh *mGeoMesh; void compute_pair_info(qslim::pair_info*); qslim::Model M0; qslim::array vinfo; qslim::Heap *heap; qslim::real proximity_limit; // distance threshold squared int initialVertCount; int initialEdgeCount; int initialFaceCount; inline qslim::vert_info& vertex_info(qslim::Vertex *v){ return vinfo(v->validID()); } qslim::real pair_mesh_penalty(qslim::Model& M, qslim::Vertex *v1, qslim::Vertex *v2, qslim::Vec3& vnew); int predict_face(qslim::Face& F, qslim::Vertex *v1, qslim::Vertex *v2, qslim::Vec3& vnew, qslim::Vec3& f1, qslim::Vec3& f2, qslim::Vec3& f3); bool check_for_pair(qslim::Vertex *v0, qslim::Vertex *v1); qslim::pair_info *new_pair(qslim::Vertex *v0, qslim::Vertex *v1); void delete_pair(qslim::pair_info *pair); void do_contract(qslim::Model& m, qslim::pair_info *pair); bool decimate_quadric(qslim::Vertex *v, qslim::Mat4& Q); void decimate_contract(qslim::Model& m); qslim::real decimate_error(qslim::Vertex *v); qslim::real decimate_min_error(); qslim::real decimate_max_error(qslim::Model& m); void decimate_init(qslim::Model& m, qslim::real limit); bool pair_is_valid(qslim::Vertex *u, qslim::Vertex *v); void simplifmethod_run(int, Geometry::TIPOFUNC upb=0); void simplifmethod_runv(int, Geometry::TIPOFUNC upb=0); void simplifmethod_init(void); //To map the mesh with de simplification method structure std::map > submeshmap; //submeshes which pertains each vertex std::map > vertexbuffermap; //vertices of the VertexBuffer that point at this vertex of the simplification method //simplification sequence of the simplification method std::vector decim_data; std::string meshName; void WriteOBJ(void); unsigned int *first_index_submesh; //std::vector pointers_to_remove; int indexMeshLeaves; public: const Geometry::Mesh *objmesh; int number_of_triangles; //total number of triangles of all the submeshes SimplificationMethod(const Geometry::Mesh *m); void geomesh2simplifModel(void); Geometry::MeshSimplificationSequence *Decimate(float lod, int simpliftype,Geometry::TIPOFUNC upb=0); void setMeshLeaves(int meshLeaves); // Gets mesh simplified. Geometry::Mesh * GetMesh(); ///Destructor ~SimplificationMethod(); };