shithub: libgraphics

Download patch

ref: 61d9f77e3c7999e88cd616ba0c09912fe4838792
parent: 534e1bec9497b97b4de91b58e078206eff061a7c
author: rodri <rgl@antares-labs.eu>
date: Fri Feb 20 14:00:26 EST 2026

vertex: clean and tidy

--- a/vertex.c
+++ b/vertex.c
@@ -10,13 +10,15 @@
 static void
 addvattr(Vertexattrs *v, Vertexattr *va)
 {
-	int i;
+	Vertexattr *vp, *ve;
 
 	assert(va->id != nil);
 
-	for(i = 0; i < v->nattrs; i++)
-		if(strcmp(v->attrs[i].id, va->id) == 0){
-			v->attrs[i] = *va;
+	vp = v->attrs;
+	ve = vp + v->nattrs;
+	for(; vp < ve; vp++)
+		if(strcmp(vp->id, va->id) == 0){
+			*vp = *va;
 			return;
 		}
 	if(v->nattrs == MAXVATTRS)
@@ -24,27 +26,6 @@
 	v->attrs[v->nattrs++] = *va;
 }
 
-static void
-copyvattrs(BVertex *d, BVertex *s)
-{
-	int i;
-
-	for(i = 0; i < s->nattrs; i++)
-		addvattr(d, &s->attrs[i]);
-}
-
-void
-_loadvertex(BVertex *d, BVertex *s)
-{
-	d->p = s->p;
-	d->n = s->n;
-	d->c = s->c;
-	d->uv = s->uv;
-	d->tangent = s->tangent;
-	d->mtl = s->mtl;
-	copyvattrs(d, s);
-}
-
 /*
  * linear attribute interpolation
  */
@@ -51,8 +32,7 @@
 void
 _lerpvertex(BVertex *v, BVertex *v0, BVertex *v1, double t)
 {
-	Vertexattr va;
-	int i;
+	Vertexattr va, *v0a, *v1a, *ve;
 
 	v->p = lerp3(v0->p, v1->p, t);
 	v->n = lerp3(v0->n, v1->n, t);
@@ -60,13 +40,17 @@
 	v->uv = lerp2(v0->uv, v1->uv, t);
 	v->tangent = lerp3(v0->tangent, v1->tangent, t);
 	v->mtl = v0->mtl != nil? v0->mtl: v1->mtl;
-	for(i = 0; i < v0->nattrs; i++){
-		va.id = v0->attrs[i].id;
-		va.type = v0->attrs[i].type;
+	v->nattrs = 0;
+	v0a = v0->attrs;
+	v1a = v1->attrs;
+	ve = v0a + v0->nattrs;
+	for(; v0a < ve; v0a++, v1a++){
+		va.id = v0a->id;
+		va.type = v0a->type;
 		if(va.type == VAPoint)
-			va.p = lerp3(v0->attrs[i].p, v1->attrs[i].p, t);
+			va.p = lerp3(v0a->p, v1a->p, t);
 		else
-			va.n = flerp(v0->attrs[i].n, v1->attrs[i].n, t);
+			va.n = flerp(v0a->n, v1a->n, t);
 		addvattr(v, &va);
 	}
 }
@@ -77,8 +61,7 @@
 void
 _berpvertex(BVertex *v, BVertex *v0, BVertex *v1, BVertex *v2, Point3 bc)
 {
-	Vertexattr va;
-	int i;
+	Vertexattr va, *v0a, *v1a, *v2a, *ve;
 
 	v->p = berp3(v0->p, v1->p, v2->p, bc);
 	v->n = berp3(v0->n, v1->n, v2->n, bc);
@@ -86,13 +69,18 @@
 	v->uv = berp2(v0->uv, v1->uv, v2->uv, bc);
 	v->tangent = berp3(v0->tangent, v1->tangent, v2->tangent, bc);
 	v->mtl = v0->mtl != nil? v0->mtl: v1->mtl != nil? v1->mtl: v2->mtl;
-	for(i = 0; i < v0->nattrs; i++){
-		va.id = v0->attrs[i].id;
-		va.type = v0->attrs[i].type;
+	v->nattrs = 0;
+	v0a = v0->attrs;
+	v1a = v1->attrs;
+	v2a = v2->attrs;
+	ve = v0a + v0->nattrs;
+	for(; v0a < ve; v0a++, v1a++, v2a++){
+		va.id = v0a->id;
+		va.type = v0a->type;
 		if(va.type == VAPoint)
-			va.p = berp3(v0->attrs[i].p, v1->attrs[i].p, v2->attrs[i].p, bc);
+			va.p = berp3(v0a->p, v1a->p, v2a->p, bc);
 		else
-			va.n = fberp(v0->attrs[i].n, v1->attrs[i].n, v2->attrs[i].n, bc);
+			va.n = fberp(v0a->n, v1a->n, v2a->n, bc);
 		addvattr(v, &va);
 	}
 }
@@ -100,14 +88,14 @@
 void
 _addvertex(BVertex *a, BVertex *b)
 {
-	Vertexattr *va, *vb;
+	Vertexattr *va, *vb, *ve;
 
 	a->n = addpt3(a->n, b->n);
 	a->c = addpt3(a->c, b->c);
 	a->uv = addpt2(a->uv, b->uv);
 	a->tangent = addpt3(a->tangent, b->tangent);
-	for(va = a->attrs; va < a->attrs + a->nattrs; va++){
-		vb = b->attrs + (va - a->attrs);
+	ve = a->attrs + a->nattrs;
+	for(va = a->attrs, vb = b->attrs; va < ve; va++, vb++){
 		if(va->type == VAPoint)
 			va->p = addpt3(va->p, vb->p);
 		else
@@ -118,13 +106,14 @@
 void
 _mulvertex(BVertex *v, double s)
 {
-	Vertexattr *va;
+	Vertexattr *va, *ve;
 
 	v->n = mulpt3(v->n, s);
 	v->c = mulpt3(v->c, s);
 	v->uv = mulpt2(v->uv, s);
 	v->tangent = mulpt3(v->tangent, s);
-	for(va = v->attrs; va < v->attrs + v->nattrs; va++){
+	ve = v->attrs + v->nattrs;
+	for(va = v->attrs; va < ve; va++){
 		if(va->type == VAPoint)
 			va->p = mulpt3(va->p, s);
 		else
@@ -150,11 +139,15 @@
 Vertexattr *
 _getvattr(Vertexattrs *v, char *id)
 {
-	int i;
+	Vertexattr *va, *ve;
 
-	for(i = 0; i < v->nattrs; i++)
-		if(id != nil && strcmp(v->attrs[i].id, id) == 0)
-			return &v->attrs[i];
+	if(id == nil)
+		return nil;
+
+	ve = v->attrs + v->nattrs;
+	for(va = v->attrs; va < ve; va++)
+		if(strcmp(va->id, id) == 0)
+			return va;
 	return nil;
 }
 
--