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