home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / prev.tar.gz / prev.tar / comp.c < prev    next >
C/C++ Source or Header  |  1991-03-11  |  4KB  |  215 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include "art.h"
  4. #include "objs.h"
  5. #include "macro.h"
  6. #include "gram.h"
  7.  
  8. extern hlist    *fhlist;
  9.  
  10. extern hlist    *(*intersects[])();
  11.  
  12. extern object    *objectinit(), *csginit();
  13.  
  14. extern attr    *astackp;
  15. extern mats    *mstackp;
  16.  
  17. /*
  18.  * compinit
  19.  *
  20.  *    initialise a composite object
  21.  *
  22.  */
  23. object *
  24. compinit(sym, d)
  25.     symbol    *sym;
  26.     details    *d;
  27. {
  28.     details *dl, *nxtdl, *argdt, *otherdt, *nd;
  29.     details *ndl, *newdl, *dtail, *dhead;
  30.     object    *o, *objlist, *head;
  31.     surface    s;
  32.     int    sset;
  33.  
  34.     astackp++;
  35.     *astackp = *(astackp - 1);
  36.  
  37.     mstackp++;
  38.     *mstackp = *(mstackp - 1);
  39.     mident4(mstackp->vm);
  40.     mstackp->vmused = FALSE;
  41.  
  42.     s = *astackp->s; 
  43.                     /* reverse list */
  44.     argdt = (details *)NULL;
  45.     for (dl = d; dl != (details *)NULL; dl = nxtdl) {
  46.         nxtdl = dl->nxt;
  47.         dl->nxt = argdt;
  48.         argdt = dl;
  49.     }
  50.  
  51.                     /* copy sym list */
  52.     otherdt = (details *)NULL;
  53.     if (sym != (symbol *)NULL) {
  54.         for (dl = sym->u.det; dl != (details *)NULL; dl = dl->nxt) {
  55.             nd = (details *)smalloc(sizeof(details));
  56.             *nd = *dl;
  57.             nd->nxt = otherdt;
  58.             otherdt = nd;
  59.         }
  60.     }
  61.  
  62.     objlist = (object *)NULL;
  63.  
  64.     if (argdt == (details *)NULL) {
  65.         argdt = otherdt;
  66.         otherdt = (details *)NULL;
  67.     }
  68.  
  69.     sset = FALSE;
  70.  
  71.     for (dl = argdt; dl != (details *)NULL; dl = nxtdl) {
  72.         switch (dl->type) {
  73.         case COLOUR:
  74.             s.c.r = dl->u.c.r;
  75.             s.c.g = dl->u.c.g;
  76.             s.c.b = dl->u.c.b;
  77.             sset = TRUE;
  78.             break;
  79.         case AMBIENT:
  80.             s.a.r = dl->u.c.r;
  81.             s.a.g = dl->u.c.g;
  82.             s.a.b = dl->u.c.b;
  83.             sset = TRUE;
  84.             break;
  85.         case TEXTURE:
  86.             dl->u.txt->nxt = astackp->txtlist;
  87.             astackp->txtlist = dl->u.txt;
  88.             break;
  89.         case MATERIAL:
  90.             s.ri = dl->u.mat.ri;
  91.             s.kd = dl->u.mat.kd;
  92.             s.ks = dl->u.mat.ks;
  93.             s.ksexp = dl->u.mat.ksexp;
  94.             sset = TRUE;
  95.             break;
  96.         case REFLECTANCE:
  97.             s.refl = dl->u.f;
  98.             sset = TRUE;
  99.             break;
  100.         case TRANSPARENCY:
  101.             s.trans = dl->u.f;
  102.             sset = TRUE;
  103.             break;
  104.         case ABSORPTION:
  105.             s.falloff = dl->u.f;
  106.             sset = TRUE;
  107.             break;
  108.         case ART_TRANSLATE:
  109.             art_translate(dl->u.v.x, dl->u.v.y, dl->u.v.z);
  110.             break;
  111.         case ART_SCALE:
  112.             art_scale(dl->u.v.x, dl->u.v.y, dl->u.v.z);
  113.             break;
  114.         case ART_ROTATE:
  115.             art_rotate(dl->u.rot.ang, dl->u.rot.axis);
  116.             break;
  117.         case ON:
  118.             astackp->options |= dl->u.i;
  119.             break;
  120.         case OFF:
  121.             astackp->options &= ~dl->u.i;
  122.             break;
  123.         case OBJECT:
  124.             if (sset) {
  125.                 astackp->s = (surface *)smalloc(sizeof(surface));
  126.                 *astackp->s = s;
  127.                 sset = FALSE;
  128.             }
  129.  
  130.             if (sym != (symbol *)NULL) {    /* save it */
  131.                 dhead = dtail = (details *)NULL;
  132.                 for (ndl = dl->u.obj.det; ndl != (details *)NULL; ndl = ndl->nxt) {
  133.                     newdl = (details *)smalloc(sizeof(details));
  134.                     *newdl = *ndl;
  135.  
  136.                     if (dtail == (details *)NULL)
  137.                         dhead = dtail = newdl;
  138.                     else {
  139.                         dtail->nxt = newdl;
  140.                         dtail = newdl;
  141.                     }
  142.  
  143.                     dtail->nxt = (details *)NULL;
  144.                 }
  145.             } else
  146.                 dhead = dl->u.obj.det;
  147.  
  148.             if ((head = objectinit(dl->u.obj.sym, dhead)) != (object *)NULL) {
  149.                 for (o = head; o->nxt != (object *)NULL; o = o->nxt)
  150.                     ;
  151.             }
  152.             o->nxt = objlist;
  153.             objlist = head;
  154.             break;
  155.         case COMP_OBJ:
  156.             if (sset) {
  157.                 astackp->s = (surface *)smalloc(sizeof(surface));
  158.                 *astackp->s = s;
  159.                 sset = FALSE;
  160.             }
  161.  
  162.             if (sym != (symbol *)NULL) {    /* save it */
  163.                 dhead = dtail = (details *)NULL;
  164.                 for (ndl = dl->u.obj.det; ndl != (details *)NULL; ndl = ndl->nxt) {
  165.                     newdl = (details *)smalloc(sizeof(details));
  166.                     *newdl = *ndl;
  167.  
  168.                     if (dtail == (details *)NULL)
  169.                         dhead = dtail = newdl;
  170.                     else {
  171.                         dtail->nxt = newdl;
  172.                         dtail = newdl;
  173.                     }
  174.  
  175.                     dtail->nxt = (details *)NULL;
  176.                 }
  177.             } else
  178.                 dhead = dl->u.obj.det;
  179.  
  180.             if ((head = compinit((symbol *)NULL, dhead)) != (object *)NULL) {
  181.                 for (o = head; o->nxt != (object *)NULL; o = o->nxt)
  182.                     ;
  183.                 o->nxt = objlist;
  184.                 objlist = head;
  185.             }
  186.             break;
  187.         case CSG_OBJ:
  188.             if (sset) {
  189.                 astackp->s = (surface *)smalloc(sizeof(surface));
  190.                 *astackp->s = s;
  191.                 sset = FALSE;
  192.             }
  193.             o = csginit(dl->u.obj.sym, (details *)NULL);
  194.             o->nxt = objlist;
  195.             objlist = o;
  196.             break;
  197.         default:
  198.             warning("art: bad detail in composite ignored.\n");
  199.         }
  200.  
  201.         nxtdl = dl->nxt;
  202.         if (nxtdl == (details *)NULL) {
  203.             nxtdl = otherdt;
  204.             otherdt = (details *)NULL;
  205.         }
  206.  
  207.         free(dl);
  208.     }
  209.  
  210.     astackp--;
  211.     mstackp--;
  212.  
  213.     return(objlist);
  214. }
  215.