void createShape(int type) { cleanup(); createGeometry(type, &geometry, uTessellation, uTessellation); createIndices(&geometry, uTessellation, uTessellation); createNormals(type, &geometry, uTessellation, uTessellation); }
Mesh::Mesh(string filename, bool ccw): mRot(0,0,0), mPos(0,0,0), mAABB(BVL_SIZE(BVL)), mAABBTriangles(BVL_SIZE(BVL)), mSphere(BVL_SIZE(BVL)), mSphereTriangles(BVL_SIZE(BVL)) { clock_t t = clock(); loadObj(filename, mVertices, mTriangles, ccw); createTriangleLists(); createBoundingVolHierarchy(); centerAlign(); createNormals(); calculateVolume(); printf ("Mesh loading took:\t%4.2f sec | %d triangles \n", ((float)clock()-t)/CLOCKS_PER_SEC, mTriangles.size()); for (int blevel=0; blevel<=BVL; blevel++) printf("Coverage Level %d: AABB %4.2f%%, Sphere %4.2f%% \n", blevel, 100*AABBCover[blevel], 100*sphereCover[blevel]); }
void Mesh::simplify(int percent) { /* Set these pointers */ TriangleCost::tVec = &mTriangles; TriangleCost::nVec = &mVertexNormals; TriangleCost::sVec = &mVertexTriangles; clock_t t = clock(); list<TriangleCost> procList; // List of candidate triangles for collapse list<TriangleCost>::iterator pli; // Iterator for the list above int ti, tx; // Indices of current triangles proccessed /* Populate triangle list with all the triangles and sort it */ pli = procList.begin(); for (ti=0; ti < mTriangles.size(); ++ti) pli = procList.insert(pli, TriangleCost(ti, true)); procList.sort(); int desiredRemovals = mTriangles.size()*(100-percent)/100; int removals = 0; /* Do the proccessing */ while (procList.size() > 10 && removals < desiredRemovals) { /*0. Pick the next triangle for removal */ ti = procList.begin()->index; if (mTriangles[ti].deleted){ procList.erase(procList.begin()); continue; } /*1. Pick two vertices that will form the collapsing edge */ int vk = mTriangles[ti].vi1; // Vertex we keep of the collapsing edge int vx = mTriangles[ti].vi2; // Vertex we discard of the collapsing edge set<int> &vkList = mVertexTriangles[vk]; // Reference to vertex's Vk triangle list set<int> &vxList = mVertexTriangles[vx]; // Reference to vertex's Vx triangle list set<int>::iterator vkLi, vxLi; // Iterators for vertex triangle lists /*2. Find the second triangle, apart ti, with edge [vk,vx]=tx */ vxLi = vxList.begin(); vkLi = vkList.begin(); tx = -1; while (vxLi != vxList.end() && vkLi != vkList.end()) { if (*vxLi < *vkLi) ++vxLi; else if (*vxLi > *vkLi) ++vkLi; else { if (*vxLi == ti) { ++vxLi; ++vkLi; } else { tx = *vxLi; break; }} } if (tx==-1 || mTriangles[tx].deleted) { procList.erase(procList.begin()); continue; } /*3. Delete the triangles of the collapsing edge */ mTriangles[ti].deleted = 1; mTriangles[tx].deleted = 1; /*5. Update the affected triangles' vertices */ for (vxLi = vxList.begin(); vxLi != vxList.end(); ++vxLi) { if (!mTriangles[*vxLi].deleted) { if (mTriangles[*vxLi].vi1==vx) mTriangles[*vxLi].vi1 = vk; else if (mTriangles[*vxLi].vi2==vx) mTriangles[*vxLi].vi2 = vk; else if (mTriangles[*vxLi].vi3==vx) mTriangles[*vxLi].vi3 = vk; } } /* Place the new vertex in the middle of the collapsed edge */ mVertices[vk] = Point(mVertices[vk]).add(mVertices[vx]).scale(0.5); /*6. Move the triangle list of the discarded vertex to the one we keeped */ vkList.insert(vxList.begin(), vxList.end()); vxList.clear(); vkList.erase(ti); vkList.erase(tx); /* 7. Remove all the triangles of this area of the process list */ procList.erase(procList.begin()); // Faster way for: procList.remove(ti); procList.remove(tx); for (vkLi = vkList.begin(); vkLi != vkList.end(); ++vkLi) { procList.remove(*vkLi); } //procList.sort(); // Won't improve quality, so dont do it. removals += 2; } /* Clean up the data structures holding the model data */ int from, to; for (from=0; from < mTriangles.size(); ) { if (mTriangles[from].deleted) { for (to=from; to+1<mTriangles.size() && mTriangles[to+1].deleted ; ++to); mTriangles.erase(mTriangles.begin()+from, mTriangles.begin()+to+1); } else ++from; } createTriangleLists(); updateTriangleData(); createNormals(); createBoundingVolHierarchy(); printf ("Mesh reduction took:\t%4.2f sec | %d triangles \n", ((float)clock()-t)/CLOCKS_PER_SEC, mTriangles.size()); }