swrast: fix incorrect tri culling in selection/feedback mode.
authorBrian Paul <brianp@vmware.com>
Thu, 27 Aug 2009 22:50:03 +0000 (16:50 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 27 Aug 2009 22:50:03 +0000 (16:50 -0600)
See bug 16866.

src/mesa/swrast/s_feedback.c
src/mesa/swrast/s_triangle.c

index 7bb914b6589667c7c2307fb1a0445876fb339f5c..47ed25ee1005b6eea0aa64d52f24b01f74c7ab2d 100644 (file)
@@ -58,7 +58,7 @@ void
 _swrast_feedback_triangle(GLcontext *ctx, const SWvertex *v0,
                           const SWvertex *v1, const SWvertex *v2)
 {
-   if (_swrast_culltriangle(ctx, v0, v1, v2)) {
+   if (!_swrast_culltriangle(ctx, v0, v1, v2)) {
       _mesa_feedback_token(ctx, (GLfloat) (GLint) GL_POLYGON_TOKEN);
       _mesa_feedback_token(ctx, (GLfloat) 3); /* three vertices */
 
@@ -113,7 +113,7 @@ void
 _swrast_select_triangle(GLcontext *ctx, const SWvertex *v0,
                         const SWvertex *v1, const SWvertex *v2)
 {
-   if (_swrast_culltriangle(ctx, v0, v1, v2)) {
+   if (!_swrast_culltriangle(ctx, v0, v1, v2)) {
       const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
 
       _mesa_update_hitflag( ctx, v0->attrib[FRAG_ATTRIB_WPOS][2] * zs );
index 9260e35066fc57409bcd4b5cd133c01891ab5671..1d2fed7169118ada77e48beb022a1c1985434194 100644 (file)
@@ -44,8 +44,9 @@
 #include "s_triangle.h"
 
 
-/*
- * Just used for feedback mode.
+/**
+ * Test if a triangle should be culled.  Used for feedback and selection mode.
+ * \return GL_TRUE if the triangle is to be culled, GL_FALSE otherwise.
  */
 GLboolean
 _swrast_culltriangle( GLcontext *ctx,
@@ -53,16 +54,17 @@ _swrast_culltriangle( GLcontext *ctx,
                       const SWvertex *v1,
                       const SWvertex *v2 )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
    GLfloat ex = v1->attrib[FRAG_ATTRIB_WPOS][0] - v0->attrib[FRAG_ATTRIB_WPOS][0];
    GLfloat ey = v1->attrib[FRAG_ATTRIB_WPOS][1] - v0->attrib[FRAG_ATTRIB_WPOS][1];
    GLfloat fx = v2->attrib[FRAG_ATTRIB_WPOS][0] - v0->attrib[FRAG_ATTRIB_WPOS][0];
    GLfloat fy = v2->attrib[FRAG_ATTRIB_WPOS][1] - v0->attrib[FRAG_ATTRIB_WPOS][1];
    GLfloat c = ex*fy-ey*fx;
 
-   if (c * SWRAST_CONTEXT(ctx)->_BackfaceCullSign > 0)
-      return 0;
+   if (c * swrast->_BackfaceSign * swrast->_BackfaceCullSign < 0.0F)
+      return GL_FALSE;
 
-   return 1;
+   return GL_TRUE;
 }