in d3d/archive/images/d3d11/tessellator.cpp [1812:1894]
void CHWTessellator::StitchRegular(bool bTrapezoid,DIAGONALS diagonals,
int baseIndexOffset, int numInsideEdgePoints,
int insideEdgePointBaseOffset, int outsideEdgePointBaseOffset)
{
int insidePoint = insideEdgePointBaseOffset;
int outsidePoint = outsideEdgePointBaseOffset;
if( bTrapezoid )
{
DefineClockwiseTriangle(outsidePoint,outsidePoint+1,insidePoint,baseIndexOffset);
baseIndexOffset += 3; outsidePoint++;
}
int p;
switch( diagonals )
{
case DIAGONALS_INSIDE_TO_OUTSIDE:
// Diagonals pointing from inside edge forward towards outside edge
for( p = 0; p < numInsideEdgePoints-1; p++ )
{
DefineClockwiseTriangle(insidePoint,outsidePoint,outsidePoint+1,baseIndexOffset);
baseIndexOffset += 3;
DefineClockwiseTriangle(insidePoint,outsidePoint+1,insidePoint+1,baseIndexOffset);
baseIndexOffset += 3;
insidePoint++; outsidePoint++;
}
break;
case DIAGONALS_INSIDE_TO_OUTSIDE_EXCEPT_MIDDLE: // Assumes ODD tessellation
// Diagonals pointing from outside edge forward towards inside edge
// First half
for( p = 0; p < numInsideEdgePoints/2-1; p++ )
{
DefineClockwiseTriangle(outsidePoint,outsidePoint+1,insidePoint,baseIndexOffset);
baseIndexOffset += 3;
DefineClockwiseTriangle(insidePoint,outsidePoint+1,insidePoint+1,baseIndexOffset);
baseIndexOffset += 3;
insidePoint++; outsidePoint++;
}
// Middle
DefineClockwiseTriangle(outsidePoint,insidePoint+1,insidePoint,baseIndexOffset);
baseIndexOffset += 3;
DefineClockwiseTriangle(outsidePoint,outsidePoint+1,insidePoint+1,baseIndexOffset);
baseIndexOffset += 3;
insidePoint++; outsidePoint++; p+=2;
// Second half
for( ; p < numInsideEdgePoints; p++ )
{
DefineClockwiseTriangle(outsidePoint,outsidePoint+1,insidePoint,baseIndexOffset);
baseIndexOffset += 3;
DefineClockwiseTriangle(insidePoint,outsidePoint+1,insidePoint+1,baseIndexOffset);
baseIndexOffset += 3;
insidePoint++; outsidePoint++;
}
break;
case DIAGONALS_MIRRORED:
// First half, diagonals pointing from outside of outside edge to inside of inside edge
for( p = 0; p < numInsideEdgePoints/2; p++ )
{
DefineClockwiseTriangle(outsidePoint,insidePoint+1,insidePoint,baseIndexOffset);
baseIndexOffset += 3;
DefineClockwiseTriangle(outsidePoint,outsidePoint+1,insidePoint+1,baseIndexOffset);
baseIndexOffset += 3;
insidePoint++; outsidePoint++;
}
// Second half, diagonals pointing from inside of inside edge to outside of outside edge
for( ; p < numInsideEdgePoints-1; p++ )
{
DefineClockwiseTriangle(insidePoint,outsidePoint,outsidePoint+1,baseIndexOffset);
baseIndexOffset += 3;
DefineClockwiseTriangle(insidePoint,outsidePoint+1,insidePoint+1,baseIndexOffset);
baseIndexOffset += 3;
insidePoint++; outsidePoint++;
}
break;
}
if( bTrapezoid )
{
DefineClockwiseTriangle(outsidePoint,outsidePoint+1,insidePoint,baseIndexOffset);
baseIndexOffset += 3;
}
}