ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/rhdobj.c
(Generate patch)

Comparing ray/src/hd/rhdobj.c (file contents):
Revision 3.10 by gwlarson, Fri Jan 29 15:33:36 1999 UTC vs.
Revision 3.17 by greg, Tue Mar 30 20:40:04 2004 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1998 Silicon Graphics, Inc. */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ SGI";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Routines for loading and displaying Radiance objects in rholo with GLX.
6   */
7  
8 + #include <string.h>
9 + #include <ctype.h>
10 +
11   #include "radogl.h"
12   #include "tonemap.h"
13   #include "rhdisp.h"
14   #include "rhdriver.h"
15   #include "rhdobj.h"
16 + #include "rtprocess.h"
17  
18   extern FILE     *sstdout;               /* user standard output */
19  
20   char    rhdcmd[DO_NCMDS][8] = DO_INIT;  /* user command list */
21  
22 < int     (*dobj_lightsamp)() = NULL;     /* pointer to function to get lights */
22 > /* pointer to function to get lights */
23 > void    (*dobj_lightsamp)(COLR clr, FVECT direc, FVECT pos) = NULL;
24  
25   #define AVGREFL         0.5             /* assumed average reflectance */
26  
# Line 53 | Line 55 | typedef struct dobject {
55          struct dobject  *next;          /* next object in list */
56          char    name[64];               /* object name */
57          FVECT   center;                 /* orig. object center */
58 <        FLOAT   radius;                 /* orig. object radius */
58 >        RREAL   radius;                 /* orig. object radius */
59          int     listid;                 /* GL display list identifier */
60          int     nlists;                 /* number of lists allocated */
61 <        int     rtp[3];                 /* associated rtrace process */
61 >        SUBPROC rtp;                    /* associated rtrace process */
62          DLIGHTS *ol;                    /* object lights */
63          FULLXF  xfb;                    /* coordinate transform */
64          short   drawcode;               /* drawing code */
# Line 84 | Line 86 | static struct {
86  
87   #define curname         (curobj==NULL ? (char *)NULL : curobj->name)
88  
89 + static DOBJECT *getdobj(char *nm);
90 + static int freedobj(DOBJECT *op);
91 + static int savedxf(DOBJECT *op);
92 + static void ssph_sample(COLR clr, FVECT direc, FVECT pos);
93 + static void ssph_direc(FVECT direc, int alt, int azi);
94 + static int ssph_neigh(int sp[2], int next);
95 + static int ssph_compute(void);
96 + static int getdlights(DOBJECT *op, int force);
97 + static void cmderror(int cn, char *err);
98  
99 +
100   static DOBJECT *
101 < getdobj(nm)                     /* get object from list by name */
102 < char    *nm;
101 > getdobj(                        /* get object from list by name */
102 >        char    *nm
103 > )
104   {
105          register DOBJECT        *op;
106  
# Line 102 | Line 115 | char   *nm;
115   }
116  
117  
118 < static
119 < freedobj(op)                    /* free resources and memory assoc. with op */
120 < register DOBJECT        *op;
118 > static int
119 > freedobj(                       /* free resources and memory assoc. with op */
120 >        register DOBJECT        *op
121 > )
122   {
123          int     foundlink = 0;
124          DOBJECT ohead;
# Line 121 | Line 135 | register DOBJECT       *op;
135          dobjects = ohead.next;
136          if (!foundlink) {
137                  glDeleteLists(op->listid, op->nlists);
138 <                close_process(op->rtp);
138 >                close_process(&(op->rtp));
139          }
140          while (op->xfac)
141                  freestr(op->xfav[--op->xfac]);
142 <        free((char *)op);
142 >        free((void *)op);
143          return(1);
144   }
145  
146  
147 < static
148 < savedxf(op)                     /* save transform for display object */
149 < register DOBJECT        *op;
147 > static int
148 > savedxf(                        /* save transform for display object */
149 >        register DOBJECT        *op
150 > )
151   {
152                                          /* free old */
153          while (lastxfac)
# Line 150 | Line 165 | register DOBJECT       *op;
165   }
166  
167  
168 < static
169 < ssph_sample(clr, direc, pos)    /* add sample to current source sphere */
170 < COLR    clr;
171 < FVECT   direc, pos;
168 > static void
169 > ssph_sample(    /* add sample to current source sphere */
170 >        COLR    clr,
171 >        FVECT   direc,
172 >        FVECT   pos
173 > )
174   {
175          COLOR   col;
176          double  d;
# Line 177 | Line 194 | FVECT  direc, pos;
194   }
195  
196  
197 < static
198 < ssph_direc(direc, alt, azi)     /* compute sphere sampling direction */
199 < FVECT   direc;
200 < int     alt, azi;
197 > static void
198 > ssph_direc(     /* compute sphere sampling direction */
199 >        FVECT   direc,
200 >        int     alt,
201 >        int     azi
202 > )
203   {
204          double  phi, d;
205  
# Line 193 | Line 212 | int    alt, azi;
212  
213  
214   static int
215 < ssph_neigh(sp, next)            /* neighbor counter on sphere */
216 < register int    sp[2];
217 < int     next;
215 > ssph_neigh(             /* neighbor counter on sphere */
216 >        register int    sp[2],
217 >        int     next
218 > )
219   {
220          static short    nneigh = 0;             /* neighbor count */
221          static short    neighlist[NAZI+6][2];   /* neighbor list (0 is home) */
# Line 208 | Line 228 | int    next;
228                  sp[1] = neighlist[nneigh][1];
229                  return(1);
230          }
231 <        if (sp[0] < 0 | sp[0] >= NALT | sp[1] < 0 | sp[1] >= NAZI)
231 >        if ((sp[0] < 0) | (sp[0] >= NALT) | (sp[1] < 0) | (sp[1] >= NAZI))
232                  return(nneigh=0);
233          neighlist[0][0] = sp[0]; neighlist[0][1] = sp[1];
234          nneigh = 1;
# Line 258 | Line 278 | int    next;
278   }
279  
280  
281 < static
282 < ssph_compute()                  /* compute source set from sphere samples */
281 > static int
282 > ssph_compute(void)                      /* compute source set from sphere samples */
283   {
284          int     ncells, nsamps;
285          COLOR   csum;
# Line 282 | Line 302 | ssph_compute()                 /* compute source set from sphere sam
302                                  nsamps += ssamp[alt][azi].nsamp;
303                                  ncells++;
304                          }
305 <        if (dlightsets == NULL | ncells < NALT*NAZI/4) {
305 >        if ((dlightsets == NULL) | (ncells < NALT*NAZI/4)) {
306                  ncells = 0;
307                  goto done;
308          }
# Line 300 | Line 320 | ssph_compute()                 /* compute source set from sphere sam
320                                                  /* avg. reflected brightness */
321          d = AVGREFL / (double)ncells;  
322          scalecolor(csum, d);
323 <        if (tmCvColors(&dlightsets->larb, TM_NOCHROM, csum, 1) != TM_E_OK)
323 >        if (tmCvColors(&dlightsets->larb, TM_NOCHROM, &csum, 1) != TM_E_OK)
324                  error(CONSISTENCY, "tone mapping problem in ssph_compute");
325                                          /* greedy light source clustering */
326          while (dlightsets->nl < MAXLIGHTS) {
# Line 340 | Line 360 | ssph_compute()                 /* compute source set from sphere sam
360          d = 1.0/ncells;
361          scalecolor(dlightsets->lamb, d);
362   done:                                   /* clear sphere sample array */
363 <        bzero((char *)ssamp, sizeof(ssamp));
363 >        memset((void *)ssamp, '\0', sizeof(ssamp));
364          return(ncells);
365   }
366  
367  
368 < static
369 < getdlights(op, force)           /* get lights for display object */
370 < register DOBJECT        *op;
371 < int     force;
368 > static int
369 > getdlights(             /* get lights for display object */
370 >        register DOBJECT        *op,
371 >        int     force
372 > )
373   {
374          double  d2, mind2 = FHUGE*FHUGE;
375          FVECT   ocent;
# Line 373 | Line 394 | int    force;
394          if (!force)
395                  return(0);
396                                          /* need to compute new light set */
397 <        copystruct(&cvw, &stdview);
397 >        cvw = stdview;
398          cvw.type = VT_PER;
399          VCOPY(cvw.vp, ocent);
400          cvw.vup[0] = 1.; cvw.vup[1] = cvw.vup[2] = 0.;
# Line 407 | Line 428 | int    force;
428                          quit(0);
429          if (!ssph_compute()) {          /* compute light sources from sphere */
430                  dlightsets = dl->next;
431 <                free((char *)dl);
431 >                free((void *)dl);
432                  return(0);
433          }
434          op->ol = dl;
435          return(1);
436   memerr:
437          error(SYSTEM, "out of memory in getdlights");
438 +        return 0; /* pro forma return */
439   }
440  
441  
442 < static
443 < cmderror(cn, err)               /* report command error */
444 < int     cn;
445 < char    *err;
442 > static void
443 > cmderror(               /* report command error */
444 >        int     cn,
445 >        char    *err
446 > )
447   {
448          sprintf(errmsg, "%s: %s", rhdcmd[cn], err);
449          error(COMMAND, errmsg);
450   }
451  
452  
453 < int
454 < dobj_command(cmd, args)         /* run object display command */
455 < char    *cmd;
456 < register char   *args;
453 > extern int
454 > dobj_command(           /* run object display command */
455 >        char    *cmd,
456 >        register char   *args
457 > )
458   {
459          int     somechange = 0;
460 <        int     cn, na, doxfm;
460 >        int     cn, na;
461          register int    nn;
462          char    *alist[MAXAC+1], *nm;
463                                          /* find command */
# Line 531 | Line 555 | register char  *args;
555          }
556          return(somechange);
557   toomany:
558 <        return(cmderror(cn, "too many arguments"));
558 >        cmderror(cn, "too many arguments");
559 >        return(-1);
560   }
561  
562  
563 < dobj_load(oct, nam)             /* create/load an octree object */
564 < char    *oct, *nam;
563 > extern int
564 > dobj_load(              /* create/load an octree object */
565 >        char    *oct,
566 >        char    *nam
567 > )
568   {
541        extern char     *getlibpath(), *getpath();
569          char    *fpp, fpath[128];
570          register DOBJECT        *op;
571                                          /* check arguments */
# Line 550 | Line 577 | char   *oct, *nam;
577                  error(COMMAND, "missing name");
578                  return(0);
579          }
580 <        if (*nam == '*' | *nam == '-') {
580 >        if ((*nam == '*') | (*nam == '-')) {
581                  error(COMMAND, "illegal name");
582                  return(0);
583          }
# Line 559 | Line 586 | char   *oct, *nam;
586                  return(0);
587          }
588                                          /* get octree path */
589 <        if ((fpp = getpath(oct, getlibpath(), R_OK)) == NULL) {
589 >        if ((fpp = getpath(oct, getrlibpath(), R_OK)) == NULL) {
590                  sprintf(errmsg, "cannot find octree \"%s\"", oct);
591                  error(COMMAND, errmsg);
592                  return(0);
# Line 582 | Line 609 | char   *oct, *nam;
609                                          /* start rtrace */
610          rtargv[RTARGC-1] = fpath;
611          rtargv[RTARGC] = NULL;
612 <        open_process(op->rtp, rtargv);
612 >        open_process(&(op->rtp), rtargv);
613                                          /* insert into main list */
614          op->next = dobjects;
615          curobj = dobjects = op;
# Line 591 | Line 618 | char   *oct, *nam;
618   }
619  
620  
621 < dobj_unload(nam)                        /* free the named object */
622 < char    *nam;
621 > extern int
622 > dobj_unload(                    /* free the named object */
623 >        char    *nam
624 > )
625   {
626          register DOBJECT        *op;
627  
# Line 606 | Line 635 | char   *nam;
635   }
636  
637  
638 < dobj_cleanup()                          /* free all resources */
638 > extern int
639 > dobj_cleanup(void)                              /* free all resources */
640   {
641          register DLIGHTS        *lp;
642  
# Line 615 | Line 645 | dobj_cleanup()                         /* free all resources */
645          savedxf(curobj = NULL);
646          while ((lp = dlightsets) != NULL) {
647                  dlightsets = lp->next;
648 <                free((char *)lp);
648 >                free((void *)lp);
649          }
650          return(1);
651   }
652  
653  
654 < dobj_xform(nam, rel, ac, av)            /* set/add transform for nam */
655 < char    *nam;
656 < int     rel, ac;
657 < char    **av;
654 > extern int
655 > dobj_xform(             /* set/add transform for nam */
656 >        char    *nam,
657 >        int     rel,
658 >        int     ac,
659 >        char    **av
660 > )
661   {
662          register DOBJECT        *op;
663          FVECT   cent;
# Line 683 | Line 716 | char   **av;
716   }
717  
718  
719 < dobj_putstats(nam, fp)                  /* put out statistics for nam */
720 < char    *nam;
721 < FILE    *fp;
719 > extern int
720 > dobj_putstats(                  /* put out statistics for nam */
721 >        char    *nam,
722 >        FILE    *fp
723 > )
724   {
725          FVECT   ocent;
726          register DOBJECT        *op;
# Line 724 | Line 759 | FILE   *fp;
759   }
760  
761  
762 < dobj_unmove()                           /* undo last transform change */
762 > extern int
763 > dobj_unmove(void)                               /* undo last transform change */
764   {
765          int     txfac;
766          char    *txfav[MAXAC+1];
# Line 734 | Line 770 | dobj_unmove()                          /* undo last transform change */
770                  return(0);
771          }
772                                          /* hold last transform */
773 <        bcopy((char *)lastxfav, (char *)txfav,
773 >        memcpy((void *)txfav, (void *)lastxfav,
774                          (txfac=lastxfac)*sizeof(char *));
775                                          /* save this transform */
776 <        bcopy((char *)curobj->xfav, (char *)lastxfav,
776 >        memcpy((void *)lastxfav, (void *)curobj->xfav,
777                          (lastxfac=curobj->xfac)*sizeof(char *));
778                                          /* copy back last transform */
779 <        bcopy((char *)txfav, (char *)curobj->xfav,
779 >        memcpy((void *)curobj->xfav, (void *)txfav,
780                          (curobj->xfac=txfac)*sizeof(char *));
781                                          /* set matrices */
782          fullxf(&curobj->xfb, curobj->xfac, curobj->xfav);
# Line 750 | Line 786 | dobj_unmove()                          /* undo last transform change */
786   }
787  
788  
789 < dobj_dup(oldnm, nam)                    /* duplicate object oldnm as nam */
790 < char    *oldnm, *nam;
789 > extern int
790 > dobj_dup(                       /* duplicate object oldnm as nam */
791 >        char    *oldnm,
792 >        char    *nam
793 > )
794   {
795          register DOBJECT        *op, *opdup;
796                                          /* check arguments */
# Line 763 | Line 802 | char   *oldnm, *nam;
802                  error(COMMAND, "missing name");
803                  return(0);
804          }
805 <        if (*nam == '*' | *nam == '-') {
805 >        if ((*nam == '*') | (*nam == '-')) {
806                  error(COMMAND, "illegal name");
807                  return(0);
808          }
# Line 775 | Line 814 | char   *oldnm, *nam;
814          opdup = (DOBJECT *)malloc(sizeof(DOBJECT));
815          if (opdup == NULL)
816                  error(SYSTEM, "out of memory in dobj_dup");
817 <        copystruct(opdup, op);
817 >        *opdup = *op;
818                                          /* rename */
819          strcpy(opdup->name, nam);
820                                          /* get our own copy of transform */
# Line 789 | Line 828 | char   *oldnm, *nam;
828   }
829  
830  
831 < dobj_lighting(nam, cn)          /* set up lighting for display object */
832 < char    *nam;
833 < int     cn;
831 > extern int
832 > dobj_lighting(          /* set up lighting for display object */
833 >        char    *nam,
834 >        int     cn
835 > )
836   {
837          int     i, res[2];
838          VIEW    *dv;
# Line 823 | Line 864 | int    cn;
864                          beam_view(dv, res[0], res[1]);
865                  beam_sync(1);                   /* update server */
866          }
867 +        return 0; /* XXX not sure if this is the right value */
868   }
869  
870  
871 < double
872 < dobj_trace(nm, rorg, rdir)      /* check for ray intersection with object(s) */
873 < char    nm[];
874 < FVECT   rorg, rdir;
871 > extern double
872 > dobj_trace(     /* check for ray intersection with object(s) */
873 >        char    nm[],
874 >        FVECT  rorg,
875 >        FVECT  rdir
876 > )
877   {
878          register DOBJECT        *op;
879          FVECT   xorg, xdir;
# Line 863 | Line 907 | FVECT   rorg, rdir;
907                  VCOPY(darr, rorg); VCOPY(darr+3, rdir);
908          }
909                                  /* trace it */
910 <        if (process(op->rtp, darr, darr, sizeof(double),
910 >        if (process(&(op->rtp), (char *)darr, (char *)darr, sizeof(double),
911                          6*sizeof(double)) != sizeof(double))
912                  error(SYSTEM, "rtrace communication error");
913                                  /* return distance */
# Line 873 | Line 917 | FVECT   rorg, rdir;
917   }
918  
919  
920 < int
921 < dobj_render()                   /* render our objects in OpenGL */
920 > extern int
921 > dobj_render(void)                       /* render our objects in OpenGL */
922   {
923          int     nrendered = 0;
924          GLboolean       normalizing;
# Line 959 | Line 1003 | dobj_render()                  /* render our objects in OpenGL */
1003                  }
1004                                          /* set up object transform */
1005                  if (op->xfac) {
1006 <                        if (!normalizing && op->xfb.f.sca < 1.-FTINY |
1007 <                                                op->xfb.f.sca > 1.+FTINY)
1006 >                        if (!normalizing && (op->xfb.f.sca < 1.-FTINY) |
1007 >                                                (op->xfb.f.sca > 1.+FTINY))
1008                                  glEnable(GL_NORMALIZE);
1009                          glMatrixMode(GL_MODELVIEW);
1010                          glPushMatrix();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines