📄 s_tritemp.h
字号:
if (setupRight && eRight->lines>0) {
#if TRIANGLE_WALK_DOUBLE
fxRightEdge = eRight->fsx;
fdxRightEdge = eRight->dxdy;
#else
fxRightEdge = eRight->fsx - FIXED_EPSILON;
fdxRightEdge = eRight->fdxdy;
#endif
}
if (lines==0) {
continue;
}
/* Rasterize setup */
#ifdef PIXEL_ADDRESS
dPRowInner = dPRowOuter + sizeof(PIXEL_TYPE);
#endif
#ifdef INTERP_Z
# ifdef DEPTH_TYPE
dZRowInner = dZRowOuter + sizeof(DEPTH_TYPE);
# endif
fdzInner = fdzOuter + span.zStep;
#endif
#ifdef INTERP_W
dwInner = dwOuter + span.dwdx;
#endif
#ifdef INTERP_FOG
dfogInner = dfogOuter + span.dfogdx;
#endif
#ifdef INTERP_RGB
fdrInner = fdrOuter + span.redStep;
fdgInner = fdgOuter + span.greenStep;
fdbInner = fdbOuter + span.blueStep;
#endif
#ifdef INTERP_ALPHA
fdaInner = fdaOuter + span.alphaStep;
#endif
#ifdef INTERP_SPEC
dsrInner = dsrOuter + span.specRedStep;
dsgInner = dsgOuter + span.specGreenStep;
dsbInner = dsbOuter + span.specBlueStep;
#endif
#ifdef INTERP_INDEX
diInner = diOuter + span.indexStep;
#endif
#ifdef INTERP_INT_TEX
dsInner = dsOuter + span.intTexStep[0];
dtInner = dtOuter + span.intTexStep[1];
#endif
#ifdef INTERP_TEX
TEX_UNIT_LOOP(
dsInner[u] = dsOuter[u] + span.texStepX[u][0];
dtInner[u] = dtOuter[u] + span.texStepX[u][1];
duInner[u] = duOuter[u] + span.texStepX[u][2];
dvInner[u] = dvOuter[u] + span.texStepX[u][3];
)
#endif
while (lines > 0) {
/* initialize the span interpolants to the leftmost value */
/* ff = fixed-pt fragment */
const GLint right = InterpToInt(fxRightEdge);
span.x = InterpToInt(fxLeftEdge);
if (right <= span.x)
span.end = 0;
else
span.end = right - span.x;
#ifdef INTERP_Z
span.z = zLeft;
#endif
#ifdef INTERP_W
span.w = wLeft;
#endif
#ifdef INTERP_FOG
span.fog = fogLeft;
#endif
#ifdef INTERP_RGB
span.red = rLeft;
span.green = gLeft;
span.blue = bLeft;
#endif
#ifdef INTERP_ALPHA
span.alpha = aLeft;
#endif
#ifdef INTERP_SPEC
span.specRed = srLeft;
span.specGreen = sgLeft;
span.specBlue = sbLeft;
#endif
#ifdef INTERP_INDEX
span.index = iLeft;
#endif
#ifdef INTERP_INT_TEX
span.intTex[0] = sLeft;
span.intTex[1] = tLeft;
#endif
#ifdef INTERP_TEX
TEX_UNIT_LOOP(
span.tex[u][0] = sLeft[u];
span.tex[u][1] = tLeft[u];
span.tex[u][2] = uLeft[u];
span.tex[u][3] = vLeft[u];
)
#endif
if (span.end > 1) {
/* Under rare circumstances, we might have to fudge the
* colors. XXX does this really happen anymore???
*/
const GLint len = span.end - 1;
(void) len;
#ifdef INTERP_RGB
{
GLfixed ffrend = span.red + len * span.redStep;
GLfixed ffgend = span.green + len * span.greenStep;
GLfixed ffbend = span.blue + len * span.blueStep;
if (ffrend < 0) {
span.red -= ffrend;
if (span.red < 0)
span.red = 0;
}
if (ffgend < 0) {
span.green -= ffgend;
if (span.green < 0)
span.green = 0;
}
if (ffbend < 0) {
span.blue -= ffbend;
if (span.blue < 0)
span.blue = 0;
}
}
#endif
#ifdef INTERP_ALPHA
{
GLfixed ffaend = span.alpha + len * span.alphaStep;
if (ffaend < 0) {
span.alpha -= ffaend;
if (span.alpha < 0)
span.alpha = 0;
}
}
#endif
#ifdef INTERP_SPEC
{
GLfixed ffsrend = span.specRed + len * span.specRedStep;
GLfixed ffsgend = span.specGreen + len * span.specGreenStep;
GLfixed ffsbend = span.specBlue + len * span.specBlueStep;
if (ffsrend < 0) {
span.specRed -= ffsrend;
if (span.specRed < 0)
span.specRed = 0;
}
if (ffsgend < 0) {
span.specGreen -= ffsgend;
if (span.specGreen < 0)
span.specGreen = 0;
}
if (ffsbend < 0) {
span.specBlue -= ffsbend;
if (span.specBlue < 0)
span.specBlue = 0;
}
}
#endif
#ifdef INTERP_INDEX
if (span.index < 0)
span.index = 0;
#endif
} /* span.end > 1 */
/* This is where we actually generate fragments */
/* XXX the test for span.y > 0 _shouldn't_ be needed but
* it fixes a problem on 64-bit Opterons (bug 4842).
*/
if (span.end > 0 && span.y >= 0) {
RENDER_SPAN( span );
}
/*
* Advance to the next scan line. Compute the
* new edge coordinates, and adjust the
* pixel-center x coordinate so that it stays
* on or inside the major edge.
*/
span.y++;
lines--;
fxLeftEdge += fdxLeftEdge;
fxRightEdge += fdxRightEdge;
fError += fdError;
if (fError >= 0) {
fError -= INTERP_ONE;
#ifdef PIXEL_ADDRESS
pRow = (PIXEL_TYPE *) ((GLubyte *) pRow + dPRowOuter);
#endif
#ifdef INTERP_Z
# ifdef DEPTH_TYPE
zRow = (DEPTH_TYPE *) ((GLubyte *) zRow + dZRowOuter);
# endif
zLeft += fdzOuter;
#endif
#ifdef INTERP_W
wLeft += dwOuter;
#endif
#ifdef INTERP_FOG
fogLeft += dfogOuter;
#endif
#ifdef INTERP_RGB
rLeft += fdrOuter;
gLeft += fdgOuter;
bLeft += fdbOuter;
#endif
#ifdef INTERP_ALPHA
aLeft += fdaOuter;
#endif
#ifdef INTERP_SPEC
srLeft += dsrOuter;
sgLeft += dsgOuter;
sbLeft += dsbOuter;
#endif
#ifdef INTERP_INDEX
iLeft += diOuter;
#endif
#ifdef INTERP_INT_TEX
sLeft += dsOuter;
tLeft += dtOuter;
#endif
#ifdef INTERP_TEX
TEX_UNIT_LOOP(
sLeft[u] += dsOuter[u];
tLeft[u] += dtOuter[u];
uLeft[u] += duOuter[u];
vLeft[u] += dvOuter[u];
)
#endif
}
else {
#ifdef PIXEL_ADDRESS
pRow = (PIXEL_TYPE *) ((GLubyte *) pRow + dPRowInner);
#endif
#ifdef INTERP_Z
# ifdef DEPTH_TYPE
zRow = (DEPTH_TYPE *) ((GLubyte *) zRow + dZRowInner);
# endif
zLeft += fdzInner;
#endif
#ifdef INTERP_W
wLeft += dwInner;
#endif
#ifdef INTERP_FOG
fogLeft += dfogInner;
#endif
#ifdef INTERP_RGB
rLeft += fdrInner;
gLeft += fdgInner;
bLeft += fdbInner;
#endif
#ifdef INTERP_ALPHA
aLeft += fdaInner;
#endif
#ifdef INTERP_SPEC
srLeft += dsrInner;
sgLeft += dsgInner;
sbLeft += dsbInner;
#endif
#ifdef INTERP_INDEX
iLeft += diInner;
#endif
#ifdef INTERP_INT_TEX
sLeft += dsInner;
tLeft += dtInner;
#endif
#ifdef INTERP_TEX
TEX_UNIT_LOOP(
sLeft[u] += dsInner[u];
tLeft[u] += dtInner[u];
uLeft[u] += duInner[u];
vLeft[u] += dvInner[u];
)
#endif
}
} /*while lines>0*/
} /* for subTriangle */
}
#ifdef CLEANUP_CODE
CLEANUP_CODE
#endif
}
}
#undef SETUP_CODE
#undef CLEANUP_CODE
#undef RENDER_SPAN
#undef PIXEL_TYPE
#undef BYTES_PER_ROW
#undef PIXEL_ADDRESS
#undef DEPTH_TYPE
#undef INTERP_Z
#undef INTERP_W
#undef INTERP_FOG
#undef INTERP_RGB
#undef INTERP_ALPHA
#undef INTERP_SPEC
#undef INTERP_INDEX
#undef INTERP_INT_TEX
#undef INTERP_TEX
#undef INTERP_MULTITEX
#undef TEX_UNIT_LOOP
#undef S_SCALE
#undef T_SCALE
#undef FixedToDepth
#undef ColorTemp
#undef GLinterp
#undef InterpToInt
#undef INTERP_ONE
#undef NAME
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -