/*****************************************************************************
*   "Irit" - the 3d polygonal solid modeller.				     *
*									     *
* Written by:  Gershon Elber				Ver 1.0, Jan. 1992   *
******************************************************************************
* Global definitions of	Graphics interface.			             *
*****************************************************************************/

#ifndef	IRIT_GRAP_H	/* Define only once */
#define	IRIT_GRAP_H

#include "irit_sm.h"
#include "genmat.h"
#include "iritprsr.h"

#define IG_IRIT_BLACK		0
#define IG_IRIT_BLUE		1
#define IG_IRIT_GREEN		2
#define IG_IRIT_CYAN		3
#define IG_IRIT_RED		4
#define IG_IRIT_MAGENTA		5
#define IG_IRIT_BROWN		6
#define IG_IRIT_LIGHTGREY	7
#define IG_IRIT_DARKGRAY	8
#define IG_IRIT_LIGHTBLUE	9
#define IG_IRIT_LIGHTGREEN	10
#define IG_IRIT_LIGHTCYAN	11
#define IG_IRIT_LIGHTRED	12
#define IG_IRIT_LIGHTMAGENTA	13
#define IG_IRIT_YELLOW		14
#define IG_IRIT_WHITE		15

#define IG_MAX_COLOR		15

#define IG_SOLID_LINE		1
#define IG_DOTTED_LINE		2

#define IG_POINT_WIDTH		0.02

/* The current NormalLength is divided by scalar to form real normal length: */
#define IG_NORMAL_DEFAULT_LENGTH	100
#define IG_NORMAL_SCALER_LENGTH		1000

/* The current point cross length is divided by scalar to form real length:  */
#define IG_POINT_DEFAULT_LENGTH	20
#define IG_POINT_SCALER_LENGTH	1000

#define IG_DEFAULT_COLOR	    1  /* For objects with no color defined. */

#define IG_VIEW_PERSPECTIVE		1		      /* View modes. */
#define IG_VIEW_ORTHOGRAPHIC		2
#define IG_DEFAULT_PERSPECTIVE_Z	-5.0	   /* Default Z focal point. */

#define IG_TRANS_SCREEN	1     /* Screen, Object coords. transformation mode. */
#define IG_TRANS_OBJECT	2

#define IG_DEFAULT_NUM_OF_ISOLINES	10
#define IG_DEFAULT_SAMPLES_PER_CURVE	6

#define IG_DEFAULT_IRIT_MAT		"irit.mat"

#define IG_IS_DRAG_EVENT(Event)	(Event == IG_EVENT_PERS_ORTHO_Z || \
				 Event == IG_EVENT_ROTATE_X || \
				 Event == IG_EVENT_ROTATE_Y || \
				 Event == IG_EVENT_ROTATE_Z || \
				 Event == IG_EVENT_TRANSLATE_X || \
				 Event == IG_EVENT_TRANSLATE_Y || \
				 Event == IG_EVENT_TRANSLATE_Z || \
				 Event == IG_EVENT_SCALE || \
				 Event == IG_EVENT_NEAR_CLIP || \
				 Event == IG_EVENT_FAR_CLIP)

typedef enum {
    IG_EVENT_NONE = 2000,
    IG_EVENT_QUIT,
    IG_EVENT_SCR_OBJ_TGL,
    IG_EVENT_PERS_ORTHO_TGL,
    IG_EVENT_PERS_ORTHO_Z,
    IG_EVENT_ROTATE_X,
    IG_EVENT_ROTATE_Y,
    IG_EVENT_ROTATE_Z,
    IG_EVENT_TRANSLATE_X,
    IG_EVENT_TRANSLATE_Y,
    IG_EVENT_TRANSLATE_Z,
    IG_EVENT_SCALE,
    IG_EVENT_NEAR_CLIP,
    IG_EVENT_FAR_CLIP,
    IG_EVENT_DEPTH_CUE,
    IG_EVENT_DBL_BUFFER,
    IG_EVENT_SAVE_MATRIX,
    IG_EVENT_PUSH_MATRIX,
    IG_EVENT_POP_MATRIX,
    IG_EVENT_STATE
} IGGraphicEventType;

