Listing 2 (soldis.c)

#include "solid.h"

void display_facet(struct solid_obj *obj_ptr, struct
   facet *facet_ptr, int display_opt, int is_visible)
/*  Projects facet onto 2-dimensional screen. */
{
   struct vertex *vertex_ptr;
   int x_first, y_first; /* screen coordinates for
      first vertex of facet */
   int vertex_ref_index;
   float screen_x, screen_y; /* screen coords */
   float x_normal, y_normal, z_normal; /* surface
      normal vector */

   if ((disp_hidden == LINE_NOSHOW || render_opt) &&
      !is_visible) return; /* nothing to do */
   if (display_opt && render_opt) {
      render_facet(obj_ptr, facet_ptr);
      return;
   }
   if (!display_opt) { /* don't display; just compute
      screen coordinates */
      for (vertex_ref_index = 0; vertex_ref_index <
         facet_ptr->vertex_count;
         ++vertex_ref_index) { /* loop for each
         vertex of this facet */
         vertex_ptr = obj_ptr->vertex_first +
            facet_ptr->vertex_index
            [vertex_ref_index];
         screen_x = proj_d * vertex_ptr->coord[0] /
            proj_z;
         screen_y = proj_d * vertex_ptr->coord[1] /
            proj_z;
         if (!init_screen) { /* first vertex;
            initialize minimum and maximum */
            screen_x_min = screen_x_max = screen_x;
            screen_y_min = screen_y_max = screen_y;
            init_screen = TRUE;
         }
         else { /* subsequent vertex; compare to
            minimum and maximum */
            if (screen_x < screen_x_min)
                screen_x_min = screen_x;
            if (screen_x-> screen_x_max)
                screen_x_max = screen_x;
            if (screen_y < screen_y_min)
                screen_y_min = screen_y;
            if (screen_y > screen_y_max)
                screen_y_max = screen_y;
         }
         continue;
      }
   }
   else { /* display option is on */
      if (!is_visible && (disp_hidden ==
         LINE_BROKEN))
         setlinestyle(DASHED_LINE, 0, NORM_WIDTH);
      if (!is_visible && (color_visible !=
         color_hidden))
         setcolor(color_hidden);
      draw_polygon(obj_ptr, facet_ptr);
      if (!is_visible && (disp_hidden ==
         LINE_BROKEN))
         setlinestyle(SOLID_LINE, 0, NORM_WIDTH);
      if (!is_visible && (color_visible !=
         color_hidden))
         setcolor(color_visible);
   }
   return;
}
/* End of File */