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);
}