/*
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.

*/

#ifdef _WIN32
#  include <windows.h>
#endif

#include <stdio.h>
#include <ctype.h>

#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glu.h>
#include <GL/glext.h> //Knightmare- MrG's shader waterwarp support
#include <math.h>

#ifndef __unix__
#ifndef GL_COLOR_INDEX8_EXT
#define GL_COLOR_INDEX8_EXT GL_COLOR_INDEX
#endif
#endif

#include "../client/ref.h"

//#define __libstdc_hack__  /* Hack libstdc/libc6 had a symbol called cin */
#ifdef __libstdc_hack__
#define cin cinemat
#endif

//Harven MD3 ++
#include "r_md3.h"
//Harven MD3 --

#include "qgl.h"

// up / down
#define	PITCH	0
// left / right
#define	YAW		1
// fall over
#define	ROLL	2

#ifndef __VIDDEF_T
#define __VIDDEF_T
typedef struct
{
	unsigned		width, height;			// coordinates from main game
} viddef_t;
#endif

extern	viddef_t	vid;


/*

  skins will be outline flood filled and mip mapped
  pics and sprites with alpha will be outline flood filled
  pic won't be mip mapped

  model skin
  sprite frame
  wall texture
  pic

*/

typedef enum 
{
	it_skin,
	it_sprite,
	it_wall,
	it_pic,
	it_sky,
	it_part //Knightmare added
} imagetype_t;

typedef struct image_s
{
	char	name[MAX_QPATH];			// game path, including extension
	imagetype_t	type;
	int		width, height;				// source image
	int		upload_width, upload_height;	// after power of two and picmip
	int		registration_sequence;		// 0 = free
	struct msurface_s	*texturechain;	// for sort-by-texture world drawing
	int		texnum;						// gl texture binding
	float	sl, tl, sh, th;				// 0,0 - 1,1 unless part of the scrap
	qboolean	scrap;
	qboolean	has_alpha;

	qboolean paletted;

	qboolean is_cin;					// Heffo - To identify a cin texture's image_t
	float	replace_scale_w;			// Knightmare- for scaling hi-res replacement images
	float	replace_scale_h;			// Knightmare- for scaling hi-res replacement images
} image_t;

#define	TEXNUM_LIGHTMAPS	1024
#define	TEXNUM_SCRAPS		1152
#define	TEXNUM_IMAGES		1153

#define		MAX_GLTEXTURES	4096 // Knightmare increased, was 1024

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

typedef enum
{
	rserr_ok,

	rserr_invalid_fullscreen,
	rserr_invalid_mode,

	rserr_unknown
} rserr_t;

#include "r_model.h"

void GL_BeginRendering (int *x, int *y, int *width, int *height);
void GL_EndRendering (void);

void GL_SetDefaultState( void );
void GL_UpdateSwapInterval( void );

extern	float	gldepthmin, gldepthmax;

typedef struct
{
	float	x, y, z;
	float	s, t;
	float	r, g, b;
} glvert_t;


#define	MAX_LBM_HEIGHT		480

#define BACKFACE_EPSILON	0.01


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

extern	image_t		gltextures[MAX_GLTEXTURES];
extern	int			numgltextures;

#define PARTICLE_TYPES 256

extern	image_t		*r_notexture;
#ifdef	ROQ_SUPPORT
extern	image_t		*r_rawtexture;
#endif // ROQ_SUPPORT

extern	image_t		*r_envmappic;
extern	image_t		*r_spheremappic;
extern	image_t		*r_shelltexture;
extern	image_t		*r_particlebeam;

//Knightmare- Psychospaz's enhanced particles
extern	image_t		*r_particletextures[PARTICLE_TYPES];

extern	entity_t	*currententity;
extern	int			r_worldframe; // Knightmare added for trans animations
extern	model_t		*currentmodel;
extern	int			r_visframecount;
extern	int			r_framecount;
extern	cplane_t	frustum[4];
extern	int			c_brush_polys, c_alias_polys;

