Fix lost edge flags problem when clipping.
authorBrian <brian.paul@tungstengraphics.com>
Thu, 30 Aug 2007 20:31:42 +0000 (14:31 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 30 Aug 2007 20:43:08 +0000 (14:43 -0600)
In emit_poly() we need to compute header.edgeflags from the vertex
edge flags.  Also need to set header.det so later stages can determine
front/back orientation.

src/mesa/pipe/draw/draw_clip.c
src/mesa/pipe/draw/draw_unfilled.c

index a23b7a281097c86fd3bdabc6a32ca5ba21c30587..1396b60f45ef98c2f94c8d46051e5330dfba7d9b 100644 (file)
@@ -177,11 +177,15 @@ static INLINE void do_tri( struct draw_stage *next,
 
 static void emit_poly( struct draw_stage *stage,
                       struct vertex_header **inlist,
-                      unsigned n )
+                      unsigned n,
+                       const struct prim_header *origPrim)
 {
    struct prim_header header;
    unsigned i;
 
+   /* later stages may need the determinant, but only the sign matters */
+   header.det = origPrim->det;
+
    for (i = 2; i < n; i++) {
       header.v[0] = inlist[0];
       header.v[1] = inlist[i-1];
@@ -194,6 +198,10 @@ static void emit_poly( struct draw_stage *stage,
         if (i != 2)   header.v[0]->edgeflag = 0;
         if (i != n-1) header.v[2]->edgeflag = 0;
 
+         header.edgeflags = ((header.v[0]->edgeflag << 0) | 
+                             (header.v[1]->edgeflag << 1) | 
+                             (header.v[2]->edgeflag << 2));
+
         stage->next->tri( stage->next, &header );
 
         header.v[0]->edgeflag = tmp0;
@@ -302,7 +310,7 @@ do_clip_tri( struct draw_stage *stage,
    /* Emit the polygon as triangles to the setup stage:
     */
    if (n >= 3)
-      emit_poly( stage, inlist, n );
+      emit_poly( stage, inlist, n, header );
 }
 
 
index 4215b8b228065ddc1ad2541e9f72b03b073a1475..b0d6f3d0655e92096b5e04037352b1fbb279a382 100644 (file)
@@ -104,6 +104,12 @@ static void lines( struct draw_stage *stage,
    struct vertex_header *v1 = header->v[1];
    struct vertex_header *v2 = header->v[2];
 
+#if 0
+   assert(((header->edgeflags & 0x1) >> 0) == header->v[0]->edgeflag);
+   assert(((header->edgeflags & 0x2) >> 1) == header->v[1]->edgeflag);
+   assert(((header->edgeflags & 0x4) >> 2) == header->v[2]->edgeflag);
+#endif
+
    if (header->edgeflags & 0x1) line( stage, v0, v1 );
    if (header->edgeflags & 0x2) line( stage, v1, v2 );
    if (header->edgeflags & 0x4) line( stage, v2, v0 );