home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_09_12 / 9n12051a < prev    next >
Text File  |  1991-10-14  |  3KB  |  71 lines

  1. #include "solid.h"
  2.  
  3. void transform_object(struct solid_obj *obj_ptr)
  4. /*  Performs scaling, translation, rotation.  */
  5. {
  6.     struct facet *facet_ptr;
  7.     struct vertex *vertex_ptr;
  8.     int vertex_i, coord_index, facet_index;
  9.     float new_coord[3]; /* computed x, y, z coords */
  10.     float xa, ya, za; /* temporary variables */
  11.     struct vector normal; /* vector normal to facet */
  12.  
  13.     /* perform scaling, then rotation, then translation
  14.         in that order, for each vertex in object */
  15.     for (vertex_ptr = obj_ptr->vertex_first, vertex_i =
  16.         0; vertex_i < defn_ptr[obj_ptr->obj_type]->
  17.         vertex_count; ++vertex_ptr, ++vertex_i) {
  18.         /* loop for each vertex in object */
  19.         /* scaling */
  20.         for (coord_index = 0; coord_index < 3;
  21.             ++coord_index) {
  22.             new_coord[coord_index] = vertex_ptr->coord
  23.                 [coord_index] * obj_ptr->scale; 
  24.         }
  25.         /* rotation */
  26.         xa = cos(obj_ptr->YAW) * new_coord[0] -
  27.             sin(obj_ptr->YAW) * new_coord[2];
  28.         za = sin(obj_ptr->YAW) * new_coord[0] +
  29.             cos(obj_ptr->YAW) * new_coord[2];
  30.         new_coord[0] = cos(obj_ptr->ROLL) * xa +
  31.             sin(obj_ptr->ROLL) * new_coord[1];
  32.         ya = cos(obj_ptr->ROLL) * new_coord[1] -
  33.             sin(obj_ptr->ROLL) * xa;
  34.         new_coord[2] = cos(obj_ptr->PITCH) * za -
  35.             sin(obj_ptr->PITCH) * ya;
  36.         new_coord[1] = sin(obj_ptr->PITCH) * za +
  37.             cos(obj_ptr->PITCH) * ya;
  38.  
  39.         /* translation; also insert new coordinates
  40.         into object */
  41.         for (coord_index = 0; coord_index < 3;
  42.             ++coord_index) {
  43.             new_coord[coord_index] += obj_ptr->
  44.                 xlate[coord_index];
  45.             vertex_ptr->coord[coord_index] =
  46.                 new_coord[coord_index];
  47.         }
  48.     }
  49.  
  50.     /* perform visibility test and projection on each
  51.     facet in object */
  52.     for (facet_ptr = defn_ptr[obj_ptr->obj_type]->
  53.         facet_first, facet_index = 0; facet_index <
  54.         defn_ptr[obj_ptr->obj_type]->facet_count;
  55.         ++facet_index, facet_ptr = (struct facet *)
  56.         ((char *)facet_ptr + sizeof(struct facet) +
  57.         facet_ptr->vertex_count * sizeof(INDEX))) {
  58.         /* loop for each facet in object */
  59.         normal = normal_vector(obj_ptr, facet_ptr);
  60.         vertex_ptr = obj_ptr->vertex_first + facet_ptr
  61.             ->vertex_index[0];
  62.         obj_ptr->visible[facet_index] = (normal.x *
  63.             vertex_ptr->coord[0] + normal.y *
  64.             vertex_ptr->coord[0] + normal.z * (proj_z -
  65.             vertex_ptr->coord[0])) > 0.0;
  66.         display_facet(obj_ptr, facet_ptr, FALSE,
  67.             obj_ptr->visible[facet_index]);
  68.             /* projection without display */
  69.     }
  70. }
  71.