// Knightmare- saveshot buffer
extern	byte	*saveshotdata;


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_drawentities;
extern	cvar_t	*r_drawworld;
extern	cvar_t	*r_speeds;
extern	cvar_t	*r_fullbright;
extern	cvar_t	*r_novis;
extern	cvar_t	*r_nocull;
extern	cvar_t	*r_lerpmodels;
extern	cvar_t	*r_ignorehwgamma; // Knightmare- hardware gamma

extern	cvar_t	*r_waterwave;	// Knightmare- water waves
extern	cvar_t	*r_saveshotsize;// Knightmare- save shot size option

// Knightmare- lerped dlights on models
extern	cvar_t	*r_model_shading;
extern	cvar_t	*r_model_dlights;

extern	cvar_t	*r_lightlevel;	// FIXME: This is a HACK to get the client's light level

#ifdef FLARES
extern cvar_t   *r_flares;
extern cvar_t   *r_flare_force_size;
extern cvar_t   *r_flare_force_style;
extern cvar_t   *r_flare_intensity;
extern cvar_t   *r_flare_maxdist;
extern cvar_t   *r_flare_scale;
#endif

// Knightmare- added Vic's overbright rendering
extern	cvar_t	*r_overbrightbits;

// Knightmare- added Psychospaz's console font size option
extern	cvar_t	*con_font;
extern	cvar_t	*con_font_size;

extern	cvar_t	*gl_vertex_arrays;

// Knigntmare- Psychospaz's chasecam
extern	cvar_t	*cl_3dcam;
extern	cvar_t	*cl_3dcam_angle;
extern	cvar_t	*cl_3dcam_dist;
extern	cvar_t	*cl_3dcam_alpha;
extern	cvar_t	*cl_3dcam_adjust;
// end Knightmare

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

// Knightmare- added Vic's overbright rendering
extern	cvar_t	*gl_extmtexcombine;

// Knightmare- allow disabling the nVidia water warp
extern	cvar_t	*gl_pixel_shader_warp;
// Knightmare- allow disabling of lightmaps on trans and warp surfaces
extern	cvar_t	*gl_trans_lightmaps;
// Knightmare- added Psychospaz's envmapping
extern	cvar_t	*gl_glass_envmaps;
extern	cvar_t	*r_trans_surf_sorting; // trans bmodel sorting
extern	cvar_t	*r_shelltype; // entity shells: 0 = solid, 1 = warp, 2 = spheremap

extern	cvar_t	*gl_ext_texture_compression; // Heffo - ARB Texture Compression
extern	cvar_t	*gl_lightcutoff;	//** DMP - allow dynamic light cutoff to be user-settable

extern	cvar_t	*gl_screenshot_jpeg;			// Heffo - JPEG Screenshots
extern	cvar_t	*gl_screenshot_jpeg_quality;	// Heffo - JPEG Screenshots

extern	cvar_t	*gl_nosubimage;
extern	cvar_t	*gl_bitdepth;
extern	cvar_t	*gl_mode;
extern	cvar_t	*gl_log;
extern	cvar_t	*gl_lightmap;
extern	cvar_t	*gl_shadows;
extern	cvar_t	*gl_shadowalpha;
extern	cvar_t	*gl_stencil; //Knightmare- stenciling for color shells
extern	cvar_t	*gl_shellstencil; //Knightmare- stenciling for color shells
extern	cvar_t	*gl_transrendersort; //Knightmare- correct trasparent sorting
extern	cvar_t	*gl_particlelighting;	//Knightmare- particle lighting
extern	cvar_t	*gl_particle_min;
extern	cvar_t	*gl_particle_max;
extern	cvar_t	*gl_particle_lighting;
extern	cvar_t	*gl_particledistance;

extern	cvar_t	*gl_dynamic;
extern  cvar_t  *gl_monolightmap;
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_showbbox;	// Knightmare- show model bounding box
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_3dlabs_broken;
extern  cvar_t  *gl_driver;
extern	cvar_t	*gl_swapinterval;
extern	cvar_t	*gl_anisotropic;
extern	cvar_t	*gl_anisotropic_avail;
extern	cvar_t	*gl_texturemode;
extern	cvar_t	*gl_texturealphamode;
extern	cvar_t	*gl_texturesolidmode;
extern  cvar_t  *gl_saturatelighting;
extern  cvar_t  *gl_lockpvs;

