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 >
Wrap
Text File
|
1991-10-14
|
4KB
|
114 lines
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stddef.h>
#include <graphics.h>
typedef short BOOL;
typedef int INDEX;
#define TRUE 1
#define FALSE 0
#define PI 3.14159
#define MAX_LINE_LEN 255
#define YAW rotate[0]
#define ROLL rotate[1]
#define PITCH rotate[2]
enum LINESTYLE {LINE_NOSHOW, LINE_BROKEN, LINE_SOLID};
/* object types */
#define MAX_TYPES 4 /* number of types defined */
#define CUBE_OBJ 0
#define SPHERE_OBJ 1
#define CYLIND_OBJ 2
#define CONE_OBJ 3
/* error messages */
#define ERR_MEMORY 1 /* insufficient memory */
#define ERR_OBJTYPE 2 /* invalid solid object type */
#define ERR_DRIVER 3 /* requires ega/vga graphics */
#define ADV_FACET_PTR(n) (struct facet *)((char *) \
facet_ptr + sizeof(struct facet) + n * \
sizeof(INDEX))
/* descriptor definitions */
struct obj_defn { /* definition of a solid object */
int vertex_count;
struct vertex *vertex_first; /* pointer to first
vertex descriptor */
int facet_count;
struct facet *facet_first; /* ptr to 1st facet */
};
struct solid_obj { /* instance of a solid object */
int obj_type;
struct vertex *vertex_first; /* pointer to first
vertex descriptor */
int color;
float scale; /* scaling factor */
float xlate[3]; /* translation */
float rotate[3]; /* yaw, roll, pitch (rotation) in
radians */
struct solid_obj *obj_next; /* pointer to next
object */
BOOL visible[]; /* 1 if facet is visible, 0 if
hidden */
};
struct facet { /* facet descriptor */
int vertex_count; /* number of vertices for this
facet */
INDEX vertex_index[]; /* indices of vertices for
this facet */
};
struct vertex { /* vertex descriptors */
float coord[3]; /* x, y, z coordinates */
};
struct vector {
float x, y, z; /* x, y, z components */
};
/* function prototypes */
void define_solid(int);
struct solid_obj *make_object(int);
void transform_object(struct solid_obj *);
void make_vertex(float, float, float, int);
void display_facet(struct solid_obj *, struct facet *,
int, int);
void render_facet(struct solid_obj *, struct facet *);
void draw_polygon(struct solid_obj *, struct facet *);
struct vector normal_vector(struct solid_obj *,
struct facet *);
void show_scene();
void quit(int, char [], int);
/* global variables */
extern struct obj_defn *defn_ptr[MAX_TYPES];
/* pointers to object definitions */
extern struct solid_obj *obj_first; /* pointer to first
object in scene */
extern int sweeps; /* number of sweeps to construct
sphere; must be even */
extern int facets; /* number of facets per sweep */
extern float proj_z; /* distance between viewer and
model */
extern float proj_d; /* distance between viewer and
picture plane */
extern BOOL init_screen; /* indicates whether screen is
initialized */
extern int maxx, maxy; /* maximum x and y screen
coordinates */
extern float border; /* fraction of graphics screen to
use as a border when maximizing image size */
extern float screen_x_min, screen_x_max, screen_y_min,
screen_y_max; /* minimum and maximum coordinates
used to maximize image size */
extern int color_bkgd, color_visible, color_hidden;
/* color selections for background, visible lines,
hidden lines */
extern enum LINESTYLE disp_hidden; /* how to display
hidden lines: don't display, broken line, solid
line */
extern float light_x, light_y, light_z; /* light source
coordinates */
extern int render_opt; /* rendering option */