Home | History | Annotate | Download | only in tnl_dd
      1 /*
      2  * Mesa 3-D graphics library
      3  * Version:  6.5.1
      4  *
      5  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  *
     24  * Authors:
     25  *    Keith Whitwell <keith (at) tungstengraphics.com>
     26  */
     27 
     28 #if !HAVE_SPEC
     29 #define VERT_SET_SPEC( v, c )
     30 #define VERT_COPY_SPEC( v0, v1 )
     31 #define VERT_SAVE_SPEC( idx )
     32 #define VERT_RESTORE_SPEC( idx )
     33 #endif
     34 
     35 static void TAG(unfilled_tri)( struct gl_context *ctx,
     36 			       GLenum mode,
     37 			       GLuint e0, GLuint e1, GLuint e2 )
     38 {
     39    struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
     40    GLubyte *ef = VB->EdgeFlag;
     41    VERTEX *v[3];
     42    LOCAL_VARS(3);
     43 
     44    v[0] = (VERTEX *)GET_VERTEX(e0);
     45    v[1] = (VERTEX *)GET_VERTEX(e1);
     46    v[2] = (VERTEX *)GET_VERTEX(e2);
     47 
     48    if (ctx->Light.ShadeModel == GL_FLAT && HAVE_HW_FLATSHADE) {
     49       VERT_SAVE_RGBA(0);
     50       VERT_SAVE_RGBA(1);
     51       VERT_COPY_RGBA(v[0], v[2]);
     52       VERT_COPY_RGBA(v[1], v[2]);
     53 
     54       if (HAVE_SPEC) {
     55 	 VERT_SAVE_SPEC(0);
     56 	 VERT_SAVE_SPEC(1);
     57 	 VERT_COPY_SPEC(v[0], v[2]);
     58 	 VERT_COPY_SPEC(v[1], v[2]);
     59       }
     60    }
     61 
     62 /*     fprintf(stderr, "%s %s %d %d %d\n", __FUNCTION__, */
     63 /*  	   _mesa_lookup_enum_by_nr( mode ), */
     64 /*  	   ef[e0], ef[e1], ef[e2]); */
     65 
     66    if (mode == GL_POINT) {
     67       RASTERIZE(GL_POINTS);
     68       if (ef[e0]) POINT( v[0] );
     69       if (ef[e1]) POINT( v[1] );
     70       if (ef[e2]) POINT( v[2] );
     71    }
     72    else {
     73       RASTERIZE(GL_LINES);
     74       if (RENDER_PRIMITIVE == GL_POLYGON) {
     75 	 if (ef[e2]) LINE( v[2], v[0] );
     76 	 if (ef[e0]) LINE( v[0], v[1] );
     77 	 if (ef[e1]) LINE( v[1], v[2] );
     78       }
     79       else {
     80 	 if (ef[e0]) LINE( v[0], v[1] );
     81 	 if (ef[e1]) LINE( v[1], v[2] );
     82 	 if (ef[e2]) LINE( v[2], v[0] );
     83       }
     84    }
     85 
     86    if (ctx->Light.ShadeModel == GL_FLAT && HAVE_HW_FLATSHADE) {
     87       VERT_RESTORE_RGBA(0);
     88       VERT_RESTORE_RGBA(1);
     89 
     90       if (HAVE_SPEC) {
     91 	 VERT_RESTORE_SPEC(0);
     92 	 VERT_RESTORE_SPEC(1);
     93       }
     94    }
     95 }
     96 
     97 
     98 static void TAG(unfilled_quad)( struct gl_context *ctx,
     99 				GLenum mode,
    100 				GLuint e0, GLuint e1,
    101 				GLuint e2, GLuint e3 )
    102 {
    103    struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
    104    GLubyte *ef = VB->EdgeFlag;
    105    VERTEX *v[4];
    106    LOCAL_VARS(4);
    107 
    108    v[0] = (VERTEX *)GET_VERTEX(e0);
    109    v[1] = (VERTEX *)GET_VERTEX(e1);
    110    v[2] = (VERTEX *)GET_VERTEX(e2);
    111    v[3] = (VERTEX *)GET_VERTEX(e3);
    112 
    113    /* Hardware flatshading breaks down here.  If the hardware doesn't
    114     * support flatshading, this will already have been done:
    115     */
    116    if (ctx->Light.ShadeModel == GL_FLAT && HAVE_HW_FLATSHADE) {
    117       VERT_SAVE_RGBA(0);
    118       VERT_SAVE_RGBA(1);
    119       VERT_SAVE_RGBA(2);
    120       VERT_COPY_RGBA(v[0], v[3]);
    121       VERT_COPY_RGBA(v[1], v[3]);
    122       VERT_COPY_RGBA(v[2], v[3]);
    123 
    124       if (HAVE_SPEC) {
    125 	 VERT_SAVE_SPEC(0);
    126 	 VERT_SAVE_SPEC(1);
    127 	 VERT_SAVE_SPEC(2);
    128 	 VERT_COPY_SPEC(v[0], v[3]);
    129 	 VERT_COPY_SPEC(v[1], v[3]);
    130 	 VERT_COPY_SPEC(v[2], v[3]);
    131       }
    132    }
    133 
    134    if (mode == GL_POINT) {
    135       RASTERIZE(GL_POINTS);
    136       if (ef[e0]) POINT( v[0] );
    137       if (ef[e1]) POINT( v[1] );
    138       if (ef[e2]) POINT( v[2] );
    139       if (ef[e3]) POINT( v[3] );
    140    }
    141    else {
    142       RASTERIZE(GL_LINES);
    143       if (ef[e0]) LINE( v[0], v[1] );
    144       if (ef[e1]) LINE( v[1], v[2] );
    145       if (ef[e2]) LINE( v[2], v[3] );
    146       if (ef[e3]) LINE( v[3], v[0] );
    147    }
    148 
    149    if (ctx->Light.ShadeModel == GL_FLAT && HAVE_HW_FLATSHADE) {
    150       VERT_RESTORE_RGBA(0);
    151       VERT_RESTORE_RGBA(1);
    152       VERT_RESTORE_RGBA(2);
    153 
    154       if (HAVE_SPEC) {
    155 	 VERT_RESTORE_SPEC(0);
    156 	 VERT_RESTORE_SPEC(1);
    157 	 VERT_RESTORE_SPEC(2);
    158       }
    159    }
    160 }
    161 
    162 
    163 #if !HAVE_SPEC
    164 #undef VERT_SET_SPEC
    165 #undef VERT_COPY_SPEC
    166 #undef VERT_SAVE_SPEC
    167 #undef VERT_RESTORE_SPEC
    168 #endif
    169 
    170 #undef TAG
    171