2016-03-27 11:49:47 +02:00
/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Copyright ( C ) 1999 - 2005 Id Software , Inc .
This file is part of Quake III Arena source code .
Quake III Arena source code is free software ; you can redistribute it
and / or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation ; either version 2 of the License ,
or ( at your option ) any later version .
Quake III Arena source code is distributed in the hope that it will be
useful , but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with Quake III Arena source code ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
// tr_init.c -- functions that are not called every frame
# include "tr_local.h"
2023-05-08 19:53:53 +02:00
# include "tr_dsa.h"
2016-03-27 11:49:47 +02:00
glconfig_t glConfig ;
glRefConfig_t glRefConfig ;
qboolean textureFilterAnisotropic = qfalse ;
int maxAnisotropy = 0 ;
float displayAspect = 0.0f ;
2023-05-08 00:02:31 +02:00
qboolean haveClampToEdge = qfalse ;
2016-03-27 11:49:47 +02:00
glstate_t glState ;
static void GfxInfo_f ( void ) ;
static void GfxMemInfo_f ( void ) ;
# ifdef USE_RENDERER_DLOPEN
cvar_t * com_altivec ;
# endif
cvar_t * r_flareSize ;
cvar_t * r_flareFade ;
cvar_t * r_flareCoeff ;
cvar_t * r_railWidth ;
cvar_t * r_railCoreWidth ;
cvar_t * r_railSegmentLength ;
cvar_t * r_verbose ;
cvar_t * r_ignore ;
cvar_t * r_displayRefresh ;
cvar_t * r_detailTextures ;
cvar_t * r_znear ;
cvar_t * r_zproj ;
cvar_t * r_stereoSeparation ;
cvar_t * r_skipBackEnd ;
cvar_t * r_stereoEnabled ;
cvar_t * r_anaglyphMode ;
cvar_t * r_greyscale ;
cvar_t * r_ignorehwgamma ;
cvar_t * r_measureOverdraw ;
cvar_t * r_inGameVideo ;
cvar_t * r_fastsky ;
cvar_t * r_drawSun ;
cvar_t * r_dynamiclight ;
cvar_t * r_dlightBacks ;
cvar_t * r_lodbias ;
cvar_t * r_lodscale ;
cvar_t * r_norefresh ;
cvar_t * r_drawentities ;
cvar_t * r_drawworld ;
cvar_t * r_speeds ;
cvar_t * r_fullbright ;
cvar_t * r_novis ;
cvar_t * r_nocull ;
cvar_t * r_facePlaneCull ;
cvar_t * r_showcluster ;
cvar_t * r_nocurves ;
cvar_t * r_allowExtensions ;
cvar_t * r_ext_compressed_textures ;
cvar_t * r_ext_multitexture ;
cvar_t * r_ext_compiled_vertex_array ;
cvar_t * r_ext_texture_env_add ;
cvar_t * r_ext_texture_filter_anisotropic ;
cvar_t * r_ext_max_anisotropy ;
cvar_t * r_ext_framebuffer_object ;
cvar_t * r_ext_texture_float ;
cvar_t * r_ext_framebuffer_multisample ;
cvar_t * r_arb_seamless_cube_map ;
cvar_t * r_arb_vertex_array_object ;
2023-05-08 19:53:53 +02:00
cvar_t * r_ext_direct_state_access ;
2016-03-27 11:49:47 +02:00
cvar_t * r_cameraExposure ;
cvar_t * r_externalGLSL ;
cvar_t * r_hdr ;
cvar_t * r_floatLightmap ;
cvar_t * r_postProcess ;
cvar_t * r_toneMap ;
cvar_t * r_forceToneMap ;
cvar_t * r_forceToneMapMin ;
cvar_t * r_forceToneMapAvg ;
cvar_t * r_forceToneMapMax ;
cvar_t * r_autoExposure ;
cvar_t * r_forceAutoExposure ;
cvar_t * r_forceAutoExposureMin ;
cvar_t * r_forceAutoExposureMax ;
cvar_t * r_depthPrepass ;
cvar_t * r_ssao ;
cvar_t * r_normalMapping ;
cvar_t * r_specularMapping ;
cvar_t * r_deluxeMapping ;
cvar_t * r_parallaxMapping ;
2023-05-08 19:53:53 +02:00
cvar_t * r_parallaxMapOffset ;
cvar_t * r_parallaxMapShadows ;
2016-03-27 11:49:47 +02:00
cvar_t * r_cubeMapping ;
2023-05-08 19:53:53 +02:00
cvar_t * r_cubemapSize ;
2016-03-27 11:49:47 +02:00
cvar_t * r_deluxeSpecular ;
2023-05-08 19:53:53 +02:00
cvar_t * r_pbr ;
2016-03-27 11:49:47 +02:00
cvar_t * r_baseNormalX ;
cvar_t * r_baseNormalY ;
cvar_t * r_baseParallax ;
cvar_t * r_baseSpecular ;
cvar_t * r_baseGloss ;
2023-05-08 19:53:53 +02:00
cvar_t * r_glossType ;
2016-03-27 11:49:47 +02:00
cvar_t * r_mergeLightmaps ;
cvar_t * r_dlightMode ;
cvar_t * r_pshadowDist ;
cvar_t * r_imageUpsample ;
cvar_t * r_imageUpsampleMaxSize ;
cvar_t * r_imageUpsampleType ;
cvar_t * r_genNormalMaps ;
cvar_t * r_forceSun ;
cvar_t * r_forceSunLightScale ;
cvar_t * r_forceSunAmbientScale ;
cvar_t * r_sunlightMode ;
cvar_t * r_drawSunRays ;
cvar_t * r_sunShadows ;
cvar_t * r_shadowFilter ;
2023-05-08 19:53:53 +02:00
cvar_t * r_shadowBlur ;
2016-03-27 11:49:47 +02:00
cvar_t * r_shadowMapSize ;
cvar_t * r_shadowCascadeZNear ;
cvar_t * r_shadowCascadeZFar ;
cvar_t * r_shadowCascadeZBias ;
cvar_t * r_ignoreDstAlpha ;
cvar_t * r_ignoreGLErrors ;
cvar_t * r_logFile ;
cvar_t * r_stencilbits ;
cvar_t * r_depthbits ;
cvar_t * r_colorbits ;
cvar_t * r_texturebits ;
cvar_t * r_ext_multisample ;
cvar_t * r_drawBuffer ;
cvar_t * r_lightmap ;
cvar_t * r_vertexLight ;
cvar_t * r_uiFullScreen ;
cvar_t * r_shadows ;
cvar_t * r_flares ;
cvar_t * r_mode ;
cvar_t * r_nobind ;
cvar_t * r_singleShader ;
cvar_t * r_roundImagesDown ;
cvar_t * r_colorMipLevels ;
cvar_t * r_picmip ;
cvar_t * r_showtris ;
cvar_t * r_showsky ;
cvar_t * r_shownormals ;
cvar_t * r_finish ;
cvar_t * r_clear ;
cvar_t * r_swapInterval ;
cvar_t * r_textureMode ;
cvar_t * r_offsetFactor ;
cvar_t * r_offsetUnits ;
cvar_t * r_gamma ;
cvar_t * r_intensity ;
cvar_t * r_lockpvs ;
cvar_t * r_noportals ;
cvar_t * r_portalOnly ;
cvar_t * r_subdivisions ;
cvar_t * r_lodCurveError ;
cvar_t * r_fullscreen ;
cvar_t * r_noborder ;
cvar_t * r_customwidth ;
cvar_t * r_customheight ;
cvar_t * r_customPixelAspect ;
cvar_t * r_overBrightBits ;
cvar_t * r_mapOverBrightBits ;
cvar_t * r_debugSurface ;
cvar_t * r_simpleMipMaps ;
cvar_t * r_showImages ;
cvar_t * r_ambientScale ;
cvar_t * r_directedScale ;
cvar_t * r_debugLight ;
cvar_t * r_debugSort ;
cvar_t * r_printShaders ;
cvar_t * r_saveFontData ;
cvar_t * r_marksOnTriangleMeshes ;
cvar_t * r_aviMotionJpegQuality ;
cvar_t * r_screenshotJpegQuality ;
cvar_t * r_maxpolys ;
int max_polys ;
cvar_t * r_maxpolyverts ;
int max_polyverts ;
2024-12-19 23:18:21 +01:00
//
// OPENMOHAA-specific stuff
//=========================
int r_sequencenumber ;
// DRAWING
cvar_t * r_drawentitypoly ;
cvar_t * r_drawstaticmodels ;
cvar_t * r_drawstaticmodelpoly ;
cvar_t * r_drawstaticdecals ;
cvar_t * r_drawterrain ;
cvar_t * r_drawsprites ;
cvar_t * r_drawspherelights ;
cvar_t * r_numdebuglines ;
cvar_t * r_stipplelines ;
cvar_t * r_debuglines_depthmask ;
cvar_t * r_maxpolys ;
int max_polys ;
cvar_t * r_maxpolyverts ;
int max_polyverts ;
cvar_t * r_maxtermarks ;
int max_termarks ;
cvar_t * r_skyportal ;
cvar_t * r_skyportal_origin ;
2024-12-21 17:04:23 +01:00
cvar_t * r_farplane ;
cvar_t * r_farplane_bias ;
cvar_t * r_farplane_color ;
cvar_t * r_farplane_nocull ;
cvar_t * r_farplane_nofog ;
cvar_t * r_skybox_farplane ;
cvar_t * r_farclip ;
2024-12-21 21:43:42 +01:00
// Lighting
2024-12-19 23:18:21 +01:00
cvar_t * r_lightcoronasize ;
2024-12-21 21:43:42 +01:00
cvar_t * r_entlight_scale ;
cvar_t * r_entlight_errbound ;
cvar_t * r_entlight_cubelevel ;
cvar_t * r_entlight_cubefraction ;
cvar_t * r_entlight_maxcalc ;
cvar_t * r_light_lines ;
cvar_t * r_light_sun_line ;
cvar_t * r_light_int_scale ;
cvar_t * r_light_nolight ;
cvar_t * r_light_showgrid ;
2024-12-19 23:18:21 +01:00
// LOD
cvar_t * r_staticlod ;
cvar_t * r_lodscale ;
cvar_t * r_lodcap ;
cvar_t * r_lodviewmodelcap ;
cvar_t * r_uselod ;
cvar_t * lod_LOD ;
cvar_t * lod_minLOD ;
cvar_t * lod_maxLOD ;
cvar_t * lod_LOD_slider ;
cvar_t * lod_curve_0_val ;
cvar_t * lod_curve_1_val ;
cvar_t * lod_curve_2_val ;
cvar_t * lod_curve_3_val ;
cvar_t * lod_curve_4_val ;
cvar_t * lod_edit_0 ;
cvar_t * lod_edit_1 ;
cvar_t * lod_edit_2 ;
cvar_t * lod_edit_3 ;
cvar_t * lod_edit_4 ;
cvar_t * lod_curve_0_slider ;
cvar_t * lod_curve_1_slider ;
cvar_t * lod_curve_2_slider ;
cvar_t * lod_curve_3_slider ;
cvar_t * lod_curve_4_slider ;
cvar_t * lod_pitch_val ;
cvar_t * lod_zee_val ;
cvar_t * lod_mesh ;
cvar_t * lod_meshname ;
cvar_t * lod_tikiname ;
cvar_t * lod_metric ;
cvar_t * lod_tris ;
cvar_t * lod_position ;
cvar_t * lod_save ;
cvar_t * lod_tool ;
// Utils
cvar_t * r_developer ;
cvar_t * r_fps ;
cvar_t * r_showstaticbboxes ;
cvar_t * r_showcull ;
cvar_t * r_showlod ;
cvar_t * r_showstaticlod ;
2024-12-21 17:04:23 +01:00
cvar_t * r_showportal ;
2024-12-19 23:18:21 +01:00
//=========================
2016-03-27 11:49:47 +02:00
/*
* * InitOpenGL
* *
* * This function is responsible for initializing a valid OpenGL subsystem . This
* * is done by calling GLimp_Init ( which gives us a working OGL subsystem ) then
* * setting variables , checking GL constants , and reporting the gfx system config
* * to the user .
*/
static void InitOpenGL ( void )
{
//
// initialize OS specific portions of the renderer
//
// GLimp_Init directly or indirectly references the following cvars:
// - r_fullscreen
// - r_mode
// - r_(color|depth|stencil)bits
// - r_ignorehwgamma
// - r_gamma
//
if ( glConfig . vidWidth = = 0 )
{
GLint temp ;
2023-05-08 19:53:53 +02:00
GLimp_Init ( qfalse ) ;
2016-03-27 11:49:47 +02:00
GLimp_InitExtraExtensions ( ) ;
2023-05-08 19:53:53 +02:00
glConfig . textureEnvAddAvailable = qtrue ;
2016-03-27 11:49:47 +02:00
// OpenGL driver constants
qglGetIntegerv ( GL_MAX_TEXTURE_SIZE , & temp ) ;
glConfig . maxTextureSize = temp ;
// stubbed or broken drivers may have reported 0...
if ( glConfig . maxTextureSize < = 0 )
{
glConfig . maxTextureSize = 0 ;
}
2023-05-08 19:53:53 +02:00
qglGetIntegerv ( GL_MAX_TEXTURE_IMAGE_UNITS , & temp ) ;
glConfig . numTextureUnits = temp ;
2024-12-01 15:36:52 +01:00
qglGetIntegerv ( GL_MAX_VERTEX_ATTRIBS , & temp ) ;
glRefConfig . maxVertexAttribs = temp ;
2023-05-08 19:53:53 +02:00
// reserve 160 components for other uniforms
2024-12-01 15:36:52 +01:00
if ( qglesMajorVersion ) {
qglGetIntegerv ( GL_MAX_VERTEX_UNIFORM_VECTORS , & temp ) ;
temp * = 4 ;
} else {
qglGetIntegerv ( GL_MAX_VERTEX_UNIFORM_COMPONENTS , & temp ) ;
}
2023-05-08 19:53:53 +02:00
glRefConfig . glslMaxAnimatedBones = Com_Clamp ( 0 , IQM_MAX_JOINTS , ( temp - 160 ) / 16 ) ;
if ( glRefConfig . glslMaxAnimatedBones < 12 ) {
glRefConfig . glslMaxAnimatedBones = 0 ;
}
}
// check for GLSL function textureCubeLod()
if ( r_cubeMapping - > integer & & ! QGL_VERSION_ATLEAST ( 3 , 0 ) ) {
ri . Printf ( PRINT_WARNING , " WARNING: Disabled r_cubeMapping because it requires OpenGL 3.0 \n " ) ;
ri . Cvar_Set ( " r_cubeMapping " , " 0 " ) ;
2016-03-27 11:49:47 +02:00
}
// set default state
GL_SetDefaultState ( ) ;
}
/*
= = = = = = = = = = = = = = = = = =
GL_CheckErrors
= = = = = = = = = = = = = = = = = =
*/
void GL_CheckErrs ( char * file , int line ) {
int err ;
char s [ 64 ] ;
err = qglGetError ( ) ;
if ( err = = GL_NO_ERROR ) {
return ;
}
if ( r_ignoreGLErrors - > integer ) {
return ;
}
switch ( err ) {
case GL_INVALID_ENUM :
strcpy ( s , " GL_INVALID_ENUM " ) ;
break ;
case GL_INVALID_VALUE :
strcpy ( s , " GL_INVALID_VALUE " ) ;
break ;
case GL_INVALID_OPERATION :
strcpy ( s , " GL_INVALID_OPERATION " ) ;
break ;
case GL_STACK_OVERFLOW :
strcpy ( s , " GL_STACK_OVERFLOW " ) ;
break ;
case GL_STACK_UNDERFLOW :
strcpy ( s , " GL_STACK_UNDERFLOW " ) ;
break ;
case GL_OUT_OF_MEMORY :
strcpy ( s , " GL_OUT_OF_MEMORY " ) ;
break ;
default :
Com_sprintf ( s , sizeof ( s ) , " %i " , err ) ;
break ;
}
ri . Error ( ERR_FATAL , " GL_CheckErrors: %s in %s at line %d " , s , file , line ) ;
}
/*
* * R_GetModeInfo
*/
typedef struct vidmode_s
{
const char * description ;
int width , height ;
float pixelAspect ; // pixel width / height
} vidmode_t ;
vidmode_t r_vidModes [ ] =
{
{ " Mode 0: 320x240 " , 320 , 240 , 1 } ,
{ " Mode 1: 400x300 " , 400 , 300 , 1 } ,
{ " Mode 2: 512x384 " , 512 , 384 , 1 } ,
{ " Mode 3: 640x480 " , 640 , 480 , 1 } ,
{ " Mode 4: 800x600 " , 800 , 600 , 1 } ,
{ " Mode 5: 960x720 " , 960 , 720 , 1 } ,
{ " Mode 6: 1024x768 " , 1024 , 768 , 1 } ,
{ " Mode 7: 1152x864 " , 1152 , 864 , 1 } ,
{ " Mode 8: 1280x1024 " , 1280 , 1024 , 1 } ,
{ " Mode 9: 1600x1200 " , 1600 , 1200 , 1 } ,
{ " Mode 10: 2048x1536 " , 2048 , 1536 , 1 } ,
{ " Mode 11: 856x480 (wide) " , 856 , 480 , 1 }
} ;
static int s_numVidModes = ARRAY_LEN ( r_vidModes ) ;
qboolean R_GetModeInfo ( int * width , int * height , float * windowAspect , int mode ) {
vidmode_t * vm ;
float pixelAspect ;
if ( mode < - 1 ) {
return qfalse ;
}
if ( mode > = s_numVidModes ) {
return qfalse ;
}
if ( mode = = - 1 ) {
* width = r_customwidth - > integer ;
* height = r_customheight - > integer ;
pixelAspect = r_customPixelAspect - > value ;
} else {
vm = & r_vidModes [ mode ] ;
* width = vm - > width ;
* height = vm - > height ;
pixelAspect = vm - > pixelAspect ;
}
* windowAspect = ( float ) * width / ( * height * pixelAspect ) ;
return qtrue ;
}
/*
* * R_ModeList_f
*/
static void R_ModeList_f ( void )
{
int i ;
ri . Printf ( PRINT_ALL , " \n " ) ;
for ( i = 0 ; i < s_numVidModes ; i + + )
{
ri . Printf ( PRINT_ALL , " %s \n " , r_vidModes [ i ] . description ) ;
}
ri . Printf ( PRINT_ALL , " \n " ) ;
}
/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
SCREEN SHOTS
NOTE TTimo
some thoughts about the screenshots system :
screenshots get written in fs_homepath + fs_gamedir
vanilla q3 . . baseq3 / screenshots / * . tga
team arena . . missionpack / screenshots / * . tga
two commands : " screenshot " and " screenshotJPEG "
we use statics to store a count and start writing the first screenshot / screenshot ? ? ? ? . tga ( . jpg ) available
( with FS_FileExists / FS_FOpenFileWrite calls )
FIXME : the statics don ' t get a reinit between fs_game changes
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
/*
= = = = = = = = = = = = = = = = = =
RB_ReadPixels
Reads an image but takes care of alignment issues for reading RGB images .
Reads a minimum offset for where the RGB data starts in the image from
integer stored at pointer offset . When the function has returned the actual
offset was written back to address offset . This address will always have an
alignment of packAlign to ensure efficient copying .
Stores the length of padding after a line of pixels to address padlen
Return value must be freed with ri . Hunk_FreeTempMemory ( )
= = = = = = = = = = = = = = = = = =
*/
byte * RB_ReadPixels ( int x , int y , int width , int height , size_t * offset , int * padlen )
{
byte * buffer , * bufstart ;
2024-12-01 15:36:52 +01:00
int padwidth , linelen , bytesPerPixel ;
int yin , xin , xout ;
GLint packAlign , format ;
// OpenGL ES is only required to support reading GL_RGBA
if ( qglesMajorVersion > = 1 ) {
format = GL_RGBA ;
bytesPerPixel = 4 ;
} else {
format = GL_RGB ;
bytesPerPixel = 3 ;
}
2016-03-27 11:49:47 +02:00
qglGetIntegerv ( GL_PACK_ALIGNMENT , & packAlign ) ;
2024-12-01 15:36:52 +01:00
linelen = width * bytesPerPixel ;
2016-03-27 11:49:47 +02:00
padwidth = PAD ( linelen , packAlign ) ;
2024-12-01 15:36:52 +01:00
2016-03-27 11:49:47 +02:00
// Allocate a few more bytes so that we can choose an alignment we like
buffer = ri . Hunk_AllocateTempMemory ( padwidth * height + * offset + packAlign - 1 ) ;
2024-12-01 15:36:52 +01:00
2016-03-27 11:49:47 +02:00
bufstart = PADP ( ( intptr_t ) buffer + * offset , packAlign ) ;
2024-12-01 15:36:52 +01:00
qglReadPixels ( x , y , width , height , format , GL_UNSIGNED_BYTE , bufstart ) ;
linelen = width * 3 ;
// Convert RGBA to RGB, in place, line by line
if ( format = = GL_RGBA ) {
for ( yin = 0 ; yin < height ; yin + + ) {
for ( xin = 0 , xout = 0 ; xout < linelen ; xin + = 4 , xout + = 3 ) {
bufstart [ yin * padwidth + xout + 0 ] = bufstart [ yin * padwidth + xin + 0 ] ;
bufstart [ yin * padwidth + xout + 1 ] = bufstart [ yin * padwidth + xin + 1 ] ;
bufstart [ yin * padwidth + xout + 2 ] = bufstart [ yin * padwidth + xin + 2 ] ;
}
}
}
2023-05-08 19:53:53 +02:00
2016-03-27 11:49:47 +02:00
* offset = bufstart - buffer ;
* padlen = padwidth - linelen ;
return buffer ;
}
/*
= = = = = = = = = = = = = = = = = =
RB_TakeScreenshot
= = = = = = = = = = = = = = = = = =
*/
void RB_TakeScreenshot ( int x , int y , int width , int height , char * fileName )
{
byte * allbuf , * buffer ;
byte * srcptr , * destptr ;
byte * endline , * endmem ;
byte temp ;
int linelen , padlen ;
size_t offset = 18 , memcount ;
allbuf = RB_ReadPixels ( x , y , width , height , & offset , & padlen ) ;
buffer = allbuf + offset - 18 ;
Com_Memset ( buffer , 0 , 18 ) ;
buffer [ 2 ] = 2 ; // uncompressed type
buffer [ 12 ] = width & 255 ;
buffer [ 13 ] = width > > 8 ;
buffer [ 14 ] = height & 255 ;
buffer [ 15 ] = height > > 8 ;
buffer [ 16 ] = 24 ; // pixel size
// swap rgb to bgr and remove padding from line endings
linelen = width * 3 ;
srcptr = destptr = allbuf + offset ;
endmem = srcptr + ( linelen + padlen ) * height ;
while ( srcptr < endmem )
{
endline = srcptr + linelen ;
while ( srcptr < endline )
{
temp = srcptr [ 0 ] ;
* destptr + + = srcptr [ 2 ] ;
* destptr + + = srcptr [ 1 ] ;
* destptr + + = temp ;
srcptr + = 3 ;
}
// Skip the pad
srcptr + = padlen ;
}
memcount = linelen * height ;
// gamma correct
if ( glConfig . deviceSupportsGamma )
R_GammaCorrect ( allbuf + offset , memcount ) ;
ri . FS_WriteFile ( fileName , buffer , memcount + 18 ) ;
ri . Hunk_FreeTempMemory ( allbuf ) ;
}
/*
= = = = = = = = = = = = = = = = = =
RB_TakeScreenshotJPEG
= = = = = = = = = = = = = = = = = =
*/
void RB_TakeScreenshotJPEG ( int x , int y , int width , int height , char * fileName )
{
byte * buffer ;
size_t offset = 0 , memcount ;
int padlen ;
buffer = RB_ReadPixels ( x , y , width , height , & offset , & padlen ) ;
memcount = ( width * 3 + padlen ) * height ;
// gamma correct
if ( glConfig . deviceSupportsGamma )
R_GammaCorrect ( buffer + offset , memcount ) ;
RE_SaveJPG ( fileName , r_screenshotJpegQuality - > integer , width , height , buffer + offset , padlen ) ;
ri . Hunk_FreeTempMemory ( buffer ) ;
}
/*
= = = = = = = = = = = = = = = = = =
RB_TakeScreenshotCmd
= = = = = = = = = = = = = = = = = =
*/
const void * RB_TakeScreenshotCmd ( const void * data ) {
const screenshotCommand_t * cmd ;
cmd = ( const screenshotCommand_t * ) data ;
// finish any 2D drawing if needed
if ( tess . numIndexes )
RB_EndSurface ( ) ;
if ( cmd - > jpeg )
RB_TakeScreenshotJPEG ( cmd - > x , cmd - > y , cmd - > width , cmd - > height , cmd - > fileName ) ;
else
RB_TakeScreenshot ( cmd - > x , cmd - > y , cmd - > width , cmd - > height , cmd - > fileName ) ;
return ( const void * ) ( cmd + 1 ) ;
}
/*
= = = = = = = = = = = = = = = = = =
R_TakeScreenshot
= = = = = = = = = = = = = = = = = =
*/
void R_TakeScreenshot ( int x , int y , int width , int height , char * name , qboolean jpeg ) {
static char fileName [ MAX_OSPATH ] ; // bad things if two screenshots per frame?
screenshotCommand_t * cmd ;
cmd = R_GetCommandBuffer ( sizeof ( * cmd ) ) ;
if ( ! cmd ) {
return ;
}
cmd - > commandId = RC_SCREENSHOT ;
cmd - > x = x ;
cmd - > y = y ;
cmd - > width = width ;
cmd - > height = height ;
Q_strncpyz ( fileName , name , sizeof ( fileName ) ) ;
cmd - > fileName = fileName ;
cmd - > jpeg = jpeg ;
}
/*
= = = = = = = = = = = = = = = = = =
R_ScreenshotFilename
= = = = = = = = = = = = = = = = = =
*/
void R_ScreenshotFilename ( int lastNumber , char * fileName ) {
int a , b , c , d ;
if ( lastNumber < 0 | | lastNumber > 9999 ) {
Com_sprintf ( fileName , MAX_OSPATH , " screenshots/shot9999.tga " ) ;
return ;
}
a = lastNumber / 1000 ;
lastNumber - = a * 1000 ;
b = lastNumber / 100 ;
lastNumber - = b * 100 ;
c = lastNumber / 10 ;
lastNumber - = c * 10 ;
d = lastNumber ;
Com_sprintf ( fileName , MAX_OSPATH , " screenshots/shot%i%i%i%i.tga "
, a , b , c , d ) ;
}
/*
= = = = = = = = = = = = = = = = = =
R_ScreenshotFilename
= = = = = = = = = = = = = = = = = =
*/
void R_ScreenshotFilenameJPEG ( int lastNumber , char * fileName ) {
int a , b , c , d ;
if ( lastNumber < 0 | | lastNumber > 9999 ) {
Com_sprintf ( fileName , MAX_OSPATH , " screenshots/shot9999.jpg " ) ;
return ;
}
a = lastNumber / 1000 ;
lastNumber - = a * 1000 ;
b = lastNumber / 100 ;
lastNumber - = b * 100 ;
c = lastNumber / 10 ;
lastNumber - = c * 10 ;
d = lastNumber ;
Com_sprintf ( fileName , MAX_OSPATH , " screenshots/shot%i%i%i%i.jpg "
, a , b , c , d ) ;
}
/*
= = = = = = = = = = = = = = = = = = = =
R_LevelShot
levelshots are specialized 128 * 128 thumbnails for
the menu system , sampled down from full screen distorted images
= = = = = = = = = = = = = = = = = = = =
*/
void R_LevelShot ( void ) {
char checkname [ MAX_OSPATH ] ;
byte * buffer ;
byte * source , * allsource ;
byte * src , * dst ;
size_t offset = 0 ;
int padlen ;
int x , y ;
int r , g , b ;
float xScale , yScale ;
int xx , yy ;
Com_sprintf ( checkname , sizeof ( checkname ) , " levelshots/%s.tga " , tr . world - > baseName ) ;
allsource = RB_ReadPixels ( 0 , 0 , glConfig . vidWidth , glConfig . vidHeight , & offset , & padlen ) ;
source = allsource + offset ;
buffer = ri . Hunk_AllocateTempMemory ( 128 * 128 * 3 + 18 ) ;
Com_Memset ( buffer , 0 , 18 ) ;
buffer [ 2 ] = 2 ; // uncompressed type
buffer [ 12 ] = 128 ;
buffer [ 14 ] = 128 ;
buffer [ 16 ] = 24 ; // pixel size
// resample from source
xScale = glConfig . vidWidth / 512.0f ;
yScale = glConfig . vidHeight / 384.0f ;
for ( y = 0 ; y < 128 ; y + + ) {
for ( x = 0 ; x < 128 ; x + + ) {
r = g = b = 0 ;
for ( yy = 0 ; yy < 3 ; yy + + ) {
for ( xx = 0 ; xx < 4 ; xx + + ) {
src = source + ( 3 * glConfig . vidWidth + padlen ) * ( int ) ( ( y * 3 + yy ) * yScale ) +
3 * ( int ) ( ( x * 4 + xx ) * xScale ) ;
r + = src [ 0 ] ;
g + = src [ 1 ] ;
b + = src [ 2 ] ;
}
}
dst = buffer + 18 + 3 * ( y * 128 + x ) ;
dst [ 0 ] = b / 12 ;
dst [ 1 ] = g / 12 ;
dst [ 2 ] = r / 12 ;
}
}
// gamma correct
if ( glConfig . deviceSupportsGamma ) {
R_GammaCorrect ( buffer + 18 , 128 * 128 * 3 ) ;
}
ri . FS_WriteFile ( checkname , buffer , 128 * 128 * 3 + 18 ) ;
ri . Hunk_FreeTempMemory ( buffer ) ;
ri . Hunk_FreeTempMemory ( allsource ) ;
ri . Printf ( PRINT_ALL , " Wrote %s \n " , checkname ) ;
}
/*
= = = = = = = = = = = = = = = = = =
R_ScreenShot_f
screenshot
screenshot [ silent ]
screenshot [ levelshot ]
screenshot [ filename ]
Doesn ' t print the pacifier message if there is a second arg
= = = = = = = = = = = = = = = = = =
*/
void R_ScreenShot_f ( void ) {
char checkname [ MAX_OSPATH ] ;
static int lastNumber = - 1 ;
qboolean silent ;
if ( ! strcmp ( ri . Cmd_Argv ( 1 ) , " levelshot " ) ) {
R_LevelShot ( ) ;
return ;
}
if ( ! strcmp ( ri . Cmd_Argv ( 1 ) , " silent " ) ) {
silent = qtrue ;
} else {
silent = qfalse ;
}
if ( ri . Cmd_Argc ( ) = = 2 & & ! silent ) {
// explicit filename
Com_sprintf ( checkname , MAX_OSPATH , " screenshots/%s.tga " , ri . Cmd_Argv ( 1 ) ) ;
} else {
// scan for a free filename
// if we have saved a previous screenshot, don't scan
// again, because recording demo avis can involve
// thousands of shots
if ( lastNumber = = - 1 ) {
lastNumber = 0 ;
}
// scan for a free number
for ( ; lastNumber < = 9999 ; lastNumber + + ) {
R_ScreenshotFilename ( lastNumber , checkname ) ;
if ( ! ri . FS_FileExists ( checkname ) )
{
break ; // file doesn't exist
}
}
if ( lastNumber > = 9999 ) {
ri . Printf ( PRINT_ALL , " ScreenShot: Couldn't create a file \n " ) ;
return ;
}
lastNumber + + ;
}
R_TakeScreenshot ( 0 , 0 , glConfig . vidWidth , glConfig . vidHeight , checkname , qfalse ) ;
if ( ! silent ) {
ri . Printf ( PRINT_ALL , " Wrote %s \n " , checkname ) ;
}
}
void R_ScreenShotJPEG_f ( void ) {
char checkname [ MAX_OSPATH ] ;
static int lastNumber = - 1 ;
qboolean silent ;
if ( ! strcmp ( ri . Cmd_Argv ( 1 ) , " levelshot " ) ) {
R_LevelShot ( ) ;
return ;
}
if ( ! strcmp ( ri . Cmd_Argv ( 1 ) , " silent " ) ) {
silent = qtrue ;
} else {
silent = qfalse ;
}
if ( ri . Cmd_Argc ( ) = = 2 & & ! silent ) {
// explicit filename
Com_sprintf ( checkname , MAX_OSPATH , " screenshots/%s.jpg " , ri . Cmd_Argv ( 1 ) ) ;
} else {
// scan for a free filename
// if we have saved a previous screenshot, don't scan
// again, because recording demo avis can involve
// thousands of shots
if ( lastNumber = = - 1 ) {
lastNumber = 0 ;
}
// scan for a free number
for ( ; lastNumber < = 9999 ; lastNumber + + ) {
R_ScreenshotFilenameJPEG ( lastNumber , checkname ) ;
if ( ! ri . FS_FileExists ( checkname ) )
{
break ; // file doesn't exist
}
}
if ( lastNumber = = 10000 ) {
ri . Printf ( PRINT_ALL , " ScreenShot: Couldn't create a file \n " ) ;
return ;
}
lastNumber + + ;
}
R_TakeScreenshot ( 0 , 0 , glConfig . vidWidth , glConfig . vidHeight , checkname , qtrue ) ;
if ( ! silent ) {
ri . Printf ( PRINT_ALL , " Wrote %s \n " , checkname ) ;
}
}
//============================================================================
/*
= = = = = = = = = = = = = = = = = =
2023-05-08 19:53:53 +02:00
R_ExportCubemaps
2016-03-27 11:49:47 +02:00
= = = = = = = = = = = = = = = = = =
*/
2023-05-08 19:53:53 +02:00
void R_ExportCubemaps ( void )
2016-03-27 11:49:47 +02:00
{
2023-05-08 19:53:53 +02:00
exportCubemapsCommand_t * cmd ;
2016-03-27 11:49:47 +02:00
2023-05-08 19:53:53 +02:00
cmd = R_GetCommandBuffer ( sizeof ( * cmd ) ) ;
if ( ! cmd ) {
return ;
2016-03-27 11:49:47 +02:00
}
2023-05-08 19:53:53 +02:00
cmd - > commandId = RC_EXPORT_CUBEMAPS ;
}
2016-03-27 11:49:47 +02:00
2023-05-08 19:53:53 +02:00
/*
= = = = = = = = = = = = = = = = = =
R_ExportCubemaps_f
= = = = = = = = = = = = = = = = = =
*/
void R_ExportCubemaps_f ( void )
{
R_ExportCubemaps ( ) ;
2016-03-27 11:49:47 +02:00
}
//============================================================================
2023-05-24 19:03:05 +02:00
/*
= = = = = = = = = = = = = = = = = =
RB_TakeVideoFrameCmd
= = = = = = = = = = = = = = = = = =
*/
const void * RB_TakeVideoFrameCmd ( const void * data )
{
const videoFrameCommand_t * cmd ;
byte * cBuf ;
2024-12-01 15:36:52 +01:00
size_t memcount , bytesPerPixel , linelen , avilinelen ;
2023-05-24 19:03:05 +02:00
int padwidth , avipadwidth , padlen , avipadlen ;
2024-12-01 15:36:52 +01:00
int yin , xin , xout ;
GLint packAlign , format ;
2023-05-24 19:03:05 +02:00
// finish any 2D drawing if needed
if ( tess . numIndexes )
RB_EndSurface ( ) ;
cmd = ( const videoFrameCommand_t * ) data ;
2024-12-01 15:36:52 +01:00
// OpenGL ES is only required to support reading GL_RGBA
if ( qglesMajorVersion > = 1 ) {
format = GL_RGBA ;
bytesPerPixel = 4 ;
} else {
format = GL_RGB ;
bytesPerPixel = 3 ;
}
2023-05-24 19:03:05 +02:00
qglGetIntegerv ( GL_PACK_ALIGNMENT , & packAlign ) ;
2024-12-01 15:36:52 +01:00
linelen = cmd - > width * bytesPerPixel ;
2023-05-24 19:03:05 +02:00
// Alignment stuff for glReadPixels
padwidth = PAD ( linelen , packAlign ) ;
padlen = padwidth - linelen ;
2024-12-01 15:36:52 +01:00
avilinelen = cmd - > width * 3 ;
2023-05-24 19:03:05 +02:00
// AVI line padding
2024-12-01 15:36:52 +01:00
avipadwidth = PAD ( avilinelen , AVI_LINE_PADDING ) ;
avipadlen = avipadwidth - avilinelen ;
2023-05-24 19:03:05 +02:00
cBuf = PADP ( cmd - > captureBuffer , packAlign ) ;
2024-12-01 15:36:52 +01:00
qglReadPixels ( 0 , 0 , cmd - > width , cmd - > height , format ,
2023-05-24 19:03:05 +02:00
GL_UNSIGNED_BYTE , cBuf ) ;
memcount = padwidth * cmd - > height ;
// gamma correct
if ( glConfig . deviceSupportsGamma )
R_GammaCorrect ( cBuf , memcount ) ;
if ( cmd - > motionJpeg )
{
2024-12-01 15:36:52 +01:00
// Convert RGBA to RGB, in place, line by line
if ( format = = GL_RGBA ) {
linelen = cmd - > width * 3 ;
padlen = padwidth - linelen ;
for ( yin = 0 ; yin < cmd - > height ; yin + + ) {
for ( xin = 0 , xout = 0 ; xout < linelen ; xin + = 4 , xout + = 3 ) {
cBuf [ yin * padwidth + xout + 0 ] = cBuf [ yin * padwidth + xin + 0 ] ;
cBuf [ yin * padwidth + xout + 1 ] = cBuf [ yin * padwidth + xin + 1 ] ;
cBuf [ yin * padwidth + xout + 2 ] = cBuf [ yin * padwidth + xin + 2 ] ;
}
}
}
memcount = RE_SaveJPGToBuffer ( cmd - > encodeBuffer , avilinelen * cmd - > height ,
2023-05-24 19:03:05 +02:00
r_aviMotionJpegQuality - > integer ,
cmd - > width , cmd - > height , cBuf , padlen ) ;
ri . CL_WriteAVIVideoFrame ( cmd - > encodeBuffer , memcount ) ;
}
else
{
byte * lineend , * memend ;
byte * srcptr , * destptr ;
srcptr = cBuf ;
destptr = cmd - > encodeBuffer ;
memend = srcptr + memcount ;
// swap R and B and remove line paddings
while ( srcptr < memend )
{
lineend = srcptr + linelen ;
while ( srcptr < lineend )
{
* destptr + + = srcptr [ 2 ] ;
* destptr + + = srcptr [ 1 ] ;
* destptr + + = srcptr [ 0 ] ;
2024-12-01 15:36:52 +01:00
srcptr + = bytesPerPixel ;
2023-05-24 19:03:05 +02:00
}
Com_Memset ( destptr , ' \0 ' , avipadlen ) ;
destptr + = avipadlen ;
srcptr + = padlen ;
}
ri . CL_WriteAVIVideoFrame ( cmd - > encodeBuffer , avipadwidth * cmd - > height ) ;
}
return ( const void * ) ( cmd + 1 ) ;
}
2023-05-08 19:53:53 +02:00
//============================================================================
2016-03-27 11:49:47 +02:00
/*
* * GL_SetDefaultState
*/
void GL_SetDefaultState ( void )
{
qglClearDepth ( 1.0f ) ;
qglCullFace ( GL_FRONT ) ;
2023-05-08 19:53:53 +02:00
GL_BindNullTextures ( ) ;
2016-03-27 11:49:47 +02:00
2023-05-08 19:53:53 +02:00
if ( glRefConfig . framebufferObject )
GL_BindNullFramebuffers ( ) ;
2016-03-27 11:49:47 +02:00
GL_TextureMode ( r_textureMode - > string ) ;
//qglShadeModel( GL_SMOOTH );
qglDepthFunc ( GL_LEQUAL ) ;
//
// make sure our GL state vector is set correctly
//
glState . glStateBits = GLS_DEPTHTEST_DISABLE | GLS_DEPTHMASK_TRUE ;
glState . storedGlState = 0 ;
glState . faceCulling = CT_TWO_SIDED ;
glState . faceCullFront = qtrue ;
2023-05-08 19:53:53 +02:00
GL_BindNullProgram ( ) ;
2016-03-27 11:49:47 +02:00
if ( glRefConfig . vertexArrayObject )
2023-05-08 19:53:53 +02:00
qglBindVertexArray ( 0 ) ;
2016-03-27 11:49:47 +02:00
2023-05-08 19:53:53 +02:00
qglBindBuffer ( GL_ARRAY_BUFFER , 0 ) ;
qglBindBuffer ( GL_ELEMENT_ARRAY_BUFFER , 0 ) ;
2016-03-27 11:49:47 +02:00
glState . currentVao = NULL ;
glState . vertexAttribsEnabled = 0 ;
qglPolygonMode ( GL_FRONT_AND_BACK , GL_FILL ) ;
qglDepthMask ( GL_TRUE ) ;
qglDisable ( GL_DEPTH_TEST ) ;
qglEnable ( GL_SCISSOR_TEST ) ;
qglDisable ( GL_CULL_FACE ) ;
qglDisable ( GL_BLEND ) ;
if ( glRefConfig . seamlessCubeMap )
qglEnable ( GL_TEXTURE_CUBE_MAP_SEAMLESS ) ;
// GL_POLYGON_OFFSET_FILL will be glEnable()d when this is used
qglPolygonOffset ( r_offsetFactor - > value , r_offsetUnits - > value ) ;
qglClearColor ( 0.0f , 0.0f , 0.0f , 1.0f ) ; // FIXME: get color of sky
}
/*
= = = = = = = = = = = = = = = =
R_PrintLongString
Workaround for ri . Printf ' s 1024 characters buffer limit .
= = = = = = = = = = = = = = = =
*/
void R_PrintLongString ( const char * string ) {
char buffer [ 1024 ] ;
const char * p ;
int size = strlen ( string ) ;
p = string ;
while ( size > 0 )
{
Q_strncpyz ( buffer , p , sizeof ( buffer ) ) ;
ri . Printf ( PRINT_ALL , " %s " , buffer ) ;
p + = 1023 ;
size - = 1023 ;
}
}
/*
= = = = = = = = = = = = = = = =
GfxInfo_f
= = = = = = = = = = = = = = = =
*/
void GfxInfo_f ( void )
{
const char * enablestrings [ ] =
{
" disabled " ,
" enabled "
} ;
const char * fsstrings [ ] =
{
" windowed " ,
" fullscreen "
} ;
ri . Printf ( PRINT_ALL , " \n GL_VENDOR: %s \n " , glConfig . vendor_string ) ;
ri . Printf ( PRINT_ALL , " GL_RENDERER: %s \n " , glConfig . renderer_string ) ;
ri . Printf ( PRINT_ALL , " GL_VERSION: %s \n " , glConfig . version_string ) ;
ri . Printf ( PRINT_ALL , " GL_EXTENSIONS: " ) ;
2023-05-08 19:53:53 +02:00
// glConfig.extensions_string is a limited length so get the full list directly
if ( qglGetStringi )
{
GLint numExtensions ;
int i ;
qglGetIntegerv ( GL_NUM_EXTENSIONS , & numExtensions ) ;
for ( i = 0 ; i < numExtensions ; i + + )
{
ri . Printf ( PRINT_ALL , " %s " , qglGetStringi ( GL_EXTENSIONS , i ) ) ;
}
}
else
{
R_PrintLongString ( ( char * ) qglGetString ( GL_EXTENSIONS ) ) ;
}
2016-03-27 11:49:47 +02:00
ri . Printf ( PRINT_ALL , " \n " ) ;
ri . Printf ( PRINT_ALL , " GL_MAX_TEXTURE_SIZE: %d \n " , glConfig . maxTextureSize ) ;
2023-05-08 19:53:53 +02:00
ri . Printf ( PRINT_ALL , " GL_MAX_TEXTURE_IMAGE_UNITS: %d \n " , glConfig . numTextureUnits ) ;
2016-03-27 11:49:47 +02:00
ri . Printf ( PRINT_ALL , " \n PIXELFORMAT: color(%d-bits) Z(%d-bit) stencil(%d-bits) \n " , glConfig . colorBits , glConfig . depthBits , glConfig . stencilBits ) ;
ri . Printf ( PRINT_ALL , " MODE: %d, %d x %d %s hz: " , r_mode - > integer , glConfig . vidWidth , glConfig . vidHeight , fsstrings [ r_fullscreen - > integer = = 1 ] ) ;
if ( glConfig . displayFrequency )
{
ri . Printf ( PRINT_ALL , " %d \n " , glConfig . displayFrequency ) ;
}
else
{
ri . Printf ( PRINT_ALL , " N/A \n " ) ;
}
if ( glConfig . deviceSupportsGamma )
{
ri . Printf ( PRINT_ALL , " GAMMA: hardware w/ %d overbright bits \n " , tr . overbrightBits ) ;
}
else
{
ri . Printf ( PRINT_ALL , " GAMMA: software w/ %d overbright bits \n " , tr . overbrightBits ) ;
}
ri . Printf ( PRINT_ALL , " texturemode: %s \n " , r_textureMode - > string ) ;
ri . Printf ( PRINT_ALL , " picmip: %d \n " , r_picmip - > integer ) ;
ri . Printf ( PRINT_ALL , " texture bits: %d \n " , r_texturebits - > integer ) ;
ri . Printf ( PRINT_ALL , " compiled vertex arrays: %s \n " , enablestrings [ qglLockArraysEXT ! = 0 ] ) ;
ri . Printf ( PRINT_ALL , " texenv add: %s \n " , enablestrings [ glConfig . textureEnvAddAvailable ! = 0 ] ) ;
ri . Printf ( PRINT_ALL , " compressed textures: %s \n " , enablestrings [ glConfig . textureCompression ! = TC_NONE ] ) ;
if ( r_vertexLight - > integer | | glConfig . hardwareType = = GLHW_PERMEDIA2 )
{
ri . Printf ( PRINT_ALL , " HACK: using vertex lightmap approximation \n " ) ;
}
if ( glConfig . hardwareType = = GLHW_RAGEPRO )
{
ri . Printf ( PRINT_ALL , " HACK: ragePro approximations \n " ) ;
}
if ( glConfig . hardwareType = = GLHW_RIVA128 )
{
ri . Printf ( PRINT_ALL , " HACK: riva128 approximations \n " ) ;
}
if ( r_finish - > integer ) {
ri . Printf ( PRINT_ALL , " Forcing glFinish \n " ) ;
}
}
/*
= = = = = = = = = = = = = = = =
GfxMemInfo_f
= = = = = = = = = = = = = = = =
*/
void GfxMemInfo_f ( void )
{
switch ( glRefConfig . memInfo )
{
case MI_NONE :
{
ri . Printf ( PRINT_ALL , " No extension found for GPU memory info. \n " ) ;
}
break ;
case MI_NVX :
{
int value ;
qglGetIntegerv ( GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX , & value ) ;
ri . Printf ( PRINT_ALL , " GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX: %ikb \n " , value ) ;
qglGetIntegerv ( GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX , & value ) ;
ri . Printf ( PRINT_ALL , " GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX: %ikb \n " , value ) ;
qglGetIntegerv ( GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX , & value ) ;
ri . Printf ( PRINT_ALL , " GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX: %ikb \n " , value ) ;
qglGetIntegerv ( GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX , & value ) ;
ri . Printf ( PRINT_ALL , " GPU_MEMORY_INFO_EVICTION_COUNT_NVX: %i \n " , value ) ;
qglGetIntegerv ( GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX , & value ) ;
ri . Printf ( PRINT_ALL , " GPU_MEMORY_INFO_EVICTED_MEMORY_NVX: %ikb \n " , value ) ;
}
break ;
case MI_ATI :
{
// GL_ATI_meminfo
int value [ 4 ] ;
qglGetIntegerv ( GL_VBO_FREE_MEMORY_ATI , & value [ 0 ] ) ;
ri . Printf ( PRINT_ALL , " VBO_FREE_MEMORY_ATI: %ikb total %ikb largest aux: %ikb total %ikb largest \n " , value [ 0 ] , value [ 1 ] , value [ 2 ] , value [ 3 ] ) ;
qglGetIntegerv ( GL_TEXTURE_FREE_MEMORY_ATI , & value [ 0 ] ) ;
ri . Printf ( PRINT_ALL , " TEXTURE_FREE_MEMORY_ATI: %ikb total %ikb largest aux: %ikb total %ikb largest \n " , value [ 0 ] , value [ 1 ] , value [ 2 ] , value [ 3 ] ) ;
qglGetIntegerv ( GL_RENDERBUFFER_FREE_MEMORY_ATI , & value [ 0 ] ) ;
ri . Printf ( PRINT_ALL , " RENDERBUFFER_FREE_MEMORY_ATI: %ikb total %ikb largest aux: %ikb total %ikb largest \n " , value [ 0 ] , value [ 1 ] , value [ 2 ] , value [ 3 ] ) ;
}
break ;
}
}
/*
= = = = = = = = = = = = = = =
R_Register
= = = = = = = = = = = = = = =
*/
void R_Register ( void )
{
# ifdef USE_RENDERER_DLOPEN
com_altivec = ri . Cvar_Get ( " com_altivec " , " 1 " , CVAR_ARCHIVE ) ;
# endif
//
// latched and archived variables
//
r_allowExtensions = ri . Cvar_Get ( " r_allowExtensions " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ext_compressed_textures = ri . Cvar_Get ( " r_ext_compressed_textures " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ext_multitexture = ri . Cvar_Get ( " r_ext_multitexture " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ext_compiled_vertex_array = ri . Cvar_Get ( " r_ext_compiled_vertex_array " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ext_texture_env_add = ri . Cvar_Get ( " r_ext_texture_env_add " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ext_framebuffer_object = ri . Cvar_Get ( " r_ext_framebuffer_object " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ext_texture_float = ri . Cvar_Get ( " r_ext_texture_float " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ext_framebuffer_multisample = ri . Cvar_Get ( " r_ext_framebuffer_multisample " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_arb_seamless_cube_map = ri . Cvar_Get ( " r_arb_seamless_cube_map " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_arb_vertex_array_object = ri . Cvar_Get ( " r_arb_vertex_array_object " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2023-05-08 19:53:53 +02:00
r_ext_direct_state_access = ri . Cvar_Get ( " r_ext_direct_state_access " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2016-03-27 11:49:47 +02:00
r_ext_texture_filter_anisotropic = ri . Cvar_Get ( " r_ext_texture_filter_anisotropic " ,
" 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ext_max_anisotropy = ri . Cvar_Get ( " r_ext_max_anisotropy " , " 2 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_picmip = ri . Cvar_Get ( " r_picmip " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_roundImagesDown = ri . Cvar_Get ( " r_roundImagesDown " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_colorMipLevels = ri . Cvar_Get ( " r_colorMipLevels " , " 0 " , CVAR_LATCH ) ;
2023-05-24 19:03:05 +02:00
ri . Cvar_CheckRange ( r_picmip , 0 , 16 , qtrue ) ;
2016-03-27 11:49:47 +02:00
r_detailTextures = ri . Cvar_Get ( " r_detailtextures " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_texturebits = ri . Cvar_Get ( " r_texturebits " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_colorbits = ri . Cvar_Get ( " r_colorbits " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_stencilbits = ri . Cvar_Get ( " r_stencilbits " , " 8 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_depthbits = ri . Cvar_Get ( " r_depthbits " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ext_multisample = ri . Cvar_Get ( " r_ext_multisample " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2023-05-24 19:03:05 +02:00
ri . Cvar_CheckRange ( r_ext_multisample , 0 , 4 , qtrue ) ;
2016-03-27 11:49:47 +02:00
r_overBrightBits = ri . Cvar_Get ( " r_overBrightBits " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ignorehwgamma = ri . Cvar_Get ( " r_ignorehwgamma " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2023-05-08 19:53:53 +02:00
r_mode = ri . Cvar_Get ( " r_mode " , " -2 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_fullscreen = ri . Cvar_Get ( " r_fullscreen " , " 1 " , CVAR_ARCHIVE ) ;
2016-03-27 11:49:47 +02:00
r_noborder = ri . Cvar_Get ( " r_noborder " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_customwidth = ri . Cvar_Get ( " r_customwidth " , " 1600 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_customheight = ri . Cvar_Get ( " r_customheight " , " 1024 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_customPixelAspect = ri . Cvar_Get ( " r_customPixelAspect " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_simpleMipMaps = ri . Cvar_Get ( " r_simpleMipMaps " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_vertexLight = ri . Cvar_Get ( " r_vertexLight " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_uiFullScreen = ri . Cvar_Get ( " r_uifullscreen " , " 0 " , 0 ) ;
r_subdivisions = ri . Cvar_Get ( " r_subdivisions " , " 4 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_stereoEnabled = ri . Cvar_Get ( " r_stereoEnabled " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_greyscale = ri . Cvar_Get ( " r_greyscale " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2023-05-24 19:03:05 +02:00
ri . Cvar_CheckRange ( r_greyscale , 0 , 1 , qfalse ) ;
2016-03-27 11:49:47 +02:00
r_externalGLSL = ri . Cvar_Get ( " r_externalGLSL " , " 0 " , CVAR_LATCH ) ;
r_hdr = ri . Cvar_Get ( " r_hdr " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_floatLightmap = ri . Cvar_Get ( " r_floatLightmap " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_postProcess = ri . Cvar_Get ( " r_postProcess " , " 1 " , CVAR_ARCHIVE ) ;
2023-05-08 19:53:53 +02:00
r_toneMap = ri . Cvar_Get ( " r_toneMap " , " 1 " , CVAR_ARCHIVE ) ;
2016-03-27 11:49:47 +02:00
r_forceToneMap = ri . Cvar_Get ( " r_forceToneMap " , " 0 " , CVAR_CHEAT ) ;
r_forceToneMapMin = ri . Cvar_Get ( " r_forceToneMapMin " , " -8.0 " , CVAR_CHEAT ) ;
r_forceToneMapAvg = ri . Cvar_Get ( " r_forceToneMapAvg " , " -2.0 " , CVAR_CHEAT ) ;
r_forceToneMapMax = ri . Cvar_Get ( " r_forceToneMapMax " , " 0.0 " , CVAR_CHEAT ) ;
r_autoExposure = ri . Cvar_Get ( " r_autoExposure " , " 1 " , CVAR_ARCHIVE ) ;
r_forceAutoExposure = ri . Cvar_Get ( " r_forceAutoExposure " , " 0 " , CVAR_CHEAT ) ;
r_forceAutoExposureMin = ri . Cvar_Get ( " r_forceAutoExposureMin " , " -2.0 " , CVAR_CHEAT ) ;
r_forceAutoExposureMax = ri . Cvar_Get ( " r_forceAutoExposureMax " , " 2.0 " , CVAR_CHEAT ) ;
2023-05-08 19:53:53 +02:00
r_cameraExposure = ri . Cvar_Get ( " r_cameraExposure " , " 1 " , CVAR_CHEAT ) ;
2016-03-27 11:49:47 +02:00
r_depthPrepass = ri . Cvar_Get ( " r_depthPrepass " , " 1 " , CVAR_ARCHIVE ) ;
r_ssao = ri . Cvar_Get ( " r_ssao " , " 0 " , CVAR_LATCH | CVAR_ARCHIVE ) ;
r_normalMapping = ri . Cvar_Get ( " r_normalMapping " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_specularMapping = ri . Cvar_Get ( " r_specularMapping " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_deluxeMapping = ri . Cvar_Get ( " r_deluxeMapping " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_parallaxMapping = ri . Cvar_Get ( " r_parallaxMapping " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2023-05-08 19:53:53 +02:00
r_parallaxMapOffset = ri . Cvar_Get ( " r_parallaxMapOffset " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_parallaxMapShadows = ri . Cvar_Get ( " r_parallaxMapShadows " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2016-03-27 11:49:47 +02:00
r_cubeMapping = ri . Cvar_Get ( " r_cubeMapping " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2023-05-08 19:53:53 +02:00
r_cubemapSize = ri . Cvar_Get ( " r_cubemapSize " , " 128 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_deluxeSpecular = ri . Cvar_Get ( " r_deluxeSpecular " , " 0.3 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_pbr = ri . Cvar_Get ( " r_pbr " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2016-03-27 11:49:47 +02:00
r_baseNormalX = ri . Cvar_Get ( " r_baseNormalX " , " 1.0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_baseNormalY = ri . Cvar_Get ( " r_baseNormalY " , " 1.0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_baseParallax = ri . Cvar_Get ( " r_baseParallax " , " 0.05 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_baseSpecular = ri . Cvar_Get ( " r_baseSpecular " , " 0.04 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_baseGloss = ri . Cvar_Get ( " r_baseGloss " , " 0.3 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2023-05-08 19:53:53 +02:00
r_glossType = ri . Cvar_Get ( " r_glossType " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2016-03-27 11:49:47 +02:00
r_dlightMode = ri . Cvar_Get ( " r_dlightMode " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_pshadowDist = ri . Cvar_Get ( " r_pshadowDist " , " 128 " , CVAR_ARCHIVE ) ;
r_mergeLightmaps = ri . Cvar_Get ( " r_mergeLightmaps " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_imageUpsample = ri . Cvar_Get ( " r_imageUpsample " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_imageUpsampleMaxSize = ri . Cvar_Get ( " r_imageUpsampleMaxSize " , " 1024 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_imageUpsampleType = ri . Cvar_Get ( " r_imageUpsampleType " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_genNormalMaps = ri . Cvar_Get ( " r_genNormalMaps " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_forceSun = ri . Cvar_Get ( " r_forceSun " , " 0 " , CVAR_CHEAT ) ;
r_forceSunLightScale = ri . Cvar_Get ( " r_forceSunLightScale " , " 1.0 " , CVAR_CHEAT ) ;
r_forceSunAmbientScale = ri . Cvar_Get ( " r_forceSunAmbientScale " , " 0.5 " , CVAR_CHEAT ) ;
r_drawSunRays = ri . Cvar_Get ( " r_drawSunRays " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_sunlightMode = ri . Cvar_Get ( " r_sunlightMode " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_sunShadows = ri . Cvar_Get ( " r_sunShadows " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_shadowFilter = ri . Cvar_Get ( " r_shadowFilter " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2023-05-08 19:53:53 +02:00
r_shadowBlur = ri . Cvar_Get ( " r_shadowBlur " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_shadowMapSize = ri . Cvar_Get ( " r_shadowMapSize " , " 1024 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
2016-03-27 11:49:47 +02:00
r_shadowCascadeZNear = ri . Cvar_Get ( " r_shadowCascadeZNear " , " 8 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_shadowCascadeZFar = ri . Cvar_Get ( " r_shadowCascadeZFar " , " 1024 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_shadowCascadeZBias = ri . Cvar_Get ( " r_shadowCascadeZBias " , " 0 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
r_ignoreDstAlpha = ri . Cvar_Get ( " r_ignoreDstAlpha " , " 1 " , CVAR_ARCHIVE | CVAR_LATCH ) ;
//
// temporary latched variables that can only change over a restart
//
r_displayRefresh = ri . Cvar_Get ( " r_displayRefresh " , " 0 " , CVAR_LATCH ) ;
2023-05-24 19:03:05 +02:00
ri . Cvar_CheckRange ( r_displayRefresh , 0 , 200 , qtrue ) ;
2016-03-27 11:49:47 +02:00
r_fullbright = ri . Cvar_Get ( " r_fullbright " , " 0 " , CVAR_LATCH | CVAR_CHEAT ) ;
r_mapOverBrightBits = ri . Cvar_Get ( " r_mapOverBrightBits " , " 2 " , CVAR_LATCH ) ;
r_intensity = ri . Cvar_Get ( " r_intensity " , " 1 " , CVAR_LATCH ) ;
r_singleShader = ri . Cvar_Get ( " r_singleShader " , " 0 " , CVAR_CHEAT | CVAR_LATCH ) ;
//
// archived variables that can change at any time
//
r_lodCurveError = ri . Cvar_Get ( " r_lodCurveError " , " 250 " , CVAR_ARCHIVE | CVAR_CHEAT ) ;
r_lodbias = ri . Cvar_Get ( " r_lodbias " , " 0 " , CVAR_ARCHIVE ) ;
r_flares = ri . Cvar_Get ( " r_flares " , " 0 " , CVAR_ARCHIVE ) ;
r_znear = ri . Cvar_Get ( " r_znear " , " 4 " , CVAR_CHEAT ) ;
2023-05-24 19:03:05 +02:00
ri . Cvar_CheckRange ( r_znear , 0.001f , 200 , qfalse ) ;
2016-03-27 11:49:47 +02:00
r_zproj = ri . Cvar_Get ( " r_zproj " , " 64 " , CVAR_ARCHIVE ) ;
r_stereoSeparation = ri . Cvar_Get ( " r_stereoSeparation " , " 64 " , CVAR_ARCHIVE ) ;
r_ignoreGLErrors = ri . Cvar_Get ( " r_ignoreGLErrors " , " 1 " , CVAR_ARCHIVE ) ;
r_fastsky = ri . Cvar_Get ( " r_fastsky " , " 0 " , CVAR_ARCHIVE ) ;
r_inGameVideo = ri . Cvar_Get ( " r_inGameVideo " , " 1 " , CVAR_ARCHIVE ) ;
r_drawSun = ri . Cvar_Get ( " r_drawSun " , " 0 " , CVAR_ARCHIVE ) ;
r_dynamiclight = ri . Cvar_Get ( " r_dynamiclight " , " 1 " , CVAR_ARCHIVE ) ;
r_dlightBacks = ri . Cvar_Get ( " r_dlightBacks " , " 1 " , CVAR_ARCHIVE ) ;
r_finish = ri . Cvar_Get ( " r_finish " , " 0 " , CVAR_ARCHIVE ) ;
2023-05-08 19:53:53 +02:00
r_textureMode = ri . Cvar_Get ( " r_textureMode " , " GL_LINEAR_MIPMAP_LINEAR " , CVAR_ARCHIVE ) ;
2024-12-01 15:36:52 +01:00
# ifdef __EMSCRIPTEN__
// Under Emscripten we don't throttle framerate with com_maxfps by default, so enable
// vsync by default instead.
r_swapInterval = ri . Cvar_Get ( " r_swapInterval " , " 1 " ,
CVAR_ARCHIVE | CVAR_LATCH ) ;
# else
2016-03-27 11:49:47 +02:00
r_swapInterval = ri . Cvar_Get ( " r_swapInterval " , " 0 " ,
CVAR_ARCHIVE | CVAR_LATCH ) ;
2024-12-01 15:36:52 +01:00
# endif
2016-03-27 11:49:47 +02:00
r_gamma = ri . Cvar_Get ( " r_gamma " , " 1 " , CVAR_ARCHIVE ) ;
r_facePlaneCull = ri . Cvar_Get ( " r_facePlaneCull " , " 1 " , CVAR_ARCHIVE ) ;
r_railWidth = ri . Cvar_Get ( " r_railWidth " , " 16 " , CVAR_ARCHIVE ) ;
r_railCoreWidth = ri . Cvar_Get ( " r_railCoreWidth " , " 6 " , CVAR_ARCHIVE ) ;
r_railSegmentLength = ri . Cvar_Get ( " r_railSegmentLength " , " 32 " , CVAR_ARCHIVE ) ;
r_ambientScale = ri . Cvar_Get ( " r_ambientScale " , " 0.6 " , CVAR_CHEAT ) ;
r_directedScale = ri . Cvar_Get ( " r_directedScale " , " 1 " , CVAR_CHEAT ) ;
r_anaglyphMode = ri . Cvar_Get ( " r_anaglyphMode " , " 0 " , CVAR_ARCHIVE ) ;
//
// temporary variables that can change at any time
//
r_showImages = ri . Cvar_Get ( " r_showImages " , " 0 " , CVAR_TEMP ) ;
r_debugLight = ri . Cvar_Get ( " r_debuglight " , " 0 " , CVAR_TEMP ) ;
r_debugSort = ri . Cvar_Get ( " r_debugSort " , " 0 " , CVAR_CHEAT ) ;
r_printShaders = ri . Cvar_Get ( " r_printShaders " , " 0 " , 0 ) ;
r_saveFontData = ri . Cvar_Get ( " r_saveFontData " , " 0 " , 0 ) ;
r_nocurves = ri . Cvar_Get ( " r_nocurves " , " 0 " , CVAR_CHEAT ) ;
r_drawworld = ri . Cvar_Get ( " r_drawworld " , " 1 " , CVAR_CHEAT ) ;
r_lightmap = ri . Cvar_Get ( " r_lightmap " , " 0 " , 0 ) ;
r_portalOnly = ri . Cvar_Get ( " r_portalOnly " , " 0 " , CVAR_CHEAT ) ;
r_flareSize = ri . Cvar_Get ( " r_flareSize " , " 40 " , CVAR_CHEAT ) ;
r_flareFade = ri . Cvar_Get ( " r_flareFade " , " 7 " , CVAR_CHEAT ) ;
r_flareCoeff = ri . Cvar_Get ( " r_flareCoeff " , FLARE_STDCOEFF , CVAR_CHEAT ) ;
r_skipBackEnd = ri . Cvar_Get ( " r_skipBackEnd " , " 0 " , CVAR_CHEAT ) ;
r_measureOverdraw = ri . Cvar_Get ( " r_measureOverdraw " , " 0 " , CVAR_CHEAT ) ;
r_lodscale = ri . Cvar_Get ( " r_lodscale " , " 5 " , CVAR_CHEAT ) ;
r_norefresh = ri . Cvar_Get ( " r_norefresh " , " 0 " , CVAR_CHEAT ) ;
r_drawentities = ri . Cvar_Get ( " r_drawentities " , " 1 " , CVAR_CHEAT ) ;
r_ignore = ri . Cvar_Get ( " r_ignore " , " 1 " , CVAR_CHEAT ) ;
r_nocull = ri . Cvar_Get ( " r_nocull " , " 0 " , CVAR_CHEAT ) ;
r_novis = ri . Cvar_Get ( " r_novis " , " 0 " , CVAR_CHEAT ) ;
r_showcluster = ri . Cvar_Get ( " r_showcluster " , " 0 " , CVAR_CHEAT ) ;
r_speeds = ri . Cvar_Get ( " r_speeds " , " 0 " , CVAR_CHEAT ) ;
r_verbose = ri . Cvar_Get ( " r_verbose " , " 0 " , CVAR_CHEAT ) ;
r_logFile = ri . Cvar_Get ( " r_logFile " , " 0 " , CVAR_CHEAT ) ;
r_debugSurface = ri . Cvar_Get ( " r_debugSurface " , " 0 " , CVAR_CHEAT ) ;
r_nobind = ri . Cvar_Get ( " r_nobind " , " 0 " , CVAR_CHEAT ) ;
r_showtris = ri . Cvar_Get ( " r_showtris " , " 0 " , CVAR_CHEAT ) ;
r_showsky = ri . Cvar_Get ( " r_showsky " , " 0 " , CVAR_CHEAT ) ;
r_shownormals = ri . Cvar_Get ( " r_shownormals " , " 0 " , CVAR_CHEAT ) ;
r_clear = ri . Cvar_Get ( " r_clear " , " 0 " , CVAR_CHEAT ) ;
r_offsetFactor = ri . Cvar_Get ( " r_offsetfactor " , " -1 " , CVAR_CHEAT ) ;
r_offsetUnits = ri . Cvar_Get ( " r_offsetunits " , " -2 " , CVAR_CHEAT ) ;
r_drawBuffer = ri . Cvar_Get ( " r_drawBuffer " , " GL_BACK " , CVAR_CHEAT ) ;
r_lockpvs = ri . Cvar_Get ( " r_lockpvs " , " 0 " , CVAR_CHEAT ) ;
r_noportals = ri . Cvar_Get ( " r_noportals " , " 0 " , CVAR_CHEAT ) ;
r_shadows = ri . Cvar_Get ( " cg_shadows " , " 1 " , 0 ) ;
r_marksOnTriangleMeshes = ri . Cvar_Get ( " r_marksOnTriangleMeshes " , " 0 " , CVAR_ARCHIVE ) ;
r_aviMotionJpegQuality = ri . Cvar_Get ( " r_aviMotionJpegQuality " , " 90 " , CVAR_ARCHIVE ) ;
r_screenshotJpegQuality = ri . Cvar_Get ( " r_screenshotJpegQuality " , " 90 " , CVAR_ARCHIVE ) ;
r_maxpolys = ri . Cvar_Get ( " r_maxpolys " , va ( " %d " , MAX_POLYS ) , 0 ) ;
r_maxpolyverts = ri . Cvar_Get ( " r_maxpolyverts " , va ( " %d " , MAX_POLYVERTS ) , 0 ) ;
// make sure all the commands added here are also
// removed in R_Shutdown
ri . Cmd_AddCommand ( " imagelist " , R_ImageList_f ) ;
ri . Cmd_AddCommand ( " shaderlist " , R_ShaderList_f ) ;
ri . Cmd_AddCommand ( " skinlist " , R_SkinList_f ) ;
ri . Cmd_AddCommand ( " modellist " , R_Modellist_f ) ;
ri . Cmd_AddCommand ( " modelist " , R_ModeList_f ) ;
ri . Cmd_AddCommand ( " screenshot " , R_ScreenShot_f ) ;
ri . Cmd_AddCommand ( " screenshotJPEG " , R_ScreenShotJPEG_f ) ;
ri . Cmd_AddCommand ( " gfxinfo " , GfxInfo_f ) ;
ri . Cmd_AddCommand ( " minimize " , GLimp_Minimize ) ;
ri . Cmd_AddCommand ( " gfxmeminfo " , GfxMemInfo_f ) ;
2023-05-08 19:53:53 +02:00
ri . Cmd_AddCommand ( " exportCubemaps " , R_ExportCubemaps_f ) ;
2024-12-19 23:18:21 +01:00
//
// OPENMOHAA-specific stuff
//
// Draw
r_drawentitypoly = ri . Cvar_Get ( " r_drawentitypoly " , " 1 " , CVAR_CHEAT ) ;
r_drawstaticmodels = ri . Cvar_Get ( " r_drawstaticmodels " , " 1 " , CVAR_CHEAT ) ;
r_drawstaticmodelpoly = ri . Cvar_Get ( " r_drawstaticmodelpoly " , " 1 " , CVAR_CHEAT ) ;
r_drawstaticdecals = ri . Cvar_Get ( " r_drawstaticdecals " , " 0 " , 0 ) ;
r_drawterrain = ri . Cvar_Get ( " r_drawterrain " , " 1 " , CVAR_CHEAT ) ;
r_drawsprites = ri . Cvar_Get ( " r_drawsprites " , " 1 " , CVAR_CHEAT ) ;
r_drawspherelights = ri . Cvar_Get ( " r_drawspherelights " , " 1 " , CVAR_CHEAT ) ;
r_debuglines_depthmask = ri . Cvar_Get ( " r_debuglines_depthmask " , " 0 " , CVAR_ARCHIVE ) ;
r_stipplelines = ri . Cvar_Get ( " r_stipplelines " , " 1 " , CVAR_ARCHIVE ) ;
r_numdebuglines = ri . Cvar_Get ( " g_numdebuglines " , " 4096 " , CVAR_LATCH ) ;
r_maxtermarks = ri . Cvar_Get ( " r_maxtermarks " , va ( " %d " , MAX_TERMARKS ) , 0 ) ;
2024-12-21 21:43:42 +01:00
2024-12-19 23:18:21 +01:00
r_skyportal = ri . Cvar_Get ( " r_skyportal " , " 0 " , 0 ) ;
r_skyportal_origin = ri . Cvar_Get ( " r_skyportal_origin " , " 0 0 0 " , 0 ) ;
2024-12-21 17:04:23 +01:00
r_farplane = ri . Cvar_Get ( " r_farplane " , " 0 " , CVAR_CHEAT ) ;
r_farplane_bias = ri . Cvar_Get ( " r_farplane_bias " , " 0 " , CVAR_CHEAT ) ;
r_farplane_color = ri . Cvar_Get ( " r_farplane_color " , " .5 .5 .5 " , CVAR_CHEAT ) ;
r_farplane_nocull = ri . Cvar_Get ( " r_farplane_nocull " , " 0 " , CVAR_CHEAT ) ;
r_farplane_nofog = ri . Cvar_Get ( " r_farplane_nofog " , " 0 " , CVAR_CHEAT ) ;
r_skybox_farplane = ri . Cvar_Get ( " r_skybox_farplane " , " 0 " , CVAR_CHEAT ) ;
r_farclip = ri . Cvar_Get ( " r_farclip " , " 0 " , CVAR_CHEAT ) ;
2024-12-21 21:43:42 +01:00
// Lighting
2024-12-19 23:18:21 +01:00
r_lightcoronasize = ri . Cvar_Get ( " r_lightcoronasize " , " .1 " , CVAR_ARCHIVE ) ;
2024-12-21 21:43:42 +01:00
r_light_lines = ri . Cvar_Get ( " r_light_lines " , " 0 " , CVAR_CHEAT ) ;
r_light_sun_line = ri . Cvar_Get ( " r_light_sun_line " , " 0 " , CVAR_CHEAT ) ;
r_light_int_scale = ri . Cvar_Get ( " r_light_int_scale " , " 0.05 " , CVAR_ARCHIVE ) ;
r_light_nolight = ri . Cvar_Get ( " r_light_nolight " , " 0 " , CVAR_CHEAT | CVAR_ARCHIVE ) ;
r_light_showgrid = ri . Cvar_Get ( " r_light_showgrid " , " 0 " , CVAR_CHEAT ) ;
r_entlight_scale = ri . Cvar_Get ( " r_entlight_scale " , " 1.3 " , CVAR_CHEAT ) ;
r_entlight_errbound = ri . Cvar_Get ( " r_entlight_errbound " , " 6 " , CVAR_ARCHIVE ) ;
r_entlight_cubelevel = ri . Cvar_Get ( " r_entlight_cubelevel " , " 0 " , CVAR_ARCHIVE ) ;
r_entlight_cubefraction = ri . Cvar_Get ( " r_entlight_cubefraction " , " 0.5 " , CVAR_ARCHIVE ) ;
r_entlight_maxcalc = ri . Cvar_Get ( " r_entlight_maxcalc " , " 2 " , CVAR_ARCHIVE ) ;
2024-12-19 23:18:21 +01:00
// LOD
r_staticlod = ri . Cvar_Get ( " r_staticlod " , " 1 " , CVAR_CHEAT ) ;
r_lodscale = ri . Cvar_Get ( " r_lodscale " , " 5 " , CVAR_ARCHIVE ) ;
r_lodcap = ri . Cvar_Get ( " r_lodcap " , " 0.35 " , CVAR_ARCHIVE ) ;
r_lodviewmodelcap = ri . Cvar_Get ( " r_lodviewmodelcap " , " 0.25 " , CVAR_ARCHIVE ) ;
r_uselod = ri . Cvar_Get ( " r_uselod " , " 1 " , CVAR_TEMP ) ;
lod_LOD = ri . Cvar_Get ( " lod_LOD " , " 0 " , CVAR_TEMP ) ;
lod_minLOD = ri . Cvar_Get ( " lod_minLOD " , " 1.0 " , CVAR_TEMP ) ;
lod_maxLOD = ri . Cvar_Get ( " lod_maxLOD " , " 0.3 " , CVAR_TEMP ) ;
lod_LOD_slider = ri . Cvar_Get ( " lod_LOD_slider " , " 0.5 " , CVAR_TEMP ) ;
lod_edit_0 = ri . Cvar_Get ( " lod_edit_0 " , " 0 " , CVAR_TEMP ) ;
lod_edit_1 = ri . Cvar_Get ( " lod_edit_1 " , " 0 " , CVAR_TEMP ) ;
lod_edit_2 = ri . Cvar_Get ( " lod_edit_2 " , " 0 " , CVAR_TEMP ) ;
lod_edit_3 = ri . Cvar_Get ( " lod_edit_3 " , " 0 " , CVAR_TEMP ) ;
lod_edit_4 = ri . Cvar_Get ( " lod_edit_4 " , " 0 " , CVAR_TEMP ) ;
lod_curve_0_val = ri . Cvar_Get ( " lod_curve_0_val " , " 0 " , CVAR_TEMP ) ;
lod_curve_1_val = ri . Cvar_Get ( " lod_curve_1_val " , " 0 " , CVAR_TEMP ) ;
lod_curve_2_val = ri . Cvar_Get ( " lod_curve_2_val " , " 0 " , CVAR_TEMP ) ;
lod_curve_3_val = ri . Cvar_Get ( " lod_curve_3_val " , " 0 " , CVAR_TEMP ) ;
lod_curve_4_val = ri . Cvar_Get ( " lod_curve_4_val " , " 0 " , CVAR_TEMP ) ;
lod_curve_0_slider = ri . Cvar_Get ( " lod_curve_0_slider " , " 0 " , CVAR_TEMP ) ;
lod_curve_1_slider = ri . Cvar_Get ( " lod_curve_1_slider " , " 0 " , CVAR_TEMP ) ;
lod_curve_2_slider = ri . Cvar_Get ( " lod_curve_2_slider " , " 0 " , CVAR_TEMP ) ;
lod_curve_3_slider = ri . Cvar_Get ( " lod_curve_3_slider " , " 0 " , CVAR_TEMP ) ;
lod_curve_4_slider = ri . Cvar_Get ( " lod_curve_4_slider " , " 0 " , CVAR_TEMP ) ;
lod_pitch_val = ri . Cvar_Get ( " lod_pitch_val " , " 0 " , CVAR_TEMP ) ;
lod_zee_val = ri . Cvar_Get ( " lod_zee_val " , " 0 " , CVAR_TEMP ) ;
lod_mesh = ri . Cvar_Get ( " lod_mesh " , " 0 " , CVAR_TEMP ) ;
lod_meshname = ri . Cvar_Get ( " lod_meshname " , " " , CVAR_TEMP ) ;
lod_tikiname = ri . Cvar_Get ( " lod_tikiname " , " " , CVAR_TEMP ) ;
lod_metric = ri . Cvar_Get ( " lod_metric " , " 0.0 " , CVAR_TEMP ) ;
lod_tris = ri . Cvar_Get ( " lod_tris " , " " , CVAR_TEMP ) ;
lod_save = ri . Cvar_Get ( " lod_save " , " 0 " , CVAR_TEMP ) ;
lod_position = ri . Cvar_Get ( " lod_position " , " 0 0 0 " , CVAR_TEMP ) ;
lod_tool = ri . Cvar_Get ( " lod_tool " , " 0 " , CVAR_TEMP ) ;
// Utils
r_fps = ri . Cvar_Get ( " fps " , " 0 " , 0 ) ;
r_developer = ri . Cvar_Get ( " developer " , " " , 0 ) ;
r_showstaticbboxes = ri . Cvar_Get ( " r_showstaticbboxes " , " 0 " , CVAR_CHEAT ) ;
r_showcull = ri . Cvar_Get ( " r_showcull " , " 0 " , CVAR_CHEAT ) ;
r_showlod = ri . Cvar_Get ( " r_showlod " , " 0 " , CVAR_TEMP ) ;
r_showstaticlod = ri . Cvar_Get ( " r_showstaticlod " , " 0 " , CVAR_TEMP ) ;
2024-12-21 17:04:23 +01:00
r_showportal = ri . Cvar_Get ( " r_showportal " , " 0 " , 0 ) ;
2016-03-27 11:49:47 +02:00
}
void R_InitQueries ( void )
{
if ( ! glRefConfig . occlusionQuery )
return ;
if ( r_drawSunRays - > integer )
2023-05-08 19:53:53 +02:00
qglGenQueries ( ARRAY_LEN ( tr . sunFlareQuery ) , tr . sunFlareQuery ) ;
2016-03-27 11:49:47 +02:00
}
void R_ShutDownQueries ( void )
{
if ( ! glRefConfig . occlusionQuery )
return ;
if ( r_drawSunRays - > integer )
2023-05-08 19:53:53 +02:00
qglDeleteQueries ( ARRAY_LEN ( tr . sunFlareQuery ) , tr . sunFlareQuery ) ;
2016-03-27 11:49:47 +02:00
}
/*
= = = = = = = = = = = = = = =
R_Init
= = = = = = = = = = = = = = =
*/
void R_Init ( void ) {
int err ;
int i ;
byte * ptr ;
ri . Printf ( PRINT_ALL , " ----- R_Init ----- \n " ) ;
// clear all our internal state
Com_Memset ( & tr , 0 , sizeof ( tr ) ) ;
Com_Memset ( & backEnd , 0 , sizeof ( backEnd ) ) ;
Com_Memset ( & tess , 0 , sizeof ( tess ) ) ;
2024-12-01 20:34:38 +01:00
//if(sizeof(glconfig_t) != 11332)
// ri.Error( ERR_FATAL, "Mod ABI incompatible: sizeof(glconfig_t) == %u != 11332", (unsigned int) sizeof(glconfig_t));
2016-03-27 11:49:47 +02:00
// Swap_Init();
if ( ( intptr_t ) tess . xyz & 15 ) {
ri . Printf ( PRINT_WARNING , " tess.xyz not 16 byte aligned \n " ) ;
}
//Com_Memset( tess.constantColor255, 255, sizeof( tess.constantColor255 ) );
//
// init function tables
//
for ( i = 0 ; i < FUNCTABLE_SIZE ; i + + )
{
tr . sinTable [ i ] = sin ( DEG2RAD ( i * 360.0f / ( ( float ) ( FUNCTABLE_SIZE - 1 ) ) ) ) ;
tr . squareTable [ i ] = ( i < FUNCTABLE_SIZE / 2 ) ? 1.0f : - 1.0f ;
tr . sawToothTable [ i ] = ( float ) i / FUNCTABLE_SIZE ;
tr . inverseSawToothTable [ i ] = 1.0f - tr . sawToothTable [ i ] ;
if ( i < FUNCTABLE_SIZE / 2 )
{
if ( i < FUNCTABLE_SIZE / 4 )
{
tr . triangleTable [ i ] = ( float ) i / ( FUNCTABLE_SIZE / 4 ) ;
}
else
{
tr . triangleTable [ i ] = 1.0f - tr . triangleTable [ i - FUNCTABLE_SIZE / 4 ] ;
}
}
else
{
tr . triangleTable [ i ] = - tr . triangleTable [ i - FUNCTABLE_SIZE / 2 ] ;
}
}
R_InitFogTable ( ) ;
R_NoiseInit ( ) ;
R_Register ( ) ;
max_polys = r_maxpolys - > integer ;
if ( max_polys < MAX_POLYS )
max_polys = MAX_POLYS ;
max_polyverts = r_maxpolyverts - > integer ;
if ( max_polyverts < MAX_POLYVERTS )
max_polyverts = MAX_POLYVERTS ;
2023-05-24 19:03:05 +02:00
ptr = ri . Hunk_Alloc ( sizeof ( * backEndData ) + sizeof ( srfPoly_t ) * max_polys + sizeof ( polyVert_t ) * max_polyverts , h_low ) ;
2016-03-27 11:49:47 +02:00
backEndData = ( backEndData_t * ) ptr ;
backEndData - > polys = ( srfPoly_t * ) ( ( char * ) ptr + sizeof ( * backEndData ) ) ;
backEndData - > polyVerts = ( polyVert_t * ) ( ( char * ) ptr + sizeof ( * backEndData ) + sizeof ( srfPoly_t ) * max_polys ) ;
R_InitNextFrame ( ) ;
InitOpenGL ( ) ;
R_InitImages ( ) ;
if ( glRefConfig . framebufferObject )
FBO_Init ( ) ;
GLSL_InitGPUShaders ( ) ;
R_InitVaos ( ) ;
R_InitShaders ( ) ;
R_InitSkins ( ) ;
R_ModelInit ( ) ;
R_InitFreeType ( ) ;
R_InitQueries ( ) ;
2024-12-21 17:04:23 +01:00
//
// OPENMOHAA-specific stuff
//=========================
R_Sky_Init ( ) ;
max_termarks = r_maxtermarks - > integer ;
if ( max_termarks < MAX_TERMARKS )
max_termarks = MAX_TERMARKS ;
R_LevelMarksInit ( ) ;
tr . pFontDebugStrings = R_LoadFont ( " verdana-14 " ) ;
g_bInfoworldtris = qfalse ;
//=========================
2016-03-27 11:49:47 +02:00
err = qglGetError ( ) ;
if ( err ! = GL_NO_ERROR )
ri . Printf ( PRINT_ALL , " glGetError() = 0x%x \n " , err ) ;
// print info
GfxInfo_f ( ) ;
ri . Printf ( PRINT_ALL , " ----- finished R_Init ----- \n " ) ;
}
/*
= = = = = = = = = = = = = = =
RE_Shutdown
= = = = = = = = = = = = = = =
*/
void RE_Shutdown ( qboolean destroyWindow ) {
ri . Printf ( PRINT_ALL , " RE_Shutdown( %i ) \n " , destroyWindow ) ;
2023-05-08 19:53:53 +02:00
ri . Cmd_RemoveCommand ( " imagelist " ) ;
ri . Cmd_RemoveCommand ( " shaderlist " ) ;
ri . Cmd_RemoveCommand ( " skinlist " ) ;
ri . Cmd_RemoveCommand ( " modellist " ) ;
2016-03-27 11:49:47 +02:00
ri . Cmd_RemoveCommand ( " modelist " ) ;
2023-05-08 19:53:53 +02:00
ri . Cmd_RemoveCommand ( " screenshot " ) ;
ri . Cmd_RemoveCommand ( " screenshotJPEG " ) ;
ri . Cmd_RemoveCommand ( " gfxinfo " ) ;
ri . Cmd_RemoveCommand ( " minimize " ) ;
2016-03-27 11:49:47 +02:00
ri . Cmd_RemoveCommand ( " gfxmeminfo " ) ;
2023-05-08 19:53:53 +02:00
ri . Cmd_RemoveCommand ( " exportCubemaps " ) ;
2016-03-27 11:49:47 +02:00
if ( tr . registered ) {
R_IssuePendingRenderCommands ( ) ;
R_ShutDownQueries ( ) ;
if ( glRefConfig . framebufferObject )
FBO_Shutdown ( ) ;
R_DeleteTextures ( ) ;
R_ShutdownVaos ( ) ;
GLSL_ShutdownGPUShaders ( ) ;
}
R_DoneFreeType ( ) ;
// shut down platform specific OpenGL stuff
if ( destroyWindow ) {
GLimp_Shutdown ( ) ;
2023-05-08 19:53:53 +02:00
Com_Memset ( & glConfig , 0 , sizeof ( glConfig ) ) ;
Com_Memset ( & glRefConfig , 0 , sizeof ( glRefConfig ) ) ;
textureFilterAnisotropic = qfalse ;
maxAnisotropy = 0 ;
displayAspect = 0.0f ;
haveClampToEdge = qfalse ;
2023-05-08 00:02:31 +02:00
2023-05-08 19:53:53 +02:00
Com_Memset ( & glState , 0 , sizeof ( glState ) ) ;
2016-03-27 11:49:47 +02:00
}
tr . registered = qfalse ;
}
2024-12-19 23:18:21 +01:00
//
// OPENMOHAA-specific stuff
//=========================
/*
* * RE_BeginRegistration
*/
void RE_BeginRegistration ( glconfig_t * glconfigOut ) {
R_Init ( ) ;
* glconfigOut = glConfig ;
R_IssuePendingRenderCommands ( ) ;
tr . viewCluster = - 1 ; // force markleafs to regenerate
R_ClearFlares ( ) ;
RE_ClearScene ( ) ;
tr . registered = qtrue ;
}
//=========================
2016-03-27 11:49:47 +02:00
/*
= = = = = = = = = = = = =
RE_EndRegistration
Touch all images to make sure they are resident
= = = = = = = = = = = = =
*/
void RE_EndRegistration ( void ) {
R_IssuePendingRenderCommands ( ) ;
2023-05-08 19:53:53 +02:00
if ( ! ri . Sys_LowPhysicalMemory ( ) ) {
RB_ShowImages ( ) ;
}
2016-03-27 11:49:47 +02:00
}
2024-12-19 23:18:21 +01:00
//
// OPENMOHAA-specific stuff
//=========================
/*
= = = = = = = = = = = = = = = = = =
R_SetMode
= = = = = = = = = = = = = = = = = =
*/
qboolean R_SetMode ( int mode , const glconfig_t * glConfig ) {
// FIXME: unimplemented (GL2)
ri . Printf ( PRINT_WARNING , " R_SetMode is unimplemented. To change the video mode, set the \" r_mode \" variable and execute the \" vid_restart \" command. \n " ) ;
return qfalse ;
}
/*
= = = = = = = = = = = = = = = = = =
R_SetFullscreen
= = = = = = = = = = = = = = = = = =
*/
void R_SetFullscreen ( qboolean fullscreen ) {
// FIXME: unimplemented (GL2)
ri . Printf ( PRINT_WARNING , " R_SetFullscreen is unimplemented. To change the fullscreen mode, set the \" r_fullscreen \" variable and execute the \" vid_restart \" command. \n " ) ;
}
/*
= = = = = = = = = = = = =
RE_SetRenderTime
= = = = = = = = = = = = =
*/
void RE_SetRenderTime ( int t ) {
backEnd . refdef . floatTime = ( long double ) t / 1000.0 ;
R_UpdateGhostTextures ( ) ;
}
/*
= = = = = = = = = = = = = = = = = =
RE_GetGraphicsInfo
= = = = = = = = = = = = = = = = = =
*/
const char * RE_GetGraphicsInfo ( ) {
// FIXME: unimplemented (GL2)
// Looks like it's unused anyway
}
//=========================
2016-03-27 11:49:47 +02:00
/*
@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
GetRefAPI
@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
*/
# ifdef USE_RENDERER_DLOPEN
Q_EXPORT refexport_t * QDECL GetRefAPI ( int apiVersion , refimport_t * rimp ) {
# else
refexport_t * GetRefAPI ( int apiVersion , refimport_t * rimp ) {
# endif
static refexport_t re ;
ri = * rimp ;
Com_Memset ( & re , 0 , sizeof ( re ) ) ;
if ( apiVersion ! = REF_API_VERSION ) {
ri . Printf ( PRINT_ALL , " Mismatched REF_API_VERSION: expected %i, got %i \n " ,
REF_API_VERSION , apiVersion ) ;
return NULL ;
}
// the RE_ functions are Renderer Entry points
2023-05-24 19:03:05 +02:00
re . Shutdown = RE_Shutdown ;
re . BeginRegistration = RE_BeginRegistration ;
re . RegisterModel = RE_RegisterModel ;
re . RegisterSkin = RE_RegisterSkin ;
re . RegisterShader = RE_RegisterShader ;
re . RegisterShaderNoMip = RE_RegisterShaderNoMip ;
re . LoadWorld = RE_LoadWorldMap ;
re . SetWorldVisData = RE_SetWorldVisData ;
re . EndRegistration = RE_EndRegistration ;
re . BeginFrame = RE_BeginFrame ;
re . EndFrame = RE_EndFrame ;
re . MarkFragments = R_MarkFragments ;
re . LerpTag = R_LerpTag ;
re . ModelBounds = R_ModelBounds ;
re . ClearScene = RE_ClearScene ;
re . AddRefEntityToScene = RE_AddRefEntityToScene ;
re . AddPolyToScene = RE_AddPolyToScene ;
re . LightForPoint = R_LightForPoint ;
re . AddLightToScene = RE_AddLightToScene ;
re . AddAdditiveLightToScene = RE_AddAdditiveLightToScene ;
re . RenderScene = RE_RenderScene ;
re . SetColor = RE_SetColor ;
re . DrawStretchPic = RE_StretchPic ;
re . DrawStretchRaw = RE_StretchRaw ;
re . UploadCinematic = RE_UploadCinematic ;
re . RegisterFont = RE_RegisterFont ;
re . RemapShader = R_RemapShader ;
re . GetEntityToken = R_GetEntityToken ;
re . inPVS = R_inPVS ;
re . TakeVideoFrame = RE_TakeVideoFrame ;
2016-03-27 11:49:47 +02:00
2024-12-19 23:18:21 +01:00
//
// After ioquake3 imports
//
re . FreeModels = RE_FreeModels ;
re . EndRegistration = RE_EndRegistration ;
re . SpawnEffectModel = RE_SpawnEffectModel ;
re . RegisterServerModel = RE_RegisterServerModel ;
re . UnregisterServerModel = RE_UnregisterServerModel ;
re . RefreshShaderNoMip = RE_RefreshShaderNoMip ;
re . PrintBSPFileSizes = RE_PrintBSPFileSizes ;
re . MapVersion = RE_MapVersion ;
re . LoadFont = R_LoadFont ;
re . MarkFragmentsForInlineModel = R_MarkFragmentsForInlineModel ;
re . GetInlineModelBounds = R_GetInlineModelBounds ;
re . GetLightingForDecal = R_GetLightingForDecal ;
re . GetLightingForSmoke = R_GetLightingForSmoke ;
re . R_GatherLightSources = R_GatherLightSources ;
re . ModelRadius = R_ModelRadius ;
2024-12-22 20:27:59 +01:00
re . AddPolyToScene = RE_AddPolyToScene2 ;
2024-12-19 23:18:21 +01:00
re . AddRefSpriteToScene = RE_AddRefSpriteToScene ;
re . AddTerrainMarkToScene = RE_AddTerrainMarkToScene ;
re . GetRenderEntity = RE_GetRenderEntity ;
re . SavePerformanceCounters = R_SavePerformanceCounters ;
re . R_Model_GetHandle = R_Model_GetHandle ;
re . SetColor = Draw_SetColor ;
re . DrawStretchPic = Draw_StretchPic ;
re . DrawStretchPic2 = Draw_StretchPic2 ;
re . DrawStretchRaw = RE_StretchRaw ;
re . DebugLine = R_DebugLine ;
re . DrawTilePic = Draw_TilePic ;
re . DrawTilePicOffset = Draw_TilePicOffset ;
re . DrawTrianglePic = Draw_TrianglePic ;
re . DrawBox = DrawBox ;
re . AddBox = AddBox ;
re . Set2DWindow = Set2DWindow ;
re . Scissor = RE_Scissor ;
re . DrawLineLoop = DrawLineLoop ;
re . DrawString = R_DrawString ;
re . GetFontHeight = R_GetFontHeight ;
re . GetFontStringWidth = R_GetFontStringWidth ;
re . SwipeBegin = RE_SwipeBegin ;
re . SwipeEnd = RE_SwipeEnd ;
re . SetRenderTime = RE_SetRenderTime ;
re . Noise = R_NoiseGet4f ;
re . SetMode = R_SetMode ;
re . SetFullscreen = R_SetFullscreen ;
re . GetShaderHeight = RE_GetShaderHeight ;
re . GetShaderWidth = RE_GetShaderWidth ;
re . GetShaderName = RE_GetShaderName ;
re . GetModelName = RE_GetModelName ;
re . GetGraphicsInfo = RE_GetGraphicsInfo ;
re . ForceUpdatePose = RE_ForceUpdatePose ;
re . TIKI_Orientation = RE_TIKI_Orientation ;
re . TIKI_IsOnGround = RE_TIKI_IsOnGround ;
re . SetFrameNumber = RE_SetFrameNumber ;
re . ImageExists = R_ImageExists ;
re . CountTextureMemory = R_CountTextureMemory ;
2016-03-27 11:49:47 +02:00
return & re ;
}