summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/pipe/draw/draw_offset.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/src/mesa/pipe/draw/draw_offset.c b/src/mesa/pipe/draw/draw_offset.c
index 0fa8cf29d34..62ab2e46430 100644
--- a/src/mesa/pipe/draw/draw_offset.c
+++ b/src/mesa/pipe/draw/draw_offset.c
@@ -74,32 +74,34 @@ static void do_offset_tri( struct prim_stage *stage,
/* Window coords:
*/
- GLfloat *v0 = (GLfloat *)&(header->v[0]->data[0]);
- GLfloat *v1 = (GLfloat *)&(header->v[1]->data[0]);
- GLfloat *v2 = (GLfloat *)&(header->v[2]->data[0]);
-
+ GLfloat *v0 = header->v[0]->data[0];
+ GLfloat *v1 = header->v[1]->data[0];
+ GLfloat *v2 = header->v[2]->data[0];
+
+ /* edge vectors e = v0 - v2, f = v1 - v2 */
GLfloat ex = v0[0] - v2[2];
- GLfloat fx = v1[0] - v2[2];
GLfloat ey = v0[1] - v2[2];
- GLfloat fy = v1[1] - v2[2];
GLfloat ez = v0[2] - v2[2];
+ GLfloat fx = v1[0] - v2[2];
+ GLfloat fy = v1[1] - v2[2];
GLfloat fz = v1[2] - v2[2];
+ /* (a,b) = cross(e,f).xy */
GLfloat a = ey*fz - ez*fy;
GLfloat b = ez*fx - ex*fz;
- GLfloat ac = a * inv_det;
- GLfloat bc = b * inv_det;
- GLfloat zoffset;
-
- ac = FABSF(ac);
- bc = FABSF(bc);
+ GLfloat dzdx = FABSF(a * inv_det);
+ GLfloat dzdy = FABSF(b * inv_det);
- zoffset = offset->units + MAX2( ac, bc ) * offset->scale;
+ GLfloat zoffset = offset->units + MAX2(dzdx, dzdy) * offset->scale;
- v0[2] += zoffset;
- v1[2] += zoffset;
- v2[2] += zoffset;
+ /*
+ * Note: we're applying the offset and clamping per-vertex.
+ * Ideally, the offset is applied per-fragment prior to fragment shading.
+ */
+ v0[2] = CLAMP(v0[2] + zoffset, 0.0, 1.0);
+ v1[2] = CLAMP(v1[2] + zoffset, 0.0, 1.0);
+ v2[2] = CLAMP(v2[2] + zoffset, 0.0, 1.0);
stage->next->tri( stage->next, header );
}