home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / swrast_setup / old / ss_tritmp.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-12-01  |  6.8 KB  |  246 lines

  1. /* $Id: ss_tritmp.h,v 1.20 2002/11/13 15:04:29 brianp Exp $ */
  2.  
  3. /*
  4.  * Mesa 3-D graphics library
  5.  * Version:  5.0
  6.  *
  7.  * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
  8.  *
  9.  * Permission is hereby granted, free of charge, to any person obtaining a
  10.  * copy of this software and associated documentation files (the "Software"),
  11.  * to deal in the Software without restriction, including without limitation
  12.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  13.  * and/or sell copies of the Software, and to permit persons to whom the
  14.  * Software is furnished to do so, subject to the following conditions:
  15.  *
  16.  * The above copyright notice and this permission notice shall be included
  17.  * in all copies or substantial portions of the Software.
  18.  *
  19.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  20.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  22.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  23.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  24.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  * Authors:
  27.  *    Keith Whitwell <keith@tungstengraphics.com>
  28.  */
  29.  
  30.  
  31. static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
  32. {
  33.    struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
  34.    SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts;
  35.    SWvertex *v[3];
  36.    GLfloat z[3];
  37.    GLfloat offset;
  38.    GLenum mode = GL_FILL;
  39.    GLuint facing = 0;
  40.  
  41.    v[0] = &verts[e0];
  42.    v[1] = &verts[e1];
  43.    v[2] = &verts[e2];
  44.  
  45.  
  46. // if (IND & (SS_TWOSIDE_BIT | SS_OFFSET_BIT | SS_UNFILLED_BIT))
  47. //1
  48. #if   (IND & (SS_TWOSIDE_BIT | SS_OFFSET_BIT | SS_UNFILLED_BIT))
  49.    {
  50.       GLfloat ex = v[0]->win[0] - v[2]->win[0];
  51.       GLfloat ey = v[0]->win[1] - v[2]->win[1];
  52.       GLfloat fx = v[1]->win[0] - v[2]->win[0];
  53.       GLfloat fy = v[1]->win[1] - v[2]->win[1];
  54.       GLfloat cc  = ex*fy - ey*fx;
  55. //    if (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT))
  56. //2
  57. #if      (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT))
  58.       {
  59.      facing = (cc < 0.0) ^ ctx->Polygon._FrontBit;
  60.          if (ctx->Stencil.TestTwoSide)
  61.             ctx->_Facing = facing; /* for 2-sided stencil test */
  62.  
  63. //     if (IND & SS_UNFILLED_BIT)
  64. #if      (IND & SS_UNFILLED_BIT)
  65.         mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode;
  66. #endif
  67.  
  68.      if (facing == 1) {
  69.  
  70. //        if (IND & SS_TWOSIDE_BIT) {
  71. //3
  72. #if            (IND & SS_TWOSIDE_BIT)  
  73.             {
  74. //           if (IND & SS_RGBA_BIT) {
  75. //4
  76. #if           (IND & SS_RGBA_BIT) 
  77.                {
  78.           GLchan (*vbcolor)[4] = (GLchan (*)[4])VB->ColorPtr[1]->Ptr;
  79.           SS_COLOR(v[0]->color, vbcolor[e0]);
  80.           SS_COLOR(v[1]->color, vbcolor[e1]);
  81.           SS_COLOR(v[2]->color, vbcolor[e2]);
  82.           if (VB->SecondaryColorPtr[1]) {
  83.              GLchan (*vbspec)[4] = (GLchan (*)[4])VB->SecondaryColorPtr[1]->Ptr;
  84.              SS_SPEC(v[0]->specular, vbspec[e0]);
  85.              SS_SPEC(v[1]->specular, vbspec[e1]);
  86.              SS_SPEC(v[2]->specular, vbspec[e2]);
  87.           }
  88.            }
  89. //           } else {
  90. #else
  91.            {
  92.           GLuint *vbindex = VB->IndexPtr[1]->data;
  93.           SS_IND(v[0]->index, vbindex[e0]);
  94.           SS_IND(v[1]->index, vbindex[e1]);
  95.           SS_IND(v[2]->index, vbindex[e2]);
  96.            }
  97. #endif  //4
  98.         }
  99. #endif //3
  100.      }
  101.       }
  102. #endif  //2
  103. //    if (IND & SS_OFFSET_BIT)
  104. //5
  105. #if      (IND & SS_OFFSET_BIT)
  106.       {
  107.      offset = ctx->Polygon.OffsetUnits;
  108.      z[0] = v[0]->win[2];
  109.      z[1] = v[1]->win[2];
  110.      z[2] = v[2]->win[2];
  111.      if (cc * cc > 1e-16) {
  112.         GLfloat ez = z[0] - z[2];
  113.         GLfloat fz = z[1] - z[2];
  114.         GLfloat a = ey*fz - ez*fy;
  115.         GLfloat b = ez*fx - ex*fz;
  116.         GLfloat ic = 1.0F / cc;
  117.         GLfloat ac = a * ic;
  118.         GLfloat bc = b * ic;
  119.         if (ac < 0.0F) ac = -ac;
  120.         if (bc < 0.0F) bc = -bc;
  121.         offset += MAX2(ac, bc) * ctx->Polygon.OffsetFactor;
  122.      }
  123.          offset *= ctx->MRD;
  124.          /*printf("offset %g\n", offset);*/
  125.       }
  126. #endif //5
  127.    }
  128. #endif //1
  129.    if (mode == GL_POINT) {
  130. //    if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetPoint) {
  131. //8
  132. #if     (IND & SS_OFFSET_BIT) 
  133.       if(ctx->Polygon.OffsetPoint) {
  134.      v[0]->win[2] += offset;
  135.      v[1]->win[2] += offset;
  136.      v[2]->win[2] += offset;
  137.       }
  138. #endif //8
  139.       _swsetup_render_point_tri( ctx, e0, e1, e2, facing );
  140.    } else if (mode == GL_LINE) {
  141. //    if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetLine) {
  142. //9
  143. #if     (IND & SS_OFFSET_BIT) 
  144.       if(ctx->Polygon.OffsetLine) {
  145.      v[0]->win[2] += offset;
  146.      v[1]->win[2] += offset;
  147.      v[2]->win[2] += offset;
  148.       }
  149. #endif //9
  150.       _swsetup_render_line_tri( ctx, e0, e1, e2, facing );
  151.    } else {
  152. //    if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetFill) {
  153. //10
  154. #if       (IND & SS_OFFSET_BIT) 
  155.       if(ctx->Polygon.OffsetFill) {
  156.      v[0]->win[2] += offset;
  157.      v[1]->win[2] += offset;
  158.      v[2]->win[2] += offset;
  159.       }
  160. #endif //10
  161.       _swrast_Triangle( ctx, v[0], v[1], v[2] );
  162.    }
  163.  
  164. // if (IND & SS_OFFSET_BIT) {
  165. //6
  166. #if   (IND & SS_OFFSET_BIT) 
  167.    {
  168.       v[0]->win[2] = z[0];
  169.       v[1]->win[2] = z[1];
  170.       v[2]->win[2] = z[2];
  171.    }
  172. #endif //6
  173.  
  174. // if (IND & SS_TWOSIDE_BIT) {
  175. //7
  176. #if (IND & SS_TWOSIDE_BIT) 
  177.     {
  178.       if (facing == 1) {
  179. //     if (IND & SS_RGBA_BIT) {
  180. //11
  181.          {
  182. #if        (IND & SS_RGBA_BIT)
  183.         GLchan (*vbcolor)[4] = (GLchan (*)[4])VB->ColorPtr[0]->Ptr;
  184.         SS_COLOR(v[0]->color, vbcolor[e0]);
  185.         SS_COLOR(v[1]->color, vbcolor[e1]);
  186.         SS_COLOR(v[2]->color, vbcolor[e2]);
  187.         if (VB->SecondaryColorPtr[0]) {
  188.            GLchan (*vbspec)[4] = (GLchan (*)[4])VB->SecondaryColorPtr[0]->Ptr;
  189.            SS_SPEC(v[0]->specular, vbspec[e0]);
  190.            SS_SPEC(v[1]->specular, vbspec[e1]);
  191.            SS_SPEC(v[2]->specular, vbspec[e2]);
  192.         }
  193. #else
  194. //     } else {
  195.         GLuint *vbindex = VB->IndexPtr[0]->data;
  196.         SS_IND(v[0]->index, vbindex[e0]);
  197.         SS_IND(v[1]->index, vbindex[e1]);
  198.         SS_IND(v[2]->index, vbindex[e2]);
  199. #endif //11
  200.      }
  201.       }
  202.    }
  203. #endif //7
  204. }
  205.  
  206.  
  207.  
  208. /* Need to fixup edgeflags when decomposing to triangles:
  209.  */
  210. static void TAG(quadfunc)( GLcontext *ctx, GLuint v0,
  211.                GLuint v1, GLuint v2, GLuint v3 )
  212. {
  213. //   if (IND & SS_UNFILLED_BIT) {
  214.      {
  215. //12
  216. #if     (IND & SS_UNFILLED_BIT)
  217.       struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
  218.       GLubyte ef1 = VB->EdgeFlag[v1];
  219.       GLubyte ef3 = VB->EdgeFlag[v3];
  220.       VB->EdgeFlag[v1] = 0;
  221.       TAG(triangle)( ctx, v0, v1, v3 );
  222.       VB->EdgeFlag[v1] = ef1;
  223.       VB->EdgeFlag[v3] = 0;
  224.       TAG(triangle)( ctx, v1, v2, v3 );
  225.       VB->EdgeFlag[v3] = ef3;
  226. #else
  227. //   } else {
  228.       TAG(triangle)( ctx, v0, v1, v3 );
  229.       TAG(triangle)( ctx, v1, v2, v3 );
  230. #endif  //12
  231.    }
  232. }
  233.  
  234.  
  235.  
  236.  
  237. static void TAG(init)( void )
  238. {
  239.    tri_tab[IND] = TAG(triangle);
  240.    quad_tab[IND] = TAG(quadfunc);
  241. }
  242.  
  243.  
  244. #undef IND
  245. #undef TAG
  246.