diff options
author | Brian Paul <[email protected]> | 2009-08-27 16:50:03 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2009-08-27 16:50:03 -0600 |
commit | 8f4d66c5f893b49eb3973aa3b31a856314c045c7 (patch) | |
tree | fbb405382c03fbd4af45a664af6509f244e3d8d3 | |
parent | 43a064e06dd0d3f7ff7ae23f19248e312c0b03b1 (diff) |
swrast: fix incorrect tri culling in selection/feedback mode.
See bug 16866.
-rw-r--r-- | src/mesa/swrast/s_feedback.c | 4 | ||||
-rw-r--r-- | src/mesa/swrast/s_triangle.c | 12 |
2 files changed, 9 insertions, 7 deletions
diff --git a/src/mesa/swrast/s_feedback.c b/src/mesa/swrast/s_feedback.c index 7bb914b6589..47ed25ee100 100644 --- a/src/mesa/swrast/s_feedback.c +++ b/src/mesa/swrast/s_feedback.c @@ -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 ); diff --git a/src/mesa/swrast/s_triangle.c b/src/mesa/swrast/s_triangle.c index 9260e35066f..1d2fed71691 100644 --- a/src/mesa/swrast/s_triangle.c +++ b/src/mesa/swrast/s_triangle.c @@ -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; } |