added clamping to polygon offset to prevent potential negative Z values and FP exceptions

This commit is contained in:
Brian Paul
2004-03-03 15:50:28 +00:00
parent 9a20a72cdc
commit 7c6a04f6d8
+15 -16
View File
@@ -1,9 +1,8 @@
/*
* Mesa 3-D graphics library
* Version: 5.0
* Version: 6.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
* Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -102,24 +101,24 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
if (IND & SS_OFFSET_BIT)
{
offset = ctx->Polygon.OffsetUnits;
offset = ctx->Polygon.OffsetUnits * ctx->MRD;
z[0] = v[0]->win[2];
z[1] = v[1]->win[2];
z[2] = v[2]->win[2];
if (cc * cc > 1e-16) {
GLfloat ez = z[0] - z[2];
GLfloat fz = z[1] - z[2];
GLfloat a = ey*fz - ez*fy;
GLfloat b = ez*fx - ex*fz;
GLfloat ic = 1.0F / cc;
GLfloat ac = a * ic;
GLfloat bc = b * ic;
if (ac < 0.0F) ac = -ac;
if (bc < 0.0F) bc = -bc;
offset += MAX2(ac, bc) * ctx->Polygon.OffsetFactor;
const GLfloat ez = z[0] - z[2];
const GLfloat fz = z[1] - z[2];
const GLfloat oneOverArea = 1.0F / cc;
const GLfloat dzdx = FABSF((ey * fz - ez * fy) * oneOverArea);
const GLfloat dzdy = FABSF((ez * fx - ex * fz) * oneOverArea);
offset += MAX2(dzdx, dzdy) * ctx->Polygon.OffsetFactor;
/* Unfortunately, we need to clamp to prevent negative Zs below.
* Technically, we should do the clamping per-fragment.
*/
offset = MAX2(offset, -v[0]->win[2]);
offset = MAX2(offset, -v[1]->win[2]);
offset = MAX2(offset, -v[2]->win[2]);
}
offset *= ctx->MRD;
/*printf("offset %g\n", offset);*/
}
}