home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Raytrace & Morphing / SOS-RAYTRACE.ISO / programm / source / radsrc22 / src / px / xshowtra.c < prev   
Encoding:
C/C++ Source or Header  |  1992-10-30  |  5.1 KB  |  236 lines

  1. /* Copyright (c) 1991 Regents of the University of California */
  2.  
  3. #ifndef lint
  4. static char SCCSid[] = "@(#)xshowtrace.c 2.3 10/30/92 LBL";
  5. #endif
  6.  
  7. /*
  8.  *  Display an image and watch the rays get traced.
  9.  *
  10.  *    9/21/90    Greg Ward
  11.  */
  12.  
  13. #include "standard.h"
  14. #include "view.h"
  15. #include "resolu.h"
  16. #include <X11/Xlib.h>
  17.  
  18. #define MAXDEPTH    32        /* ridiculous ray tree depth */
  19.  
  20. #ifdef  SMLFLT
  21. #define  sscanvec(s,v)    (sscanf(s,"%f %f %f",v,v+1,v+2)==3)
  22. #else
  23. #define  sscanvec(s,v)    (sscanf(s,"%lf %lf %lf",v,v+1,v+2)==3)
  24. #endif
  25.  
  26. char    rtcom[] = "rtrace -h- -otp -fa -x 1";
  27. char    xicom[] = "ximage";
  28.  
  29. VIEW    ourview = STDVIEW;        /* view for picture */
  30. RESOLU    ourres;                /* picture resolution */
  31.  
  32. char    *progname;            /* program name */
  33.  
  34. char    *picture;            /* picture name */
  35.  
  36. FILE    *pin;                /* input stream */
  37.  
  38. Display    *theDisplay = NULL;        /* connection to server */
  39.  
  40. struct node {                /* ray tree node */
  41.     int    ipt[2];
  42.     struct node    *sister;
  43.     struct node    *daughter;
  44. };
  45.  
  46. #define newnode()    (struct node *)calloc(1, sizeof(struct node))
  47.  
  48. int    slow = 0;        /* slow trace? */
  49.  
  50.  
  51. main(argc, argv)        /* takes both the octree and the image */
  52. int    argc;
  53. char    *argv[];
  54. {
  55.     int    i;
  56.     char    combuf[256];
  57.  
  58.     progname = argv[0];
  59.     for (i = 1; i < argc-2; i++)
  60.         if (!strcmp(argv[i], "-s"))
  61.             slow++;
  62.         else
  63.             break;
  64.     if (i > argc-2) {
  65.         fprintf(stderr, "Usage: %s [-s] [rtrace args] octree picture\n",
  66.                 progname);
  67.         exit(1);
  68.     }
  69.     picture = argv[argc-1];
  70.                     /* get the viewing parameters */
  71.     if (viewfile(picture, &ourview, &ourres) <= 0 ||
  72.             setview(&ourview) != NULL) {
  73.         fprintf(stderr, "%s: cannot get view from \"%s\"\n",
  74.                 progname, picture);
  75.         exit(1);
  76.     }
  77.                     /* open the display */
  78.     if ((theDisplay = XOpenDisplay(NULL)) == NULL) {
  79.         fprintf(stderr,
  80.         "%s: cannot open display; DISPLAY variable set?\n",
  81.                 progname);
  82.         exit(1);
  83.     }
  84.                     /* build input command */
  85.     sprintf(combuf, "%s %s | %s", xicom, picture, rtcom);
  86.     for ( ; i < argc-1; i++) {
  87.         strcat(combuf, " ");
  88.         strcat(combuf, argv[i]);
  89.     }
  90.                     /* start the damn thing */
  91.     if ((pin = popen(combuf, "r")) == NULL)
  92.         exit(1);
  93.                     /* loop on input */
  94.     mainloop();
  95.                     /* close pipe and exit */
  96.     pclose(pin);
  97.     exit(0);
  98. }
  99.  
  100.  
  101. mainloop()                /* get and process input */
  102. {
  103.     static struct node    *sis[MAXDEPTH];
  104.     register struct node    *newp;
  105.     char    buf[128];
  106.     int    level;
  107.     register int    i;
  108.  
  109.     level = 0;
  110.     while (fgets(buf, sizeof(buf), pin) != NULL) {
  111.         if ((newp = newnode()) == NULL) {
  112.             fprintf(stderr, "%s: memory error\n", progname);
  113.             return;
  114.         }
  115.         for (i = 0; buf[i] == '\t'; i++)
  116.             ;
  117.         if (strtoipt(newp->ipt, buf+i) < 0) {
  118.             fprintf(stderr, "%s: bad read\n", progname);
  119.             return;
  120.         }
  121.         newp->sister = sis[i];
  122.         sis[i] = newp;
  123.         if (i < level) {
  124.             newp->daughter = sis[level];
  125.             sis[level] = NULL;
  126.         }
  127.         level = i;
  128.         if (i == 0) {
  129.             setvec(sis[0]->ipt);
  130.             tracerays(sis[0]);
  131.             freetree(sis[0]);
  132.             sis[0] = NULL;
  133.             if (!slow)
  134.                 XFlush(theDisplay);
  135.         }
  136.     }
  137. }
  138.  
  139.  
  140. freetree(tp)                /* free a trace tree */
  141. struct node    *tp;
  142. {
  143.     register struct node    *kid;
  144.  
  145.     for (kid = tp->daughter; kid != NULL; kid = kid->sister)
  146.         freetree(kid);
  147.     free((char *)tp);
  148. }
  149.  
  150.  
  151. tracerays(tp)                /* trace a ray tree */
  152. struct node    *tp;
  153. {
  154.     register struct node    *kid;
  155.  
  156.     for (kid = tp->daughter; kid != NULL; kid = kid->sister) {
  157.         vector(tp->ipt, kid->ipt);
  158.         tracerays(kid);
  159.     }
  160. }
  161.  
  162.  
  163. strtoipt(ipt, str)        /* convert string x y z to image point */
  164. int    ipt[2];
  165. char    *str;
  166. {
  167.     FVECT    im_pt, pt;
  168.  
  169.     if (!sscanvec(str, pt))
  170.         return(-1);
  171.     if (DOT(pt,pt) <= FTINY)        /* origin is really infinity */
  172.         ipt[0] = ipt[1] = -1;            /* null vector */
  173.     else {
  174.         viewloc(im_pt, &ourview, pt);
  175.         loc2pix(ipt, &ourres, im_pt[0], im_pt[1]);
  176.     }
  177.     return(0);
  178. }
  179.  
  180.  
  181. #define rwind        RootWindow(theDisplay,ourScreen)
  182. #define ourScreen    DefaultScreen(theDisplay)
  183.  
  184. GC    vecGC = 0;
  185. Window    gwind = 0;
  186. int    xoff, yoff;
  187.  
  188.  
  189. setvec(ipt)            /* set up vector drawing for pick */
  190. int    ipt[2];
  191. {
  192.     XWindowAttributes    wa;
  193.     XColor    xc;
  194.     XGCValues    gcv;
  195.     int    rx, ry, wx, wy;
  196.     Window    rw, cw;
  197.     unsigned int    pm;
  198.                     /* compute pointer location */
  199.     if (gwind == 0 &&
  200.         (gwind = xfindwind(theDisplay, rwind, picture, 2)) == 0) {
  201.         fprintf(stderr, "%s: cannot find display window!\n", progname);
  202.         exit(1);
  203.     }
  204.     XQueryPointer(theDisplay, gwind, &rw, &cw, &rx, &ry, &wx, &wy, &pm);
  205.     xoff = wx - ipt[0];
  206.     yoff = wy - ipt[1];
  207.                     /* set graphics context */
  208.     if (vecGC == 0) {
  209.         XGetWindowAttributes(theDisplay, gwind, &wa);
  210.         xc.red = 65535; xc.green = 0; xc.blue = 0;
  211.         xc.flags = DoRed|DoGreen|DoBlue;
  212.         if (XAllocColor(theDisplay, wa.colormap, &xc)) {
  213.             gcv.foreground = xc.pixel;
  214.             vecGC = XCreateGC(theDisplay,gwind,GCForeground,&gcv);
  215.         } else {
  216.             gcv.function = GXinvert;
  217.             vecGC = XCreateGC(theDisplay,gwind,GCFunction,&gcv);
  218.         }
  219.     }
  220. }
  221.  
  222.  
  223. vector(ip1, ip2)        /* draw a vector */
  224. int    ip1[2], ip2[2];
  225. {
  226.     if (ip2[0] == -1 && ip2[1] == -1)
  227.         return;            /* null vector */
  228.     XDrawLine(theDisplay, gwind, vecGC,
  229.             ip1[0]+xoff, ip1[1]+yoff,
  230.             ip2[0]+xoff, ip2[1]+yoff);
  231.     if (slow) {
  232.         XFlush(theDisplay);
  233.         sleep(1);
  234.     }
  235. }
  236.