/*
 * $Id$
 *
 * $Date$
 * $Revision$
 *
 * (C) 1999 by Hyperion
 * All rights reserved
 *
 * This file is part of the MiniGL library project
 * See the file Licence.txt for more details
 *
 */

#ifndef STATE_H_
#define STATE_H_

#include "mgl/mgltypes.h"

/* General state record */
struct GLstate
{
	uint32 bits;
};

/* State records for different state groups */

/* COLOR_BUFFER_BIT */
struct GLcolor_buffer_state
{
	struct GLstate	state;

	GLuint			ClearColor;
	W3D_Color		ClearColorRec;
	GLenum			BlendSrc;
	GLenum			BlendDst;
	GLboolean		WriteMaskRed;
	GLboolean		WriteMaskGreen;
	GLboolean		WriteMaskBlue;
	GLboolean		WriteMaskAlpha;

	GLenum			DrawBuffer;
	GLenum			ReadBuffer;

	GLenum			LogicOpMode;

	GLenum			AlphaTestFunc;
	GLclampf		AlphaTestRef;
};


/* CURRENT_BIT */
struct GLcurrent_state
{
	struct GLstate	state;

	MGLColor		CurrentColor;
	MGLNormal		CurrentNormal;
	GLfloat			CurrentFogDepth;

	GLfloat			CurTexS[MAX_TEXTURE_UNITS];
	GLfloat			CurTexT[MAX_TEXTURE_UNITS];
	GLfloat			CurTexQ[MAX_TEXTURE_UNITS];
	GLboolean   	CurTexQValid[MAX_TEXTURE_UNITS];

	MGLPosition 	RasterPos;
	GLfloat			RasterDistance;
	W3D_Color		RasterColor;
	struct MGLTexCoordSet_t
					RasterTexCoords[MAX_TEXTURE_UNITS];
	GLboolean		RasterRhwValid[MAX_TEXTURE_UNITS];
	GLboolean		RasterPosValid;
};


/* DEPTH_BUFFER_BIT */
struct GLdepth_buffer_state
{
	struct GLstate	state;

	W3D_Double		ClearDepth;
	GLboolean		DepthWriteMask;
	GLfloat			ZOffset;

	GLenum			DepthFunc;

};


/* ENABLE_BIT */
struct GLenable_state
{
	struct GLstate	state;
													/* Also affected by this bit */
	GLboolean   	AlphaTest;						/* COLOR_BUFFER_BIT */
	GLboolean   	Blend;							/* COLOR_BUFFER_BIT */
	GLboolean   	Dither;							/* COLOR_BUFFER_BIT */
	GLboolean   	Fog;							/* FOG_BIT */
	GLboolean   	ScissorTest;					/* SCISSOR_BIT */
	GLboolean   	CullFace;						/* POLYGON_BIT */
	GLboolean		PolygonSmooth;					/* POLYGON_BIT */
	GLboolean		PolygonStipple;					/* POLYGON_BIT */
	GLboolean		PolygonOffsetFill;				/* POLYGON_BIT */
	GLboolean   	DepthTest;						/* DEPTH_BUFFER_BIT */
	GLboolean   	ZOffset;						/* MGL specific, DEPTH_BIT */
	GLboolean   	PointSmooth;					/* POINT_BIT */
	GLboolean		LineSmooth;						/* LINE_BIT */
	GLboolean		LineStipple;					/* LINE_BIT */
	GLboolean   	Texture1D[MAX_TEXTURE_UNITS];	/* TEXTURE_BIT */
	GLboolean   	Texture2D[MAX_TEXTURE_UNITS];	/* TEXTURE_BIT */
	GLboolean		TexGenS[MAX_TEXTURE_UNITS];		/* TEXTURE_BIT */
	GLboolean		TexGenT[MAX_TEXTURE_UNITS];		/* TEXTURE_BIT */
	GLboolean		TexGen;							/* OR of all TexGenX */
	GLboolean		Lighting;						/* LIGHTING_BIT */
	GLboolean		ColorMaterial;					/* LIGHTING_BIT */
	GLboolean		Light[MGL_MAX_LIGHTS];			/* LIGHTING_BIT */
	GLboolean		ClipPlane[MGL_MAX_CLIPPLANES];	/* TRANSFORM_BIT */
	GLboolean		StencilTest;					/* STENCIL_BUFFER_BIT */
	GLboolean		Map1[MGL_NUM_EVALUATORS];		/* EVAL_BIT */
	GLboolean		Map2[MGL_NUM_EVALUATORS];		/* EVAL_BIT */
	GLboolean		AutoNormal;						/* EVAL_BIT */
	GLboolean		ColorLogicOp;					/* COLOR_BUFFER_BIT */
};


/* FOG_BIT */
struct GLfog_state
{
	struct GLstate	state;

	GLenum		CurrentFogSource;

	GLdouble    FogStart;
	GLdouble    FogEnd;
	GLdouble	FogDensity; // For Z-Fog only
	GLenum	 	FogMode;
	MGLColor	FogColor;
};


/* HINT_BIT */
struct GLhint_state
{
	struct GLstate	state;
};


/* LIGHTING_BIT */
struct GLlighting_state
{
	struct GLstate	state;

