Game Development Reference

In-Depth Information

The
ReducePolygons
function creates an array of quadric pairs using

the
CreateValidPairsArray
function and then calculates the optimum

location for the contraction target using
CalculateVDash
. At this stage, the

list of QUADRICPAIRS is sorted into a new list based on the calculated

error. Then the function enters a loop where an edge is removed at each

iteration until the target polygon total is achieved. The removal of an edge

may delete one or more polygons. The
RemoveEdge
function returns the

number of polygons that have been removed from the mesh. When a

vertex is removed, we set the valid flag for the quadric with the same

index to false to indicate that it is no longer used in the target mesh. On

completion of the algorithm, we must tidy up the data, because we have

a vertex list that now contains gaps indicated by the invalid flag. The

function call
StreamlineMesh
takes the quadric list and recreates a mesh

based on the current state of the vertex list.

BOOL CToon3DObject::ReducePolygons(int polyTotal){

if (polyTotal >= oi.numpoints) return FALSE;

if (morph) usemorph = FALSE;

//Save original mesh data so we can restore the original

if (pi.numpoints==0) CreatePatchInfo();

CQuadric *q = new CQuadric[oi.numpoints], k;

if (!q) return FALSE;

POLYGON *ply;

int i, j, n, pTotal, qpTotal, count, vTotal;

QUADRICPAIR *qp = NULL, *qparray;

//Calculate the Quadric matrices for each vertex

for (int ptindex=0; ptindex < oi.numpoints; ptindex++){

ply = oi.plys;

q[ptindex].SetVertex(oi.pts[ptindex]);

for(i=0; i<oi.numpolygons; i++){

if (ply->p[0] == ptindex || ply->p[1] == ptindex ||

ply->p[2] == ptindex || ply->p[3] == ptindex){

k.CreateFromPoints(oi.pts[ply->p[0]],

oi.pts[ply->p[1]],

oi.pts[ply->p[2]]);

q[ptindex]+=k;

}

ply++;

}

Search Nedrilad ::

Custom Search