home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / ANIM.CPP next >
C/C++ Source or Header  |  1993-05-02  |  3KB  |  116 lines

  1. /* Animation routines for sample virtual world */
  2.  
  3. /* Written by Bernie Roehl, July 1992 */
  4.  
  5. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  6.    May be freely used to write software for release into the public domain;
  7.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  8.    for permission to incorporate any part of this software into their
  9.    products!
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include "rend386.hpp"
  16. #include "intmath.h"
  17. #include "tasks.hpp"
  18. #include "world.hpp"
  19.  
  20. extern int redraw;
  21.  
  22. #define MAXSPINCOLORS 100
  23.  
  24. typedef struct {
  25.     OBJECT *obj;
  26.     int np; /* number of polys in obj */
  27.     int ncolors;
  28.     unsigned colors[MAXSPINCOLORS];
  29. } SPINDATA;
  30.  
  31. extern void *objectlist;
  32.  
  33. void spinner(int cmd, void *init_parm, long now, long period)
  34. {
  35.     char * init = (char *)init_parm;
  36.     char *colorlist, *q;
  37.     SPINDATA *data, **dataptr;
  38.     int i, color;
  39.     switch (cmd) {
  40.         case 0:
  41.             if ((data = (SPINDATA *)malloc(sizeof(SPINDATA))) == NULL) return;
  42.             dataptr = (SPINDATA **)find_task_data(get_current_task());
  43.             *dataptr = data;
  44.             data->ncolors = 0;
  45.             if ((colorlist = strchr(init, ';')) != NULL) {
  46.                 *colorlist++ = '\0';
  47.                 for (colorlist = strtok(colorlist, ","); colorlist; colorlist = strtok(NULL, ","))
  48.                     if (data->ncolors >= MAXSPINCOLORS)
  49.                         break;
  50.                     else
  51.                         data->colors[data->ncolors++] = strtoul(colorlist, NULL, 0);
  52.             }
  53.             data->obj = (OBJECT *)find_name((NAMEREF *)objectlist, init);
  54.             if (data->obj) get_obj_info(data->obj, NULL, &data->np);
  55.             break;
  56.         case 1:
  57.             dataptr = (SPINDATA **)find_task_data(get_current_task());
  58.             data = *dataptr;
  59.             if (data == NULL) return;
  60.             if (data->obj == NULL) return;
  61.             color = (now/period) % data->ncolors;
  62.             for (i = 0; i < data->np; ++i)
  63.                 set_poly_color(data->obj, i, data->colors[(color+i) % data->ncolors]);
  64.             redraw = 1;
  65.             break;
  66.         default:
  67.             break;
  68.     }
  69. }
  70.  
  71.  
  72. typedef struct {
  73.     SEGMENT *seg;
  74.     long rx,ry,rz;
  75. } SCULDATA;
  76.  
  77. #pragma argsused
  78. void sculspin(int cmd, void *init_parm, long now, long period)
  79. {
  80.     char * init = (char *)init_parm;
  81.     SCULDATA *data, **dataptr;
  82.     OBJECT *obj;
  83.     char *parms;
  84.     float rx, ry, rz;
  85.     switch (cmd) {
  86.         case 0:
  87.             if ((data = (SCULDATA *)malloc(sizeof(SCULDATA))) == NULL) return;
  88.             dataptr = (SCULDATA * *)find_task_data(get_current_task());
  89.             *dataptr = data;
  90.             data->rx = data->ry = data->rz = 0;
  91.             if ((parms = strchr(init, ';')) != NULL) {
  92.                 *parms++ = '\0';
  93.                 sscanf(parms, "%f,%f,%f", &rx, &ry, &rz);
  94.                 data->rx = rx * 65536L;
  95.                 data->ry = ry * 65536L;
  96.                 data->rz = rz * 65536L;
  97.             }
  98.             data->seg = NULL;
  99.             obj = (OBJECT *)find_name((NAMEREF *)objectlist, init);
  100.             if (obj)
  101.                 data->seg = (SEGMENT *)get_object_owner(obj);
  102.             break;
  103.         case 1:
  104.             dataptr = (SCULDATA * *)find_task_data(get_current_task());
  105.             data = *dataptr;
  106.             if (data == NULL) return;
  107.             if (data->seg == NULL) return;
  108.             rel_rot_segment(data->seg, data->rx, data->ry, data->rz, RYXZ);
  109.             update_segment(data->seg);
  110.             redraw = 1;
  111.             break;
  112.         default:
  113.             break;
  114.     }
  115. }
  116.