	GLenum			ShadeModel;
	MGLColor		LightModelAmbient;
	GLboolean		LightModelLocalViewer;
	GLboolean		LightModelTwoSide;
	GLenum			LightModelColorControl;
	GLenum			ColorMaterialParameter;
	GLenum			ColorMaterialFace;
	GLmaterial		Material[2];

	GLlight			Light[MGL_MAX_LIGHTS];
	GLint			MaxLight;						/* Max enabled light */
};


/* LINE_BIT */
struct GLline_state
{
	struct GLstate	state;

	GLfloat			LineWidth;
};



/* POINT_BIT */
struct GLpoint_state
{
	struct GLstate	state;

	GLfloat			PointSize;
};


/* POLYGON_BIT */
struct GLpolygon_state
{
	struct GLstate	state;

	GLenum			CullFace;
	GLenum			FrontFace;
	GLfloat			PolygonOffsetFactor;
	GLfloat			PolygonOffsetUnits;
	GLint 			PolygonModeFront;
	GLint			PolygonModeBack;
};


/* POLYGON_STIPPLE_BIT */
struct GLpolygon_stipple_state
{
	struct GLstate	state;

	GLuint			pattern[32];
};


/* SCISSOR_BIT */
struct GLscissor_state
{
	struct GLstate	state;

	GLint			x;
	GLint			y;
	GLsizei			w;
	GLsizei			h;
};


/* STENCIL_BUFFER_BIT */
struct GLstencil_buffer_state
{
	struct GLstate	state;

	GLint		ClearStencil;

};


/* TEXTURE_BIT */
struct GLtexture_state
{
	struct GLstate	state;

	GLint			ActiveTexture;
	GLint			MaxTextureUnit;	/* Used as an upper bound for enabled texture
									 * units, for speed reasons (hclip.c). This
									 * is -1 for no texture unit enabled
									 */

	GLenum			TextureEnv[MAX_TEXTURE_UNITS];
	GLenum			MinFilter;
	GLenum			MagFilter;
	GLenum			WrapS;
	GLenum			WrapT;

	GLenum			colorCombine[MAX_TEXTURE_UNITS];
	GLenum			alphaCombine[MAX_TEXTURE_UNITS];
	GLenum			colorSource[3][MAX_TEXTURE_UNITS];
	GLenum			alphaSource[3][MAX_TEXTURE_UNITS];
	GLenum			colorOperand[3][MAX_TEXTURE_UNITS];
	GLenum			alphaOperand[3][MAX_TEXTURE_UNITS];
	GLuint			colorScale[MAX_TEXTURE_UNITS];
	GLuint			alphaScale[MAX_TEXTURE_UNITS];
	W3D_Color		envColor[MAX_TEXTURE_UNITS];

	GLtexgen		TexGenS[MAX_TEXTURE_UNITS];
	GLtexgen		TexGenT[MAX_TEXTURE_UNITS];

	GLint			CurrentBinding[MAX_TEXTURE_UNITS];
};


/* TRANSFORM_BIT */
struct GLtransform_state
{
	struct GLstate	state;

	GLint		MaxClipPlane;
	GLclipplane	UserClipPlane[MGL_MAX_CLIPPLANES];
	GLuint      CurrentMatrixMode;
};


/* VIEWPORT_BIT */
struct GLviewport_state
{
	struct GLstate	state;

	GLint			x;
	GLint			y;
	GLsizei			w;
	GLsizei			h;
	GLdouble		near;
	GLdouble		far;
};


/* CLIENT_VERTEX_ARRAY_BIT */
struct GLvertex_array_state
{
	struct GLstate	state;

	GLbitfield      ClientState;        /* Current client state mask */
	GLarray         TexCoordArray[MAX_TEXTURE_UNITS];
	GLarray         ColorArray;         /* Current arrays */
	GLarray			NormalArray;
	GLarray         VertexArray;
	GLuint			ClientActiveTexture;

	DrawElementsFn  DrawElementsHook;   /* Function pointers. These will depend on the state */
	DrawArraysFn    DrawArraysHook;
};


/* CLIENT_PIXEL_STORE_BIT */
struct GLpixel_store_state
{
	struct GLstate	state;

	GLpixel_store	pack;
	GLpixel_store	unpack;
};

/* PIXEL_BIT */
struct GLpixel_state
{
	struct GLstate	state;

	GLboolean		map_color;
	GLboolean		map_stencil;
	GLfloat			alpha_scale;
	GLfloat			blue_scale;
	GLfloat			green_scale;
	GLfloat			red_scale;
	GLfloat			depth_scale;
	GLfloat			alpha_bias;
	GLfloat			blue_bias;
	GLfloat			green_bias;
	GLfloat			red_bias;
	GLfloat			depth_bias;
	GLfloat			zoom_x;
	GLfloat			zoom_y;
	GLboolean		pixel_state_neutral; // indicates that all scale bias and zoom values are at their default states
};


/* EVAL_BIT */
struct GLeval_state
{
	struct GLstate	state;

	GLevalgrid		u1;				/* Domain for one-dimensional grid */
	GLevalgrid		u2, v2;			/* Domains for two-dimensional grid */

	GLboolean		EnableSummary;	/* True if any map is enabled */
};


#endif /*STATE_H_*/
