shithub: libgraphics

Download patch

ref: 7dc2c0d02e6fb4fbdafb15bd66aa7d45768eb6ac
parent: aad0e63683c0b66cdd8d30c0253aafc5e4da0ef0
author: rodri <rgl@antares-labs.eu>
date: Fri Aug 23 08:41:28 EDT 2024

methods to add primitives and materials to a Model.

--- a/camera.c
+++ b/camera.c
@@ -68,9 +68,8 @@
 				if(i > 0)
 					t[j].v[k].p = qrotate(t[j].v[k].p, axes[i%3], PI/2);
 
-		m->prims = erealloc(m->prims, (m->nprims += 2)*sizeof(*m->prims));
-		m->prims[m->nprims-2] = t[0];
-		m->prims[m->nprims-1] = t[1];
+		m->addprim(m, t[0]);
+		m->addprim(m, t[1]);
 	}
 	return m;
 }
--- a/graphics.h
+++ b/graphics.h
@@ -164,6 +164,9 @@
 	ulong nmaterials;
 
 	Texture *tex;		/* texture map (TODO get rid of it, use materials) */
+
+	int (*addprim)(Model*, Primitive);
+	int (*addmaterial)(Model*, Material);
 };
 
 struct Entity
--- a/scene.c
+++ b/scene.c
@@ -8,6 +8,22 @@
 #include "graphics.h"
 #include "internal.h"
 
+static int
+model_addprim(Model *m, Primitive p)
+{
+	m->prims = erealloc(m->prims, ++m->nprims*sizeof(*m->prims));
+	m->prims[m->nprims-1] = p;
+	return 0;
+}
+
+static int
+model_addmaterial(Model *m, Material mtl)
+{
+	m->materials = erealloc(m->materials, ++m->nmaterials*sizeof(*m->materials));
+	m->materials[m->nmaterials-1] = mtl;
+	return 0;
+}
+
 Model *
 newmodel(void)
 {
@@ -15,6 +31,8 @@
 
 	m = emalloc(sizeof *m);
 	memset(m, 0, sizeof *m);
+	m->addprim = model_addprim;
+	m->addmaterial = model_addmaterial;
 	return m;
 }
 
@@ -35,6 +53,7 @@
 		for(i = 0; i < m->nmaterials; i++){
 			nm->materials[i] = m->materials[i];
 			nm->materials[i].diffusemap = duptexture(m->materials[i].diffusemap);
+			nm->materials[i].specularmap = duptexture(m->materials[i].specularmap);
 			nm->materials[i].normalmap = duptexture(m->materials[i].normalmap);
 			nm->materials[i].name = strdup(m->materials[i].name);
 			if(nm->materials[i].name == nil)
@@ -62,6 +81,7 @@
 	freetexture(m->tex);
 	while(m->nmaterials--){
 		freetexture(m->materials[m->nmaterials].diffusemap);
+		freetexture(m->materials[m->nmaterials].specularmap);
 		freetexture(m->materials[m->nmaterials].normalmap);
 		free(m->materials[m->nmaterials].name);
 	}