Exemplo n.º 1
0
void createShape(int type)
{
    cleanup();
    createGeometry(type, &geometry, uTessellation, uTessellation);
    createIndices(&geometry, uTessellation, uTessellation);
    createNormals(type, &geometry, uTessellation, uTessellation);
}
Exemplo n.º 2
0
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]);

}
Exemplo n.º 3
0
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());
}