Code: Select all
int
r_p0[6]
, r_p1[6]
, r_p2[6]
;
typedef struct
{
int
isflattop
, numleftedges
// each edgevert can be either r_p0, r_p1 or r_p2
, * pleftedgevert0
, * pleftedgevert1
, * pleftedgevert2
, numrightedges
, * prightedgevert0
, * prightedgevert1
, * prightedgevert2
;
} edgetable;
static edgetable
* pedgetable
, edgetables[12] =
{
{0, 1, r_p0, r_p2, NULL, 2, r_p0, r_p1, r_p2}
, {0, 2, r_p1, r_p0, r_p2, 1, r_p1, r_p2, NULL}
, {1, 1, r_p0, r_p2, NULL, 1, r_p1, r_p2, NULL}
, {0, 1, r_p1, r_p0, NULL, 2, r_p1, r_p2, r_p0}
, {0, 2, r_p0, r_p2, r_p1, 1, r_p0, r_p1, NULL}
, {0, 1, r_p2, r_p1, NULL, 1, r_p2, r_p0, NULL}
, {0, 1, r_p2, r_p1, NULL, 2, r_p2, r_p0, r_p1}
, {0, 2, r_p2, r_p1, r_p0, 1, r_p2, r_p0, NULL}
, {0, 1, r_p1, r_p0, NULL, 1, r_p1, r_p2, NULL}
, {1, 1, r_p2, r_p1, NULL, 1, r_p0, r_p1, NULL}
, {1, 1, r_p1, r_p0, NULL, 1, r_p2, r_p0, NULL}
, {0, 1, r_p0, r_p2, NULL, 1, r_p0, r_p1, NULL}
}
;
[...]
void D_PolysetSetEdgeTable (void)
{
int
edgetableindex = 0 // assume the vertices are already in top to bottom order
;
//
// determine which edges are right & left, and the order in which to rasterize them
//
if (r_p0[1] >= r_p1[1]) // vertex 0 is above or on the same height of vertex 1
{
if (r_p0[1] == r_p1[1]) // vertexes 0 and 1 are on the same height
{
pedgetable = &edgetables[ (r_p0[1] < r_p2[1]) ? 2 : 5]; // if both are lower than vertex 2, set the index to 2; otherwise, 5
return;
}
edgetableindex = 1; // if vertex 0 is above vertex 1, set the index to 1
}
if (r_p0[1] == r_p2[1])
{
pedgetable = &edgetables[9 - edgetableindex];
return;
}
if (r_p1[1] == r_p2[1])
{
pedgetable = &edgetables[11 - edgetableindex];
return;
}
if (r_p0[1] > r_p2[1])
edgetableindex += 2;
if (r_p1[1] > r_p2[1])
edgetableindex += 4;
pedgetable = &edgetables[edgetableindex];
}
void D_PolysetDraw_C (void) // mankrip - edited
{
[...]
r_p0[0] = index0->v[0]; // u
r_p0[1] = index0->v[1]; // v
r_p0[2] = index0->v[2]; // s
r_p0[3] = index0->v[3]; // t
r_p0[4] = index0->v[4]; // light
r_p0[5] = index0->v[5]; // iz
[...]
D_PolysetSetEdgeTable ();
D_RasterizeAliasPolySmooth ();
}
I've added some more comments, but they're just guesses.
What does D_PolysetSetEdgeTable do, exactly? Why does it only use the v axis (index 1) of each vertex?
After that, pedgetable is used by D_RasterizeAliasPolySmooth a number of times, and that's it. I'm afraid I won't be able to understand D_RasterizeAliasPolySmooth if I don't understand D_PolysetSetEdgeTable first.