in d3d/archive/images/d3d11/tessellator.cpp [1399:1485]
void CHWTessellator::IsoLineProcessTessFactors( float TessFactor_V_LineDensity, float TessFactor_U_LineDetail,
PROCESSED_TESS_FACTORS_ISOLINE& processedTessFactors )
{
// Is the patch culled?
if( !(TessFactor_V_LineDensity > 0) || // NaN will pass
!(TessFactor_U_LineDetail > 0) )
{
processedTessFactors.bPatchCulled = true;
return;
}
else
{
processedTessFactors.bPatchCulled = false;
}
// Clamp edge TessFactors
float lowerBound, upperBound;
switch(m_originalPartitioning)
{
case D3D11_TESSELLATOR_PARTITIONING_INTEGER:
case D3D11_TESSELLATOR_PARTITIONING_POW2: // don�t care about pow2 distinction for validation, just treat as integer
lowerBound = D3D11_TESSELLATOR_MIN_ODD_TESSELLATION_FACTOR;
upperBound = D3D11_TESSELLATOR_MAX_EVEN_TESSELLATION_FACTOR;
break;
case D3D11_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN:
lowerBound = D3D11_TESSELLATOR_MIN_EVEN_TESSELLATION_FACTOR;
upperBound = D3D11_TESSELLATOR_MAX_EVEN_TESSELLATION_FACTOR;
break;
case D3D11_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD:
lowerBound = D3D11_TESSELLATOR_MIN_ODD_TESSELLATION_FACTOR;
upperBound = D3D11_TESSELLATOR_MAX_ODD_TESSELLATION_FACTOR;
break;
}
TessFactor_V_LineDensity = fmin( D3D11_TESSELLATOR_MAX_ISOLINE_DENSITY_TESSELLATION_FACTOR,
fmax( D3D11_TESSELLATOR_MIN_ISOLINE_DENSITY_TESSELLATION_FACTOR, TessFactor_V_LineDensity ) );
TessFactor_U_LineDetail = fmin( upperBound, fmax( lowerBound, TessFactor_U_LineDetail ) );
// Reset our vertex and index buffers. We have enough storage for the max tessFactor.
m_NumPoints = 0;
m_NumIndices = 0;
// Process tessFactors
if( HWIntegerPartitioning() )
{
TessFactor_U_LineDetail = ceil(TessFactor_U_LineDetail);
processedTessFactors.lineDetailParity = isEven(TessFactor_U_LineDetail) ? TESSELLATOR_PARITY_EVEN : TESSELLATOR_PARITY_ODD;
}
else
{
processedTessFactors.lineDetailParity = m_originalParity;
}
FXP fxpTessFactor_U_LineDetail = floatToFixed(TessFactor_U_LineDetail);
SetTessellationParity(processedTessFactors.lineDetailParity);
ComputeTessFactorContext(fxpTessFactor_U_LineDetail, processedTessFactors.lineDetailTessFactorCtx);
processedTessFactors.numPointsPerLine = NumPointsForTessFactor(fxpTessFactor_U_LineDetail);
OverridePartitioning(D3D11_TESSELLATOR_PARTITIONING_INTEGER);
TessFactor_V_LineDensity = ceil(TessFactor_V_LineDensity);
processedTessFactors.lineDensityParity = isEven(TessFactor_V_LineDensity) ? TESSELLATOR_PARITY_EVEN : TESSELLATOR_PARITY_ODD;
SetTessellationParity(processedTessFactors.lineDensityParity);
FXP fxpTessFactor_V_LineDensity = floatToFixed(TessFactor_V_LineDensity);
ComputeTessFactorContext(fxpTessFactor_V_LineDensity, processedTessFactors.lineDensityTessFactorCtx);
processedTessFactors.numLines = NumPointsForTessFactor(fxpTessFactor_V_LineDensity) - 1; // don't draw last line at V == 1.
RestorePartitioning();
// Compute some initial data.
// outside edge offsets
m_NumPoints = processedTessFactors.numPointsPerLine * processedTessFactors.numLines;
if( m_outputPrimitive == D3D11_TESSELLATOR_OUTPUT_POINT )
{
m_NumIndices = m_NumPoints;
}
else // line
{
m_NumIndices = processedTessFactors.numLines*(processedTessFactors.numPointsPerLine-1)*2;
}
}