ref: db7337728f11c548d1cec193bddc1ca674bc7396
parent: cec6d8e1663ee9c65047c32d156c80892cf32dc7
author: rodri <rgl@antares-labs.eu>
date: Fri Mar 14 19:24:41 EDT 2025
scene: add material management procedures. also add a way to retrieve materials by name.
--- a/graphics.h
+++ b/graphics.h
@@ -181,10 +181,9 @@
Material *materials;
ulong nmaterials;
- Texture *tex; /* texture map (TODO get rid of it, use materials) */
-
int (*addprim)(Model*, Primitive);
int (*addmaterial)(Model*, Material);
+ Material *(*getmaterial)(Model*, char*);
};
struct Entity
@@ -418,6 +417,8 @@
int exportmodel(char*, Model*, int);
/* scene */
+Material *newmaterial(char*);
+void delmaterial(Material*);
Model *newmodel(void);
Model *dupmodel(Model*);
void delmodel(Model*);
--- a/scene.c
+++ b/scene.c
@@ -7,6 +7,34 @@
#include "graphics.h"
#include "internal.h"
+Material *
+newmaterial(char *name)
+{
+ Material *mtl;
+
+ if(name == nil){
+ werrstr("needs a name");
+ return nil;
+ }
+
+ mtl = emalloc(sizeof *mtl);
+ memset(mtl, 0, sizeof *mtl);
+ mtl->name = strdup(name);
+ mtl->ambient = Pt3(1,1,1,1);
+ mtl->diffuse = Pt3(1,1,1,1);
+ mtl->specular = Pt3(1,1,1,1);
+ return mtl;
+}
+
+void
+delmaterial(Material *mtl)
+{
+ freetexture(mtl->diffusemap);
+ freetexture(mtl->specularmap);
+ freetexture(mtl->normalmap);
+ free(mtl->name);
+}
+
static int
model_addprim(Model *m, Primitive p)
{
@@ -23,6 +51,17 @@
return m->nmaterials-1;
}
+static Material *
+model_getmaterial(Model *m, char *name)
+{
+ Material *mtl;
+
+ for(mtl = m->materials; mtl < m->materials+m->nmaterials; mtl++)
+ if(strcmp(mtl->name, name) == 0)
+ return mtl;
+ return nil;
+}
+
Model *
newmodel(void)
{
@@ -32,6 +71,7 @@
memset(m, 0, sizeof *m);
m->addprim = model_addprim;
m->addmaterial = model_addmaterial;
+ m->getmaterial = model_getmaterial;
return m;
}
@@ -45,7 +85,6 @@
return nil;
nm = newmodel();
- nm->tex = duptexture(m->tex);
if(m->nmaterials > 0){
nm->nmaterials = m->nmaterials;
nm->materials = emalloc(nm->nmaterials*sizeof(*nm->materials));
@@ -77,13 +116,8 @@
if(m == nil)
return;
- 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);
- }
+ while(m->nmaterials--)
+ delmaterial(&m->materials[m->nmaterials]);
free(m->materials);
free(m->prims);
free(m);