--- ray/src/hd/rhdobj.c 2003/02/22 02:07:24 3.11 +++ ray/src/hd/rhdobj.c 2018/10/05 19:19:16 3.21 @@ -1,21 +1,26 @@ #ifndef lint -static const char RCSid[] = "$Id: rhdobj.c,v 3.11 2003/02/22 02:07:24 greg Exp $"; +static const char RCSid[] = "$Id: rhdobj.c,v 3.21 2018/10/05 19:19:16 greg Exp $"; #endif /* * Routines for loading and displaying Radiance objects in rholo with GLX. */ +#include +#include + #include "radogl.h" #include "tonemap.h" #include "rhdisp.h" #include "rhdriver.h" #include "rhdobj.h" +#include "rtprocess.h" extern FILE *sstdout; /* user standard output */ char rhdcmd[DO_NCMDS][8] = DO_INIT; /* user command list */ -int (*dobj_lightsamp)() = NULL; /* pointer to function to get lights */ +/* pointer to function to get lights */ +void (*dobj_lightsamp)(COLR clr, FVECT direc, FVECT pos) = NULL; #define AVGREFL 0.5 /* assumed average reflectance */ @@ -29,7 +34,7 @@ int (*dobj_lightsamp)() = NULL; /* pointer to function #define NALT 11 /* # sampling altitude angles */ #endif #ifndef NAZI -#define NAZI ((int)(PI/2.*NALT+.5)) +#define NAZI 17 #endif typedef struct dlights { @@ -50,10 +55,10 @@ typedef struct dobject { struct dobject *next; /* next object in list */ char name[64]; /* object name */ FVECT center; /* orig. object center */ - FLOAT radius; /* orig. object radius */ + RREAL radius; /* orig. object radius */ int listid; /* GL display list identifier */ int nlists; /* number of lists allocated */ - int rtp[3]; /* associated rtrace process */ + SUBPROC rtp; /* associated rtrace process */ DLIGHTS *ol; /* object lights */ FULLXF xfb; /* coordinate transform */ short drawcode; /* drawing code */ @@ -81,12 +86,23 @@ static struct { #define curname (curobj==NULL ? (char *)NULL : curobj->name) +static DOBJECT *getdobj(char *nm); +static int freedobj(DOBJECT *op); +static int savedxf(DOBJECT *op); +static void ssph_sample(COLR clr, FVECT direc, FVECT pos); +static void ssph_direc(FVECT direc, int alt, int azi); +static int ssph_neigh(int sp[2], int next); +static int ssph_compute(void); +static int getdlights(DOBJECT *op, int force); +static void cmderror(int cn, char *err); + static DOBJECT * -getdobj(nm) /* get object from list by name */ -char *nm; +getdobj( /* get object from list by name */ + char *nm +) { - register DOBJECT *op; + DOBJECT *op; if (nm == NULL) return(NULL); @@ -99,13 +115,14 @@ char *nm; } -static -freedobj(op) /* free resources and memory assoc. with op */ -register DOBJECT *op; +static int +freedobj( /* free resources and memory assoc. with op */ + DOBJECT *op +) { int foundlink = 0; DOBJECT ohead; - register DOBJECT *opl; + DOBJECT *opl; if (op == NULL) return(0); @@ -118,7 +135,7 @@ register DOBJECT *op; dobjects = ohead.next; if (!foundlink) { glDeleteLists(op->listid, op->nlists); - close_process(op->rtp); + close_process(&(op->rtp)); } while (op->xfac) freestr(op->xfav[--op->xfac]); @@ -127,9 +144,10 @@ register DOBJECT *op; } -static -savedxf(op) /* save transform for display object */ -register DOBJECT *op; +static int +savedxf( /* save transform for display object */ + DOBJECT *op +) { /* free old */ while (lastxfac) @@ -147,14 +165,16 @@ register DOBJECT *op; } -static -ssph_sample(clr, direc, pos) /* add sample to current source sphere */ -COLR clr; -FVECT direc, pos; +static void +ssph_sample( /* add sample to current source sphere */ + COLR clr, + FVECT direc, + FVECT pos +) { COLOR col; double d; - register int alt, azi; + int alt, azi; if (dlightsets == NULL) return; @@ -174,10 +194,12 @@ FVECT direc, pos; } -static -ssph_direc(direc, alt, azi) /* compute sphere sampling direction */ -FVECT direc; -int alt, azi; +static void +ssph_direc( /* compute sphere sampling direction */ + FVECT direc, + int alt, + int azi +) { double phi, d; @@ -190,13 +212,14 @@ int alt, azi; static int -ssph_neigh(sp, next) /* neighbor counter on sphere */ -register int sp[2]; -int next; +ssph_neigh( /* neighbor counter on sphere */ + int sp[2], + int next +) { static short nneigh = 0; /* neighbor count */ static short neighlist[NAZI+6][2]; /* neighbor list (0 is home) */ - register int i; + int i; if (next) { if (nneigh <= 0) @@ -205,7 +228,7 @@ int next; sp[1] = neighlist[nneigh][1]; return(1); } - if (sp[0] < 0 | sp[0] >= NALT | sp[1] < 0 | sp[1] >= NAZI) + if ((sp[0] < 0) | (sp[0] >= NALT) | (sp[1] < 0) | (sp[1] >= NAZI)) return(nneigh=0); neighlist[0][0] = sp[0]; neighlist[0][1] = sp[1]; nneigh = 1; @@ -255,16 +278,16 @@ int next; } -static -ssph_compute() /* compute source set from sphere samples */ +static int +ssph_compute(void) /* compute source set from sphere samples */ { int ncells, nsamps; COLOR csum; FVECT v; double d, thresh, maxbr; int maxalt, maxazi, spos[2]; - register int alt, azi; - register struct lsource *ls; + int alt, azi; + struct lsource *ls; /* count & average sampled cells */ setcolor(csum, 0., 0., 0.); ncells = nsamps = 0; @@ -279,7 +302,7 @@ ssph_compute() /* compute source set from sphere sam nsamps += ssamp[alt][azi].nsamp; ncells++; } - if (dlightsets == NULL | ncells < NALT*NAZI/4) { + if ((dlightsets == NULL) | (ncells < NALT*NAZI/4)) { ncells = 0; goto done; } @@ -297,7 +320,8 @@ ssph_compute() /* compute source set from sphere sam /* avg. reflected brightness */ d = AVGREFL / (double)ncells; scalecolor(csum, d); - if (tmCvColors(&dlightsets->larb, TM_NOCHROM, &csum, 1) != TM_E_OK) + if (tmCvColors(tmGlobal, &dlightsets->larb, + TM_NOCHROM, &csum, 1) != TM_E_OK) error(CONSISTENCY, "tone mapping problem in ssph_compute"); /* greedy light source clustering */ while (dlightsets->nl < MAXLIGHTS) { @@ -337,20 +361,21 @@ ssph_compute() /* compute source set from sphere sam d = 1.0/ncells; scalecolor(dlightsets->lamb, d); done: /* clear sphere sample array */ - bzero((char *)ssamp, sizeof(ssamp)); + memset((void *)ssamp, '\0', sizeof(ssamp)); return(ncells); } -static -getdlights(op, force) /* get lights for display object */ -register DOBJECT *op; -int force; +static int +getdlights( /* get lights for display object */ + DOBJECT *op, + int force +) { double d2, mind2 = FHUGE*FHUGE; FVECT ocent; VIEW cvw; - register DLIGHTS *dl; + DLIGHTS *dl; op->ol = NULL; if (op->drawcode != DO_LIGHT) @@ -370,7 +395,7 @@ int force; if (!force) return(0); /* need to compute new light set */ - copystruct(&cvw, &stdview); + cvw = stdview; cvw.type = VT_PER; VCOPY(cvw.vp, ocent); cvw.vup[0] = 1.; cvw.vup[1] = cvw.vup[2] = 0.; @@ -411,13 +436,15 @@ int force; return(1); memerr: error(SYSTEM, "out of memory in getdlights"); + return 0; /* pro forma return */ } -static -cmderror(cn, err) /* report command error */ -int cn; -char *err; +static void +cmderror( /* report command error */ + int cn, + char *err +) { sprintf(errmsg, "%s: %s", rhdcmd[cn], err); error(COMMAND, errmsg); @@ -425,13 +452,14 @@ char *err; int -dobj_command(cmd, args) /* run object display command */ -char *cmd; -register char *args; +dobj_command( /* run object display command */ + char *cmd, + char *args +) { int somechange = 0; - int cn, na, doxfm; - register int nn; + int cn, na; + int nn; char *alist[MAXAC+1], *nm; /* find command */ for (cn = 0; cn < DO_NCMDS; cn++) @@ -528,16 +556,19 @@ register char *args; } return(somechange); toomany: - return(cmderror(cn, "too many arguments")); + cmderror(cn, "too many arguments"); + return(-1); } -dobj_load(oct, nam) /* create/load an octree object */ -char *oct, *nam; +int +dobj_load( /* create/load an octree object */ + char *oct, + char *nam +) { - extern char *getlibpath(), *getpath(); char *fpp, fpath[128]; - register DOBJECT *op; + DOBJECT *op; /* check arguments */ if (oct == NULL) { error(COMMAND, "missing octree"); @@ -547,7 +578,7 @@ char *oct, *nam; error(COMMAND, "missing name"); return(0); } - if (*nam == '*' | *nam == '-') { + if ((*nam == '*') | (*nam == '-')) { error(COMMAND, "illegal name"); return(0); } @@ -556,7 +587,7 @@ char *oct, *nam; return(0); } /* get octree path */ - if ((fpp = getpath(oct, getlibpath(), R_OK)) == NULL) { + if ((fpp = getpath(oct, getrlibpath(), R_OK)) == NULL) { sprintf(errmsg, "cannot find octree \"%s\"", oct); error(COMMAND, errmsg); return(0); @@ -579,7 +610,7 @@ char *oct, *nam; /* start rtrace */ rtargv[RTARGC-1] = fpath; rtargv[RTARGC] = NULL; - open_process(op->rtp, rtargv); + open_process(&(op->rtp), rtargv); /* insert into main list */ op->next = dobjects; curobj = dobjects = op; @@ -588,10 +619,12 @@ char *oct, *nam; } -dobj_unload(nam) /* free the named object */ -char *nam; +int +dobj_unload( /* free the named object */ + char *nam +) { - register DOBJECT *op; + DOBJECT *op; if ((op = getdobj(nam)) == NULL) { error(COMMAND, "no object"); @@ -603,9 +636,10 @@ char *nam; } -dobj_cleanup() /* free all resources */ +int +dobj_cleanup(void) /* free all resources */ { - register DLIGHTS *lp; + DLIGHTS *lp; while (dobjects != NULL) freedobj(dobjects); @@ -618,12 +652,15 @@ dobj_cleanup() /* free all resources */ } -dobj_xform(nam, rel, ac, av) /* set/add transform for nam */ -char *nam; -int rel, ac; -char **av; +int +dobj_xform( /* set/add transform for nam */ + char *nam, + int rel, + int ac, + char **av +) { - register DOBJECT *op; + DOBJECT *op; FVECT cent; double rad; char scoord[16]; @@ -680,13 +717,15 @@ char **av; } -dobj_putstats(nam, fp) /* put out statistics for nam */ -char *nam; -FILE *fp; +int +dobj_putstats( /* put out statistics for nam */ + char *nam, + FILE *fp +) { FVECT ocent; - register DOBJECT *op; - register int i; + DOBJECT *op; + int i; if (nam == NULL) { error(COMMAND, "no current object"); @@ -721,7 +760,8 @@ FILE *fp; } -dobj_unmove() /* undo last transform change */ +int +dobj_unmove(void) /* undo last transform change */ { int txfac; char *txfav[MAXAC+1]; @@ -731,13 +771,13 @@ dobj_unmove() /* undo last transform change */ return(0); } /* hold last transform */ - bcopy((char *)lastxfav, (char *)txfav, + memcpy((void *)txfav, (void *)lastxfav, (txfac=lastxfac)*sizeof(char *)); /* save this transform */ - bcopy((char *)curobj->xfav, (char *)lastxfav, + memcpy((void *)lastxfav, (void *)curobj->xfav, (lastxfac=curobj->xfac)*sizeof(char *)); /* copy back last transform */ - bcopy((char *)txfav, (char *)curobj->xfav, + memcpy((void *)curobj->xfav, (void *)txfav, (curobj->xfac=txfac)*sizeof(char *)); /* set matrices */ fullxf(&curobj->xfb, curobj->xfac, curobj->xfav); @@ -747,10 +787,13 @@ dobj_unmove() /* undo last transform change */ } -dobj_dup(oldnm, nam) /* duplicate object oldnm as nam */ -char *oldnm, *nam; +int +dobj_dup( /* duplicate object oldnm as nam */ + char *oldnm, + char *nam +) { - register DOBJECT *op, *opdup; + DOBJECT *op, *opdup; /* check arguments */ if ((op = getdobj(oldnm)) == NULL) { error(COMMAND, "no object"); @@ -760,7 +803,7 @@ char *oldnm, *nam; error(COMMAND, "missing name"); return(0); } - if (*nam == '*' | *nam == '-') { + if ((*nam == '*') | (*nam == '-')) { error(COMMAND, "illegal name"); return(0); } @@ -772,7 +815,7 @@ char *oldnm, *nam; opdup = (DOBJECT *)malloc(sizeof(DOBJECT)); if (opdup == NULL) error(SYSTEM, "out of memory in dobj_dup"); - copystruct(opdup, op); + *opdup = *op; /* rename */ strcpy(opdup->name, nam); /* get our own copy of transform */ @@ -786,13 +829,15 @@ char *oldnm, *nam; } -dobj_lighting(nam, cn) /* set up lighting for display object */ -char *nam; -int cn; +int +dobj_lighting( /* set up lighting for display object */ + char *nam, + int cn +) { int i, res[2]; VIEW *dv; - register DOBJECT *op; + DOBJECT *op; if (nam == NULL) { error(COMMAND, "no current object"); @@ -820,15 +865,18 @@ int cn; beam_view(dv, res[0], res[1]); beam_sync(1); /* update server */ } + return 0; /* XXX not sure if this is the right value */ } double -dobj_trace(nm, rorg, rdir) /* check for ray intersection with object(s) */ -char nm[]; -FVECT rorg, rdir; +dobj_trace( /* check for ray intersection with object(s) */ + char nm[], + FVECT rorg, + FVECT rdir +) { - register DOBJECT *op; + DOBJECT *op; FVECT xorg, xdir; double darr[6]; /* check each visible object? */ @@ -860,7 +908,7 @@ FVECT rorg, rdir; VCOPY(darr, rorg); VCOPY(darr+3, rdir); } /* trace it */ - if (process(op->rtp, (char *)darr, (char *)darr, sizeof(double), + if (process(&(op->rtp), (char *)darr, (char *)darr, sizeof(double), 6*sizeof(double)) != sizeof(double)) error(SYSTEM, "rtrace communication error"); /* return distance */ @@ -871,14 +919,14 @@ FVECT rorg, rdir; int -dobj_render() /* render our objects in OpenGL */ +dobj_render(void) /* render our objects in OpenGL */ { int nrendered = 0; GLboolean normalizing; GLfloat vec[4]; FVECT v1; - register DOBJECT *op; - register int i; + DOBJECT *op; + int i; /* anything to render? */ for (op = dobjects; op != NULL; op = op->next) if (op->drawcode != DO_HIDE) @@ -906,11 +954,11 @@ dobj_render() /* render our objects in OpenGL */ continue; /* set up lighting */ if (op->drawcode == DO_LIGHT && op->ol != NULL) { - BYTE pval; + uby8 pval; double expval, d; /* use computed sources */ - if (tmMapPixels(&pval, &op->ol->larb, TM_NOCHROM, 1) - != TM_E_OK) + if (tmMapPixels(tmGlobal, &pval, &op->ol->larb, + TM_NOCHROM, 1) != TM_E_OK) error(CONSISTENCY, "dobj_render w/o tone map"); expval = pval * (WHTEFFICACY/256.) / tmLuminance(op->ol->larb); @@ -956,8 +1004,8 @@ dobj_render() /* render our objects in OpenGL */ } /* set up object transform */ if (op->xfac) { - if (!normalizing && op->xfb.f.sca < 1.-FTINY | - op->xfb.f.sca > 1.+FTINY) + if (!normalizing && (op->xfb.f.sca < 1.-FTINY) | + (op->xfb.f.sca > 1.+FTINY)) glEnable(GL_NORMALIZE); glMatrixMode(GL_MODELVIEW); glPushMatrix();