shithub: libgraphics

Download patch

ref: 4ca01cd1f8c96bb58fd4f2d774f45a41f8beaea4
parent: df3e0a6d40228792894296a10a21d698da38d655
author: rodri <rgl@antares-labs.eu>
date: Fri Apr 10 20:51:24 EDT 2026

remove redundant z gradients from incremental rasterizer

--- a/internal.h
+++ b/internal.h
@@ -12,7 +12,6 @@
 typedef struct Tilertask	Tilertask;
 typedef struct Rasterparam	Rasterparam;
 typedef struct Rastertask	Rastertask;
-typedef struct fGradient	fGradient;
 typedef struct pGradient	pGradient;
 typedef struct vGradient	vGradient;
 typedef struct Gradients	Gradients;
@@ -80,13 +79,6 @@
 	BPrimitive	p;
 };
 
-struct fGradient
-{
-	double	f0;
-	double	dx;
-	double	dy;
-};
-
 struct pGradient
 {
 	Point3	p0;
@@ -105,8 +97,6 @@
 {
 	vGradient	v;
 	pGradient	bc;
-	fGradient	z;
-	fGradient	pcz;
 };
 
 /* alloc */
--- a/render.c
+++ b/render.c
@@ -363,14 +363,6 @@
 	_berpvertex(&∇->v.v0, prim->v+0, prim->v+1, prim->v+2, ∇->bc.p0);
 	_berpvertex(&∇->v.dx, prim->v+0, prim->v+1, prim->v+2, ∇->bc.dx);
 	_berpvertex(&∇->v.dy, prim->v+0, prim->v+1, prim->v+2, ∇->bc.dy);
-
-	∇->z.f0 = fberp(prim->v[0].p.z, prim->v[1].p.z, prim->v[2].p.z, ∇->bc.p0);
-	∇->z.dx = fberp(prim->v[0].p.z, prim->v[1].p.z, prim->v[2].p.z, ∇->bc.dx);
-	∇->z.dy = fberp(prim->v[0].p.z, prim->v[1].p.z, prim->v[2].p.z, ∇->bc.dy);
-
-	∇->pcz.f0 = fberp(prim->v[0].p.w, prim->v[1].p.w, prim->v[2].p.w, ∇->bc.p0);
-	∇->pcz.dx = fberp(prim->v[0].p.w, prim->v[1].p.w, prim->v[2].p.w, ∇->bc.dx);
-	∇->pcz.dy = fberp(prim->v[0].p.w, prim->v[1].p.w, prim->v[2].p.w, ∇->bc.dy);
 }
 
 static Rectangle
@@ -419,7 +411,6 @@
 	Point p;
 	Point3 bc;
 	Color c;
-	float z, pcz;
 	uint ropts;
 
 	prim = &task->p;
@@ -459,8 +450,6 @@
 	for(p.y = task->wr.min.y; p.y < task->wr.max.y; p.y++){
 		bc = ∇.bc.p0;
 		*sp->v = ∇.v.v0;
-		z = ∇.z.f0;
-		pcz = ∇.pcz.f0;
 	for(p.x = task->wr.min.x; p.x < task->wr.max.x; p.x++){
 //		if(p.x == task->wr.min.x || p.x == task->wr.max.x-1
 //		|| p.y == task->wr.min.y || p.y == task->wr.max.y-1){
@@ -472,12 +461,12 @@
 		if(bc.x < 0 || bc.y < 0 || bc.z < 0)
 			goto discard;
 
-		if((ropts & RODepth) && z <= getdepth(zr, p))
+		if((ropts & RODepth) && sp->v->p.z <= getdepth(zr, p))
 			goto discard;
 
 		/* perspective-correct attribute interpolation  */
 		v = *sp->v;
-		_mulvertex(sp->v, 1.0/(pcz < ε1? ε1: pcz));
+		_mulvertex(sp->v, 1.0/(sp->v->p.w < ε1? ε1: sp->v->p.w));
 
 		sp->p = p;
 		c = sp->stab->fs(sp);
@@ -485,9 +474,9 @@
 		if(c.a == 0)			/* discard non-colors */
 			goto discard;
 		if(ropts & RODepth)
-			putdepth(zr, p, z);
+			putdepth(zr, p, sp->v->p.z);
 		if(ropts & ROAbuff)
-			pushtoAbuf(sp->fb, p, c, z);
+			pushtoAbuf(sp->fb, p, c, sp->v->p.z);
 		else
 			pixel(cr, p, c, ropts & ROBlend);
 
@@ -496,13 +485,9 @@
 discard:
 		bc = addpt3(bc, ∇.bc.dx);
 		_addvertex(sp->v, &∇.v.dx);
-		z += ∇.z.dx;
-		pcz += ∇.pcz.dx;
 	}
 		∇.bc.p0 = addpt3(∇.bc.p0, ∇.bc.dy);
 		_addvertex(&∇.v.v0, &∇.v.dy);
-		∇.z.f0 += ∇.z.dy;
-		∇.pcz.f0 += ∇.pcz.dy;
 	}
 }
 
--- a/vertex.c
+++ b/vertex.c
@@ -90,6 +90,7 @@
 {
 	Vertexattr *va, *vb, *ve;
 
+	a->p = addpt3(a->p, b->p);
 	a->n = addpt3(a->n, b->n);
 	a->c = addpt3(a->c, b->c);
 	a->uv = addpt2(a->uv, b->uv);
@@ -103,6 +104,10 @@
 	}
 }
 
+/*
+ * this is only used for attribute linearization and subsequent
+ * perspective correction, so we can omit the position.
+ */
 void
 _mulvertex(BVertex *v, double s)
 {
--