--- ray/src/common/rglmat.c 1998/06/09 11:18:35 3.1 +++ ray/src/common/rglmat.c 2003/04/23 02:28:06 3.4 @@ -1,22 +1,20 @@ -/* Copyright (c) 1998 Silicon Graphics, Inc. */ - #ifndef lint -static char SCCSid[] = "$SunId$ SGI"; +static const char RCSid[] = "$Id: rglmat.c,v 3.4 2003/04/23 02:28:06 greg Exp $"; #endif - /* * Routines for Radiance -> OpenGL materials. */ +#include "copyright.h" + #include "radogl.h" -extern int free(), freemtl(); - int domats = 1; /* are we doing materials? */ LUTAB mtab = LU_SINIT(free,freemtl); +void rgl_matclear() /* clean up materials */ { lu_done(&mtab); @@ -38,6 +36,7 @@ char *nam; } +int o_default(o) /* default object is non-material modifier */ register OBJREC *o; { @@ -55,15 +54,25 @@ register OBJREC *o; goto memerr; strcpy(lup->key, o->oname); } else if (lup->data != NULL) - freemtl(lup->data); + freemtl((MATREC *)lup->data); if ((lup->data = o->os) != NULL) /* make material reference */ ((MATREC *)lup->data)->nlinks++; - return; + return(0); memerr: error(SYSTEM, "out of memory in o_default"); + return(0); } +int +o_unsupported(o) /* unsupported object primitive */ +OBJREC *o; +{ + objerror(o, WARNING, "unsupported type"); + return(0); +} + + MATREC * newmaterial(nam) /* get an entry for a new material */ char *nam; @@ -78,7 +87,7 @@ char *nam; goto memerr; strcpy(lup->key, nam); } else if (lup->data != NULL) - freemtl(lup->data); + freemtl((MATREC *)lup->data); lup->data = (char *)malloc(sizeof(MATREC)); if (lup->data == NULL) goto memerr; @@ -89,14 +98,16 @@ memerr: } +void freemtl(mp) /* free a material */ register MATREC *mp; { if (!--mp->nlinks) - free((char *)mp); + free((void *)mp); } +int m_normal(o) /* compute normal material parameters */ register OBJREC *o; { @@ -125,9 +136,11 @@ register OBJREC *o; m->u.m.specexp = 2./(o->oargs.farg[4]*o->oargs.farg[4]); if (m->u.m.specexp > MAXSPECEXP) m->u.m.specexp = MAXSPECEXP; + return(0); } +int m_aniso(o) /* anisotropic material */ register OBJREC *o; { @@ -156,9 +169,11 @@ register OBJREC *o; m->u.m.specexp = 2./(o->oargs.farg[4]*o->oargs.farg[5]); if (m->u.m.specexp > MAXSPECEXP) m->u.m.specexp = MAXSPECEXP; + return(0); } +int m_glass(o) /* glass material (hopeless) */ OBJREC *o; { @@ -169,9 +184,11 @@ OBJREC *o; setcolor(m->u.m.ambdiff, 0., 0., 0.); setcolor(m->u.m.specular, .08, .08, .08); m->u.m.specexp = MAXSPECEXP; + return(0); } +int m_brdf(o) /* convert functional material */ register OBJREC *o; { @@ -195,9 +212,11 @@ register OBJREC *o; scalecolor(m->u.m.ambdiff, 1.-o->oargs.farg[4]); } m->u.m.specexp = UNKSPECEXP; + return(0); } +int m_brdf2(o) /* convert advanced functional material */ register OBJREC *o; { @@ -214,9 +233,11 @@ register OBJREC *o; /* guess the rest */ setcolor(m->u.m.specular, .1, .1, .1); m->u.m.specexp = UNKSPECEXP; + return(0); } +int m_light(o) /* convert light type */ register OBJREC *o; { @@ -242,9 +263,11 @@ register OBJREC *o; m->u.l.spotdir[0] = m->u.l.spotdir[1] = 0.; m->u.l.spotdir[2] = -1.; } + return(0); } +int m_mirror(o) /* convert mirror type */ register OBJREC *o; { @@ -258,9 +281,11 @@ register OBJREC *o; setcolor(m->u.m.specular, o->oargs.farg[0], o->oargs.farg[1], o->oargs.farg[2]); m->u.m.specexp = MAXSPECEXP; + return(0); } +int m_prism(o) /* convert prism type */ register OBJREC *o; { @@ -271,4 +296,5 @@ register OBJREC *o; setcolor(m->u.m.ambdiff, 0.2, 0.2, 0.2); setcolor(m->u.m.specular, 0.1, 0.1, 0.1); m->u.m.specexp = UNKSPECEXP; + return(0); }