Blame test/fracviewer.h

Packit 328d5c
/*
Packit 328d5c
 * fracviewer.h [from agviewer.h  (version 1.0)]
Packit 328d5c
 *
Packit 328d5c
 * AGV: a glut viewer. Routines for viewing a 3d scene w/ glut
Packit 328d5c
 *
Packit 328d5c
 * The two view movement modes are POLAR and FLYING.  Both move the eye, NOT
Packit 328d5c
 * THE OBJECT.  You can never be upside down or twisted (roll) in either mode.
Packit 328d5c
 *
Packit 328d5c
 * A nice addition would be an examiner type trackball mode where you are
Packit 328d5c
 * moving the object and so could see it from any angle.  Also less restricted
Packit 328d5c
 * flying and polar modes (fly upside down, do rolls, etc.).
Packit 328d5c
 *
Packit 328d5c
 * Controls for Polar are just left and middle buttons -- for flying it's
Packit 328d5c
 * those plus 0-9 number keys and +/- for speed adjustment.
Packit 328d5c
 *
Packit 328d5c
 * See agv_example.c and agviewer.c for more info.  Probably want to make
Packit 328d5c
 * a copy of these and then edit for each program.  This isn't meant to be
Packit 328d5c
 * a library, just something to graft onto your own programs.
Packit 328d5c
 *
Packit 328d5c
 * I welcome any feedback or improved versions.
Packit 328d5c
 *
Packit 328d5c
 * Philip Winston - 4/11/95
Packit 328d5c
 * pwinston@hmc.edu
Packit 328d5c
 * http://www.cs.hmc.edu/people/pwinston
Packit 328d5c
 */
Packit 328d5c
Packit 328d5c
Packit 328d5c
 /*
Packit 328d5c
  * Call agvInit() with glut's current window set to the window in 
Packit 328d5c
  * which you want to run the viewer. Right after creating it is fine.  It
Packit 328d5c
  * will remember that window for possible later use (see below) and
Packit 328d5c
  * registers mouse, motion, and keyboard handlers for that window (see below).
Packit 328d5c
  *
Packit 328d5c
  * allowidle is 1 or 0 depnding on whether you will let AGV install
Packit 328d5c
  * and uninstall an idle function.  0 means you will not let it (because
Packit 328d5c
  * you will be having your own idle function). In this case it is your
Packit 328d5c
  * responsibility to put a statement like:
Packit 328d5c
  *
Packit 328d5c
  *     if (agvMoving)
Packit 328d5c
  *       agvMove();
Packit 328d5c
  *
Packit 328d5c
  * at the end of your idle function, to let AGV update the viewpoint if it
Packit 328d5c
  * is moving. 
Packit 328d5c
  *
Packit 328d5c
  * If allowidle is 1 it means AGV will install its own idle which
Packit 328d5c
  * will update the viewpoint as needed and send glutPostRedisplay() to the
Packit 328d5c
  * window which was current when agvInit() was called.
Packit 328d5c
  *
Packit 328d5c
  * agvSetIdleAllow changes this value so you can let AGV install its idle
Packit 328d5c
  * when your idle isn't installed. 
Packit 328d5c
  *
Packit 328d5c
  */
Packit 328d5c
void agvInit(int allowidle);
Packit 328d5c
void agvSetAllowIdle(int allowidle);
Packit 328d5c
Packit 328d5c
Packit 328d5c
 /*
Packit 328d5c
  * Set which movement mode you are in.
Packit 328d5c
  */
Packit 328d5c
typedef enum { FLYING, POLAR } MovementType;
Packit 328d5c
void agvSwitchMoveMode(int move);
Packit 328d5c
Packit 328d5c
 /*
Packit 328d5c
  * agvViewTransform basically does the appropriate gluLookAt() for the 
Packit 328d5c
  * current position.  So call it in your display on the projection matrix
Packit 328d5c
  */
Packit 328d5c
void agvViewTransform(void);
Packit 328d5c
Packit 328d5c
 /*
Packit 328d5c
  * agvMoving will be set by AGV according to whether it needs you to call
Packit 328d5c
  * agvMove() at the end of your idle function.  You only need these if 
Packit 328d5c
  * you aren't allowing AGV to do its own idle.
Packit 328d5c
  * (Don't change the value of agvMoving)
Packit 328d5c
  */
Packit 328d5c
extern int agvMoving;
Packit 328d5c
void agvMove(void);
Packit 328d5c
Packit 328d5c
 /*
Packit 328d5c
  * These are the routines AGV registers to deal with mouse and keyboard input.
Packit 328d5c
  * Keyboard input only matters in flying mode, and then only to set speed.
Packit 328d5c
  * Mouse input only uses left two buttons in both modes.
Packit 328d5c
  * These are all registered with agvInit(), but you could register
Packit 328d5c
  * something else which called these, or reregister these as needed 
Packit 328d5c
  */
Packit 328d5c
void agvHandleButton(int button, int state, int x, int y);
Packit 328d5c
void agvHandleMotion(int x, int y);
Packit 328d5c
void agvHandleKeys(unsigned char key, int x, int y);
Packit 328d5c
Packit 328d5c
 /*
Packit 328d5c
  * Just an extra routine which makes an x-y-z axes (about 10x10x10)
Packit 328d5c
  * which is nice for aligning things and debugging.  Pass it an available
Packit 328d5c
  * displaylist number.
Packit 328d5c
  */
Packit 328d5c
void agvMakeAxesList(int displaylist);
Packit 328d5c
Packit 328d5c
Packit 328d5c
Packit 328d5c
void ncrossprod(float v1[3], float v2[3], float cp[3]);
Packit 328d5c
Packit 328d5c
Packit 328d5c
Packit 328d5c
Packit 328d5c
Packit 328d5c
Packit 328d5c