extern	cvar_t	*r_skydistance; //Knightmare- variable sky range
extern	cvar_t	*gl_saturation;	//** DMP

extern	cvar_t	*vid_fullscreen;
extern	cvar_t	*vid_gamma;

extern	cvar_t	*intensity;

#ifdef LIGHT_BLOOMS
extern  cvar_t  *r_bloom;
#endif

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

extern	int		c_visible_lightmaps;
extern	int		c_visible_textures;

extern	float	r_world_matrix[16];

typedef struct sortedelement_s sortedelement_t;
#ifdef __unix__
typedef struct sortedelement_s 
{
	void  *data;
	vec_t len;
	vec3_t org;
	sortedelement_t *left, *right;
}sortedelement_s;
#else
typedef struct sortedelement_s 
{
	void  *data;
	vec_t len;
	vec3_t org;
	sortedelement_t *left, *right;
};
#endif


void R_TranslatePlayerSkin (int playernum);
void GL_Bind (int texnum);
void GL_MBind( GLenum target, int texnum );
void GL_TexEnv( GLenum value );
void GL_EnableMultitexture( qboolean enable );
void GL_SelectTexture( GLenum );

// Knightmare- added some of Psychospaz's shortcuts
void GL_BlendFunction (GLenum sfactor, GLenum dfactor);
void GL_ShadeModel (GLenum mode);
void GL_Stencil (qboolean enable, qboolean shell); //Knightmare- stenciling for color shells
void SetVertexOverbrights (qboolean toggle);
qboolean GL_HasStencil (void);

void ElementAddNode (sortedelement_t *base, sortedelement_t *thisElement);
int transCompare (const void *arg1, const void *arg2);

void R_MaxColorVec (vec3_t color);

// r_entity.c prototypes
extern	sortedelement_t *ents_prerender;
extern	sortedelement_t *ents_viewweaps;
extern	sortedelement_t *ents_viewweaps_trans;

void R_DrawEntitiesOnList (sortedelement_t *list);
void R_DrawAllEntities (qboolean addViewWeaps);
void R_DrawAllEntityShadows (void);
void R_DrawSolidEntities ();

// r_particle.c prototypes
extern	sortedelement_t *parts_prerender;
void R_BuildParticleList (void);
void R_SortParticlesOnList (void);
void R_DrawParticles (sortedelement_t *list);
void R_DrawAllParticles (void);
void R_DrawDecals (void);
void R_DrawAllDecals (void);

// Knightmare added- Psychospaz's lightmaps on alpha surfaces
//void R_LightPoint (vec3_t p, vec3_t color);
void R_LightPoint (vec3_t p, vec3_t color, qboolean isEnt);
void R_PushDlights (void);

#ifdef FLARES
/* r_flares.c */

typedef struct {
	int		size;
	int		style;
	vec3_t		color;
	vec3_t		origin;
} flare_t;

void		R_ClearFlares(void);
void		R_RenderFlares(void);
void		R_RenderFlare(flare_t *light);
void		GL_AddFlareSurface(msurface_t * surf);
#endif
//====================================================================

extern	model_t	*r_worldmodel;

extern	unsigned	d_8to24table[256];
extern	float		d_8to24tablef[256][3]; //Knightmare added

extern	int		registration_sequence;


void V_AddBlend (float r, float g, float b, float a, float *v_blend);

qboolean R_Init ( void *hinstance, void *hWnd, char *reason );
void	R_Shutdown (void);

