DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
vid_shared.c
Go to the documentation of this file.
1
2#include "quakedef.h"
3#include "cdaudio.h"
4#include "image.h"
5
6#ifdef WIN32
7//#include <XInput.h>
8#define XINPUT_GAMEPAD_DPAD_UP 0x0001
9#define XINPUT_GAMEPAD_DPAD_DOWN 0x0002
10#define XINPUT_GAMEPAD_DPAD_LEFT 0x0004
11#define XINPUT_GAMEPAD_DPAD_RIGHT 0x0008
12#define XINPUT_GAMEPAD_START 0x0010
13#define XINPUT_GAMEPAD_BACK 0x0020
14#define XINPUT_GAMEPAD_LEFT_THUMB 0x0040
15#define XINPUT_GAMEPAD_RIGHT_THUMB 0x0080
16#define XINPUT_GAMEPAD_LEFT_SHOULDER 0x0100
17#define XINPUT_GAMEPAD_RIGHT_SHOULDER 0x0200
18#define XINPUT_GAMEPAD_A 0x1000
19#define XINPUT_GAMEPAD_B 0x2000
20#define XINPUT_GAMEPAD_X 0x4000
21#define XINPUT_GAMEPAD_Y 0x8000
22#define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE 7849
23#define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689
24#define XINPUT_GAMEPAD_TRIGGER_THRESHOLD 30
25#define XUSER_INDEX_ANY 0x000000FF
26
27typedef struct xinput_gamepad_s
28{
29 WORD wButtons;
30 BYTE bLeftTrigger;
31 BYTE bRightTrigger;
32 SHORT sThumbLX;
33 SHORT sThumbLY;
34 SHORT sThumbRX;
35 SHORT sThumbRY;
36}
37xinput_gamepad_t;
38
39typedef struct xinput_state_s
40{
41 DWORD dwPacketNumber;
42 xinput_gamepad_t Gamepad;
43}
44xinput_state_t;
45
46typedef struct xinput_keystroke_s
47{
48 WORD VirtualKey;
49 WCHAR Unicode;
50 WORD Flags;
51 BYTE UserIndex;
52 BYTE HidCode;
53}
54xinput_keystroke_t;
55
56DWORD (WINAPI *qXInputGetState)(DWORD index, xinput_state_t *state);
57DWORD (WINAPI *qXInputGetKeystroke)(DWORD index, DWORD reserved, xinput_keystroke_t *keystroke);
58
59qbool vid_xinputinitialized = false;
60int vid_xinputindex = -1;
61#endif
62
63// global video state
65
66// AK FIXME -> input_dest
68
69// AK where should it be placed ?
72
73// LadyHavoc: if window is hidden, don't update screen
75// LadyHavoc: if window is not the active window, don't hog as much CPU time,
76// let go of the mouse, turn off sound, and restore system gamma ramps...
78
80
81#ifdef WIN32
82cvar_t joy_xinputavailable = {CF_CLIENT | CF_READONLY, "joy_xinputavailable", "0", "indicates which devices are being reported by the Windows XInput API (first controller = 1, second = 2, third = 4, fourth = 8, added together)"};
83#endif
84cvar_t joy_active = {CF_CLIENT | CF_READONLY, "joy_active", "0", "indicates that a joystick is active (detected and enabled)"};
85cvar_t joy_detected = {CF_CLIENT | CF_READONLY, "joy_detected", "0", "number of joysticks detected by engine"};
86cvar_t joy_enable = {CF_CLIENT | CF_ARCHIVE, "joy_enable", "0", "enables joystick support"};
87cvar_t joy_index = {CF_CLIENT, "joy_index", "0", "selects which joystick to use if you have multiple (0 uses the first controller, 1 uses the second, ...)"};
88cvar_t joy_axisforward = {CF_CLIENT, "joy_axisforward", "1", "which joystick axis to query for forward/backward movement"};
89cvar_t joy_axisside = {CF_CLIENT, "joy_axisside", "0", "which joystick axis to query for right/left movement"};
90cvar_t joy_axisup = {CF_CLIENT, "joy_axisup", "-1", "which joystick axis to query for up/down movement"};
91cvar_t joy_axispitch = {CF_CLIENT, "joy_axispitch", "3", "which joystick axis to query for looking up/down"};
92cvar_t joy_axisyaw = {CF_CLIENT, "joy_axisyaw", "2", "which joystick axis to query for looking right/left"};
93cvar_t joy_axisroll = {CF_CLIENT, "joy_axisroll", "-1", "which joystick axis to query for tilting head right/left"};
94cvar_t joy_deadzoneforward = {CF_CLIENT, "joy_deadzoneforward", "0", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
95cvar_t joy_deadzoneside = {CF_CLIENT, "joy_deadzoneside", "0", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
96cvar_t joy_deadzoneup = {CF_CLIENT, "joy_deadzoneup", "0", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
97cvar_t joy_deadzonepitch = {CF_CLIENT, "joy_deadzonepitch", "0", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
98cvar_t joy_deadzoneyaw = {CF_CLIENT, "joy_deadzoneyaw", "0", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
99cvar_t joy_deadzoneroll = {CF_CLIENT, "joy_deadzoneroll", "0", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
100cvar_t joy_sensitivityforward = {CF_CLIENT, "joy_sensitivityforward", "-1", "movement multiplier"};
101cvar_t joy_sensitivityside = {CF_CLIENT, "joy_sensitivityside", "1", "movement multiplier"};
102cvar_t joy_sensitivityup = {CF_CLIENT, "joy_sensitivityup", "1", "movement multiplier"};
103cvar_t joy_sensitivitypitch = {CF_CLIENT, "joy_sensitivitypitch", "1", "movement multiplier"};
104cvar_t joy_sensitivityyaw = {CF_CLIENT, "joy_sensitivityyaw", "-1", "movement multiplier"};
105cvar_t joy_sensitivityroll = {CF_CLIENT, "joy_sensitivityroll", "1", "movement multiplier"};
106cvar_t joy_axiskeyevents = {CF_CLIENT | CF_ARCHIVE, "joy_axiskeyevents", "0", "generate uparrow/leftarrow etc. keyevents for joystick axes, use if your joystick driver is not generating them"};
107cvar_t joy_axiskeyevents_deadzone = {CF_CLIENT | CF_ARCHIVE, "joy_axiskeyevents_deadzone", "0.5", "deadzone value for axes"};
108cvar_t joy_x360_axisforward = {CF_CLIENT, "joy_x360_axisforward", "1", "which joystick axis to query for forward/backward movement"};
109cvar_t joy_x360_axisside = {CF_CLIENT, "joy_x360_axisside", "0", "which joystick axis to query for right/left movement"};
110cvar_t joy_x360_axisup = {CF_CLIENT, "joy_x360_axisup", "-1", "which joystick axis to query for up/down movement"};
111cvar_t joy_x360_axispitch = {CF_CLIENT, "joy_x360_axispitch", "3", "which joystick axis to query for looking up/down"};
112cvar_t joy_x360_axisyaw = {CF_CLIENT, "joy_x360_axisyaw", "2", "which joystick axis to query for looking right/left"};
113cvar_t joy_x360_axisroll = {CF_CLIENT, "joy_x360_axisroll", "-1", "which joystick axis to query for tilting head right/left"};
114cvar_t joy_x360_deadzoneforward = {CF_CLIENT, "joy_x360_deadzoneforward", "0.266", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
115cvar_t joy_x360_deadzoneside = {CF_CLIENT, "joy_x360_deadzoneside", "0.266", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
116cvar_t joy_x360_deadzoneup = {CF_CLIENT, "joy_x360_deadzoneup", "0.266", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
117cvar_t joy_x360_deadzonepitch = {CF_CLIENT, "joy_x360_deadzonepitch", "0.266", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
118cvar_t joy_x360_deadzoneyaw = {CF_CLIENT, "joy_x360_deadzoneyaw", "0.266", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
119cvar_t joy_x360_deadzoneroll = {CF_CLIENT, "joy_x360_deadzoneroll", "0.266", "deadzone tolerance, suggested values are in the range 0 to 0.01"};
120cvar_t joy_x360_sensitivityforward = {CF_CLIENT, "joy_x360_sensitivityforward", "1", "movement multiplier"};
121cvar_t joy_x360_sensitivityside = {CF_CLIENT, "joy_x360_sensitivityside", "1", "movement multiplier"};
122cvar_t joy_x360_sensitivityup = {CF_CLIENT, "joy_x360_sensitivityup", "1", "movement multiplier"};
123cvar_t joy_x360_sensitivitypitch = {CF_CLIENT, "joy_x360_sensitivitypitch", "-1", "movement multiplier"};
124cvar_t joy_x360_sensitivityyaw = {CF_CLIENT, "joy_x360_sensitivityyaw", "-1", "movement multiplier"};
125cvar_t joy_x360_sensitivityroll = {CF_CLIENT, "joy_x360_sensitivityroll", "1", "movement multiplier"};
126
127// VorteX: more info cvars, mostly set in VID_CheckExtensions
128cvar_t gl_info_vendor = {CF_CLIENT | CF_READONLY, "gl_info_vendor", "", "indicates brand of graphics chip"};
129cvar_t gl_info_renderer = {CF_CLIENT | CF_READONLY, "gl_info_renderer", "", "indicates graphics chip model and other information"};
130cvar_t gl_info_version = {CF_CLIENT | CF_READONLY, "gl_info_version", "", "indicates version of current renderer. begins with 1.0.0, 1.1.0, 1.2.0, 1.3.1 etc."};
131cvar_t gl_info_extensions = {CF_CLIENT | CF_READONLY, "gl_info_extensions", "", "indicates extension list found by engine, space separated."};
132cvar_t gl_info_driver = {CF_CLIENT | CF_READONLY, "gl_info_driver", "", "name of driver library (opengl32.dll, libGL.so.1, or whatever)."};
133
134cvar_t vid_fullscreen = {CF_CLIENT | CF_ARCHIVE, "vid_fullscreen", "1", "use fullscreen (1) or windowed (0)"};
135cvar_t vid_borderless = {CF_CLIENT | CF_ARCHIVE, "vid_borderless", "0", "make the window borderless by removing all window decorations. has no effect in fullscreen mode"};
136cvar_t vid_width = {CF_CLIENT | CF_ARCHIVE, "vid_width", "640", "resolution"};
137cvar_t vid_height = {CF_CLIENT | CF_ARCHIVE, "vid_height", "480", "resolution"};
138cvar_t vid_bitsperpixel = {CF_CLIENT | CF_READONLY, "vid_bitsperpixel", "32", "how many bits per pixel to render at (this is not currently configurable)"};
139cvar_t vid_samples = {CF_CLIENT | CF_ARCHIVE, "vid_samples", "1", "how many anti-aliasing samples per pixel to request from the graphics driver (4 is recommended, 1 is faster)"};
140cvar_t vid_refreshrate = {CF_CLIENT | CF_ARCHIVE, "vid_refreshrate", "0", "refresh rate to use, in hz (higher values feel smoother, if supported by your monitor), 0 uses the default"};
141cvar_t vid_stereobuffer = {CF_CLIENT | CF_ARCHIVE, "vid_stereobuffer", "0", "enables 'quad-buffered' stereo rendering for stereo shutterglasses, HMD (head mounted display) devices, or polarized stereo LCDs, if supported by your drivers"};
142// the density cvars are completely optional, set and use when something needs to have a density-independent size.
143// TODO: set them when changing resolution, setting them from the commandline will be independent from the resolution - use only if you have a native fixed resolution.
144// values for the Samsung Galaxy SIII, Snapdragon version: 2.000000 density, 304.799988 xdpi, 303.850464 ydpi
145cvar_t vid_touchscreen_density = {CF_CLIENT, "vid_touchscreen_density", "2.0", "Standard quantized screen density multiplier (see Android documentation for DisplayMetrics), similar values are given on iPhoneOS"};
146cvar_t vid_touchscreen_xdpi = {CF_CLIENT, "vid_touchscreen_xdpi", "300", "Horizontal DPI of the screen (only valid on Android currently)"};
147cvar_t vid_touchscreen_ydpi = {CF_CLIENT, "vid_touchscreen_ydpi", "300", "Vertical DPI of the screen (only valid on Android currently)"};
148
149cvar_t vid_vsync = {CF_CLIENT | CF_ARCHIVE, "vid_vsync", "0", "sync to vertical blank, prevents 'tearing' (seeing part of one frame and part of another on the screen at the same time) at the cost of latency, >= 1 always syncs and <= -1 is adaptive (stops syncing if the framerate drops, unsupported by some platforms), automatically disabled when doing timedemo benchmarks"};
150cvar_t vid_mouse = {CF_CLIENT | CF_ARCHIVE, "vid_mouse", "1", "whether to use the mouse in windowed mode (fullscreen always does)"};
151cvar_t vid_mouse_clickthrough = {CF_CLIENT | CF_ARCHIVE, "vid_mouse_clickthrough", "0", "mouse behavior in windowed mode: 0 = click to focus, 1 = allow interaction even if the window is not focused (click-through behaviour, can be useful when using third-party game overlays)"};
152cvar_t vid_minimize_on_focus_loss = {CF_CLIENT | CF_ARCHIVE, "vid_minimize_on_focus_loss", "0", "whether to minimize the fullscreen window if it loses focus (such as by alt+tab)"};
153cvar_t vid_grabkeyboard = {CF_CLIENT | CF_ARCHIVE, "vid_grabkeyboard", "0", "whether to grab the keyboard when mouse is active (prevents use of volume control keys, music player keys, etc on some keyboards)"};
154cvar_t vid_minwidth = {CF_CLIENT, "vid_minwidth", "0", "minimum vid_width that is acceptable (to be set in default.cfg in mods)"};
155cvar_t vid_minheight = {CF_CLIENT, "vid_minheight", "0", "minimum vid_height that is acceptable (to be set in default.cfg in mods)"};
156cvar_t gl_finish = {CF_CLIENT | CF_CLIENT, "gl_finish", "0", "make the cpu wait for the graphics processor at the end of each rendered frame (can help with strange input or video lag problems on some machines)"};
157cvar_t vid_sRGB = {CF_CLIENT | CF_ARCHIVE, "vid_sRGB", "0", "if hardware is capable, modify rendering to be gamma corrected for the sRGB color standard (computer monitors, TVs), recommended"};
158cvar_t vid_sRGB_fallback = {CF_CLIENT | CF_ARCHIVE, "vid_sRGB_fallback", "0", "do an approximate sRGB fallback if not properly supported by hardware (2: also use the fallback if framebuffer is 8bit, 3: always use the fallback even if sRGB is supported)"};
159
160cvar_t vid_touchscreen = {CF_CLIENT, "vid_touchscreen", "0", "Use touchscreen-style input (no mouse grab, track mouse motion only while button is down, screen areas for mimicing joystick axes and buttons"};
161cvar_t vid_touchscreen_showkeyboard = {CF_CLIENT, "vid_touchscreen_showkeyboard", "0", "shows the platform's screen keyboard for text entry, can be set by csqc or menu qc if it wants to receive text input, does nothing if the platform has no screen keyboard"};
162cvar_t vid_touchscreen_supportshowkeyboard = {CF_CLIENT | CF_READONLY, "vid_touchscreen_supportshowkeyboard", "0", "indicates if the platform supports a virtual keyboard"};
163cvar_t vid_stick_mouse = {CF_CLIENT | CF_ARCHIVE, "vid_stick_mouse", "0", "have the mouse stuck in the center of the screen" };
164cvar_t vid_resizable = {CF_CLIENT | CF_ARCHIVE, "vid_resizable", "1", "0: window not resizable, 1: resizable, 2: window can be resized but the framebuffer isn't adjusted" };
165cvar_t vid_desktopfullscreen = {CF_CLIENT | CF_ARCHIVE, "vid_desktopfullscreen", "1", "force desktop resolution and refresh rate (disable modesetting), also use some OS-dependent tricks for better fullscreen integration; disabling may reveal OS/driver/SDL bugs with multi-monitor configurations"};
166cvar_t vid_display = {CF_CLIENT | CF_ARCHIVE, "vid_display", "0", "which monitor to render on, numbered from 0 (system default)" };
167cvar_t vid_info_displaycount = {CF_CLIENT | CF_READONLY, "vid_info_displaycount", "1", "how many monitors are currently available, updated by hotplug events" };
168#ifdef WIN32
169cvar_t vid_ignore_taskbar = {CF_CLIENT | CF_ARCHIVE, "vid_ignore_taskbar", "1", "in windowed mode, prevent the Windows taskbar and window borders from affecting the size and placement of the window. it will be aligned centered and uses the unaltered vid_width/vid_height values"};
170#endif
171
172cvar_t v_gamma = {CF_CLIENT | CF_ARCHIVE, "v_gamma", "1", "inverse gamma correction value, a brightness effect that does not affect white or black, and tends to make the image grey and dull"};
173cvar_t v_contrast = {CF_CLIENT | CF_ARCHIVE, "v_contrast", "1", "brightness of white (values above 1 give a brighter image with increased color saturation, unlike v_gamma)"};
174cvar_t v_brightness = {CF_CLIENT | CF_ARCHIVE, "v_brightness", "0", "brightness of black, useful for monitors that are too dark"};
175cvar_t v_contrastboost = {CF_CLIENT | CF_ARCHIVE, "v_contrastboost", "1", "by how much to multiply the contrast in dark areas (1 is no change)"};
176cvar_t v_color_enable = {CF_CLIENT | CF_ARCHIVE, "v_color_enable", "0", "enables black-grey-white color correction curve controls"};
177cvar_t v_color_black_r = {CF_CLIENT | CF_ARCHIVE, "v_color_black_r", "0", "desired color of black"};
178cvar_t v_color_black_g = {CF_CLIENT | CF_ARCHIVE, "v_color_black_g", "0", "desired color of black"};
179cvar_t v_color_black_b = {CF_CLIENT | CF_ARCHIVE, "v_color_black_b", "0", "desired color of black"};
180cvar_t v_color_grey_r = {CF_CLIENT | CF_ARCHIVE, "v_color_grey_r", "0.5", "desired color of grey"};
181cvar_t v_color_grey_g = {CF_CLIENT | CF_ARCHIVE, "v_color_grey_g", "0.5", "desired color of grey"};
182cvar_t v_color_grey_b = {CF_CLIENT | CF_ARCHIVE, "v_color_grey_b", "0.5", "desired color of grey"};
183cvar_t v_color_white_r = {CF_CLIENT | CF_ARCHIVE, "v_color_white_r", "1", "desired color of white"};
184cvar_t v_color_white_g = {CF_CLIENT | CF_ARCHIVE, "v_color_white_g", "1", "desired color of white"};
185cvar_t v_color_white_b = {CF_CLIENT | CF_ARCHIVE, "v_color_white_b", "1", "desired color of white"};
186cvar_t v_glslgamma_2d = {CF_CLIENT | CF_ARCHIVE, "v_glslgamma_2d", "1", "applies GLSL gamma to 2d pictures (HUD, fonts)"};
187cvar_t v_psycho = {CF_CLIENT, "v_psycho", "0", "easter egg - R.I.P. zinx http://obits.al.com/obituaries/birmingham/obituary.aspx?n=christopher-robert-lais&pid=186080667"};
188
189// brand of graphics chip
190const char *gl_vendor;
191// graphics chip model and other information
192const char *gl_renderer;
193// begins with 1.0.0, 1.1.0, 1.2.0, 1.2.1, 1.3.0, 1.3.1, or 1.4.0
194const char *gl_version;
195
196#ifndef USE_GLES2
198GLboolean (GLAPIENTRY *qglIsEnabled)(GLenum cap);
199GLboolean (GLAPIENTRY *qglIsFramebuffer)(GLuint framebuffer);
200GLboolean (GLAPIENTRY *qglIsQuery)(GLuint qid);
201GLboolean (GLAPIENTRY *qglIsRenderbuffer)(GLuint renderbuffer);
202GLboolean (GLAPIENTRY *qglUnmapBuffer) (GLenum target);
203GLenum (GLAPIENTRY *qglCheckFramebufferStatus)(GLenum target);
204GLenum (GLAPIENTRY *qglGetError)(void);
205GLint (GLAPIENTRY *qglGetAttribLocation)(GLuint programObj, const GLchar *name);
206GLint (GLAPIENTRY *qglGetUniformLocation)(GLuint programObj, const GLchar *name);
207GLuint (GLAPIENTRY *qglCreateProgram)(void);
208GLuint (GLAPIENTRY *qglCreateShader)(GLenum shaderType);
210GLuint (GLAPIENTRY *qglGetUniformBlockIndex)(GLuint program, const char* uniformBlockName);
214GLvoid (GLAPIENTRY *qglDeleteFramebuffers)(GLsizei n, const GLuint *framebuffers);
215GLvoid (GLAPIENTRY *qglDeleteRenderbuffers)(GLsizei n, const GLuint *renderbuffers);
221GLvoid (GLAPIENTRY *qglGenFramebuffers)(GLsizei n, GLuint *framebuffers);
222GLvoid (GLAPIENTRY *qglGenRenderbuffers)(GLsizei n, GLuint *renderbuffers);
223GLvoid (GLAPIENTRY *qglGenerateMipmap)(GLenum target);
224GLvoid (GLAPIENTRY *qglGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
225GLvoid (GLAPIENTRY *qglGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint *params);
231void (GLAPIENTRY *qglActiveTexture)(GLenum texture);
232void (GLAPIENTRY *qglAttachShader)(GLuint containerObj, GLuint obj);
234void (GLAPIENTRY *qglBindAttribLocation)(GLuint programObj, GLuint index, const GLchar *name);
236void (GLAPIENTRY *qglBindBufferBase)(GLenum target, GLuint index, GLuint buffer);
238void (GLAPIENTRY *qglBindFragDataLocation)(GLuint programObj, GLuint index, const GLchar *name);
239void (GLAPIENTRY *qglBindTexture)(GLenum target, GLuint texture);
240void (GLAPIENTRY *qglBindVertexArray)(GLuint array);
241void (GLAPIENTRY *qglBlendEquation)(GLenum); // also supplied by GL_blend_subtract
242void (GLAPIENTRY *qglBlendFunc)(GLenum sfactor, GLenum dfactor);
245void (GLAPIENTRY *qglBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
246void (GLAPIENTRY *qglClear)(GLbitfield mask);
248void (GLAPIENTRY *qglClearDepth)(GLclampd depth);
249void (GLAPIENTRY *qglClearStencil)(GLint s);
251void (GLAPIENTRY *qglCompileShader)(GLuint shaderObj);
259void (GLAPIENTRY *qglCullFace)(GLenum mode);
260void (GLAPIENTRY *qglDebugMessageCallbackARB)(GLDEBUGPROCARB callback, const GLvoid* userParam);
263void (GLAPIENTRY *qglDeleteBuffers) (GLsizei n, const GLuint *buffers);
264void (GLAPIENTRY *qglDeleteProgram)(GLuint obj);
265void (GLAPIENTRY *qglDeleteQueries)(GLsizei n, const GLuint *ids);
266void (GLAPIENTRY *qglDeleteShader)(GLuint obj);
267void (GLAPIENTRY *qglDeleteTextures)(GLsizei n, const GLuint *textures);
268void (GLAPIENTRY *qglDeleteVertexArrays)(GLsizei n, const GLuint *arrays);
269void (GLAPIENTRY *qglDepthFunc)(GLenum func);
270void (GLAPIENTRY *qglDepthMask)(GLboolean flag);
271void (GLAPIENTRY *qglDepthRange)(GLclampd near_val, GLclampd far_val);
272void (GLAPIENTRY *qglDepthRangef)(GLclampf near_val, GLclampf far_val);
273void (GLAPIENTRY *qglDetachShader)(GLuint containerObj, GLuint attachedObj);
274void (GLAPIENTRY *qglDisable)(GLenum cap);
275void (GLAPIENTRY *qglDisableVertexAttribArray)(GLuint index);
277void (GLAPIENTRY *qglDrawBuffer)(GLenum mode);
278void (GLAPIENTRY *qglDrawBuffers)(GLsizei n, const GLenum *bufs);
280void (GLAPIENTRY *qglEnable)(GLenum cap);
281void (GLAPIENTRY *qglEnableVertexAttribArray)(GLuint index);
282void (GLAPIENTRY *qglEndQuery)(GLenum target);
283void (GLAPIENTRY *qglFinish)(void);
284void (GLAPIENTRY *qglFlush)(void);
285void (GLAPIENTRY *qglGenBuffers) (GLsizei n, GLuint *buffers);
286void (GLAPIENTRY *qglGenQueries)(GLsizei n, GLuint *ids);
287void (GLAPIENTRY *qglGenTextures)(GLsizei n, GLuint *textures);
288void (GLAPIENTRY *qglGenVertexArrays)(GLsizei n, GLuint *arrays);
290void (GLAPIENTRY *qglGetActiveUniform)(GLuint programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
291void (GLAPIENTRY *qglGetActiveUniformBlockName)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, char* uniformBlockName);
292void (GLAPIENTRY *qglGetActiveUniformBlockiv)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
293void (GLAPIENTRY *qglGetActiveUniformName)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, char* uniformName);
294void (GLAPIENTRY *qglGetActiveUniformsiv)(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
295void (GLAPIENTRY *qglGetAttachedShaders)(GLuint containerObj, GLsizei maxCount, GLsizei *count, GLuint *obj);
296void (GLAPIENTRY *qglGetBooleanv)(GLenum pname, GLboolean *params);
297void (GLAPIENTRY *qglGetCompressedTexImage)(GLenum target, GLint lod, void *img);
298void (GLAPIENTRY *qglGetDoublev)(GLenum pname, GLdouble *params);
299void (GLAPIENTRY *qglGetFloatv)(GLenum pname, GLfloat *params);
300void (GLAPIENTRY *qglGetIntegeri_v)(GLenum target, GLuint index, GLint* data);
301void (GLAPIENTRY *qglGetIntegerv)(GLenum pname, GLint *params);
302void (GLAPIENTRY *qglGetPointerv)(GLenum pname, GLvoid** params);
304void (GLAPIENTRY *qglGetProgramiv)(GLuint obj, GLenum pname, GLint *params);
305void (GLAPIENTRY *qglGetQueryObjectiv)(GLuint qid, GLenum pname, GLint *params);
306void (GLAPIENTRY *qglGetQueryObjectuiv)(GLuint qid, GLenum pname, GLuint *params);
307void (GLAPIENTRY *qglGetQueryiv)(GLenum target, GLenum pname, GLint *params);
310void (GLAPIENTRY *qglGetShaderiv)(GLuint obj, GLenum pname, GLint *params);
312void (GLAPIENTRY *qglGetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat *params);
313void (GLAPIENTRY *qglGetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint *params);
314void (GLAPIENTRY *qglGetTexParameterfv)(GLenum target, GLenum pname, GLfloat *params);
315void (GLAPIENTRY *qglGetTexParameteriv)(GLenum target, GLenum pname, GLint *params);
316void (GLAPIENTRY *qglGetUniformIndices)(GLuint program, GLsizei uniformCount, const char** uniformNames, GLuint* uniformIndices);
317void (GLAPIENTRY *qglGetUniformfv)(GLuint programObj, GLint location, GLfloat *params);
318void (GLAPIENTRY *qglGetUniformiv)(GLuint programObj, GLint location, GLint *params);
319void (GLAPIENTRY *qglGetVertexAttribPointerv)(GLuint index, GLenum pname, GLvoid **pointer);
320void (GLAPIENTRY *qglGetVertexAttribdv)(GLuint index, GLenum pname, GLdouble *params);
321void (GLAPIENTRY *qglGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat *params);
322void (GLAPIENTRY *qglGetVertexAttribiv)(GLuint index, GLenum pname, GLint *params);
324void (GLAPIENTRY *qglLinkProgram)(GLuint programObj);
325void (GLAPIENTRY *qglPixelStorei)(GLenum pname, GLint param);
326void (GLAPIENTRY *qglPointSize)(GLfloat size);
327void (GLAPIENTRY *qglPolygonMode)(GLenum face, GLenum mode);
328void (GLAPIENTRY *qglPolygonOffset)(GLfloat factor, GLfloat units);
329void (GLAPIENTRY *qglReadBuffer)(GLenum mode);
333void (GLAPIENTRY *qglShaderSource)(GLuint shaderObj, GLsizei count, const GLchar **string, const GLint *length);
334void (GLAPIENTRY *qglStencilFunc)(GLenum func, GLint ref, GLuint mask);
335void (GLAPIENTRY *qglStencilMask)(GLuint mask);
336void (GLAPIENTRY *qglStencilOp)(GLenum fail, GLenum zfail, GLenum zpass);
339void (GLAPIENTRY *qglTexParameterf)(GLenum target, GLenum pname, GLfloat param);
340void (GLAPIENTRY *qglTexParameterfv)(GLenum target, GLenum pname, GLfloat *params);
341void (GLAPIENTRY *qglTexParameteri)(GLenum target, GLenum pname, GLint param);
346void (GLAPIENTRY *qglUniform1i)(GLint location, GLint v0);
347void (GLAPIENTRY *qglUniform1iv)(GLint location, GLsizei count, const GLint *value);
349void (GLAPIENTRY *qglUniform2fv)(GLint location, GLsizei count, const GLfloat *value);
350void (GLAPIENTRY *qglUniform2i)(GLint location, GLint v0, GLint v1);
351void (GLAPIENTRY *qglUniform2iv)(GLint location, GLsizei count, const GLint *value);
353void (GLAPIENTRY *qglUniform3fv)(GLint location, GLsizei count, const GLfloat *value);
354void (GLAPIENTRY *qglUniform3i)(GLint location, GLint v0, GLint v1, GLint v2);
355void (GLAPIENTRY *qglUniform3iv)(GLint location, GLsizei count, const GLint *value);
357void (GLAPIENTRY *qglUniform4fv)(GLint location, GLsizei count, const GLfloat *value);
358void (GLAPIENTRY *qglUniform4i)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
359void (GLAPIENTRY *qglUniform4iv)(GLint location, GLsizei count, const GLint *value);
362void (GLAPIENTRY *qglUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
363void (GLAPIENTRY *qglUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
364void (GLAPIENTRY *qglUseProgram)(GLuint programObj);
365void (GLAPIENTRY *qglValidateProgram)(GLuint programObj);
366void (GLAPIENTRY *qglVertexAttrib1d)(GLuint index, GLdouble v0);
367void (GLAPIENTRY *qglVertexAttrib1dv)(GLuint index, const GLdouble *v);
368void (GLAPIENTRY *qglVertexAttrib1f)(GLuint index, GLfloat v0);
369void (GLAPIENTRY *qglVertexAttrib1fv)(GLuint index, const GLfloat *v);
370void (GLAPIENTRY *qglVertexAttrib1s)(GLuint index, GLshort v0);
371void (GLAPIENTRY *qglVertexAttrib1sv)(GLuint index, const GLshort *v);
372void (GLAPIENTRY *qglVertexAttrib2d)(GLuint index, GLdouble v0, GLdouble v1);
373void (GLAPIENTRY *qglVertexAttrib2dv)(GLuint index, const GLdouble *v);
374void (GLAPIENTRY *qglVertexAttrib2f)(GLuint index, GLfloat v0, GLfloat v1);
375void (GLAPIENTRY *qglVertexAttrib2fv)(GLuint index, const GLfloat *v);
376void (GLAPIENTRY *qglVertexAttrib2s)(GLuint index, GLshort v0, GLshort v1);
377void (GLAPIENTRY *qglVertexAttrib2sv)(GLuint index, const GLshort *v);
378void (GLAPIENTRY *qglVertexAttrib3d)(GLuint index, GLdouble v0, GLdouble v1, GLdouble v2);
379void (GLAPIENTRY *qglVertexAttrib3dv)(GLuint index, const GLdouble *v);
380void (GLAPIENTRY *qglVertexAttrib3f)(GLuint index, GLfloat v0, GLfloat v1, GLfloat v2);
381void (GLAPIENTRY *qglVertexAttrib3fv)(GLuint index, const GLfloat *v);
382void (GLAPIENTRY *qglVertexAttrib3s)(GLuint index, GLshort v0, GLshort v1, GLshort v2);
383void (GLAPIENTRY *qglVertexAttrib3sv)(GLuint index, const GLshort *v);
384void (GLAPIENTRY *qglVertexAttrib4Nbv)(GLuint index, const GLbyte *v);
385void (GLAPIENTRY *qglVertexAttrib4Niv)(GLuint index, const GLint *v);
386void (GLAPIENTRY *qglVertexAttrib4Nsv)(GLuint index, const GLshort *v);
388void (GLAPIENTRY *qglVertexAttrib4Nubv)(GLuint index, const GLubyte *v);
389void (GLAPIENTRY *qglVertexAttrib4Nuiv)(GLuint index, const GLuint *v);
390void (GLAPIENTRY *qglVertexAttrib4Nusv)(GLuint index, const GLushort *v);
391void (GLAPIENTRY *qglVertexAttrib4bv)(GLuint index, const GLbyte *v);
393void (GLAPIENTRY *qglVertexAttrib4dv)(GLuint index, const GLdouble *v);
394void (GLAPIENTRY *qglVertexAttrib4f)(GLuint index, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
395void (GLAPIENTRY *qglVertexAttrib4fv)(GLuint index, const GLfloat *v);
396void (GLAPIENTRY *qglVertexAttrib4iv)(GLuint index, const GLint *v);
397void (GLAPIENTRY *qglVertexAttrib4s)(GLuint index, GLshort v0, GLshort v1, GLshort v2, GLshort v3);
398void (GLAPIENTRY *qglVertexAttrib4sv)(GLuint index, const GLshort *v);
399void (GLAPIENTRY *qglVertexAttrib4ubv)(GLuint index, const GLubyte *v);
400void (GLAPIENTRY *qglVertexAttrib4uiv)(GLuint index, const GLuint *v);
401void (GLAPIENTRY *qglVertexAttrib4usv)(GLuint index, const GLushort *v);
404#endif
405
406#if _MSC_VER >= 1400
407#define sscanf sscanf_s
408#endif
409
410typedef struct glfunction_s
411{
412 const char *extension;
413 const char *name;
415}
417
418#ifndef USE_GLES2
419// functions we look for - both core and extensions - it's okay if some of these are NULL for unsupported extensions.
421{
422 {"core", "glActiveTexture", (void **) &qglActiveTexture},
423 {"core", "glAttachShader", (void **) &qglAttachShader},
424 {"core", "glBeginQuery", (void **) &qglBeginQuery},
425 {"core", "glBindAttribLocation", (void **) &qglBindAttribLocation},
426 {"core", "glBindBuffer", (void **) &qglBindBuffer},
427 {"core", "glBindBufferBase", (void **) &qglBindBufferBase},
428 {"core", "glBindBufferRange", (void **) &qglBindBufferRange},
429 {"core", "glBindFramebuffer", (void **) &qglBindFramebuffer},
430 {"core", "glBindRenderbuffer", (void **) &qglBindRenderbuffer},
431 {"core", "glBindTexture", (void **) &qglBindTexture},
432 {"core", "glBindVertexArray", (void **) &qglBindVertexArray},
433 {"core", "glBlendEquation", (void **) &qglBlendEquation},
434 {"core", "glBlendFunc", (void **) &qglBlendFunc},
435 {"core", "glBlendFuncSeparate", (void **) &qglBlendFuncSeparate},
436 {"core", "glBlitFramebuffer", (void **) &qglBlitFramebuffer},
437 {"core", "glBufferData", (void **) &qglBufferData},
438 {"core", "glBufferSubData", (void **) &qglBufferSubData},
439 {"core", "glCheckFramebufferStatus", (void **) &qglCheckFramebufferStatus},
440 {"core", "glClear", (void **) &qglClear},
441 {"core", "glClearColor", (void **) &qglClearColor},
442 {"core", "glClearDepth", (void **) &qglClearDepth},
443 {"core", "glClearStencil", (void **) &qglClearStencil},
444 {"core", "glColorMask", (void **) &qglColorMask},
445 {"core", "glCompileShader", (void **) &qglCompileShader},
446 {"core", "glCompressedTexImage2D", (void **) &qglCompressedTexImage2D},
447 {"core", "glCompressedTexImage3D", (void **) &qglCompressedTexImage3D},
448 {"core", "glCompressedTexSubImage2D", (void **) &qglCompressedTexSubImage2D},
449 {"core", "glCompressedTexSubImage3D", (void **) &qglCompressedTexSubImage3D},
450 {"core", "glCopyTexImage2D", (void **) &qglCopyTexImage2D},
451 {"core", "glCopyTexSubImage2D", (void **) &qglCopyTexSubImage2D},
452 {"core", "glCopyTexSubImage3D", (void **) &qglCopyTexSubImage3D},
453 {"core", "glCreateProgram", (void **) &qglCreateProgram},
454 {"core", "glCreateShader", (void **) &qglCreateShader},
455 {"core", "glCullFace", (void **) &qglCullFace},
456 {"core", "glDeleteBuffers", (void **) &qglDeleteBuffers},
457 {"core", "glDeleteFramebuffers", (void **) &qglDeleteFramebuffers},
458 {"core", "glDeleteProgram", (void **) &qglDeleteProgram},
459 {"core", "glDeleteQueries", (void **) &qglDeleteQueries},
460 {"core", "glDeleteRenderbuffers", (void **) &qglDeleteRenderbuffers},
461 {"core", "glDeleteShader", (void **) &qglDeleteShader},
462 {"core", "glDeleteTextures", (void **) &qglDeleteTextures},
463 {"core", "glDeleteVertexArrays", (void **)&qglDeleteVertexArrays},
464 {"core", "glDepthFunc", (void **) &qglDepthFunc},
465 {"core", "glDepthMask", (void **) &qglDepthMask},
466 {"core", "glDepthRange", (void **) &qglDepthRange},
467 {"core", "glDepthRangef", (void **) &qglDepthRangef},
468 {"core", "glDetachShader", (void **) &qglDetachShader},
469 {"core", "glDisable", (void **) &qglDisable},
470 {"core", "glDisableVertexAttribArray", (void **) &qglDisableVertexAttribArray},
471 {"core", "glDrawArrays", (void **) &qglDrawArrays},
472 {"core", "glDrawBuffer", (void **) &qglDrawBuffer},
473 {"core", "glDrawBuffers", (void **) &qglDrawBuffers},
474 {"core", "glDrawElements", (void **) &qglDrawElements},
475 {"core", "glEnable", (void **) &qglEnable},
476 {"core", "glEnableVertexAttribArray", (void **) &qglEnableVertexAttribArray},
477 {"core", "glEndQuery", (void **) &qglEndQuery},
478 {"core", "glFinish", (void **) &qglFinish},
479 {"core", "glFlush", (void **) &qglFlush},
480 {"core", "glFramebufferRenderbuffer", (void **) &qglFramebufferRenderbuffer},
481 {"core", "glFramebufferTexture1D", (void **) &qglFramebufferTexture1D},
482 {"core", "glFramebufferTexture2D", (void **) &qglFramebufferTexture2D},
483 {"core", "glFramebufferTexture3D", (void **) &qglFramebufferTexture3D},
484 {"core", "glFramebufferTextureLayer", (void **) &qglFramebufferTextureLayer},
485 {"core", "glGenBuffers", (void **) &qglGenBuffers},
486 {"core", "glGenFramebuffers", (void **) &qglGenFramebuffers},
487 {"core", "glGenQueries", (void **) &qglGenQueries},
488 {"core", "glGenRenderbuffers", (void **) &qglGenRenderbuffers},
489 {"core", "glGenTextures", (void **) &qglGenTextures},
490 {"core", "glGenVertexArrays", (void **)&qglGenVertexArrays},
491 {"core", "glGenerateMipmap", (void **) &qglGenerateMipmap},
492 {"core", "glGetActiveAttrib", (void **) &qglGetActiveAttrib},
493 {"core", "glGetActiveUniform", (void **) &qglGetActiveUniform},
494 {"core", "glGetActiveUniformBlockName", (void **) &qglGetActiveUniformBlockName},
495 {"core", "glGetActiveUniformBlockiv", (void **) &qglGetActiveUniformBlockiv},
496 {"core", "glGetActiveUniformName", (void **) &qglGetActiveUniformName},
497 {"core", "glGetActiveUniformsiv", (void **) &qglGetActiveUniformsiv},
498 {"core", "glGetAttachedShaders", (void **) &qglGetAttachedShaders},
499 {"core", "glGetAttribLocation", (void **) &qglGetAttribLocation},
500 {"core", "glGetBooleanv", (void **) &qglGetBooleanv},
501 {"core", "glGetCompressedTexImage", (void **) &qglGetCompressedTexImage},
502 {"core", "glGetDoublev", (void **) &qglGetDoublev},
503 {"core", "glGetError", (void **) &qglGetError},
504 {"core", "glGetFloatv", (void **) &qglGetFloatv},
505 {"core", "glGetFramebufferAttachmentParameteriv", (void **) &qglGetFramebufferAttachmentParameteriv},
506 {"core", "glGetIntegeri_v", (void **) &qglGetIntegeri_v},
507 {"core", "glGetIntegerv", (void **) &qglGetIntegerv},
508 {"core", "glGetProgramInfoLog", (void **) &qglGetProgramInfoLog},
509 {"core", "glGetProgramiv", (void **) &qglGetProgramiv},
510 {"core", "glGetQueryObjectiv", (void **) &qglGetQueryObjectiv},
511 {"core", "glGetQueryObjectuiv", (void **) &qglGetQueryObjectuiv},
512 {"core", "glGetQueryiv", (void **) &qglGetQueryiv},
513 {"core", "glGetRenderbufferParameteriv", (void **) &qglGetRenderbufferParameteriv},
514 {"core", "glGetShaderInfoLog", (void **) &qglGetShaderInfoLog},
515 {"core", "glGetShaderSource", (void **) &qglGetShaderSource},
516 {"core", "glGetShaderiv", (void **) &qglGetShaderiv},
517 {"core", "glGetString", (void **) &qglGetString},
518 {"core", "glGetStringi", (void **) &qglGetStringi},
519 {"core", "glGetTexImage", (void **) &qglGetTexImage},
520 {"core", "glGetTexLevelParameterfv", (void **) &qglGetTexLevelParameterfv},
521 {"core", "glGetTexLevelParameteriv", (void **) &qglGetTexLevelParameteriv},
522 {"core", "glGetTexParameterfv", (void **) &qglGetTexParameterfv},
523 {"core", "glGetTexParameteriv", (void **) &qglGetTexParameteriv},
524 {"core", "glGetUniformBlockIndex", (void **) &qglGetUniformBlockIndex},
525 {"core", "glGetUniformIndices", (void **) &qglGetUniformIndices},
526 {"core", "glGetUniformLocation", (void **) &qglGetUniformLocation},
527 {"core", "glGetUniformfv", (void **) &qglGetUniformfv},
528 {"core", "glGetUniformiv", (void **) &qglGetUniformiv},
529 {"core", "glGetVertexAttribPointerv", (void **) &qglGetVertexAttribPointerv},
530 {"core", "glGetVertexAttribdv", (void **) &qglGetVertexAttribdv},
531 {"core", "glGetVertexAttribfv", (void **) &qglGetVertexAttribfv},
532 {"core", "glGetVertexAttribiv", (void **) &qglGetVertexAttribiv},
533 {"core", "glHint", (void **) &qglHint},
534 {"core", "glIsBuffer", (void **) &qglIsBuffer},
535 {"core", "glIsEnabled", (void **) &qglIsEnabled},
536 {"core", "glIsFramebuffer", (void **) &qglIsFramebuffer},
537 {"core", "glIsQuery", (void **) &qglIsQuery},
538 {"core", "glIsRenderbuffer", (void **) &qglIsRenderbuffer},
539 {"core", "glLinkProgram", (void **) &qglLinkProgram},
540 {"core", "glMapBuffer", (void **) &qglMapBuffer},
541 {"core", "glPixelStorei", (void **) &qglPixelStorei},
542 {"core", "glPointSize", (void **) &qglPointSize},
543 {"core", "glPolygonMode", (void **) &qglPolygonMode},
544 {"core", "glPolygonOffset", (void **) &qglPolygonOffset},
545 {"core", "glReadBuffer", (void **) &qglReadBuffer},
546 {"core", "glReadPixels", (void **) &qglReadPixels},
547 {"core", "glRenderbufferStorage", (void **) &qglRenderbufferStorage},
548 {"core", "glRenderbufferStorageMultisample", (void **) &qglRenderbufferStorageMultisample},
549 {"core", "glSampleCoverage", (void **) &qglSampleCoverage},
550 {"core", "glScissor", (void **) &qglScissor},
551 {"core", "glShaderSource", (void **) &qglShaderSource},
552 {"core", "glStencilFunc", (void **) &qglStencilFunc},
553 {"core", "glStencilMask", (void **) &qglStencilMask},
554 {"core", "glStencilOp", (void **) &qglStencilOp},
555 {"core", "glTexImage2D", (void **) &qglTexImage2D},
556 {"core", "glTexImage3D", (void **) &qglTexImage3D},
557 {"core", "glTexParameterf", (void **) &qglTexParameterf},
558 {"core", "glTexParameterfv", (void **) &qglTexParameterfv},
559 {"core", "glTexParameteri", (void **) &qglTexParameteri},
560 {"core", "glTexSubImage2D", (void **) &qglTexSubImage2D},
561 {"core", "glTexSubImage3D", (void **) &qglTexSubImage3D},
562 {"core", "glUniform1f", (void **) &qglUniform1f},
563 {"core", "glUniform1fv", (void **) &qglUniform1fv},
564 {"core", "glUniform1i", (void **) &qglUniform1i},
565 {"core", "glUniform1iv", (void **) &qglUniform1iv},
566 {"core", "glUniform2f", (void **) &qglUniform2f},
567 {"core", "glUniform2fv", (void **) &qglUniform2fv},
568 {"core", "glUniform2i", (void **) &qglUniform2i},
569 {"core", "glUniform2iv", (void **) &qglUniform2iv},
570 {"core", "glUniform3f", (void **) &qglUniform3f},
571 {"core", "glUniform3fv", (void **) &qglUniform3fv},
572 {"core", "glUniform3i", (void **) &qglUniform3i},
573 {"core", "glUniform3iv", (void **) &qglUniform3iv},
574 {"core", "glUniform4f", (void **) &qglUniform4f},
575 {"core", "glUniform4fv", (void **) &qglUniform4fv},
576 {"core", "glUniform4i", (void **) &qglUniform4i},
577 {"core", "glUniform4iv", (void **) &qglUniform4iv},
578 {"core", "glUniformBlockBinding", (void **) &qglUniformBlockBinding},
579 {"core", "glUniformMatrix2fv", (void **) &qglUniformMatrix2fv},
580 {"core", "glUniformMatrix3fv", (void **) &qglUniformMatrix3fv},
581 {"core", "glUniformMatrix4fv", (void **) &qglUniformMatrix4fv},
582 {"core", "glUnmapBuffer", (void **) &qglUnmapBuffer},
583 {"core", "glUseProgram", (void **) &qglUseProgram},
584 {"core", "glValidateProgram", (void **) &qglValidateProgram},
585 {"core", "glVertexAttrib1d", (void **) &qglVertexAttrib1d},
586 {"core", "glVertexAttrib1dv", (void **) &qglVertexAttrib1dv},
587 {"core", "glVertexAttrib1f", (void **) &qglVertexAttrib1f},
588 {"core", "glVertexAttrib1fv", (void **) &qglVertexAttrib1fv},
589 {"core", "glVertexAttrib1s", (void **) &qglVertexAttrib1s},
590 {"core", "glVertexAttrib1sv", (void **) &qglVertexAttrib1sv},
591 {"core", "glVertexAttrib2d", (void **) &qglVertexAttrib2d},
592 {"core", "glVertexAttrib2dv", (void **) &qglVertexAttrib2dv},
593 {"core", "glVertexAttrib2f", (void **) &qglVertexAttrib2f},
594 {"core", "glVertexAttrib2fv", (void **) &qglVertexAttrib2fv},
595 {"core", "glVertexAttrib2s", (void **) &qglVertexAttrib2s},
596 {"core", "glVertexAttrib2sv", (void **) &qglVertexAttrib2sv},
597 {"core", "glVertexAttrib3d", (void **) &qglVertexAttrib3d},
598 {"core", "glVertexAttrib3dv", (void **) &qglVertexAttrib3dv},
599 {"core", "glVertexAttrib3f", (void **) &qglVertexAttrib3f},
600 {"core", "glVertexAttrib3fv", (void **) &qglVertexAttrib3fv},
601 {"core", "glVertexAttrib3s", (void **) &qglVertexAttrib3s},
602 {"core", "glVertexAttrib3sv", (void **) &qglVertexAttrib3sv},
603 {"core", "glVertexAttrib4Nbv", (void **) &qglVertexAttrib4Nbv},
604 {"core", "glVertexAttrib4Niv", (void **) &qglVertexAttrib4Niv},
605 {"core", "glVertexAttrib4Nsv", (void **) &qglVertexAttrib4Nsv},
606 {"core", "glVertexAttrib4Nub", (void **) &qglVertexAttrib4Nub},
607 {"core", "glVertexAttrib4Nubv", (void **) &qglVertexAttrib4Nubv},
608 {"core", "glVertexAttrib4Nuiv", (void **) &qglVertexAttrib4Nuiv},
609 {"core", "glVertexAttrib4Nusv", (void **) &qglVertexAttrib4Nusv},
610 {"core", "glVertexAttrib4bv", (void **) &qglVertexAttrib4bv},
611 {"core", "glVertexAttrib4d", (void **) &qglVertexAttrib4d},
612 {"core", "glVertexAttrib4dv", (void **) &qglVertexAttrib4dv},
613 {"core", "glVertexAttrib4f", (void **) &qglVertexAttrib4f},
614 {"core", "glVertexAttrib4fv", (void **) &qglVertexAttrib4fv},
615 {"core", "glVertexAttrib4iv", (void **) &qglVertexAttrib4iv},
616 {"core", "glVertexAttrib4s", (void **) &qglVertexAttrib4s},
617 {"core", "glVertexAttrib4sv", (void **) &qglVertexAttrib4sv},
618 {"core", "glVertexAttrib4ubv", (void **) &qglVertexAttrib4ubv},
619 {"core", "glVertexAttrib4uiv", (void **) &qglVertexAttrib4uiv},
620 {"core", "glVertexAttrib4usv", (void **) &qglVertexAttrib4usv},
621 {"core", "glVertexAttribPointer", (void **) &qglVertexAttribPointer},
622 {"core", "glViewport", (void **) &qglViewport},
623 {"glBindFragDataLocation", "glBindFragDataLocation", (void **) &qglBindFragDataLocation}, // optional (no preference)
624 {"GL_ARB_debug_output", "glDebugMessageControlARB", (void **)&qglDebugMessageControlARB},
625 {"GL_ARB_debug_output", "glDebugMessageInsertARB", (void **)&qglDebugMessageInsertARB},
626 {"GL_ARB_debug_output", "glDebugMessageCallbackARB", (void **)&qglDebugMessageCallbackARB},
627 {"GL_ARB_debug_output", "glGetDebugMessageLogARB", (void **)&qglGetDebugMessageLogARB},
628 {"GL_ARB_debug_output", "glGetPointerv", (void **)&qglGetPointerv},
629 {NULL, NULL, NULL}
630};
631#endif
632
633qbool GL_CheckExtension(const char *name, const char *disableparm, int silent)
634{
635 int failed = false;
636 const glfunction_t *func;
637 char extstr[MAX_INPUTLINE];
638
639 Con_DPrintf("checking for %s... ", name);
640
641 if (disableparm && (Sys_CheckParm(disableparm) || Sys_CheckParm("-safe")))
642 {
643 Con_DPrint("disabled by commandline\n");
644 return false;
645 }
646
648 {
649 Con_DPrint("not detected\n");
650 return false;
651 }
652
653#ifndef USE_GLES2
654 for (func = openglfuncs; func && func->name != NULL; func++)
655 {
656 if (!*func->funcvariable && !strcmp(name, func->extension))
657 {
658 if (!silent)
659 Con_DPrintf("%s is missing function \"%s\" - broken driver!\n", name, func->name);
660 failed = true;
661 }
662 }
663#endif //USE_GLES2
664 // delay the return so it prints all missing functions
665 if (failed)
666 return false;
667 // VorteX: add to found extension list
668 dpsnprintf(extstr, sizeof(extstr), "%s %s ", gl_info_extensions.string, name);
670
671 Con_DPrint("enabled\n");
672 return true;
673}
674
676{
677 // VorteX: reset extensions info cvar, it got filled by GL_CheckExtension
679
680 // clear the extension flags
681 memset(&vid.support, 0, sizeof(vid.support));
682}
683
685{
686#ifndef USE_GLES2
687 const glfunction_t *func;
688 qbool missingrequiredfuncs = false;
689 static char missingfuncs[16384];
690
691 // first fetch the function pointers for everything - after this we can begin making GL calls.
692 for (func = openglfuncs; func->name != NULL; func++)
693 *func->funcvariable = (void *)GL_GetProcAddress(func->name);
694
695 missingfuncs[0] = 0;
696 for (func = openglfuncs; func && func->name != NULL; func++)
697 {
698 if (!*func->funcvariable && !strcmp(func->extension, "core"))
699 {
700 Con_DPrintf("GL context is missing required function \"%s\"!\n", func->name);
701 missingrequiredfuncs = true;
702 dp_strlcat(missingfuncs, " ", sizeof(missingfuncs));
703 dp_strlcat(missingfuncs, func->name, sizeof(missingfuncs));
704 }
705 }
706
707 if (missingrequiredfuncs)
708 Sys_Error("OpenGL driver/hardware lacks required features:\n%s", missingfuncs);
709#endif
710}
711
712void GL_Setup(void)
713{
714 char *s;
715 int j;
716 GLint numextensions = 0;
717 int majorv, minorv;
718
719 gl_renderer = (const char *)qglGetString(GL_RENDERER);
720 gl_vendor = (const char *)qglGetString(GL_VENDOR);
721 gl_version = (const char *)qglGetString(GL_VERSION);
722
723 Con_Printf("GL_VENDOR: %s\n", gl_vendor);
724 Con_Printf("GL_RENDERER: %s\n", gl_renderer);
725 Con_Printf("GL_VERSION: %s\n", gl_version);
726
727#ifndef USE_GLES2
728 qglGetIntegerv(GL_MAJOR_VERSION, &majorv);
729 qglGetIntegerv(GL_MINOR_VERSION, &minorv);
730 vid.support.glversion = 10 * majorv + minorv;
731 if (vid.support.glversion < 32)
732 // fallback, should never get here: GL context creation should have failed
733 Sys_Error("OpenGL driver/hardware supports version %i.%i but 3.2 is the minimum\n", majorv, minorv);
734
735 qglGetIntegerv(GL_NUM_EXTENSIONS, &numextensions);
736 Con_DPrint("GL_EXTENSIONS:\n");
737 for (j = 0; j < numextensions; j++)
738 {
739 const char *ext = (const char *)qglGetStringi(GL_EXTENSIONS, j);
740 Con_DPrintf(" %s", ext);
741 if(j && !(j % 3))
742 Con_DPrintf("\n");
743 }
744 Con_DPrint("\n");
745#endif //USE_GLES2
746
747 Con_DPrint("Checking OpenGL extensions...\n");
748
749 // detect what GLSL version is available, to enable features like higher quality reliefmapping
752 if (s)
753 vid.support.glshaderversion = (int)(atof(s) * 100.0f + 0.5f);
754 if (vid.support.glshaderversion < 100)
756 Con_Printf("Detected GLSL version %i\n", vid.support.glshaderversion);
757
758#ifdef USE_GLES2
759 // GLES devices in general do not like GL_BGRA, so use GL_RGBA
761#else
762 // GL drivers generally prefer GL_BGRA
764#endif
765
766 vid.support.amd_texture_texture4 = GL_CheckExtension("GL_AMD_texture_texture4", "-notexture4", false);
767 vid.support.arb_texture_gather = GL_CheckExtension("GL_ARB_texture_gather", "-notexturegather", false);
768 vid.support.ext_texture_compression_s3tc = GL_CheckExtension("GL_EXT_texture_compression_s3tc", "-nos3tc", false);
769 vid.support.ext_texture_filter_anisotropic = GL_CheckExtension("GL_EXT_texture_filter_anisotropic", "-noanisotropy", false);
770#ifndef USE_GLES2
771 vid.support.ext_texture_srgb = true; // GL3 core, but not GLES2
772#endif
773 vid.support.arb_debug_output = GL_CheckExtension("GL_ARB_debug_output", "-nogldebugoutput", false);
775
776// COMMANDLINEOPTION: GL: -noanisotropy disables GL_EXT_texture_filter_anisotropic (allows higher quality texturing)
777// COMMANDLINEOPTION: GL: -nos3tc disables GL_EXT_texture_compression_s3tc (which allows use of .dds texture caching)
778// COMMANDLINEOPTION: GL: -notexture4 disables GL_AMD_texture_texture4 (which provides fetch4 sampling)
779// COMMANDLINEOPTION: GL: -notexturegather disables GL_ARB_texture_gather (which provides fetch4 sampling)
780// COMMANDLINEOPTION: GL: -nogldebugoutput disables GL_ARB_debug_output (which provides the gl_debug feature, if enabled)
781
782#ifdef WIN32
783 // gl_texturecompression_color is somehow broken on AMD's Windows driver,
784 // see: https://gitlab.com/xonotic/darkplaces/-/issues/228
785 // HACK: force it off (less bad than adding hacky checks to the renderer)
786 if (strncmp(gl_renderer, "AMD Radeon", 10) == 0)
787 {
790 }
791#endif
792
793#ifdef GL_MAX_DRAW_BUFFERS
794 qglGetIntegerv(GL_MAX_DRAW_BUFFERS, (GLint*)&vid.maxdrawbuffers);
796#endif
799#ifdef GL_MAX_CUBE_MAP_TEXTURE_SIZE
800#ifdef USE_GLES2
801 if (GL_CheckExtension("GL_ARB_texture_cube_map", "-nocubemap", false))
802#endif
803 {
805 Con_DPrintf("GL_MAX_CUBE_MAP_TEXTURE_SIZE = %i\n", vid.maxtexturesize_cubemap);
806 }
808#endif
809#ifdef GL_MAX_3D_TEXTURE_SIZE
810#ifdef USE_GLES2
811 if (GL_CheckExtension("GL_EXT_texture3D", "-notexture3d", false)
812 || GL_CheckExtension("GL_OES_texture3D", "-notexture3d", false))
813#endif
814 {
816 Con_DPrintf("GL_MAX_3D_TEXTURE_SIZE = %i\n", vid.maxtexturesize_3d);
817 }
818#endif
820
821#ifdef USE_GLES2
822 Con_Print("Using GLES2 rendering path\n");
824 vid.sRGBcapable2D = false;
825 vid.sRGBcapable3D = false;
826#else
827 Con_Print("Using GL32 rendering path\n");
829 vid.sRGBcapable2D = false;
830 vid.sRGBcapable3D = true;
831 // enable multisample antialiasing if possible
832 vid.allowalphatocoverage = true; // but see below, it may get turned to false again if GL_SAMPLES is <= 1
833 {
834 int samples = 0;
835 qglGetIntegerv(GL_SAMPLES, &samples);
837 if (samples > 1)
838 qglEnable(GL_MULTISAMPLE);
839 else
841 }
842 // currently MSAA antialiasing is not implemented for fbo viewports, so we actually have to force this off anyway.
844#endif
846
847#ifdef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
850#endif
852}
853
854float VID_JoyState_GetAxis(const vid_joystate_t *joystate, int axis, float fsensitivity, float deadzone)
855{
856 float value;
857 value = (axis >= 0 && axis < MAXJOYAXIS) ? joystate->axis[axis] : 0.0f;
858 value = value > deadzone ? (value - deadzone) : (value < -deadzone ? (value + deadzone) : 0.0f);
859 value *= deadzone > 0 ? (1.0f / (1.0f - deadzone)) : 1.0f;
860 value = bound(-1, value, 1);
861 return value * fsensitivity;
862}
863
865{
866 int j;
867 vid_joystate_t joystate;
868
870 return false;
872 return false;
873 if (keycode != K_UPARROW && keycode != K_DOWNARROW && keycode != K_RIGHTARROW && keycode != K_LEFTARROW)
874 return false;
875
876 // block system-generated key events for arrow keys if we're emulating the arrow keys ourselves
877 VID_BuildJoyState(&joystate);
878 for (j = 32;j < 36;j++)
879 if (vid_joystate.button[j] || joystate.button[j])
880 return true;
881
882 return false;
883}
884
886{
887#ifdef WIN32
888 xinput_state_t xinputstate;
889#endif
890 memset(joystate, 0, sizeof(*joystate));
891#ifdef WIN32
892 if (vid_xinputindex >= 0 && qXInputGetState && qXInputGetState(vid_xinputindex, &xinputstate) == S_OK)
893 {
894 joystate->is360 = true;
895 joystate->button[ 0] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) != 0;
896 joystate->button[ 1] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) != 0;
897 joystate->button[ 2] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) != 0;
898 joystate->button[ 3] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) != 0;
899 joystate->button[ 4] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_START) != 0;
900 joystate->button[ 5] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) != 0;
901 joystate->button[ 6] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) != 0;
902 joystate->button[ 7] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) != 0;
903 joystate->button[ 8] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) != 0;
904 joystate->button[ 9] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) != 0;
905 joystate->button[10] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_A) != 0;
906 joystate->button[11] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_B) != 0;
907 joystate->button[12] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_X) != 0;
908 joystate->button[13] = (xinputstate.Gamepad.wButtons & XINPUT_GAMEPAD_Y) != 0;
909 joystate->button[14] = xinputstate.Gamepad.bLeftTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
910 joystate->button[15] = xinputstate.Gamepad.bRightTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
911 joystate->button[16] = xinputstate.Gamepad.sThumbLY < -16384;
912 joystate->button[17] = xinputstate.Gamepad.sThumbLY > 16384;
913 joystate->button[18] = xinputstate.Gamepad.sThumbLX < -16384;
914 joystate->button[19] = xinputstate.Gamepad.sThumbLX > 16384;
915 joystate->button[20] = xinputstate.Gamepad.sThumbRY < -16384;
916 joystate->button[21] = xinputstate.Gamepad.sThumbRY > 16384;
917 joystate->button[22] = xinputstate.Gamepad.sThumbRX < -16384;
918 joystate->button[23] = xinputstate.Gamepad.sThumbRX > 16384;
919 joystate->axis[ 4] = xinputstate.Gamepad.bLeftTrigger * (1.0f / 255.0f);
920 joystate->axis[ 5] = xinputstate.Gamepad.bRightTrigger * (1.0f / 255.0f);
921 joystate->axis[ 0] = xinputstate.Gamepad.sThumbLX * (1.0f / 32767.0f);
922 joystate->axis[ 1] = xinputstate.Gamepad.sThumbLY * (1.0f / 32767.0f);
923 joystate->axis[ 2] = xinputstate.Gamepad.sThumbRX * (1.0f / 32767.0f);
924 joystate->axis[ 3] = xinputstate.Gamepad.sThumbRY * (1.0f / 32767.0f);
925 }
926#endif
927}
928
930{
931 float f, r;
932 if (joystate->is360)
933 return;
934 // emulate key events for thumbstick
937#if MAXJOYBUTTON != 36
938#error this code must be updated if MAXJOYBUTTON changes!
939#endif
940 joystate->button[32] = f > 0.0f;
941 joystate->button[33] = f < 0.0f;
942 joystate->button[34] = r > 0.0f;
943 joystate->button[35] = r < 0.0f;
944}
945
946static void VID_KeyEventForButton(qbool oldbutton, qbool newbutton, int key, double *timer)
947{
948 if (oldbutton)
949 {
950 if (newbutton)
951 {
952 if (host.realtime >= *timer)
953 {
954 Key_Event(key, 0, true);
955 *timer = host.realtime + 0.1;
956 }
957 }
958 else
959 {
960 Key_Event(key, 0, false);
961 *timer = 0;
962 }
963 }
964 else
965 {
966 if (newbutton)
967 {
968 Key_Event(key, 0, true);
969 *timer = host.realtime + 0.5;
970 }
971 }
972}
973
974#if MAXJOYBUTTON != 36
975#error this code must be updated if MAXJOYBUTTON changes!
976#endif
978{
979 {K_JOY1, K_ENTER}, {K_JOY2, K_ESCAPE}, {K_JOY3, 0}, {K_JOY4, 0}, {K_JOY5, 0}, {K_JOY6, 0}, {K_JOY7, 0}, {K_JOY8, 0}, {K_JOY9, 0}, {K_JOY10, 0}, {K_JOY11, 0}, {K_JOY12, 0}, {K_JOY13, 0}, {K_JOY14, 0}, {K_JOY15, 0}, {K_JOY16, 0},
980 {K_AUX1, 0}, {K_AUX2, 0}, {K_AUX3, 0}, {K_AUX4, 0}, {K_AUX5, 0}, {K_AUX6, 0}, {K_AUX7, 0}, {K_AUX8, 0}, {K_AUX9, 0}, {K_AUX10, 0}, {K_AUX11, 0}, {K_AUX12, 0}, {K_AUX13, 0}, {K_AUX14, 0}, {K_AUX15, 0}, {K_AUX16, 0},
982};
983
1011
1014{
1015 int j;
1016 int c = joy_axiskeyevents.integer != 0;
1017 if (joystate->is360)
1018 {
1019#if 0
1020 // keystrokes (chatpad)
1021 // DOES NOT WORK - no driver support in xinput1_3.dll :(
1022 xinput_keystroke_t keystroke;
1023 while (qXInputGetKeystroke && qXInputGetKeystroke(XUSER_INDEX_ANY, 0, &keystroke) == S_OK)
1024 Con_Printf("XInput KeyStroke: VirtualKey %i, Unicode %i, Flags %x, UserIndex %i, HidCode %i\n", keystroke.VirtualKey, keystroke.Unicode, keystroke.Flags, keystroke.UserIndex, keystroke.HidCode);
1025#endif
1026
1027 // emit key events for buttons
1028 for (j = 0;j < (int)(sizeof(joybuttonkey360)/sizeof(joybuttonkey360[0]));j++)
1029 VID_KeyEventForButton(vid_joystate.button[j] != 0, joystate->button[j] != 0, joybuttonkey360[j][c], &vid_joybuttontimer[j]);
1030
1031 // axes
1037 //cl.viewangles[2] += VID_JoyState_GetAxis(joystate, joy_x360_axisroll.integer, joy_x360_sensitivityroll.value, joy_x360_deadzoneroll.value) * cl.realframetime * cl_rollspeed.value;
1038 }
1039 else
1040 {
1041 // emit key events for buttons
1042 for (j = 0;j < MAXJOYBUTTON;j++)
1043 VID_KeyEventForButton(vid_joystate.button[j] != 0, joystate->button[j] != 0, joybuttonkey[j][c], &vid_joybuttontimer[j]);
1044
1045 // axes
1051 //cl.viewangles[2] += VID_JoyState_GetAxis(joystate, joy_axisroll.integer, joy_sensitivityroll.value, joy_deadzoneroll.value) * cl.realframetime * cl_rollspeed.value;
1052 }
1053
1054 vid_joystate = *joystate;
1055}
1056
1058{
1059#ifdef WIN32
1060 int i;
1061 int xinputcount = 0;
1062 int xinputindex = -1;
1063 int xinputavailable = 0;
1064 xinput_state_t state;
1065 // detect available XInput controllers
1066 for (i = 0;i < 4;i++)
1067 {
1068 if (qXInputGetState && qXInputGetState(i, &state) == S_OK)
1069 {
1070 xinputavailable |= 1<<i;
1071 if (index == xinputcount)
1072 xinputindex = i;
1073 xinputcount++;
1074 }
1075 }
1076 if (joy_xinputavailable.integer != xinputavailable)
1077 Cvar_SetValueQuick(&joy_xinputavailable, xinputavailable);
1078 if (vid_xinputindex != xinputindex)
1079 {
1080 vid_xinputindex = xinputindex;
1081 if (xinputindex >= 0)
1082 Con_Printf("Joystick %i opened (XInput Device %i)\n", index, xinputindex);
1083 }
1084 return xinputcount;
1085#else
1086 return 0;
1087#endif
1088}
1089
1090
1092{
1093 cl.viewangles[PITCH] = 0;
1094}
1095
1096static int gamma_forcenextframe = false;
1099
1100void VID_ApplyGammaToColor(const float *rgb, float *out)
1101{
1102 int i;
1103 if (cachecolorenable)
1104 {
1105 for (i = 0; i < 3; i++)
1106 out[i] = pow(cachecontrastboost * rgb[i] / ((cachecontrastboost - 1) * rgb[i] + 1), 1.0 / invpow(0.5, 1 - cachegrey[i])) * cachewhite[i] + cacheblack[i];
1107 }
1108 else
1109 {
1110 for (i = 0; i < 3; i++)
1112 }
1113}
1114
1115unsigned int vid_gammatables_serial = 0; // so other subsystems can poll if gamma parameters have changed
1117void VID_BuildGammaTables(unsigned short *ramps, int rampsize)
1118{
1119 if (cachecolorenable)
1120 {
1121 BuildGammaTable16(1.0f, invpow(0.5, 1 - cachegrey[0]), cachewhite[0], cacheblack[0], cachecontrastboost, ramps, rampsize);
1122 BuildGammaTable16(1.0f, invpow(0.5, 1 - cachegrey[1]), cachewhite[1], cacheblack[1], cachecontrastboost, ramps + rampsize, rampsize);
1123 BuildGammaTable16(1.0f, invpow(0.5, 1 - cachegrey[2]), cachewhite[2], cacheblack[2], cachecontrastboost, ramps + rampsize*2, rampsize);
1124 }
1125 else
1126 {
1128 BuildGammaTable16(1.0f, cachegamma, cachecontrast, cachebrightness, cachecontrastboost, ramps + rampsize, rampsize);
1129 BuildGammaTable16(1.0f, cachegamma, cachecontrast, cachebrightness, cachecontrastboost, ramps + rampsize*2, rampsize);
1130 }
1131
1132 if(vid.sRGB2D || vid.sRGB3D)
1133 {
1134 int i;
1135 for(i = 0; i < 3*rampsize; ++i)
1136 ramps[i] = (int)floor(bound(0.0f, Image_sRGBFloatFromLinearFloat(ramps[i] / 65535.0f), 1.0f) * 65535.0f + 0.5f);
1137 }
1138
1139 // LadyHavoc: this code came from Ben Winslow and Zinx Verituse, I have
1140 // immensely butchered it to work with variable framerates and fit in with
1141 // the rest of darkplaces.
1142 //
1143 // R.I.P. zinx http://obits.al.com/obituaries/birmingham/obituary.aspx?n=christopher-robert-lais&pid=186080667
1144 if (v_psycho.integer)
1145 {
1146 int x, y;
1147 float t;
1148 static float n[3], nd[3], nt[3];
1149 static int init = true;
1150 unsigned short *ramp;
1151 gamma_forcenextframe = true;
1152 if (init)
1153 {
1154 init = false;
1155 for (x = 0;x < 3;x++)
1156 {
1157 n[x] = lhrandom(0, 1);
1158 nd[x] = (rand()&1)?-0.25:0.25;
1159 nt[x] = lhrandom(1, 8.2);
1160 }
1161 }
1162
1163 for (x = 0;x < 3;x++)
1164 {
1165 nt[x] -= cl.realframetime;
1166 if (nt[x] < 0)
1167 {
1168 nd[x] = -nd[x];
1169 nt[x] += lhrandom(1, 8.2);
1170 }
1171 n[x] += nd[x] * cl.realframetime;
1172 n[x] -= floor(n[x]);
1173 }
1174
1175 for (x = 0, ramp = ramps;x < 3;x++)
1176 for (y = 0, t = n[x] - 0.75f;y < rampsize;y++, t += 0.75f * (2.0f / rampsize))
1177 *ramp++ = (unsigned short)(cos(t*(M_PI*2.0)) * 32767.0f + 32767.0f);
1178 }
1179}
1180
1182{
1183 cvar_t *c;
1184 float f;
1185 qbool gamma_changed = false;
1186
1187#define BOUNDCVAR(cvar, m1, m2) c = &(cvar);f = bound(m1, c->value, m2);if (c->value != f) Cvar_SetValueQuick(c, f);
1188 BOUNDCVAR(v_gamma, 0.1, 5);
1189 BOUNDCVAR(v_contrast, 0.2, 5);
1190 BOUNDCVAR(v_brightness, -v_contrast.value * 0.8, 0.8);
1191 //BOUNDCVAR(v_contrastboost, 0.0625, 16);
1192 BOUNDCVAR(v_color_black_r, 0, 0.8);
1193 BOUNDCVAR(v_color_black_g, 0, 0.8);
1194 BOUNDCVAR(v_color_black_b, 0, 0.8);
1195 BOUNDCVAR(v_color_grey_r, 0, 0.95);
1196 BOUNDCVAR(v_color_grey_g, 0, 0.95);
1197 BOUNDCVAR(v_color_grey_b, 0, 0.95);
1201#undef BOUNDCVAR
1202
1203 // set vid_gammatables_trivial to true if the current settings would generate the identity gamma table
1205 if(v_psycho.integer == 0)
1206 if(v_contrastboost.value == 1)
1207 if(!vid.sRGB2D)
1208 if(!vid.sRGB3D)
1209 {
1211 {
1212 if(v_color_black_r.value == 0)
1213 if(v_color_black_g.value == 0)
1214 if(v_color_black_b.value == 0)
1215 if(fabs(v_color_grey_r.value - 0.5) < 1e-6)
1216 if(fabs(v_color_grey_g.value - 0.5) < 1e-6)
1217 if(fabs(v_color_grey_b.value - 0.5) < 1e-6)
1218 if(v_color_white_r.value == 1)
1219 if(v_color_white_g.value == 1)
1220 if(v_color_white_b.value == 1)
1222 }
1223 else
1224 {
1225 if(v_gamma.value == 1)
1226 if(v_contrast.value == 1)
1227 if(v_brightness.value == 0)
1229 }
1230 }
1231
1232 // if any gamma settings were changed, bump vid_gammatables_serial so we regenerate the gamma ramp texture
1233#define GAMMACHECK(cache, value) if (cache != (value)) gamma_changed = true;cache = (value)
1234 if(v_psycho.integer)
1235 gamma_changed = true;
1250
1251 if(gamma_changed)
1253#undef GAMMACHECK
1254}
1255
1256#ifdef WIN32
1257static dllfunction_t xinputdllfuncs[] =
1258{
1259 {"XInputGetState", (void **) &qXInputGetState},
1260 {"XInputGetKeystroke", (void **) &qXInputGetKeystroke},
1261 {NULL, NULL}
1262};
1263static const char* xinputdllnames [] =
1264{
1265 "xinput1_3.dll",
1266 "xinput1_2.dll",
1267 "xinput1_1.dll",
1268 NULL
1269};
1270static dllhandle_t xinputdll_dll = NULL;
1271#endif
1272
1274{
1284
1295
1297
1299
1324#ifdef WIN32
1325 Cvar_RegisterVariable(&vid_ignore_taskbar);
1326#endif
1332
1334#ifdef WIN32
1335 Cvar_RegisterVariable(&joy_xinputavailable);
1336#endif
1345 //Cvar_RegisterVariable(&joy_axisroll);
1351 //Cvar_RegisterVariable(&joy_deadzoneroll);
1357 //Cvar_RegisterVariable(&joy_sensitivityroll);
1365 //Cvar_RegisterVariable(&joy_x360_axisroll);
1371 //Cvar_RegisterVariable(&joy_x360_deadzoneroll);
1377 //Cvar_RegisterVariable(&joy_x360_sensitivityroll);
1378
1379#ifdef WIN32
1380 Sys_LoadDependency(xinputdllnames, &xinputdll_dll, xinputdllfuncs);
1381#endif
1382
1383 Cmd_AddCommand(CF_CLIENT, "force_centerview", Force_CenterView_f, "recenters view (stops looking up/down)");
1384 Cmd_AddCommand(CF_CLIENT, "vid_restart", VID_Restart_f, "restarts video system (closes and reopens the window, restarts renderer)");
1385}
1386
1389{
1390 char vabuf[1024];
1391 viddef_mode_t _mode;
1392
1393 if (!mode)
1394 {
1395 mode = &_mode;
1396 memset(mode, 0, sizeof(*mode));
1397 mode->display = vid_display.integer;
1398 mode->fullscreen = vid_fullscreen.integer != 0;
1399 mode->desktopfullscreen = vid_desktopfullscreen.integer != 0;
1400 mode->width = vid_width.integer;
1401 mode->height = vid_height.integer;
1402 mode->bitsperpixel = vid_bitsperpixel.integer;
1403 mode->refreshrate = max(0, vid_refreshrate.integer);
1404 mode->stereobuffer = vid_stereobuffer.integer != 0;
1405 }
1408
1409 if (VID_InitMode(mode))
1410 {
1411 // bones_was_here: we no longer copy the (possibly modified) display mode to `vid` here
1412 // because complete modesetting failure isn't really what happens with SDL2.
1413 // Instead we update the active mode when we successfully apply settings,
1414 // if some can't be applied we still have a viable window.
1415 // Failure is still possible for other (non- display mode) reasons.
1418
1419 switch(vid.renderpath)
1420 {
1421 case RENDERPATH_GL32:
1422#ifdef GL_STEREO
1423 {
1424 GLboolean stereo;
1425 qglGetBooleanv(GL_STEREO, &stereo);
1426 vid.mode.stereobuffer = stereo != 0;
1427 }
1428#endif
1429 break;
1430 case RENDERPATH_GLES2:
1431 default:
1432 vid.mode.stereobuffer = false;
1433 break;
1434 }
1435
1436 if(
1437 (vid_sRGB_fallback.integer >= 3) // force fallback
1438 ||
1439 (vid_sRGB_fallback.integer >= 2 && // fallback if framebuffer is 8bit
1440 r_viewfbo.integer < 2)
1441 )
1442 vid.sRGB2D = vid.sRGB3D = false;
1443
1444 Con_Printf("Video Mode: %s%s %dx%d %dbpp%s%s on display %i\n",
1445 vid.mode.desktopfullscreen ? "desktop " : "",
1446 vid.mode.fullscreen ? "fullscreen" : "window",
1448 vid.mode.refreshrate ? va(vabuf, sizeof(vabuf), " %.2fhz", vid.mode.refreshrate) : "",
1449 vid.mode.stereobuffer ? " stereo" : "",
1450 vid.mode.display);
1451
1453 {
1456 }
1457
1458 return true;
1459 }
1460 else
1461 return false;
1462}
1463
1465extern qbool vid_opened;
1466
1468{
1469 char vabuf[1024];
1470 viddef_mode_t oldmode;
1471
1472 // don't crash if video hasn't started yet
1474 return;
1475
1476 oldmode = vid.mode;
1477
1478 Con_Printf("VID_Restart: changing from %s%s %dx%d %dbpp%s%s on display %i, to %s%s %dx%d %dbpp%s%s on display %i.\n",
1479 oldmode.desktopfullscreen ? "desktop " : "",
1480 oldmode.fullscreen ? "fullscreen" : "window",
1481 oldmode.width, oldmode.height, oldmode.bitsperpixel,
1482 oldmode.refreshrate ? va(vabuf, sizeof(vabuf), " %.2fhz", oldmode.refreshrate) : "",
1483 oldmode.stereobuffer ? " stereo" : "",
1484 oldmode.display,
1485 vid_desktopfullscreen.integer ? "desktop " : "",
1486 vid_fullscreen.integer ? "fullscreen" : "window",
1488 vid_fullscreen.integer && !vid_desktopfullscreen.integer && vid_refreshrate.integer ? va(vabuf, sizeof(vabuf), " %.2fhz", vid_refreshrate.value) : "",
1489 vid_stereobuffer.integer ? " stereo" : "",
1491
1494 VID_Shutdown();
1495 if (!VID_Mode(NULL))
1496 {
1497 Con_Print(CON_ERROR "Video mode change failed\n");
1498 if (!VID_Mode(&oldmode))
1499 Sys_Error("Unable to restore to last working video mode");
1500 else
1501 {
1510 }
1511 }
1514}
1515
1517{
1519 const char *safevalue;
1520};
1522{
1523 {&vid_stereobuffer, "0"},
1524 {&vid_samples, "1"},
1525 {&vid_refreshrate, "0"},
1526 {&vid_width, "640"},
1527 {&vid_height, "480"},
1528 {&vid_bitsperpixel, "32"},
1529 {NULL, NULL}
1530};
1531
1532// this is only called once by CL_StartVideo and again on each FS_GameDir_f
1533void VID_Start(void)
1534{
1535 int i = 0;
1536 int width, height, success;
1538 {
1539 // interpret command-line parameters
1540 vid_commandlinecheck = false;
1541// COMMANDLINEOPTION: Video: -window performs +vid_fullscreen 0
1542 if (Sys_CheckParm("-window") || Sys_CheckParm("-safe") || ((i = Sys_CheckParm("+vid_fullscreen")) != 0 && atoi(sys.argv[i+1]) == 0))
1544// COMMANDLINEOPTION: Video: -borderless performs +vid_borderless 1
1545 if (Sys_CheckParm("-borderless") || ((i = Sys_CheckParm("+vid_borderless")) != 0 && atoi(sys.argv[i+1]) == 1))
1546 {
1549 }
1550// COMMANDLINEOPTION: Video: -fullscreen performs +vid_fullscreen 1
1551 if (Sys_CheckParm("-fullscreen") || ((i = Sys_CheckParm("+vid_fullscreen")) != 0 && atoi(sys.argv[i+1]) == 1))
1553 width = 0;
1554 height = 0;
1555// COMMANDLINEOPTION: Video: -width <pixels> performs +vid_width <pixels> and also +vid_height <pixels*3/4> if only -width is specified (example: -width 1024 sets 1024x768 mode)
1556 if ((i = Sys_CheckParm("-width")) != 0 || ((i = Sys_CheckParm("+vid_width")) != 0))
1557 width = atoi(sys.argv[i+1]);
1558// COMMANDLINEOPTION: Video: -height <pixels> performs +vid_height <pixels> and also +vid_width <pixels*4/3> if only -height is specified (example: -height 768 sets 1024x768 mode)
1559 if ((i = Sys_CheckParm("-height")) != 0 || ((i = Sys_CheckParm("+vid_height")) != 0))
1560 height = atoi(sys.argv[i+1]);
1561 if (width == 0)
1562 width = height * 4 / 3;
1563 if (height == 0)
1564 height = width * 3 / 4;
1565 if (width)
1567 if (height)
1569// COMMANDLINEOPTION: Video: -density <multiplier> performs +vid_touchscreen_density <multiplier> (example -density 1 or -density 1.5)
1570 if ((i = Sys_CheckParm("-density")) != 0)
1572// COMMANDLINEOPTION: Video: -xdpi <dpi> performs +vid_touchscreen_xdpi <dpi> (example -xdpi 160 or -xdpi 320)
1573 if ((i = Sys_CheckParm("-touchscreen_xdpi")) != 0)
1575// COMMANDLINEOPTION: Video: -ydpi <dpi> performs +vid_touchscreen_ydpi <dpi> (example -ydpi 160 or -ydpi 320)
1576 if ((i = Sys_CheckParm("-touchscreen_ydpi")) != 0)
1578 }
1579
1580 success = VID_Mode(NULL);
1581 if (!success)
1582 {
1583 Con_Print(CON_WARN "Desired video mode fail, trying fallbacks...\n");
1584 for (i = 0; !success && vidfallbacks[i].cvar != NULL; i++)
1585 {
1587 success = VID_Mode(NULL);
1588 }
1589 if (!success)
1590 Sys_Error("Video modes failed");
1591 }
1592
1595}
1596
1597static int VID_SortModes_Compare(const void *a_, const void *b_)
1598{
1599 vid_mode_t *a = (vid_mode_t *) a_;
1600 vid_mode_t *b = (vid_mode_t *) b_;
1601 if(a->width > b->width)
1602 return +1;
1603 if(a->width < b->width)
1604 return -1;
1605 if(a->height > b->height)
1606 return +1;
1607 if(a->height < b->height)
1608 return -1;
1609 if(a->refreshrate > b->refreshrate)
1610 return +1;
1611 if(a->refreshrate < b->refreshrate)
1612 return -1;
1613 if(a->bpp > b->bpp)
1614 return +1;
1615 if(a->bpp < b->bpp)
1616 return -1;
1617 if(a->pixelheight_num * b->pixelheight_denom > a->pixelheight_denom * b->pixelheight_num)
1618 return +1;
1619 if(a->pixelheight_num * b->pixelheight_denom < a->pixelheight_denom * b->pixelheight_num)
1620 return -1;
1621 return 0;
1622}
1623size_t VID_SortModes(vid_mode_t *modes, size_t count, qbool usebpp, qbool userefreshrate, qbool useaspect)
1624{
1625 size_t i;
1626 if(count == 0)
1627 return 0;
1628 // 1. sort them
1629 qsort(modes, count, sizeof(*modes), VID_SortModes_Compare);
1630 // 2. remove duplicates
1631 for(i = 0; i < count; ++i)
1632 {
1633 if(modes[i].width && modes[i].height)
1634 {
1635 if(i == 0)
1636 continue;
1637 if(modes[i].width != modes[i-1].width)
1638 continue;
1639 if(modes[i].height != modes[i-1].height)
1640 continue;
1641 if(userefreshrate)
1642 if(modes[i].refreshrate != modes[i-1].refreshrate)
1643 continue;
1644 if(usebpp)
1645 if(modes[i].bpp != modes[i-1].bpp)
1646 continue;
1647 if(useaspect)
1648 if(modes[i].pixelheight_num * modes[i-1].pixelheight_denom != modes[i].pixelheight_denom * modes[i-1].pixelheight_num)
1649 continue;
1650 }
1651 // a dupe, or a bogus mode!
1652 if(i < count-1)
1653 memmove(&modes[i], &modes[i+1], sizeof(*modes) * (count-1 - i));
1654 --i; // check this index again, as mode i+1 is now here
1655 --count;
1656 }
1657 return count;
1658}
cvar_t cl_yawspeed
Definition cl_input.c:372
cvar_t cl_sidespeed
Definition cl_input.c:367
cvar_t cl_pitchspeed
Definition cl_input.c:373
cvar_t cl_upspeed
Definition cl_input.c:364
int cl_ignoremousemoves
Definition cl_input.c:474
cvar_t cl_forwardspeed
Definition cl_input.c:365
client_state_t cl
Definition cl_main.c:117
void SCR_DeferLoadingPlaque(qbool startup)
Definition cl_screen.c:1859
void Cmd_AddCommand(unsigned flags, const char *cmd_name, xcommand_t function, const char *description)
called by the init functions of other parts of the program to register commands and functions to call...
Definition cmd.c:1661
#define CF_READONLY
cvar cannot be changed from the console or the command buffer, and is considered CF_PERSISTENT
Definition cmd.h:54
#define CF_CLIENT
cvar/command that only the client can change/execute
Definition cmd.h:48
#define CF_ARCHIVE
cvar should have its set value saved to config.cfg and persist across sessions
Definition cmd.h:53
char * va(char *buf, size_t buflen, const char *format,...)
Definition common.c:972
int dpsnprintf(char *buffer, size_t buffersize, const char *format,...)
Returns the number of printed characters, excluding the final '\0' or returns -1 if the buffer isn't ...
Definition common.c:997
#define dp_strlcat(dst, src, dsize)
Definition common.h:304
void Con_Print(const char *msg)
Prints to all appropriate console targets, and adds timestamps.
Definition console.c:1504
void Con_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
Definition console.c:1544
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
void Con_DPrint(const char *msg)
A Con_Print that only shows up if the "developer" cvar is set.
Definition console.c:1531
#define CON_WARN
Definition console.h:101
#define CON_ERROR
Definition console.h:102
void() predraw
void Cvar_SetValueQuick(cvar_t *var, float value)
Definition cvar.c:473
void Cvar_SetQuick(cvar_t *var, const char *value)
Definition cvar.c:436
void Cvar_RegisterVariable(cvar_t *variable)
registers a cvar that already has the name, string, and optionally the archive elements set.
Definition cvar.c:599
#define n(x, y)
static int(ZEXPORT *qz_inflate)(z_stream *strm
cvar_t r_viewfbo
Definition gl_rmain.c:160
static glmode_t modes[6]
cvar_t gl_texturecompression_color
Definition gl_textures.c:38
ptrdiff_t GLintptr
Definition glquake.h:61
unsigned char GLubyte
Definition glquake.h:52
unsigned int GLuint
Definition glquake.h:54
signed char GLbyte
Definition glquake.h:49
unsigned int GLbitfield
Definition glquake.h:47
#define GL_MAX_TEXTURE_SIZE
Definition glquake.h:157
#define CHECKGLERROR
Definition glquake.h:1059
#define GL_SAMPLES
Definition glquake.h:554
#define GL_VERSION
Definition glquake.h:140
int GLint
Definition glquake.h:51
#define GL_MAJOR_VERSION
Definition glquake.h:1038
short GLshort
Definition glquake.h:50
float GLfloat
Definition glquake.h:56
double GLdouble
Definition glquake.h:58
unsigned char GLboolean
Definition glquake.h:46
#define GL_BGRA
Definition glquake.h:547
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE
Definition glquake.h:271
void GLvoid
Definition glquake.h:48
#define GL_MAX_DRAW_BUFFERS
Definition glquake.h:377
unsigned int GLenum
Definition glquake.h:45
int GLsizei
Definition glquake.h:55
#define GL_MAX_3D_TEXTURE_SIZE
Definition glquake.h:257
void(GLAPIENTRY * GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const GLvoid *userParam)
Definition glquake.h:63
#define GL_MULTISAMPLE
Definition glquake.h:549
ptrdiff_t GLsizeiptr
Definition glquake.h:62
#define GL_EXTENSIONS
Definition glquake.h:141
#define GLAPIENTRY
Definition glquake.h:42
double GLclampd
Definition glquake.h:59
unsigned short GLushort
Definition glquake.h:53
#define GL_SHADING_LANGUAGE_VERSION
Definition glquake.h:516
#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
Definition glquake.h:200
#define GL_MINOR_VERSION
Definition glquake.h:1039
#define GL_RENDERER
Definition glquake.h:139
float GLclampf
Definition glquake.h:57
#define GL_STEREO
Definition glquake.h:65
#define GL_VENDOR
Definition glquake.h:138
#define GL_NUM_EXTENSIONS
Definition glquake.h:1040
char GLchar
Definition glquake.h:60
host_static_t host
Definition host.c:41
#define Image_sRGBFloatFromLinearFloat(c)
Definition image.h:68
float K_AUX11
Definition keycodes.qc:103
float K_UPARROW
Definition keycodes.qc:15
float K_AUX12
Definition keycodes.qc:104
float K_DOWNARROW
Definition keycodes.qc:16
float K_AUX3
Definition keycodes.qc:95
float K_RIGHTARROW
Definition keycodes.qc:18
float K_AUX7
Definition keycodes.qc:99
float K_JOY1
Definition keycodes.qc:83
float K_JOY3
Definition keycodes.qc:85
float K_AUX16
Definition keycodes.qc:108
float K_AUX15
Definition keycodes.qc:107
float K_AUX8
Definition keycodes.qc:100
float K_ENTER
Definition keycodes.qc:8
float K_AUX10
Definition keycodes.qc:102
float K_LEFTARROW
Definition keycodes.qc:17
float K_AUX13
Definition keycodes.qc:105
float K_JOY2
Definition keycodes.qc:84
float K_AUX14
Definition keycodes.qc:106
float K_AUX9
Definition keycodes.qc:101
float K_AUX5
Definition keycodes.qc:97
float K_AUX6
Definition keycodes.qc:98
float K_JOY4
Definition keycodes.qc:86
float K_AUX2
Definition keycodes.qc:94
float K_AUX1
Definition keycodes.qc:93
float K_ESCAPE
Definition keycodes.qc:9
float K_AUX4
Definition keycodes.qc:96
void Key_Event(int key, int ascii, qbool down)
Definition keys.c:1836
void Key_ReleaseAll(void)
Definition keys.c:2075
@ K_X360_A
Definition keys.h:218
@ K_X360_BACK
Definition keys.h:213
@ K_JOY7
Definition keys.h:159
@ K_JOY12
Definition keys.h:164
@ K_X360_X
Definition keys.h:220
@ K_X360_RIGHT_SHOULDER
Definition keys.h:217
@ K_X360_RIGHT_THUMB_UP
Definition keys.h:228
@ K_X360_DPAD_RIGHT
Definition keys.h:211
@ K_JOY10
Definition keys.h:162
@ K_JOY_DOWN
Definition keys.h:235
@ K_JOY13
Definition keys.h:165
@ K_X360_RIGHT_TRIGGER
Definition keys.h:223
@ K_JOY14
Definition keys.h:166
@ K_X360_DPAD_UP
Definition keys.h:208
@ K_JOY15
Definition keys.h:167
@ K_JOY16
Definition keys.h:168
@ K_JOY_LEFT
Definition keys.h:236
@ K_X360_LEFT_THUMB_RIGHT
Definition keys.h:227
@ K_X360_DPAD_DOWN
Definition keys.h:209
@ K_X360_DPAD_LEFT
Definition keys.h:210
@ K_X360_RIGHT_THUMB
Definition keys.h:215
@ K_X360_LEFT_THUMB_DOWN
Definition keys.h:225
@ K_X360_RIGHT_THUMB_DOWN
Definition keys.h:229
@ K_X360_RIGHT_THUMB_RIGHT
Definition keys.h:231
@ K_JOY_RIGHT
Definition keys.h:237
@ K_X360_START
Definition keys.h:212
@ K_JOY5
Definition keys.h:157
@ K_JOY9
Definition keys.h:161
@ K_X360_RIGHT_THUMB_LEFT
Definition keys.h:230
@ K_X360_LEFT_THUMB_UP
Definition keys.h:224
@ K_X360_LEFT_SHOULDER
Definition keys.h:216
@ K_X360_LEFT_THUMB_LEFT
Definition keys.h:226
@ K_JOY_UP
Definition keys.h:234
@ K_JOY11
Definition keys.h:163
@ K_JOY8
Definition keys.h:160
@ K_X360_LEFT_TRIGGER
Definition keys.h:222
@ K_JOY6
Definition keys.h:158
@ K_X360_Y
Definition keys.h:221
@ K_X360_B
Definition keys.h:219
@ K_X360_LEFT_THUMB
Definition keys.h:214
#define invpow(base, number)
Definition mathlib.h:50
#define max(A, B)
Definition mathlib.h:38
#define bound(min, num, max)
Definition mathlib.h:34
#define lhrandom(MIN, MAX)
LadyHavoc: this function never returns exactly MIN or exactly MAX, because of a QuakeC bug in id1 whe...
Definition mathlib.h:48
#define M_PI
Definition mathlib.h:28
float pow(float a, float b)
float cvar(string name)
float cos(float f)
void cmd(string command,...)
float fabs(float f)
float floor(float f)
void BuildGammaTable16(float prescale, float gamma, float scale, float base, float contrastboost, unsigned short *out, int rampsize)
Definition palette.c:240
string target
Definition progsdefs.qc:193
int i
#define MAX_INPUTLINE
maximum size of console commandline, QuakeC strings, and many other text processing buffers
Definition qdefs.h:94
#define NULL
Definition qtypes.h:12
bool qbool
Definition qtypes.h:9
#define PITCH
Definition qtypes.h:16
void R_Modules_Shutdown(void)
Definition r_modules.c:67
void R_Modules_Start(void)
Definition r_modules.c:49
@ TEXTYPE_RGBA
Definition r_textures.h:51
dp_FragColor r
float f
dp_FragColor b
dp_FragColor rgb
ret a
vec3_t viewangles
Definition client.h:786
double realframetime
Definition client.h:871
usercmd_t cmd
Definition client.h:752
command interpreter state - the tokenizing and execution of commands, as well as pointers to which cv...
Definition cmd.h:127
Definition cvar.h:66
float value
Definition cvar.h:74
unsigned flags
Definition cvar.h:67
int integer
Definition cvar.h:73
const char * string
Definition cvar.h:71
const char * name
Definition vid_shared.c:413
const char * extension
Definition vid_shared.c:412
void ** funcvariable
Definition vid_shared.c:414
double realtime
the accumulated mainloop time since application started (with filtering), without any slowmo or clamp...
Definition host.h:46
const char ** argv
Definition sys.h:147
float forwardmove
Definition protocol.h:380
float upmove
Definition protocol.h:382
float sidemove
Definition protocol.h:381
unsigned char button[MAXJOYBUTTON]
0 or 1
Definition vid.h:105
qbool is360
indicates this joystick is a Microsoft Xbox 360 Controller For Windows
Definition vid.h:106
float axis[MAXJOYAXIS]
-1 to +1
Definition vid.h:104
int samples
Definition vid.h:65
qbool desktopfullscreen
whether the display hardware mode can be changed
Definition vid.h:59
qbool stereobuffer
Definition vid.h:64
float refreshrate
Definition vid.h:63
int width
Definition vid.h:60
int height
Definition vid.h:61
qbool fullscreen
Definition vid.h:58
int bitsperpixel
Definition vid.h:62
int display
Definition vid.h:57
qbool ext_texture_filter_anisotropic
Definition vid.h:49
qbool amd_texture_texture4
Definition vid.h:46
qbool arb_texture_gather
Definition vid.h:47
qbool ext_texture_compression_s3tc
Definition vid.h:48
qbool ext_texture_srgb
Definition vid.h:50
int glversion
this is at least 32
Definition vid.h:44
qbool arb_debug_output
Definition vid.h:51
int glshaderversion
this is at least 150 (GL 3.2)
Definition vid.h:45
Definition vid.h:70
unsigned int maxtexturesize_2d
Definition vid.h:83
qbool sRGB3D
whether 3D rendering is sRGB corrected (based on sRGBcapable3D)
Definition vid.h:76
int forcetextype
always use GL_BGRA for D3D, always use GL_RGBA for GLES, etc
Definition vid.h:91
unsigned int maxtexturesize_3d
Definition vid.h:84
unsigned int maxtexturesize_cubemap
Definition vid.h:85
qbool sRGB2D
whether 2D rendering is sRGB corrected (based on sRGBcapable2D)
Definition vid.h:75
renderpath_t renderpath
Definition vid.h:80
qbool sRGBcapable3D
whether 3D rendering can be sRGB corrected (renderpath)
Definition vid.h:78
unsigned int max_anisotropy
Definition vid.h:86
viddef_support_t support
Definition vid.h:89
viddef_mode_t mode
currently active video mode
Definition vid.h:73
qbool allowalphatocoverage
indicates the GL_AlphaToCoverage function works on this renderpath and framebuffer
Definition vid.h:81
unsigned int maxdrawbuffers
Definition vid.h:87
qbool sRGBcapable2D
whether 2D rendering can be sRGB corrected (renderpath)
Definition vid.h:77
cvar_t * cvar
const char * safevalue
void Sys_Error(const char *error,...) DP_FUNC_PRINTF(1) DP_FUNC_NORETURN
Causes the entire program to exit ASAP.
Definition sys_shared.c:724
void * dllhandle_t
Definition sys.h:169
qbool Sys_LoadDependency(const char **dllnames, dllhandle_t *handle, const dllfunction_t *fcts)
Definition sys_shared.c:131
sys_t sys
Definition sys_shared.c:42
int Sys_CheckParm(const char *parm)
Definition sys_shared.c:327
qbool GL_ExtensionSupported(const char *name)
Definition vid_null.c:67
#define MAXJOYAXIS
Definition vid.h:99
@ RENDERPATH_GLES2
Definition vid.h:38
@ RENDERPATH_GL32
Definition vid.h:37
qbool VID_InitMode(const viddef_mode_t *mode)
allocates and opens an appropriate OpenGL context (and its window)
Definition vid_null.c:40
void * GL_GetProcAddress(const char *name)
Definition vid_null.c:45
void VID_Shutdown(void)
Called at shutdown.
Definition vid_null.c:28
#define MAXJOYBUTTON
Definition vid.h:101
void VID_BuildJoyState(vid_joystate_t *joystate)
Definition vid_null.c:54
GLenum GLuint id
Definition vid_shared.c:262
cvar_t vid_refreshrate
Definition vid_shared.c:140
cvar_t v_color_enable
Definition vid_shared.c:176
GLsizei const GLfloat * value
Definition vid_shared.c:345
cvar_t vid_width
Definition vid_shared.c:136
cvar_t joy_axisside
Definition vid_shared.c:89
GLuint GLuint GLintptr GLsizeiptr size
Definition vid_shared.c:237
const char * uniformBlockName
Definition vid_shared.c:210
const char * gl_vendor
brand of graphics chip
Definition vid_shared.c:190
GLuint GLsizei maxLength
Definition vid_shared.c:289
static struct vidfallback_s vidfallbacks[]
cvar_t vid_sRGB_fallback
Definition vid_shared.c:158
GLenum GLenum GLuint texture
Definition vid_shared.c:217
GLsizei GLsizei GLchar * source
Definition vid_shared.c:309
cvar_t joy_x360_axisroll
Definition vid_shared.c:113
cvar_t joy_axisup
Definition vid_shared.c:90
cvar_t vid_minimize_on_focus_loss
Definition vid_shared.c:152
cvar_t joy_sensitivityside
Definition vid_shared.c:101
void VID_Shared_Init(void)
GLenum GLsizei width
Definition vid_shared.c:226
static int VID_SortModes_Compare(const void *a_, const void *b_)
const GLchar * name
Definition vid_shared.c:205
cvar_t joy_x360_sensitivityup
Definition vid_shared.c:122
qbool in_client_mouse
Definition vid_shared.c:67
cvar_t joy_x360_sensitivitypitch
Definition vid_shared.c:123
cvar_t joy_axisroll
Definition vid_shared.c:93
GLenum GLsizei GLsizei height
Definition vid_shared.c:226
GLint GLenum GLsizei GLsizei GLint border
Definition vid_shared.c:252
#define BOUNDCVAR(cvar, m1, m2)
GLfloat GLfloat GLfloat v2
Definition vid_shared.c:352
GLint GLint GLint GLint GLint GLint GLint dstY1
Definition vid_shared.c:213
GLint GLint GLint yoffset
Definition vid_shared.c:254
GLubyte GLubyte GLubyte GLubyte w
Definition vid_shared.c:387
cvar_t v_contrastboost
Definition vid_shared.c:175
void GL_Setup(void)
Definition vid_shared.c:712
GLsizei uniformCount
Definition vid_shared.c:294
cvar_t joy_deadzoneforward
Definition vid_shared.c:94
static int gamma_forcenextframe
void VID_Shared_BuildJoyState_Finish(vid_joystate_t *joystate)
Definition vid_shared.c:929
qbool vid_opened
Definition cl_main.c:2785
GLenum GLenum GLuint GLint GLint layer
Definition vid_shared.c:219
static float cachewhite[3]
cvar_t v_color_white_b
Definition vid_shared.c:185
GLsizei samples
Definition vid_shared.c:227
GLvoid *GLAPIENTRY * qglMapBuffer(GLenum target, GLenum access)
static int cachecolorenable
GLenum GLenum sfactorAlpha
Definition vid_shared.c:243
GLclampd far_val
Definition vid_shared.c:271
cvar_t joy_sensitivityforward
Definition vid_shared.c:100
GLint GLenum GLsizei GLsizei GLint GLsizei imageSize
Definition vid_shared.c:252
GLint GLenum GLboolean normalized
Definition vid_shared.c:402
GLenum mode
Definition vid_shared.c:323
#define GAMMACHECK(cache, value)
cvar_t vid_minwidth
Definition vid_shared.c:154
static float cachecontrast
void VID_Start(void)
cvar_t joy_active
Definition vid_shared.c:84
const GLenum * bufs
Definition vid_shared.c:278
cvar_t vid_stereobuffer
Definition vid_shared.c:141
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
Definition vid_shared.c:213
cvar_t gl_info_extensions
Definition vid_shared.c:131
cvar_t vid_stick_mouse
Definition vid_shared.c:163
qbool vid_gammatables_trivial
this is set to true if all color control values are at default setting, and it therefore would make n...
void VID_ApplyGammaToColor(const float *rgb, float *out)
applies current gamma settings to a color (0-1 range)
cvar_t vid_display
Definition vid_shared.c:166
cvar_t gl_info_version
Definition vid_shared.c:130
GLsizeiptr const GLvoid GLenum usage
Definition vid_shared.c:244
cvar_t vid_height
Definition vid_shared.c:137
GLenum GLvoid ** pointer
Definition vid_shared.c:319
GLenum GLenum GLint * params
Definition vid_shared.c:224
static int joybuttonkey360[][2]
Definition vid_shared.c:984
cvar_t vid_vsync
Definition vid_shared.c:149
cvar_t joy_detected
Definition vid_shared.c:85
GLuint buffer
Definition vid_shared.c:235
float in_windowmouse_y
Definition vid_shared.c:71
GLint void * img
Definition vid_shared.c:297
cvar_t vid_touchscreen_ydpi
Definition vid_shared.c:147
cvar_t v_color_grey_b
Definition vid_shared.c:182
cvar_t joy_sensitivitypitch
Definition vid_shared.c:103
static void Force_CenterView_f(cmd_state_t *cmd)
cvar_t joy_x360_deadzoneup
Definition vid_shared.c:116
cvar_t joy_axispitch
Definition vid_shared.c:91
cvar_t v_gamma
Definition vid_shared.c:172
cvar_t joy_x360_axisup
Definition vid_shared.c:110
unsigned int vid_gammatables_serial
so other subsystems can poll if gamma parameters have changed; this starts with 0 and gets increased ...
cvar_t vid_grabkeyboard
Definition vid_shared.c:153
GLuint GLuint uniformBlockBinding
Definition vid_shared.c:360
GLboolean invert
Definition vid_shared.c:331
GLsizei GLenum GLenum GLuint GLenum GLsizei GLchar * messageLog
Definition vid_shared.c:209
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition vid_shared.c:213
GLuint renderbuffer
Definition vid_shared.c:212
GLsizei GLenum GLenum GLuint GLenum GLsizei * lengths
Definition vid_shared.c:209
GLsizeiptr const GLvoid * data
Definition vid_shared.c:244
GLenum GLenum GLsizei count
Definition vid_shared.c:261
qbool VID_JoyBlockEmulatedKeys(int keycode)
Definition vid_shared.c:864
const GLuint * framebuffers
Definition vid_shared.c:214
cvar_t joy_sensitivityroll
Definition vid_shared.c:105
GLint GLint GLint GLsizei GLsizei GLenum format
Definition vid_shared.c:254
const GLdouble * v
Definition vid_shared.c:367
GLint GLenum GLint GLint y
Definition vid_shared.c:256
GLubyte GLubyte GLubyte z
Definition vid_shared.c:387
cvar_t joy_deadzoneup
Definition vid_shared.c:96
cvar_t joy_x360_sensitivityroll
Definition vid_shared.c:125
void GL_InitFunctions(void)
Definition vid_shared.c:684
GLsizei const char ** uniformNames
Definition vid_shared.c:316
static float cachegamma
GLint lod
Definition vid_shared.c:297
cvar_t joy_x360_deadzoneforward
Definition vid_shared.c:114
GLint GLenum GLsizei GLsizei GLsizei depth
Definition vid_shared.c:253
cvar_t gl_info_renderer
Definition vid_shared.c:129
GLenum dfactor
Definition vid_shared.c:242
float in_windowmouse_x
Definition vid_shared.c:71
cvar_t vid_info_displaycount
Definition vid_shared.c:167
cvar_t joy_axiskeyevents
Definition vid_shared.c:106
const GLuint * renderbuffers
Definition vid_shared.c:215
GLsizei maxCount
Definition vid_shared.c:295
const GLuint * buffers
Definition vid_shared.c:263
GLint GLenum GLboolean GLsizei stride
Definition vid_shared.c:402
GLenum GLuint GLenum GLsizei length
Definition vid_shared.c:262
cvar_t v_glslgamma_2d
Definition vid_shared.c:186
GLsizei GLenum GLenum GLuint * ids
Definition vid_shared.c:209
vid_joystate_t vid_joystate
Definition vid_shared.c:79
cvar_t vid_touchscreen_xdpi
Definition vid_shared.c:146
GLuint uniformIndex
Definition vid_shared.c:293
cvar_t vid_borderless
Definition vid_shared.c:135
cvar_t joy_x360_sensitivityforward
Definition vid_shared.c:120
GLint GLenum GLint x
Definition vid_shared.c:256
static float cachegrey[3]
cvar_t joy_x360_sensitivityyaw
Definition vid_shared.c:124
GLint GLint xoffset
Definition vid_shared.c:254
GLuint GLsizei GLsizei char * uniformName
Definition vid_shared.c:293
cvar_t vid_touchscreen_density
Definition vid_shared.c:145
cvar_t joy_x360_axispitch
Definition vid_shared.c:111
cvar_t v_color_white_g
Definition vid_shared.c:184
cvar_t joy_x360_axisforward
Definition vid_shared.c:108
GLenum attachment
Definition vid_shared.c:216
const GLuint * arrays
Definition vid_shared.c:268
GLfloat v0
Definition vid_shared.c:344
const GLubyte *GLAPIENTRY * qglGetStringi(GLenum name, GLuint index)
cvar_t v_psycho
Definition vid_shared.c:187
cvar_t vid_touchscreen_showkeyboard
Definition vid_shared.c:161
GLint GLenum GLenum GLvoid * pixels
Definition vid_shared.c:311
float in_mouse_y
Definition vid_shared.c:70
cvar_t vid_sRGB
Definition vid_shared.c:157
const char * gl_version
begins with 1.0.0, 1.1.0, 1.2.0, 1.2.1, 1.3.0, 1.3.1, or 1.4.0
Definition vid_shared.c:194
cvar_t joy_deadzoneyaw
Definition vid_shared.c:98
GLfloat GLfloat v1
Definition vid_shared.c:348
cvar_t joy_x360_deadzoneside
Definition vid_shared.c:115
GLenum GLenum pname
Definition vid_shared.c:224
GLenum internalformat
Definition vid_shared.c:226
cvar_t v_color_black_r
Definition vid_shared.c:177
cvar_t joy_deadzoneroll
Definition vid_shared.c:99
float in_mouse_x
Definition vid_shared.c:70
GLint first
Definition vid_shared.c:276
cvar_t vid_mouse_clickthrough
Definition vid_shared.c:151
GLsizei GLenum const GLvoid * indices
Definition vid_shared.c:279
GLuint obj
Definition vid_shared.c:232
cvar_t joy_sensitivityup
Definition vid_shared.c:102
cvar_t v_color_black_b
Definition vid_shared.c:179
cvar_t gl_info_driver
Definition vid_shared.c:132
cvar_t joy_deadzonepitch
Definition vid_shared.c:97
cvar_t joy_enable
Definition vid_shared.c:86
cvar_t v_color_black_g
Definition vid_shared.c:178
static float cacheblack[3]
GLenum zfail
Definition vid_shared.c:336
GLenum GLenum renderbuffertarget
Definition vid_shared.c:216
const char * gl_renderer
graphics chip model and other information
Definition vid_shared.c:192
cvar_t joy_x360_deadzonepitch
Definition vid_shared.c:117
void VID_ApplyJoyState(vid_joystate_t *joystate)
GLuint GLuint GLintptr offset
Definition vid_shared.c:237
GLuint framebuffer
Definition vid_shared.c:211
GLuint qid
Definition vid_shared.c:233
GLint GLint GLint GLint GLint dstY0
Definition vid_shared.c:213
GLsizei bufSize
Definition vid_shared.c:209
cvar_t vid_mouse
Definition vid_shared.c:150
viddef_t vid
global video state
Definition vid_shared.c:64
const GLubyte *GLAPIENTRY * qglGetString(GLenum name)
qbool GL_CheckExtension(const char *name, const char *disableparm, int silent)
Definition vid_shared.c:633
cvar_t v_color_grey_g
Definition vid_shared.c:181
static glfunction_t openglfuncs[]
Definition vid_shared.c:420
static float cachecontrastboost
cvar_t vid_samples
Definition vid_shared.c:139
GLint GLint GLint GLint dstX0
Definition vid_shared.c:213
GLenum GLenum GLuint GLint level
Definition vid_shared.c:217
void VID_UpdateGamma(void)
updates cachegamma variables and bumps vid_gammatables_serial if anything changed (ONLY to be called ...
GLint param
Definition vid_shared.c:325
GLint srcY0
Definition vid_shared.c:213
void VID_Shared_BuildJoyState_Begin(vid_joystate_t *joystate)
Definition vid_shared.c:885
cvar_t joy_axisyaw
Definition vid_shared.c:92
GLenum dfactorRGB
Definition vid_shared.c:243
void VID_ClearExtensions(void)
Definition vid_shared.c:675
GLenum GLenum severity
Definition vid_shared.c:261
GLfloat GLfloat GLfloat GLfloat v3
Definition vid_shared.c:356
cvar_t vid_desktopfullscreen
Definition vid_shared.c:165
cvar_t joy_index
Definition vid_shared.c:87
GLclampf GLclampf blue
Definition vid_shared.c:247
cvar_t joy_x360_axisyaw
Definition vid_shared.c:112
cvar_t vid_resizable
Definition vid_shared.c:164
GLenum GLenum GLenum dfactorAlpha
Definition vid_shared.c:243
GLsizei const GLuint * uniformIndices
Definition vid_shared.c:294
GLint GLint internalFormat
Definition vid_shared.c:337
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition vid_shared.c:262
cvar_t v_brightness
Definition vid_shared.c:174
cvar_t v_color_white_r
Definition vid_shared.c:183
GLfloat units
Definition vid_shared.c:328
const GLvoid * userParam
Definition vid_shared.c:260
cvar_t joy_deadzoneside
Definition vid_shared.c:95
void VID_BuildGammaTables(unsigned short *ramps, int rampsize)
builds the current gamma tables into an array (needs 3*rampsize items)
cvar_t joy_x360_axisside
Definition vid_shared.c:109
GLuint attachedObj
Definition vid_shared.c:273
static float cachebrightness
size_t VID_SortModes(vid_mode_t *modes, size_t count, qbool usebpp, qbool userefreshrate, qbool useaspect)
cvar_t joy_x360_sensitivityside
Definition vid_shared.c:121
cvar_t gl_finish
Definition vid_shared.c:156
cvar_t vid_touchscreen_supportshowkeyboard
Definition vid_shared.c:162
cvar_t joy_x360_deadzoneyaw
Definition vid_shared.c:118
cvar_t joy_axisforward
Definition vid_shared.c:88
GLint GLint GLint GLint GLint GLint dstX1
Definition vid_shared.c:213
qbool vid_hidden
Definition vid_shared.c:74
GLsizei GLenum GLenum * types
Definition vid_shared.c:209
GLsizei GLenum GLenum GLuint GLenum * severities
Definition vid_shared.c:209
cvar_t v_color_grey_r
Definition vid_shared.c:180
qbool vid_activewindow
Definition vid_shared.c:77
GLint GLint srcX1
Definition vid_shared.c:213
GLint GLint GLint GLint zoffset
Definition vid_shared.c:255
GLint ref
Definition vid_shared.c:334
GLsizei GLboolean transpose
Definition vid_shared.c:361
cvar_t vid_bitsperpixel
Definition vid_shared.c:138
GLint location
Definition vid_shared.c:317
cvar_t vid_touchscreen
Definition vid_shared.c:160
qbool vid_commandlinecheck
GLclampf GLclampf GLclampf alpha
Definition vid_shared.c:247
static void VID_KeyEventForButton(qbool oldbutton, qbool newbutton, int key, double *timer)
Definition vid_shared.c:946
cvar_t vid_minheight
Definition vid_shared.c:155
GLsizei const GLchar ** string
Definition vid_shared.c:333
cvar_t gl_info_vendor
Definition vid_shared.c:128
GLint GLint GLint srcY1
Definition vid_shared.c:213
void VID_Restart_f(cmd_state_t *cmd)
double vid_joybuttontimer[MAXJOYBUTTON]
GLenum GLenum textarget
Definition vid_shared.c:217
cvar_t joy_sensitivityyaw
Definition vid_shared.c:104
GLuint uniformBlockIndex
Definition vid_shared.c:291
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition vid_shared.c:261
cvar_t v_contrast
Definition vid_shared.c:173
GLenum GLenum zpass
Definition vid_shared.c:336
GLuint index
Definition vid_shared.c:234
GLsizei GLsizei GLchar * infoLog
Definition vid_shared.c:303
static int VID_Mode(viddef_mode_t *mode)
NULL mode means read it from the cvars.
cvar_t joy_x360_deadzoneroll
Definition vid_shared.c:119
int VID_Shared_SetJoystick(int index)
const GLuint * textures
Definition vid_shared.c:267
GLclampf green
Definition vid_shared.c:247
static int joybuttonkey[MAXJOYBUTTON][2]
Definition vid_shared.c:977
cvar_t joy_axiskeyevents_deadzone
Definition vid_shared.c:107
float VID_JoyState_GetAxis(const vid_joystate_t *joystate, int axis, float fsensitivity, float deadzone)
Definition vid_shared.c:854
GLsizei GLenum * sources
Definition vid_shared.c:209
cvar_t vid_fullscreen
Definition vid_shared.c:134
GLenum type
Definition vid_shared.c:261