2004-08-23 00:15:46 +00:00
# include "quakedef.h"
# include "winquake.h"
2009-11-04 21:16:50 +00:00
# include "pr_common.h"
2004-08-23 00:15:46 +00:00
# include "gl_draw.h"
2010-01-15 05:35:27 +00:00
# include <string.h>
2009-11-04 21:16:50 +00:00
refdef_t r_refdef ;
vec3_t r_origin , vpn , vright , vup ;
entity_t r_worldentity ;
2009-11-04 23:20:50 +00:00
entity_t * currententity ; //nnggh
model_t * currentmodel ; //fixme: remove? or fix.
2009-11-04 21:16:50 +00:00
int sh_shadowframe ; //index for msurf->shadowframe
2009-11-04 23:20:50 +00:00
int r_framecount ;
struct texture_s * r_notexture_mip ;
2004-08-23 00:15:46 +00:00
2009-11-04 21:16:50 +00:00
void R_InitParticleTexture ( void ) ;
2004-08-23 00:15:46 +00:00
qboolean vid_isfullscreen ;
# define VIDCOMMANDGROUP "Video config"
# define GRAPHICALNICETIES "Graphical Nicaties" //or eyecandy, which ever you prefer.
# define GLRENDEREROPTIONS "GL Renderer Options"
# define SCREENOPTIONS "Screen Options"
unsigned int d_8to24rgbtable [ 256 ] ;
2006-01-16 13:47:56 +00:00
extern int gl_anisotropy_factor ;
2006-04-14 05:23:11 +00:00
// callbacks used for cvars
2006-04-15 06:57:13 +00:00
void SCR_Viewsize_Callback ( struct cvar_s * var , char * oldvalue ) ;
void SCR_Fov_Callback ( struct cvar_s * var , char * oldvalue ) ;
2009-11-04 21:16:50 +00:00
# if defined(GLQUAKE)
2006-04-14 05:23:11 +00:00
void GL_Texturemode_Callback ( struct cvar_s * var , char * oldvalue ) ;
2007-06-10 05:14:38 +00:00
void GL_Texturemode2d_Callback ( struct cvar_s * var , char * oldvalue ) ;
2006-06-04 02:25:10 +00:00
void GL_Texture_Anisotropic_Filtering_Callback ( struct cvar_s * var , char * oldvalue ) ;
2006-04-14 05:23:11 +00:00
# endif
2004-08-23 00:15:46 +00:00
2010-07-11 02:22:39 +00:00
cvar_t _vid_wait_override = CVARAF ( " vid_wait " , " " ,
" _vid_wait_override " , CVAR_ARCHIVE ) ;
2006-02-11 02:09:43 +00:00
2010-07-11 02:22:39 +00:00
cvar_t _windowed_mouse = CVARF ( " _windowed_mouse " , " 1 " ,
CVAR_ARCHIVE ) ;
2006-02-11 02:09:43 +00:00
2010-07-11 02:22:39 +00:00
cvar_t con_ocranaleds = CVAR ( " con_ocranaleds " , " 2 " ) ;
2006-02-11 02:09:43 +00:00
2010-07-11 02:22:39 +00:00
cvar_t cl_cursor = CVAR ( " cl_cursor " , " " ) ;
cvar_t cl_cursorsize = CVAR ( " cl_cursorsize " , " 32 " ) ;
cvar_t cl_cursorbias = CVAR ( " cl_cursorbias " , " 4 " ) ;
2004-08-23 00:15:46 +00:00
2010-07-11 02:22:39 +00:00
cvar_t gl_nocolors = CVAR ( " gl_nocolors " , " 0 " ) ;
cvar_t gl_part_flame = CVAR ( " gl_part_flame " , " 1 " ) ;
2004-08-23 00:15:46 +00:00
2009-11-04 21:16:50 +00:00
//opengl library, blank means try default.
2011-01-28 05:39:40 +00:00
static cvar_t gl_driver = CVARF ( " gl_driver " , " " ,
2010-07-11 02:22:39 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
cvar_t gl_shadeq1_name = CVAR ( " gl_shadeq1_name " , " * " ) ;
2004-10-26 15:31:39 +00:00
extern cvar_t r_vertexlight ;
2005-08-06 07:18:29 +00:00
2010-07-11 02:22:39 +00:00
cvar_t mod_md3flags = CVAR ( " mod_md3flags " , " 1 " ) ;
2007-08-21 22:41:15 +00:00
2010-07-11 02:22:39 +00:00
cvar_t r_ambient = CVARF ( " r_ambient " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_CHEAT ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_bloodstains = CVAR ( " r_bloodstains " , " 1 " ) ;
cvar_t r_bouncysparks = CVARF ( " r_bouncysparks " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_drawentities = CVAR ( " r_drawentities " , " 1 " ) ;
cvar_t r_drawflat = CVARF ( " r_drawflat " , " 0 " ,
2009-11-04 21:16:50 +00:00
CVAR_SEMICHEAT | CVAR_RENDERERCALLBACK | CVAR_SHADERSYSTEM ) ;
2010-07-11 02:22:39 +00:00
cvar_t gl_miptexLevel = CVAR ( " gl_miptexLevel " , " 0 " ) ;
cvar_t r_drawviewmodel = CVAR ( " r_drawviewmodel " , " 1 " ) ;
cvar_t r_drawviewmodelinvis = CVAR ( " r_drawviewmodelinvis " , " 0 " ) ;
cvar_t r_dynamic = CVARF ( " r_dynamic " , IFMINIMAL ( " 0 " , " 1 " ) ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_fastturb = CVARF ( " r_fastturb " , " 0 " ,
CVAR_SHADERSYSTEM ) ;
cvar_t r_fastsky = CVARF ( " r_fastsky " , " 0 " ,
2009-11-04 21:16:50 +00:00
CVAR_SHADERSYSTEM ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_fastskycolour = CVARF ( " r_fastskycolour " , " 0 " ,
2009-11-04 21:16:50 +00:00
CVAR_RENDERERCALLBACK | CVAR_SHADERSYSTEM ) ;
2010-11-10 03:32:47 +00:00
cvar_t r_fb_bmodels = CVARAF ( " r_fb_bmodels " , " 1 " ,
" gl_fb_bmodels " , CVAR_SEMICHEAT | CVAR_RENDERERLATCH ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_fb_models = CVARAF ( " r_fb_models " , " 1 " ,
" gl_fb_models " , CVAR_SEMICHEAT | CVAR_RENDERERLATCH ) ;
2008-05-25 22:08:29 +00:00
cvar_t r_skin_overlays = SCVARF ( " r_skin_overlays " , " 1 " ,
CVAR_SEMICHEAT | CVAR_RENDERERLATCH ) ;
2007-08-21 22:41:15 +00:00
cvar_t r_flashblend = SCVARF ( " gl_flashblend " , " 0 " ,
CVAR_ARCHIVE ) ;
cvar_t r_floorcolour = SCVARF ( " r_floorcolour " , " 255 255 255 " ,
2009-11-04 21:16:50 +00:00
CVAR_RENDERERCALLBACK | CVAR_SHADERSYSTEM ) ;
2007-08-21 22:41:15 +00:00
cvar_t r_floortexture = SCVARF ( " r_floortexture " , " " ,
2009-11-04 21:16:50 +00:00
CVAR_RENDERERCALLBACK | CVAR_SHADERSYSTEM ) ;
2007-08-21 22:41:15 +00:00
cvar_t r_fullbright = SCVARF ( " r_fullbright " , " 0 " ,
2009-11-04 21:16:50 +00:00
CVAR_CHEAT | CVAR_SHADERSYSTEM ) ;
2011-04-25 03:25:22 +00:00
cvar_t r_fullbrightSkins = SCVARF ( " r_fullbrightSkins " , " 0.8 " , /*don't default to 1, as it looks a little ugly (too bright), but don't default to 0 either because then you're handicapped in the dark*/
2009-11-04 21:16:50 +00:00
CVAR_SEMICHEAT | CVAR_SHADERSYSTEM ) ;
2007-08-21 22:41:15 +00:00
cvar_t r_lightmap_saturation = SCVAR ( " r_lightmap_saturation " , " 1 " ) ;
cvar_t r_lightstylesmooth = SCVAR ( " r_lightstylesmooth " , " 0 " ) ;
2011-04-20 23:05:45 +00:00
cvar_t r_lightstylesmooth_limit = SCVAR ( " r_lightstylesmooth_limit " , " 2 " ) ;
2007-08-21 22:41:15 +00:00
cvar_t r_lightstylespeed = SCVAR ( " r_lightstylespeed " , " 10 " ) ;
cvar_t r_loadlits = SCVAR ( " r_loadlit " , " 1 " ) ;
cvar_t r_menutint = SCVARF ( " r_menutint " , " 0.68 0.4 0.13 " ,
CVAR_RENDERERCALLBACK ) ;
cvar_t r_netgraph = SCVAR ( " r_netgraph " , " 0 " ) ;
cvar_t r_nolerp = SCVAR ( " r_nolerp " , " 0 " ) ;
cvar_t r_nolightdir = SCVAR ( " r_nolightdir " , " 0 " ) ;
cvar_t r_novis = SCVAR ( " r_novis " , " 0 " ) ;
cvar_t r_part_rain = SCVARF ( " r_part_rain " , " 0 " ,
CVAR_ARCHIVE ) ;
cvar_t r_skyboxname = SCVARF ( " r_skybox " , " " ,
2009-11-04 21:16:50 +00:00
CVAR_RENDERERCALLBACK | CVAR_SHADERSYSTEM ) ;
cvar_t r_speeds = SCVAR ( " r_speeds " , " 0 " ) ;
2007-08-21 22:41:15 +00:00
cvar_t r_stainfadeammount = SCVAR ( " r_stainfadeammount " , " 1 " ) ;
cvar_t r_stainfadetime = SCVAR ( " r_stainfadetime " , " 1 " ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_stains = CVARFC ( " r_stains " , IFMINIMAL ( " 0 " , " 0.75 " ) ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE ,
Cvar_Limiter_ZeroToOne_Callback ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_wallcolour = CVARF ( " r_wallcolour " , " 255 255 255 " ,
2009-11-04 21:16:50 +00:00
CVAR_RENDERERCALLBACK | CVAR_SHADERSYSTEM ) ; //FIXME: broken
2010-07-11 02:22:39 +00:00
cvar_t r_walltexture = CVARF ( " r_walltexture " , " " ,
2009-11-04 21:16:50 +00:00
CVAR_RENDERERCALLBACK | CVAR_SHADERSYSTEM ) ; //FIXME: broken
2010-07-11 02:22:39 +00:00
cvar_t r_wateralpha = CVARF ( " r_wateralpha " , " 1 " ,
2009-11-04 21:16:50 +00:00
CVAR_SHADERSYSTEM ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_waterwarp = CVARF ( " r_waterwarp " , " 1 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_replacemodels = CVARF ( " r_replacemodels " , IFMINIMAL ( " " , " md3 md2 " ) ,
2007-09-13 22:27:56 +00:00
CVAR_ARCHIVE ) ;
2007-08-21 22:41:15 +00:00
//otherwise it would defeat the point.
2010-07-11 02:22:39 +00:00
cvar_t scr_allowsnap = CVARF ( " scr_allowsnap " , " 1 " ,
2007-08-21 22:41:15 +00:00
CVAR_NOTFROMSERVER ) ;
Fixes, workarounds, and breakages. Hexen2 should work much better (-hexen2 says no mission pack, -portals says h2mp). Started working on splitting bigcoords per client, far too much work still to go on that. Removed gl_ztrick entirely. Enabled csprogs download by default. Added client support for fitzquake's 666 protocol, needs testing, some cleanup for dp protocols too, no server support, couldn't selectively enable it anyway. Now attempting to cache shadow meshes for explosions and stuff. Played with lightmaps a little, should potentially run a little faster on certain (intel?) cards. Tweeked npfte a little to try to avoid deadlocks and crashes. Fixed sky worldspawn parsing. Added h2mp's model format. Fixed baseline issue in q2 client, made servers generate q2 baselines. MOVETYPE_PUSH will not rotate extra if rotation is forced. Made status command show allowed client types. Changed lighting on weapons - should now be shaded.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3572 fc73d0e0-1445-4013-8a0c-d673dee63da5
2010-08-11 03:36:31 +00:00
cvar_t scr_centersbar = CVAR ( " scr_centersbar " , " 2 " ) ;
2010-07-11 02:22:39 +00:00
cvar_t scr_centertime = CVAR ( " scr_centertime " , " 2 " ) ;
cvar_t scr_chatmodecvar = CVAR ( " scr_chatmode " , " 0 " ) ;
cvar_t scr_conalpha = CVARC ( " scr_conalpha " , " 0.7 " ,
2007-08-21 22:41:15 +00:00
Cvar_Limiter_ZeroToOne_Callback ) ;
2010-07-11 02:22:39 +00:00
cvar_t scr_consize = CVAR ( " scr_consize " , " 0.5 " ) ;
cvar_t scr_conspeed = CVAR ( " scr_conspeed " , " 300 " ) ;
2007-08-21 22:41:15 +00:00
// 10 - 170
2010-07-11 02:22:39 +00:00
cvar_t scr_fov = CVARFC ( " fov " , " 90 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE ,
SCR_Fov_Callback ) ;
cvar_t scr_printspeed = SCVAR ( " scr_printspeed " , " 8 " ) ;
cvar_t scr_showpause = SCVAR ( " showpause " , " 1 " ) ;
cvar_t scr_showturtle = SCVAR ( " showturtle " , " 0 " ) ;
2009-07-18 20:26:24 +00:00
cvar_t scr_turtlefps = SCVAR ( " scr_turtlefps " , " 10 " ) ;
2007-08-21 22:41:15 +00:00
cvar_t scr_sshot_compression = SCVAR ( " scr_sshot_compression " , " 75 " ) ;
cvar_t scr_sshot_type = SCVAR ( " scr_sshot_type " , " jpg " ) ;
2010-07-11 02:22:39 +00:00
cvar_t scr_viewsize = CVARFC ( " viewsize " , " 100 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE ,
SCR_Viewsize_Callback ) ;
2010-07-11 02:22:39 +00:00
cvar_t vid_conautoscale = CVARF ( " vid_conautoscale " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERCALLBACK ) ;
2010-07-11 02:22:39 +00:00
cvar_t vid_conheight = CVARF ( " vid_conheight " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE ) ;
2010-07-11 02:22:39 +00:00
cvar_t vid_conwidth = CVARF ( " vid_conwidth " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERCALLBACK ) ;
//see R_RestartRenderer_f for the effective default 'if (newr.renderer == -1)'.
2010-07-11 02:22:39 +00:00
cvar_t vid_renderer = CVARF ( " vid_renderer " , " " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2010-07-11 02:22:39 +00:00
static cvar_t vid_allow_modex = CVARF ( " vid_allow_modex " , " 1 " ,
2009-11-04 21:16:50 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ; //FIXME: remove
2010-07-11 02:22:39 +00:00
static cvar_t vid_bpp = CVARF ( " vid_bpp " , " 32 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2010-07-11 02:22:39 +00:00
static cvar_t vid_desktopsettings = CVARF ( " vid_desktopsettings " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2009-04-01 22:03:56 +00:00
# ifdef NPQTV
2010-07-11 02:22:39 +00:00
static cvar_t vid_fullscreen_npqtv = CVARF ( " vid_fullscreen " , " 1 " ,
2009-04-01 22:03:56 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2010-07-11 02:22:39 +00:00
cvar_t vid_fullscreen = CVARF ( " vid_fullscreen_embedded " , " 0 " ,
2009-04-01 22:03:56 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
# else
2010-07-11 02:22:39 +00:00
static cvar_t vid_fullscreen = CVARF ( " vid_fullscreen " , " 1 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2009-04-01 22:03:56 +00:00
# endif
2010-07-11 02:22:39 +00:00
cvar_t vid_height = CVARF ( " vid_height " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2010-07-11 02:22:39 +00:00
cvar_t vid_multisample = CVARF ( " vid_multisample " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2010-07-11 02:22:39 +00:00
static cvar_t vid_refreshrate = CVARF ( " vid_displayfrequency " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2010-07-11 02:22:39 +00:00
cvar_t vid_wndalpha = CVAR ( " vid_wndalpha " , " 1 " ) ;
2007-08-21 22:41:15 +00:00
//more readable defaults to match conwidth/conheight.
2010-07-11 02:22:39 +00:00
cvar_t vid_width = CVARF ( " vid_width " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2005-05-18 01:40:01 +00:00
2007-08-21 22:41:15 +00:00
extern cvar_t r_dodgytgafiles ;
extern cvar_t r_dodgypcxfiles ;
extern cvar_t r_drawentities ;
extern cvar_t r_drawviewmodel ;
extern cvar_t r_drawworld ;
extern cvar_t r_fullbright ;
2011-03-31 02:32:32 +00:00
cvar_t r_mirroralpha = SCVARF ( " r_mirroralpha " , " 1 " , CVAR_CHEAT | CVAR_SHADERSYSTEM ) ;
2007-08-21 22:41:15 +00:00
extern cvar_t r_netgraph ;
extern cvar_t r_norefresh ;
extern cvar_t r_novis ;
extern cvar_t r_speeds ;
extern cvar_t r_waterwarp ;
2011-04-25 13:48:30 +00:00
cvar_t r_polygonoffset_submodel_factor = SCVAR ( " r_polygonoffset_submodel_factor " , " 0.05 " ) ;
cvar_t r_polygonoffset_submodel_offset = SCVAR ( " r_polygonoffset_submodel_offset " , " 25 " ) ;
2009-07-19 20:43:07 +00:00
2004-08-23 00:15:46 +00:00
rendererstate_t currentrendererstate ;
2009-11-04 21:16:50 +00:00
# if defined(GLQUAKE)
cvar_t vid_gl_context_version = SCVAR ( " vid_gl_context_version " , " " ) ;
Fixes, workarounds, and breakages. Hexen2 should work much better (-hexen2 says no mission pack, -portals says h2mp). Started working on splitting bigcoords per client, far too much work still to go on that. Removed gl_ztrick entirely. Enabled csprogs download by default. Added client support for fitzquake's 666 protocol, needs testing, some cleanup for dp protocols too, no server support, couldn't selectively enable it anyway. Now attempting to cache shadow meshes for explosions and stuff. Played with lightmaps a little, should potentially run a little faster on certain (intel?) cards. Tweeked npfte a little to try to avoid deadlocks and crashes. Fixed sky worldspawn parsing. Added h2mp's model format. Fixed baseline issue in q2 client, made servers generate q2 baselines. MOVETYPE_PUSH will not rotate extra if rotation is forced. Made status command show allowed client types. Changed lighting on weapons - should now be shaded.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3572 fc73d0e0-1445-4013-8a0c-d673dee63da5
2010-08-11 03:36:31 +00:00
cvar_t vid_gl_context_forwardcompatible = SCVAR ( " vid_gl_context_forwardcompatible " , " 0 " ) ;
cvar_t vid_gl_context_compatibility = SCVAR ( " vid_gl_context_compatibility " , " 1 " ) ;
2009-11-04 21:16:50 +00:00
cvar_t vid_gl_context_debug = SCVAR ( " vid_gl_context_debug " , " 0 " ) ; //for my ati drivers, debug 1 only works if version >= 3
2011-01-04 02:56:16 +00:00
cvar_t vid_gl_context_es2 = SCVAR ( " vid_gl_context_es2 " , " 0 " ) ; //requires version set correctly, no debug, no compat
2009-11-04 21:16:50 +00:00
# endif
# if defined(GLQUAKE) || defined(D3DQUAKE)
2011-04-30 17:21:10 +00:00
cvar_t gl_ati_truform = CVAR ( " gl_ati_truform " , " 0 " ) ;
cvar_t gl_ati_truform_type = CVAR ( " gl_ati_truform_type " , " 1 " ) ;
cvar_t gl_ati_truform_tesselation = CVAR ( " gl_ati_truform_tesselation " , " 3 " ) ;
cvar_t gl_blend2d = CVAR ( " gl_blend2d " , " 1 " ) ;
cvar_t gl_blendsprites = CVAR ( " gl_blendsprites " , " 1 " ) ;
cvar_t gl_bump = CVARF ( " gl_bump " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
2011-05-15 13:23:13 +00:00
cvar_t r_deluxemapping = CVARAF ( " r_deluxemapping " , " 0 " , " r_glsl_deluxemapping " ,
2011-04-30 17:21:10 +00:00
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
cvar_t gl_compress = CVARF ( " gl_compress " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE ) ;
2010-07-11 02:22:39 +00:00
cvar_t gl_conback = CVARFC ( " gl_conback " , " " ,
CVAR_RENDERERCALLBACK , R2D_Conback_Callback ) ;
2011-04-30 17:21:10 +00:00
cvar_t gl_contrast = CVAR ( " gl_contrast " , " 1 " ) ;
cvar_t gl_detail = CVARF ( " gl_detail " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE ) ;
2011-04-30 17:21:10 +00:00
cvar_t gl_detailscale = CVAR ( " gl_detailscale " , " 5 " ) ;
cvar_t gl_font = CVARF ( " gl_font " , " " ,
2007-08-21 22:41:15 +00:00
CVAR_RENDERERCALLBACK ) ;
2011-04-30 17:21:10 +00:00
cvar_t gl_lateswap = CVAR ( " gl_lateswap " , " 0 " ) ;
cvar_t gl_lerpimages = CVAR ( " gl_lerpimages " , " 1 " ) ;
2007-08-21 22:41:15 +00:00
//cvar_t gl_lightmapmode = SCVARF("gl_lightmapmode", "",
// CVAR_ARCHIVE);
cvar_t gl_load24bit = SCVARF ( " gl_load24bit " , " 1 " ,
CVAR_ARCHIVE ) ;
2010-11-11 18:22:49 +00:00
cvar_t r_clear = CVARAF ( " r_clear " , " 0 " ,
" gl_clear " , 0 ) ;
2009-12-30 04:29:14 +00:00
cvar_t gl_max_size = SCVARF ( " gl_max_size " , " 1024 " , CVAR_RENDERERLATCH ) ;
2007-08-21 22:41:15 +00:00
cvar_t gl_maxshadowlights = SCVARF ( " gl_maxshadowlights " , " 2 " ,
CVAR_ARCHIVE ) ;
cvar_t gl_menutint_shader = SCVAR ( " gl_menutint_shader " , " 1 " ) ;
//by setting to 64 or something, you can use this as a wallhack
cvar_t gl_mindist = SCVARF ( " gl_mindist " , " 4 " ,
CVAR_CHEAT ) ;
cvar_t gl_motionblur = SCVARF ( " gl_motionblur " , " 0 " ,
CVAR_ARCHIVE ) ;
cvar_t gl_motionblurscale = SCVAR ( " gl_motionblurscale " , " 1 " ) ;
2011-05-27 17:59:31 +00:00
cvar_t gl_overbright = CVARFC ( " gl_overbright " , " 1 " ,
CVAR_ARCHIVE ,
Surf_RebuildLightmap_Callback ) ;
2007-08-21 22:41:15 +00:00
cvar_t gl_overbright_all = SCVARF ( " gl_overbright_all " , " 0 " ,
CVAR_ARCHIVE ) ;
cvar_t gl_picmip = SCVAR ( " gl_picmip " , " 0 " ) ;
cvar_t gl_picmip2d = SCVAR ( " gl_picmip2d " , " 0 " ) ;
2008-07-16 00:19:33 +00:00
cvar_t gl_nohwblend = SCVAR ( " gl_nohwblend " , " 1 " ) ;
2007-08-21 22:41:15 +00:00
cvar_t gl_savecompressedtex = SCVAR ( " gl_savecompressedtex " , " 0 " ) ;
cvar_t gl_schematics = SCVAR ( " gl_schematics " , " 0 " ) ;
2009-07-14 23:42:54 +00:00
cvar_t gl_skyboxdist = SCVAR ( " gl_skyboxdist " , " 0 " ) ; //0 = guess.
2007-08-21 22:41:15 +00:00
cvar_t gl_smoothcrosshair = SCVAR ( " gl_smoothcrosshair " , " 1 " ) ;
2010-11-02 23:17:25 +00:00
cvar_t gl_maxdist = SCVAR ( " gl_maxdist " , " 8192 " ) ;
2007-08-21 22:41:15 +00:00
# ifdef SPECULAR
cvar_t gl_specular = SCVAR ( " gl_specular " , " 0 " ) ;
# endif
2007-08-22 22:41:41 +00:00
// The callbacks are not in D3D yet (also ugly way of seperating this)
2009-11-04 21:16:50 +00:00
# ifdef GLQUAKE
2010-07-11 02:22:39 +00:00
cvar_t gl_texture_anisotropic_filtering = CVARFC ( " gl_texture_anisotropic_filtering " , " 0 " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERCALLBACK ,
GL_Texture_Anisotropic_Filtering_Callback ) ;
2010-07-11 02:22:39 +00:00
cvar_t gl_texturemode = CVARFC ( " gl_texturemode " , " GL_LINEAR_MIPMAP_NEAREST " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERCALLBACK ,
GL_Texturemode_Callback ) ;
2010-07-11 02:22:39 +00:00
cvar_t gl_texturemode2d = CVARFC ( " gl_texturemode2d " , " GL_LINEAR " ,
2007-08-21 22:41:15 +00:00
CVAR_ARCHIVE | CVAR_RENDERERCALLBACK ,
GL_Texturemode2d_Callback ) ;
2007-08-22 22:41:41 +00:00
# endif
2004-09-13 03:10:50 +00:00
2007-08-21 22:41:15 +00:00
cvar_t gl_triplebuffer = SCVARF ( " gl_triplebuffer " , " 1 " ,
CVAR_ARCHIVE ) ;
2010-07-11 02:22:39 +00:00
cvar_t r_noportals = SCVAR ( " r_noportals " , " 0 " ) ;
2007-08-21 22:41:15 +00:00
cvar_t r_noaliasshadows = SCVARF ( " r_noaliasshadows " , " 0 " ,
CVAR_ARCHIVE ) ;
2011-04-30 17:21:10 +00:00
cvar_t r_shadows = SCVARF ( " r_shadows " , " 0 " ,
CVAR_ARCHIVE ) ;
2009-11-04 21:16:50 +00:00
2007-08-21 22:41:15 +00:00
cvar_t r_shadow_bumpscale_basetexture = SCVAR ( " r_shadow_bumpscale_basetexture " , " 4 " ) ;
cvar_t r_shadow_bumpscale_bumpmap = SCVAR ( " r_shadow_bumpscale_bumpmap " , " 10 " ) ;
2009-11-04 21:16:50 +00:00
2010-08-28 17:14:38 +00:00
cvar_t r_glsl_offsetmapping = SCVAR ( " r_glsl_offsetmapping " , " 0 " ) ;
cvar_t r_glsl_offsetmapping_scale = SCVAR ( " r_glsl_offsetmapping_scale " , " 0.04 " ) ;
2009-11-04 21:16:50 +00:00
cvar_t r_shadow_realtime_world = SCVARF ( " r_shadow_realtime_world " , " 0 " , CVAR_ARCHIVE ) ;
cvar_t r_shadow_realtime_world_shadows = SCVARF ( " r_shadow_realtime_world_shadows " , " 1 " , CVAR_ARCHIVE ) ;
cvar_t r_shadow_realtime_dlight = SCVARF ( " r_shadow_realtime_dlight " , " 1 " , CVAR_ARCHIVE ) ;
cvar_t r_shadow_realtime_dlight_shadows = SCVARF ( " r_shadow_realtime_dlight_shadows " , " 1 " , CVAR_ARCHIVE ) ;
cvar_t r_shadow_realtime_world_lightmaps = SCVARF ( " r_shadow_realtime_world_lightmaps " , " 0.8 " , 0 ) ;
2009-07-11 20:56:09 +00:00
cvar_t r_vertexdlights = SCVAR ( " r_vertexdlights " , " 0 " ) ;
2007-08-21 22:41:15 +00:00
2009-04-19 00:50:42 +00:00
cvar_t vid_preservegamma = SCVAR ( " vid_preservegamma " , " 0 " ) ;
2007-08-21 22:41:15 +00:00
cvar_t vid_hardwaregamma = SCVARF ( " vid_hardwaregamma " , " 1 " ,
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
cvar_t vid_desktopgamma = SCVARF ( " vid_desktopgamma " , " 0 " ,
CVAR_ARCHIVE | CVAR_RENDERERLATCH ) ;
extern cvar_t gl_dither ;
2011-02-25 04:22:14 +00:00
cvar_t gl_screenangle = SCVAR ( " gl_screenangle " , " 0 " ) ;
2007-08-21 22:41:15 +00:00
# endif
2005-10-06 02:32:24 +00:00
2009-11-04 21:16:50 +00:00
# if defined(GLQUAKE) || defined(D3DQUAKE)
2007-05-25 22:16:29 +00:00
void GLD3DRenderer_Init ( void )
{
2007-12-15 17:16:01 +00:00
Cvar_Register ( & gl_mindist , GLRENDEREROPTIONS ) ;
2007-05-25 22:16:29 +00:00
Cvar_Register ( & gl_load24bit , GRAPHICALNICETIES ) ;
}
# endif
2009-11-04 21:16:50 +00:00
# if defined(GLQUAKE)
2004-08-23 00:15:46 +00:00
void GLRenderer_Init ( void )
{
extern cvar_t gl_contrast ;
2009-11-04 21:16:50 +00:00
//gl-specific video vars
Cvar_Register ( & vid_gl_context_version , GLRENDEREROPTIONS ) ;
Cvar_Register ( & vid_gl_context_debug , GLRENDEREROPTIONS ) ;
Cvar_Register ( & vid_gl_context_forwardcompatible , GLRENDEREROPTIONS ) ;
Fixes, workarounds, and breakages. Hexen2 should work much better (-hexen2 says no mission pack, -portals says h2mp). Started working on splitting bigcoords per client, far too much work still to go on that. Removed gl_ztrick entirely. Enabled csprogs download by default. Added client support for fitzquake's 666 protocol, needs testing, some cleanup for dp protocols too, no server support, couldn't selectively enable it anyway. Now attempting to cache shadow meshes for explosions and stuff. Played with lightmaps a little, should potentially run a little faster on certain (intel?) cards. Tweeked npfte a little to try to avoid deadlocks and crashes. Fixed sky worldspawn parsing. Added h2mp's model format. Fixed baseline issue in q2 client, made servers generate q2 baselines. MOVETYPE_PUSH will not rotate extra if rotation is forced. Made status command show allowed client types. Changed lighting on weapons - should now be shaded.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3572 fc73d0e0-1445-4013-8a0c-d673dee63da5
2010-08-11 03:36:31 +00:00
Cvar_Register ( & vid_gl_context_compatibility , GLRENDEREROPTIONS ) ;
2011-01-04 02:56:16 +00:00
Cvar_Register ( & vid_gl_context_es2 , GLRENDEREROPTIONS ) ;
2009-11-04 21:16:50 +00:00
2004-08-23 00:15:46 +00:00
//screen
Cvar_Register ( & gl_triplebuffer , GLRENDEREROPTIONS ) ;
2008-01-09 00:37:17 +00:00
Cvar_Register ( & vid_preservegamma , GLRENDEREROPTIONS ) ;
2004-09-20 23:25:38 +00:00
Cvar_Register ( & vid_hardwaregamma , GLRENDEREROPTIONS ) ;
2005-10-18 04:42:13 +00:00
Cvar_Register ( & vid_desktopgamma , GLRENDEREROPTIONS ) ;
2004-09-20 23:25:38 +00:00
2004-08-23 00:15:46 +00:00
//renderer
Cvar_Register ( & r_norefresh , GLRENDEREROPTIONS ) ;
Cvar_Register ( & gl_affinemodels , GLRENDEREROPTIONS ) ;
2008-07-16 00:19:33 +00:00
Cvar_Register ( & gl_nohwblend , GLRENDEREROPTIONS ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & r_flashblend , GLRENDEREROPTIONS ) ;
Cvar_Register ( & gl_playermip , GLRENDEREROPTIONS ) ;
Cvar_Register ( & gl_nocolors , GLRENDEREROPTIONS ) ;
Cvar_Register ( & gl_finish , GLRENDEREROPTIONS ) ;
2004-11-18 17:55:04 +00:00
Cvar_Register ( & gl_lateswap , GLRENDEREROPTIONS ) ;
2005-01-28 04:24:40 +00:00
Cvar_Register ( & gl_lerpimages , GLRENDEREROPTIONS ) ;
2004-08-23 00:15:46 +00:00
2010-07-11 02:22:39 +00:00
Cvar_Register ( & r_noportals , GLRENDEREROPTIONS ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & r_noaliasshadows , GLRENDEREROPTIONS ) ;
Cvar_Register ( & gl_maxshadowlights , GLRENDEREROPTIONS ) ;
2005-08-03 23:14:59 +00:00
Cvar_Register ( & r_shadow_bumpscale_basetexture , GLRENDEREROPTIONS ) ;
Cvar_Register ( & r_shadow_bumpscale_bumpmap , GLRENDEREROPTIONS ) ;
2005-08-06 00:36:08 +00:00
Cvar_Register ( & r_shadow_realtime_world , GLRENDEREROPTIONS ) ;
2009-11-04 21:16:50 +00:00
Cvar_Register ( & r_shadow_realtime_world_shadows , GLRENDEREROPTIONS ) ;
Cvar_Register ( & r_shadow_realtime_dlight , GLRENDEREROPTIONS ) ;
Cvar_Register ( & r_shadow_realtime_dlight_shadows , GLRENDEREROPTIONS ) ;
2005-08-06 00:36:08 +00:00
Cvar_Register ( & r_shadow_realtime_world_lightmaps , GLRENDEREROPTIONS ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & gl_reporttjunctions , GLRENDEREROPTIONS ) ;
2005-05-27 08:24:31 +00:00
Cvar_Register ( & gl_motionblur , GLRENDEREROPTIONS ) ;
2005-06-04 04:20:20 +00:00
Cvar_Register ( & gl_motionblurscale , GLRENDEREROPTIONS ) ;
2006-03-15 20:48:48 +00:00
Cvar_Register ( & vid_multisample , GLRENDEREROPTIONS ) ;
2004-08-23 00:15:46 +00:00
2006-04-15 07:10:49 +00:00
Cvar_Register ( & gl_smoothcrosshair , GRAPHICALNICETIES ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & gl_bump , GRAPHICALNICETIES ) ;
2011-04-30 17:21:10 +00:00
Cvar_Register ( & r_deluxemapping , GRAPHICALNICETIES ) ;
2010-08-28 17:14:38 +00:00
Cvar_Register ( & r_glsl_offsetmapping , GRAPHICALNICETIES ) ;
Cvar_Register ( & r_glsl_offsetmapping_scale , GRAPHICALNICETIES ) ;
2005-08-03 23:14:59 +00:00
2004-08-23 00:15:46 +00:00
Cvar_Register ( & gl_contrast , GLRENDEREROPTIONS ) ;
# ifdef R_XFLIP
Cvar_Register ( & r_xflip , GLRENDEREROPTIONS ) ;
# endif
2004-09-13 03:10:50 +00:00
Cvar_Register ( & gl_specular , GRAPHICALNICETIES ) ;
2004-08-23 00:15:46 +00:00
2006-02-26 05:49:15 +00:00
// Cvar_Register (&gl_lightmapmode, GLRENDEREROPTIONS);
2004-08-23 00:15:46 +00:00
Cvar_Register ( & gl_picmip , GLRENDEREROPTIONS ) ;
2004-11-13 17:29:47 +00:00
Cvar_Register ( & gl_picmip2d , GLRENDEREROPTIONS ) ;
2004-08-23 00:15:46 +00:00
2005-11-30 01:20:53 +00:00
Cvar_Register ( & gl_texturemode , GLRENDEREROPTIONS ) ;
2007-06-10 05:14:38 +00:00
Cvar_Register ( & gl_texturemode2d , GLRENDEREROPTIONS ) ;
2006-06-04 02:25:10 +00:00
Cvar_Register ( & gl_texture_anisotropic_filtering , GLRENDEREROPTIONS ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & gl_savecompressedtex , GLRENDEREROPTIONS ) ;
Cvar_Register ( & gl_compress , GLRENDEREROPTIONS ) ;
Cvar_Register ( & gl_driver , GLRENDEREROPTIONS ) ;
Cvar_Register ( & gl_detail , GRAPHICALNICETIES ) ;
2005-07-14 01:57:34 +00:00
Cvar_Register ( & gl_detailscale , GRAPHICALNICETIES ) ;
2005-05-13 10:42:48 +00:00
Cvar_Register ( & gl_overbright , GRAPHICALNICETIES ) ;
2006-04-16 06:03:58 +00:00
Cvar_Register ( & gl_overbright_all , GRAPHICALNICETIES ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & gl_dither , GRAPHICALNICETIES ) ;
Cvar_Register ( & gl_ati_truform , GRAPHICALNICETIES ) ;
Cvar_Register ( & gl_ati_truform_type , GRAPHICALNICETIES ) ;
Cvar_Register ( & gl_ati_truform_tesselation , GRAPHICALNICETIES ) ;
2004-10-10 06:32:29 +00:00
2011-02-25 04:22:14 +00:00
Cvar_Register ( & gl_screenangle , GLRENDEREROPTIONS ) ;
2004-10-10 06:32:29 +00:00
Cvar_Register ( & gl_skyboxdist , GLRENDEREROPTIONS ) ;
2004-10-26 15:31:39 +00:00
2004-12-11 03:41:12 +00:00
Cvar_Register ( & r_wallcolour , GLRENDEREROPTIONS ) ;
Cvar_Register ( & r_floorcolour , GLRENDEREROPTIONS ) ;
2006-05-08 04:30:04 +00:00
Cvar_Register ( & r_walltexture , GLRENDEREROPTIONS ) ;
Cvar_Register ( & r_floortexture , GLRENDEREROPTIONS ) ;
2004-12-11 03:41:12 +00:00
Cvar_Register ( & r_vertexdlights , GLRENDEREROPTIONS ) ;
2004-12-15 19:40:06 +00:00
Cvar_Register ( & gl_schematics , GLRENDEREROPTIONS ) ;
2009-11-04 21:16:50 +00:00
2004-10-26 15:31:39 +00:00
Cvar_Register ( & r_vertexlight , GLRENDEREROPTIONS ) ;
2005-01-13 16:29:20 +00:00
Cvar_Register ( & gl_shadeq1_name , GLRENDEREROPTIONS ) ;
2005-08-06 07:18:29 +00:00
Cvar_Register ( & gl_blend2d , GLRENDEREROPTIONS ) ;
2009-11-04 21:16:50 +00:00
2005-09-28 23:38:51 +00:00
Cvar_Register ( & gl_blendsprites , GLRENDEREROPTIONS ) ;
2006-03-14 09:20:07 +00:00
Cvar_Register ( & gl_menutint_shader , GLRENDEREROPTIONS ) ;
2006-03-03 03:31:19 +00:00
R_BloomRegister ( ) ;
2004-08-23 00:15:46 +00:00
}
2009-11-04 21:16:50 +00:00
# endif
2004-08-23 00:15:46 +00:00
void R_InitTextures ( void )
{
int x , y , m ;
qbyte * dest ;
2005-06-15 04:44:39 +00:00
2004-08-23 00:15:46 +00:00
// create a simple checkerboard texture for the default
2008-05-25 22:08:29 +00:00
r_notexture_mip = Z_Malloc ( sizeof ( texture_t ) + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2 ) ;
2005-06-15 04:44:39 +00:00
2004-08-23 00:15:46 +00:00
r_notexture_mip - > pixbytes = 1 ;
r_notexture_mip - > width = r_notexture_mip - > height = 16 ;
r_notexture_mip - > offsets [ 0 ] = sizeof ( texture_t ) ;
r_notexture_mip - > offsets [ 1 ] = r_notexture_mip - > offsets [ 0 ] + 16 * 16 ;
r_notexture_mip - > offsets [ 2 ] = r_notexture_mip - > offsets [ 1 ] + 8 * 8 ;
r_notexture_mip - > offsets [ 3 ] = r_notexture_mip - > offsets [ 2 ] + 4 * 4 ;
2005-06-15 04:44:39 +00:00
2004-08-23 00:15:46 +00:00
for ( m = 0 ; m < 4 ; m + + )
{
dest = ( qbyte * ) r_notexture_mip + r_notexture_mip - > offsets [ m ] ;
for ( y = 0 ; y < ( 16 > > m ) ; y + + )
for ( x = 0 ; x < ( 16 > > m ) ; x + + )
{
if ( ( y < ( 8 > > m ) ) ^ ( x < ( 8 > > m ) ) )
* dest + + = 0 ;
else
* dest + + = 0xff ;
}
2005-06-15 04:44:39 +00:00
}
2004-08-23 00:15:46 +00:00
}
void R_SetRenderer_f ( void ) ;
void Renderer_Init ( void )
{
2010-11-11 23:54:36 +00:00
# ifdef AVAIL_JPEGLIB
LibJPEG_Init ( ) ;
# endif
# ifdef AVAIL_PNGLIB
LibPNG_Init ( ) ;
# endif
2010-11-11 04:03:16 +00:00
2010-02-06 01:25:04 +00:00
currentrendererstate . renderer = NULL ;
qrenderer = QR_NONE ;
2004-08-23 00:15:46 +00:00
Cmd_AddCommand ( " setrenderer " , R_SetRenderer_f ) ;
Cmd_AddCommand ( " vid_restart " , R_RestartRenderer_f ) ;
2009-11-04 21:16:50 +00:00
# if defined(GLQUAKE) || defined(D3DQUAKE)
2007-05-25 22:16:29 +00:00
GLD3DRenderer_Init ( ) ;
# endif
2009-11-04 21:16:50 +00:00
# if defined(GLQUAKE)
2004-08-23 00:15:46 +00:00
GLRenderer_Init ( ) ;
# endif
2009-11-04 21:16:50 +00:00
Cvar_Register ( & gl_conback , GRAPHICALNICETIES ) ;
2007-05-25 22:16:29 +00:00
Cvar_Register ( & r_novis , GLRENDEREROPTIONS ) ;
2004-08-23 00:15:46 +00:00
//but register ALL vid_ commands.
Cvar_Register ( & _vid_wait_override , VIDCOMMANDGROUP ) ;
Cvar_Register ( & _windowed_mouse , VIDCOMMANDGROUP ) ;
Cvar_Register ( & vid_renderer , VIDCOMMANDGROUP ) ;
2009-04-06 00:34:32 +00:00
Cvar_Register ( & vid_wndalpha , VIDCOMMANDGROUP ) ;
2004-08-23 00:15:46 +00:00
2009-04-01 22:03:56 +00:00
# ifdef NPQTV
Cvar_Register ( & vid_fullscreen_npqtv , VIDCOMMANDGROUP ) ;
# endif
2004-08-23 00:15:46 +00:00
Cvar_Register ( & vid_fullscreen , VIDCOMMANDGROUP ) ;
Cvar_Register ( & vid_bpp , VIDCOMMANDGROUP ) ;
2006-04-02 07:14:25 +00:00
Cvar_Register ( & vid_conwidth , VIDCOMMANDGROUP ) ;
Cvar_Register ( & vid_conheight , VIDCOMMANDGROUP ) ;
Cvar_Register ( & vid_conautoscale , VIDCOMMANDGROUP ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & vid_allow_modex , VIDCOMMANDGROUP ) ;
Cvar_Register ( & vid_width , VIDCOMMANDGROUP ) ;
Cvar_Register ( & vid_height , VIDCOMMANDGROUP ) ;
Cvar_Register ( & vid_refreshrate , VIDCOMMANDGROUP ) ;
2006-04-15 03:31:23 +00:00
Cvar_Register ( & vid_desktopsettings , VIDCOMMANDGROUP ) ;
2011-03-31 02:32:32 +00:00
Cvar_Register ( & r_mirroralpha , GLRENDEREROPTIONS ) ;
2006-04-15 05:28:44 +00:00
Cvar_Register ( & r_skyboxname , GRAPHICALNICETIES ) ;
2010-08-14 03:17:33 +00:00
Cbuf_AddText ( " alias sky r_skybox \n " , RESTRICT_LOCAL ) ; /*alternative name for users*/
2004-08-23 00:15:46 +00:00
Cvar_Register ( & r_dodgytgafiles , " Bug fixes " ) ;
2006-01-01 21:17:06 +00:00
Cvar_Register ( & r_dodgypcxfiles , " Bug fixes " ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & r_loadlits , GRAPHICALNICETIES ) ;
2005-06-22 17:10:13 +00:00
Cvar_Register ( & r_lightstylesmooth , GRAPHICALNICETIES ) ;
2011-04-20 23:05:45 +00:00
Cvar_Register ( & r_lightstylesmooth_limit , GRAPHICALNICETIES ) ;
2005-06-22 17:10:13 +00:00
Cvar_Register ( & r_lightstylespeed , GRAPHICALNICETIES ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & r_stains , GRAPHICALNICETIES ) ;
Cvar_Register ( & r_stainfadetime , GRAPHICALNICETIES ) ;
Cvar_Register ( & r_stainfadeammount , GRAPHICALNICETIES ) ;
Cvar_Register ( & scr_viewsize , SCREENOPTIONS ) ;
Cvar_Register ( & scr_fov , SCREENOPTIONS ) ;
Cvar_Register ( & scr_chatmodecvar , SCREENOPTIONS ) ;
Cvar_Register ( & scr_sshot_type , SCREENOPTIONS ) ;
2006-06-17 04:18:52 +00:00
Cvar_Register ( & scr_sshot_compression , SCREENOPTIONS ) ;
2004-08-23 00:15:46 +00:00
2006-01-14 23:47:09 +00:00
Cvar_Register ( & cl_cursor , SCREENOPTIONS ) ;
Cvar_Register ( & cl_cursorsize , SCREENOPTIONS ) ;
Cvar_Register ( & cl_cursorbias , SCREENOPTIONS ) ;
2004-08-23 00:15:46 +00:00
//screen
2010-05-01 22:47:47 +00:00
Cvar_Register ( & gl_font , GRAPHICALNICETIES ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & scr_conspeed , SCREENOPTIONS ) ;
2006-02-25 21:03:56 +00:00
Cvar_Register ( & scr_conalpha , SCREENOPTIONS ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & scr_showturtle , SCREENOPTIONS ) ;
2009-07-18 20:26:24 +00:00
Cvar_Register ( & scr_turtlefps , SCREENOPTIONS ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & scr_showpause , SCREENOPTIONS ) ;
Cvar_Register ( & scr_centertime , SCREENOPTIONS ) ;
Cvar_Register ( & scr_printspeed , SCREENOPTIONS ) ;
Cvar_Register ( & scr_allowsnap , SCREENOPTIONS ) ;
2005-06-14 04:52:10 +00:00
Cvar_Register ( & scr_consize , SCREENOPTIONS ) ;
2005-12-06 02:23:46 +00:00
Cvar_Register ( & scr_centersbar , SCREENOPTIONS ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & r_bloodstains , GRAPHICALNICETIES ) ;
Cvar_Register ( & r_fullbrightSkins , GRAPHICALNICETIES ) ;
2005-09-08 02:02:31 +00:00
Cvar_Register ( & mod_md3flags , GRAPHICALNICETIES ) ;
2004-08-23 00:15:46 +00:00
//renderer
Cvar_Register ( & r_fullbright , SCREENOPTIONS ) ;
Cvar_Register ( & r_drawentities , GRAPHICALNICETIES ) ;
Cvar_Register ( & r_drawviewmodel , GRAPHICALNICETIES ) ;
2006-01-09 01:49:06 +00:00
Cvar_Register ( & r_drawviewmodelinvis , GRAPHICALNICETIES ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & r_waterwarp , GRAPHICALNICETIES ) ;
Cvar_Register ( & r_speeds , SCREENOPTIONS ) ;
Cvar_Register ( & r_netgraph , SCREENOPTIONS ) ;
Cvar_Register ( & r_dynamic , GRAPHICALNICETIES ) ;
2005-05-18 01:40:01 +00:00
Cvar_Register ( & r_lightmap_saturation , GRAPHICALNICETIES ) ;
2004-08-23 00:15:46 +00:00
Cvar_Register ( & r_nolerp , GRAPHICALNICETIES ) ;
Cvar_Register ( & r_nolightdir , GRAPHICALNICETIES ) ;
2010-07-11 02:22:39 +00:00
Cvar_Register ( & r_fastturb , GRAPHICALNICETIES ) ;
2004-10-10 06:32:29 +00:00
Cvar_Register ( & r_fastsky , GRAPHICALNICETIES ) ;
Cvar_Register ( & r_fastskycolour , GRAPHICALNICETIES ) ;
2006-05-14 21:43:35 +00:00
Cvar_Register ( & r_wateralpha , GRAPHICALNICETIES ) ;
2004-10-10 06:32:29 +00:00
2010-11-11 18:22:49 +00:00
Cvar_Register ( & r_clear , GLRENDEREROPTIONS ) ;
2010-11-02 23:17:25 +00:00
Cvar_Register ( & gl_max_size , GLRENDEREROPTIONS ) ;
Cvar_Register ( & gl_maxdist , GLRENDEREROPTIONS ) ;
2009-11-04 21:16:50 +00:00
Cvar_Register ( & gl_miptexLevel , GRAPHICALNICETIES ) ;
2004-12-11 03:41:12 +00:00
Cvar_Register ( & r_drawflat , GRAPHICALNICETIES ) ;
2005-09-29 23:20:29 +00:00
Cvar_Register ( & r_menutint , GRAPHICALNICETIES ) ;
2004-12-11 03:41:12 +00:00
2010-11-10 03:32:47 +00:00
Cvar_Register ( & r_fb_bmodels , GRAPHICALNICETIES ) ;
2006-05-11 02:30:13 +00:00
Cvar_Register ( & r_fb_models , GRAPHICALNICETIES ) ;
2010-03-14 14:35:56 +00:00
Cvar_Register ( & r_skin_overlays , GRAPHICALNICETIES ) ;
2011-04-30 17:21:10 +00:00
Cvar_Register ( & r_shadows , GRAPHICALNICETIES ) ;
2006-05-11 02:30:13 +00:00
2007-09-13 22:27:56 +00:00
Cvar_Register ( & r_replacemodels , GRAPHICALNICETIES ) ;
2011-04-25 13:48:30 +00:00
Cvar_Register ( & r_polygonoffset_submodel_factor , GLRENDEREROPTIONS ) ;
Cvar_Register ( & r_polygonoffset_submodel_offset , GLRENDEREROPTIONS ) ;
2006-01-14 23:47:09 +00:00
2005-06-26 12:31:56 +00:00
// misc
Cvar_Register ( & con_ocranaleds , " Console controls " ) ;
2008-11-09 22:29:28 +00:00
P_InitParticleSystem ( ) ;
2004-08-23 00:15:46 +00:00
R_InitTextures ( ) ;
RQ_Init ( ) ;
}
2010-02-06 01:25:04 +00:00
qboolean Renderer_Started ( void )
{
return ! ! currentrendererstate . renderer ;
}
void Renderer_Start ( void )
{
Cvar_ApplyLatches ( CVAR_RENDERERLATCH ) ;
//renderer = none && currentrendererstate.bpp == -1 means we've never applied any mode at all
//if we currently have none, we do actually need to apply it still
if ( qrenderer = = QR_NONE & & * vid_renderer . string )
{
Cmd_ExecuteString ( " vid_restart \n " , RESTRICT_LOCAL ) ;
}
if ( ! currentrendererstate . renderer )
{ //we still failed. Try again, but use the default renderer.
Cvar_Set ( & vid_renderer , " " ) ;
Cmd_ExecuteString ( " vid_restart \n " , RESTRICT_LOCAL ) ;
}
if ( ! currentrendererstate . renderer )
Sys_Error ( " No renderer was set! \n " ) ;
if ( qrenderer = = QR_NONE )
Con_Printf ( " Use the setrenderer command to use a gui \n " ) ;
}
2004-08-23 00:15:46 +00:00
void ( * Draw_Init ) ( void ) ;
2009-11-04 21:16:50 +00:00
void ( * Draw_Shutdown ) ( void ) ;
2009-06-21 17:45:33 +00:00
2009-11-04 21:16:50 +00:00
//void (*Draw_TinyCharacter) (int x, int y, unsigned int num);
2009-06-21 17:45:33 +00:00
2004-08-23 00:15:46 +00:00
void ( * R_Init ) ( void ) ;
void ( * R_DeInit ) ( void ) ;
void ( * R_RenderView ) ( void ) ; // must set r_refdef first
void ( * R_NewMap ) ( void ) ;
void ( * R_PreNewMap ) ( void ) ;
int ( * R_LightPoint ) ( vec3_t point ) ;
void ( * R_AddStain ) ( vec3_t org , float red , float green , float blue , float radius ) ;
void ( * R_LessenStains ) ( void ) ;
void ( * Mod_Init ) ( void ) ;
2011-02-02 00:41:01 +00:00
void ( * Mod_Shutdown ) ( void ) ;
2004-08-23 00:15:46 +00:00
void ( * Mod_ClearAll ) ( void ) ;
struct model_s * ( * Mod_ForName ) ( char * name , qboolean crash ) ;
struct model_s * ( * Mod_FindName ) ( char * name ) ;
void * ( * Mod_Extradata ) ( struct model_s * mod ) ; // handles caching
void ( * Mod_TouchModel ) ( char * name ) ;
void ( * Mod_NowLoadExternal ) ( void ) ;
void ( * Mod_Think ) ( void ) ;
2007-05-25 22:16:29 +00:00
//qboolean (*Mod_GetTag) (struct model_s *model, int tagnum, int frame, int frame2, float f2ness, float f1time, float f2time, float *transforms);
//int (*Mod_TagNumForName) (struct model_s *model, char *name);
2005-08-03 23:14:59 +00:00
int ( * Mod_SkinForName ) ( struct model_s * model , char * name ) ;
2009-04-01 22:03:56 +00:00
int ( * Mod_FrameForName ) ( struct model_s * model , char * name ) ;
2009-07-06 01:20:20 +00:00
float ( * Mod_GetFrameDuration ) ( struct model_s * model , int framenum ) ;
2004-11-23 01:08:59 +00:00
2004-08-23 00:15:46 +00:00
qboolean ( * VID_Init ) ( rendererstate_t * info , unsigned char * palette ) ;
void ( * VID_DeInit ) ( void ) ;
void ( * VID_SetPalette ) ( unsigned char * palette ) ;
void ( * VID_ShiftPalette ) ( unsigned char * palette ) ;
char * ( * VID_GetRGBInfo ) ( int prepad , int * truevidwidth , int * truevidheight ) ;
void ( * VID_SetWindowCaption ) ( char * msg ) ;
void ( * SCR_UpdateScreen ) ( void ) ;
2009-04-01 22:03:56 +00:00
r_qrenderer_t qrenderer ;
2004-08-23 00:15:46 +00:00
char * q_renderername = " Non-Selected renderer " ;
2005-07-03 15:16:20 +00:00
2005-06-22 17:10:13 +00:00
rendererinfo_t dedicatedrendererinfo = {
//ALL builds need a 'none' renderer, as 0.
2010-02-06 01:25:04 +00:00
" No renderer " ,
2005-06-22 17:10:13 +00:00
{
" none " ,
" dedicated " ,
" terminal " ,
" sv "
} ,
QR_NONE ,
NULL , //Draw_Init;
2009-11-04 21:16:50 +00:00
NULL , //Draw_Shutdown;
2005-06-22 17:10:13 +00:00
2010-10-02 02:25:39 +00:00
NULL , //R_LoadTexture
NULL , //R_LoadTexture8Pal24
NULL , //R_LoadTexture8Pal32
NULL , //R_LoadCompressed
NULL , //R_FindTexture
NULL , //R_AllocNewTexture
NULL , //R_Upload
NULL , //R_DestroyTexture
2005-06-22 17:10:13 +00:00
NULL , //R_Init;
NULL , //R_DeInit;
NULL , //R_RenderView;
2005-07-03 15:16:20 +00:00
2005-06-22 17:10:13 +00:00
NULL , //R_NewMap;
NULL , //R_PreNewMap
NULL , //R_LightPoint;
NULL , //R_AddStain;
NULL , //R_LessenStains;
2009-11-04 21:16:50 +00:00
# if defined(GLQUAKE) || defined(D3DQUAKE)
RMod_Init ,
2011-02-02 00:41:01 +00:00
RMod_Shutdown ,
2009-11-04 21:16:50 +00:00
RMod_ClearAll ,
RMod_ForName ,
RMod_FindName ,
RMod_Extradata ,
RMod_TouchModel ,
2005-06-22 17:10:13 +00:00
2009-11-04 21:16:50 +00:00
RMod_NowLoadExternal ,
RMod_Think ,
2004-11-23 01:08:59 +00:00
2005-06-22 17:10:13 +00:00
NULL , //Mod_GetTag
NULL , //fixme: server will need this one at some point.
2005-08-03 23:14:59 +00:00
NULL ,
2009-04-01 22:03:56 +00:00
NULL ,
2009-07-06 01:20:20 +00:00
Mod_FrameDuration ,
# else
# error "Need logic here!"
# endif
2004-08-23 00:15:46 +00:00
2005-06-22 17:10:13 +00:00
NULL , //VID_Init,
NULL , //VID_DeInit,
NULL , //VID_SetPalette,
NULL , //VID_ShiftPalette,
NULL , //VID_GetRGBInfo,
2004-11-23 01:08:59 +00:00
2005-06-22 17:10:13 +00:00
NULL , //set caption
2004-11-23 01:08:59 +00:00
2005-06-22 17:10:13 +00:00
NULL , //SCR_UpdateScreen;
2004-11-23 01:08:59 +00:00
2011-01-04 02:56:16 +00:00
/*backend*/
NULL ,
NULL ,
NULL ,
NULL ,
NULL ,
NULL ,
NULL ,
NULL ,
NULL ,
NULL ,
NULL ,
NULL ,
2005-06-22 17:10:13 +00:00
" "
} ;
rendererinfo_t * pdedicatedrendererinfo = & dedicatedrendererinfo ;
2004-11-23 01:08:59 +00:00
2009-11-04 21:16:50 +00:00
rendererinfo_t openglrendererinfo ;
2011-01-04 02:56:16 +00:00
rendererinfo_t d3dfglrendererinfo ;
2009-11-04 21:16:50 +00:00
rendererinfo_t d3drendererinfo ;
2007-05-25 22:16:29 +00:00
2009-11-04 21:16:50 +00:00
rendererinfo_t * rendererinfo [ ] =
2005-06-22 17:10:13 +00:00
{
2009-04-01 22:03:56 +00:00
# ifndef NPQTV
2009-11-04 21:16:50 +00:00
& dedicatedrendererinfo ,
2009-04-01 22:03:56 +00:00
# endif
2009-11-04 21:16:50 +00:00
# ifdef GLQUAKE
& openglrendererinfo ,
2011-01-04 02:56:16 +00:00
& d3dfglrendererinfo ,
2007-05-25 22:16:29 +00:00
# endif
# ifdef D3DQUAKE
2009-11-04 21:16:50 +00:00
& d3drendererinfo ,
2007-05-25 22:16:29 +00:00
# endif
2005-06-22 17:10:13 +00:00
} ;
2004-08-23 00:15:46 +00:00
typedef struct vidmode_s
{
const char * description ;
int width , height ;
} vidmode_t ;
vidmode_t vid_modes [ ] =
{
2009-12-25 03:06:13 +00:00
{ " 320x200 (16:10) " , 320 , 200 } , // CGA, MCGA
{ " 320x240 (4:3) " , 320 , 240 } , // QVGA
{ " 400x300 (4:3) " , 400 , 300 } , // Quarter SVGA
{ " 512x384 (4:3) " , 512 , 384 } , // Mac LC
{ " 640x400 (16:10) " , 640 , 400 } , // Atari ST mono, Amiga OCS NTSC Hires interlace
{ " 640x480 (4:3) " , 640 , 480 } , // VGA, MCGA
{ " 800x600 (4:3) " , 800 , 600 } , // SVGA
{ " 856x480 (16:9) " , 856 , 480 } , // WVGA
{ " 960x720 (4:3) " , 960 , 720 } , // unnamed
{ " 1024x576 (16:9) " , 1024 , 576 } , // WSVGA
{ " 1024x640 (16:10) " , 1024 , 640 } , // unnamed
{ " 1024x768 (4:3) " , 1024 , 768 } , // XGA
{ " 1152x720 (16:10) " , 1152 , 720 } , // XGA+
{ " 1152x864 (4:3) " , 1152 , 864 } , // XGA+
{ " 1280x720 (16:9) " , 1280 , 720 } , // WXGA min.
{ " 1280x800 (16:10) " , 1280 , 800 } , // WXGA avg (native resolution of 17" widescreen LCDs)
{ " 1280x960 (4:3) " , 1280 , 960 } , //SXGA-
{ " 1280x1024 (5:4) " , 1280 , 1024 } , // SXGA (native resolution of 17-19" LCDs)
{ " 1366x768 (16:9) " , 1366 , 768 } , // WXGA
{ " 1400x1050 (4:3) " , 1400 , 1050 } , // SXGA+
{ " 1440x900 (16:10) " , 1440 , 900 } , // WXGA+ (native resolution of 19" widescreen LCDs)
{ " 1440x1080 (4:3) " , 1440 , 1080 } , // unnamed
{ " 1600x900 (16:9) " , 1600 , 900 } , // 900p
{ " 1600x1200 (4:3) " , 1600 , 1200 } , // UXGA (native resolution of 20"+ LCDs) //sw height is bound to 200 to 1024
{ " 1680x1050 (16:10) " , 1680 , 1050 } , // WSXGA+ (native resolution of 22" widescreen LCDs)
{ " 1792x1344 (4:3) " , 1792 , 1344 } , // unnamed
{ " 1800x1440 (5:4) " , 1800 , 1440 } , // unnamed
{ " 1856x1392 (4:3) " , 1856 , 1392 } , //unnamed
{ " 1920x1080 (16:9) " , 1920 , 1080 } , // 1080p (native resolution of cheap 24" LCDs, which really are 23.6")
{ " 1920x1200 (16:10) " , 1920 , 1200 } , // WUXGA (native resolution of good 24" widescreen LCDs)
{ " 1920x1440 (4:3) " , 1920 , 1440 } , // TXGA
{ " 2048x1152 (16:9) " , 2048 , 1152 } , // QWXGA (native resolution of 23" ultra-widescreen LCDs)
{ " 2048x1536 (4:3) " , 2048 , 1536 } , // QXGA //too much width will disable water warping (>1280) (but at that resolution, it's almost unnoticable)
{ " 2304x1440 (16:10) " , 2304 , 1440 } , // (unnamed; maximum resolution of the Sony GDM-FW900 and Hewlett Packard A7217A)
{ " 2560x1600 (16:10) " , 2560 , 1600 } , // WQXGA (maximum resolution of 30" widescreen LCDs, Dell for example)
{ " 2560x2048 (5:4) " , 2560 , 2048 } // QSXGA
2004-08-23 00:15:46 +00:00
} ;
# define NUMVIDMODES sizeof(vid_modes) / sizeof(vid_modes[0])
2010-03-14 14:35:56 +00:00
qboolean M_Vid_GetMode ( int num , int * w , int * h )
2005-09-28 23:38:51 +00:00
{
if ( ( unsigned ) num > = NUMVIDMODES )
return false ;
* w = vid_modes [ num ] . width ;
* h = vid_modes [ num ] . height ;
return true ;
}
2004-08-23 00:15:46 +00:00
typedef struct {
menucombo_t * renderer ;
2005-01-26 18:56:49 +00:00
menucombo_t * modecombo ;
menucombo_t * conscalecombo ;
2005-06-21 07:44:16 +00:00
menucombo_t * bppcombo ;
2009-12-25 03:06:13 +00:00
menucombo_t * refreshratecombo ;
2009-12-29 14:00:56 +00:00
menucombo_t * vsynccombo ;
2004-08-23 00:15:46 +00:00
menuedit_t * customwidth ;
menuedit_t * customheight ;
} videomenuinfo_t ;
menuedit_t * MC_AddEdit ( menu_t * menu , int x , int y , char * text , char * def ) ;
2005-01-26 18:56:49 +00:00
void CheckCustomMode ( struct menu_s * menu )
{
videomenuinfo_t * info = menu - > data ;
if ( info - > modecombo - > selectedoption & & info - > conscalecombo - > selectedoption )
{ //hide the custom options
info - > customwidth - > common . ishidden = true ;
info - > customheight - > common . ishidden = true ;
}
else
{
info - > customwidth - > common . ishidden = false ;
info - > customheight - > common . ishidden = false ;
}
2009-07-16 22:06:59 +00:00
if ( ! info - > bppcombo - > selectedoption )
info - > bppcombo - > selectedoption = 1 ;
2005-06-21 07:44:16 +00:00
2009-07-16 22:06:59 +00:00
info - > conscalecombo - > common . ishidden = false ;
2005-01-26 18:56:49 +00:00
}
2004-08-23 00:15:46 +00:00
qboolean M_VideoApply ( union menuoption_s * op , struct menu_s * menu , int key )
{
videomenuinfo_t * info = menu - > data ;
2005-06-21 07:44:16 +00:00
int selectedbpp ;
2004-08-23 00:15:46 +00:00
if ( key ! = K_ENTER )
return false ;
2005-01-26 18:56:49 +00:00
if ( info - > modecombo - > selectedoption )
{ //set a prefab
Cbuf_AddText ( va ( " vid_width %i \n " , vid_modes [ info - > modecombo - > selectedoption - 1 ] . width ) , RESTRICT_LOCAL ) ;
Cbuf_AddText ( va ( " vid_height %i \n " , vid_modes [ info - > modecombo - > selectedoption - 1 ] . height ) , RESTRICT_LOCAL ) ;
}
else
{ //use the custom one
Cbuf_AddText ( va ( " vid_width %s \n " , info - > customwidth - > text ) , RESTRICT_LOCAL ) ;
Cbuf_AddText ( va ( " vid_height %s \n " , info - > customheight - > text ) , RESTRICT_LOCAL ) ;
}
2005-06-15 04:44:39 +00:00
2005-01-26 18:56:49 +00:00
if ( info - > conscalecombo - > selectedoption ) //I am aware that this handicaps the menu a bit, but it should be easier for n00bs.
{ //set a prefab
Cbuf_AddText ( va ( " vid_conwidth %i \n " , vid_modes [ info - > conscalecombo - > selectedoption - 1 ] . width ) , RESTRICT_LOCAL ) ;
Cbuf_AddText ( va ( " vid_conheight %i \n " , vid_modes [ info - > conscalecombo - > selectedoption - 1 ] . height ) , RESTRICT_LOCAL ) ;
}
else
{ //use the custom one
Cbuf_AddText ( va ( " vid_conwidth %s \n " , info - > customwidth - > text ) , RESTRICT_LOCAL ) ;
Cbuf_AddText ( va ( " vid_conheight %s \n " , info - > customheight - > text ) , RESTRICT_LOCAL ) ;
}
2005-07-03 15:16:20 +00:00
2005-06-21 07:44:16 +00:00
selectedbpp = 16 ;
switch ( info - > bppcombo - > selectedoption )
{
case 0 :
if ( info - > renderer - > selectedoption )
selectedbpp = 16 ;
else
selectedbpp = 8 ;
break ;
case 1 :
selectedbpp = 16 ;
break ;
case 2 :
selectedbpp = 32 ;
break ;
}
2004-08-23 00:15:46 +00:00
2009-12-29 14:00:56 +00:00
switch ( info - > vsynccombo - > selectedoption )
2006-01-16 07:42:50 +00:00
{
case 0 :
2009-12-29 14:00:56 +00:00
Cbuf_AddText ( va ( " vid_wait %i \n " , 0 ) , RESTRICT_LOCAL ) ;
2006-01-16 13:47:56 +00:00
break ;
case 1 :
2009-12-29 14:00:56 +00:00
Cbuf_AddText ( va ( " vid_wait %i \n " , 1 ) , RESTRICT_LOCAL ) ;
2006-01-16 13:47:56 +00:00
break ;
case 2 :
2009-12-29 14:00:56 +00:00
Cbuf_AddText ( va ( " vid_wait %i \n " , 2 ) , RESTRICT_LOCAL ) ;
2006-01-16 07:42:50 +00:00
break ;
}
2009-12-29 14:00:56 +00:00
2005-06-21 07:44:16 +00:00
Cbuf_AddText ( va ( " vid_bpp %i \n " , selectedbpp ) , RESTRICT_LOCAL ) ;
2005-07-03 15:16:20 +00:00
2009-12-25 03:06:13 +00:00
switch ( info - > refreshratecombo - > selectedoption )
{
case 0 :
Cbuf_AddText ( va ( " vid_displayfrequency %i \n " , 0 ) , RESTRICT_LOCAL ) ;
break ;
case 1 :
Cbuf_AddText ( va ( " vid_displayfrequency %i \n " , 59 ) , RESTRICT_LOCAL ) ;
break ;
case 2 :
Cbuf_AddText ( va ( " vid_displayfrequency %i \n " , 60 ) , RESTRICT_LOCAL ) ;
break ;
case 3 :
Cbuf_AddText ( va ( " vid_displayfrequency %i \n " , 70 ) , RESTRICT_LOCAL ) ;
break ;
case 4 :
Cbuf_AddText ( va ( " vid_displayfrequency %i \n " , 72 ) , RESTRICT_LOCAL ) ;
break ;
case 5 :
Cbuf_AddText ( va ( " vid_displayfrequency %i \n " , 75 ) , RESTRICT_LOCAL ) ;
break ;
case 6 :
Cbuf_AddText ( va ( " vid_displayfrequency %i \n " , 85 ) , RESTRICT_LOCAL ) ;
break ;
case 7 :
Cbuf_AddText ( va ( " vid_displayfrequency %i \n " , 100 ) , RESTRICT_LOCAL ) ;
break ;
}
2004-08-23 00:15:46 +00:00
switch ( info - > renderer - > selectedoption )
{
2011-04-03 04:49:33 +00:00
# if defined(GLQUAKE) && !defined(D3DQUAKE) // Just OpenGL client
2004-08-23 00:15:46 +00:00
case 0 :
Cbuf_AddText ( " setrenderer gl \n " , RESTRICT_LOCAL ) ;
break ;
2009-07-16 22:06:59 +00:00
# endif
2011-04-03 04:49:33 +00:00
# if defined(D3DQUAKE) && !defined(GLQUAKE) // Just Direct3D client
case 0 :
Cbuf_AddText ( " setrenderer d3d \n " , RESTRICT_LOCAL ) ;
break ;
# endif
# if defined(GLQUAKE) && defined(D3DQUAKE) // OpenGL + Direct3D = Merged
case 0 :
Cbuf_AddText ( " setrenderer gl \n " , RESTRICT_LOCAL ) ;
break ;
2004-08-23 00:15:46 +00:00
case 1 :
2011-01-28 05:39:40 +00:00
Cbuf_AddText ( " setrenderer d3d \n " , RESTRICT_LOCAL ) ;
2009-07-16 22:06:59 +00:00
break ;
2004-08-23 00:15:46 +00:00
# endif
}
2011-04-03 04:49:33 +00:00
2004-08-23 00:15:46 +00:00
M_RemoveMenu ( menu ) ;
Cbuf_AddText ( " menu_video \n " , RESTRICT_LOCAL ) ;
return true ;
}
void M_Menu_Video_f ( void )
{
2009-12-29 14:00:56 +00:00
extern cvar_t v_contrast ;
2009-11-04 21:16:50 +00:00
# if defined(GLQUAKE)
2004-12-09 23:34:24 +00:00
# endif
2004-08-23 00:15:46 +00:00
static const char * modenames [ 128 ] = { " Custom " } ;
static const char * rendererops [ ] = {
2009-11-04 21:16:50 +00:00
# ifdef GLQUAKE
2004-08-23 00:15:46 +00:00
" OpenGL " ,
2007-05-25 22:16:29 +00:00
# endif
# ifdef D3DQUAKE
2008-02-02 15:16:16 +00:00
" DirectX9 " ,
2004-08-23 00:15:46 +00:00
# endif
NULL
} ;
2005-06-21 07:44:16 +00:00
static const char * bppnames [ ] =
{
" 8 " ,
" 16 " ,
" 32 " ,
NULL
} ;
2011-05-15 13:23:13 +00:00
//unused
/*static const char *texturefilternames[] =
2006-01-16 07:42:50 +00:00
{
2006-06-04 02:25:10 +00:00
" Nearest " ,
2006-01-16 07:42:50 +00:00
" Bilinear " ,
" Trilinear " ,
2006-01-16 13:47:56 +00:00
NULL
2011-05-15 13:23:13 +00:00
} ; */
2006-01-16 13:47:56 +00:00
2009-12-25 03:06:13 +00:00
static const char * refreshrates [ ] =
{
" 0Hz (OS Driver refresh rate) " ,
" 59Hz (NTSC is 59.94i) " ,
" 60Hz " ,
" 70Hz " ,
" 72Hz " , // VESA minimum setting to avoid eye damage on CRT monitors
" 75Hz " ,
" 85Hz " ,
" 100Hz " ,
NULL
} ;
2006-01-16 13:47:56 +00:00
2009-12-29 14:00:56 +00:00
static const char * vsyncoptions [ ] =
{
" Off " ,
" Wait for Vertical Sync " ,
" Wait for Display Enable " ,
NULL
} ;
2004-08-23 00:15:46 +00:00
videomenuinfo_t * info ;
2005-01-26 18:56:49 +00:00
int prefabmode ;
int prefab2dmode ;
2005-06-21 07:44:16 +00:00
int currentbpp ;
2009-12-25 03:06:13 +00:00
int currentrefreshrate ;
2009-12-29 14:00:56 +00:00
int currentvsync ;
2010-01-15 05:35:27 +00:00
int aspectratio3d ;
int aspectratio2d ;
char * aspectratio23d ;
char * aspectratio22d ;
char * rendererstring ;
static char current3dres [ 10 ] ; // enough to fit 1920x1200
static char current2dres [ 10 ] ; // same as above
static char currenthz [ 6 ] ; // enough to fit 120hz
2010-01-23 07:14:37 +00:00
static char currentcolordepth [ 6 ] ;
2009-12-29 14:00:56 +00:00
extern cvar_t _vid_wait_override ;
2010-07-11 02:22:39 +00:00
float vidwidth = vid . pixelwidth ;
float vidheight = vid . pixelheight ;
2004-08-23 00:15:46 +00:00
int i , y ;
2010-07-11 02:22:39 +00:00
menu_t * menu = M_Options_Title ( & y , sizeof ( videomenuinfo_t ) ) ;
info = menu - > data ;
2005-01-26 18:56:49 +00:00
prefabmode = - 1 ;
prefab2dmode = - 1 ;
2004-08-23 00:15:46 +00:00
for ( i = 0 ; i < sizeof ( vid_modes ) / sizeof ( vidmode_t ) ; i + + )
{
2005-01-26 18:56:49 +00:00
if ( vid_modes [ i ] . width = = vid_width . value & & vid_modes [ i ] . height = = vid_height . value )
prefabmode = i ;
if ( vid_modes [ i ] . width = = vid_conwidth . value & & vid_modes [ i ] . height = = vid_conheight . value )
prefab2dmode = i ;
2004-08-23 00:15:46 +00:00
modenames [ i + 1 ] = vid_modes [ i ] . description ;
}
modenames [ i + 1 ] = NULL ;
2010-07-11 02:22:39 +00:00
# if defined(GLQUAKE) && defined(D3DQUAKE)
2009-07-16 22:06:59 +00:00
if ( ! strcmp ( vid_renderer . string , " d3d9 " ) )
2004-08-23 00:15:46 +00:00
i = 1 ;
else
# endif
i = 0 ;
2005-06-21 07:44:16 +00:00
if ( vid_bpp . value > = 32 )
2010-01-23 07:14:37 +00:00
{
2005-06-21 07:44:16 +00:00
currentbpp = 2 ;
2010-01-23 07:14:37 +00:00
strcpy ( currentcolordepth , va ( " %sbit (16.7m colors) " , vid_bpp . string ) ) ;
}
2005-06-21 07:44:16 +00:00
else if ( vid_bpp . value > = 16 )
2010-01-23 07:14:37 +00:00
{
2005-06-21 07:44:16 +00:00
currentbpp = 1 ;
2010-01-23 07:14:37 +00:00
strcpy ( currentcolordepth , va ( " %sbit (65.5k colors) " , vid_bpp . string ) ) ;
}
2005-06-21 07:44:16 +00:00
else
currentbpp = 0 ;
2009-12-25 03:06:13 +00:00
if ( vid_refreshrate . value > = 100 )
currentrefreshrate = 7 ;
else if ( vid_refreshrate . value > = 85 )
currentrefreshrate = 6 ;
else if ( vid_refreshrate . value > = 75 )
currentrefreshrate = 5 ;
else if ( vid_refreshrate . value > = 72 )
currentrefreshrate = 4 ;
else if ( vid_refreshrate . value > = 70 )
currentrefreshrate = 3 ;
else if ( vid_refreshrate . value > = 60 )
currentrefreshrate = 2 ;
else if ( vid_refreshrate . value > = 59 )
currentrefreshrate = 1 ;
else if ( vid_refreshrate . value > = 0 )
currentrefreshrate = 0 ;
else
currentrefreshrate = 0 ;
2010-01-23 07:14:37 +00:00
strcpy ( currenthz , va ( " %sHz " , vid_refreshrate . string ) ) ;
aspectratio3d = ( vidwidth / vidheight * 100 ) ; // times by 100 so don't have to deal with floats
2009-12-29 14:00:56 +00:00
2010-01-15 05:35:27 +00:00
if ( aspectratio3d = = 125 ) // 1.25
aspectratio23d = " 5:4 " ;
else if ( aspectratio3d = = 160 ) // 1.6
aspectratio23d = " 16:10 " ;
else if ( aspectratio3d = = 133 ) // 1.333333
aspectratio23d = " 4:3 " ;
else if ( aspectratio3d = = 177 ) // 1.777778
aspectratio23d = " 16:9 " ;
2006-01-16 07:42:50 +00:00
else
2010-01-23 07:14:37 +00:00
{
2010-01-15 05:35:27 +00:00
aspectratio23d = " Non-standard Ratio " ;
2010-07-11 02:22:39 +00:00
Con_Printf ( " Ratio: %i, width: %i, height: %i \n " , aspectratio3d , vid . pixelwidth , vid . pixelheight ) ;
2010-01-23 07:14:37 +00:00
}
2006-04-14 05:23:11 +00:00
2010-01-15 05:35:27 +00:00
aspectratio2d = ( vid_conwidth . value / vid_conheight . value * 100 ) ; // times by 100 so don't have to deal with floats
2005-06-21 07:44:16 +00:00
2010-01-15 05:35:27 +00:00
if ( aspectratio2d = = 125 ) // 1.25
aspectratio22d = " 5:4 " ;
else if ( aspectratio2d = = 160 ) // 1.6
aspectratio22d = " 16:10 " ;
else if ( aspectratio2d = = 133 ) // 1.333333
aspectratio22d = " 4:3 " ;
else if ( aspectratio2d = = 177 ) // 1.777778
aspectratio22d = " 16:9 " ;
else
aspectratio22d = " Non-standard Ratio " ;
2006-04-14 05:23:11 +00:00
2009-12-29 14:00:56 +00:00
currentvsync = _vid_wait_override . value ;
2005-06-21 07:44:16 +00:00
2010-01-15 05:35:27 +00:00
if ( stricmp ( vid_renderer . string , " gl " ) = = 0 )
rendererstring = " OpenGL " ;
else if ( stricmp ( vid_renderer . string , " d3d7 " ) = = 0 )
rendererstring = " DirectX 7 " ;
else if ( stricmp ( vid_renderer . string , " d3d9 " ) = = 0 )
rendererstring = " DirectX 9 " ;
else if ( stricmp ( vid_renderer . string , " d3d " ) = = 0 )
rendererstring = " DirectX " ;
else if ( stricmp ( vid_renderer . string , " sw " ) = = 0 )
rendererstring = " Software " ;
else
rendererstring = " Unknown Renderer? " ;
2010-07-11 02:22:39 +00:00
strcpy ( current3dres , va ( " %ix%i " , vid . pixelwidth , vid . pixelheight ) ) ;
2010-01-23 07:14:37 +00:00
strcpy ( current2dres , va ( " %sx%s " , vid_conwidth . string , vid_conheight . string ) ) ;
2010-01-15 05:35:27 +00:00
2010-01-16 06:16:42 +00:00
y + = 40 ;
MC_AddRedText ( menu , 0 , y , " Current Renderer " , false ) ;
MC_AddRedText ( menu , 225 , y , rendererstring , false ) ; y + = 8 ;
MC_AddRedText ( menu , 0 , y , " Current Color Depth " , false ) ;
2010-01-23 07:14:37 +00:00
MC_AddRedText ( menu , 225 , y , currentcolordepth , false ) ; y + = 8 ;
if ( ( vidwidth = = 0 ) | | ( vidheight = = 0 ) )
y + = 16 ;
else
{
MC_AddRedText ( menu , 0 , y , " Current 3D Res " , false ) ;
MC_AddRedText ( menu , 225 , y , current3dres , false ) ; y + = 8 ;
MC_AddRedText ( menu , 0 , y , " Current 3D A/R " , false ) ;
MC_AddRedText ( menu , 225 , y , aspectratio23d , false ) ; y + = 8 ;
}
2004-08-23 00:15:46 +00:00
2010-01-23 07:14:37 +00:00
if ( ( vid_conwidth . value = = 0 ) | | ( vid_conheight . value = = 0 ) ) // same as 3d resolution
{
MC_AddRedText ( menu , 0 , y , " Current 2D Res " , false ) ;
MC_AddRedText ( menu , 225 , y , current3dres , false ) ; y + = 8 ;
MC_AddRedText ( menu , 0 , y , " Current 2D A/R " , false ) ;
MC_AddRedText ( menu , 225 , y , aspectratio23d , false ) ; y + = 8 ;
}
else
{
MC_AddRedText ( menu , 0 , y , " Current 2D Res " , false ) ;
MC_AddRedText ( menu , 225 , y , current2dres , false ) ; y + = 8 ;
MC_AddRedText ( menu , 0 , y , " Current 2D A/R " , false ) ;
MC_AddRedText ( menu , 225 , y , aspectratio22d , false ) ; y + = 8 ;
}
2010-01-16 06:16:42 +00:00
MC_AddRedText ( menu , 0 , y , " Current Refresh Rate " , false ) ;
MC_AddRedText ( menu , 225 , y , currenthz , false ) ; y + = 8 ;
y + = 8 ;
MC_AddRedText ( menu , 0 , y , " <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " , false ) ; y + = 8 ;
2004-08-23 00:15:46 +00:00
y + = 8 ;
2010-01-15 05:35:27 +00:00
info - > renderer = MC_AddCombo ( menu , 16 , y , " Renderer " , rendererops , i ) ; y + = 8 ;
info - > bppcombo = MC_AddCombo ( menu , 16 , y , " Color Depth " , bppnames , currentbpp ) ; y + = 8 ;
info - > refreshratecombo = MC_AddCombo ( menu , 16 , y , " Refresh Rate " , refreshrates , currentrefreshrate ) ; y + = 8 ;
info - > modecombo = MC_AddCombo ( menu , 16 , y , " Video Size " , modenames , prefabmode + 1 ) ; y + = 8 ;
MC_AddWhiteText ( menu , 16 , y , " 3D Aspect Ratio " , false ) ; y + = 8 ;
info - > conscalecombo = MC_AddCombo ( menu , 16 , y , " 2D Size " , modenames , prefab2dmode + 1 ) ; y + = 8 ;
MC_AddWhiteText ( menu , 16 , y , " 2D Aspect Ratio " , false ) ; y + = 8 ;
MC_AddCheckBox ( menu , 16 , y , " Fullscreen " , & vid_fullscreen , 0 ) ; y + = 8 ;
y + = 4 ; info - > customwidth = MC_AddEdit ( menu , 16 , y , " Custom width " , vid_width . string ) ; y + = 8 ;
y + = 4 ; info - > customheight = MC_AddEdit ( menu , 16 , y , " Custom height " , vid_height . string ) ; y + = 12 ;
info - > vsynccombo = MC_AddCombo ( menu , 16 , y , " VSync " , vsyncoptions , currentvsync ) ; y + = 8 ;
//MC_AddCheckBox(menu, 16, y, " Override VSync", &_vid_wait_override,0); y+=8;
2010-01-16 06:16:42 +00:00
MC_AddCheckBox ( menu , 16 , y , " Desktop Settings " , & vid_desktopsettings , 0 ) ; y + = 8 ;
2004-08-23 00:15:46 +00:00
y + = 8 ;
2010-01-15 05:35:27 +00:00
MC_AddCommand ( menu , 16 , y , " = Apply Changes = " , M_VideoApply ) ; y + = 8 ;
2004-08-23 00:15:46 +00:00
y + = 8 ;
2010-01-15 05:35:27 +00:00
MC_AddSlider ( menu , 16 , y , " Screen size " , & scr_viewsize , 30 , 120 , 1 ) ; y + = 8 ;
MC_AddSlider ( menu , 16 , y , " Console Autoscale " , & vid_conautoscale , 0 , 6 , 0.25 ) ; y + = 8 ;
MC_AddSlider ( menu , 16 , y , " Gamma " , & v_gamma , 0.3 , 1 , 0.05 ) ; y + = 8 ;
MC_AddCheckBox ( menu , 16 , y , " Desktop Gamma " , & vid_desktopgamma , 0 ) ; y + = 8 ;
MC_AddCheckBox ( menu , 16 , y , " Hardware Gamma " , & vid_hardwaregamma , 0 ) ; y + = 8 ;
MC_AddCheckBox ( menu , 16 , y , " Preserve Gamma " , & vid_preservegamma , 0 ) ; y + = 8 ;
MC_AddSlider ( menu , 16 , y , " Contrast " , & v_contrast , 1 , 3 , 0.05 ) ; y + = 8 ;
2009-12-29 14:00:56 +00:00
y + = 8 ;
2010-01-15 05:35:27 +00:00
MC_AddCheckBox ( menu , 16 , y , " Allow ModeX " , & vid_allow_modex , 0 ) ; y + = 8 ;
MC_AddCheckBox ( menu , 16 , y , " Windowed Mouse " , & _windowed_mouse , 0 ) ; y + = 8 ;
2004-08-23 00:15:46 +00:00
menu - > selecteditem = ( union menuoption_s * ) info - > renderer ;
2010-07-11 02:22:39 +00:00
menu - > cursoritem = ( menuoption_t * ) MC_AddWhiteText ( menu , 152 , menu - > selecteditem - > common . posy , NULL , false ) ;
2005-01-26 18:56:49 +00:00
menu - > event = CheckCustomMode ;
2004-08-23 00:15:46 +00:00
}
2010-02-06 01:25:04 +00:00
void R_SetRenderer ( rendererinfo_t * ri )
2004-08-23 00:15:46 +00:00
{
2010-02-06 01:25:04 +00:00
currentrendererstate . renderer = ri ;
if ( ! ri )
ri = & dedicatedrendererinfo ;
2005-06-22 17:10:13 +00:00
2010-02-06 01:25:04 +00:00
qrenderer = ri - > rtype ;
2005-06-22 17:10:13 +00:00
q_renderername = ri - > name [ 0 ] ;
Draw_Init = ri - > Draw_Init ;
2009-11-04 21:16:50 +00:00
Draw_Shutdown = ri - > Draw_Shutdown ;
2005-06-22 17:10:13 +00:00
R_Init = ri - > R_Init ;
R_DeInit = ri - > R_DeInit ;
R_RenderView = ri - > R_RenderView ;
R_NewMap = ri - > R_NewMap ;
R_PreNewMap = ri - > R_PreNewMap ;
R_LightPoint = ri - > R_LightPoint ;
R_AddStain = ri - > R_AddStain ;
R_LessenStains = ri - > R_LessenStains ;
VID_Init = ri - > VID_Init ;
VID_DeInit = ri - > VID_DeInit ;
VID_SetPalette = ri - > VID_SetPalette ;
VID_ShiftPalette = ri - > VID_ShiftPalette ;
VID_GetRGBInfo = ri - > VID_GetRGBInfo ;
2005-08-07 18:08:13 +00:00
VID_SetWindowCaption = ri - > VID_SetWindowCaption ;
2005-06-22 17:10:13 +00:00
Mod_Init = ri - > Mod_Init ;
2011-02-02 00:41:01 +00:00
Mod_Shutdown = ri - > Mod_Shutdown ;
2005-06-22 17:10:13 +00:00
Mod_Think = ri - > Mod_Think ;
Mod_ClearAll = ri - > Mod_ClearAll ;
Mod_ForName = ri - > Mod_ForName ;
Mod_FindName = ri - > Mod_FindName ;
Mod_Extradata = ri - > Mod_Extradata ;
Mod_TouchModel = ri - > Mod_TouchModel ;
Mod_NowLoadExternal = ri - > Mod_NowLoadExternal ;
2007-05-25 22:16:29 +00:00
// Mod_GetTag = ri->Mod_GetTag;
// Mod_TagNumForName = ri->Mod_TagNumForName;
2005-08-03 23:14:59 +00:00
Mod_SkinForName = ri - > Mod_SkinForName ;
2009-07-06 01:20:20 +00:00
Mod_FrameForName = ri - > Mod_FrameForName ;
Mod_GetFrameDuration = ri - > Mod_GetFrameDuration ;
2005-06-22 17:10:13 +00:00
SCR_UpdateScreen = ri - > SCR_UpdateScreen ;
2004-08-23 00:15:46 +00:00
}
2005-01-05 08:06:55 +00:00
static qbyte default_quakepal [ 768 ] =
{
0 , 0 , 0 , 15 , 15 , 15 , 31 , 31 , 31 , 47 , 47 , 47 , 63 , 63 , 63 , 75 , 75 , 75 , 91 , 91 , 91 , 107 , 107 , 107 , 123 , 123 , 123 , 139 , 139 , 139 , 155 , 155 , 155 , 171 , 171 , 171 , 187 , 187 , 187 , 203 , 203 , 203 , 219 , 219 , 219 , 235 , 235 , 235 , 15 , 11 , 7 , 23 , 15 , 11 , 31 , 23 , 11 , 39 , 27 , 15 , 47 , 35 , 19 , 55 , 43 , 23 , 63 , 47 , 23 , 75 , 55 , 27 , 83 , 59 , 27 , 91 , 67 , 31 , 99 , 75 , 31 , 107 , 83 , 31 , 115 , 87 , 31 , 123 , 95 , 35 , 131 , 103 , 35 , 143 , 111 , 35 , 11 , 11 , 15 , 19 , 19 , 27 , 27 , 27 , 39 , 39 , 39 , 51 , 47 , 47 , 63 , 55 , 55 , 75 , 63 , 63 , 87 , 71 , 71 , 103 , 79 , 79 , 115 , 91 , 91 , 127 , 99 , 99 ,
139 , 107 , 107 , 151 , 115 , 115 , 163 , 123 , 123 , 175 , 131 , 131 , 187 , 139 , 139 , 203 , 0 , 0 , 0 , 7 , 7 , 0 , 11 , 11 , 0 , 19 , 19 , 0 , 27 , 27 , 0 , 35 , 35 , 0 , 43 , 43 , 7 , 47 , 47 , 7 , 55 , 55 , 7 , 63 , 63 , 7 , 71 , 71 , 7 , 75 , 75 , 11 , 83 , 83 , 11 , 91 , 91 , 11 , 99 , 99 , 11 , 107 , 107 , 15 , 7 , 0 , 0 , 15 , 0 , 0 , 23 , 0 , 0 , 31 , 0 , 0 , 39 , 0 , 0 , 47 , 0 , 0 , 55 , 0 , 0 , 63 , 0 , 0 , 71 , 0 , 0 , 79 , 0 , 0 , 87 , 0 , 0 , 95 , 0 , 0 , 103 , 0 , 0 , 111 , 0 , 0 , 119 , 0 , 0 , 127 , 0 , 0 , 19 , 19 , 0 , 27 , 27 , 0 , 35 , 35 , 0 , 47 , 43 , 0 , 55 , 47 , 0 , 67 ,
55 , 0 , 75 , 59 , 7 , 87 , 67 , 7 , 95 , 71 , 7 , 107 , 75 , 11 , 119 , 83 , 15 , 131 , 87 , 19 , 139 , 91 , 19 , 151 , 95 , 27 , 163 , 99 , 31 , 175 , 103 , 35 , 35 , 19 , 7 , 47 , 23 , 11 , 59 , 31 , 15 , 75 , 35 , 19 , 87 , 43 , 23 , 99 , 47 , 31 , 115 , 55 , 35 , 127 , 59 , 43 , 143 , 67 , 51 , 159 , 79 , 51 , 175 , 99 , 47 , 191 , 119 , 47 , 207 , 143 , 43 , 223 , 171 , 39 , 239 , 203 , 31 , 255 , 243 , 27 , 11 , 7 , 0 , 27 , 19 , 0 , 43 , 35 , 15 , 55 , 43 , 19 , 71 , 51 , 27 , 83 , 55 , 35 , 99 , 63 , 43 , 111 , 71 , 51 , 127 , 83 , 63 , 139 , 95 , 71 , 155 , 107 , 83 , 167 , 123 , 95 , 183 , 135 , 107 , 195 , 147 , 123 , 211 , 163 , 139 , 227 , 179 , 151 ,
171 , 139 , 163 , 159 , 127 , 151 , 147 , 115 , 135 , 139 , 103 , 123 , 127 , 91 , 111 , 119 , 83 , 99 , 107 , 75 , 87 , 95 , 63 , 75 , 87 , 55 , 67 , 75 , 47 , 55 , 67 , 39 , 47 , 55 , 31 , 35 , 43 , 23 , 27 , 35 , 19 , 19 , 23 , 11 , 11 , 15 , 7 , 7 , 187 , 115 , 159 , 175 , 107 , 143 , 163 , 95 , 131 , 151 , 87 , 119 , 139 , 79 , 107 , 127 , 75 , 95 , 115 , 67 , 83 , 107 , 59 , 75 , 95 , 51 , 63 , 83 , 43 , 55 , 71 , 35 , 43 , 59 , 31 , 35 , 47 , 23 , 27 , 35 , 19 , 19 , 23 , 11 , 11 , 15 , 7 , 7 , 219 , 195 , 187 , 203 , 179 , 167 , 191 , 163 , 155 , 175 , 151 , 139 , 163 , 135 , 123 , 151 , 123 , 111 , 135 , 111 , 95 , 123 , 99 , 83 , 107 , 87 , 71 , 95 , 75 , 59 , 83 , 63 ,
51 , 67 , 51 , 39 , 55 , 43 , 31 , 39 , 31 , 23 , 27 , 19 , 15 , 15 , 11 , 7 , 111 , 131 , 123 , 103 , 123 , 111 , 95 , 115 , 103 , 87 , 107 , 95 , 79 , 99 , 87 , 71 , 91 , 79 , 63 , 83 , 71 , 55 , 75 , 63 , 47 , 67 , 55 , 43 , 59 , 47 , 35 , 51 , 39 , 31 , 43 , 31 , 23 , 35 , 23 , 15 , 27 , 19 , 11 , 19 , 11 , 7 , 11 , 7 , 255 , 243 , 27 , 239 , 223 , 23 , 219 , 203 , 19 , 203 , 183 , 15 , 187 , 167 , 15 , 171 , 151 , 11 , 155 , 131 , 7 , 139 , 115 , 7 , 123 , 99 , 7 , 107 , 83 , 0 , 91 , 71 , 0 , 75 , 55 , 0 , 59 , 43 , 0 , 43 , 31 , 0 , 27 , 15 , 0 , 11 , 7 , 0 , 0 , 0 , 255 , 11 , 11 , 239 , 19 , 19 , 223 , 27 , 27 , 207 , 35 , 35 , 191 , 43 ,
43 , 175 , 47 , 47 , 159 , 47 , 47 , 143 , 47 , 47 , 127 , 47 , 47 , 111 , 47 , 47 , 95 , 43 , 43 , 79 , 35 , 35 , 63 , 27 , 27 , 47 , 19 , 19 , 31 , 11 , 11 , 15 , 43 , 0 , 0 , 59 , 0 , 0 , 75 , 7 , 0 , 95 , 7 , 0 , 111 , 15 , 0 , 127 , 23 , 7 , 147 , 31 , 7 , 163 , 39 , 11 , 183 , 51 , 15 , 195 , 75 , 27 , 207 , 99 , 43 , 219 , 127 , 59 , 227 , 151 , 79 , 231 , 171 , 95 , 239 , 191 , 119 , 247 , 211 , 139 , 167 , 123 , 59 , 183 , 155 , 55 , 199 , 195 , 55 , 231 , 227 , 87 , 127 , 191 , 255 , 171 , 231 , 255 , 215 , 255 , 255 , 103 , 0 , 0 , 139 , 0 , 0 , 179 , 0 , 0 , 215 , 0 , 0 , 255 , 0 , 0 , 255 , 243 , 147 , 255 , 247 , 199 , 255 , 255 , 255 , 159 , 91 , 83
} ;
qbyte default_conchar [ 11356 ] =
{
# include "lhfont.h"
} ;
2004-08-23 00:15:46 +00:00
2007-05-25 22:16:29 +00:00
qboolean R_ApplyRenderer_Load ( rendererstate_t * newr ) ;
void D3DSucks ( void )
{
SCR_DeInit ( ) ;
if ( ! R_ApplyRenderer_Load ( NULL ) ) //¤trendererstate))
Sys_Error ( " Failed to reload content after mode switch \n " ) ;
}
2009-04-01 22:03:56 +00:00
void R_ShutdownRenderer ( void )
2004-08-23 00:15:46 +00:00
{
2005-02-28 07:16:19 +00:00
CL_AllowIndependantSendCmd ( false ) ; //FIXME: figure out exactly which parts are going to affect the model loading.
2011-01-30 01:32:30 +00:00
P_Shutdown ( ) ;
2011-02-02 00:41:01 +00:00
if ( Mod_Shutdown )
Mod_Shutdown ( ) ;
2011-01-30 01:32:30 +00:00
2004-11-13 17:29:47 +00:00
IN_Shutdown ( ) ;
2004-08-23 00:15:46 +00:00
if ( R_DeInit )
2004-10-10 06:32:29 +00:00
{
TRACE ( ( " dbg: R_ApplyRenderer: R_DeInit \n " ) ) ;
2004-08-23 00:15:46 +00:00
R_DeInit ( ) ;
2004-10-10 06:32:29 +00:00
}
2004-08-23 00:15:46 +00:00
if ( VID_DeInit )
2004-10-10 06:32:29 +00:00
{
TRACE ( ( " dbg: R_ApplyRenderer: VID_DeInit \n " ) ) ;
2004-08-23 00:15:46 +00:00
VID_DeInit ( ) ;
2004-10-10 06:32:29 +00:00
}
TRACE ( ( " dbg: R_ApplyRenderer: SCR_DeInit \n " ) ) ;
SCR_DeInit ( ) ;
2004-08-23 00:15:46 +00:00
COM_FlushTempoaryPacks ( ) ;
2005-02-06 02:47:36 +00:00
S_Shutdown ( ) ;
2009-04-01 22:03:56 +00:00
}
qboolean R_ApplyRenderer ( rendererstate_t * newr )
{
if ( newr - > bpp = = - 1 )
return false ;
2010-02-06 01:25:04 +00:00
if ( ! newr - > renderer )
return false ;
2009-04-01 22:03:56 +00:00
R_ShutdownRenderer ( ) ;
2005-02-06 02:47:36 +00:00
2010-02-06 01:25:04 +00:00
if ( qrenderer = = QR_NONE )
2004-08-23 00:15:46 +00:00
{
2010-02-06 01:25:04 +00:00
if ( newr - > renderer - > rtype = = qrenderer )
2004-08-23 00:15:46 +00:00
return true ; //no point
Sys_CloseTerminal ( ) ;
}
R_SetRenderer ( newr - > renderer ) ;
2008-02-16 03:40:32 +00:00
return R_ApplyRenderer_Load ( newr ) ;
2007-05-25 22:16:29 +00:00
}
qboolean R_ApplyRenderer_Load ( rendererstate_t * newr )
{
int i , j ;
extern model_t * loadmodel ;
extern int host_hunklevel ;
2004-08-23 00:15:46 +00:00
Cache_Flush ( ) ;
Hunk_FreeToLowMark ( host_hunklevel ) ; //is this a good idea?
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: old renderer closed \n " ) ) ;
2004-12-15 19:40:06 +00:00
pmove . numphysent = 0 ;
2010-02-06 01:25:04 +00:00
if ( qrenderer ! = QR_NONE ) //graphics stuff only when not dedicated
2004-08-23 00:15:46 +00:00
{
qbyte * data ;
2004-11-29 01:21:00 +00:00
# ifndef CLIENTONLY
2004-08-23 00:15:46 +00:00
isDedicated = false ;
2004-11-29 01:21:00 +00:00
# endif
2007-05-25 22:16:29 +00:00
if ( newr )
Con_Printf ( " Setting mode %i*%i*%i*%i \n " , newr - > width , newr - > height , newr - > bpp , newr - > rate ) ;
2004-08-23 00:15:46 +00:00
if ( host_basepal )
BZ_Free ( host_basepal ) ;
2005-03-23 22:14:08 +00:00
if ( host_colormap )
BZ_Free ( host_colormap ) ;
2009-11-04 21:16:50 +00:00
host_basepal = ( qbyte * ) FS_LoadMallocFile ( " gfx/palette.lmp " ) ;
2004-08-23 00:15:46 +00:00
if ( ! host_basepal )
{
qbyte * pcx = NULL ;
host_basepal = BZ_Malloc ( 768 ) ;
pcx = COM_LoadTempFile ( " pics/colormap.pcx " ) ;
if ( ! pcx | | ! ReadPCXPalette ( pcx , com_filesize , host_basepal ) )
2004-11-17 18:06:06 +00:00
{
2005-01-05 08:06:55 +00:00
memcpy ( host_basepal , default_quakepal , 768 ) ;
2004-11-17 18:06:06 +00:00
}
2005-03-23 22:14:08 +00:00
else
{
host_colormap = BZ_Malloc ( 256 * VID_GRADES ) ;
if ( ReadPCXData ( pcx , com_filesize , 256 , VID_GRADES , host_colormap ) )
goto q2colormap ; //skip the colormap.lmp file as we already read it
}
2004-08-23 00:15:46 +00:00
}
2009-11-04 21:16:50 +00:00
host_colormap = ( qbyte * ) FS_LoadMallocFile ( " gfx/colormap.lmp " ) ;
2004-08-23 00:15:46 +00:00
if ( ! host_colormap )
{
2004-11-17 18:06:06 +00:00
vid . fullbright = 0 ;
2004-08-23 00:15:46 +00:00
}
else
{
j = VID_GRADES - 1 ;
data = host_colormap + j * 256 ;
vid . fullbright = 0 ;
for ( i = 255 ; i > = 0 ; i - - )
{
if ( host_colormap [ i ] = = data [ i ] )
vid . fullbright + + ;
else
break ;
}
}
2010-08-28 17:14:38 +00:00
if ( h2playertranslations )
BZ_Free ( h2playertranslations ) ;
h2playertranslations = FS_LoadMallocFile ( " gfx/player.lmp " ) ;
2004-08-23 00:15:46 +00:00
if ( vid . fullbright < 2 )
vid . fullbright = 0 ; //transparent colour doesn't count.
2005-03-23 22:14:08 +00:00
q2colormap :
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: Palette loaded \n " ) ) ;
2004-08-23 00:15:46 +00:00
2007-05-25 22:16:29 +00:00
# ifdef _WIN32
2009-04-08 08:12:29 +00:00
# ifndef _SDL
2007-05-25 22:16:29 +00:00
if ( hwnd_dialog )
2004-10-10 06:32:29 +00:00
{
2007-05-25 22:16:29 +00:00
DestroyWindow ( hwnd_dialog ) ;
hwnd_dialog = NULL ;
2004-10-10 06:32:29 +00:00
}
2009-04-08 08:12:29 +00:00
# endif
2007-05-25 22:16:29 +00:00
# endif
if ( newr )
if ( ! VID_Init ( newr , host_basepal ) )
{
return false ;
}
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: vid applied \n " ) ) ;
2004-08-23 00:15:46 +00:00
W_LoadWadFile ( " gfx.wad " ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: wad loaded \n " ) ) ;
2004-08-23 00:15:46 +00:00
Draw_Init ( ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: draw inited \n " ) ) ;
2004-08-23 00:15:46 +00:00
R_Init ( ) ;
2009-11-04 21:16:50 +00:00
R_InitParticleTexture ( ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: renderer inited \n " ) ) ;
2004-08-23 00:15:46 +00:00
SCR_Init ( ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: screen inited \n " ) ) ;
2004-08-23 00:15:46 +00:00
Sbar_Flush ( ) ;
2006-05-10 22:12:20 +00:00
IN_ReInit ( ) ;
2004-08-23 00:15:46 +00:00
}
else
{
2004-11-29 01:21:00 +00:00
# ifdef CLIENTONLY
2005-06-22 17:10:13 +00:00
Sys_Error ( " Tried setting dedicated mode \n " ) ;
//we could support this, but there's no real reason to actually do so.
//fixme: despite the checks in the setrenderer command, we can still get here via a config using vid_renderer.
2004-11-29 01:21:00 +00:00
# else
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: isDedicated = true \n " ) ) ;
2004-08-23 00:15:46 +00:00
isDedicated = true ;
if ( cls . state )
{
int os = sv . state ;
sv . state = ss_dead ; //prevents server from being killed off too.
CL_Disconnect ( ) ;
sv . state = os ;
}
Sys_InitTerminal ( ) ;
Con_PrintToSys ( ) ;
2004-11-29 01:21:00 +00:00
# endif
2004-08-23 00:15:46 +00:00
}
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: initing mods \n " ) ) ;
2004-08-23 00:15:46 +00:00
Mod_Init ( ) ;
// host_hunklevel = Hunk_LowMark();
if ( R_PreNewMap )
if ( cl . worldmodel )
2004-10-10 06:32:29 +00:00
{
TRACE ( ( " dbg: R_ApplyRenderer: R_PreNewMap (how handy) \n " ) ) ;
2004-08-23 00:15:46 +00:00
R_PreNewMap ( ) ;
2004-10-10 06:32:29 +00:00
}
2004-08-23 00:15:46 +00:00
2004-11-29 01:21:00 +00:00
# ifndef CLIENTONLY
2009-11-04 21:16:50 +00:00
if ( sv . world . worldmodel )
2004-08-23 00:15:46 +00:00
{
2009-11-04 21:16:50 +00:00
wedict_t * ent ;
2004-08-23 00:15:46 +00:00
# ifdef Q2SERVER
q2edict_t * q2ent ;
# endif
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: reloading server map \n " ) ) ;
2009-11-04 21:16:50 +00:00
sv . world . worldmodel = Mod_ForName ( sv . modelname , false ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: loaded \n " ) ) ;
2009-11-04 21:16:50 +00:00
if ( sv . world . worldmodel - > needload )
2004-08-23 00:15:46 +00:00
{
SV_Error ( " Bsp went missing on render restart \n " ) ;
}
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: doing that funky phs thang \n " ) ) ;
2004-08-23 00:15:46 +00:00
SV_CalcPHS ( ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: clearing world \n " ) ) ;
2009-11-04 21:16:50 +00:00
World_ClearWorld ( & sv . world ) ;
2004-08-23 00:15:46 +00:00
2005-03-23 22:14:08 +00:00
if ( svs . gametype = = GT_PROGS )
2004-08-23 00:15:46 +00:00
{
2005-03-23 22:14:08 +00:00
for ( i = 0 ; i < MAX_MODELS ; i + + )
{
2009-11-04 21:16:50 +00:00
if ( sv . strings . model_precache [ i ] & & * sv . strings . model_precache [ i ] & & ( ! strcmp ( sv . strings . model_precache [ i ] + strlen ( sv . strings . model_precache [ i ] ) - 4 , " .bsp " ) | | i - 1 < sv . world . worldmodel - > numsubmodels ) )
2009-11-07 13:29:15 +00:00
sv . models [ i ] = Mod_FindName ( sv . strings . model_precache [ i ] ) ;
2005-03-23 22:14:08 +00:00
else
2009-11-07 13:29:15 +00:00
sv . models [ i ] = NULL ;
2005-03-23 22:14:08 +00:00
}
2009-11-04 21:16:50 +00:00
ent = sv . world . edicts ;
2007-03-11 16:51:45 +00:00
// ent->v->model = PR_NewString(svprogfuncs, sv.worldmodel->name); //FIXME: is this a problem for normal ents?
2009-11-04 21:16:50 +00:00
for ( i = 0 ; i < sv . world . num_edicts ; i + + )
2004-08-23 00:15:46 +00:00
{
2009-11-04 21:16:50 +00:00
ent = ( wedict_t * ) EDICT_NUM ( svprogfuncs , i ) ;
2004-08-23 00:15:46 +00:00
if ( ! ent )
continue ;
if ( ent - > isfree )
continue ;
if ( ent - > area . prev )
{
ent - > area . prev = ent - > area . next = NULL ;
2009-11-04 21:16:50 +00:00
World_LinkEdict ( & sv . world , ent , false ) ; // relink ents so touch functions continue to work.
2004-08-23 00:15:46 +00:00
}
}
}
# ifdef Q2SERVER
2005-03-23 22:14:08 +00:00
else if ( svs . gametype = = GT_QUAKE2 )
2004-08-23 00:15:46 +00:00
{
2006-02-26 05:49:15 +00:00
for ( i = 0 ; i < MAX_MODELS ; i + + )
{
2009-11-04 21:16:50 +00:00
if ( sv . strings . configstring [ Q2CS_MODELS + i ] & & * sv . strings . configstring [ Q2CS_MODELS + i ] & & ( ! strcmp ( sv . strings . configstring [ Q2CS_MODELS + i ] + strlen ( sv . strings . configstring [ Q2CS_MODELS + i ] ) - 4 , " .bsp " ) | | i - 1 < sv . world . worldmodel - > numsubmodels ) )
2009-11-07 13:29:15 +00:00
sv . models [ i ] = Mod_FindName ( sv . strings . configstring [ Q2CS_MODELS + i ] ) ;
2006-02-26 05:49:15 +00:00
else
2009-11-07 13:29:15 +00:00
sv . models [ i ] = NULL ;
2006-02-26 05:49:15 +00:00
}
2005-06-15 04:44:39 +00:00
2006-02-26 05:49:15 +00:00
q2ent = ge - > edicts ;
2004-08-23 00:15:46 +00:00
for ( i = 0 ; i < ge - > num_edicts ; i + + , q2ent = ( q2edict_t * ) ( ( char * ) q2ent + ge - > edict_size ) )
{
if ( ! q2ent )
continue ;
if ( ! q2ent - > inuse )
continue ;
if ( q2ent - > area . prev )
{
q2ent - > area . prev = q2ent - > area . next = NULL ;
2009-11-04 21:16:50 +00:00
WorldQ2_LinkEdict ( & sv . world , q2ent ) ; // relink ents so touch functions continue to work.
2004-08-23 00:15:46 +00:00
}
}
}
2007-09-22 22:10:08 +00:00
# endif
2005-03-23 22:14:08 +00:00
else
SV_UnspawnServer ( ) ;
2004-08-23 00:15:46 +00:00
}
2004-11-29 01:21:00 +00:00
# endif
2004-10-26 23:06:29 +00:00
# ifdef PLUGINS
2004-10-10 06:32:29 +00:00
Plug_ResChanged ( ) ;
2004-10-26 23:06:29 +00:00
# endif
2011-01-29 19:53:38 +00:00
Cvar_ForceCallback ( & r_particlesystem ) ;
2004-08-23 00:15:46 +00:00
2011-04-30 17:21:10 +00:00
CL_InitDlights ( ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: starting on client state \n " ) ) ;
2004-08-23 00:15:46 +00:00
if ( cl . worldmodel )
{
cl . worldmodel = NULL ;
2009-11-04 21:16:50 +00:00
cl_numvisedicts = 0 ;
cl_numstrisidx = 0 ;
cl_numstrisvert = 0 ;
cl_numstris = 0 ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: reloading ALL models \n " ) ) ;
2004-08-23 00:15:46 +00:00
for ( i = 1 ; i < MAX_MODELS ; i + + )
{
if ( ! cl . model_name [ i ] [ 0 ] )
break ;
cl . model_precache [ i ] = NULL ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: reloading model %s \n " , cl . model_name [ i ] ) ) ;
2004-08-23 00:15:46 +00:00
cl . model_precache [ i ] = Mod_ForName ( cl . model_name [ i ] , false ) ;
2009-07-24 20:20:31 +00:00
if ( ! cl . model_precache [ i ] & & i = = 1 )
2004-08-23 00:15:46 +00:00
{
2005-08-03 23:14:59 +00:00
Con_Printf ( " \n The required model file '%s' could not be found. \n \n "
2004-08-23 00:15:46 +00:00
, cl . model_name [ i ] ) ;
Con_Printf ( " You may need to download or purchase a client "
" pack in order to play on this server. \n \n " ) ;
CL_Disconnect ( ) ;
2005-09-09 23:40:55 +00:00
# ifdef VM_UI
2004-08-23 00:15:46 +00:00
UI_Reset ( ) ;
2005-09-09 23:40:55 +00:00
# endif
2004-08-23 00:15:46 +00:00
return false ;
}
}
2009-07-24 20:20:31 +00:00
for ( i = 0 ; i < MAX_VWEP_MODELS ; i + + )
{
if ( * cl . model_name_vwep [ i ] )
cl . model_precache_vwep [ i ] = Mod_ForName ( cl . model_name_vwep [ i ] , false ) ;
else
cl . model_precache_vwep [ i ] = NULL ;
}
2005-08-03 23:14:59 +00:00
# ifdef CSQC_DAT
for ( i = 1 ; i < MAX_CSQCMODELS ; i + + )
{
if ( ! cl . model_csqcname [ i ] [ 0 ] )
break ;
cl . model_csqcprecache [ i ] = NULL ;
TRACE ( ( " dbg: R_ApplyRenderer: reloading csqc model %s \n " , cl . model_csqcname [ i ] ) ) ;
cl . model_csqcprecache [ i ] = Mod_ForName ( cl . model_csqcname [ i ] , false ) ;
if ( ! cl . model_csqcprecache [ i ] )
{
Con_Printf ( " \n The required model file '%s' could not be found. \n \n "
, cl . model_csqcname [ i ] ) ;
Con_Printf ( " You may need to download or purchase a client "
" pack in order to play on this server. \n \n " ) ;
CL_Disconnect ( ) ;
2005-09-09 23:40:55 +00:00
# ifdef VM_UI
2005-08-03 23:14:59 +00:00
UI_Reset ( ) ;
2005-09-09 23:40:55 +00:00
# endif
2005-08-03 23:14:59 +00:00
return false ;
}
}
# endif
2004-08-23 00:15:46 +00:00
loadmodel = cl . worldmodel = cl . model_precache [ 1 ] ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: done the models \n " ) ) ;
2004-08-23 00:15:46 +00:00
if ( loadmodel - > needload )
{
CL_Disconnect ( ) ;
2005-09-09 23:40:55 +00:00
# ifdef VM_UI
2004-08-23 00:15:46 +00:00
UI_Reset ( ) ;
2005-09-09 23:40:55 +00:00
# endif
2004-08-23 00:15:46 +00:00
memcpy ( & currentrendererstate , newr , sizeof ( currentrendererstate ) ) ;
return true ;
}
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: checking any wad textures \n " ) ) ;
2004-08-23 00:15:46 +00:00
Mod_NowLoadExternal ( ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: R_NewMap \n " ) ) ;
2004-08-23 00:15:46 +00:00
R_NewMap ( ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: efrags \n " ) ) ;
2004-08-23 00:15:46 +00:00
for ( i = 0 ; i < cl . num_statics ; i + + ) //make the static entities reappear.
{
Fixes, workarounds, and breakages. Hexen2 should work much better (-hexen2 says no mission pack, -portals says h2mp). Started working on splitting bigcoords per client, far too much work still to go on that. Removed gl_ztrick entirely. Enabled csprogs download by default. Added client support for fitzquake's 666 protocol, needs testing, some cleanup for dp protocols too, no server support, couldn't selectively enable it anyway. Now attempting to cache shadow meshes for explosions and stuff. Played with lightmaps a little, should potentially run a little faster on certain (intel?) cards. Tweeked npfte a little to try to avoid deadlocks and crashes. Fixed sky worldspawn parsing. Added h2mp's model format. Fixed baseline issue in q2 client, made servers generate q2 baselines. MOVETYPE_PUSH will not rotate extra if rotation is forced. Made status command show allowed client types. Changed lighting on weapons - should now be shaded.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3572 fc73d0e0-1445-4013-8a0c-d673dee63da5
2010-08-11 03:36:31 +00:00
cl_static_entities [ i ] . ent . model = NULL ;
if ( cl_static_entities [ i ] . mdlidx < 0 )
{
if ( cl_static_entities [ i ] . mdlidx > - MAX_CSQCMODELS )
cl_static_entities [ i ] . ent . model = cl . model_csqcprecache [ - cl_static_entities [ i ] . mdlidx ] ;
}
else
{
if ( cl_static_entities [ i ] . mdlidx < MAX_MODELS )
cl_static_entities [ i ] . ent . model = cl . model_precache [ cl_static_entities [ i ] . mdlidx ] ;
}
2004-08-23 00:15:46 +00:00
}
Fixes, workarounds, and breakages. Hexen2 should work much better (-hexen2 says no mission pack, -portals says h2mp). Started working on splitting bigcoords per client, far too much work still to go on that. Removed gl_ztrick entirely. Enabled csprogs download by default. Added client support for fitzquake's 666 protocol, needs testing, some cleanup for dp protocols too, no server support, couldn't selectively enable it anyway. Now attempting to cache shadow meshes for explosions and stuff. Played with lightmaps a little, should potentially run a little faster on certain (intel?) cards. Tweeked npfte a little to try to avoid deadlocks and crashes. Fixed sky worldspawn parsing. Added h2mp's model format. Fixed baseline issue in q2 client, made servers generate q2 baselines. MOVETYPE_PUSH will not rotate extra if rotation is forced. Made status command show allowed client types. Changed lighting on weapons - should now be shaded.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3572 fc73d0e0-1445-4013-8a0c-d673dee63da5
2010-08-11 03:36:31 +00:00
Skin_FlushPlayers ( ) ;
2004-08-23 00:15:46 +00:00
}
else
2010-12-05 02:46:07 +00:00
{
# ifdef VM_UI
2004-08-23 00:15:46 +00:00
UI_Reset ( ) ;
2005-09-09 23:40:55 +00:00
# endif
2010-12-05 02:46:07 +00:00
}
2004-08-23 00:15:46 +00:00
switch ( qrenderer )
{
case QR_NONE :
Con_Printf ( " \n "
" ----------------------------- \n "
" Dedicated console created \n " ) ;
break ;
case QR_OPENGL :
Con_Printf ( " \n "
" ----------------------------- \n "
" OpenGL renderer initialized \n " ) ;
break ;
2009-04-08 08:12:29 +00:00
2007-05-25 22:16:29 +00:00
case QR_DIRECT3D :
Con_Printf ( " \n "
" ----------------------------- \n "
" Direct3d renderer initialized \n " ) ;
break ;
2004-08-23 00:15:46 +00:00
}
2005-06-15 04:44:39 +00:00
2005-06-04 04:20:20 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: S_Restart_f \n " ) ) ;
2005-02-06 02:47:36 +00:00
if ( ! isDedicated )
2005-06-18 23:52:42 +00:00
S_DoRestart ( ) ;
2004-08-23 00:15:46 +00:00
2005-06-04 04:20:20 +00:00
TRACE ( ( " dbg: R_ApplyRenderer: done \n " ) ) ;
2007-05-25 22:16:29 +00:00
if ( newr )
memcpy ( & currentrendererstate , newr , sizeof ( currentrendererstate ) ) ;
2004-08-23 00:15:46 +00:00
return true ;
}
2009-07-17 23:11:34 +00:00
# define DEFAULT_WIDTH 640
# define DEFAULT_HEIGHT 480
# define DEFAULT_BPP 32
2004-08-23 00:15:46 +00:00
void R_RestartRenderer_f ( void )
{
2005-06-22 17:10:13 +00:00
int i , j ;
2004-08-23 00:15:46 +00:00
rendererstate_t oldr ;
rendererstate_t newr ;
2010-07-12 22:46:37 +00:00
M_Shutdown ( ) ;
2004-08-23 00:15:46 +00:00
memset ( & newr , 0 , sizeof ( newr ) ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_RestartRenderer_f \n " ) ) ;
2004-08-23 00:15:46 +00:00
Media_CaptureDemoEnd ( ) ;
Cvar_ApplyLatches ( CVAR_RENDERERLATCH ) ;
2005-01-26 18:56:49 +00:00
newr . width = vid_width . value ;
newr . height = vid_height . value ;
2004-08-23 00:15:46 +00:00
2006-03-15 20:48:48 +00:00
newr . multisample = vid_multisample . value ;
2004-08-23 00:15:46 +00:00
newr . bpp = vid_bpp . value ;
newr . fullscreen = vid_fullscreen . value ;
newr . rate = vid_refreshrate . value ;
2006-04-15 03:31:23 +00:00
2010-11-06 23:05:29 +00:00
if ( ! * _vid_wait_override . string | | _vid_wait_override . value < 0 )
newr . wait = - 1 ;
2011-01-28 05:39:40 +00:00
else
2010-11-06 23:05:29 +00:00
newr . wait = _vid_wait_override . value ;
2004-08-23 00:15:46 +00:00
Q_strncpyz ( newr . glrenderer , gl_driver . string , sizeof ( newr . glrenderer ) ) ;
2005-02-06 02:47:36 +00:00
2010-02-06 01:25:04 +00:00
newr . renderer = NULL ;
2005-06-22 17:10:13 +00:00
for ( i = 0 ; i < sizeof ( rendererinfo ) / sizeof ( rendererinfo [ 0 ] ) ; i + + )
2004-08-23 00:15:46 +00:00
{
2009-11-04 21:16:50 +00:00
if ( ! rendererinfo [ i ] - > description )
2005-06-22 17:10:13 +00:00
continue ; //not valid in this build. :(
for ( j = 4 - 1 ; j > = 0 ; j - - )
{
2009-11-04 21:16:50 +00:00
if ( ! rendererinfo [ i ] - > name [ j ] )
2005-06-22 17:10:13 +00:00
continue ;
2009-11-04 21:16:50 +00:00
if ( ! stricmp ( rendererinfo [ i ] - > name [ j ] , vid_renderer . string ) )
2005-06-22 17:10:13 +00:00
{
2010-02-06 01:25:04 +00:00
newr . renderer = rendererinfo [ i ] ;
2005-06-22 17:10:13 +00:00
break ;
}
}
}
2010-02-06 01:25:04 +00:00
if ( ! newr . renderer )
2005-06-22 17:10:13 +00:00
{
2011-04-30 17:21:10 +00:00
Con_Printf ( " vid_renderer unset or unsupported. Using default. \n " ) ;
2004-08-23 00:15:46 +00:00
//gotta do this after main hunk is saved off.
2009-11-04 21:16:50 +00:00
# if defined(GLQUAKE)
2004-08-23 00:15:46 +00:00
Cmd_ExecuteString ( " setrenderer gl \n " , RESTRICT_LOCAL ) ;
2007-05-25 22:16:29 +00:00
# elif defined(D3DQUAKE)
2010-11-02 23:17:25 +00:00
Cmd_ExecuteString ( " setrenderer d3d \n " , RESTRICT_LOCAL ) ;
2004-08-23 00:15:46 +00:00
# endif
return ;
}
2006-04-15 03:31:23 +00:00
// use desktop settings if set to 0 and not dedicated
2010-02-06 01:25:04 +00:00
if ( newr . renderer - > rtype ! = QR_NONE )
2006-04-15 03:31:23 +00:00
{
int dbpp , dheight , dwidth , drate ;
2009-07-17 23:11:34 +00:00
if ( ( ! newr . fullscreen & & ! vid_desktopsettings . value ) | | ! Sys_GetDesktopParameters ( & dwidth , & dheight , & dbpp , & drate ) )
2006-04-15 03:31:23 +00:00
{
// force default values for systems not supporting desktop parameters
2009-07-17 23:11:34 +00:00
dwidth = DEFAULT_WIDTH ;
dheight = DEFAULT_HEIGHT ;
dbpp = DEFAULT_BPP ;
drate = 0 ;
2006-04-15 03:31:23 +00:00
}
if ( vid_desktopsettings . value )
{
newr . width = dwidth ;
newr . height = dheight ;
newr . bpp = dbpp ;
newr . rate = drate ;
}
else
{
if ( newr . width < = 0 | | newr . height < = 0 )
{
newr . width = dwidth ;
newr . height = dheight ;
}
if ( newr . bpp < = 0 )
newr . bpp = dbpp ;
}
}
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_RestartRenderer_f renderer %i \n " , newr . renderer ) ) ;
2004-08-23 00:15:46 +00:00
memcpy ( & oldr , & currentrendererstate , sizeof ( rendererstate_t ) ) ;
if ( ! R_ApplyRenderer ( & newr ) )
{
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_RestartRenderer_f failed \n " ) ) ;
2004-08-23 00:15:46 +00:00
if ( R_ApplyRenderer ( & oldr ) )
2004-10-10 06:32:29 +00:00
{
TRACE ( ( " dbg: R_RestartRenderer_f old restored \n " ) ) ;
2007-09-23 15:28:06 +00:00
Con_Printf ( CON_ERROR " Video mode switch failed. Old mode restored. \n " ) ; //go back to the old mode, the new one failed.
2004-10-10 06:32:29 +00:00
}
2004-08-23 00:15:46 +00:00
else
{
2006-04-06 22:07:34 +00:00
qboolean failed = true ;
if ( newr . rate ! = 0 )
{
2007-09-23 15:28:06 +00:00
Con_Printf ( CON_NOTICE " Trying default refresh rate \n " ) ;
2006-04-06 22:07:34 +00:00
newr . rate = 0 ;
failed = ! R_ApplyRenderer ( & newr ) ;
}
2009-07-17 23:11:34 +00:00
if ( failed & & newr . width ! = DEFAULT_WIDTH & & newr . height ! = DEFAULT_HEIGHT )
2008-02-16 03:40:32 +00:00
{
2009-07-17 23:11:34 +00:00
Con_Printf ( CON_NOTICE " Trying %i*%i \n " , DEFAULT_WIDTH , DEFAULT_HEIGHT ) ;
newr . width = DEFAULT_WIDTH ;
newr . height = DEFAULT_HEIGHT ;
2008-02-16 03:40:32 +00:00
failed = ! R_ApplyRenderer ( & newr ) ;
}
2006-04-06 22:07:34 +00:00
if ( failed )
2004-10-10 06:32:29 +00:00
{
2010-02-06 01:25:04 +00:00
newr . renderer = & dedicatedrendererinfo ;
2006-01-21 05:08:08 +00:00
if ( R_ApplyRenderer ( & newr ) )
2006-01-16 13:47:56 +00:00
{
2006-01-21 05:08:08 +00:00
TRACE ( ( " dbg: R_RestartRenderer_f going to dedicated \n " ) ) ;
2008-02-16 03:40:32 +00:00
Con_Printf ( CON_ERROR " Video mode switch failed. Old mode wasn't supported either. Console forced. \n \n Change the following vars to something useable, and then use the setrenderer command. \n " ) ;
Con_Printf ( " %s: %s \n " , vid_width . name , vid_width . string ) ;
Con_Printf ( " %s: %s \n " , vid_height . name , vid_height . string ) ;
Con_Printf ( " %s: %s \n " , vid_bpp . name , vid_bpp . string ) ;
Con_Printf ( " %s: %s \n " , vid_refreshrate . name , vid_refreshrate . string ) ;
Con_Printf ( " %s: %s \n " , vid_renderer . name , vid_renderer . string ) ;
2006-01-21 05:08:08 +00:00
}
else
Sys_Error ( " Couldn't fall back to previous renderer \n " ) ;
2004-10-10 06:32:29 +00:00
}
2004-08-23 00:15:46 +00:00
}
}
2006-04-12 00:17:02 +00:00
Cvar_ApplyCallbacks ( CVAR_RENDERERCALLBACK ) ;
2004-12-15 19:40:06 +00:00
SCR_EndLoadingPlaque ( ) ;
2004-10-10 06:32:29 +00:00
TRACE ( ( " dbg: R_RestartRenderer_f success \n " ) ) ;
2010-07-12 22:46:37 +00:00
M_Reinit ( ) ;
2004-08-23 00:15:46 +00:00
}
void R_SetRenderer_f ( void )
{
2005-06-22 17:10:13 +00:00
int i , j ;
int best ;
char * param = Cmd_Argv ( 1 ) ;
if ( Cmd_Argc ( ) = = 1 | | ! stricmp ( param , " help " ) )
2004-08-23 00:15:46 +00:00
{
2005-06-22 17:10:13 +00:00
Con_Printf ( " \n Valid setrenderer parameters are: \n " ) ;
for ( i = 0 ; i < sizeof ( rendererinfo ) / sizeof ( rendererinfo [ 0 ] ) ; i + + )
{
2009-11-04 21:16:50 +00:00
if ( rendererinfo [ i ] - > description )
Con_Printf ( " %s: %s \n " , rendererinfo [ i ] - > name [ 0 ] , rendererinfo [ i ] - > description ) ;
2005-06-22 17:10:13 +00:00
}
2004-08-23 00:15:46 +00:00
return ;
}
2005-06-22 17:10:13 +00:00
best = - 1 ;
for ( i = 0 ; i < sizeof ( rendererinfo ) / sizeof ( rendererinfo [ 0 ] ) ; i + + )
2004-08-23 00:15:46 +00:00
{
2009-11-04 21:16:50 +00:00
if ( ! rendererinfo [ i ] - > description )
2005-06-22 17:10:13 +00:00
continue ; //not valid in this build. :(
for ( j = 4 - 1 ; j > = 0 ; j - - )
2004-08-23 00:15:46 +00:00
{
2009-11-04 21:16:50 +00:00
if ( ! rendererinfo [ i ] - > name [ j ] )
2005-06-22 17:10:13 +00:00
continue ;
2009-11-04 21:16:50 +00:00
if ( ! stricmp ( rendererinfo [ i ] - > name [ j ] , param ) )
2004-08-23 00:15:46 +00:00
{
2005-06-22 17:10:13 +00:00
best = i ;
2004-08-23 00:15:46 +00:00
break ;
}
}
}
2005-06-15 04:44:39 +00:00
2005-06-22 17:10:13 +00:00
# ifdef CLIENTONLY
if ( best = = 0 )
2004-08-23 00:15:46 +00:00
{
2005-06-22 17:10:13 +00:00
Con_Printf ( " Client-only builds cannot use dedicated modes. \n " ) ;
return ;
2004-08-23 00:15:46 +00:00
}
2005-06-22 17:10:13 +00:00
# endif
if ( best = = - 1 )
2004-08-23 00:15:46 +00:00
{
2005-06-22 17:10:13 +00:00
Con_Printf ( " setrenderer: parameter not supported (%s) \n " , param ) ;
2004-08-23 00:15:46 +00:00
return ;
}
else
{
2005-06-22 17:10:13 +00:00
if ( Cmd_Argc ( ) = = 3 )
Cvar_Set ( & vid_bpp , Cmd_Argv ( 2 ) ) ;
2004-08-23 00:15:46 +00:00
}
2005-06-22 17:10:13 +00:00
Cvar_Set ( & vid_renderer , param ) ;
R_RestartRenderer_f ( ) ;
2004-08-23 00:15:46 +00:00
}
2007-05-25 22:16:29 +00:00
/*
= = = = = = = = = = = = = = = =
R_GetSpriteFrame
= = = = = = = = = = = = = = = =
*/
mspriteframe_t * R_GetSpriteFrame ( entity_t * currententity )
{
msprite_t * psprite ;
mspritegroup_t * pspritegroup ;
mspriteframe_t * pspriteframe ;
int i , numframes , frame ;
float * pintervals , fullinterval , targettime , time ;
psprite = currententity - > model - > cache . data ;
2008-12-23 02:55:20 +00:00
frame = currententity - > framestate . g [ FS_REG ] . frame [ 0 ] ;
2007-05-25 22:16:29 +00:00
if ( ( frame > = psprite - > numframes ) | | ( frame < 0 ) )
{
Con_DPrintf ( " R_DrawSprite: no such frame %d (%s) \n " , frame , currententity - > model - > name ) ;
frame = 0 ;
}
if ( psprite - > frames [ frame ] . type = = SPR_SINGLE )
{
pspriteframe = psprite - > frames [ frame ] . frameptr ;
}
else if ( psprite - > frames [ frame ] . type = = SPR_ANGLED )
{
pspritegroup = ( mspritegroup_t * ) psprite - > frames [ frame ] . frameptr ;
pspriteframe = pspritegroup - > frames [ ( int ) ( ( r_refdef . viewangles [ 1 ] - currententity - > angles [ 1 ] ) / 360 * 8 + 0.5 - 4 ) & 7 ] ;
}
else
{
pspritegroup = ( mspritegroup_t * ) psprite - > frames [ frame ] . frameptr ;
pintervals = pspritegroup - > intervals ;
numframes = pspritegroup - > numframes ;
fullinterval = pintervals [ numframes - 1 ] ;
2008-12-23 02:55:20 +00:00
time = currententity - > framestate . g [ FS_REG ] . frametime [ 0 ] ;
2007-05-25 22:16:29 +00:00
// when loading in Mod_LoadSpriteGroup, we guaranteed all interval values
// are positive, so we don't have to worry about division by 0
targettime = time - ( ( int ) ( time / fullinterval ) ) * fullinterval ;
for ( i = 0 ; i < ( numframes - 1 ) ; i + + )
{
if ( pintervals [ i ] > targettime )
break ;
}
pspriteframe = pspritegroup - > frames [ i ] ;
}
return pspriteframe ;
}
2010-07-11 02:22:39 +00:00
/*
2007-05-25 22:16:29 +00:00
void MYgluPerspective ( double fovx , double fovy , double zNear , double zFar )
{
2010-07-11 02:22:39 +00:00
Matrix4_Projection_Far ( r_refdef . m_projection , fovx , fovy , zNear , zFar ) ;
2007-05-25 22:16:29 +00:00
}
void GL_InfinatePerspective ( double fovx , double fovy ,
double zNear )
{
// nudge infinity in just slightly for lsb slop
float nudge = 1 ; // - 1.0 / (1<<23);
double xmin , xmax , ymin , ymax ;
ymax = zNear * tan ( fovy * M_PI / 360.0 ) ;
ymin = - ymax ;
xmax = zNear * tan ( fovx * M_PI / 360.0 ) ;
xmin = - xmax ;
r_projection_matrix [ 0 ] = ( 2 * zNear ) / ( xmax - xmin ) ;
r_projection_matrix [ 4 ] = 0 ;
r_projection_matrix [ 8 ] = ( xmax + xmin ) / ( xmax - xmin ) ;
r_projection_matrix [ 12 ] = 0 ;
r_projection_matrix [ 1 ] = 0 ;
r_projection_matrix [ 5 ] = ( 2 * zNear ) / ( ymax - ymin ) ;
r_projection_matrix [ 9 ] = ( ymax + ymin ) / ( ymax - ymin ) ;
r_projection_matrix [ 13 ] = 0 ;
r_projection_matrix [ 2 ] = 0 ;
r_projection_matrix [ 6 ] = 0 ;
r_projection_matrix [ 10 ] = - 1 * nudge ;
r_projection_matrix [ 14 ] = - 2 * zNear * nudge ;
2009-04-08 08:12:29 +00:00
2007-05-25 22:16:29 +00:00
r_projection_matrix [ 3 ] = 0 ;
r_projection_matrix [ 7 ] = 0 ;
r_projection_matrix [ 11 ] = - 1 ;
r_projection_matrix [ 15 ] = 0 ;
}
void GL_ParallelPerspective ( double xmin , double xmax , double ymax , double ymin ,
double znear , double zfar )
{
r_projection_matrix [ 0 ] = 2 / ( xmax - xmin ) ;
r_projection_matrix [ 4 ] = 0 ;
r_projection_matrix [ 8 ] = 0 ;
r_projection_matrix [ 12 ] = ( xmax + xmin ) / ( xmax - xmin ) ;
r_projection_matrix [ 1 ] = 0 ;
r_projection_matrix [ 5 ] = 2 / ( ymax - ymin ) ;
r_projection_matrix [ 9 ] = 0 ;
r_projection_matrix [ 13 ] = ( ymax + ymin ) / ( ymax - ymin ) ;
r_projection_matrix [ 2 ] = 0 ;
r_projection_matrix [ 6 ] = 0 ;
r_projection_matrix [ 10 ] = - 2 / ( zfar - znear ) ;
r_projection_matrix [ 14 ] = ( zfar + znear ) / ( zfar - znear ) ;
2009-04-08 08:12:29 +00:00
2007-05-25 22:16:29 +00:00
r_projection_matrix [ 3 ] = 0 ;
r_projection_matrix [ 7 ] = 0 ;
r_projection_matrix [ 11 ] = 0 ;
r_projection_matrix [ 15 ] = 1 ;
}
2010-07-11 02:22:39 +00:00
*/
2007-05-25 22:16:29 +00:00
/*
= = = = = = = = = = = = = = =
R_TextureAnimation
Returns the proper texture for a given time and base texture
= = = = = = = = = = = = = = =
*/
2010-08-28 17:14:38 +00:00
texture_t * R_TextureAnimation ( int frame , texture_t * base )
2007-05-25 22:16:29 +00:00
{
int reletive ;
int count ;
2010-08-28 17:14:38 +00:00
if ( frame )
2007-05-25 22:16:29 +00:00
{
if ( base - > alternate_anims )
base = base - > alternate_anims ;
}
2009-04-08 08:12:29 +00:00
2007-05-25 22:16:29 +00:00
if ( ! base - > anim_total )
return base ;
reletive = ( int ) ( cl . time * 10 ) % base - > anim_total ;
2009-04-08 08:12:29 +00:00
count = 0 ;
2007-05-25 22:16:29 +00:00
while ( base - > anim_min > reletive | | base - > anim_max < = reletive )
{
base = base - > anim_next ;
if ( ! base )
Sys_Error ( " R_TextureAnimation: broken cycle " ) ;
if ( + + count > 100 )
Sys_Error ( " R_TextureAnimation: infinite cycle " ) ;
}
return base ;
}
2007-05-25 23:03:49 +00:00
mleaf_t * r_viewleaf , * r_oldviewleaf ;
mleaf_t * r_viewleaf2 , * r_oldviewleaf2 ;
int r_viewcluster , r_viewcluster2 , r_oldviewcluster , r_oldviewcluster2 ;
int r_visframecount ;
mleaf_t * r_vischain ; // linked list of visible leafs
2009-11-04 21:16:50 +00:00
static qbyte curframevis [ MAX_MAP_LEAFS / 8 ] ;
2007-05-25 22:16:29 +00:00
/*
= = = = = = = = = = = = = = =
R_MarkLeaves
= = = = = = = = = = = = = = =
*/
2009-03-03 01:52:30 +00:00
# ifdef Q3BSPS
2009-11-04 21:16:50 +00:00
qbyte * R_MarkLeaves_Q3 ( void )
2007-05-25 22:16:29 +00:00
{
2009-11-04 21:16:50 +00:00
static qbyte * vis ;
2007-05-25 22:16:29 +00:00
int i ;
2009-03-03 01:52:30 +00:00
int cluster ;
mleaf_t * leaf ;
if ( r_oldviewcluster = = r_viewcluster & & ! r_novis . value & & r_viewcluster ! = - 1 )
2009-11-04 21:16:50 +00:00
return vis ;
2007-05-25 22:16:29 +00:00
2009-03-03 01:52:30 +00:00
// development aid to let you run around and see exactly where
// the pvs ends
2007-05-25 22:16:29 +00:00
// if (r_lockpvs->value)
// return;
2009-03-03 01:52:30 +00:00
r_vischain = NULL ;
r_visframecount + + ;
r_oldviewcluster = r_viewcluster ;
2007-05-25 22:16:29 +00:00
2010-05-01 22:47:47 +00:00
if ( r_novis . ival | | r_viewcluster = = - 1 | | ! cl . worldmodel - > vis )
2009-03-03 01:52:30 +00:00
{
// mark everything
for ( i = 0 , leaf = cl . worldmodel - > leafs ; i < cl . worldmodel - > numleafs ; i + + , leaf + + )
2007-05-25 22:16:29 +00:00
{
2009-03-03 01:52:30 +00:00
if ( ! leaf - > nummarksurfaces )
2007-05-25 22:16:29 +00:00
{
2009-03-03 01:52:30 +00:00
continue ;
2007-05-25 22:16:29 +00:00
}
2009-03-03 01:52:30 +00:00
leaf - > visframe = r_visframecount ;
leaf - > vischain = r_vischain ;
r_vischain = leaf ;
}
}
else
{
2009-11-04 21:16:50 +00:00
vis = CM_ClusterPVS ( cl . worldmodel , r_viewcluster , curframevis , sizeof ( curframevis ) ) ;
2007-05-25 22:16:29 +00:00
for ( i = 0 , leaf = cl . worldmodel - > leafs ; i < cl . worldmodel - > numleafs ; i + + , leaf + + )
{
cluster = leaf - > cluster ;
2009-03-03 01:52:30 +00:00
if ( cluster = = - 1 | | ! leaf - > nummarksurfaces )
{
2007-05-25 22:16:29 +00:00
continue ;
}
2009-03-03 01:52:30 +00:00
if ( vis [ cluster > > 3 ] & ( 1 < < ( cluster & 7 ) ) )
{
2007-05-25 22:16:29 +00:00
leaf - > visframe = r_visframecount ;
leaf - > vischain = r_vischain ;
r_vischain = leaf ;
}
}
}
2009-11-04 21:16:50 +00:00
return vis ;
2009-03-03 01:52:30 +00:00
}
2007-05-25 22:16:29 +00:00
# endif
# ifdef Q2BSPS
2009-11-04 21:16:50 +00:00
qbyte * R_MarkLeaves_Q2 ( void )
2009-03-03 01:52:30 +00:00
{
2009-11-04 21:16:50 +00:00
static qbyte * vis ;
2009-03-03 01:52:30 +00:00
mnode_t * node ;
int i ;
int cluster ;
mleaf_t * leaf ;
2009-11-04 21:16:50 +00:00
int c ;
2007-05-25 22:16:29 +00:00
2009-11-04 21:16:50 +00:00
if ( r_oldviewcluster = = r_viewcluster & & r_oldviewcluster2 = = r_viewcluster2 )
return vis ;
2007-05-25 22:16:29 +00:00
2009-11-04 21:16:50 +00:00
r_oldviewcluster = r_viewcluster ;
r_oldviewcluster2 = r_viewcluster2 ;
2007-05-25 22:16:29 +00:00
2010-05-01 22:47:47 +00:00
if ( r_novis . ival = = 2 )
2009-11-04 21:16:50 +00:00
return vis ;
r_visframecount + + ;
2010-05-01 22:47:47 +00:00
if ( r_novis . ival | | r_viewcluster = = - 1 | | ! cl . worldmodel - > vis )
2009-11-04 21:16:50 +00:00
{
// mark everything
for ( i = 0 ; i < cl . worldmodel - > numleafs ; i + + )
cl . worldmodel - > leafs [ i ] . visframe = r_visframecount ;
for ( i = 0 ; i < cl . worldmodel - > numnodes ; i + + )
cl . worldmodel - > nodes [ i ] . visframe = r_visframecount ;
return vis ;
}
vis = CM_ClusterPVS ( cl . worldmodel , r_viewcluster , curframevis , sizeof ( curframevis ) ) ;
// may have to combine two clusters because of solid water boundaries
if ( r_viewcluster2 ! = r_viewcluster )
{
vis = CM_ClusterPVS ( cl . worldmodel , r_viewcluster2 , NULL , sizeof ( curframevis ) ) ;
c = ( cl . worldmodel - > numleafs + 31 ) / 32 ;
for ( i = 0 ; i < c ; i + + )
( ( int * ) curframevis ) [ i ] | = ( ( int * ) vis ) [ i ] ;
vis = curframevis ;
}
for ( i = 0 , leaf = cl . worldmodel - > leafs ; i < cl . worldmodel - > numleafs ; i + + , leaf + + )
{
cluster = leaf - > cluster ;
if ( cluster = = - 1 )
continue ;
if ( vis [ cluster > > 3 ] & ( 1 < < ( cluster & 7 ) ) )
2007-05-25 22:16:29 +00:00
{
2009-11-04 21:16:50 +00:00
node = ( mnode_t * ) leaf ;
do
{
if ( node - > visframe = = r_visframecount )
break ;
node - > visframe = r_visframecount ;
node = node - > parent ;
} while ( node ) ;
2007-05-25 22:16:29 +00:00
}
2009-11-04 21:16:50 +00:00
}
return vis ;
}
# endif
qbyte * R_CalcVis_Q1 ( void )
{
unsigned int i ;
static qbyte * vis ;
r_visframecount + + ;
if ( r_oldviewleaf = = r_viewleaf & & r_oldviewleaf2 = = r_viewleaf2 )
{
}
else
{
r_oldviewleaf = r_viewleaf ;
r_oldviewleaf2 = r_viewleaf2 ;
2007-05-25 22:16:29 +00:00
2010-05-01 22:47:47 +00:00
if ( r_novis . ival & 1 )
2007-05-25 22:16:29 +00:00
{
2009-11-04 21:16:50 +00:00
vis = curframevis ;
memset ( vis , 0xff , ( cl . worldmodel - > numleafs + 7 ) > > 3 ) ;
2007-05-25 22:16:29 +00:00
}
2009-11-04 21:16:50 +00:00
else if ( r_viewleaf2 & & r_viewleaf2 ! = r_viewleaf )
2007-05-25 22:16:29 +00:00
{
2009-11-04 21:16:50 +00:00
int c ;
Q1BSP_LeafPVS ( cl . worldmodel , r_viewleaf2 , curframevis , sizeof ( curframevis ) ) ;
vis = Q1BSP_LeafPVS ( cl . worldmodel , r_viewleaf , NULL , sizeof ( curframevis ) ) ;
c = ( cl . worldmodel - > numleafs + 31 ) / 32 ;
for ( i = 0 ; i < c ; i + + )
( ( int * ) curframevis ) [ i ] | = ( ( int * ) vis ) [ i ] ;
vis = curframevis ;
2007-05-25 22:16:29 +00:00
}
2009-11-04 21:16:50 +00:00
else
vis = Q1BSP_LeafPVS ( cl . worldmodel , r_viewleaf , curframevis , sizeof ( curframevis ) ) ;
2007-05-25 22:16:29 +00:00
}
2009-11-04 21:16:50 +00:00
return vis ;
}
2007-05-25 22:16:29 +00:00
2009-11-04 21:16:50 +00:00
qbyte * R_MarkLeaves_Q1 ( void )
2009-03-03 01:52:30 +00:00
{
2011-04-30 17:21:10 +00:00
static qbyte fatvis [ MAX_MAP_LEAFS / 8 ] ;
2009-11-04 21:16:50 +00:00
static qbyte * vis ;
2009-03-03 01:52:30 +00:00
mnode_t * node ;
int i ;
qbyte solid [ 4096 ] ;
2010-05-01 22:47:47 +00:00
if ( ( ( r_oldviewleaf = = r_viewleaf & & r_oldviewleaf2 = = r_viewleaf2 ) & & ! r_novis . ival ) | | r_novis . ival & 2 )
2009-11-04 21:16:50 +00:00
return vis ;
2009-04-08 08:12:29 +00:00
2007-05-25 22:16:29 +00:00
r_visframecount + + ;
r_oldviewleaf = r_viewleaf ;
r_oldviewleaf2 = r_viewleaf2 ;
2009-11-04 21:16:50 +00:00
if ( r_novis . ival )
2007-05-25 22:16:29 +00:00
{
vis = solid ;
memset ( solid , 0xff , ( cl . worldmodel - > numleafs + 7 ) > > 3 ) ;
}
2009-03-03 01:52:30 +00:00
else if ( r_viewleaf2 & & r_viewleaf2 ! = r_viewleaf )
2007-05-25 22:16:29 +00:00
{
int c ;
2009-07-11 20:56:09 +00:00
Q1BSP_LeafPVS ( cl . worldmodel , r_viewleaf2 , fatvis , sizeof ( fatvis ) ) ;
vis = Q1BSP_LeafPVS ( cl . worldmodel , r_viewleaf , NULL , 0 ) ;
2007-05-25 22:16:29 +00:00
c = ( cl . worldmodel - > numleafs + 31 ) / 32 ;
for ( i = 0 ; i < c ; i + + )
( ( int * ) fatvis ) [ i ] | = ( ( int * ) vis ) [ i ] ;
vis = fatvis ;
}
else
2011-04-30 17:21:10 +00:00
{
vis = Q1BSP_LeafPVS ( cl . worldmodel , r_viewleaf , fatvis , sizeof ( fatvis ) ) ;
}
2009-04-08 08:12:29 +00:00
2007-05-25 22:16:29 +00:00
for ( i = 0 ; i < cl . worldmodel - > numleafs ; i + + )
{
if ( vis [ i > > 3 ] & ( 1 < < ( i & 7 ) ) )
{
node = ( mnode_t * ) & cl . worldmodel - > leafs [ i + 1 ] ;
do
{
if ( node - > visframe = = r_visframecount )
break ;
node - > visframe = r_visframecount ;
node = node - > parent ;
} while ( node ) ;
}
}
2009-11-04 21:16:50 +00:00
return vis ;
2007-05-25 22:16:29 +00:00
}
mplane_t frustum [ 4 ] ;
/*
= = = = = = = = = = = = = = = = =
R_CullBox
Returns true if the box is completely outside the frustom
= = = = = = = = = = = = = = = = =
*/
qboolean R_CullBox ( vec3_t mins , vec3_t maxs )
{
int i ;
for ( i = 0 ; i < 4 ; i + + )
if ( BOX_ON_PLANE_SIDE ( mins , maxs , & frustum [ i ] ) = = 2 )
return true ;
return false ;
}
qboolean R_CullSphere ( vec3_t org , float radius )
{
//four frustrum planes all point inwards in an expanding 'cone'.
int i ;
float d ;
for ( i = 0 ; i < 4 ; i + + )
{
d = DotProduct ( frustum [ i ] . normal , org ) - frustum [ i ] . dist ;
if ( d < = - radius )
return true ;
}
return false ;
}
qboolean R_CullEntityBox ( entity_t * e , vec3_t modmins , vec3_t modmaxs )
{
int i ;
vec3_t wmin , wmax ;
Fixes, workarounds, and breakages. Hexen2 should work much better (-hexen2 says no mission pack, -portals says h2mp). Started working on splitting bigcoords per client, far too much work still to go on that. Removed gl_ztrick entirely. Enabled csprogs download by default. Added client support for fitzquake's 666 protocol, needs testing, some cleanup for dp protocols too, no server support, couldn't selectively enable it anyway. Now attempting to cache shadow meshes for explosions and stuff. Played with lightmaps a little, should potentially run a little faster on certain (intel?) cards. Tweeked npfte a little to try to avoid deadlocks and crashes. Fixed sky worldspawn parsing. Added h2mp's model format. Fixed baseline issue in q2 client, made servers generate q2 baselines. MOVETYPE_PUSH will not rotate extra if rotation is forced. Made status command show allowed client types. Changed lighting on weapons - should now be shaded.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3572 fc73d0e0-1445-4013-8a0c-d673dee63da5
2010-08-11 03:36:31 +00:00
# if 1
float mrad = 0 , v ;
for ( i = 0 ; i < 3 ; i + + )
{
v = fabs ( modmins [ i ] ) ;
if ( mrad < v )
mrad = v ;
v = fabs ( modmaxs [ i ] ) ;
if ( mrad < v )
mrad = v ;
}
for ( i = 0 ; i < 3 ; i + + )
{
wmin [ i ] = e - > origin [ i ] - mrad ;
wmax [ i ] = e - > origin [ i ] + mrad ;
}
# else
2007-05-25 22:16:29 +00:00
float fmin , fmax ;
//convert the model's bbox to the expanded maximum size of the entity, as drawn with this model.
//The result is an axial box, which we pass to R_CullBox
for ( i = 0 ; i < 3 ; i + + )
{
fmin = DotProduct ( modmins , e - > axis [ i ] ) ;
fmax = DotProduct ( modmaxs , e - > axis [ i ] ) ;
if ( fmin > - 16 )
fmin = - 16 ;
if ( fmax < 16 )
fmax = 16 ;
if ( fmin < fmax )
{
wmin [ i ] = e - > origin [ i ] + fmin ;
wmax [ i ] = e - > origin [ i ] + fmax ;
}
else
{ //box went inside out
wmin [ i ] = e - > origin [ i ] + fmax ;
wmax [ i ] = e - > origin [ i ] + fmin ;
}
}
Fixes, workarounds, and breakages. Hexen2 should work much better (-hexen2 says no mission pack, -portals says h2mp). Started working on splitting bigcoords per client, far too much work still to go on that. Removed gl_ztrick entirely. Enabled csprogs download by default. Added client support for fitzquake's 666 protocol, needs testing, some cleanup for dp protocols too, no server support, couldn't selectively enable it anyway. Now attempting to cache shadow meshes for explosions and stuff. Played with lightmaps a little, should potentially run a little faster on certain (intel?) cards. Tweeked npfte a little to try to avoid deadlocks and crashes. Fixed sky worldspawn parsing. Added h2mp's model format. Fixed baseline issue in q2 client, made servers generate q2 baselines. MOVETYPE_PUSH will not rotate extra if rotation is forced. Made status command show allowed client types. Changed lighting on weapons - should now be shaded.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3572 fc73d0e0-1445-4013-8a0c-d673dee63da5
2010-08-11 03:36:31 +00:00
# endif
2007-05-25 22:16:29 +00:00
return R_CullBox ( wmin , wmax ) ;
}
int SignbitsForPlane ( mplane_t * out )
{
int bits , j ;
// for fast box on planeside test
bits = 0 ;
for ( j = 0 ; j < 3 ; j + + )
{
if ( out - > normal [ j ] < 0 )
bits | = 1 < < j ;
}
return bits ;
}
# if 1
2009-11-04 21:16:50 +00:00
void R_SetFrustum ( float projmat [ 16 ] , float viewmat [ 16 ] )
2007-05-25 22:16:29 +00:00
{
float scale ;
int i ;
float mvp [ 16 ] ;
2010-05-01 22:47:47 +00:00
if ( r_novis . ival & 4 )
2007-05-25 22:16:29 +00:00
return ;
2009-11-04 21:16:50 +00:00
Matrix4_Multiply ( projmat , viewmat , mvp ) ;
2007-05-25 22:16:29 +00:00
for ( i = 0 ; i < 4 ; i + + )
{
if ( i & 1 )
{
frustum [ i ] . normal [ 0 ] = mvp [ 3 ] + mvp [ 0 + i / 2 ] ;
frustum [ i ] . normal [ 1 ] = mvp [ 7 ] + mvp [ 4 + i / 2 ] ;
frustum [ i ] . normal [ 2 ] = mvp [ 11 ] + mvp [ 8 + i / 2 ] ;
frustum [ i ] . dist = mvp [ 15 ] + mvp [ 12 + i / 2 ] ;
}
else
{
frustum [ i ] . normal [ 0 ] = mvp [ 3 ] - mvp [ 0 + i / 2 ] ;
frustum [ i ] . normal [ 1 ] = mvp [ 7 ] - mvp [ 4 + i / 2 ] ;
frustum [ i ] . normal [ 2 ] = mvp [ 11 ] - mvp [ 8 + i / 2 ] ;
frustum [ i ] . dist = mvp [ 15 ] - mvp [ 12 + i / 2 ] ;
}
scale = 1 / sqrt ( DotProduct ( frustum [ i ] . normal , frustum [ i ] . normal ) ) ;
frustum [ i ] . normal [ 0 ] * = scale ;
frustum [ i ] . normal [ 1 ] * = scale ;
frustum [ i ] . normal [ 2 ] * = scale ;
frustum [ i ] . dist * = - scale ;
frustum [ i ] . type = PLANE_ANYZ ;
frustum [ i ] . signbits = SignbitsForPlane ( & frustum [ i ] ) ;
}
}
# else
void R_SetFrustum ( void )
{
int i ;
2010-05-01 22:47:47 +00:00
if ( r_novis . ival & 4 )
2007-05-25 22:16:29 +00:00
return ;
/* removed - assumes fov_x == fov_y
2009-04-08 08:12:29 +00:00
if ( r_refdef . fov_x = = 90 )
2007-05-25 22:16:29 +00:00
{
// front side is visible
VectorAdd ( vpn , vright , frustum [ 0 ] . normal ) ;
VectorSubtract ( vpn , vright , frustum [ 1 ] . normal ) ;
VectorAdd ( vpn , vup , frustum [ 2 ] . normal ) ;
VectorSubtract ( vpn , vup , frustum [ 3 ] . normal ) ;
}
else
*/
{
// rotate VPN right by FOV_X/2 degrees
RotatePointAroundVector ( frustum [ 0 ] . normal , vup , vpn , - ( 90 - r_refdef . fov_x / 2 ) ) ;
// rotate VPN left by FOV_X/2 degrees
RotatePointAroundVector ( frustum [ 1 ] . normal , vup , vpn , 90 - r_refdef . fov_x / 2 ) ;
// rotate VPN up by FOV_X/2 degrees
RotatePointAroundVector ( frustum [ 2 ] . normal , vright , vpn , 90 - r_refdef . fov_y / 2 ) ;
// rotate VPN down by FOV_X/2 degrees
RotatePointAroundVector ( frustum [ 3 ] . normal , vright , vpn , - ( 90 - r_refdef . fov_y / 2 ) ) ;
}
for ( i = 0 ; i < 4 ; i + + )
{
frustum [ i ] . type = PLANE_ANYZ ;
frustum [ i ] . dist = DotProduct ( r_origin , frustum [ i ] . normal ) ;
frustum [ i ] . signbits = SignbitsForPlane ( & frustum [ i ] ) ;
}
}
# endif
2009-11-04 21:16:50 +00:00
# include "glquake.h"
//we could go for nice smooth round particles... but then we would loose a little bit of the chaotic nature of the particles.
static qbyte dottexture [ 8 ] [ 8 ] =
{
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 } ,
{ 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 } ,
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 } ,
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 } ,
{ 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 } ,
{ 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ,
} ;
static qbyte exptexture [ 16 ] [ 16 ] =
{
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 3 , 1 , 1 , 2 , 1 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 1 , 1 , 1 , 1 , 4 , 4 , 4 , 5 , 4 , 2 , 1 , 1 , 0 } ,
{ 0 , 0 , 1 , 1 , 6 , 5 , 5 , 8 , 6 , 8 , 3 , 6 , 3 , 2 , 1 , 0 } ,
{ 0 , 0 , 1 , 5 , 6 , 7 , 5 , 6 , 8 , 8 , 8 , 3 , 3 , 1 , 0 , 0 } ,
{ 0 , 0 , 0 , 1 , 6 , 8 , 9 , 9 , 9 , 9 , 4 , 6 , 3 , 1 , 0 , 0 } ,
{ 0 , 0 , 2 , 1 , 7 , 7 , 9 , 9 , 9 , 9 , 5 , 3 , 1 , 0 , 0 , 0 } ,
{ 0 , 0 , 2 , 4 , 6 , 8 , 9 , 9 , 9 , 9 , 8 , 6 , 1 , 0 , 0 , 0 } ,
{ 0 , 0 , 2 , 2 , 3 , 5 , 6 , 8 , 9 , 8 , 8 , 4 , 4 , 1 , 0 , 0 } ,
{ 0 , 0 , 1 , 2 , 4 , 1 , 8 , 7 , 8 , 8 , 6 , 5 , 4 , 1 , 0 , 0 } ,
{ 0 , 1 , 1 , 1 , 7 , 8 , 1 , 6 , 7 , 5 , 4 , 7 , 1 , 0 , 0 , 0 } ,
{ 0 , 1 , 2 , 1 , 1 , 5 , 1 , 3 , 4 , 3 , 1 , 1 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ,
} ;
texid_t particletexture ; // little dot for particles
texid_t particlecqtexture ; // little dot for particles
texid_t explosiontexture ;
texid_t balltexture ;
texid_t beamtexture ;
texid_t ptritexture ;
void R_InitParticleTexture ( void )
{
# define PARTICLETEXTURESIZE 64
int x , y ;
float dx , dy , d ;
qbyte data [ PARTICLETEXTURESIZE * PARTICLETEXTURESIZE ] [ 4 ] ;
//
// particle texture
//
for ( x = 0 ; x < 8 ; x + + )
{
for ( y = 0 ; y < 8 ; y + + )
{
data [ y * 8 + x ] [ 0 ] = 255 ;
data [ y * 8 + x ] [ 1 ] = 255 ;
data [ y * 8 + x ] [ 2 ] = 255 ;
data [ y * 8 + x ] [ 3 ] = dottexture [ x ] [ y ] * 255 ;
}
}
particletexture = R_LoadTexture32 ( " " , 8 , 8 , data , IF_NOMIPMAP | IF_NOPICMIP ) ;
//
// particle triangle texture
//
// clear to transparent white
for ( x = 0 ; x < 32 * 32 ; x + + )
{
data [ x ] [ 0 ] = 255 ;
data [ x ] [ 1 ] = 255 ;
data [ x ] [ 2 ] = 255 ;
data [ x ] [ 3 ] = 0 ;
}
//draw a circle in the top left.
for ( x = 0 ; x < 16 ; x + + )
{
for ( y = 0 ; y < 16 ; y + + )
{
if ( ( x - 7.5 ) * ( x - 7.5 ) + ( y - 7.5 ) * ( y - 7.5 ) < = 8 * 8 )
data [ y * 32 + x ] [ 3 ] = 255 ;
}
}
particlecqtexture = R_LoadTexture32 ( " " , 32 , 32 , data , IF_NOMIPMAP | IF_NOPICMIP ) ;
for ( x = 0 ; x < 16 ; x + + )
{
for ( y = 0 ; y < 16 ; y + + )
{
data [ y * 16 + x ] [ 0 ] = 255 ;
data [ y * 16 + x ] [ 1 ] = 255 ;
data [ y * 16 + x ] [ 2 ] = 255 ;
data [ y * 16 + x ] [ 3 ] = exptexture [ x ] [ y ] * 255 / 9.0 ;
}
}
explosiontexture = R_LoadTexture32 ( " " , 16 , 16 , data , IF_NOMIPMAP | IF_NOPICMIP ) ;
memset ( data , 255 , sizeof ( data ) ) ;
for ( y = 0 ; y < PARTICLETEXTURESIZE ; y + + )
{
dy = ( y - 0.5f * PARTICLETEXTURESIZE ) / ( PARTICLETEXTURESIZE * 0.5f - 1 ) ;
for ( x = 0 ; x < PARTICLETEXTURESIZE ; x + + )
{
dx = ( x - 0.5f * PARTICLETEXTURESIZE ) / ( PARTICLETEXTURESIZE * 0.5f - 1 ) ;
d = 256 * ( 1 - ( dx * dx + dy * dy ) ) ;
d = bound ( 0 , d , 255 ) ;
data [ y * PARTICLETEXTURESIZE + x ] [ 3 ] = ( qbyte ) d ;
}
}
balltexture = R_LoadTexture32 ( " " , PARTICLETEXTURESIZE , PARTICLETEXTURESIZE , data , IF_NOMIPMAP | IF_NOPICMIP ) ;
memset ( data , 255 , sizeof ( data ) ) ;
for ( y = 0 ; y < PARTICLETEXTURESIZE ; y + + )
{
dy = ( y - 0.5f * PARTICLETEXTURESIZE ) / ( PARTICLETEXTURESIZE * 0.5f - 1 ) ;
d = 256 * ( 1 - ( dy * dy ) ) ;
d = bound ( 0 , d , 255 ) ;
for ( x = 0 ; x < PARTICLETEXTURESIZE ; x + + )
{
data [ y * PARTICLETEXTURESIZE + x ] [ 3 ] = ( qbyte ) d ;
}
}
beamtexture = R_LoadTexture32 ( " " , PARTICLETEXTURESIZE , PARTICLETEXTURESIZE , data , IF_NOMIPMAP | IF_NOPICMIP ) ;
for ( y = 0 ; y < PARTICLETEXTURESIZE ; y + + )
{
dy = y / ( PARTICLETEXTURESIZE * 0.5f - 1 ) ;
d = 256 * ( 1 - ( dy * dy ) ) ;
d = bound ( 0 , d , 255 ) ;
for ( x = 0 ; x < PARTICLETEXTURESIZE ; x + + )
{
dx = x / ( PARTICLETEXTURESIZE * 0.5f - 1 ) ;
d = 256 * ( 1 - ( dx + dy ) ) ;
d = bound ( 0 , d , 255 ) ;
data [ y * PARTICLETEXTURESIZE + x ] [ 0 ] = ( qbyte ) d ;
data [ y * PARTICLETEXTURESIZE + x ] [ 1 ] = ( qbyte ) d ;
data [ y * PARTICLETEXTURESIZE + x ] [ 2 ] = ( qbyte ) d ;
data [ y * PARTICLETEXTURESIZE + x ] [ 3 ] = ( qbyte ) d / 2 ;
}
}
ptritexture = R_LoadTexture32 ( " " , PARTICLETEXTURESIZE , PARTICLETEXTURESIZE , data , IF_NOMIPMAP | IF_NOPICMIP ) ;
}