1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 
13 See the GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 
19 */
20 
21 #if defined WIN32_VARIANT
22 #  include <windows.h>
23 #endif
24 
25 #include <stdio.h>
26 
27 #include <GL/gl.h>
28 #include <math.h>
29 #include "glext.h"
30 
31 #ifndef GL_COLOR_INDEX8_EXT
32 #define GL_COLOR_INDEX8_EXT GL_COLOR_INDEX
33 #endif
34 
35 #include "client/ref.h"
36 #include "client/vid.h"
37 
38 #include "qgl.h"
39 #include "r_math.h"
40 
41 #if !defined min
42 #define min(a,b) (((a)<(b)) ? (a) : (b))
43 #endif
44 
45 // up / down
46 #define	PITCH	0
47 
48 // left / right
49 #define	YAW		1
50 
51 // fall over
52 #define	ROLL	2
53 
54 #define	DLIGHT_CUTOFF	64
55 
56 extern	viddef_t	vid;
57 
58 #include "r_image.h"
59 
60 //===================================================================
61 
62 typedef enum
63 {
64 	rserr_ok,
65 
66 	rserr_invalid_fullscreen,
67 	rserr_invalid_mode,
68 
69 	rserr_unknown
70 } rserr_t;
71 
72 #include "r_model.h"
73 
74 extern float	r_frametime;
75 
76 void GL_BeginRendering (int *x, int *y, int *width, int *height);
77 void GL_EndRendering (void);
78 
79 void GL_SetDefaultState( void );
80 void GL_UpdateSwapInterval( void );
81 
82 extern	float	gldepthmin, gldepthmax;
83 
84 #define	MAX_LBM_HEIGHT		1024
85 
86 #define BACKFACE_EPSILON	0.01
87 
88 extern	entity_t	*currententity;
89 extern	model_t		*currentmodel;
90 extern	int			r_visframecount;
91 extern	int			r_framecount;
92 extern  int			r_shadowmapcount;
93 extern	cplane_t	frustum[4];
94 extern	int			c_brush_polys, c_alias_polys;
95 extern 	int c_flares;
96 extern  int c_grasses;
97 extern	int c_beams;
98 
99 extern	int			gl_filter_min, gl_filter_max;
100 
101 //
102 // screen size info
103 //
104 extern	refdef_t	r_newrefdef;
105 extern	int		r_viewcluster, r_viewcluster2, r_oldviewcluster, r_oldviewcluster2;
106 mleaf_t			*r_viewleaf, *r_viewleaf2;
107 
108 extern	cvar_t	*r_norefresh;
109 extern	cvar_t	*r_lefthand;
110 extern	cvar_t	*r_drawentities;
111 extern	cvar_t	*r_drawworld;
112 extern	cvar_t	*r_fullbright;
113 extern	cvar_t	*r_novis;
114 extern	cvar_t	*r_nocull;
115 extern	cvar_t	*r_lerpmodels;
116 
117 extern	cvar_t	*r_lightlevel;	// FIXME: This is a HACK to get the client's light level
118 extern  cvar_t  *r_wave; //water waves
119 
120 extern cvar_t	*gl_ext_swapinterval;
121 extern cvar_t	*gl_ext_pointparameters;
122 extern cvar_t	*gl_ext_compiled_vertex_array;
123 
124 extern cvar_t	*gl_particle_min_size;
125 extern cvar_t	*gl_particle_max_size;
126 extern cvar_t	*gl_particle_size;
127 extern cvar_t	*gl_particle_att_a;
128 extern cvar_t	*gl_particle_att_b;
129 extern cvar_t	*gl_particle_att_c;
130 
131 extern	cvar_t	*gl_bitdepth;
132 extern	cvar_t	*gl_mode;
133 extern	cvar_t	*gl_log;
134 extern	cvar_t	*gl_lightmap;
135 extern	cvar_t	*gl_dynamic;
136 extern	cvar_t	*gl_nobind;
137 extern	cvar_t	*gl_picmip;
138 extern	cvar_t	*gl_skymip;
139 extern	cvar_t	*gl_showtris;
140 extern	cvar_t	*gl_showpolys;
141 extern	cvar_t	*gl_finish;
142 extern	cvar_t	*gl_clear;
143 extern	cvar_t	*gl_cull;
144 extern	cvar_t	*gl_poly;
145 extern	cvar_t	*gl_polyblend;
146 extern	cvar_t	*gl_modulate;
147 extern	cvar_t	*gl_drawbuffer;
148 extern	cvar_t	*gl_driver;
149 extern	cvar_t	*gl_swapinterval;
150 extern	cvar_t	*gl_texturemode;
151 extern	cvar_t	*gl_texturealphamode;
152 extern	cvar_t	*gl_texturesolidmode;
153 extern	cvar_t	*gl_lockpvs;
154 extern	cvar_t	*gl_vlights;
155 extern  cvar_t	*gl_usevbo;
156 
157 extern	cvar_t	*vid_fullscreen;
158 extern	cvar_t	*vid_gamma;
159 extern  cvar_t	*vid_contrast;
160 
161 extern cvar_t *r_anisotropic;
162 extern cvar_t *r_alphamasked_anisotropic;
163 extern cvar_t *r_ext_max_anisotropy;
164 
165 extern cvar_t	*r_overbrightbits;
166 
167 extern cvar_t	*gl_normalmaps;
168 extern cvar_t	*gl_bspnormalmaps;
169 extern cvar_t	*gl_shadowmaps;
170 extern cvar_t	*gl_fog;
171 
172 extern	cvar_t	*r_shaders;
173 extern	cvar_t	*r_bloom;
174 extern	cvar_t	*r_lensflare;
175 extern	cvar_t	*r_lensflare_intens;
176 extern	cvar_t	*r_drawsun;
177 extern  cvar_t	*r_godrays;
178 extern  cvar_t	*r_godray_intensity;
179 extern	cvar_t	*r_optimize;
180 
181 extern	cvar_t	*r_lightmapfiles;
182 
183 extern  cvar_t	*r_ragdolls;
184 extern  cvar_t  *r_ragdoll_debug;
185 
186 extern	qboolean	map_fog;
187 #if defined WIN32_VARIANT
188 extern	char		map_music[MAX_PATH];
189 #else
190 extern	char		map_music[MAX_OSPATH];
191 #endif
192 extern  unsigned	r_weather;
193 extern unsigned		r_nosun;
194 extern float		r_sunX;
195 extern float		r_sunY;
196 extern float		r_sunZ;
197 
198 extern  cvar_t		*r_minimap;
199 extern  cvar_t		*r_minimap_size;
200 extern  cvar_t		*r_minimap_zoom;
201 extern  cvar_t		*r_minimap_style;
202 
203 extern	cvar_t	*gl_mirror;
204 
205 extern	cvar_t	*gl_arb_fragment_program;
206 extern	cvar_t	*gl_glsl_shaders;
207 
208 extern	cvar_t	*sys_affinity;
209 extern	cvar_t	*sys_priority;
210 
211 extern	cvar_t	*gl_screenshot_type;
212 extern	cvar_t	*gl_screenshot_jpeg_quality;
213 
214 extern  cvar_t  *r_test;
215 
216 extern	int		gl_lightmap_format;
217 extern	int		gl_solid_format;
218 extern	int		gl_alpha_format;
219 extern	int		gl_tex_solid_format;
220 extern	int		gl_tex_alpha_format;
221 
222 extern	int		c_visible_lightmaps;
223 extern	int		c_visible_textures;
224 
225 extern	float	r_world_matrix[16];
226 extern	float	r_project_matrix[16];
227 extern	int		r_viewport[4];
228 extern	float	r_farclip, r_farclip_min, r_farclip_bias;
229 
230 extern	int		r_origin_leafnum;
231 
232 //Image
233 void R_InitImageSubsystem(void);
234 void GL_Bind (int texnum);
235 void GL_MBind( GLenum target, int texnum );
236 void GL_TexEnv( GLenum value );
237 void GL_EnableMultitexture( qboolean enable );
238 void GL_SelectTexture( GLenum );
239 void RefreshFont (void);
240 
241 extern void vectoangles (vec3_t value1, vec3_t angles);
242 
243 // dynamic lights
244 void R_StaticLightPoint (vec3_t p, vec3_t color);
245 void R_DynamicLightPoint (vec3_t p, vec3_t color);
246 void R_LightPoint (vec3_t p, vec3_t color, qboolean addDynamic);
247 void R_PushDlights (void);
248 void R_PushDlightsForBModel (entity_t *e);
249 void SetVertexOverbrights (qboolean toggle);
250 
251 //====================================================================
252 extern	model_t	*r_worldmodel;
253 
254 extern	unsigned	d_8to24table[256];
255 
256 extern	int		registration_sequence;
257 
258 extern void V_AddBlend (float r, float g, float b, float a, float *v_blend);
259 
260 //Renderer main loop
261 extern int	R_Init( void *hinstance, void *hWnd );
262 extern void R_Shutdown( void );
263 
264 extern void R_SetupViewport (void);
265 extern void R_RenderView (refdef_t *fd);
266 extern void GL_ScreenShot_f (void);
267 extern void R_DrawAliasModel (void);
268 extern void R_DrawBrushModel (void);
269 extern void R_DrawWorldSurfs (void);
270 extern void R_RenderDlights (void);
271 extern void R_DrawAlphaSurfaces (void);
272 extern void R_InitParticleTexture (void);
273 extern void R_DrawParticles (void);
274 extern void R_DrawRadar(void);
275 extern void R_DrawVehicleHUD (void);
276 extern void R_ClearSkyBox (void);
277 extern void R_DrawSkyBox (void);
278 extern void Draw_InitLocal (void);
279 
280 //Renderer utils
281 extern void R_SubdivideSurface (msurface_t *fa, int firstedge, int numedges);
282 extern qboolean R_CullBox (vec3_t mins, vec3_t maxs);
283 extern qboolean R_CullOrigin(vec3_t origin);
284 extern qboolean R_CullSphere( const vec3_t centre, const float radius, const int clipflags );
285 extern void R_RotateForEntity (entity_t *e);
286 extern void R_MarkWorldSurfs (void);
287 extern void R_AddSkySurface (msurface_t *fa);
288 extern void R_RenderWaterPolys (msurface_t *fa, int texnum, float scaleX, float scaleY);
289 extern void R_ReadFogScript(char config_file[128]);
290 extern void R_ReadMusicScript(char config_file[128]);
291 
292 //Lights
293 extern dlight_t *dynLight;
294 extern vec3_t lightspot;
295 extern void R_MarkLights (dlight_t *light, int bit, mnode_t *node);
296 extern void  VLight_Init (void);
297 extern float VLight_GetLightValue ( vec3_t normal, vec3_t dir, float apitch, float ayaw );
298 
299 //BSP
300 extern GLuint normalisationCubeMap;
301 extern image_t *r_droplets;
302 extern image_t *r_droplets_nm;
303 extern image_t *r_blooddroplets;
304 extern image_t *r_blooddroplets_nm;
305 extern void BSP_DrawTexturelessPoly (msurface_t *fa);
306 extern void BSP_DrawTexturelessBrushModel (entity_t *e);
307 
308 //Postprocess
309 void R_GLSLPostProcess(void);
310 void R_FB_InitTextures(void);
311 
312 //VBO
313 extern qboolean use_vbo;
314 extern GLuint vboId;
315 extern GLuint eboId;
316 extern int totalVBOsize;
317 extern int	vboPosition;
318 extern void R_LoadVBOSubsystem(void);
319 extern void R_VCShutdown(void);
320 extern void VB_VCInit(void);
321 extern void VB_BuildVBOBufferSize(msurface_t *surf);
322 extern void VB_BuildWorldVBO(void);
323 void GL_SetupWorldVBO (void);
324 void GL_BindVBO(vertCache_t *cache);
325 void GL_BindIBO(vertCache_t *cache);
326 vertCache_t *R_VCFindCache(vertStoreMode_t store, model_t *mod);
327 vertCache_t *R_VCLoadData(vertCacheMode_t mode, int size, void *buffer, vertStoreMode_t store, model_t *mod);
328 
329 //Light Bloom
330 extern void R_BloomBlend( refdef_t *fd );
331 extern void R_InitBloomTextures( void );
332 
333 //Flares and Sun
334 int r_numflares;
335 extern int c_flares;
336 flare_t r_flares[MAX_FLARES];
337 extern void Mod_AddFlareSurface (msurface_t *surf, int type );
338 extern void R_RenderFlares (void);
339 extern void R_ClearFlares(void);
340 
341 vec3_t sun_origin;
342 qboolean spacebox;
343 qboolean draw_sun;
344 float sun_x;
345 float sun_y;
346 float sun_size;
347 extern void R_InitSun();
348 extern void R_RenderSun();
349 
350 //Vegetation
351 int r_numgrasses;
352 extern int c_grasses;
353 grass_t r_grasses[MAX_GRASSES];
354 qboolean r_hasleaves;
355 extern void Mod_AddVegetationSurface (msurface_t *surf, int texnum, vec3_t color, float size, char name[MAX_QPATH], int type);
356 extern void R_DrawVegetationSurface (void);
357 extern void R_ClearGrasses(void);
358 extern void R_FinalizeGrass(model_t *mod);
359 
360 //Simple Items
361 extern void R_SI_InitTextures( void );
362 extern void R_DrawSimpleItems( void );
363 void R_SetSimpleTexnum (model_t *loadmodel, const char *pathname);
364 
365 //Light beams/volumes
366 int r_numbeams;
367 extern int c_beams;
368 beam_t r_beams[MAX_BEAMS];
369 extern void Mod_AddBeamSurface (msurface_t *surf, int texnum, vec3_t color, float size, char name[MAX_QPATH], int type, float xang, float yang,
370 	qboolean rotating);
371 extern void R_DrawBeamSurface ( void );
372 extern void R_ClearBeams(void);
373 
374 //Player icons
375 extern float	scr_playericonalpha;
376 
377 //Team colors
378 int r_teamColor;
379 qboolean r_gotFlag;
380 qboolean r_lostFlag;
381 
382 extern void	Draw_GetPicSize (int *w, int *h, const char *name);
383 extern void	Draw_Pic (float x, float y, const char *name);
384 extern void	Draw_ScaledPic (float x, float y, float scale, const char *pic);
385 extern void	Draw_StretchPic (float x, float y, float w, float h, const char *name);
386 extern void	Draw_FadeScreen (void);
387 
388 extern void	R_BeginFrame( float camera_separation );
389 extern void	R_SwapBuffers( int );
390 extern void	R_SetPalette ( const unsigned char *palette);
391 extern int	Draw_GetPalette (void);
392 
393 image_t *R_RegisterSkin (char *name);
394 image_t *R_RegisterParticlePic(const char *name);
395 image_t *R_RegisterParticleNormal(const char *name);
396 image_t *R_RegisterGfxPic(const char *name);
397 
398 extern void	LoadPCX (char *filename, byte **pic, byte **palette, int *width, int *height);
399 extern image_t *GL_FindFreeImage (char *name, int width, int height, imagetype_t type);
400 extern image_t *GL_LoadPic (char *name, byte *pic, int width, int height, imagetype_t type, int bits);
401 extern image_t *GL_GetImage( const char * name );
402 extern image_t	*GL_FindImage (char *name, imagetype_t type);
403 extern void	GL_FreeImage( image_t * image );
404 extern void	GL_TextureMode( char *string );
405 extern void	GL_ImageList_f (void);
406 
407 extern void	GL_InitImages (void);
408 extern void	GL_ShutdownImages (void);
409 
410 extern void	GL_FreeUnusedImages (void);
411 
412 extern void	GL_TextureAlphaMode( char *string );
413 extern void	GL_TextureSolidMode( char *string );
414 
415 /*
416 ** GL config stuff
417 */
418 #define GL_RENDERER_VOODOO		0x00000001
419 #define GL_RENDERER_VOODOO2   	0x00000002
420 #define GL_RENDERER_VOODOO_RUSH	0x00000004
421 #define GL_RENDERER_BANSHEE		0x00000008
422 #define	GL_RENDERER_3DFX		0x0000000F
423 
424 #define GL_RENDERER_PCX1		0x00000010
425 #define GL_RENDERER_PCX2		0x00000020
426 #define GL_RENDERER_PMX			0x00000040
427 #define	GL_RENDERER_POWERVR		0x00000070
428 
429 #define GL_RENDERER_PERMEDIA2	0x00000100
430 #define GL_RENDERER_GLINT_MX	0x00000200
431 #define GL_RENDERER_GLINT_TX	0x00000400
432 #define GL_RENDERER_3DLABS_MISC	0x00000800
433 #define	GL_RENDERER_3DLABS		0x00000F00
434 
435 #define GL_RENDERER_REALIZM		0x00001000
436 #define GL_RENDERER_REALIZM2	0x00002000
437 #define	GL_RENDERER_INTERGRAPH	0x00003000
438 
439 #define GL_RENDERER_3DPRO		0x00004000
440 #define GL_RENDERER_REAL3D		0x00008000
441 #define GL_RENDERER_RIVA128		0x00010000
442 #define GL_RENDERER_DYPIC		0x00020000
443 
444 #define GL_RENDERER_V1000		0x00040000
445 #define GL_RENDERER_V2100		0x00080000
446 #define GL_RENDERER_V2200		0x00100000
447 #define	GL_RENDERER_RENDITION	0x001C0000
448 
449 #define GL_RENDERER_O2          0x00100000
450 #define GL_RENDERER_IMPACT      0x00200000
451 #define GL_RENDERER_RE			0x00400000
452 #define GL_RENDERER_IR			0x00800000
453 #define	GL_RENDERER_SGI			0x00F00000
454 
455 #define GL_RENDERER_MCD			0x01000000
456 #define GL_RENDERER_OTHER		0x80000000
457 
458 #define GLSTATE_DISABLE_ALPHATEST	if (gl_state.alpha_test) { qglDisable(GL_ALPHA_TEST); gl_state.alpha_test=false; }
459 #define GLSTATE_ENABLE_ALPHATEST	if (!gl_state.alpha_test) { qglEnable(GL_ALPHA_TEST); gl_state.alpha_test=true; }
460 
461 #define GLSTATE_DISABLE_BLEND		if (gl_state.blend) { qglDisable(GL_BLEND); gl_state.blend=false; }
462 #define GLSTATE_ENABLE_BLEND		if (!gl_state.blend) { qglEnable(GL_BLEND); gl_state.blend=true; }
463 
464 #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; }
465 #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; }
466 
467 #define GL_COMBINE                        0x8570
468 #define GL_DOT3_RGB                       0x86AE
469 
470 typedef struct
471 {
472 	int         renderer;
473 	const char *renderer_string;
474 	const char *vendor_string;
475 	const char *version_string;
476 	const char *extensions_string;
477 	qboolean	allow_cds;
478 	qboolean 	mtexcombine;
479 } glconfig_t;
480 
481 typedef struct
482 {
483 	 float       inverse_intensity;
484     qboolean    fullscreen;
485 
486     int         prev_mode;
487 
488     unsigned char *d_16to8table;
489 
490     int         lightmap_textures;
491 
492     int         currenttextures[3];
493     int         currenttmu;
494 
495     float       camera_separation;
496     qboolean    stereo_enabled;
497 
498     qboolean    alpha_test;
499     qboolean    blend;
500     qboolean    texgen;
501     qboolean    fragment_program;
502     qboolean    glsl_shaders;
503     qboolean    separateStencil;
504     qboolean    stencil_wrap;
505     qboolean    vbo;
506     qboolean    fbo;
507     qboolean    hasFBOblit;
508 
509 	qboolean	ati;
510 
511 } glstate_t;
512 
513 extern glconfig_t  gl_config;
514 extern glstate_t   gl_state;
515 
516 // vertex arrays
517 extern int KillFlags;
518 
519 #define MAX_ARRAY (MAX_PARTICLES*4)
520 
521 #define VA_SetElem2(v,a,b)		((v)[0]=(a),(v)[1]=(b))
522 #define VA_SetElem3(v,a,b,c)	((v)[0]=(a),(v)[1]=(b),(v)[2]=(c))
523 #define VA_SetElem4(v,a,b,c,d)	((v)[0]=(a),(v)[1]=(b),(v)[2]=(c),(v)[3]=(d))
524 
525 extern float	tex_array[MAX_ARRAY][2];
526 extern float	vert_array[MAX_ARRAY][3];
527 extern float	norm_array[MAX_ARRAY][3];
528 extern float	tan_array[MAX_ARRAY][4];
529 extern float	col_array[MAX_ARRAY][4];
530 
531 #define MAX_VARRAY_VERTS (MAX_VERTS + 2)
532 #define MAX_VARRAY_VERTEX_SIZE 11
533 
534 #define MAX_VERTICES 16384
535 #define MAX_INDICES	(MAX_VERTICES * 4)
536 #define MAX_SHADOW_VERTS 16384
537 
538 extern float VArrayVerts[MAX_VARRAY_VERTS * MAX_VARRAY_VERTEX_SIZE];
539 extern int VertexSizes[];
540 extern float *VArray;
541 extern vec3_t ShadowArray[MAX_SHADOW_VERTS];
542 
543 // define our vertex types
544 #define VERT_SINGLE_TEXTURED			0		// verts and st for 1 tmu
545 #define VERT_BUMPMAPPED					1		// verts and st for 1 tmu, but with 2 texcoord pointers
546 #define VERT_MULTI_TEXTURED				2		// verts and st for 2 tmus
547 #define VERT_COLOURED_UNTEXTURED		3		// verts and colour
548 #define VERT_COLOURED_TEXTURED			4		// verts, st for 1 tmu and colour
549 #define VERT_COLOURED_MULTI_TEXTURED	5		// verts, st for 2 tmus and colour
550 #define VERT_DUAL_TEXTURED				6		// verts, st for 2 tmus both with same st
551 #define VERT_NO_TEXTURE					7		// verts only, no textures
552 #define VERT_BUMPMAPPED_COLOURED		8		// verts and st for 1 tmu, 2 texoord pointers and colour
553 #define VERT_NORMAL_COLOURED_TEXTURED	9		// verts and st for 1tmu and color, with normals
554 
555 // looks like these should be bit flags (2010-08)
556 // apparently not - this was not working as bit flags, works fine as ints
557 #define KILL_TMU0_POINTER	1
558 #define KILL_TMU1_POINTER	2
559 #define KILL_TMU2_POINTER	3
560 #define KILL_TMU3_POINTER	4
561 #define KILL_TMU4_POINTER   5
562 #define KILL_TMU5_POINTER	6
563 #define KILL_RGBA_POINTER	7
564 #define KILL_NORMAL_POINTER 8
565 
566 // vertex array subsystem
567 void R_InitVArrays (int varraytype);
568 void R_KillVArrays (void);
569 void R_DrawVarrays(GLenum mode, GLint first, GLsizei count);
570 void R_InitQuadVarrays(void);
571 void R_AddSurfToVArray (msurface_t *surf);
572 void R_AddShadowSurfToVArray (msurface_t *surf, vec3_t origin);
573 void R_AddTexturedSurfToVArray (msurface_t *surf, float scroll);
574 void R_AddLightMappedSurfToVArray (msurface_t *surf, float scroll);
575 void R_AddGLSLShadedWarpSurfToVArray (msurface_t *surf, float scroll);
576 void R_KillNormalTMUs(void);
577 
578 //shadows
579 extern  void R_InitShadowSubsystem(void);
580 extern  void R_CastShadow(void);
581 extern	cvar_t		*r_shadowmapscale;
582 extern  int			r_lightgroups;
583 extern  image_t		*r_depthtexture;
584 extern	image_t		*r_depthtexture2;
585 extern  image_t		*r_colorbuffer;
586 extern GLuint   fboId[3];
587 extern GLuint	rboId;
588 extern vec3_t	r_worldLightVec;
589 typedef struct	LightGroup
590 {
591 	vec3_t	group_origin;
592 	vec3_t	accum_origin;
593 	float	avg_intensity;
594 	float	dist;
595 } LightGroup_t;
596 extern			LightGroup_t LightGroups[MAX_LIGHTS];
597 
598 extern void		R_CheckFBOExtensions (void);
599 extern void		R_GenerateShadowFBO(void);
600 extern void		MD2_DrawCaster (void);
601 extern void		IQM_DrawCaster (void);
602 extern void		IQM_DrawRagDollCaster (int);
603 extern void		R_DrawDynamicCaster(void);
604 extern void		R_DrawVegetationCaster(void);
605 extern void		R_DrawEntityCaster(entity_t *ent);
606 extern void		R_GenerateEntityShadow( void );
607 extern void		R_GenerateRagdollShadow( int RagDollID );
608 extern void		BSP_DrawShadowPoly (msurface_t *fa, vec3_t origin);
609 extern void		R_DrawShadowMapWorld(qboolean forEnt, vec3_t origin);
610 int				FB_texture_width, FB_texture_height;
611 float			fadeShadow;
612 cvar_t			*r_shadowcutoff;
613 
614 //shader programs
615 extern void R_LoadARBPrograms(void);
616 extern void	R_LoadGLSLPrograms(void);
617 
618 //arb fragment
619 extern unsigned int g_water_program_id;
620 
621 //glsl
622 extern GLhandleARB	g_programObj;
623 extern GLhandleARB  g_shadowprogramObj;
624 extern GLhandleARB	g_waterprogramObj;
625 extern GLhandleARB	g_meshprogramObj;
626 extern GLhandleARB  g_glassprogramObj;
627 extern GLhandleARB	g_blankmeshprogramObj;
628 extern GLhandleARB	g_fbprogramObj;
629 extern GLhandleARB	g_blurprogramObj;
630 extern GLhandleARB	g_rblurprogramObj;
631 extern GLhandleARB  g_dropletsprogramObj;
632 extern GLhandleARB  g_godraysprogramObj;
633 
634 extern GLhandleARB	g_vertexShader;
635 extern GLhandleARB	g_fragmentShader;
636 
637 //standard bsp surfaces
638 extern GLuint		g_location_surfTexture;
639 extern GLuint		g_location_eyePos;
640 extern GLuint		g_tangentSpaceTransform;
641 extern GLuint		g_location_heightTexture;
642 extern GLuint		g_location_lmTexture;
643 extern GLuint		g_location_normalTexture;
644 extern GLuint		g_location_bspShadowmapTexture;
645 extern GLuint		g_location_bspShadowmapTexture2;
646 extern GLuint		g_location_bspShadowmapNum;
647 extern GLuint		g_location_fog;
648 extern GLuint		g_location_parallax;
649 extern GLuint		g_location_dynamic;
650 extern GLuint		g_location_shadowmap;
651 extern GLuint		g_Location_statshadow;
652 extern GLuint		g_location_xOffs;
653 extern GLuint		g_location_yOffs;
654 extern GLuint		g_location_lightPosition;
655 extern GLuint		g_location_staticLightPosition;
656 extern GLuint		g_location_lightColour;
657 extern GLuint		g_location_lightCutoffSquared;
658 extern GLuint		g_location_liquid;
659 extern GLuint		g_location_shiny;
660 extern GLuint		g_location_rsTime;
661 extern GLuint		g_location_liquidTexture;
662 extern GLuint		g_location_liquidNormTex;
663 extern GLuint		g_location_chromeTex;
664 
665 //shadows on white bsp surface
666 extern GLuint		g_location_entShadow;
667 extern GLuint		g_location_fadeShadow;
668 extern GLuint		g_location_xOffset;
669 extern GLuint		g_location_yOffset;
670 
671 //water
672 extern GLuint		g_location_baseTexture;
673 extern GLuint		g_location_normTexture;
674 extern GLuint		g_location_refTexture;
675 extern GLuint		g_location_waterEyePos;
676 extern GLuint		g_location_tangentSpaceTransform;
677 extern GLuint		g_location_time;
678 extern GLuint		g_location_lightPos;
679 extern GLuint		g_location_reflect;
680 extern GLuint		g_location_trans;
681 extern GLuint		g_location_fogamount;
682 
683 //mesh
684 extern GLuint		g_location_meshlightPosition;
685 extern GLuint		g_location_baseTex;
686 extern GLuint		g_location_normTex;
687 extern GLuint		g_location_fxTex;
688 extern GLuint		g_location_fx2Tex;
689 extern GLuint		g_location_color;
690 extern GLuint		g_location_meshNormal;
691 extern GLuint		g_location_meshTime;
692 extern GLuint		g_location_meshFog;
693 extern GLuint		g_location_useFX;
694 extern GLuint		g_location_useGlow;
695 extern GLuint		g_location_useShell;
696 extern GLuint		g_location_useCube;
697 extern GLuint		g_location_useGPUanim;
698 extern GLuint		g_location_outframe;
699 extern GLuint		g_location_fromView;
700 
701 //glass
702 extern GLuint		g_location_gmirTexture;
703 extern GLuint		g_location_grefTexture;
704 extern GLuint		g_location_gLightPos;
705 extern GLuint		g_location_gFog;
706 extern GLuint		g_location_gOutframe;
707 
708 //blank mesh
709 extern GLuint		g_location_bmOutframe;
710 
711 //fullscreen distortion effects
712 extern GLuint		g_location_framebuffTex;
713 extern GLuint		g_location_distortTex;
714 extern GLuint		g_location_dParams;
715 extern GLuint		g_location_fxPos;
716 
717 //gaussian blur
718 extern GLuint		g_location_scale;
719 extern GLuint		g_location_source;
720 
721 //radial blur
722 extern GLuint		g_location_rscale;
723 extern GLuint		g_location_rsource;
724 extern GLuint		g_location_rparams;
725 
726 //water droplets
727 extern GLuint		g_location_drSource;
728 extern GLuint		g_location_drTex;
729 extern GLuint		g_location_drTime;
730 extern GLuint		g_location_drParams;
731 
732 //god rays
733 extern GLuint		g_location_lightPositionOnScreen;
734 extern GLuint		g_location_sunTex;
735 extern GLuint		g_location_godrayScreenAspect;
736 extern GLuint		g_location_sunRadius;
737 
738 //MD2
739 extern void Mod_LoadMD2Model (model_t *mod, void *buffer);
740 
741 //Shared mesh items
742 extern vec3_t	shadelight;
743 extern vec3_t	shadevector;
744 extern int		model_dlights_num;
745 extern m_dlight_t model_dlights[128];
746 extern image_t	*r_mirrortexture;
747 extern cvar_t	*cl_gun;
748 vec3_t lightPosition;
749 vec3_t statLightPosition;
750 float statLightIntensity;
751 float  dynFactor;
752 extern void	R_GetLightVals(vec3_t origin, qboolean RagDoll);
753 extern void R_ModelViewTransform(const vec3_t in, vec3_t out);
754 extern void GL_BlendFunction (GLenum sfactor, GLenum dfactor);
755 
756 //iqm
757 #define pi 3.14159265
758 extern float modelpitch;
759 extern double degreeToRadian(double degree);
760 extern qboolean Mod_INTERQUAKEMODEL_Load(model_t *mod, void *buffer);
761 extern qboolean IQM_ReadSkinFile(char skin_file[MAX_OSPATH], char *skinpath);
762 extern void R_DrawINTERQUAKEMODEL(void);
763 extern void IQM_AnimateFrame(float curframe, int nextframe);
764 extern qboolean IQM_InAnimGroup(int frame, int oldframe);
765 extern int IQM_NextFrame(int frame);
766 extern void IQM_AnimateRagdoll(int RagDollID, int shellEffect);
767 extern void IQM_DrawFrame(int skinnum, qboolean ragdoll, float shellAlpha);
768 extern void IQM_DrawShadow(vec3_t origin);
769 
770 //Ragdoll
771 int r_DrawingRagDoll;
772 int r_SurfaceCount;
773 
774 #define TURBSCALE2 (256.0 / (2 * M_PI))
775 
776 // reduce runtime calcs
777 #define TURBSCALE 40.743665431525205956834243423364
778 
779 extern float r_turbsin[];
780 /*
781 ====================================================================
782 
783 IMPLEMENTATION SPECIFIC FUNCTIONS
784 
785 ====================================================================
786 */
787 
788 extern void		GLimp_BeginFrame( float camera_separation );
789 extern void		GLimp_EndFrame( void );
790 extern qboolean	GLimp_Init( void *hinstance, void *hWnd );
791 extern void		GLimp_Shutdown( void );
792 extern rserr_t    	GLimp_SetMode( unsigned *pwidth, unsigned *pheight, int mode, qboolean fullscreen );
793 extern void		GLimp_AppActivate( qboolean active );
794 extern void		GLimp_EnableLogging( qboolean enable );
795 extern void		GLimp_LogNewFrame( void );
796 
797 /*
798 ====================================================================
799 
800 IMPORTED FUNCTIONS
801 
802 ====================================================================
803 */
804 
805 #include "r_script.h"
806