Files
CydandClaude Fable 5 db7745fcd0 sda4: commit the Glaze developer hard-drive dump
Un-ignored: the dev drive is the ground truth the restoration and
emulator work constantly reference (DPL3/LIBDPL + VRENDER i860 renderer
source, BT/RP live+dev game trees, VGL_LABS pod boot, scene/audio
content). Kept in-repo for the pod-owner community.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 19:41:15 -05:00

267 lines
5.8 KiB
C++

/*
File material.c
Project pazpl5
Author P J Atkin
(c) DIVISION Ltd 1993
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pazpl5.h"
/*{{{ some PAZlists used in here*/
/*
list of currently resolved materials
*/
static PAZlist *material_head=NULL, *material_tail=NULL;
/*
list of PATCHES containing unresolved front materials
*/
static PAZlist *funresolved_head=NULL, *funresolved_tail=NULL;
/*
list of PATCHES containing unresolved back materials
*/
static PAZlist *bunresolved_head=NULL, *bunresolved_tail=NULL;
/*
list of currently resolved textures
*/
static PAZlist *texture_head=NULL, *texture_tail=NULL;
/*
list of MATERIALs containing unresolved textures
*/
static PAZlist *unresolved_tex_head=NULL, *unresolved_tex_tail=NULL;
/*}}} */
extern OBJLIST sceneGeometry;
/*
#define debug_mtl 1
*/
int scene_resolved=0;
/*{{{ void add_material ( MATERIAL *m )*/
/* ******************
append a new material to list, and attempt to resolve PATCH list
*/
void add_material ( MATERIAL *m )
{
#if debug_mtl
printf ("adding material %s\n", m->material_name );
#endif
addPAZitem ( m, &material_head, &material_tail );
scene_resolved=0;
}
/*}}} */
/*{{{ MATERIAL *create_material ()*/
MATERIAL *create_material ()
{
MATERIAL *m=(MATERIAL *) malloc(sizeof(MATERIAL));
if (m==NULL) return NULL;
#if debug_mtl
printf ("create_material\n" );
#endif
m->usage_count=0;
m->material_name[0]=(char) 0x0;
m->triangle_fn=NULL;
m->pxpl5codeword=0x0;
m->kd[0] =1.0f;
m->kd[1] =0.0f;
m->kd[2] =0.0f;
m->ks =0.0f;
m->power =0.0f;
m->opacity =1.0f;
m->tex =NULL;
m->ramp_entry =0x0;
strcpy ( m->material_name, "DEFAULT" );
strcpy ( m->texture_name, "DEFAULT" );
return m;
}
/*}}} */
/*{{{ void delete_material ( MATERIAL *m)*/
void delete_material ( MATERIAL *m)
{
PAZlist *mtl_item;
MATERIAL *check;
if ((mtl_item=findPAZitem( m, &material_head, &material_tail)) != NULL) {
check=removePAZitem ( mtl_item, &material_head, &material_tail );
if (m == check) free(m);
scene_resolved=0;
}
else {
/* this was never exported ! */
free(m);
}
}
/*}}} */
/*{{{ void add_texture ( TEXTURE *t )*/
/* ******************
append a new texture to list, and attempt to resolve MATERIAL list
*/
void add_texture ( TEXTURE *t )
{
#if debug_mtl
printf ("adding texture %s\n", t->texture_name );
#endif
addPAZitem ( t, &texture_head, &texture_tail );
scene_resolved=0;
}
/*}}} */
/*{{{ void trace_materials ()*/
/* ******************
debug, trace materials
*/
void trace_materials ()
{
PAZlist *item;
PATCH *p;
MATERIAL *m, *mtl;
TEXTURE *t;
/*{{{ printf ("trace materials\n" );*/
printf ("trace materials\n" );
for (item=material_head; item; item=item->next ) {
mtl=(MATERIAL *) item->data;
printf ( "material name %s\n", mtl->material_name );
}
/*}}} */
/*{{{ printf ("trace textures\n" );*/
printf ("trace textures\n" );
item=texture_head;
while (item) {
t=(TEXTURE *) item->data;
printf ( "texture %s\n", t->texture_name );
item=item->next;
}
/*}}} */
}
/*}}} */
/*{{{ int resolve_scene ( SCENE *s )*/
int resolve_scene ( SCENE *s )
{
/* this is the UTTERLY brute force scene material / texture resolver */
/* first all materials are resolved to their respective textures */
/* then all patch / pmeshes are resolved to their respective materials */
if (scene_resolved == 0) {
OBJECT *obj;
PAZlist *m=material_head;
/* trace_materials(); */
while (m) {
/*{{{ resolve this material*/
PAZlist *t=texture_head;
MATERIAL *mtl=(MATERIAL *) m->data;
int resolved=0;
mtl->tex=NULL;
while (resolved==0) {
if (t==NULL) {
/*
printf ("couldnt find texture %s, nulling\n", mtl->texture_name );
*/
mtl->tex=0;
resolved=1;
}
else {
TEXTURE *tex=(TEXTURE *) t->data;
if (strcmp(mtl->texture_name, tex->texture_name) == 0) {
resolved=1;
mtl->tex=tex;
}
else
t=t->next;
}
}
/*}}} */
m=m->next;
}
for (obj=sceneGeometry.head; obj; obj=obj->next ) {
LOD *l;
PATCH *p;
for (l=obj->head; l; l=l->next ) {
for (p=l->head; p; p=p->next ) {
int f_resolved=0,
b_resolved=0;
p->fmaterial=NULL;
p->bmaterial=NULL;
m=material_head;
while ((f_resolved==0)||(b_resolved==0)) {
/*{{{ resolve this patch*/
MATERIAL *mtl=m->data;
/*
printf ("fpatch %s bpatch %s mtl %s\n",
p->fmaterial_name,
p->bmaterial_name,
mtl->material_name );
*/
if (strcmp(mtl->material_name, p->fmaterial_name) == 0) {
f_resolved=1;
/* printf ("front resolved\n" ); */
p->fmaterial=mtl;
}
if (strcmp(mtl->material_name, p->bmaterial_name) == 0) {
b_resolved=1;
/* printf ("back resolved\n" ); */
p->bmaterial=mtl;
}
/*}}} */
m=m->next;
if (m==NULL) {
if (f_resolved==0) p->fmaterial=NULL;
if (b_resolved==0) p->bmaterial=NULL;
f_resolved=1;
b_resolved=1;
}
}
}
}
}
}
scene_resolved=1;
}
/*}}} */