1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// r_main.c
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamentity_t	r_worldentity;
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	r_cache_thrash;		// compatability
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvec3_t		modelorg, r_entorigin;
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamentity_t	*currententity;
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			r_visframecount;	// bumped when going to a new PVS
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			r_framecount;		// used for dlight push checking
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammplane_t	frustum[4];
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			c_brush_polys, c_alias_polys;
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	envmap;				// true during envmap command capture
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			currenttexture = -1;		// to avoid unnecessary texture sets
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			cnttextures[2] = {-1, -1};     // cached
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			particletexture;	// little dot for particles
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			playertextures;		// up to 16 color translated skins
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			mirrortexturenum;	// quake texturenum, not gltexturenum
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	mirror;
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammplane_t	*mirror_plane;
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// view origin
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvec3_t	vup;
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvec3_t	vpn;
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvec3_t	vright;
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvec3_t	r_origin;
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	r_world_matrix[16];
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	r_base_world_matrix[16];
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// screen size info
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamrefdef_t	r_refdef;
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammleaf_t		*r_viewleaf, *r_oldviewleaf;
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtexture_t	*r_notexture_mip;
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint		d_lightstylevalue[256];	// 8.8 fraction of base light value
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_MarkLeaves (void);
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_norefresh = CVAR2("r_norefresh","0");
77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_drawentities = CVAR2("r_drawentities","1");
78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_drawviewmodel = CVAR2("r_drawviewmodel","1");
79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_speeds = CVAR2("r_speeds","0");
80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_fullbright = CVAR2("r_fullbright","0");
81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_lightmap = CVAR2("r_lightmap","0");
82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_shadows = CVAR2("r_shadows","0");
83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_mirroralpha = CVAR2("r_mirroralpha","1");
84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_wateralpha = CVAR2("r_wateralpha","1");
85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_dynamic = CVAR2("r_dynamic","1");
86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_novis = CVAR2("r_novis","0");
87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	r_netgraph = CVAR2("r_netgraph","0");
88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_clear = CVAR2("gl_clear","0");
90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_cull = CVAR2("gl_cull","1");
91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_texsort = CVAR2("gl_texsort","1");
92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_smoothmodels = CVAR2("gl_smoothmodels","1");
93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_affinemodels = CVAR2("gl_affinemodels","0");
94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_polyblend = CVAR2("gl_polyblend","1");
95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_flashblend = CVAR2("gl_flashblend","1");
96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_playermip = CVAR2("gl_playermip","0");
97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_nocolors = CVAR2("gl_nocolors","0");
98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_keeptjunctions = CVAR2("gl_keeptjunctions","1");
99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_reporttjunctions = CVAR2("gl_reporttjunctions","0");
100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	gl_finish = CVAR2("gl_finish","0");
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	cvar_t	gl_ztrick;
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	cvar_t	scr_fov;
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_CullBox
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamReturns true if the box is completely outside the frustom
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean R_CullBox (vec3_t mins, vec3_t maxs)
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<4 ; i++)
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (BoxOnPlaneSide (mins, maxs, &frustum[i]) == 2)
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return true;
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return false;
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_RotateForEntity (entity_t *e)
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glTranslatef (e->origin[0],  e->origin[1],  e->origin[2]);
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (e->angles[1],  0, 0, 1);
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (-e->angles[0],  0, 1, 0);
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//ZOID: fixed z angle
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (e->angles[2],  1, 0, 0);
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============================================================
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream  SPRITE MODELS
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============================================================
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_GetSpriteFrame
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammspriteframe_t *R_GetSpriteFrame (entity_t *currententity)
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msprite_t		*psprite;
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	mspritegroup_t	*pspritegroup;
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	mspriteframe_t	*pspriteframe;
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				i, numframes, frame;
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float			*pintervals, fullinterval, targettime, time;
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	psprite = currententity->model->cache.data;
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	frame = currententity->frame;
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((frame >= psprite->numframes) || (frame < 0))
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("R_DrawSprite: no such frame %d\n", frame);
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		frame = 0;
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (psprite->frames[frame].type == SPR_SINGLE)
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pspriteframe = psprite->frames[frame].frameptr;
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pspritegroup = (mspritegroup_t *)psprite->frames[frame].frameptr;
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pintervals = pspritegroup->intervals;
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		numframes = pspritegroup->numframes;
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fullinterval = pintervals[numframes-1];
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		time = cl.time + currententity->syncbase;
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// when loading in Mod_LoadSpriteGroup, we guaranteed all interval values
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// are positive, so we don't have to worry about division by 0
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		targettime = time - ((int)(time / fullinterval)) * fullinterval;
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<(numframes-1) ; i++)
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (pintervals[i] > targettime)
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pspriteframe = pspritegroup->frames[i];
1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return pspriteframe;
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_DrawSpriteModel
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_DrawSpriteModel (entity_t *e)
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t	point;
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	mspriteframe_t	*frame;
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float		*up, *right;
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t		v_forward, v_right, v_up;
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msprite_t		*psprite;
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// don't even bother culling, because it's just a single
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// polygon without a surface cache
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	frame = R_GetSpriteFrame (e);
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	psprite = currententity->model->cache.data;
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (psprite->type == SPR_ORIENTED)
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{	// bullet marks on walls
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		AngleVectors (currententity->angles, v_forward, v_right, v_up);
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		up = v_up;
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		right = v_right;
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{	// normal sprite
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		up = vup;
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		right = vright;
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glColor3f (1,1,1);
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	GL_DisableMultitexture();
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    GL_Bind(frame->gl_texturenum);
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glEnable (GL_ALPHA_TEST);
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES
232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// !!! Need to implement this !!!
233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glBegin (GL_QUADS);
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glTexCoord2f (0, 1);
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (e->origin, frame->down, up, point);
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (point, frame->left, right, point);
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glVertex3fv (point);
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glTexCoord2f (0, 0);
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (e->origin, frame->up, up, point);
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (point, frame->left, right, point);
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glVertex3fv (point);
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glTexCoord2f (1, 0);
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (e->origin, frame->up, up, point);
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (point, frame->right, right, point);
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glVertex3fv (point);
2519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glTexCoord2f (1, 1);
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (e->origin, frame->down, up, point);
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (point, frame->right, right, point);
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glVertex3fv (point);
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glEnd ();
258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDisable (GL_ALPHA_TEST);
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============================================================
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream  ALIAS MODELS
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============================================================
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NUMVERTEXNORMALS	162
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	r_avertexnormals[NUMVERTEXNORMALS][3] = {
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "anorms.h"
2769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream};
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvec3_t	shadevector;
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	shadelight, ambientlight;
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// precalculated dot products for quantized angles
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define SHADEDOT_QUANT 16
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	r_avertexnormal_dots[SHADEDOT_QUANT][256] =
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "anorm_dots.h"
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream;
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	*shadedots = r_avertexnormal_dots[0];
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint	lastposenum;
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamGL_DrawAliasFrame
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid GL_DrawAliasFrame (aliashdr_t *paliashdr, int posenum)
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float 	l;
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	trivertx_t	*verts;
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		*order;
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		count;
3029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamlastposenum = posenum;
3049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	verts = (trivertx_t *)((byte *)paliashdr + paliashdr->posedata);
3069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	verts += posenum * paliashdr->poseverts;
3079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	order = (int *)((byte *)paliashdr + paliashdr->commands);
3089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
3109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// get the vertex count and primitive type
3129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		count = *order++;
3139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!count)
3149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;		// done
315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES
317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		{
318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			int primType;
319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			float color[3*256];
320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			float vertex[3*256];
321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			int c;
322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			float* pColor;
323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			float* pVertex;
324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			if (count < 0)
326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			{
327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				count = -count;
328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				primType = GL_TRIANGLE_FAN;
329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			}
330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			else
331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				primType = GL_TRIANGLE_STRIP;
332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			// texture coordinates come from the draw list
334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			glTexCoordPointer(2, GL_FLOAT, 0, order);
335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			pColor = color;
337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			pVertex = vertex;
338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			for(c = 0; c < count; c++)
339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			{
340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				// normals and vertexes come from the frame list
341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				l = shadedots[verts->lightnormalindex] * shadelight;
342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				*pColor++ = l;
343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				*pColor++ = l;
344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				*pColor++ = l;
345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				*pVertex++ = verts->v[0];
346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				*pVertex++ = verts->v[1];
347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				*pVertex++ = verts->v[2];
348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich				verts++;
349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			}
350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			glColorPointer(3, GL_FLOAT, 0, color);
352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			glVertexPointer(3, GL_FLOAT, 0, vertex);
353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			glDrawArrays(primType, 0, count);
355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			order += 2 * count;
357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		}
358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else
3609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (count < 0)
3619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
3629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			count = -count;
3639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glBegin (GL_TRIANGLE_FAN);
3649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
3659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
3669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glBegin (GL_TRIANGLE_STRIP);
3679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		do
3699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
3709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// texture coordinates come from the draw list
3719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glTexCoord2f (((float *)order)[0], ((float *)order)[1]);
3729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			order += 2;
3739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// normals and vertexes come from the frame list
3759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			l = shadedots[verts->lightnormalindex] * shadelight;
3769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glColor3f (l, l, l);
3779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glVertex3f (verts->v[0], verts->v[1], verts->v[2]);
3789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			verts++;
3799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		} while (--count);
3809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glEnd ();
382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
3839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
3889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
3899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamGL_DrawAliasShadow
3909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
3919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
3929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	vec3_t			lightspot;
3939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid GL_DrawAliasShadow (aliashdr_t *paliashdr, int posenum)
3959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	trivertx_t	*verts;
3979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		*order;
3989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t	point;
3999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float	height, lheight;
4009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		count;
4019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lheight = currententity->origin[2] - lightspot[2];
4039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	height = 0;
4059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	verts = (trivertx_t *)((byte *)paliashdr + paliashdr->posedata);
4069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	verts += posenum * paliashdr->poseverts;
4079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	order = (int *)((byte *)paliashdr + paliashdr->commands);
4089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	height = -lheight + 1.0;
4109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
4129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// get the vertex count and primitive type
4149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		count = *order++;
4159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!count)
4169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;		// done
417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
418cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES
419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		// !!! Implement this (based on GL_DrawAlias)
421cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		break;
422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else
423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (count < 0)
4259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
4269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			count = -count;
4279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glBegin (GL_TRIANGLE_FAN);
4289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
4299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
4309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glBegin (GL_TRIANGLE_STRIP);
4319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		do
4339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
4349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// texture coordinates come from the draw list
4359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// (skipped for shadows) glTexCoord2fv ((float *)order);
4369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			order += 2;
4379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// normals and vertexes come from the frame list
4399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			point[0] = verts->v[0] * paliashdr->scale[0] + paliashdr->scale_origin[0];
4409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			point[1] = verts->v[1] * paliashdr->scale[1] + paliashdr->scale_origin[1];
4419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			point[2] = verts->v[2] * paliashdr->scale[2] + paliashdr->scale_origin[2];
4429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			point[0] -= shadevector[0]*(point[2]+lheight);
4449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			point[1] -= shadevector[1]*(point[2]+lheight);
4459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			point[2] = height;
4469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//			height -= 0.001;
4479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glVertex3fv (point);
4489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			verts++;
4509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		} while (--count);
4519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glEnd ();
453cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
454cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
455cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
4629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
4639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_SetupAliasFrame
4649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
4669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
4679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_SetupAliasFrame (int frame, aliashdr_t *paliashdr)
4689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				pose, numposes;
4709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float			interval;
4719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((frame >= paliashdr->numframes) || (frame < 0))
4739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_DPrintf ("R_AliasSetupFrame: no such frame %d\n", frame);
4759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		frame = 0;
4769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pose = paliashdr->frames[frame].firstpose;
4799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	numposes = paliashdr->frames[frame].numposes;
4809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (numposes > 1)
4829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		interval = paliashdr->frames[frame].interval;
4849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pose += (int)(cl.time / interval) % numposes;
4859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	GL_DrawAliasFrame (paliashdr, pose);
4889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
4939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
4949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_DrawAliasModel
4959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
4979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
4989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_DrawAliasModel (entity_t *e)
4999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
5019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			lnum;
5029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t		dist;
5039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float		add;
5049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	model_t		*clmodel;
5059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t		mins, maxs;
5069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	aliashdr_t	*paliashdr;
5079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float		an;
5089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			anim;
5099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	clmodel = currententity->model;
5119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorAdd (currententity->origin, clmodel->mins, mins);
5139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorAdd (currententity->origin, clmodel->maxs, maxs);
5149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (R_CullBox (mins, maxs))
5169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
5179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorCopy (currententity->origin, r_entorigin);
5209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorSubtract (r_origin, r_entorigin, modelorg);
5219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
5239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// get lighting information
5249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
5259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ambientlight = shadelight = R_LightPoint (currententity->origin);
5279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// allways give the gun some light
5299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (e == &cl.viewent && ambientlight < 24)
5309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ambientlight = shadelight = 24;
5319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (lnum=0 ; lnum<MAX_DLIGHTS ; lnum++)
5339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cl_dlights[lnum].die >= cl.time)
5359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
5369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			VectorSubtract (currententity->origin,
5379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							cl_dlights[lnum].origin,
5389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							dist);
5399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			add = cl_dlights[lnum].radius - Length(dist);
5409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (add > 0) {
5429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				ambientlight += add;
5439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				//ZOID models should be affected by dlights as well
5449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				shadelight += add;
5459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
5469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// clamp lighting so it doesn't overbright as much
5509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (ambientlight > 128)
5519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ambientlight = 128;
5529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (ambientlight + shadelight > 192)
5539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		shadelight = 192 - ambientlight;
5549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// ZOID: never allow players to go totally black
5569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!strcmp(clmodel->name, "progs/player.mdl")) {
5579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (ambientlight < 8)
5589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			ambientlight = shadelight = 8;
5599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} else if (!strcmp (clmodel->name, "progs/flame2.mdl")
5619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		|| !strcmp (clmodel->name, "progs/flame.mdl") )
5629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// HACK HACK HACK -- no fullbright colors, so make torches full light
5639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ambientlight = shadelight = 256;
5649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shadedots = r_avertexnormal_dots[((int)(e->angles[1] * (SHADEDOT_QUANT / 360.0))) & (SHADEDOT_QUANT - 1)];
5669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shadelight = shadelight / 200.0;
5679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	an = e->angles[1]/180*M_PI;
5699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shadevector[0] = cos(-an);
5709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shadevector[1] = sin(-an);
5719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shadevector[2] = 1;
5729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorNormalize (shadevector);
5739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
5759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// locate the proper data
5769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
5779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	paliashdr = (aliashdr_t *)Mod_Extradata (currententity->model);
5789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	c_alias_polys += paliashdr->numtris;
5809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
5829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// draw all the triangles
5839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
5849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	GL_DisableMultitexture();
5869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glPushMatrix ();
5889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_RotateForEntity (e);
5899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!strcmp (clmodel->name, "progs/eyes.mdl") ) {
5919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glTranslatef (paliashdr->scale_origin[0], paliashdr->scale_origin[1], paliashdr->scale_origin[2] - (22 + 8));
5929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// double size of eyes, since they are really hard to see in gl
5939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glScalef (paliashdr->scale[0]*2, paliashdr->scale[1]*2, paliashdr->scale[2]*2);
5949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} else {
5959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glTranslatef (paliashdr->scale_origin[0], paliashdr->scale_origin[1], paliashdr->scale_origin[2]);
5969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glScalef (paliashdr->scale[0], paliashdr->scale[1], paliashdr->scale[2]);
5979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	anim = (int)(cl.time*10) & 3;
6009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    GL_Bind(paliashdr->gl_texturenum[currententity->skinnum][anim]);
6019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// we can't dynamically colormap textures, so they are cached
6039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// seperately for the players.  Heads are just uncolored.
6049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (currententity->scoreboard && !gl_nocolors.value)
6059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		i = currententity->scoreboard - cl.players;
6079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!currententity->scoreboard->skin) {
6089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Skin_Find(currententity->scoreboard);
6099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			R_TranslatePlayerSkin(i);
6109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
6119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (i >= 0 && i<MAX_CLIENTS)
6129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		    GL_Bind(playertextures + i);
6139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (gl_smoothmodels.value)
6169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glShadeModel (GL_SMOOTH);
6179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
6189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (gl_affinemodels.value)
6209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
6219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_SetupAliasFrame (currententity->frame, paliashdr);
6239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
6259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glShadeModel (GL_FLAT);
6279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (gl_affinemodels.value)
6289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
6299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glPopMatrix ();
6319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_shadows.value)
6339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glPushMatrix ();
6359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		R_RotateForEntity (e);
6369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glDisable (GL_TEXTURE_2D);
6379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glEnable (GL_BLEND);
6389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glColor4f (0,0,0,0.5);
6399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		GL_DrawAliasShadow (paliashdr, lastposenum);
6409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glEnable (GL_TEXTURE_2D);
6419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glDisable (GL_BLEND);
6429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glColor4f (1,1,1,1);
6439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glPopMatrix ();
6449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//==================================================================================
6499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
6519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
6529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_DrawEntitiesOnList
6539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
6549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
6559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_DrawEntitiesOnList (void)
6569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
6589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!r_drawentities.value)
6609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
6619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// draw sprites seperately, because of alpha blending
6639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<cl_numvisedicts ; i++)
6649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		currententity = &cl_visedicts[i];
6669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		switch (currententity->model->type)
6689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
6699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case mod_alias:
6709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			R_DrawAliasModel (currententity);
6719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
6729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case mod_brush:
6749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			R_DrawBrushModel (currententity);
6759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
6769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		default:
6789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
6799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
6809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<cl_numvisedicts ; i++)
6839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		currententity = &cl_visedicts[i];
6859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		switch (currententity->model->type)
6879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
6889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case mod_sprite:
6899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			R_DrawSpriteModel (currententity);
6909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
6919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		default :
6939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
6949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
6959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
6999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
7009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_DrawViewModel
7019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
7029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_DrawViewModel (void)
7049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float		ambient[4], diffuse[4];
7069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			j;
7079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			lnum;
7089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t		dist;
7099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float		add;
7109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dlight_t	*dl;
7119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			ambientlight, shadelight;
7129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!r_drawviewmodel.value || !Cam_DrawViewModel())
7149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (envmap)
7179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!r_drawentities.value)
7209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl.stats[STAT_ITEMS] & IT_INVISIBILITY)
7239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl.stats[STAT_HEALTH] <= 0)
7269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	currententity = &cl.viewent;
7299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!currententity->model)
7309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	j = R_LightPoint (currententity->origin);
7339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (j < 24)
7359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		j = 24;		// allways give some light on gun
7369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ambientlight = j;
7379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shadelight = j;
7389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// add dynamic lights
7409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (lnum=0 ; lnum<MAX_DLIGHTS ; lnum++)
7419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dl = &cl_dlights[lnum];
7439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!dl->radius)
7449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
7459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!dl->radius)
7469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
7479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (dl->die < cl.time)
7489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
7499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VectorSubtract (currententity->origin, dl->origin, dist);
7519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		add = dl->radius - Length(dist);
7529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (add > 0)
7539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			ambientlight += add;
7549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ambient[0] = ambient[1] = ambient[2] = ambient[3] = (float)ambientlight / 128;
7579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	diffuse[0] = diffuse[1] = diffuse[2] = diffuse[3] = (float)shadelight / 128;
7589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// hack the depth range to prevent view model from poking into walls
760cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES
761cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	glDepthRangef(gldepthmin, gldepthmin + 0.3f*(gldepthmax-gldepthmin));
762cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	R_DrawAliasModel (currententity);
763cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	glDepthRangef(gldepthmin, gldepthmax);
764cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else
7659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDepthRange (gldepthmin, gldepthmin + 0.3*(gldepthmax-gldepthmin));
7669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_DrawAliasModel (currententity);
7679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDepthRange (gldepthmin, gldepthmax);
768cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
7699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
7739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
7749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_PolyBlend
7759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
7769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_PolyBlend (void)
7789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!gl_polyblend.value)
7809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!v_blend[3])
7829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//Con_Printf("R_PolyBlend(): %4.2f %4.2f %4.2f %4.2f\n",v_blend[0], v_blend[1],	v_blend[2],	v_blend[3]);
7859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 	GL_DisableMultitexture();
7879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDisable (GL_ALPHA_TEST);
7899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glEnable (GL_BLEND);
7909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDisable (GL_DEPTH_TEST);
7919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDisable (GL_TEXTURE_2D);
7929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glLoadIdentity ();
7949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (-90,  1, 0, 0);	    // put Z going up
7969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (90,  0, 0, 1);	    // put Z going up
7979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glColor4fv (v_blend);
7999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
800cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES
801cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// !!! Implement this
802cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else
8039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glBegin (GL_QUADS);
8049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glVertex3f (10, 100, 100);
8069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glVertex3f (10, -100, 100);
8079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glVertex3f (10, -100, -100);
8089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glVertex3f (10, 100, -100);
8099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glEnd ();
810cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
8119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDisable (GL_BLEND);
8139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glEnable (GL_TEXTURE_2D);
8149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glEnable (GL_ALPHA_TEST);
8159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint SignbitsForPlane (mplane_t *out)
8199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int	bits, j;
8219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// for fast box on planeside test
8239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bits = 0;
8259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (j=0 ; j<3 ; j++)
8269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (out->normal[j] < 0)
8289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			bits |= 1<<j;
8299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return bits;
8319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_SetFrustum (void)
8359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
8379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_refdef.fov_x == 90)
8399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// front side is visible
8419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VectorAdd (vpn, vright, frustum[0].normal);
8439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VectorSubtract (vpn, vright, frustum[1].normal);
8449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VectorAdd (vpn, vup, frustum[2].normal);
8469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VectorSubtract (vpn, vup, frustum[3].normal);
8479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
8499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// rotate VPN right by FOV_X/2 degrees
8529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		RotatePointAroundVector( frustum[0].normal, vup, vpn, -(90-r_refdef.fov_x / 2 ) );
8539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// rotate VPN left by FOV_X/2 degrees
8549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		RotatePointAroundVector( frustum[1].normal, vup, vpn, 90-r_refdef.fov_x / 2 );
8559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// rotate VPN up by FOV_X/2 degrees
8569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		RotatePointAroundVector( frustum[2].normal, vright, vpn, 90-r_refdef.fov_y / 2 );
8579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// rotate VPN down by FOV_X/2 degrees
8589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		RotatePointAroundVector( frustum[3].normal, vright, vpn, -( 90 - r_refdef.fov_y / 2 ) );
8599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<4 ; i++)
8629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		frustum[i].type = PLANE_ANYZ;
8649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		frustum[i].dist = DotProduct (r_origin, frustum[i].normal);
8659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		frustum[i].signbits = SignbitsForPlane (&frustum[i]);
8669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
8729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
8739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_SetupFrame
8749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
8759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
8769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_SetupFrame (void)
8779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// don't allow cheats in multiplayer
8799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_fullbright.value = 0;
8809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_lightmap.value = 0;
8819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!atoi(Info_ValueForKey(cl.serverinfo, "watervis")))
8829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		r_wateralpha.value = 1;
8839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_AnimateLight ();
8859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_framecount++;
8879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// build the transformation matrix for the given view angles
8899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorCopy (r_refdef.vieworg, r_origin);
8909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	AngleVectors (r_refdef.viewangles, vpn, vright, vup);
8929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// current viewleaf
8949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_oldviewleaf = r_viewleaf;
8959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_viewleaf = Mod_PointInLeaf (r_origin, cl.worldmodel);
8969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	V_SetContentsColor (r_viewleaf->contents);
8989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	V_CalcBlend ();
8999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_cache_thrash = false;
9019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	c_brush_polys = 0;
9039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	c_alias_polys = 0;
9049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
907cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES
908cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
909cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid MYgluPerspective( float fovy, float aspect,
910cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		     float zNear, float zFar )
911cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
912cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich   float xmin, xmax, ymin, ymax;
913cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
914cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich   ymax = zNear * tan( fovy * M_PI / 360.0f );
915cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich   ymin = -ymax;
916cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
917cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich   xmin = ymin * aspect;
918cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich   xmax = ymax * aspect;
919cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
920cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich   glFrustumf( xmin, xmax, ymin, ymax, zNear, zFar );
921cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
922cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
923cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else
9249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MYgluPerspective( GLdouble fovy, GLdouble aspect,
9269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		     GLdouble zNear, GLdouble zFar )
9279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream   GLdouble xmin, xmax, ymin, ymax;
9299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream   ymax = zNear * tan( fovy * M_PI / 360.0 );
9319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream   ymin = -ymax;
9329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream   xmin = ymin * aspect;
9349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream   xmax = ymax * aspect;
9359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream   glFrustum( xmin, xmax, ymin, ymax, zNear, zFar );
9379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
938cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
9399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
9429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_SetupGL
9439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
9449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_SetupGL (void)
9469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float	screenaspect;
9489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	extern	int glwidth, glheight;
9499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		x, x2, y2, y, w, h;
9509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
9529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// set up viewpoint
9539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
9549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glMatrixMode(GL_PROJECTION);
9559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glLoadIdentity ();
9569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	x = r_refdef.vrect.x * glwidth/vid.width;
9579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	x2 = (r_refdef.vrect.x + r_refdef.vrect.width) * glwidth/vid.width;
9589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	y = (vid.height-r_refdef.vrect.y) * glheight/vid.height;
9599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	y2 = (vid.height - (r_refdef.vrect.y + r_refdef.vrect.height)) * glheight/vid.height;
9609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// fudge around because of frac screen scale
9629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (x > 0)
9639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		x--;
9649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (x2 < glwidth)
9659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		x2++;
9669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (y2 < 0)
9679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		y2--;
9689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (y < glheight)
9699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		y++;
9709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	w = x2 - x;
9729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	h = y - y2;
9739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (envmap)
9759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		x = y2 = 0;
9779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		w = h = 256;
9789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glViewport (glx + x, gly + y2, w, h);
9819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    screenaspect = (float)r_refdef.vrect.width/r_refdef.vrect.height;
9829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	yfov = 2*atan((float)r_refdef.vrect.height/r_refdef.vrect.width)*180/M_PI;
9839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	yfov = (2.0 * tan (scr_fov.value/360*M_PI)) / screenaspect;
9849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	yfov = 2*atan((float)r_refdef.vrect.height/r_refdef.vrect.width)*(scr_fov.value*2)/M_PI;
9859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//    MYgluPerspective (yfov,  screenaspect,  4,  4096);
9869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    MYgluPerspective (r_refdef.fov_y,  screenaspect,  4,  4096);
9879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (mirror)
9899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (mirror_plane->normal[2])
9919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glScalef (1, -1, 1);
9929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
9939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glScalef (-1, 1, 1);
9949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glCullFace(GL_BACK);
9959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
9979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glCullFace(GL_FRONT);
9989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glMatrixMode(GL_MODELVIEW);
10009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glLoadIdentity ();
10019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (-90,  1, 0, 0);	    // put Z going up
10039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (90,  0, 0, 1);	    // put Z going up
10049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (-r_refdef.viewangles[2],  1, 0, 0);
10059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (-r_refdef.viewangles[0],  0, 1, 0);
10069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glRotatef (-r_refdef.viewangles[1],  0, 0, 1);
10079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    glTranslatef (-r_refdef.vieworg[0],  -r_refdef.vieworg[1],  -r_refdef.vieworg[2]);
10089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1009cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES
1010cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	glGetIntegerv (MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES, (GLint*) r_world_matrix);
1011cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else
10129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glGetFloatv (GL_MODELVIEW_MATRIX, r_world_matrix);
1013cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
10149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
10169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// set drawing parms
10179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
10189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (gl_cull.value)
10199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glEnable(GL_CULL_FACE);
10209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
10219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glDisable(GL_CULL_FACE);
10229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDisable(GL_BLEND);
10249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDisable(GL_ALPHA_TEST);
10259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glEnable(GL_DEPTH_TEST);
10269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
10309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_RenderScene
10319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamr_refdef must be set before the first call
10339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
10349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_RenderScene (void)
10369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_SetupFrame ();
10389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_SetFrustum ();
10409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_SetupGL ();
10429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_MarkLeaves ();	// done here so we know if we're in water
10449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_DrawWorld ();		// adds static entities to the list
10469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_ExtraUpdate ();	// don't let sound get messed up if going slow
10489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_DrawEntitiesOnList ();
10509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	GL_DisableMultitexture();
10529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_RenderDlights ();
10549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_DrawParticles ();
10569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef GLTEST
10589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Test_Draw ();
10599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
10609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
10669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_Clear
10679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
10689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_Clear (void)
10709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_mirroralpha.value != 1.0)
10729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (gl_clear.value)
10749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
10759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
10769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glClear (GL_DEPTH_BUFFER_BIT);
10779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		gldepthmin = 0;
10789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		gldepthmax = 0.5;
10799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glDepthFunc (GL_LEQUAL);
10809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (gl_ztrick.value)
10829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		static int trickframe;
10849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (gl_clear.value)
10869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glClear (GL_COLOR_BUFFER_BIT);
10879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		trickframe++;
10899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (trickframe & 1)
10909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
10919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			gldepthmin = 0;
10929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			gldepthmax = 0.49999;
10939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glDepthFunc (GL_LEQUAL);
10949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
10959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
10969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
10979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			gldepthmin = 1;
10989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			gldepthmax = 0.5;
10999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glDepthFunc (GL_GEQUAL);
11009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
11019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
11039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (gl_clear.value)
11059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
11069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
11079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			glClear (GL_DEPTH_BUFFER_BIT);
11089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		gldepthmin = 0;
11099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		gldepthmax = 1;
11109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glDepthFunc (GL_LEQUAL);
11119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES
1114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	glDepthRangef (gldepthmin, gldepthmax);
1115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else
11169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDepthRange (gldepthmin, gldepthmax);
1117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
11189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#if 0 //!!! FIXME, Zoid, mirror is disabled for now
11219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
11229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
11239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_Mirror
11249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
11259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
11269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_Mirror (void)
11279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float		d;
11299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msurface_t	*s;
11309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	entity_t	*ent;
11319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!mirror)
11339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
11349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy (r_base_world_matrix, r_world_matrix, sizeof(r_base_world_matrix));
11369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d = DotProduct (r_refdef.vieworg, mirror_plane->normal) - mirror_plane->dist;
11389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (r_refdef.vieworg, -2*d, mirror_plane->normal, r_refdef.vieworg);
11399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d = DotProduct (vpn, mirror_plane->normal);
11419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorMA (vpn, -2*d, mirror_plane->normal, vpn);
11429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_refdef.viewangles[0] = -asin (vpn[2])/M_PI*180;
11449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_refdef.viewangles[1] = atan2 (vpn[1], vpn[0])/M_PI*180;
11459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_refdef.viewangles[2] = -r_refdef.viewangles[2];
11469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent = &cl_entities[cl.viewentity];
11489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl_numvisedicts < MAX_VISEDICTS)
11499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl_visedicts[cl_numvisedicts] = ent;
11519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl_numvisedicts++;
11529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	gldepthmin = 0.5;
11559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	gldepthmax = 1;
11569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDepthRange (gldepthmin, gldepthmax);
11579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDepthFunc (GL_LEQUAL);
11589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_RenderScene ();
11609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_DrawWaterSurfaces ();
11619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	gldepthmin = 0;
11649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	gldepthmax = 0.5;
11659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDepthRange (gldepthmin, gldepthmax);
11669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDepthFunc (GL_LEQUAL);
11679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// blend on top
11699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glEnable (GL_BLEND);
11709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glMatrixMode(GL_PROJECTION);
11719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (mirror_plane->normal[2])
11729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glScalef (1,-1,1);
11739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
11749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glScalef (-1,1,1);
11759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glCullFace(GL_FRONT);
11769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glMatrixMode(GL_MODELVIEW);
11779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glLoadMatrixf (r_base_world_matrix);
11799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glColor4f (1,1,1,r_mirroralpha.value);
11819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	s = cl.worldmodel->textures[mirrortexturenum]->texturechain;
11829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for ( ; s ; s=s->texturechain)
11839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		R_RenderBrushPoly (s);
11849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.worldmodel->textures[mirrortexturenum]->texturechain = NULL;
11859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glDisable (GL_BLEND);
11869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	glColor4f (1,1,1,1);
11879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
11899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
11919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_RenderView
11939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamr_refdef must be set before the first call
11959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
11979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_RenderView (void)
11989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double	time1 = 0, time2;
12009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_norefresh.value)
12029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
12039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!r_worldentity.model || !cl.worldmodel)
12059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("R_RenderView: NULL worldmodel");
12069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_speeds.value)
12089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
12099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glFinish ();
12109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		time1 = Sys_DoubleTime ();
12119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c_brush_polys = 0;
12129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c_alias_polys = 0;
12139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
12149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	mirror = false;
12169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (gl_finish.value)
12189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		glFinish ();
12199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_Clear ();
12219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// render normal view
12239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_RenderScene ();
12249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_DrawViewModel ();
12259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_DrawWaterSurfaces ();
12269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// render mirror view
12289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	R_Mirror ();
12299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_PolyBlend ();
12319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_speeds.value)
12339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
12349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		glFinish ();
12359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		time2 = Sys_DoubleTime ();
12369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("%3i ms  %4i wpoly %4i epoly\n", (int)((time2-time1)*1000), c_brush_polys, c_alias_polys);
12379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
12389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1239