Game Development Reference
In-Depth Information
At this stage we have all the information we need to apply modified
butterfly subdivision. The purpose of subdivision is to add polygons to the
mesh, so we include a utility function for this purpose. This function is
passed a reference to the new polygon and sets the vertex indices and
texture coordinates. Texture coordinates are calculated as simply the mid-
point of an edge. If the end-points of the edge have texture coordinates
tc 1 and tc 2 then the mid-point for this edge will have texture
coordinates:
u =( tc 1 * u + tc 2 * u )/2
v =( tc 1 * v + tc 2 * v )/2
These coordinates are calculated by the caller to the CreatePolygon
function.
BOOL CT3DObject::CreatePolygon(POLYGON &sdply, int srfID,
int v1, int v2, int v3, TEXVEC &tv1, TEXVEC &tv2, TEXVEC &tv3){
sdply.numverts = 3;
sdply.p[0] = v1;
sdply.p[1] = v2;
sdply.p[2] = v3;
sdply.srf = srfID;
if (oi.srfs[srfID].tex){
sdply.tc[0].u = tv1.u;
sdply.tc[0].v = tv1.v;
sdply.tc[1].u = tv2.u;
sdply.tc[1].v = tv2.v;
sdply.tc[2].u = tv3.u;
sdply.tc[2].v = tv3.v;
}else{
memset(sdply.tc, 0, sizeof(TEXVEC)*3);
}
return TRUE;
}
The actual function call to subdivide a mesh iterates through all the
polygons in the mesh and replaces a single polygon with four polygons.
The first step in creating the new polygons is to add the three edges in the
triangle to an edge array. This is achieved using the AdgeEdge function
call, which has seven parameters.
int CT3DObject:: AddEdge (EDGE * edges , POINT3D * pts , POINTCON * con ,
int & pointcount , int & edgecount , int v1 , int v2 )