/*

	Copyright (C) 1997-2001 Id Software, Inc.

	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

#ifndef __OPENGL_LOCAL_H__
#define __OPENGL_LOCAL_H__

extern int glMaxTexSize; // maximum texture size 


//===================================================================


extern void GL_SetDefaultState( void );

extern	float	gldepthmin, gldepthmax;



//====================================================



extern	int			gl_filter_min, gl_filter_max;

//
// view origin
//
extern	vec3_t	vup;
extern	vec3_t	vpn;
extern	vec3_t	vright;
extern	vec3_t	r_origin;

//
// screen size info
//
//extern	refdef_t	r_newrefdef;
extern	int		r_viewcluster, r_viewcluster2, r_oldviewcluster, r_oldviewcluster2;

extern	cvar_t	*r_norefresh;
extern	cvar_t	*r_lefthand;
extern	cvar_t	*r_speeds;
extern	cvar_t	*r_novis;
extern	cvar_t	*r_nocull;


extern cvar_t	*gl_vertex_arrays;

extern cvar_t	*gl_ext_swapinterval;
extern cvar_t	*gl_ext_palettedtexture;
extern cvar_t	*gl_ext_multitexture;
extern cvar_t	*gl_ext_pointparameters;
extern cvar_t	*gl_ext_compiled_vertex_array;


extern	cvar_t	*gl_nosubimage;
extern	cvar_t	*gl_bitdepth;
extern	cvar_t	*gl_mode;
extern	cvar_t	*gl_lightmap;
extern	cvar_t	*gl_shadows;
extern	cvar_t	*gl_dynamic;
extern	cvar_t	*gl_nobind;
extern	cvar_t	*gl_round_down;
extern	cvar_t	*gl_picmip;
extern	cvar_t	*gl_skymip;
extern	cvar_t	*gl_showtris;
extern	cvar_t	*gl_finish;
extern	cvar_t	*gl_ztrick;
extern	cvar_t	*gl_clear;
extern	cvar_t	*gl_cull;
extern	cvar_t	*gl_poly;
extern	cvar_t	*gl_texsort;
extern	cvar_t	*gl_polyblend;
extern	cvar_t	*gl_flashblend;
extern	cvar_t	*gl_lightmaptype;
extern	cvar_t	*gl_modulate;
extern	cvar_t	*gl_playermip;
extern	cvar_t	*gl_drawbuffer;
extern  cvar_t  *gl_driver;
extern	cvar_t	*gl_swapinterval;
extern	cvar_t	*gl_texturemode;
extern  cvar_t  *gl_saturatelighting;

extern	cvar_t	*r_fullscreen;
extern	cvar_t	*vid_gamma;

extern	cvar_t		*intensity;

extern	int		gl_lightmap_format;
extern	int		gl_solid_format;
extern	int		gl_alpha_format;
extern	int		gl_tex_alpha_format;




extern void R_Bind( int texnum );
extern void R_MBind( GLenum target, int texnum );
extern void R_TexEnv( GLenum value );
extern void R_EnableMultitexture( _boolean enable );
extern void R_SelectTexture( GLenum );


//====================================================================


extern int		registration_sequence;



typedef struct
{
	const char *renderer_string;
	const char *vendor_string;
	const char *version_string;
	const char *extensions_string;
	_boolean Version_1_2;
	bool framebuffer_discard;

} glconfig_t;

typedef struct
{
	float inverse_intensity;
	_boolean fullscreen;

	int     prev_mode;

	int lightmap_textures;

	int	currenttextures[2];
	int currenttmu;

	
} glstate_t;

extern glconfig_t  gl_config;
extern glstate_t   gl_state;


//////////////////////////////////////////////////////


typedef struct	
{
	_boolean	ARBMultiTexture;
	int		nTextureStages;	// Number of texture stages supported
	_boolean	EXTTextureEnvCombine;

	_boolean EXTTextureFilterAnisotropic;
	float		nMaxAnisotropy;
	// NB: Fence extension is not here, because NVVertexArrayRange is false if GL_NV_fence is not here.
	_boolean	NVVertexArrayRange;
	int		NVVertexArrayRangeMaxVertex;
	_boolean	EXTTextureCompressionS3TC;
	_boolean	EXTVertexWeighting;
	_boolean	EXTSeparateSpecularColor;
	_boolean	NVTextureEnvCombine4;
	_boolean	ARBTextureCubeMap;
	_boolean	NVVertexProgram;
	_boolean	EXTVertexShader;
	_boolean	NVTextureShader;
	// true if NVVertexProgram and if we know that VP is emulated
	_boolean	NVVertexProgramEmulated;
	_boolean	EXTSecondaryColor;
	_boolean	EXTBlendColor;
	// NVVertexArrayRange2. 
	_boolean	NVVertexArrayRange2;
	// equal to GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV if possible, or GL_VERTEX_ARRAY_RANGE_NV
	int	NVStateVARWithoutFlush;

	/* WGL ARB Extensions */
	_boolean	WGLARBPBuffer;
	_boolean	WGLARBPixelFormat;
	_boolean	WGLEXTSwapControl;

	/* ATI Extensions */
	_boolean	ATIVertexArrayObject;
	_boolean    ATIMapObjectBuffer;
	_boolean	ATITextureEnvCombine3;
	_boolean    ATIEnvMapBumpMap;
	_boolean    ATIFragmentShader;
	_boolean	ATIXTextureEnvRoute;
	
	/* ARB Extensions */
	_boolean	ARBTextureCompression;
	_boolean	ARBFragmentProgram;
	_boolean	ARBVertexBufferObject;
	_boolean	ARBVertexProgram;

	/* Disable Hardware feature */
	_boolean	DisableHardwareVertexProgram;	
	_boolean	DisableHardwareTextureShader;

} GL_Extensions;

extern GL_Extensions gl_ext;


extern void GL_ConfigExtensions( const char *glext );

extern void MYgluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar );


extern void PrintGLError( W32 err, const char *from );




/*
====================================================================

IMPLEMENTATION SPECIFIC FUNCTIONS

====================================================================
*/

#ifdef __cplusplus
extern "C" {
#endif

void		GLimp_BeginFrame(void);
_boolean	GLimp_Init( void *hinstance, void *hWnd );
void		GLimp_Shutdown( void );
int     	GLimp_SetMode( int *pwidth, int *pheight, int mode, _boolean fullscreen );
void		GLimp_AppActivate( _boolean active );

#ifdef __cplusplus
}
#endif








#endif /* __OPENGL_LOCAL_H__ */
