shithub: libgraphics

Download patch

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