void R_RenderView (refdef_t *fd);
void GL_ScreenShot_f (void);
void R_DrawAliasModel (entity_t *e);
void R_DrawAliasModelShadow (entity_t *e);
//Harven++ MD3
void R_DrawAliasMD3Model (entity_t *e);
void R_DrawAliasMD3ModelShadow (entity_t *e);
//Harven-- MD3
void R_DrawBrushModel (entity_t *e);
void R_DrawSpriteModel (entity_t *e);
void R_DrawBeam( entity_t *e );
void R_DrawWorld (void);
void R_RenderDlights (void);
void R_DrawAlphaSurfaces (qboolean elements);
void R_RenderBrushPoly (msurface_t *fa);
void R_InitParticleTexture (void);
void R_DrawInitLocal (void);
void GL_SubdivideSurface (msurface_t *fa);
qboolean R_CullBox (vec3_t mins, vec3_t maxs);
void R_RotateForEntity (entity_t *e, qboolean full);
void R_MarkLeaves (void);

glpoly_t *WaterWarpPolyVerts (glpoly_t *p);

// Knightmare added- Psychospaz's lightmaps on alpha surfaces
//void EmitWaterPolys (msurface_t *fa);
void EmitWaterPolys (msurface_t *fa, qboolean light, float alpha);
void ResetDSTTex ();

void R_AddSkySurface (msurface_t *fa);
void R_ClearSkyBox (void);
void R_DrawSkyBox (void);
void R_MarkLights (dlight_t *light, int bit, mnode_t *node);


// 
// r_bloom.c 
// 
#ifdef LIGHT_BLOOMS
void R_BloomBlend( refdef_t *fd ); 
void R_InitBloomTextures( void ); 
#endif


#if 0
short LittleShort (short l);
short BigShort (short l);
int	LittleLong (int l);
float LittleFloat (float f);

char	*va(char *format, ...);
// does a varargs printf into a temp buffer
#endif


void COM_StripExtension (char *in, char *out);

// r_draw.c prototypes
void	R_DrawGetPicSize (int *w, int *h, char *name);
void	R_DrawPic (int x, int y, char *name);
// Knightamre- added alpha for Psychospaz's transparent console
void	R_DrawStretchPic (int x, int y, int w, int h, char *name, float alpha);
//Knightmare- Psychospaz's scaled crosshair support
void	R_DrawScaledPic (int x, int y, float scale, float alpha, char *pic, qboolean fixcoords, qboolean repscale);
// Knightmare- added alpha for Psychospaz's fading centerprints
void	R_DrawChar (int x, int y, int c, int alpha);
void	R_DrawScaledChar (float x, float y, int num, float scale, 
			int red, int green, int blue, int alpha, qboolean italic);
void	R_DrawTileClear (int x, int y, int w, int h, char *name);
void	R_DrawFill (int x, int y, int w, int h, int c);
void	R_DrawFill2 (int x, int y, int w, int h, int red, int green, int blue, int alpha);
void	R_DrawFadeScreen (void);
float	R_CharMapScale (void);

#ifdef ROQ_SUPPORT
void	R_DrawStretchRaw (int x, int y, int w, int h, const byte *raw, int rawWidth, int rawHeight);
#else // old 8-bit, 256x256 version
void	r_DrawStretchRaw (int x, int y, int w, int h, int cols, int rows, byte *data);
#endif // ROQ_SUPPORT

void	R_BeginFrame( float camera_separation );
void	R_SwapBuffers( int );
void	R_SetPalette ( const unsigned char *palette);

int		Draw_GetPalette (void);

//void GL_ResampleTexture (unsigned *in, int inwidth, int inheight, unsigned *out,  int outwidth, int outheight);
void GL_ResampleTexture (void *indata, int inwidth, int inheight, void *outdata,  int outwidth, int outheight);


struct image_s *R_RegisterSkin (char *name);

void LoadPCX (char *filename, byte **pic, byte **palette, int *width, int *height);
//Knightmare added
void LoadTGA (char *name, byte **pic, int *width, int *height);
void LoadJPG (char *filename, byte **pic, int *width, int *height);
#if defined (__unix__)
void LoadPNG (char *filename, byte ** pic, int *width, int *height);
#endif