typedef enum {
    IG_STATE_OOPS = 1,
    IG_STATE_MORE_SENSITIVE,
    IG_STATE_LESS_SENSITIVE,
    IG_STATE_SCR_OBJ_TGL,
    IG_STATE_PERS_ORTHO_TGL,
    IG_STATE_DEPTH_CUE,
    IG_STATE_DRAW_SOLID,
    IG_STATE_DOUBLE_BUFFER,
    IG_STATE_ANTI_ALIASING,
    IG_STATE_DRAW_INTERNAL,
    IG_STATE_DRAW_VNORMAL,
    IG_STATE_DRAW_PNORMAL,
    IG_STATE_DRAW_SRF_MESH,
    IG_STATE_DRAW_SRF_POLY,
    IG_STATE_FOUR_PER_FLAT,
    IG_STATE_MORE_ISOLINES,
    IG_STATE_LESS_ISOLINES,
    IG_STATE_FINER_APPROX,
    IG_STATE_COARSER_APPROX,
    IG_STATE_LONGER_VECTORS,
    IG_STATE_SHORTER_VECTORS,
    IG_STATE_WIDER_LINES,
    IG_STATE_NARROW_LINES,
    IG_STATE_FINER_ADAP_ISO,
    IG_STATE_COARSER_ADAP_ISO,
    IG_STATE_FINER_RULED_SRF,
    IG_STATE_COARSER_RULED_SRF,
    IG_STATE_RULED_SRF_APPROX,
    IG_STATE_ADAP_ISO_DIR,
    IG_STATE_VIEW_FRONT,
    IG_STATE_VIEW_SIDE,
    IG_STATE_VIEW_TOP,
    IG_STATE_VIEW_ISOMETRY
} IGGlblStateType;

extern int
    IGGlblBackGroundColor[3],
    IGGlblDrawInternal,
    IGGlblDrawVNormal,
    IGGlblDrawPNormal,
    IGGlblMore,
    IGGlblForceUnitMat,
    IGGlblDrawSolid,
    IGGlblDoDoubleBuffer,
    IGGlblNumOfIsolines,
    IGGlblSamplesPerCurve,
    IGGlblLineWidth,
    IGGlblAdapIsoDir,
    IGGlblFineNess,
    IGGlblDepthCue,
    IGGlblFourPerFlat,
    IGGlblAntiAliasing,
    IGGlblDrawSurfaceMesh,
    IGGlblDrawSurfacePoly,
    IGGlblStandAlone,
    IGGlblTransformMode,
    IGGlblViewMode,
    IGGlblDebugObjectsFlag,
    IGGlblDebugEchoInputFlag,
    IGGlblDelayedClear,
    IGGlblDisplayListIsUsed,
    IGGlblIntensityHighState,
    IGGlblAbortKeyPressed,
    IGGlblNumFiles;

extern char
    *IGGlblTransPrefPos,
    *IGGlblViewPrefPos,
    **IGGlblFileNames;

extern RealType
    IGGlblChangeFactor,
    IGGlblZMinClip,
    IGGlblZMaxClip,
    IGGlblNormalLen;

extern IPObjectStruct
    *IGGlblDisplayList;

extern MatrixType
    IGGlblCrntViewMat;

/* Gen_grap.c routines - generic graphic's driver routines. */
void IGConfigureGlobals(char *PrgmName, int argc, char **argv);
void IGProcessCommandMessages(int ProcessCommandMessages);
int IGReadObjectsFromSocket(int ViewMode, IPObjectStruct **DisplayList);
void IGSaveCurrentMat(int ViewMode, char *Name);
int IGProcessEvent(IGGraphicEventType Event, RealType ChangeFactor);
void IGActiveListFreeNamedAttribute(char *Name);
int IGDefaultStateHandler(int State, int Refresh);

/* Functions that should be defined in most graphics driver. */
int IGHandleState(int State, int Refresh);
void IGCreateStateMenu(void);
void IGSetColorIntensity(int High);
void IGSetColorObj(IPObjectStruct *PObj);
void IGIritBeep(void);
void IGMoveTo2D(RealType X, RealType Y);
void IGLineTo2D(RealType X, RealType Y);

/* The primitive drawing routines. */
void IGMoveTo3D(RealType *Pt);
void IGLineTo3D(RealType *Pt);
void IGDrawObject(IPObjectStruct *PObj);
void IGDrawPtVec(IPObjectStruct *PObj);
void IGDrawPoly(IPObjectStruct *PObj);
void IGDrawCurve(IPObjectStruct *PObj);
void IGDrawSurface(IPObjectStruct *PObj);

#endif /* IRIT_GRAP_H */

