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

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <stddef.h>
  5. #include <graphics.h>
  6.  
  7. typedef short BOOL;
  8. typedef int INDEX;
  9. #define TRUE  1
  10. #define FALSE 0
  11. #define PI 3.14159
  12. #define MAX_LINE_LEN 255
  13. #define YAW rotate[0]
  14. #define ROLL rotate[1]
  15. #define PITCH rotate[2]
  16. enum LINESTYLE {LINE_NOSHOW, LINE_BROKEN, LINE_SOLID};
  17.  
  18. /* object types */
  19. #define MAX_TYPES  4 /* number of types defined */
  20. #define CUBE_OBJ   0
  21. #define SPHERE_OBJ 1
  22. #define CYLIND_OBJ 2
  23. #define CONE_OBJ   3
  24.  
  25. /* error messages */
  26. #define ERR_MEMORY  1 /* insufficient memory */
  27. #define ERR_OBJTYPE 2 /* invalid solid object type */
  28. #define ERR_DRIVER  3 /* requires ega/vga graphics */
  29.  
  30. #define ADV_FACET_PTR(n) (struct facet *)((char *) \
  31.     facet_ptr + sizeof(struct facet) + n * \
  32.     sizeof(INDEX))
  33.  
  34. /* descriptor definitions */
  35. struct obj_defn { /* definition of a solid object */
  36.     int vertex_count;
  37.     struct vertex *vertex_first; /* pointer to first
  38.         vertex descriptor */
  39.     int facet_count;
  40.     struct facet *facet_first; /* ptr to 1st facet */
  41. };
  42. struct solid_obj { /* instance of a solid object */
  43.     int obj_type;
  44.     struct vertex *vertex_first; /* pointer to first
  45.         vertex descriptor */
  46.     int color;
  47.     float scale; /* scaling factor */
  48.     float xlate[3]; /* translation */
  49.     float rotate[3]; /* yaw, roll, pitch (rotation) in
  50.         radians */
  51.     struct solid_obj *obj_next; /* pointer to next
  52.         object */
  53.     BOOL visible[]; /* 1 if facet is visible, 0 if
  54.         hidden */
  55. };
  56. struct facet { /* facet descriptor */
  57.     int vertex_count; /* number of vertices for this
  58.         facet */
  59.     INDEX vertex_index[]; /* indices of vertices for
  60.         this facet */
  61. };
  62. struct vertex { /* vertex descriptors */
  63.     float coord[3]; /* x, y, z coordinates */
  64. };
  65.  
  66. struct vector {
  67.     float x, y, z; /* x, y, z components */
  68. };
  69.  
  70. /* function prototypes */
  71. void define_solid(int);
  72. struct solid_obj *make_object(int);
  73. void transform_object(struct solid_obj *);
  74. void make_vertex(float, float, float, int);
  75. void display_facet(struct solid_obj *, struct facet *,
  76.     int, int);
  77. void render_facet(struct solid_obj *, struct facet *);
  78. void draw_polygon(struct solid_obj *, struct facet *);
  79. struct vector normal_vector(struct solid_obj *,
  80.     struct facet *);
  81. void show_scene();
  82. void quit(int, char [], int);
  83.  
  84. /* global variables */
  85. extern struct obj_defn *defn_ptr[MAX_TYPES];
  86.     /* pointers to object definitions */
  87. extern struct solid_obj *obj_first; /* pointer to first
  88.     object in scene */
  89. extern int sweeps; /* number of sweeps to construct
  90.     sphere; must be even */
  91. extern int facets; /* number of facets per sweep */
  92. extern float proj_z; /* distance between viewer and
  93.     model */
  94. extern float proj_d; /* distance between viewer and
  95.     picture plane */
  96. extern BOOL init_screen; /* indicates whether screen is
  97.     initialized */
  98. extern int maxx, maxy; /* maximum x and y screen
  99.     coordinates */
  100. extern float border; /* fraction of graphics screen to
  101.     use as a border when maximizing image size */
  102. extern float screen_x_min, screen_x_max, screen_y_min,
  103.     screen_y_max; /* minimum and maximum coordinates
  104.     used to maximize image size */
  105. extern int color_bkgd, color_visible, color_hidden;
  106.     /* color selections for background, visible lines,
  107.     hidden lines */
  108. extern enum LINESTYLE disp_hidden; /* how to display
  109.     hidden lines: don't display, broken line, solid
  110.     line */
  111. extern float light_x, light_y, light_z; /* light source
  112.     coordinates */
  113. extern int render_opt; /* rendering option */
  114.