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.2 by gwlarson, Fri Aug 21 11:38:22 1998 UTC vs.
Revision 3.4 by gwlarson, Wed Aug 26 17:26:26 1998 UTC

# Line 482 | Line 482 | register char  *args;
482                  dobj_unmove();
483                  break;
484          case DO_OBJECT:                         /* print object statistics */
485 <                dobj_putstats(na ? alist[0] : curname, sstdout);
485 >                if (dobj_putstats(na ? alist[0] : curname, sstdout))
486 >                        if (na && alist[0][0] != '*' &&
487 >                                        strcmp(alist[0], curname))
488 >                                savedxf(curobj = getdobj(alist[0]));
489                  break;
490          case DO_DUP:                            /* duplicate object */
491                  for (nn = 0; nn < na; nn++)
# Line 506 | Line 509 | register char  *args;
509                          dobj_xform(curname, 1, na-nn, alist+nn);
510                  else
511                          curobj->drawcode = DO_HIDE;
512 +                savedxf(curobj);
513                  break;
514          case DO_SHOW:                           /* change rendering option */
515          case DO_LIGHT:
# Line 542 | Line 546 | char   *oct, *nam;
546                  error(COMMAND, "illegal name");
547                  return(0);
548          }
549 +        if (getdobj(nam) != NULL) {
550 +                error(COMMAND, "name already taken (unload first)");
551 +                return(0);
552 +        }
553                                          /* get octree path */
554          if ((fpp = getpath(oct, getlibpath(), R_OK)) == NULL) {
555                  sprintf(errmsg, "cannot find octree \"%s\"", oct);
# Line 549 | Line 557 | char   *oct, *nam;
557                  return(0);
558          }
559          strcpy(fpath, fpp);
552        freedobj(getdobj(nam));         /* free previous use of nam */
560          op = (DOBJECT *)malloc(sizeof(DOBJECT));
561          if (op == NULL)
562                  error(SYSTEM, "out of memory in dobj_load");
# Line 664 | Line 671 | FILE   *fp;
671          }
672          getdcent(ocent, op);
673          fprintf(fp, "%s: %s, center [%f %f %f], radius %f", op->name,
674 <                        op->drawcode==DO_HIDE ? "hid" :
675 <                        op->drawcode==DO_LIGHT && op->ol!=NULL ? "lit" :
674 >                        op->drawcode==DO_HIDE ? "hidden" :
675 >                        op->drawcode==DO_LIGHT && op->ol!=NULL ? "lighted" :
676                          "shown",
677                          ocent[0],ocent[1],ocent[2], getdrad(op));
678          if (op->xfac)
# Line 724 | Line 731 | char   *oldnm, *nam;
731                  error(COMMAND, "illegal name");
732                  return(0);
733          }
734 +        if (getdobj(nam) != NULL) {
735 +                error(COMMAND, "name already taken (unload first)");
736 +                return(0);
737 +        }
738                                          /* allocate and copy struct */
739          opdup = (DOBJECT *)malloc(sizeof(DOBJECT));
740          if (opdup == NULL)
# Line 763 | Line 774 | int    cn;
774          } else if ((op = getdobj(nam)) == NULL) {
775                  error(COMMAND, "unknown object");
776                  return(0);
777 <        } else if ((op->drawcode = cn) == DO_LIGHT)
778 <                getdlights(op, 1);
779 <        else
777 >        } else if ((op->drawcode = cn) == DO_LIGHT) {
778 >                if (!getdlights(op, 1))
779 >                        error(COMMAND, "insufficient samples to light object");
780 >        } else
781                  op->ol = NULL;
782  
783          if (dobj_lightsamp != NULL) {           /* restore beam set */
# Line 786 | Line 798 | FVECT   rorg, rdir;
798          register DOBJECT        *op;
799          FVECT   xorg, xdir;
800          double  darr[6];
801 <
801 >                                        /* check each visible object? */
802          if (nm == NULL || *nm == '*') {
803                  double  dist, mindist = 1.01*FHUGE;
804 <                                        /* check each visible object */
804 >
805 >                if (nm != NULL) nm[0] = '\0';
806                  for (op = dobjects; op != NULL; op = op->next) {
807                          if (op->drawcode == DO_HIDE)
808                                  continue;
809                          dist = dobj_trace(op->name, rorg, rdir);
810                          if (dist < mindist) {
811 <                                dist = mindist;
812 <                                if (nm != NULL)
800 <                                        strcpy(nm, op->name);
811 >                                if (nm != NULL) strcpy(nm, op->name);
812 >                                mindist = dist;
813                          }
814                  }
815                  return(mindist);
# Line 807 | Line 819 | FVECT   rorg, rdir;
819                  error(COMMAND, "unknown object");
820                  return(FHUGE);
821          }
822 <        if (op->xfac) {         /* transform ray */
822 >        if (op->xfac) {         /* put ray in local coordinates */
823                  multp3(xorg, rorg, op->xfb.b.xfm);
824                  multv3(xdir, rdir, op->xfb.b.xfm);
825                  VCOPY(darr, xorg); VCOPY(darr+3, xdir);
# Line 821 | Line 833 | FVECT   rorg, rdir;
833                                  /* return distance */
834          if (darr[0] >= .99*FHUGE)
835                  return(FHUGE);
836 <        return(darr[0] * op->xfb.f.sca);
836 >        return(darr[0]*op->xfb.f.sca);
837   }
838  
839  
# Line 840 | Line 852 | dobj_render()                  /* render our objects in OpenGL */
852                  return(1);
853                                          /* set up general rendering params */
854          glGetBooleanv(GL_NORMALIZE, &normalizing);
855 <        glPushAttrib(GL_LIGHTING_BIT|GL_TRANSFORM_BIT|
856 <                        GL_DEPTH_BUFFER_BIT|GL_POLYGON_BIT);
855 >        glPushAttrib(GL_LIGHTING_BIT|GL_TRANSFORM_BIT|GL_ENABLE_BIT|
856 >                GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_POLYGON_BIT);
857          glDepthFunc(GL_LESS);
858          glEnable(GL_DEPTH_TEST);
859          glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
# Line 887 | Line 899 | dobj_render()                  /* render our objects in OpenGL */
899                                  glLightfv(glightid[i], GL_AMBIENT, vec);
900                                  glEnable(glightid[i]);
901                          }
902 <                } else {                        /* no sources to draw on */
902 >                } else {                        /* fake lighting */
903                          vec[0] = vec[1] = vec[2] = 0.; vec[3] = 1.;
904                          glLightModelfv(GL_LIGHT_MODEL_AMBIENT, vec);
905                          getdcent(v1, op);
# Line 937 | Line 949 | dobj_render()                  /* render our objects in OpenGL */
949                  else
950                          glDisable(GL_LIGHT0);
951                                          /* check errors */
940                rgl_checkerr("rendering object in dobj_render");
952          }
953          glPopAttrib();                  /* restore rendering params */
954 +        rgl_checkerr("rendering objects in dobj_render");
955          return(1);
956   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines