home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Raytrace & Morphing / SOS-RAYTRACE.ISO / programm / source / crend5 / demotask.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-21  |  3.2 KB  |  124 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.      ATTRIBUTION:  If you use any part of this source code or the libraries
  12.      in your projects, you must give attribution to REND386, Dave Stampe,
  13.      and Bernie Roehl in your documentation, source code, and at startup
  14.      of your program.  Let's keep the freeware ball rolling!
  15.  */
  16.  
  17. #include <stdio.h>
  18. #include <string.h>
  19. #include <stdlib.h>
  20. #include "rend386.h"
  21. #include "intmath.h"
  22. #include "tasks.h"
  23.  
  24. #include "demo.h"
  25.  
  26. extern int redraw;
  27.  
  28. #define MAXSPINCOLORS 100
  29.  
  30. typedef struct {
  31.     OBJECT *obj;
  32.     int np; /* number of polys in obj */
  33.     int ncolors;
  34.     unsigned colors[MAXSPINCOLORS];
  35. } SPINDATA;
  36.  
  37. extern void *objectlist;
  38. extern void *find_name();
  39.  
  40. void spinner(int cmd, char *init, long now, long period)
  41. {
  42.     char *colorlist, *q;
  43.     SPINDATA *data, **dataptr;
  44.     int i, color;
  45.     switch (cmd) {
  46.         case 0:
  47.             if ((data = malloc(sizeof(SPINDATA))) == NULL) return;
  48.             dataptr = find_task_data(get_current_task());
  49.             *dataptr = data;
  50.             data->ncolors = 0;
  51.             if ((colorlist = strchr(init, ';')) != NULL) {
  52.                 *colorlist++ = '\0';
  53.                 for (colorlist = strtok(colorlist, ","); colorlist; colorlist = strtok(NULL, ","))
  54.                     if (data->ncolors >= MAXSPINCOLORS)
  55.                         break;
  56.                     else
  57.                         data->colors[data->ncolors++] = strtoul(colorlist, NULL, 0);
  58.             }
  59.             data->obj = find_name(objectlist, init);
  60.             if (data->obj) get_obj_info(data->obj, NULL, &data->np);
  61.             break;
  62.         case 1:
  63.             dataptr = find_task_data(get_current_task());
  64.             data = *dataptr;
  65.             if (data == NULL) return;
  66.             if (data->obj == NULL) return;
  67.             color = (now/period) % data->ncolors;
  68.             for (i = 0; i < data->np; ++i)
  69.                 set_poly_color(data->obj, i, data->colors[(color+i) % data->ncolors]);
  70.             redraw = 1;
  71.             break;
  72.         default:
  73.             break;
  74.     }
  75. }
  76.  
  77.  
  78. typedef struct {
  79.     SEGMENT *seg;
  80.     long rx,ry,rz;
  81. } SCULDATA;
  82.  
  83. extern SEGMENT *find_seg(char *name);
  84.  
  85. void sculspin(int cmd, char *init, long now, long period)
  86. {
  87.     SCULDATA *data, **dataptr;
  88.     OBJECT *obj;
  89.     char *parms;
  90.     float rx, ry, rz;
  91.  
  92.     switch (cmd) {
  93.         case 0:
  94.             if ((data = malloc(sizeof(SCULDATA))) == NULL) return;
  95.             dataptr = find_task_data(get_current_task());
  96.             *dataptr = data;
  97.             data->rx = data->ry = data->rz = 0;
  98.             if ((parms = strchr(init, ';')) != NULL) {
  99.                 *parms++ = '\0';
  100.                 sscanf(parms, "%f,%f,%f", &rx, &ry, &rz);
  101.                 data->rx = rx * 65536L;
  102.                 data->ry = ry * 65536L;
  103.                 data->rz = rz * 65536L;
  104.             }
  105.             data->seg = find_seg(init);
  106.  
  107. /*            obj = find_name(objectlist, init);
  108.             if (obj)
  109.                 data->seg = get_object_owner(obj); */
  110.             break;
  111.         case 1:
  112.             dataptr = find_task_data(get_current_task());
  113.             data = *dataptr;
  114.             if (data == NULL) return;
  115.             if (data->seg == NULL) return;
  116.             rel_rot_segment(data->seg, data->rx, data->ry, data->rz, RYXZ);
  117.             update_segment(data->seg);
  118.             redraw = 1;
  119.             break;
  120.         default:
  121.             break;
  122.     }
  123. }
  124.