#define SHADER_PASS_MAX	8
#define SHADER_MAX_TC_MODS	8
#define SHADER_DEFORM_MAX	8
#define SHADER_MAX_ANIMFRAMES	8

//colour manipulation
typedef struct
{
    enum {
		SHADER_FUNC_SIN,
		SHADER_FUNC_TRIANGLE,
		SHADER_FUNC_SQUARE,
		SHADER_FUNC_SAWTOOTH,
		SHADER_FUNC_INVERSESAWTOOTH,
		SHADER_FUNC_NOISE
	} type;				// SHADER_FUNC enum
    float			args[4];			// offset, amplitude, phase_offset, rate
} shaderfunc_t;

//tecture coordinate manipulation
typedef struct 
{
	enum {
		SHADER_TCMOD_NONE,		//bug
		SHADER_TCMOD_SCALE,		//some sorta tabled deformation
		SHADER_TCMOD_SCROLL,	//boring moving texcoords with time
		SHADER_TCMOD_STRETCH,	//constant factor
		SHADER_TCMOD_ROTATE
	} type;
	float			args[6];
} tcmod_t;

//vertex positioning manipulation.
typedef struct
{
	enum {
		DEFORMV_NONE,		//bug
		DEFORMV_MOVE,
		DEFORMV_WAVE,
		DEFORMV_NORMAL,
		DEFORMV_BULGE,
		DEFORMV_AUTOSPRITE,
		DEFORMV_AUTOSPRITE2,
		DEFORMV_PROJECTION_SHADOW
	} type;
    float			args[4];
    shaderfunc_t	func;
} deformv_t;


typedef struct {
	int mergedpasses;

	shaderfunc_t rgbgen_func;
	shaderfunc_t alphagen_func;

	
    unsigned int	blendsrc, blenddst; // glBlendFunc args
	unsigned int	blendmode, envmode;

	unsigned int	combinesrc0, combinesrc1, combinemode;

    unsigned int	depthfunc;			// glDepthFunc arg
    enum {
		SHADER_ALPHA_GT0,
		SHADER_ALPHA_LT128,
		SHADER_ALPHA_GE128
	} alphafunc;

	enum {
		TC_GEN_BASE,	//basic specified texture coords
		TC_GEN_LIGHTMAP,	//use loaded lightmap coords
		TC_GEN_ENVIRONMENT,
		TC_GEN_DOTPRODUCT
	} tcgen;
	enum {
		RGB_GEN_WAVE,
		RGB_GEN_ENTITY,
		RGB_GEN_ONE_MINUS_ENTITY,
		RGB_GEN_VERTEX,
		RGB_GEN_EXACT_VERTEX,
		RGB_GEN_ONE_MINUS_VERTEX,
		RGB_GEN_IDENTITY_LIGHTING,
		RGB_GEN_IDENTITY,
		RGB_GEN_CONST
	} rgbgen;
	enum {
		ALPHA_GEN_ENTITY,
		ALPHA_GEN_WAVE,
		ALPHA_GEN_PORTAL,
		ALPHA_GEN_SPECULAR,
		ALPHA_GEN_IDENTITY
	} alphagen;

	int numtcmods;
	tcmod_t		tcmod[SHADER_MAX_TC_MODS];

	int anim_numframes;
	int			anim_frames[SHADER_MAX_ANIMFRAMES];
	float fps;
	unsigned int texturetype;

	enum {
		SHADER_PASS_BLEND		= 1 << 0,
		SHADER_PASS_ALPHAFUNC	= 1 << 1,
		SHADER_PASS_DEPTHWRITE	= 1 << 2
	} flags;
} shaderpass_t;

typedef struct shader_s {
	int numpasses;	//careful... 0 means it's not loaded... and not actually a proper shader.
	struct shader_s *next;
	char name[MAX_QPATH];
	//end of shared fields.

	byte_vec4_t fog_color;

	int numdeforms;
	deformv_t	deforms[SHADER_DEFORM_MAX];

	enum {
		SHADER_SKY			= 1 << 0,
		SHADER_NOMIPMAPS	= 1 << 1,
		SHADER_NOPICMIP		= 1 << 2,
		SHADER_CULL_FRONT	= 1 << 3,
		SHADER_CULL_BACK	= 1 << 4,
		SHADER_DEFORMV_BULGE = 1 << 5,
		SHADER_AUTOSPRITE = 1 << 5
	} flags;

	shaderpass_t pass[SHADER_PASS_MAX];
} shader_t;




void GLR_MeshInit(void);
void GL_DrawMesh(mesh_t *mesh, shader_t *shader, int texturenum, int lmtexturenum);
void GL_DrawMeshBump(mesh_t *mesh, int texturenum, int lmtexturenum, int bumpnum, int deluxnum);