📄 s_tritemp.h
字号:
diOuter = SignedFloatToFixed(didy + dxOuter * didx); } else { ASSERT(ctx->Light.ShadeModel == GL_FLAT); iLeft = FloatToFixed(v2->index); diOuter = 0; }#endif#ifdef INTERP_INT_TEX { GLfloat s0, t0; s0 = vLower->texcoord[0][0] * S_SCALE; sLeft = (GLfixed)(s0 * FIXED_SCALE + span.texStepX[0][0] * adjx + span.texStepY[0][0] * adjy) + FIXED_HALF; dsOuter = SignedFloatToFixed(span.texStepY[0][0] + dxOuter * span.texStepX[0][0]); t0 = vLower->texcoord[0][1] * T_SCALE; tLeft = (GLfixed)(t0 * FIXED_SCALE + span.texStepX[0][1] * adjx + span.texStepY[0][1] * adjy) + FIXED_HALF; dtOuter = SignedFloatToFixed(span.texStepY[0][1] + dxOuter * span.texStepX[0][1]); }#endif#ifdef INTERP_TEX TEX_UNIT_LOOP( const GLfloat invW = vLower->win[3]; const GLfloat s0 = vLower->texcoord[u][0] * invW; const GLfloat t0 = vLower->texcoord[u][1] * invW; const GLfloat u0 = vLower->texcoord[u][2] * invW; const GLfloat v0 = vLower->texcoord[u][3] * invW; sLeft[u] = s0 + (span.texStepX[u][0] * adjx + span.texStepY[u][0] * adjy) * (1.0F/FIXED_SCALE); tLeft[u] = t0 + (span.texStepX[u][1] * adjx + span.texStepY[u][1] * adjy) * (1.0F/FIXED_SCALE); uLeft[u] = u0 + (span.texStepX[u][2] * adjx + span.texStepY[u][2] * adjy) * (1.0F/FIXED_SCALE); vLeft[u] = v0 + (span.texStepX[u][3] * adjx + span.texStepY[u][3] * adjy) * (1.0F/FIXED_SCALE); dsOuter[u] = span.texStepY[u][0] + dxOuter * span.texStepX[u][0]; dtOuter[u] = span.texStepY[u][1] + dxOuter * span.texStepX[u][1]; duOuter[u] = span.texStepY[u][2] + dxOuter * span.texStepX[u][2]; dvOuter[u] = span.texStepY[u][3] + dxOuter * span.texStepX[u][3]; )#endif } /*if setupLeft*/ 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 /* 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) { const GLint len = span.end - 1; (void) len;#ifdef INTERP_RGB CLAMP_INTERPOLANT(red, redStep, len); CLAMP_INTERPOLANT(green, greenStep, len); CLAMP_INTERPOLANT(blue, blueStep, len);#endif#ifdef INTERP_ALPHA CLAMP_INTERPOLANT(alpha, alphaStep, len);#endif#ifdef INTERP_SPEC CLAMP_INTERPOLANT(specRed, specRedStep, len); CLAMP_INTERPOLANT(specGreen, specGreenStep, len); CLAMP_INTERPOLANT(specBlue, specBlueStep, len);#endif#ifdef INTERP_INDEX CLAMP_INTERPOLANT(index, indexStep, len);#endif { 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 + -