Listing 11 (solxfo.c)

#include "solid.h"

void transform_object(struct solid_obj *obj_ptr)
/*  Performs scaling, translation, rotation. */
{
   struct facet *facet_ptr;
   struct vertex *vertex_ptr;
   int vertex_i, coord_index, facet_index;
   float new_coord[3]; /* computed x, y, z coords */
   float xa, ya, za; /* temporary variables */
   struct vector normal; /* vector normal to facet */

   /* perform scaling, then rotation, then translation
      in that order, for each vertex in object */
   for (vertex_ptr = obj_ptr->vertex_first, vertex_i =
      0; vertex_i < defn_ptr[obj_ptr->obj_type]->
      vertex_count; ++vertex_ptr, ++vertex_i) {
      /* loop for each vertex in object */
      /* scaling */
      for (coord_index = 0; coord_index < 3;
         ++coord_index) {
         new_coord[coord_index] = vertex_ptr->coord
            [coord_index] * obj_ptr->scale;
      }
      /* rotation */
      xa = cos(obj_ptr->YAW) * new_coord[0] -
         sin(obj_ptr->YAW) * new_coord[2];
      za = sin(obj_ptr->YAW) * new_coord[0] +
         cos(obj_ptr->YAW) * new_coord[2];
      new_coord[0] = cos(obj_ptr->ROLL) * xa +
         sin(obj_ptr->ROLL) * new_coord[1];
      ya = cos(obj_ptr->ROLL) * new_coord[1] -
         sin(obj_ptr->ROLL) * xa;
      new_coord[2] = cos(obj_ptr->PITCH) * za -
         sin(obj_ptr->PITCH) * ya;
      new_coord[1] = sin(obj_ptr->PITCH) * za +
         cos(obj_ptr->PITCH) * ya;

      /* translation; also insert new coordinates
      into object */
      for (coord_index = 0; coord_index < 3;
         ++coord_index) {
         new_coord[coord_index] += obj_ptr->
            xlate[coord_index];
         vertex_ptr->coord[coord_index] =
            new_coord[coord_index];
      }
   }

   /* perform visibility test and projection on each
   facet in object */
   for (facet_ptr = defn_ptr[obj_ptr->obj_type]->
      facet_first, facet_index = 0; facet_index <
      defn_ptr[obj_ptr->obj_type]->facet_count;
      ++facet_index, facet_ptr = (struct facet *)
      ((char *)facet_ptr + sizeof(struct facet) +
      facet_ptr->vertex_count * sizeof(INDEX))) {
      /* loop for each facet in object */
      normal = normal_vector(obj_ptr, facet_ptr);
      vertex_ptr = obj_ptr->vertex_first + facet_ptr
         ->vertex index[0];
      obj_ptr->visible[facet_index] = (normal.x *
         vertex_ptr->coord[0] + normal.y *
         vertex_ptr->coord[0] + normal.z * (proj_z -
         vertex_ptr->coord[0])) > 0.0;
      display_facet(obj_ptr, facet_ptr, FALSE,
         obj_ptr->visible[facet_index]);
         /* projection without display */
   }
}
/* End of File */