UFO: Alien Invasion
Loading...
Searching...
No Matches
r_main.cpp
Go to the documentation of this file.
1
4
5/*
6Copyright (C) 1997-2001 Id Software, Inc.
7
8This program is free software; you can redistribute it and/or
9modify it under the terms of the GNU General Public License
10as published by the Free Software Foundation; either version 2
11of the License, or (at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16
17See the GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
21Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
23*/
24
25#define QGL_EXTERN
26#include "r_gl.h"
27#include "r_local.h"
28#include "r_program.h"
29#include "r_sphere.h"
30#include "r_draw.h"
31#include "r_font.h"
32#include "r_light.h"
33#include "r_lightmap.h"
34#include "r_grass.h"
35#include "r_weather.h"
36#include "r_main.h"
37#include "r_geoscape.h"
38#include "r_misc.h"
39#include "r_error.h"
41#include "../ui/ui_windows.h"
42#include "../../ports/system.h"
43#include "../client.h"
44
46
50
51image_t* r_noTexture; /* use for bad textures */
53image_t* r_dummyTexture; /* 1x1 pixel white texture to be used when texturing is required, but texture is not available */
54
56
58
65cvar_t* r_texture_lod; /* lod_bias */
111
112static void R_PrintInfo (const char* pre, const char* msg)
113{
114 char buf[4096];
115 const size_t length = sizeof(buf);
116 const size_t maxLength = strlen(msg);
117
118 Com_Printf("%s: ", pre);
119 for (int i = 0; i < maxLength; i += length) {
120 Q_strncpyz(buf, msg + i, sizeof(buf));
121 Com_Printf("%s", buf);
122 }
123 Com_Printf("\n");
124}
125
129static void R_Strings_f (void)
130{
131 R_PrintInfo("GL_VENDOR", r_config.vendorString);
132 R_PrintInfo("GL_RENDERER", r_config.rendererString);
133 R_PrintInfo("GL_VERSION", r_config.versionString);
134 R_PrintInfo("GL_EXTENSIONS", r_config.extensionsString);
135}
136
137void R_SetupFrustum (void)
138{
139 int i;
140
141 /* build the transformation matrix for the given view angles */
142 AngleVectors(refdef.viewAngles, r_locals.forward, r_locals.right, r_locals.up);
143
144#if 0
145 /* if we are not drawing world model, we are on the UI code. It break the default UI SCISSOR
146 * Anyway we should merge that code into R_CleanupDepthBuffer (with some rework), it looks better */
147
148 /* clear out the portion of the screen that the NOWORLDMODEL defines */
149 if (refdef.rendererFlags & RDF_NOWORLDMODEL) {
150 glEnable(GL_SCISSOR_TEST);
151 glScissor(viddef.x, viddef.height - viddef.viewHeight - viddef.y, viddef.viewWidth, viddef.viewHeight);
152 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
153 R_CheckError();
154 glDisable(GL_SCISSOR_TEST);
155 }
156#endif
157 if (r_isometric->integer) {
158 /* 4 planes of a cube */
159 VectorScale(r_locals.right, +1, r_locals.frustum[0].normal);
160 VectorScale(r_locals.right, -1, r_locals.frustum[1].normal);
161 VectorScale(r_locals.up, +1, r_locals.frustum[2].normal);
162 VectorScale(r_locals.up, -1, r_locals.frustum[3].normal);
163
164 for (i = 0; i < 4; i++) {
165 r_locals.frustum[i].type = PLANE_ANYZ;
166 r_locals.frustum[i].dist = DotProduct(refdef.viewOrigin, r_locals.frustum[i].normal);
167 }
168 r_locals.frustum[0].dist -= 10 * refdef.fieldOfViewX;
169 r_locals.frustum[1].dist -= 10 * refdef.fieldOfViewX;
170 r_locals.frustum[2].dist -= 10 * refdef.fieldOfViewX * ((float) viddef.viewHeight / viddef.viewWidth);
171 r_locals.frustum[3].dist -= 10 * refdef.fieldOfViewX * ((float) viddef.viewHeight / viddef.viewWidth);
172 } else {
173 /* rotate VPN right by FOV_X/2 degrees */
174 RotatePointAroundVector(r_locals.frustum[0].normal, r_locals.up, r_locals.forward, -(90 - refdef.fieldOfViewX / 2));
175 /* rotate VPN left by FOV_X/2 degrees */
176 RotatePointAroundVector(r_locals.frustum[1].normal, r_locals.up, r_locals.forward, 90 - refdef.fieldOfViewX / 2);
177 /* rotate VPN up by FOV_X/2 degrees */
178 RotatePointAroundVector(r_locals.frustum[2].normal, r_locals.right, r_locals.forward, 90 - refdef.fieldOfViewY / 2);
179 /* rotate VPN down by FOV_X/2 degrees */
180 RotatePointAroundVector(r_locals.frustum[3].normal, r_locals.right, r_locals.forward, -(90 - refdef.fieldOfViewY / 2));
181
182 for (i = 0; i < 4; i++) {
183 r_locals.frustum[i].type = PLANE_ANYZ;
184 r_locals.frustum[i].dist = DotProduct(refdef.viewOrigin, r_locals.frustum[i].normal);
185 }
186 }
187}
188
192static inline void R_Clear (void)
193{
194 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
195 /* clear the stencil bit if shadows are enabled */
196 if (r_stencilshadows->integer)
197 glClear(GL_STENCIL_BUFFER_BIT);
198 R_CheckError();
199 glDepthFunc(GL_LEQUAL);
200 R_CheckError();
201
202 glDepthRange(0.0f, 1.0f);
203 R_CheckError();
204}
205
209static inline void R_ClearScene (void)
210{
211 /* lights and coronas are populated as ents are added */
212 refdef.numEntities = refdef.numDynamicLights = refdef.numCoronas = 0;
214}
215
220void R_BeginFrame (void)
221{
222 r_locals.frame++;
223
224 /* avoid overflows, negatives and zero are reserved */
225 if (r_locals.frame > 0xffff)
226 r_locals.frame = 1;
227
228 if (Com_IsRenderModified()) {
229 Com_Printf("Modified render related cvars\n");
232
233 /* prevent reloading of some rendering cvars */
236 }
237
238 if (r_anisotropic->modified) {
239 if (r_anisotropic->integer > r_config.maxAnisotropic) {
240 Com_Printf("...max GL_EXT_texture_filter_anisotropic value is %i\n", r_config.maxAnisotropic);
241 Cvar_SetValue("r_anisotropic", r_config.maxAnisotropic);
242 }
243 /*R_UpdateAnisotropy();*/
244 r_anisotropic->modified = false;
245 }
246
247 /* draw buffer stuff */
248#ifndef GL_VERSION_ES_CM_1_0
249 if (r_drawbuffer->modified) {
250 r_drawbuffer->modified = false;
251
252 if (Q_strcasecmp(r_drawbuffer->string, "GL_FRONT") == 0)
253 glDrawBuffer(GL_FRONT);
254 else
255 glDrawBuffer(GL_BACK);
256 R_CheckError();
257 }
258#endif
259
260 /* texturemode stuff */
261 /* Realtime set level of anisotropy filtering and change texture lod bias */
262 if (r_texturemode->modified) {
264 r_texturemode->modified = false;
265 }
266
267 if (r_texturealphamode->modified) {
269 r_texturealphamode->modified = false;
270 }
271
272 if (r_texturesolidmode->modified) {
274 r_texturesolidmode->modified = false;
275 }
276
277 /* threads */
278 if (r_threads->modified) {
279 if (r_threads->integer)
281 else
283 r_threads->modified = false;
284 }
285
287
288 R_Setup2D();
289
290 /* clear screen if desired */
291 R_Clear();
292}
293
298void R_RenderFrame (void)
299{
300 static int lastFrame = 0;
301 int deltaMsec = cl.time - lastFrame;
302 lastFrame = cl.time;
303
304 r_battlescapeWeather.update(deltaMsec); /* could do that in separate thread */
305
306 R_Setup3D();
307
308 /* activate wire mode */
309 if (r_wire->integer) {
310 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
311 }
312
313 if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) {
314 int tile;
315 if (r_threads->integer) {
316 while (r_threadstate.state != THREAD_RENDERER)
317 Sys_Sleep(0);
318
320 } else {
322
323 /* draw brushes on current worldlevel */
325 }
326
328
329 R_CheckError();
330
331 for (tile = 0; tile < r_numMapTiles; tile++) {
332 const model_t* mapTile = r_mapTiles[tile];
333 const mBspModel_t* bsp = &mapTile->bsp;
334
336 }
337
339
340 R_EnableFog(true);
341
345
347 R_DrawGrass();
348
349 R_EnableBlend(true);
351
352 R_EnableFog(false);
353
357
358 r_battlescapeWeather.render();
359
360 R_EnableFog(true);
362 R_EnableFog(false);
363
364 if (r_debug_lights->integer) {
365 int i;
366
367 for (i = 0; i < refdef.numStaticLights; i++) {
368 const light_t* l = &refdef.staticLights[i];
369 R_AddCorona(l->origin, l->radius, l->color);
370 }
371 for (i = 0; i < refdef.numDynamicLights; i++) {
372 const light_t* l = &refdef.dynamicLights[i];
373 R_AddCorona(l->origin, l->radius, l->color);
374 }
375 }
376
378 R_EnableBlend(false);
379
380 for (tile = 0; tile < r_numMapTiles; tile++) {
381 R_DrawBspNormals(tile);
382 }
383
384 R_Color(nullptr);
388 } else {
389 glClear(GL_DEPTH_BUFFER_BIT);
390
392
397
398 R_EnableBlend(true);
399
401
405
407
408 R_EnableBlend(false);
409
410 R_Color(nullptr);
414 }
415
416 R_EnableBlend(true);
417
419
420 R_EnableBlend(false);
421
422 /* leave wire mode again */
423 if (r_wire->integer) {
424 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
425 }
426
427 R_DrawBloom();
428
430
432
433 /* go back into 2D mode for hud and the like */
434 R_Setup2D();
435
436 R_CheckError();
437}
438
443void R_EndFrame (void)
444{
445 R_EnableBlend(true);
446
447 R_DrawChars(); /* draw all chars accumulated above */
448
449 /* restore draw color */
450 R_Color(nullptr);
451
452 R_EnableBlend(false);
453
454 if (vid_gamma->modified) {
455 if (!vid_ignoregamma->integer) {
456 const float g = vid_gamma->value;
457 SDL_SetWindowBrightness(cls.window, g);
458 }
459 vid_gamma->modified = false;
460 }
461
462 R_EnableMultisample(false);
463
464 R_ClearScene();
465
466 SDL_GL_SwapWindow(cls.window);
467}
468
469static const cmdList_t r_commands[] = {
470 {"r_listimages", R_ImageList_f, "Show all loaded images on game console"},
471 {"r_listfontcache", R_FontListCache_f, "Show information about font cache"},
472 {"r_screenshot", R_ScreenShot_f, "Take a screenshot"},
473 {"r_listmodels", R_ModModellist_f, "Show all loaded models on game console"},
474 {"r_strings", R_Strings_f, "Print openGL vendor and other strings"},
475 {"r_restartprograms", R_RestartPrograms_f, "Reloads the shaders"},
476
477 {nullptr, nullptr, nullptr}
478};
479
481{
482 int maxSize = !r_config.maxTextureSize || LIGHTMAP_MAX_PAGE_SIZE < r_config.maxTextureSize ? LIGHTMAP_MAX_PAGE_SIZE : r_config.maxTextureSize;
483
484 if (cvar->integer > maxSize) {
485 Com_Printf("%s exceeded max supported texture size\n", cvar->name);
486 Cvar_SetValue(cvar->name, maxSize);
487 return false;
488 }
489
490 if (!Q_IsPowerOfTwo(cvar->integer)) {
491 Com_Printf("%s must be power of two\n", cvar->name);
493 return false;
494 }
495
496 return Cvar_AssertValue(cvar, 128, LIGHTMAP_MAX_PAGE_SIZE, true);
497}
498
500{
501 float maxLights = r_config.maxLights;
502
503 if (maxLights > MAX_ENTITY_LIGHTS)
504 maxLights = MAX_ENTITY_LIGHTS;
505
506 return Cvar_AssertValue(cvar, 0, maxLights, true);
507}
508
509static bool R_CvarPrograms (cvar_t* cvar)
510{
511 if (qglUseProgram) {
512 return Cvar_AssertValue(cvar, 0, 3, true);
513 }
514
515 Cvar_SetValue(cvar->name, 0);
516 return true;
517}
518
523{
524 int glslVersionMajor, glslVersionMinor;
525 sscanf(cvar->string, "%d.%d", &glslVersionMajor, &glslVersionMinor);
526 if (glslVersionMajor > r_config.glslVersionMajor) {
527 Cvar_Reset(cvar);
528 return false;
529 }
530
531 if (glslVersionMajor == r_config.glslVersionMajor && glslVersionMinor > r_config.glslVersionMinor) {
532 Cvar_Reset(cvar);
533 return false;
534 }
535
536 return true;
537}
538
539static bool R_CvarPostProcess (cvar_t* cvar)
540{
541 if (r_config.frameBufferObject && r_config.drawBuffers)
542 return Cvar_AssertValue(cvar, 0, 1, true);
543
544 Cvar_SetValue(cvar->name, 0);
545 return true;
546}
547
549{
550 return Cvar_AssertValue(cvar, 0, 4, true);
551}
552
553static bool R_CvarCheckWeather (cvar_t* cvar)
554{
555 return Cvar_AssertValue(cvar, (float)Weather::WEATHER_CLEAN, (float)Weather::WEATHER_MAX, true);
556}
557
558static void R_UpdateWeather (const char* cvarName, const char* oldValue, const char* newValue, void* data)
559{
560 r_battlescapeWeather.changeTo((Weather::weatherTypes)atoi(newValue));
561}
562
563
564static void R_RegisterSystemVars (void)
565{
566 r_driver = Cvar_Get("r_driver", "", CVAR_ARCHIVE | CVAR_R_CONTEXT, "You can define the opengl driver you want to use - empty if you want to use the system default");
567 r_weather = Cvar_Get("r_weather", "0", 0, "Current battlescape weather effect");
570 r_drawentities = Cvar_Get("r_drawentities", "1", 0, "Draw the local entities");
571 r_drawworld = Cvar_Get("r_drawworld", "1", 0, "Draw the world brushes");
572 r_isometric = Cvar_Get("r_isometric", "0", CVAR_ARCHIVE, "Draw the world in isometric mode");
573 r_nocull = Cvar_Get("r_nocull", "0", 0, "Don't perform culling for brushes and entities");
574 r_anisotropic = Cvar_Get("r_anisotropic", "1", CVAR_ARCHIVE);
575 r_texture_lod = Cvar_Get("r_texture_lod", "0", CVAR_ARCHIVE);
576 r_screenshot_format = Cvar_Get("r_screenshot_format", "jpg", CVAR_ARCHIVE, "png, jpg or tga are valid screenshot formats");
577 r_screenshot_jpeg_quality = Cvar_Get("r_screenshot_jpeg_quality", "75", CVAR_ARCHIVE, "jpeg quality in percent for jpeg screenshots");
578 r_threads = Cvar_Get("r_threads", "0", CVAR_ARCHIVE, "Activate threads for the renderer");
579
580 r_materials = Cvar_Get("r_materials", "1", CVAR_ARCHIVE, "Activate material subsystem");
581 r_overridematerial = Cvar_Get("r_overridematerial", "", 0, "Used to override the material for a map");
582 r_default_specular = Cvar_Get("r_default_specular", "0.2", CVAR_R_CONTEXT, "Default specular exponent");
583 r_default_hardness = Cvar_Get("r_default_hardness", "0.2", CVAR_R_CONTEXT, "Default specular brightness");
586 r_checkerror = Cvar_Get("r_checkerror", "0", CVAR_ARCHIVE, "Check for opengl errors");
587 r_shadows = Cvar_Get("r_shadows", "1", CVAR_ARCHIVE, "Multiplier for the alpha of the shadows");
588 r_stencilshadows = Cvar_Get("r_stencilshadows", "0", CVAR_ARCHIVE, "Activate or deactivate stencil shadows");
589 r_maxtexres = Cvar_Get("r_maxtexres", "2048", CVAR_ARCHIVE | CVAR_R_IMAGES, "The maximum texture resolution UFO should use");
590 r_texturemode = Cvar_Get("r_texturemode", "GL_LINEAR_MIPMAP_LINEAR", CVAR_ARCHIVE, "change the filtering and mipmapping for textures");
591 r_texturealphamode = Cvar_Get("r_texturealphamode", "GL_RGBA", CVAR_ARCHIVE);
592 r_texturesolidmode = Cvar_Get("r_texturesolidmode", "GL_RGB", CVAR_ARCHIVE);
593 r_wire = Cvar_Get("r_wire", "0", 0, "Draw the scene in wireframe mode");
594 r_showbox = Cvar_Get("r_showbox", "0", CVAR_ARCHIVE, "1=Shows model bounding box, 2=show also the brushes bounding boxes");
595 r_lightmap = Cvar_Get("r_lightmap", "0", CVAR_R_PROGRAMS, "Draw only the lightmap");
596 r_lightmap->modified = false;
597 r_deluxemap = Cvar_Get("r_deluxemap", "0", CVAR_R_PROGRAMS, "Draw only the deluxemap");
598 r_deluxemap->modified = false;
599 r_debug_normals = Cvar_Get("r_debug_normals", "0", CVAR_R_PROGRAMS, "Draw dot(normal, light_0 direction)");
600 r_debug_normals->modified = false;
601 r_debug_tangents = Cvar_Get("r_debug_tangents", "0", CVAR_R_PROGRAMS, "Draw tangent, bitangent, and normal dotted with light dir as RGB espectively");
602 r_debug_tangents->modified = false;
603 r_debug_lights = Cvar_Get("r_debug_lights", "0", CVAR_ARCHIVE, "Draw active light sources");
604 r_ext_texture_compression = Cvar_Get("r_ext_texture_compression", "0", CVAR_ARCHIVE | CVAR_R_CONTEXT);
605 r_ext_nonpoweroftwo = Cvar_Get("r_ext_nonpoweroftwo", "1", CVAR_ARCHIVE, "Enable or disable the non power of two extension");
606 r_ext_s3tc_compression = Cvar_Get("r_ext_s3tc_compression", "1", CVAR_ARCHIVE, "Also see r_ext_texture_compression");
607 r_intel_hack = Cvar_Get("r_intel_hack", "1", CVAR_ARCHIVE, "Intel cards have no shaders until this is set to 0 - to it to a value > 1 to not limit the max texture resolution");
608 r_vertexbuffers = Cvar_Get("r_vertexbuffers", "0", CVAR_ARCHIVE | CVAR_R_CONTEXT, "Controls usage of OpenGL Vertex Buffer Objects (VBO) versus legacy vertex arrays.");
609 r_maxlightmap = Cvar_Get("r_maxlightmap", "2048", CVAR_ARCHIVE | CVAR_LATCH, "Reduce this value on older hardware");
611
612 r_drawbuffer = Cvar_Get("r_drawbuffer", "GL_BACK");
613 r_swapinterval = Cvar_Get("r_swapinterval", "0", CVAR_ARCHIVE | CVAR_R_CONTEXT, "Controls swap interval synchronization (V-Sync). Values between 0 and 2");
614 r_multisample = Cvar_Get("r_multisample", "0", CVAR_ARCHIVE | CVAR_R_CONTEXT, "Controls multisampling (anti-aliasing). Values between 0 and 4");
616 r_warp = Cvar_Get("r_warp", "1", CVAR_ARCHIVE, "Activates or deactivates warping surface rendering");
617 r_shownormals = Cvar_Get("r_shownormals", "0", CVAR_ARCHIVE, "Show normals on bsp surfaces");
618 r_bumpmap = Cvar_Get("r_bumpmap", "1.0", CVAR_ARCHIVE | CVAR_R_PROGRAMS, "Activate bump mapping");
619 r_specular = Cvar_Get("r_specular", "1.0", CVAR_ARCHIVE, "Controls specular parameters");
620 r_hardness = Cvar_Get("r_hardness", "1.0", CVAR_ARCHIVE, "Hardness control for GLSL shaders (specular, bump, ...)");
621 r_parallax = Cvar_Get("r_parallax", "1.0", CVAR_ARCHIVE, "Controls parallax parameters");
622 r_fog = Cvar_Get("r_fog", "1", CVAR_ARCHIVE | CVAR_R_PROGRAMS, "Activate or deactivate fog");
623 r_flares = Cvar_Get("r_flares", "1", CVAR_ARCHIVE, "Activate or deactivate flares");
624 r_coronas = Cvar_Get("r_coronas", "1", CVAR_ARCHIVE, "Activate or deactivate coronas");
625 r_particles = Cvar_Get("r_particles", "1", 0, "Activate or deactivate particle rendering");
626 r_drawtags = Cvar_Get("r_drawtags", "0", 0, "Activate or deactivate tag rendering");
627
629}
630
634static void R_RegisterImageVars (void)
635{
636}
637
643static void R_UpdateVidDef (const viddefContext_t* context)
644{
645 viddef.context = *context;
646
647 /* update cvars */
648 Cvar_SetValue("vid_left", viddef.context.left);
649 Cvar_SetValue("vid_top", viddef.context.top);
650 Cvar_SetValue("vid_width", viddef.context.width);
651 Cvar_SetValue("vid_height", viddef.context.height);
652 Cvar_SetValue("vid_mode", viddef.context.mode);
653 Cvar_SetValue("vid_fullscreen", viddef.context.fullscreen);
654 Cvar_SetValue("r_multisample", viddef.context.multisample);
655 Cvar_SetValue("r_swapinterval", viddef.context.swapinterval);
656 vid_stretch->modified = false;
657 vid_fullscreen->modified = false;
658 vid_mode->modified = false;
659 r_multisample->modified = false;
660 r_swapinterval->modified = false;
661
662 /* update cache values */
663 if (viddef.stretch) {
664 viddef.virtualWidth = VID_NORM_WIDTH;
665 viddef.virtualHeight = VID_NORM_HEIGHT;
666 } else {
667 float normRatio = (float) VID_NORM_WIDTH / (float) VID_NORM_HEIGHT;
668 float screenRatio = (float) viddef.context.width / (float) viddef.context.height;
669
670 /* wide screen */
671 if (screenRatio > normRatio) {
672 viddef.virtualWidth = VID_NORM_HEIGHT * screenRatio;
673 viddef.virtualHeight = VID_NORM_HEIGHT;
674 /* 5:4 or low */
675 } else if (screenRatio < normRatio) {
676 viddef.virtualWidth = VID_NORM_WIDTH;
677 viddef.virtualHeight = VID_NORM_WIDTH / screenRatio;
678 /* 4:3 */
679 } else {
680 viddef.virtualWidth = VID_NORM_WIDTH;
681 viddef.virtualHeight = VID_NORM_HEIGHT;
682 }
683 }
684 viddef.rx = (float)viddef.context.width / viddef.virtualWidth;
685 viddef.ry = (float)viddef.context.height / viddef.virtualHeight;
686}
687
688bool R_SetMode (void)
689{
690 bool result;
691 viddefContext_t prevCtx;
692 viddefContext_t newCtx;
693 vidmode_t vidmode;
694
695 Com_Printf("I: setting mode %d\n", vid_mode->integer);
696
697 /* not values we must restitute */
698 r_ext_texture_compression->modified = false;
699 viddef.stretch = vid_stretch->integer;
700
701 /* store old values if new ones will fail */
702 prevCtx = viddef.context;
703
704 /* new values */
705 newCtx = viddef.context;
706 newCtx.mode = vid_mode->integer;
707 newCtx.fullscreen = vid_fullscreen->integer;
708 newCtx.left = Cvar_GetInteger("vid_left");
709 newCtx.top = Cvar_GetInteger("vid_top");
710 newCtx.multisample = r_multisample->integer;
711 newCtx.swapinterval = r_swapinterval->integer;
712 if (!VID_GetModeInfo(newCtx.mode, &vidmode)) {
713 Com_Printf("I: invalid mode\n");
714 Cvar_Set("vid_mode", "-1");
715 Cvar_Set("vid_width", "-1");
716 Cvar_Set("vid_height", "-1");
717 return false;
718 }
719 Com_Printf("I: try to get display with %ix%i\n", vidmode.width, vidmode.height);
720 newCtx.width = vidmode.width;
721 newCtx.height = vidmode.height;
722 result = R_InitGraphics(&newCtx);
723 if (!result) {
724 /* failed, revert */
725 Com_Printf("Failed to set video mode %dx%d %s.\n",
726 newCtx.width, newCtx.height,
727 (newCtx.fullscreen ? "fullscreen" : "windowed"));
728 result = R_InitGraphics(&prevCtx);
729 if (!result)
730 return false;
731 newCtx = prevCtx;
732 }
733
734 R_UpdateVidDef(&newCtx);
738 Com_Printf("I: %dx%d (fullscreen: %s)\n", viddef.context.width, viddef.context.height, viddef.context.fullscreen ? "yes" : "no");
739 return true;
740}
741
748static inline uintptr_t R_GetProcAddress (const char* functionName)
749{
750 return (uintptr_t)SDL_GL_GetProcAddress(functionName);
751}
752
753static uintptr_t R_GetProcAddressExt (const char* functionName)
754{
755 const char* s = strstr(functionName, "###");
756 if (s == nullptr) {
757 return R_GetProcAddress(functionName);
758 }
759
760 const char* replace[] = {"EXT", "OES", "ARB"};
761 char targetBuf[128];
762 const size_t length = lengthof(targetBuf);
763 const size_t replaceNo = lengthof(replace);
764 for (size_t i = 0; i < replaceNo; i++) {
765 if (Q_strreplace(functionName, "###", replace[i], targetBuf, length)) {
766 uintptr_t funcAdr = R_GetProcAddress(targetBuf);
767 if (funcAdr != 0)
768 return funcAdr;
769 }
770 }
771 Com_Printf("%s not found\n", functionName);
772 return 0;
773}
774
783static inline bool R_CheckExtension (const char* extension)
784{
785 bool found;
786#ifdef GL_VERSION_ES_CM_1_0
787 if(strcmp(extension, "GL_ARB_texture_non_power_of_two") == 0) {
788 extension = "GL_OES_texture_npot";
789 }
790#endif
791 const char* s = strstr(extension, "###");
792 if (s == nullptr) {
793 found = strstr(r_config.extensionsString, extension) != nullptr;
794 } else {
795 const char* replace[] = {"ARB", "EXT", "OES"};
796 char targetBuf[128];
797 const size_t length = lengthof(targetBuf);
798 const size_t replaceNo = lengthof(replace);
799 size_t i;
800 for (i = 0; i < replaceNo; i++) {
801 if (Q_strreplace(extension, "###", replace[i], targetBuf, length)) {
802 if (strstr(r_config.extensionsString, targetBuf) != nullptr) {
803 found = true;
804 break;
805 }
806 }
807 }
808 if (i == replaceNo)
809 found = false;
810 }
811
812 if (found)
813 Com_Printf("found %s\n", extension);
814 else
815 Com_Printf("%s not found\n", extension);
816
817#ifdef GL_VERSION_ES_CM_1_0
818 if (strcmp(extension, "GL_ARB_multitexture") == 0 ||
819 strcmp(extension, "GL_ARB_vertex_buffer_object") == 0) {
820 found = true;
821 Com_Printf("Overriding %s - it is always present in GLES\n", extension);
822 }
823#endif
824
825 return found;
826}
827
828#define R_CheckGLVersion(max, min) (r_config.glVersionMajor > max || (r_config.glVersionMajor == max && r_config.glVersionMinor >= min))
829
834static void R_InitExtensions (void)
835{
836 GLenum err;
837 int tmpInteger;
838
839 /* Get OpenGL version.*/
840 if(sscanf(r_config.versionString, "%d.%d", &r_config.glVersionMajor, &r_config.glVersionMinor) != 2) {
841 const char* versionNumbers = r_config.versionString; /* GLES reports version as "OpenGL ES 1.1", so we must skip non-numeric symbols first */
842 while(*versionNumbers && strchr("0123456789", *versionNumbers) == nullptr) {
843 versionNumbers ++;
844 }
845 if( *versionNumbers )
846 sscanf(versionNumbers, "%d.%d", &r_config.glVersionMajor, &r_config.glVersionMinor);
847 }
848 Com_Printf("OpenGL version detected: %d.%d\n", r_config.glVersionMajor, r_config.glVersionMinor);
849
850 /* multitexture */
851 qglActiveTexture = nullptr;
852 qglClientActiveTexture = nullptr;
853
854 /* vertex buffer */
855 qglGenBuffers = nullptr;
856 qglDeleteBuffers = nullptr;
857 qglBindBuffer = nullptr;
858 qglBufferData = nullptr;
859
860 /* glsl */
861 qglCreateShader = nullptr;
862 qglDeleteShader = nullptr;
863 qglShaderSource = nullptr;
864 qglCompileShader = nullptr;
865 qglGetShaderiv = nullptr;
866 qglGetShaderInfoLog = nullptr;
867 qglCreateProgram = nullptr;
868 qglDeleteProgram = nullptr;
869 qglAttachShader = nullptr;
870 qglDetachShader = nullptr;
871 qglLinkProgram = nullptr;
872 qglUseProgram = nullptr;
873 qglGetActiveUniform = nullptr;
874 qglGetProgramiv = nullptr;
875 qglGetProgramInfoLog = nullptr;
876 qglGetUniformLocation = nullptr;
877 qglUniform1i = nullptr;
878 qglUniform1f = nullptr;
879 qglUniform1fv = nullptr;
880 qglUniform2fv = nullptr;
881 qglUniform3fv = nullptr;
882 qglUniform4fv = nullptr;
883 qglGetAttribLocation = nullptr;
884 qglUniformMatrix4fv = nullptr;
885
886 /* vertex attribute arrays */
887 qglEnableVertexAttribArray = nullptr;
888 qglDisableVertexAttribArray = nullptr;
889 qglVertexAttribPointer = nullptr;
890
891 /* framebuffer objects */
892 qglIsRenderbufferEXT = nullptr;
893 qglBindRenderbufferEXT = nullptr;
894 qglDeleteRenderbuffersEXT = nullptr;
895 qglGenRenderbuffersEXT = nullptr;
896 qglRenderbufferStorageEXT = nullptr;
897 qglRenderbufferStorageMultisampleEXT = nullptr;
898 qglGetRenderbufferParameterivEXT = nullptr;
899 qglIsFramebufferEXT = nullptr;
900 qglBindFramebufferEXT = nullptr;
901 qglDeleteFramebuffersEXT = nullptr;
902 qglGenFramebuffersEXT = nullptr;
903 qglCheckFramebufferStatusEXT = nullptr;
904 qglFramebufferTexture1DEXT = nullptr;
905 qglFramebufferTexture2DEXT = nullptr;
906 qglFramebufferTexture3DEXT = nullptr;
907 qglFramebufferRenderbufferEXT = nullptr;
908 qglGetFramebufferAttachmentParameterivEXT = nullptr;
909 qglGenerateMipmapEXT = nullptr;
910 qglDrawBuffers = nullptr;
911
912 /* multitexture */
913 if (R_CheckExtension("GL_ARB_multitexture")) {
914 qglActiveTexture = (ActiveTexture_t)R_GetProcAddress("glActiveTexture");
915 qglClientActiveTexture = (ClientActiveTexture_t)R_GetProcAddress("glClientActiveTexture");
916 }
917
918#ifndef GL_VERSION_ES_CM_1_0
919 if (R_CheckExtension("GL_ARB_texture_compression")) {
920 if (r_ext_texture_compression->integer) {
921 Com_Printf("using GL_ARB_texture_compression\n");
922 if (r_ext_s3tc_compression->integer && strstr(r_config.extensionsString, "GL_EXT_texture_compression_s3tc")) {
923 r_config.gl_compressed_solid_format = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
924 r_config.gl_compressed_alpha_format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
925 } else {
926 r_config.gl_compressed_solid_format = GL_COMPRESSED_RGB_ARB;
927 r_config.gl_compressed_alpha_format = GL_COMPRESSED_RGBA_ARB;
928 }
929 }
930 }
931#endif
932
933 if (R_CheckExtension("GL_ARB_texture_non_power_of_two")) {
934 if (r_ext_nonpoweroftwo->integer) {
935 Com_Printf("using GL_ARB_texture_non_power_of_two\n");
936 r_config.nonPowerOfTwo = true;
937 } else {
938 r_config.nonPowerOfTwo = false;
939 Com_Printf("ignoring GL_ARB_texture_non_power_of_two\n");
940 }
941 } else {
942 if (R_CheckGLVersion(2, 0)) {
943 r_config.nonPowerOfTwo = r_ext_nonpoweroftwo->integer == 1;
944 } else {
945 r_config.nonPowerOfTwo = false;
946 }
947 }
948
949 /* anisotropy */
950 if (R_CheckExtension("GL_EXT_texture_filter_anisotropic")) {
951 if (r_anisotropic->integer) {
952 glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &r_config.maxAnisotropic);
953 R_CheckError();
954 if (r_anisotropic->integer > r_config.maxAnisotropic) {
955 Com_Printf("max GL_EXT_texture_filter_anisotropic value is %i\n", r_config.maxAnisotropic);
956 Cvar_SetValue("r_anisotropic", r_config.maxAnisotropic);
957 }
958
959 if (r_config.maxAnisotropic)
960 r_config.anisotropic = true;
961 }
962 }
963
964 if (R_CheckExtension("GL_EXT_texture_lod_bias"))
965 r_config.lod_bias = true;
966
967 /* vertex buffer objects */
968 if (R_CheckExtension("GL_ARB_vertex_buffer_object")) {
969 qglGenBuffers = (GenBuffers_t)R_GetProcAddress("glGenBuffers");
970 qglDeleteBuffers = (DeleteBuffers_t)R_GetProcAddress("glDeleteBuffers");
971 qglBindBuffer = (BindBuffer_t)R_GetProcAddress("glBindBuffer");
972 qglBufferData = (BufferData_t)R_GetProcAddress("glBufferData");
973 r_config.maxVertexBufferSize = 256 * 256 * 256; // This is only recommended value, so we don't really care about it, and set some big number.
974#ifndef GL_VERSION_ES_CM_1_0
975 glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &r_config.maxVertexBufferSize);
976#endif
977 Com_Printf("using GL_ARB_vertex_buffer_object\nmax vertex buffer size: %i\n", r_config.maxVertexBufferSize);
978 }
979
980 /* glsl vertex and fragment shaders and programs */
981 if (R_CheckExtension("GL_ARB_fragment_shader")) {
982 qglCreateShader = (CreateShader_t)R_GetProcAddress("glCreateShader");
983 qglDeleteShader = (DeleteShader_t)R_GetProcAddress("glDeleteShader");
984 qglShaderSource = (ShaderSource_t)R_GetProcAddress("glShaderSource");
985 qglCompileShader = (CompileShader_t)R_GetProcAddress("glCompileShader");
986 qglGetShaderiv = (GetShaderiv_t)R_GetProcAddress("glGetShaderiv");
987 qglGetShaderInfoLog = (GetShaderInfoLog_t)R_GetProcAddress("glGetShaderInfoLog");
988 qglCreateProgram = (CreateProgram_t)R_GetProcAddress("glCreateProgram");
989 qglDeleteProgram = (DeleteProgram_t)R_GetProcAddress("glDeleteProgram");
990 qglAttachShader = (AttachShader_t)R_GetProcAddress("glAttachShader");
991 qglDetachShader = (DetachShader_t)R_GetProcAddress("glDetachShader");
992 qglLinkProgram = (LinkProgram_t)R_GetProcAddress("glLinkProgram");
993 qglUseProgram = (UseProgram_t)R_GetProcAddress("glUseProgram");
994 qglGetActiveUniform = (GetActiveUniforms_t)R_GetProcAddress("glGetActiveUniform");
995 qglGetProgramiv = (GetProgramiv_t)R_GetProcAddress("glGetProgramiv");
996 qglGetProgramInfoLog = (GetProgramInfoLog_t)R_GetProcAddress("glGetProgramInfoLog");
997 qglGetUniformLocation = (GetUniformLocation_t)R_GetProcAddress("glGetUniformLocation");
998 qglUniform1i = (Uniform1i_t)R_GetProcAddress("glUniform1i");
999 qglUniform1f = (Uniform1f_t)R_GetProcAddress("glUniform1f");
1000 qglUniform1fv = (Uniform1fv_t)R_GetProcAddress("glUniform1fv");
1001 qglUniform2fv = (Uniform2fv_t)R_GetProcAddress("glUniform2fv");
1002 qglUniform3fv = (Uniform3fv_t)R_GetProcAddress("glUniform3fv");
1003 qglUniform4fv = (Uniform4fv_t)R_GetProcAddress("glUniform4fv");
1004 qglGetAttribLocation = (GetAttribLocation_t)R_GetProcAddress("glGetAttribLocation");
1005 qglUniformMatrix4fv = (UniformMatrix4fv_t)R_GetProcAddress("glUniformMatrix4fv");
1006
1007 /* vertex attribute arrays */
1008 qglEnableVertexAttribArray = (EnableVertexAttribArray_t)R_GetProcAddress("glEnableVertexAttribArray");
1009 qglDisableVertexAttribArray = (DisableVertexAttribArray_t)R_GetProcAddress("glDisableVertexAttribArray");
1010 qglVertexAttribPointer = (VertexAttribPointer_t)R_GetProcAddress("glVertexAttribPointer");
1011 }
1012
1013 if (R_CheckExtension("GL_ARB_shading_language_100") || r_config.glVersionMajor >= 2) {
1014 /* The GL_ARB_shading_language_100 extension was added to core specification since OpenGL 2.0;
1015 * it is ideally listed in the extensions for backwards compatibility. If it isn't there and OpenGL > v2.0
1016 * then enable shaders as the implementation supports the shading language!*/
1017 const char* shadingVersion = (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION);
1018 sscanf(shadingVersion, "%d.%d", &r_config.glslVersionMajor, &r_config.glslVersionMinor);
1019 Com_Printf("GLSL version guaranteed to be supported by OpenGL implementation postfixed by vender supplied info: %i.%i\n",
1020 r_config.glslVersionMajor, r_config.glslVersionMinor);
1021 } else {
1022 /* The shading language is not supported.*/
1023 Com_Printf("GLSL shaders unsupported by OpenGL implementation.\n");
1024 }
1025
1026 /* framebuffer objects */
1027 if (R_CheckExtension("GL_###_framebuffer_object")) {
1028 qglIsRenderbufferEXT = (IsRenderbufferEXT_t)R_GetProcAddressExt("glIsRenderbuffer###");
1029 qglBindRenderbufferEXT = (BindRenderbufferEXT_t)R_GetProcAddressExt("glBindRenderbuffer###");
1030 qglDeleteRenderbuffersEXT = (DeleteRenderbuffersEXT_t)R_GetProcAddressExt("glDeleteRenderbuffers###");
1031 qglGenRenderbuffersEXT = (GenRenderbuffersEXT_t)R_GetProcAddressExt("glGenRenderbuffers###");
1032 qglRenderbufferStorageEXT = (RenderbufferStorageEXT_t)R_GetProcAddressExt("glRenderbufferStorage###");
1033 qglRenderbufferStorageMultisampleEXT = (RenderbufferStorageMultisampleEXT_t)R_GetProcAddressExt("glRenderbufferStorageMultisample###");
1034 qglGetRenderbufferParameterivEXT = (GetRenderbufferParameterivEXT_t)R_GetProcAddressExt("glGetRenderbufferParameteriv###");
1035 qglIsFramebufferEXT = (IsFramebufferEXT_t)R_GetProcAddressExt("glIsFramebuffer###");
1036 qglBindFramebufferEXT = (BindFramebufferEXT_t)R_GetProcAddressExt("glBindFramebuffer###");
1037 qglDeleteFramebuffersEXT = (DeleteFramebuffersEXT_t)R_GetProcAddressExt("glDeleteFramebuffers###");
1038 qglGenFramebuffersEXT = (GenFramebuffersEXT_t)R_GetProcAddressExt("glGenFramebuffers###");
1039 qglCheckFramebufferStatusEXT = (CheckFramebufferStatusEXT_t)R_GetProcAddressExt("glCheckFramebufferStatus###");
1040 qglFramebufferTexture1DEXT = (FramebufferTexture1DEXT_t)R_GetProcAddressExt("glFramebufferTexture1D###");
1041 qglFramebufferTexture2DEXT = (FramebufferTexture2DEXT_t)R_GetProcAddressExt("glFramebufferTexture2D###");
1042 qglFramebufferTexture3DEXT = (FramebufferTexture3DEXT_t)R_GetProcAddressExt("glFramebufferTexture3D###");
1043 qglFramebufferRenderbufferEXT = (FramebufferRenderbufferEXT_t)R_GetProcAddressExt("glFramebufferRenderbuffer###");
1044 qglGetFramebufferAttachmentParameterivEXT = (GetFramebufferAttachmentParameterivEXT_t)R_GetProcAddressExt("glGetFramebufferAttachmentParameteriv###");
1045 qglGenerateMipmapEXT = (GenerateMipmapEXT_t)R_GetProcAddressExt("glGenerateMipmap###");
1046 qglDrawBuffers = (DrawBuffers_t)R_GetProcAddress("glDrawBuffers");
1047 qglBlitFramebuffer = (BlitFramebuffer_t)R_GetProcAddress("glBlitFramebuffer");
1048
1049 if (qglDeleteRenderbuffersEXT && qglDeleteFramebuffersEXT && qglGenFramebuffersEXT && qglBindFramebufferEXT
1050 && qglFramebufferTexture2DEXT && qglBindRenderbufferEXT && qglRenderbufferStorageEXT && qglCheckFramebufferStatusEXT) {
1051#ifdef GL_VERSION_ES_CM_1_0
1052 r_config.maxDrawBuffers = 1; /* GLES does not support multiple buffers or color attachments, only COLOR_ATTACHMENT0_OES is available */
1053 r_config.maxColorAttachments = 1;
1054#else
1055 glGetIntegerv(GL_MAX_DRAW_BUFFERS, &r_config.maxDrawBuffers);
1056 glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &r_config.maxColorAttachments);
1057#endif
1058 glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &r_config.maxRenderbufferSize);
1059
1060 r_config.frameBufferObject = true;
1061
1062 Com_Printf("using GL_ARB_framebuffer_object\n");
1063 Com_Printf("max draw buffers: %i\n", r_config.maxDrawBuffers);
1064 Com_Printf("max render buffer size: %i\n", r_config.maxRenderbufferSize);
1065 Com_Printf("max color attachments: %i\n", r_config.maxColorAttachments);
1066 } else {
1067 Com_Printf("skipping GL_ARB_framebuffer_object - not every needed extension is supported\n");
1068 }
1069
1070 if (r_config.maxDrawBuffers > 1 && R_CheckExtension("GL_###_draw_buffers")) {
1071 Com_Printf("using GL_ARB_draw_buffers\n");
1072 r_config.drawBuffers = true;
1073 } else {
1074 r_config.drawBuffers = false;
1075 }
1076 } else {
1077 Com_Printf("Framebuffer objects unsupported by OpenGL implementation.\n");
1078 }
1079
1080 r_programs = Cvar_Get("r_programs", "1", CVAR_ARCHIVE | CVAR_R_PROGRAMS, "GLSL shaders level: 0 - disabled, 1 - low, 2 - medium, 3 - high");
1081 r_programs->modified = false;
1083
1084 r_glsl_version = Cvar_Get("r_glsl_version", "1.10", CVAR_ARCHIVE | CVAR_R_PROGRAMS, "GLSL Version");
1086
1087 r_postprocess = Cvar_Get("r_postprocess", "1", CVAR_ARCHIVE | CVAR_R_PROGRAMS, "Activate postprocessing shader effects");
1088 Cvar_SetCheckFunction("r_postprocess", R_CvarPostProcess);
1089
1090 /* reset gl error state */
1091 R_CheckError();
1092
1093 glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &r_config.maxVertexTextureImageUnits);
1094 Com_Printf("max supported vertex texture units: %i\n", r_config.maxVertexTextureImageUnits);
1095
1096 glGetIntegerv(GL_MAX_LIGHTS, &r_config.maxLights);
1097 Com_Printf("max supported lights: %i\n", r_config.maxLights);
1098
1099 r_dynamic_lights = Cvar_Get("r_dynamic_lights", "1", CVAR_ARCHIVE | CVAR_R_PROGRAMS, "Sets max number of GL lightsources to use in shaders");
1101
1102 glGetIntegerv(GL_MAX_TEXTURE_UNITS, &r_config.maxTextureUnits);
1103 Com_Printf("max texture units: %i\n", r_config.maxTextureUnits);
1104 if (r_config.maxTextureUnits < 2)
1105 Com_Error(ERR_FATAL, "You need at least 2 texture units to run " GAME_TITLE);
1106
1107 glGetIntegerv(GL_MAX_TEXTURE_COORDS, &r_config.maxTextureCoords);
1108 Com_Printf("max texture coords: %i\n", r_config.maxTextureCoords);
1109 r_config.maxTextureCoords = std::max(r_config.maxTextureUnits, r_config.maxTextureCoords);
1110
1111 glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &r_config.maxVertexAttribs);
1112 Com_Printf("max vertex attributes: %i\n", r_config.maxVertexAttribs);
1113
1114#ifdef GL_VERSION_ES_CM_1_0
1115 glGetIntegerv(GL_MAX_VARYING_VECTORS, &tmpInteger);
1116 Com_Printf("max varying floats: %i\n", tmpInteger * 4);
1117 glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &tmpInteger);
1118 Com_Printf("max fragment uniform components: %i\n", tmpInteger * 4);
1119 glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &tmpInteger);
1120 Com_Printf("max vertex uniform components: %i\n", tmpInteger * 4);
1121#else
1122 glGetIntegerv(GL_MAX_VARYING_FLOATS, &tmpInteger);
1123 Com_Printf("max varying floats: %i\n", tmpInteger);
1124 glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &tmpInteger);
1125 Com_Printf("max fragment uniform components: %i\n", tmpInteger);
1126 glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, &tmpInteger);
1127 Com_Printf("max vertex uniform components: %i\n", tmpInteger);
1128#endif
1129
1130 /* reset gl error state */
1131 R_CheckError();
1132
1133 /* check max texture size */
1134 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &r_config.maxTextureSize);
1135 /* stubbed or broken drivers may have reported 0 */
1136 if (r_config.maxTextureSize <= 0)
1137 r_config.maxTextureSize = 256;
1138
1139 if ((err = glGetError()) != GL_NO_ERROR) {
1140 Com_Printf("max texture size: cannot detect - using %i! (%s)\n", r_config.maxTextureSize, R_TranslateError(err));
1141 Cvar_SetValue("r_maxtexres", r_config.maxTextureSize);
1142 } else {
1143 Com_Printf("max texture size: detected %d\n", r_config.maxTextureSize);
1144 if (r_maxtexres->integer > r_config.maxTextureSize) {
1145 Com_Printf("...downgrading from %i\n", r_maxtexres->integer);
1146 Cvar_SetValue("r_maxtexres", r_config.maxTextureSize);
1147 /* check for a minimum */
1148 } else if (r_maxtexres->integer >= 128 && r_maxtexres->integer < r_config.maxTextureSize) {
1149 Com_Printf("...but using %i as requested\n", r_maxtexres->integer);
1150 r_config.maxTextureSize = r_maxtexres->integer;
1151 }
1152 }
1153
1154 if (r_config.maxTextureSize > 4096 && R_ImageExists("pics/geoscape/%s/map_earth_season_00", "high")) {
1155 Q_strncpyz(r_config.lodDir, "high", sizeof(r_config.lodDir));
1156 Com_Printf("Using high resolution globe textures as requested.\n");
1157 } else if (r_config.maxTextureSize > 2048 && R_ImageExists("pics/geoscape/med/map_earth_season_00")) {
1158 if (r_config.maxTextureSize > 4096) {
1159 Com_Printf("Warning: high resolution globe textures requested, but could not be found; falling back to medium resolution globe textures.\n");
1160 } else {
1161 Com_Printf("Using medium resolution globe textures as requested.\n");
1162 }
1163 Q_strncpyz(r_config.lodDir, "med", sizeof(r_config.lodDir));
1164 } else {
1165 if (r_config.maxTextureSize > 2048) {
1166 Com_Printf("Warning: medium resolution globe textures requested, but could not be found; falling back to low resolution globe textures.\n");
1167 } else {
1168 Com_Printf("Using low resolution globe textures as requested.\n");
1169 }
1170 Q_strncpyz(r_config.lodDir, "low", sizeof(r_config.lodDir));
1171 }
1172}
1173
1177static inline void R_EnforceVersion (void)
1178{
1179 int maj, min, rel;
1180
1181 sscanf(r_config.versionString, "%d.%d.%d ", &maj, &min, &rel);
1182
1183#ifndef GL_VERSION_ES_CM_1_0
1184 if (maj > 1)
1185 return;
1186
1187 if (maj < 1)
1188 Com_Error(ERR_FATAL, "OpenGL version %s is less than 1.2.1", r_config.versionString);
1189
1190 if (min > 2)
1191 return;
1192
1193 if (min < 2)
1194 Com_Error(ERR_FATAL, "OpenGL Version %s is less than 1.2.1", r_config.versionString);
1195
1196 if (rel > 1)
1197 return;
1198
1199 if (rel < 1)
1200 Com_Error(ERR_FATAL, "OpenGL version %s is less than 1.2.1", r_config.versionString);
1201#endif
1202}
1203
1207static bool R_SearchForVendor (const char* vendor)
1208{
1209 return Q_stristr(r_config.vendorString, vendor)
1210 || Q_stristr(r_config.rendererString, vendor);
1211}
1212
1213#define INTEL_TEXTURE_RESOLUTION 1024
1214
1218static inline void R_VerifyDriver (void)
1219{
1220#ifdef _WIN32
1221 if (!Q_strcasecmp((const char*)glGetString(GL_RENDERER), "gdi generic"))
1222 Com_Error(ERR_FATAL, "No hardware acceleration detected.\n"
1223 "Update your graphic card drivers.");
1224#else
1225 if (!Q_strcasecmp((const char*)glGetString(GL_RENDERER), "Software Rasterizer"))
1226 Com_Error(ERR_FATAL, "No hardware acceleration detected.\n"
1227 "Update your graphic card drivers.");
1228#endif
1229 if (R_SearchForVendor("Intel")) {
1230 Com_Printf("You might want to activate texture compression if you have visual artifacts.\n");
1231 if (r_intel_hack->integer) {
1232 /* HACK: */
1233 Com_Printf("Disabling shaders for Intel chips - see cvar r_intel_hack\n");
1234 Cvar_Set("r_programs", "0");
1235 if (r_intel_hack->integer == 1) {
1236 if (r_maxtexres->integer > INTEL_TEXTURE_RESOLUTION) {
1237 Com_Printf("Set max. texture resolution to %i - see cvar r_intel_hack\n", INTEL_TEXTURE_RESOLUTION);
1239 }
1240 }
1241 }
1242 r_config.hardwareType = GLHW_INTEL;
1243 } else if (R_SearchForVendor("NVIDIA")) {
1244 r_config.hardwareType = GLHW_NVIDIA;
1245 } else if (R_SearchForVendor("ATI") || R_SearchForVendor("Advanced Micro Devices") || R_SearchForVendor("AMD")) {
1246 r_config.hardwareType = GLHW_ATI;
1247 } else if (R_SearchForVendor("mesa") || R_SearchForVendor("gallium") || R_SearchForVendor("nouveau")) {
1248 r_config.hardwareType = GLHW_MESA;
1249 } else {
1250 r_config.hardwareType = GLHW_GENERIC;
1251 }
1252 /* disable intel hack for non intel cards */
1253 if (!R_SearchForVendor("Intel")) {
1254 Cvar_Set("r_intel_hack", "0");
1255 Cvar_Set("r_vendor_non_intel", "1");
1256 }
1257}
1258
1259bool R_Init (void)
1260{
1262
1266
1267 /* some config default values */
1268 r_config.gl_solid_format = GL_RGB;
1269 r_config.gl_alpha_format = GL_RGBA;
1270 r_config.gl_filter_min = GL_LINEAR_MIPMAP_LINEAR;
1271 r_config.gl_filter_max = GL_LINEAR;
1272 r_config.maxTextureSize = 256;
1273
1274 /* initialize OS-specific parts of OpenGL */
1275 if (!Rimp_Init())
1276 return false;
1277
1278 /* get our various GL strings */
1279 r_config.vendorString = (const char*)glGetString(GL_VENDOR);
1280 r_config.rendererString = (const char*)glGetString(GL_RENDERER);
1281 r_config.versionString = (const char*)glGetString(GL_VERSION);
1282 r_config.extensionsString = (const char*)glGetString(GL_EXTENSIONS);
1283 R_Strings_f();
1284
1285 /* sanity checks and card specific hacks */
1288
1290
1291 /* prevent reloading of some rendering cvars */
1293
1294 R_ModelInit();
1298 R_InitImages();
1301 R_SphereInit();
1302 R_FontInit();
1304 R_UpdateDefaultMaterial("","","", nullptr);
1305 r_battlescapeWeather.setDefaults();
1306
1307 R_CheckError();
1308
1309 return true;
1310}
1311
1315void R_Shutdown (void)
1316{
1318
1320
1323
1327
1328 /* shut down OS specific OpenGL stuff like contexts, etc. */
1329 Rimp_Shutdown();
1330}
clientBattleScape_t cl
client_static_t cls
Definition cl_main.cpp:83
@ THREAD_RENDERER
@ THREAD_CLIENT
#define VID_NORM_WIDTH
Definition cl_renderer.h:40
void R_FontInit(void)
Definition r_font.cpp:716
renderer_threadstate_t r_threadstate
Definition r_thread.cpp:34
#define RDF_NOWORLDMODEL
Definition cl_renderer.h:34
#define VID_NORM_HEIGHT
Definition cl_renderer.h:41
void R_FontShutdown(void)
frees the SDL_ttf fonts
Definition r_font.cpp:144
rendererData_t refdef
Definition r_main.cpp:45
void R_Color(const vec4_t rgba)
Change the color to given value.
Definition r_state.cpp:1011
cvar_t * vid_gamma
Definition cl_video.cpp:40
cvar_t * vid_fullscreen
Definition cl_video.cpp:37
cvar_t * vid_stretch
Definition cl_video.cpp:36
viddef_t viddef
Definition cl_video.cpp:34
bool VID_GetModeInfo(int modeIndex, vidmode_t *modeInfo)
Definition cl_video.cpp:91
cvar_t * vid_mode
Definition cl_video.cpp:38
cvar_t * vid_ignoregamma
Definition cl_video.cpp:41
@ WEATHER_MAX
Definition r_weather.h:32
@ WEATHER_CLEAN
Definition r_weather.h:32
Primary header for client.
void Cmd_TableAddList(const cmdList_t *cmdList)
Definition cmd.cpp:853
void Cmd_TableRemoveList(const cmdList_t *cmdList)
Definition cmd.cpp:859
void Com_Error(int code, const char *fmt,...)
Definition common.cpp:459
void Com_Printf(const char *const fmt,...)
Definition common.cpp:428
#define GAME_TITLE
Definition common.h:37
#define ERR_FATAL
Definition common.h:210
bool Cvar_PendingCvars(int flags)
Checks whether there are pending cvars for the given flags.
Definition cvar.cpp:881
cvarChangeListener_t * Cvar_RegisterChangeListener(const char *varName, cvarChangeListenerFunc_t listenerFunc)
Registers a listener that is executed each time a cvar changed its value.
Definition cvar.cpp:446
void Com_SetRenderModified(bool modified)
Definition cvar.cpp:66
void Cvar_SetValue(const char *varName, float value)
Expands value to a string and calls Cvar_Set.
Definition cvar.cpp:671
cvar_t * Cvar_Set(const char *varName, const char *value,...)
Sets a cvar value.
Definition cvar.cpp:615
bool Cvar_SetCheckFunction(const char *varName, bool(*check)(cvar_t *cvar))
Set a checker function for cvar values.
Definition cvar.cpp:139
int Cvar_GetInteger(const char *varName)
Returns the int value of a cvar.
Definition cvar.cpp:194
bool Com_IsRenderModified(void)
Definition cvar.cpp:71
bool Cvar_AssertValue(cvar_t *cvar, float minVal, float maxVal, bool shouldBeIntegral)
Checks cvar values.
Definition cvar.cpp:161
void Cvar_Reset(cvar_t *cvar)
Sets the cvar value back to the old value.
Definition cvar.cpp:241
void Cvar_ClearVars(int flags)
Definition cvar.cpp:891
cvar_t * Cvar_Get(const char *var_name, const char *var_value, int flags, const char *desc)
Init or return a cvar.
Definition cvar.cpp:342
#define CVAR_R_IMAGES
Definition cvar.h:47
#define CVAR_ARCHIVE
Definition cvar.h:40
#define CVAR_R_PROGRAMS
Definition cvar.h:49
#define CVAR_R_MASK
Definition cvar.h:51
#define CVAR_LATCH
Definition cvar.h:44
#define CVAR_R_CONTEXT
Definition cvar.h:48
#define PLANE_ANYZ
Definition defines.h:198
GLenum glGetError(void)
Definition gldummy.cpp:8
voidpf void * buf
Definition ioapi.h:42
const vec3_t vec3_origin
Definition mathlib.cpp:35
void RotatePointAroundVector(vec3_t dst, const vec3_t dir, const vec3_t point, float degrees)
Rotate a point around a given vector.
Definition mathlib.cpp:849
bool Q_IsPowerOfTwo(int i)
Checks whether i is power of two value.
Definition mathlib.cpp:972
void AngleVectors(const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up)
Create the rotation matrix in order to rotate something.
Definition mathlib.cpp:631
void R_ResetArrayState(void)
Definition r_array.cpp:185
void R_RenderBlendWarpBspRRefs(void)
Draw all warped translucent bsp surfaces via warp shader and with blend enabled.
Definition r_bsp.cpp:475
void R_RenderOpaqueBspRRefs(void)
Draw all simple opaque bsp surfaces with multitexture enabled and light enabled.
Definition r_bsp.cpp:410
void R_GetLevelSurfaceLists(void)
Fills the surface chains for the current worldlevel and hide other levels.
Definition r_bsp.cpp:281
void R_RenderOpaqueWarpBspRRefs(void)
Draw all warped opaque bsp surfaces via warp shader.
Definition r_bsp.cpp:426
void R_DrawBspNormals(int tile)
Developer tool for viewing BSP vertex normals. Only Phong interpolated surfaces show their normals wh...
Definition r_bsp.cpp:134
void R_RenderMaterialBspRRefs(void)
Definition r_bsp.cpp:449
void R_RenderBlendBspRRefs(void)
Draw all translucent bsp surfaces with multitexture enabled and blend enabled.
Definition r_bsp.cpp:462
void R_AddBspRRef(const mBspModel_t *model, const vec3_t origin, const vec3_t angles, const bool forceVisibility)
Adds bsp render references.
Definition r_bsp.cpp:324
void R_RenderAlphaTestBspRRefs(void)
Definition r_bsp.cpp:436
void R_ClearBspRRefs(void)
Definition r_bsp.cpp:311
void R_RenderFlareBspRRefs(void)
Definition r_bsp.cpp:454
void R_AddCorona(const vec3_t org, float radius, const vec3_t color)
Definition r_corona.cpp:24
void R_DrawCoronas(void)
Definition r_corona.cpp:41
void R_DrawBoundingBoxes(void)
Definition r_draw.cpp:640
void R_DrawChars(void)
Definition r_draw.cpp:155
void R_DrawInitLocal(void)
Loads some textures and init the 3d globe.
Definition r_draw.cpp:83
void R_DrawSpecialEntities(const entity_t *ents)
Definition r_entity.cpp:473
entity_t * r_blend_mesh_entities
Definition r_entity.cpp:38
void R_DrawOpaqueMeshEntities(entity_t *ents)
Definition r_entity.cpp:339
void R_DrawBlendMeshEntities(entity_t *ents)
Definition r_entity.cpp:411
entity_t * r_null_entities
Definition r_entity.cpp:39
void R_GetEntityLists(void)
Primary entry point for drawing all entities.
Definition r_entity.cpp:625
void R_DrawEntityEffects(void)
Draws shadow and highlight effects for the entities (actors).
Definition r_entity.cpp:208
entity_t * r_special_entities
Definition r_entity.cpp:40
entity_t * r_opaque_mesh_entities
Definition r_entity.cpp:37
void R_DrawNullEntities(const entity_t *ents)
Draw entities which models couldn't be loaded.
Definition r_entity.cpp:503
#define MAX_ENTITY_LIGHTS
Definition r_entity.h:28
Error checking function.
#define R_CheckError()
Definition r_error.h:30
static const char * R_TranslateError(GLenum error)
Definition r_error.h:33
void R_FontListCache_f(void)
Console command binding to show the font cache.
Definition r_font.cpp:226
void R_InitFBObjects(void)
void R_ShutdownFBObjects(void)
Delete all registered framebuffer and render buffer objects, clear memory.
void R_DrawBloom(void)
handle post-processing bloom
OpenGL bindings.
void(APIENTRY * BlitFramebuffer_t)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum)
Definition r_gl.h:205
void(APIENTRY * Uniform1i_t)(GLint location, GLint i)
Definition r_gl.h:176
void(APIENTRY * Uniform4fv_t)(GLint location, int count, GLfloat *f)
Definition r_gl.h:181
void(APIENTRY * FramebufferRenderbufferEXT_t)(GLenum, GLenum, GLenum, GLuint)
Definition r_gl.h:201
void(APIENTRY * UseProgram_t)(GLuint id)
Definition r_gl.h:171
void(APIENTRY * GetProgramInfoLog_t)(GLuint id, GLuint maxlen, GLuint *len, GLchar *dest)
Definition r_gl.h:174
void(APIENTRY * Uniform1fv_t)(GLint location, int count, GLfloat *f)
Definition r_gl.h:178
void(APIENTRY * DrawBuffers_t)(GLsizei, const GLenum *)
Definition r_gl.h:204
GLboolean(APIENTRY * IsRenderbufferEXT_t)(GLuint)
Definition r_gl.h:186
void(APIENTRY * GetShaderiv_t)(GLuint id, GLenum field, GLuint *dest)
Definition r_gl.h:164
void(APIENTRY * GetShaderInfoLog_t)(GLuint id, GLuint maxlen, GLuint *len, GLchar *dest)
Definition r_gl.h:165
void(APIENTRY * LinkProgram_t)(GLuint id)
Definition r_gl.h:170
void(APIENTRY * EnableVertexAttribArray_t)(GLuint index)
Definition r_gl.h:155
GLuint(APIENTRY * CreateShader_t)(GLenum type)
Definition r_gl.h:160
void(APIENTRY * FramebufferTexture3DEXT_t)(GLenum, GLenum, GLenum, GLuint, GLint, GLint)
Definition r_gl.h:200
void(APIENTRY * FramebufferTexture1DEXT_t)(GLenum, GLenum, GLenum, GLuint, GLint)
Definition r_gl.h:198
void(APIENTRY * FramebufferTexture2DEXT_t)(GLenum, GLenum, GLenum, GLuint, GLint)
Definition r_gl.h:199
void(APIENTRY * DetachShader_t)(GLuint prog, GLuint shader)
Definition r_gl.h:169
void(APIENTRY * DeleteBuffers_t)(GLuint count, GLuint *id)
Definition r_gl.h:150
QGL_EXTERN GLsizei const GLvoid * data
Definition r_gl.h:89
void(APIENTRY * BindRenderbufferEXT_t)(GLenum, GLuint)
Definition r_gl.h:187
void(APIENTRY * GetActiveUniforms_t)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
Definition r_gl.h:172
void(APIENTRY * RenderbufferStorageMultisampleEXT_t)(GLenum, GLsizei, GLenum, GLsizei, GLsizei)
Definition r_gl.h:191
QGL_EXTERN GLuint GLsizei GLsizei * length
Definition r_gl.h:110
void(APIENTRY * DeleteProgram_t)(GLuint id)
Definition r_gl.h:167
GLboolean(APIENTRY * IsFramebufferEXT_t)(GLuint)
Definition r_gl.h:193
void(APIENTRY * DeleteRenderbuffersEXT_t)(GLsizei, const GLuint *)
Definition r_gl.h:188
void(APIENTRY * Uniform3fv_t)(GLint location, int count, GLfloat *f)
Definition r_gl.h:180
QGL_EXTERN GLint i
Definition r_gl.h:113
void(APIENTRY * ShaderSource_t)(GLuint id, GLuint count, GLchar **sources, GLuint *len)
Definition r_gl.h:162
void(APIENTRY * GenBuffers_t)(GLuint count, GLuint *id)
Definition r_gl.h:149
void(APIENTRY * GenFramebuffersEXT_t)(GLsizei, GLuint *)
Definition r_gl.h:196
void(APIENTRY * VertexAttribPointer_t)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
Definition r_gl.h:157
void(APIENTRY * UniformMatrix4fv_t)(GLint location, int count, GLboolean transpose, GLfloat *v)
Definition r_gl.h:183
void(APIENTRY * GenerateMipmapEXT_t)(GLenum)
Definition r_gl.h:203
void(APIENTRY * DeleteShader_t)(GLuint id)
Definition r_gl.h:161
GLint(APIENTRY * GetAttribLocation_t)(GLuint id, const GLchar *name)
Definition r_gl.h:182
void(APIENTRY * Uniform2fv_t)(GLint location, int count, GLfloat *f)
Definition r_gl.h:179
void(APIENTRY * BufferData_t)(GLenum target, GLsizei size, const GLvoid *data, GLenum usage)
Definition r_gl.h:152
void(APIENTRY * DeleteFramebuffersEXT_t)(GLsizei, const GLuint *)
Definition r_gl.h:195
void(APIENTRY * RenderbufferStorageEXT_t)(GLenum, GLenum, GLsizei, GLsizei)
Definition r_gl.h:190
void(APIENTRY * ClientActiveTexture_t)(GLenum texture)
Definition r_gl.h:146
GLenum(APIENTRY * CheckFramebufferStatusEXT_t)(GLenum)
Definition r_gl.h:197
void(APIENTRY * BindFramebufferEXT_t)(GLenum, GLuint)
Definition r_gl.h:194
void(APIENTRY * ActiveTexture_t)(GLenum texture)
Definition r_gl.h:145
void(APIENTRY * CompileShader_t)(GLuint id)
Definition r_gl.h:163
GLuint(APIENTRY * CreateProgram_t)(void)
Definition r_gl.h:166
void(APIENTRY * GetRenderbufferParameterivEXT_t)(GLenum, GLenum, GLint *)
Definition r_gl.h:192
void(APIENTRY * Uniform1f_t)(GLint location, GLfloat f)
Definition r_gl.h:177
GLint(APIENTRY * GetUniformLocation_t)(GLuint id, const GLchar *name)
Definition r_gl.h:175
void(APIENTRY * GetProgramiv_t)(GLuint id, GLenum field, GLuint *dest)
Definition r_gl.h:173
void(APIENTRY * BindBuffer_t)(GLenum target, GLuint id)
Definition r_gl.h:151
void(APIENTRY * AttachShader_t)(GLuint prog, GLuint shader)
Definition r_gl.h:168
void(APIENTRY * GenRenderbuffersEXT_t)(GLsizei, GLuint *)
Definition r_gl.h:189
QGL_EXTERN const GLuint *QGL_EXTERN GLuint *QGL_EXTERN GLenum
Definition r_gl.h:127
void(APIENTRY * DisableVertexAttribArray_t)(GLuint index)
Definition r_gl.h:156
void(APIENTRY * GetFramebufferAttachmentParameterivEXT_t)(GLenum, GLenum, GLenum, GLint *)
Definition r_gl.h:202
#define GL_MAX_VARYING_VECTORS
#define GL_MAX_RENDERBUFFER_SIZE_EXT
#define GL_MAX_VERTEX_ATTRIBS
#define GL_MAX_TEXTURE_COORDS
#define GL_MAX_VERTEX_UNIFORM_VECTORS
#define GL_MAX_FRAGMENT_UNIFORM_VECTORS
#define GL_SHADING_LANGUAGE_VERSION
#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB
void R_DrawGrass()
Definition r_grass.cpp:399
Pseudoinstanced grass generation and rendering.
void R_ImageList_f(void)
Shows all loaded images.
Definition r_image.cpp:85
void R_TextureAlphaMode(const char *string)
Definition r_image.cpp:931
void R_InitImages(void)
Definition r_image.cpp:774
void R_TextureSolidMode(const char *string)
Definition r_image.cpp:966
void R_ShutdownImages(void)
Definition r_image.cpp:796
bool R_ImageExists(const char *pname,...)
Definition r_image.cpp:681
void R_TextureMode(const char *string)
Definition r_image.cpp:869
image_t * r_dummyTexture
Definition r_main.cpp:53
image_t * r_noTexture
Definition r_main.cpp:51
image_t * r_warpTexture
Definition r_main.cpp:52
void R_UpdateSustainedLights(void)
Updates state of sustained lights; should be called once per frame right before world rendering.
Definition r_light.cpp:83
lightmap definitions
#define LIGHTMAP_MAX_PAGE_SIZE
Definition r_lightmap.h:31
#define LIGHTMAP_DEFAULT_PAGE_SIZE
Definition r_lightmap.h:30
local graphics definitions
cvar_t * r_default_hardness
Definition r_main.cpp:83
cvar_t * r_specular
Definition r_main.cpp:104
cvar_t * r_bumpmap
Definition r_main.cpp:103
cvar_t * r_maxlightmap
Definition r_main.cpp:101
cvar_t * r_shownormals
Definition r_main.cpp:102
cvar_t * r_screenshot_jpeg_quality
Definition r_main.cpp:67
cvar_t * r_drawbuffer
Definition r_main.cpp:85
cvar_t * r_vertexbuffers
Definition r_main.cpp:94
cvar_t * r_overridematerial
Definition r_main.cpp:81
cvar_t * r_hardness
Definition r_main.cpp:105
void R_DrawParticles(void)
cvar_t * r_postprocess
Definition r_main.cpp:100
@ GLHW_INTEL
Definition r_local.h:149
@ GLHW_GENERIC
Definition r_local.h:147
@ GLHW_MESA
Definition r_local.h:148
@ GLHW_ATI
Definition r_local.h:150
@ GLHW_NVIDIA
Definition r_local.h:151
cvar_t * r_screenshot_format
Definition r_main.cpp:66
cvar_t * r_shadows
Definition r_main.cpp:87
cvar_t * r_drawworld
Definition r_main.cpp:61
void Rimp_Shutdown(void)
Definition r_sdl.cpp:230
cvar_t * r_flares
Definition r_main.cpp:108
cvar_t * r_ext_texture_compression
Definition r_main.cpp:73
bool R_InitGraphics(const viddefContext_t *context)
Init the SDL window.
Definition r_sdl.cpp:179
cvar_t * r_wire
Definition r_main.cpp:91
cvar_t * r_default_specular
Definition r_main.cpp:82
cvar_t * r_swapinterval
Definition r_main.cpp:89
cvar_t * r_particles
cvar_t * r_drawtags
Definition r_main.cpp:110
cvar_t * r_coronas
Definition r_main.cpp:109
cvar_t * r_nocull
Definition r_main.cpp:62
cvar_t * r_driver
Definition r_main.cpp:86
cvar_t * r_checkerror
Definition r_main.cpp:84
cvar_t * r_showbox
Definition r_main.cpp:92
cvar_t * r_fog
Definition r_main.cpp:107
cvar_t * r_debug_normals
Definition r_main.cpp:69
cvar_t * r_debug_lights
Definition r_main.cpp:71
cvar_t * r_drawentities
Definition r_main.cpp:60
cvar_t * r_parallax
Definition r_main.cpp:106
cvar_t * r_multisample
Definition r_main.cpp:90
cvar_t * r_programs
Definition r_main.cpp:97
cvar_t * r_materials
Definition r_main.cpp:80
rconfig_t r_config
Definition r_main.cpp:47
cvar_t * r_lightmap
Definition r_main.cpp:68
cvar_t * r_stencilshadows
Definition r_main.cpp:88
cvar_t * r_isometric
Definition r_main.cpp:63
cvar_t * r_dynamic_lights
Definition r_main.cpp:96
cvar_t * r_anisotropic
Definition r_main.cpp:64
cvar_t * r_texture_lod
Definition r_main.cpp:65
cvar_t * r_glsl_version
The GLSL version being used (not necessarily a supported version by the OpenGL implementation)....
Definition r_main.cpp:99
bool Rimp_Init(void)
Definition r_sdl.cpp:56
rlocals_t r_locals
Definition r_main.cpp:49
cvar_t * r_warp
Definition r_main.cpp:95
cvar_t * r_debug_tangents
Definition r_main.cpp:70
cvar_t * r_threads
Definition r_main.cpp:93
static uintptr_t R_GetProcAddressExt(const char *functionName)
Definition r_main.cpp:753
static void R_Strings_f(void)
Prints some OpenGL strings.
Definition r_main.cpp:129
static cvar_t * r_texturesolidmode
Definition r_main.cpp:79
static void R_VerifyDriver(void)
Checks whether we have hardware acceleration.
Definition r_main.cpp:1218
cvar_t * r_weather
Definition r_main.cpp:59
static void R_PrintInfo(const char *pre, const char *msg)
Definition r_main.cpp:112
Weather r_battlescapeWeather
Definition r_main.cpp:55
static bool R_CvarPrograms(cvar_t *cvar)
Definition r_main.cpp:509
static cvar_t * r_texturemode
Definition r_main.cpp:77
static void R_RegisterImageVars(void)
Definition r_main.cpp:634
void R_SetupFrustum(void)
Definition r_main.cpp:137
static cvar_t * r_maxtexres
Definition r_main.cpp:57
bool R_Init(void)
Definition r_main.cpp:1259
static bool R_CvarCheckMaxLightmap(cvar_t *cvar)
Definition r_main.cpp:480
void R_RenderFrame(void)
Definition r_main.cpp:298
static void R_ClearScene(void)
Definition r_main.cpp:209
void R_Shutdown(void)
Definition r_main.cpp:1315
static bool R_CvarCheckMultisample(cvar_t *cvar)
Definition r_main.cpp:548
static bool R_CvarGLSLVersionCheck(cvar_t *cvar)
Callback that is called when the r_glsl_version cvar is changed,.
Definition r_main.cpp:522
void R_BeginFrame(void)
Definition r_main.cpp:220
#define R_CheckGLVersion(max, min)
Definition r_main.cpp:828
static cvar_t * r_texturealphamode
Definition r_main.cpp:78
static cvar_t * r_ext_s3tc_compression
Definition r_main.cpp:74
void R_EndFrame(void)
Definition r_main.cpp:443
static void R_EnforceVersion(void)
We need at least opengl version 1.2.1.
Definition r_main.cpp:1177
static void R_UpdateVidDef(const viddefContext_t *context)
Definition r_main.cpp:643
rstate_t r_state
Definition r_main.cpp:48
static void R_UpdateWeather(const char *cvarName, const char *oldValue, const char *newValue, void *data)
Definition r_main.cpp:558
static void R_RegisterSystemVars(void)
Definition r_main.cpp:564
bool R_SetMode(void)
Definition r_main.cpp:688
static bool R_SearchForVendor(const char *vendor)
Searches vendor and renderer GL strings for the given vendor id.
Definition r_main.cpp:1207
static const cmdList_t r_commands[]
Definition r_main.cpp:469
static cvar_t * r_ext_nonpoweroftwo
Definition r_main.cpp:75
static bool R_CheckExtension(const char *extension)
Checks for an OpenGL extension that was announced via the OpenGL ext string. If the given extension s...
Definition r_main.cpp:783
static cvar_t * r_intel_hack
Definition r_main.cpp:76
static void R_Clear(void)
Clears the screens color and depth buffer.
Definition r_main.cpp:192
static bool R_CvarCheckDynamicLights(cvar_t *cvar)
Definition r_main.cpp:499
static uintptr_t R_GetProcAddress(const char *functionName)
Definition r_main.cpp:748
#define INTEL_TEXTURE_RESOLUTION
Definition r_main.cpp:1213
static bool R_CvarCheckWeather(cvar_t *cvar)
Definition r_main.cpp:553
static bool R_CvarPostProcess(cvar_t *cvar)
Definition r_main.cpp:539
static cvar_t * r_deluxemap
Definition r_main.cpp:72
static void R_InitExtensions(void)
Check and load all needed and supported opengl extensions.
Definition r_main.cpp:834
void R_UpdateDefaultMaterial(const char *cvarName, const char *oldValue, const char *newValue, void *data)
Change listener callback for material value cvars.
void R_InitMiscTexture(void)
Definition r_misc.cpp:46
void R_ScreenShot_f(void)
Definition r_misc.cpp:203
void R_ModModellist_f(void)
Prints all loaded models.
Definition r_model.cpp:53
void R_ModelInit()
Definition r_model.cpp:436
void R_ModelShutdown()
Definition r_model.cpp:440
int r_numMapTiles
Definition r_model.cpp:33
model_t * r_mapTiles[MAX_MAPTILES]
The world model(s).
Definition r_model.cpp:32
void R_RestartPrograms_f(void)
Reloads the glsl shaders.
void R_InitPrograms(void)
void R_ShutdownPrograms(void)
void R_SphereInit(void)
Creates the spheres we need for rendering the 3d globe.
Definition r_sphere.cpp:119
Functions to generate and render spheres.
void R_Setup3D(void)
Definition r_state.cpp:763
void R_SetDefaultState(void)
Definition r_state.cpp:860
void R_EnableMultisample(bool enable)
Definition r_state.cpp:243
void R_Setup2D(void)
Definition r_state.cpp:825
void R_EnableBlend(bool enable)
Definition r_state.cpp:261
void R_EnableFog(bool enable)
Definition r_state.cpp:586
void R_ShutdownThreads(void)
Definition r_thread.cpp:69
void R_InitThreads(void)
Definition r_thread.cpp:85
Weather effects rendering subsystem header file.
#define Q_strcasecmp(a, b)
Definition shared.h:131
#define OBJZERO(obj)
Definition shared.h:178
#define lengthof(x)
Definition shared.h:105
void Q_strncpyz(char *dest, const char *src, size_t destsize)
Safe strncpy that ensures a trailing zero.
Definition shared.cpp:457
const char * Q_stristr(const char *str, const char *substr)
Checks in case insensitive manner whether str contains substr.
Definition shared.cpp:563
bool Q_strreplace(const char *source, const char *pattern, const char *replace, char *dest, size_t destsize)
Replaces the first occurence of the given pattern in the source string with the given replace string.
Definition shared.cpp:596
This is a cvar definition. Cvars can be user modified and used in our menus e.g.
Definition cvar.h:71
int integer
Definition cvar.h:81
char * string
Definition cvar.h:73
char * name
Definition cvar.h:72
a light source
Definition r_light.h:29
vec4_t color
Definition r_light.h:31
vec3_t origin
Definition r_light.h:30
float radius
Definition r_light.h:32
brush model
mBspModel_t bsp
Definition r_model.h:60
GL config stuff.
Definition r_local.h:155
Contains the game screen context, everything that is needed to create the graphic context....
Definition cl_video.h:44
unsigned width
Definition cl_video.h:47
unsigned height
Definition cl_video.h:48
int height
Definition cl_video.h:86
int width
Definition cl_video.h:86
System specific stuff.
void Sys_Sleep(int milliseconds)
Calls the win32 sleep function.
Tracing functions.
void UI_InvalidateStack(void)
Invalidate all windows of the current stack.
#define DotProduct(x, y)
Returns the distance between two 3-dimensional vectors.
Definition vector.h:44
#define VectorScale(in, scale, out)
Definition vector.h:79