image_t *GL_LoadPic (char *name, byte *pic, int width, int height, imagetype_t type, int bits);
image_t	*GL_FindImage (char *name, imagetype_t type);
void	GL_TextureMode( char *string );
void	GL_ImageList_f (void);

//void	GL_SetTexturePalette( unsigned palette[256] );

void	GL_InitImages (void);
void	GL_ShutdownImages (void);

void	GL_FreeUnusedImages (void);

void GL_TextureAlphaMode( char *string );
void GL_TextureSolidMode( char *string );

/*
** GL extension emulation functions
*/
void GL_DrawParticles( int num_particles );

// r_fog.c
void R_SetFog (void);
void R_InitFogVars (void);
void R_SetFogVars (qboolean enable, int model, int density,
				   int start, int end, int red, int green, int blue);

/*
** GL config stuff
*/
#define GL_RENDERER_VOODOO		0x00000001
#define GL_RENDERER_VOODOO2   	0x00000002
#define GL_RENDERER_VOODOO_RUSH	0x00000004
#define GL_RENDERER_BANSHEE		0x00000008
#define		GL_RENDERER_3DFX		0x0000000F

#define GL_RENDERER_PCX1		0x00000010
#define GL_RENDERER_PCX2		0x00000020
#define GL_RENDERER_PMX			0x00000040
#define		GL_RENDERER_POWERVR		0x00000070

#define GL_RENDERER_PERMEDIA2	0x00000100
#define GL_RENDERER_GLINT_MX	0x00000200
#define GL_RENDERER_GLINT_TX	0x00000400
#define GL_RENDERER_3DLABS_MISC	0x00000800
#define		GL_RENDERER_3DLABS	0x00000F00

#define GL_RENDERER_REALIZM		0x00001000
#define GL_RENDERER_REALIZM2	0x00002000
#define		GL_RENDERER_INTERGRAPH	0x00003000

#define GL_RENDERER_3DPRO		0x00004000
#define GL_RENDERER_REAL3D		0x00008000
#define GL_RENDERER_RIVA128		0x00010000
#define GL_RENDERER_DYPIC		0x00020000

#define GL_RENDERER_V1000		0x00040000
#define GL_RENDERER_V2100		0x00080000
#define GL_RENDERER_V2200		0x00100000
#define		GL_RENDERER_RENDITION	0x001C0000

#define GL_RENDERER_O2          0x00100000
#define GL_RENDERER_IMPACT      0x00200000
#define GL_RENDERER_RE			0x00400000
#define GL_RENDERER_IR			0x00800000
#define		GL_RENDERER_SGI			0x00F00000

#define GL_RENDERER_MCD			0x01000000
#define GL_RENDERER_OTHER		0x80000000

typedef struct
{
	int         renderer;
	const char *renderer_string;
	const char *vendor_string;
	const char *version_string;
	const char *extensions_string;

	qboolean	allow_cds;
	// max texture size
	int			max_texsize;
	// Knightmare- added Vic's overbright rendering
	qboolean	mtexcombine;
	// texture shader support
	qboolean	NV_texshaders;
	qboolean	ATI_fragshaders;
	// anisotropic filtering
	qboolean	anisotropic;
	float		max_anisotropy;
} glconfig_t;


// Knightmare- MrG's Vertex array stuff
#define GLSTATE_DISABLE_ALPHATEST	if (gl_state.alphatest) { qglDisable(GL_ALPHA_TEST); gl_state.alphatest=false; }
#define GLSTATE_ENABLE_ALPHATEST	if (!gl_state.alphatest) { qglEnable(GL_ALPHA_TEST); gl_state.alphatest=true; }

#define GLSTATE_DISABLE_BLEND		if (gl_state.blend) { qglDisable(GL_BLEND); gl_state.blend=false; }
#define GLSTATE_ENABLE_BLEND		if (!gl_state.blend) { qglEnable(GL_BLEND); gl_state.blend=true; }

