⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s_tritemp.h

📁 mesa-6.5-minigui源码
💻 H
📖 第 1 页 / 共 4 页
字号:
#if TRIANGLE_WALK_DOUBLE      eMaj.fsy = CEILF(vMin_fy);      eMaj.lines = (GLint) CEILF(vMax_fy - eMaj.fsy);#else      eMaj.fsy = FixedCeil(vMin_fy);      eMaj.lines = FixedToInt(FixedCeil(vMax_fy - eMaj.fsy));#endif      if (eMaj.lines > 0) {         eMaj.dxdy = eMaj.dx / eMaj.dy;#if TRIANGLE_WALK_DOUBLE         eMaj.adjy = (eMaj.fsy - vMin_fy) * FIXED_SCALE;  /* SCALED! */         eMaj.fx0 = vMin_fx;         eMaj.fsx = eMaj.fx0 + (eMaj.adjy * eMaj.dxdy) / (GLdouble) FIXED_SCALE;#else         eMaj.fdxdy = SignedFloatToFixed(eMaj.dxdy);         eMaj.adjy = (GLfloat) (eMaj.fsy - vMin_fy);  /* SCALED! */         eMaj.fx0 = vMin_fx;         eMaj.fsx = eMaj.fx0 + (GLfixed) (eMaj.adjy * eMaj.dxdy);#endif      }      else {         return;  /*CULLED*/      }#if TRIANGLE_WALK_DOUBLE      eTop.fsy = CEILF(vMid_fy);      eTop.lines = (GLint) CEILF(vMax_fy - eTop.fsy);#else      eTop.fsy = FixedCeil(vMid_fy);      eTop.lines = FixedToInt(FixedCeil(vMax_fy - eTop.fsy));#endif      if (eTop.lines > 0) {         eTop.dxdy = eTop.dx / eTop.dy;#if TRIANGLE_WALK_DOUBLE         eTop.adjy = (eTop.fsy - vMid_fy) * FIXED_SCALE; /* SCALED! */         eTop.fx0 = vMid_fx;         eTop.fsx = eTop.fx0 + (eTop.adjy * eTop.dxdy) / (GLdouble) FIXED_SCALE;#else         eTop.fdxdy = SignedFloatToFixed(eTop.dxdy);         eTop.adjy = (GLfloat) (eTop.fsy - vMid_fy); /* SCALED! */         eTop.fx0 = vMid_fx;         eTop.fsx = eTop.fx0 + (GLfixed) (eTop.adjy * eTop.dxdy);#endif      }#if TRIANGLE_WALK_DOUBLE      eBot.fsy = CEILF(vMin_fy);      eBot.lines = (GLint) CEILF(vMid_fy - eBot.fsy);#else      eBot.fsy = FixedCeil(vMin_fy);      eBot.lines = FixedToInt(FixedCeil(vMid_fy - eBot.fsy));#endif      if (eBot.lines > 0) {         eBot.dxdy = eBot.dx / eBot.dy;#if TRIANGLE_WALK_DOUBLE         eBot.adjy = (eBot.fsy - vMin_fy) * FIXED_SCALE;  /* SCALED! */         eBot.fx0 = vMin_fx;         eBot.fsx = eBot.fx0 + (eBot.adjy * eBot.dxdy) / (GLdouble) FIXED_SCALE;#else         eBot.fdxdy = SignedFloatToFixed(eBot.dxdy);         eBot.adjy = (GLfloat) (eBot.fsy - vMin_fy);  /* SCALED! */         eBot.fx0 = vMin_fx;         eBot.fsx = eBot.fx0 + (GLfixed) (eBot.adjy * eBot.dxdy);#endif      }   }   /*    * Conceptually, we view a triangle as two subtriangles    * separated by a perfectly horizontal line.  The edge that is    * intersected by this line is one with maximal absolute dy; we    * call it a ``major'' edge.  The other two edges are the    * ``top'' edge (for the upper subtriangle) and the ``bottom''    * edge (for the lower subtriangle).  If either of these two    * edges is horizontal or very close to horizontal, the    * corresponding subtriangle might cover zero sample points;    * we take care to handle such cases, for performance as well    * as correctness.    *    * By stepping rasterization parameters along the major edge,    * we can avoid recomputing them at the discontinuity where    * the top and bottom edges meet.  However, this forces us to    * be able to scan both left-to-right and right-to-left.    * Also, we must determine whether the major edge is at the    * left or right side of the triangle.  We do this by    * computing the magnitude of the cross-product of the major    * and top edges.  Since this magnitude depends on the sine of    * the angle between the two edges, its sign tells us whether    * we turn to the left or to the right when travelling along    * the major edge to the top edge, and from this we infer    * whether the major edge is on the left or the right.    *    * Serendipitously, this cross-product magnitude is also a    * value we need to compute the iteration parameter    * derivatives for the triangle, and it can be used to perform    * backface culling because its sign tells us whether the    * triangle is clockwise or counterclockwise.  In this code we    * refer to it as ``area'' because it's also proportional to    * the pixel area of the triangle.    */   {      GLint scan_from_left_to_right;  /* true if scanning left-to-right */#ifdef INTERP_INDEX      GLfloat didx, didy;#endif      /*       * Execute user-supplied setup code       */#ifdef SETUP_CODE      SETUP_CODE#endif      scan_from_left_to_right = (oneOverArea < 0.0F);      /* compute d?/dx and d?/dy derivatives */#ifdef INTERP_Z      span.interpMask |= SPAN_Z;      {         GLfloat eMaj_dz = vMax->win[2] - vMin->win[2];         GLfloat eBot_dz = vMid->win[2] - vMin->win[2];         span.dzdx = oneOverArea * (eMaj_dz * eBot.dy - eMaj.dy * eBot_dz);         if (span.dzdx > maxDepth || span.dzdx < -maxDepth) {            /* probably a sliver triangle */            span.dzdx = 0.0;            span.dzdy = 0.0;         }         else {            span.dzdy = oneOverArea * (eMaj.dx * eBot_dz - eMaj_dz * eBot.dx);         }         if (depthBits <= 16)            span.zStep = SignedFloatToFixed(span.dzdx);         else            span.zStep = (GLint) span.dzdx;      }#endif#ifdef INTERP_W      span.interpMask |= SPAN_W;      {         const GLfloat eMaj_dw = vMax->win[3] - vMin->win[3];         const GLfloat eBot_dw = vMid->win[3] - vMin->win[3];         span.dwdx = oneOverArea * (eMaj_dw * eBot.dy - eMaj.dy * eBot_dw);         span.dwdy = oneOverArea * (eMaj.dx * eBot_dw - eMaj_dw * eBot.dx);      }#endif#ifdef INTERP_FOG      span.interpMask |= SPAN_FOG;      {#  ifdef INTERP_W         const GLfloat wMax = vMax->win[3], wMin = vMin->win[3], wMid = vMid->win[3];         const GLfloat eMaj_dfog = vMax->fog * wMax - vMin->fog * wMin;         const GLfloat eBot_dfog = vMid->fog * wMid - vMin->fog * wMin;#  else         const GLfloat eMaj_dfog = vMax->fog - vMin->fog;         const GLfloat eBot_dfog = vMid->fog - vMin->fog;#  endif         span.dfogdx = oneOverArea * (eMaj_dfog * eBot.dy - eMaj.dy * eBot_dfog);         span.dfogdy = oneOverArea * (eMaj.dx * eBot_dfog - eMaj_dfog * eBot.dx);         span.fogStep = span.dfogdx;      }#endif#ifdef INTERP_RGB      span.interpMask |= SPAN_RGBA;      if (ctx->Light.ShadeModel == GL_SMOOTH) {         GLfloat eMaj_dr = (GLfloat) ((ColorTemp) vMax->color[RCOMP] - (ColorTemp) vMin->color[RCOMP]);         GLfloat eBot_dr = (GLfloat) ((ColorTemp) vMid->color[RCOMP] - (ColorTemp) vMin->color[RCOMP]);         GLfloat eMaj_dg = (GLfloat) ((ColorTemp) vMax->color[GCOMP] - (ColorTemp) vMin->color[GCOMP]);         GLfloat eBot_dg = (GLfloat) ((ColorTemp) vMid->color[GCOMP] - (ColorTemp) vMin->color[GCOMP]);         GLfloat eMaj_db = (GLfloat) ((ColorTemp) vMax->color[BCOMP] - (ColorTemp) vMin->color[BCOMP]);         GLfloat eBot_db = (GLfloat) ((ColorTemp) vMid->color[BCOMP] - (ColorTemp) vMin->color[BCOMP]);#  ifdef INTERP_ALPHA         GLfloat eMaj_da = (GLfloat) ((ColorTemp) vMax->color[ACOMP] - (ColorTemp) vMin->color[ACOMP]);         GLfloat eBot_da = (GLfloat) ((ColorTemp) vMid->color[ACOMP] - (ColorTemp) vMin->color[ACOMP]);#  endif         span.drdx = oneOverArea * (eMaj_dr * eBot.dy - eMaj.dy * eBot_dr);         span.drdy = oneOverArea * (eMaj.dx * eBot_dr - eMaj_dr * eBot.dx);         span.dgdx = oneOverArea * (eMaj_dg * eBot.dy - eMaj.dy * eBot_dg);         span.dgdy = oneOverArea * (eMaj.dx * eBot_dg - eMaj_dg * eBot.dx);         span.dbdx = oneOverArea * (eMaj_db * eBot.dy - eMaj.dy * eBot_db);         span.dbdy = oneOverArea * (eMaj.dx * eBot_db - eMaj_db * eBot.dx);#  if CHAN_TYPE == GL_FLOAT         span.redStep   = span.drdx;         span.greenStep = span.dgdx;         span.blueStep  = span.dbdx;#  else         span.redStep   = SignedFloatToFixed(span.drdx);         span.greenStep = SignedFloatToFixed(span.dgdx);         span.blueStep  = SignedFloatToFixed(span.dbdx);#  endif /* GL_FLOAT */#  ifdef INTERP_ALPHA         span.dadx = oneOverArea * (eMaj_da * eBot.dy - eMaj.dy * eBot_da);         span.dady = oneOverArea * (eMaj.dx * eBot_da - eMaj_da * eBot.dx);#    if CHAN_TYPE == GL_FLOAT         span.alphaStep = span.dadx;#    else         span.alphaStep = SignedFloatToFixed(span.dadx);#    endif /* GL_FLOAT */#  endif /* INTERP_ALPHA */      }      else {         ASSERT(ctx->Light.ShadeModel == GL_FLAT);         span.interpMask |= SPAN_FLAT;         span.drdx = span.drdy = 0.0F;         span.dgdx = span.dgdy = 0.0F;         span.dbdx = span.dbdy = 0.0F;#    if CHAN_TYPE == GL_FLOAT	 span.redStep   = 0.0F;	 span.greenStep = 0.0F;	 span.blueStep  = 0.0F;#    else	 span.redStep   = 0;	 span.greenStep = 0;	 span.blueStep  = 0;#    endif /* GL_FLOAT */#  ifdef INTERP_ALPHA         span.dadx = span.dady = 0.0F;#    if CHAN_TYPE == GL_FLOAT	 span.alphaStep = 0.0F;#    else	 span.alphaStep = 0;#    endif /* GL_FLOAT */#  endif      }#endif /* INTERP_RGB */#ifdef INTERP_SPEC      span.interpMask |= SPAN_SPEC;      if (ctx->Light.ShadeModel == GL_SMOOTH) {         GLfloat eMaj_dsr = (GLfloat) ((ColorTemp) vMax->specular[RCOMP] - (ColorTemp) vMin->specular[RCOMP]);         GLfloat eBot_dsr = (GLfloat) ((ColorTemp) vMid->specular[RCOMP] - (ColorTemp) vMin->specular[RCOMP]);         GLfloat eMaj_dsg = (GLfloat) ((ColorTemp) vMax->specular[GCOMP] - (ColorTemp) vMin->specular[GCOMP]);         GLfloat eBot_dsg = (GLfloat) ((ColorTemp) vMid->specular[GCOMP] - (ColorTemp) vMin->specular[GCOMP]);         GLfloat eMaj_dsb = (GLfloat) ((ColorTemp) vMax->specular[BCOMP] - (ColorTemp) vMin->specular[BCOMP]);         GLfloat eBot_dsb = (GLfloat) ((ColorTemp) vMid->specular[BCOMP] - (ColorTemp) vMin->specular[BCOMP]);         span.dsrdx = oneOverArea * (eMaj_dsr * eBot.dy - eMaj.dy * eBot_dsr);         span.dsrdy = oneOverArea * (eMaj.dx * eBot_dsr - eMaj_dsr * eBot.dx);         span.dsgdx = oneOverArea * (eMaj_dsg * eBot.dy - eMaj.dy * eBot_dsg);         span.dsgdy = oneOverArea * (eMaj.dx * eBot_dsg - eMaj_dsg * eBot.dx);         span.dsbdx = oneOverArea * (eMaj_dsb * eBot.dy - eMaj.dy * eBot_dsb);         span.dsbdy = oneOverArea * (eMaj.dx * eBot_dsb - eMaj_dsb * eBot.dx);#  if CHAN_TYPE == GL_FLOAT         span.specRedStep   = span.dsrdx;         span.specGreenStep = span.dsgdx;         span.specBlueStep  = span.dsbdx;#  else         span.specRedStep   = SignedFloatToFixed(span.dsrdx);         span.specGreenStep = SignedFloatToFixed(span.dsgdx);         span.specBlueStep  = SignedFloatToFixed(span.dsbdx);#  endif      }      else {         span.dsrdx = span.dsrdy = 0.0F;         span.dsgdx = span.dsgdy = 0.0F;         span.dsbdx = span.dsbdy = 0.0F;#  if CHAN_TYPE == GL_FLOAT	 span.specRedStep   = 0.0F;	 span.specGreenStep = 0.0F;	 span.specBlueStep  = 0.0F;#  else	 span.specRedStep   = 0;	 span.specGreenStep = 0;	 span.specBlueStep  = 0;#  endif      }#endif /* INTERP_SPEC */#ifdef INTERP_INDEX      span.interpMask |= SPAN_INDEX;      if (ctx->Light.ShadeModel == GL_SMOOTH) {         GLfloat eMaj_di = vMax->index - vMin->index;         GLfloat eBot_di = vMid->index - vMin->index;         didx = oneOverArea * (eMaj_di * eBot.dy - eMaj.dy * eBot_di);         didy = oneOverArea * (eMaj.dx * eBot_di - eMaj_di * eBot.dx);         span.indexStep = SignedFloatToFixed(didx);      }      else {         span.interpMask |= SPAN_FLAT;         didx = didy = 0.0F;         span.indexStep = 0;      }#endif#ifdef INTERP_INT_TEX      span.interpMask |= SPAN_INT_TEXTURE;      {         GLfloat eMaj_ds = (vMax->texcoord[0][0] - vMin->texcoord[0][0]) * S_SCALE;         GLfloat eBot_ds = (vMid->texcoord[0][0] - vMin->texcoord[0][0]) * S_SCALE;         GLfloat eMaj_dt = (vMax->texcoord[0][1] - vMin->texcoord[0][1]) * T_SCALE;         GLfloat eBot_dt = (vMid->texcoord[0][1] - vMin->texcoord[0][1]) * T_SCALE;         span.texStepX[0][0] = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);         span.texStepY[0][0] = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);         span.texStepX[0][1] = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);         span.texStepY[0][1] = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);         span.intTexStep[0] = SignedFloatToFixed(span.texStepX[0][0]);         span.intTexStep[1] = SignedFloatToFixed(span.texStepX[0][1]);      }#endif#ifdef INTERP_TEX      span.interpMask |= SPAN_TEXTURE;      {         /* win[3] is 1/W */         const GLfloat wMax = vMax->win[3], wMin = vMin->win[3], wMid = vMid->win[3];         TEX_UNIT_LOOP(            GLfloat eMaj_ds = vMax->texcoord[u][0] * wMax - vMin->texcoord[u][0] * wMin;            GLfloat eBot_ds = vMid->texcoord[u][0] * wMid - vMin->texcoord[u][0] * wMin;            GLfloat eMaj_dt = vMax->texcoord[u][1] * wMax - vMin->texcoord[u][1] * wMin;            GLfloat eBot_dt = vMid->texcoord[u][1] * wMid - vMin->texcoord[u][1] * wMin;            GLfloat eMaj_du = vMax->texcoord[u][2] * wMax - vMin->texcoord[u][2] * wMin;            GLfloat eBot_du = vMid->texcoord[u][2] * wMid - vMin->texcoord[u][2] * wMin;            GLfloat eMaj_dv = vMax->texcoord[u][3] * wMax - vMin->texcoord[u][3] * wMin;            GLfloat eBot_dv = vMid->texcoord[u][3] * wMid - vMin->texcoord[u][3] * wMin;            span.texStepX[u][0] = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);            span.texStepY[u][0] = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);            span.texStepX[u][1] = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);            span.texStepY[u][1] = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);            span.texStepX[u][2] = oneOverArea * (eMaj_du * eBot.dy - eMaj.dy * eBot_du);            span.texStepY[u][2] = oneOverArea * (eMaj.dx * eBot_du - eMaj_du * eBot.dx);            span.texStepX[u][3] = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv);            span.texStepY[u][3] = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);         )      }#endif      /*       * We always sample at pixel centers.  However, we avoid       * explicit half-pixel offsets in this code by incorporating       * the proper offset in each of x and y during the       * transformation to window coordinates.       *       * We also apply the usual rasterization rules to prevent

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -