in d3d/archive/images/d3d11/tessellator.cpp [1289:1376]
void CHWTessellator::TriGenerateConnectivity( const PROCESSED_TESS_FACTORS_TRI& processedTessFactors )
{
// Generate primitives for all the concentric rings, one side at a time for each ring
static const int startRing = 1;
int numRings = ((processedTessFactors.numPointsForInsideTessFactor+1) >> 1); // +1 is so even tess includes the center point, which we want to now
const TESS_FACTOR_CONTEXT* outsideTessFactorCtx[TRI_EDGES] = {&processedTessFactors.outsideTessFactorCtx[Ueq0],
&processedTessFactors.outsideTessFactorCtx[Veq0],
&processedTessFactors.outsideTessFactorCtx[Weq0]};
TESSELLATOR_PARITY outsideTessFactorParity[TRI_EDGES] = {processedTessFactors.outsideTessFactorParity[Ueq0],
processedTessFactors.outsideTessFactorParity[Veq0],
processedTessFactors.outsideTessFactorParity[Weq0]};
int numPointsForOutsideEdge[TRI_EDGES] = {processedTessFactors.numPointsForOutsideEdge[Ueq0],
processedTessFactors.numPointsForOutsideEdge[Veq0],
processedTessFactors.numPointsForOutsideEdge[Weq0]};
int insideEdgePointBaseOffset = processedTessFactors.insideEdgePointBaseOffset;
int outsideEdgePointBaseOffset = 0;
int edge;
for(int ring = startRing; ring < numRings; ring++)
{
int numPointsForInsideEdge = processedTessFactors.numPointsForInsideTessFactor - 2*ring;
int edge0InsidePointBaseOffset = insideEdgePointBaseOffset;
int edge0OutsidePointBaseOffset = outsideEdgePointBaseOffset;
for(edge = 0; edge < TRI_EDGES; edge++ )
{
int numTriangles = numPointsForInsideEdge + numPointsForOutsideEdge[edge] - 2;
int insideBaseOffset;
int outsideBaseOffset;
if( edge == 2 )
{
m_IndexPatchContext.insidePointIndexDeltaToRealValue = insideEdgePointBaseOffset;
m_IndexPatchContext.insidePointIndexBadValue = numPointsForInsideEdge - 1;
m_IndexPatchContext.insidePointIndexReplacementValue = edge0InsidePointBaseOffset;
m_IndexPatchContext.outsidePointIndexPatchBase = m_IndexPatchContext.insidePointIndexBadValue+1; // past inside patched index range
m_IndexPatchContext.outsidePointIndexDeltaToRealValue = outsideEdgePointBaseOffset
- m_IndexPatchContext.outsidePointIndexPatchBase;
m_IndexPatchContext.outsidePointIndexBadValue = m_IndexPatchContext.outsidePointIndexPatchBase
+ numPointsForOutsideEdge[edge] - 1;
m_IndexPatchContext.outsidePointIndexReplacementValue = edge0OutsidePointBaseOffset;
SetUsingPatchedIndices(true);
insideBaseOffset = 0;
outsideBaseOffset = m_IndexPatchContext.outsidePointIndexPatchBase;
}
else
{
insideBaseOffset = insideEdgePointBaseOffset;
outsideBaseOffset = outsideEdgePointBaseOffset;
}
if( ring == startRing )
{
StitchTransition(/*baseIndexOffset: */m_NumIndices,
insideBaseOffset,processedTessFactors.insideTessFactorCtx.numHalfTessFactorPoints,processedTessFactors.insideTessFactorParity,
outsideBaseOffset,outsideTessFactorCtx[edge]->numHalfTessFactorPoints,outsideTessFactorParity[edge]);
}
else
{
StitchRegular(/*bTrapezoid*/true, DIAGONALS_MIRRORED,
/*baseIndexOffset: */m_NumIndices,
numPointsForInsideEdge,
insideBaseOffset,outsideBaseOffset);
}
if( 2 == edge )
{
SetUsingPatchedIndices(false);
}
m_NumIndices += numTriangles*3;
outsideEdgePointBaseOffset += numPointsForOutsideEdge[edge] - 1;
insideEdgePointBaseOffset += numPointsForInsideEdge - 1;
numPointsForOutsideEdge[edge] = numPointsForInsideEdge;
}
if( startRing == ring )
{
for(edge = 0; edge < TRI_EDGES; edge++ )
{
outsideTessFactorCtx[edge] = &processedTessFactors.insideTessFactorCtx;
outsideTessFactorParity[edge] = processedTessFactors.insideTessFactorParity;
}
}
}
if( Odd() )
{
// Triangulate center (a single triangle)
DefineClockwiseTriangle(outsideEdgePointBaseOffset, outsideEdgePointBaseOffset+1, outsideEdgePointBaseOffset+2,
m_NumIndices);
m_NumIndices += 3;
}
}