#define GLSTATE_DISABLE_TEXGEN		if (gl_state.texgen) { qglDisable(GL_TEXTURE_GEN_S); qglDisable(GL_TEXTURE_GEN_T); qglDisable(GL_TEXTURE_GEN_R); gl_state.texgen=false; }
#define GLSTATE_ENABLE_TEXGEN		if (!gl_state.texgen) { qglEnable(GL_TEXTURE_GEN_S); qglEnable(GL_TEXTURE_GEN_T); qglEnable(GL_TEXTURE_GEN_R); gl_state.texgen=true; }


typedef struct
{
	float inverse_intensity;
	qboolean fullscreen;

	int     prev_mode;

	unsigned char *d_16to8table;

	int lightmap_textures;

	int	currenttextures[2];
	int currenttmu;

	float camera_separation;
	qboolean stereo_enabled;

	// advanced state manager - MrG
	qboolean		texgen;

	qboolean		reg_combiners;
	qboolean		sgis_mipmap;
	unsigned int	dst_texture;

	qboolean		env_add;
	qboolean		stencil_enabled;

	qboolean		gammaramp;

	qboolean		blend;
	qboolean		alphatest;

	qboolean		tex_rectangle;
	qboolean		in2d;
	// End - MrG

	qboolean	texture_compression; // Heffo - ARB Texture Compression

	unsigned char originalRedGammaTable[256];
	unsigned char originalGreenGammaTable[256];
	unsigned char originalBlueGammaTable[256];
	
} glstate_t;

extern glconfig_t  gl_config;
extern glstate_t   gl_state;


// Knightmare- MrG's Vertex array stuff

#define MAX_ARRAY 16384 //MAX_PARTICLES*2 // was *4

#define VA_SetElem2(v,a,b)		((v)[0]=(a),(v)[1]=(b))
#define VA_SetElem3(v,a,b,c)	((v)[0]=(a),(v)[1]=(b),(v)[2]=(c))
#define VA_SetElem4(v,a,b,c,d)	((v)[0]=(a),(v)[1]=(b),(v)[2]=(c),(v)[3]=(d))

extern float	tex_array[MAX_ARRAY][2];
extern float	vert_array[MAX_ARRAY][3];
extern float	col_array[MAX_ARRAY][4];


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

IMPORTED FUNCTIONS

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

void	VID_Error (int err_level, char *str, ...);

void	SetParticleImages (void); // Knightmare added

void	Cmd_AddCommand (char *name, void(*cmd)(void));
void	Cmd_RemoveCommand (char *name);
int		Cmd_Argc (void);
char	*Cmd_Argv (int i);
void	Cbuf_ExecuteText (int exec_when, char *text);

void	VID_Printf (int print_level, char *str, ...);

// files will be memory mapped read only
// the returned buffer may be part of a larger pak file,
// or a discrete file from anywhere in the quake search path
// a -1 return means the file does not exist
// NULL can be passed for buf to just determine existance
char	**FS_ListPak (char *find, int *num);
int		FS_LoadFile (char *name, void **buf);
void	FS_FreeFile (void *buf);

// gamedir will be the current directory that generated
// files should be stored to, ie: "f:\quake\id1"
char	*FS_Gamedir (void);

cvar_t	*Cvar_Get (char *name, char *value, int flags);
cvar_t	*Cvar_Set (char *name, char *value );
void	 Cvar_SetValue (char *name, float value);

qboolean	VID_GetModeInfo (int *width, int *height, int mode);
void		VID_MenuInit (void);
void		VID_NewWindow (int width, int height);
// Knightmare- added import of text color for renderer
void		TextColor (int colornum, int *red, int *green, int *blue);

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

IMPLEMENTATION SPECIFIC FUNCTIONS

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

void		GLimp_BeginFrame( float camera_separation );
void		GLimp_EndFrame( void );
int 		GLimp_Init( void *hinstance, void *hWnd );
void		GLimp_Shutdown( void );
int     	GLimp_SetMode( int *pwidth, int *pheight, int mode, qboolean fullscreen );
void		GLimp_AppActivate( qboolean active );
void		GLimp_EnableLogging( qboolean enable );
void		GLimp_LogNewFrame( void );

