Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
b6e2310
CONFIG: enable cl_pext_lagteleport by default (#1097)
ciscon Jan 30, 2026
b443a89
docs: add r_drawflat_mode to graphics group (#1096)
vikpe Jan 31, 2026
1c0e3b0
VX_TRACKER: Add r_tracker_row_spacing cvar
Xerialen Feb 9, 2026
6a08779
Add r_tracker_row_spacing documentation and .gitignore entries
Xerialen Feb 9, 2026
6a8f6ca
GL: Add version alternative to all extension checks.
dsvensson Mar 22, 2025
01e9cc2
GL: Add parameter to dump expanded shaders.
dsvensson Mar 22, 2025
d732d99
MODERN: Move flat qualifier first in declarations.
dsvensson Mar 22, 2025
9dcc9c4
MODERN: Make ifdefs more strict in world shader.
dsvensson Mar 22, 2025
52eacc5
RENDERER: Inject glsl version via #ezquake-definitions.
dsvensson Feb 18, 2026
e5ad72c
RENDERER: Load GL fallback functions.
dsvensson Feb 18, 2026
e50c1a6
RENDERER: Losen up modern renderer requirements.
dsvensson Feb 18, 2026
6f8f1bb
RENDERER: Keep track of if we're using an OpenGL Core profile.
dsvensson Feb 18, 2026
ffe2296
RENDERER: Add core compatibility and helper macros.
dsvensson Feb 18, 2026
155e7c3
RENDERER: Fallback to UBO and uniform binding on OpenGL 4.1.
dsvensson Feb 18, 2026
c385c44
RENDERER: Add fallback for non-instanced rendering.
dsvensson Feb 18, 2026
f72d5a6
RENDERER: Probe availability of OpenGL 4.1 core.
dsvensson Feb 18, 2026
ae919d5
RENDERER: Don't try to build lightmap compute shader unless supported.
dsvensson Feb 18, 2026
97ef282
RENDERER: Skip extensions for FXAA if core profile.
dsvensson Feb 18, 2026
ffe62d9
MACOS: Don't disable the modern renderer.
dsvensson Feb 18, 2026
84bdf4e
RENDERER: Always invalidate unavailable GL functions.
dsvensson Feb 18, 2026
af26512
SERVER BROWSER: fix race condition in SB_PingTree_ScanProxies (#1061)
dusty-qw Feb 19, 2026
9f56321
Merge pull request #1102 from qw-ctf/modern-on-macos
tcsabina Feb 25, 2026
169aeec
Preparing 3.6.9 release
tcsabina Mar 1, 2026
80cdad0
Merge pull request #1099 from Xerialen/add-r-tracker-row-spacing
tcsabina Mar 1, 2026
b2d448f
Merge pull request #1106 from tcsabina/master
tcsabina Mar 1, 2026
6f50ac6
Starting 3.7.0 development
tcsabina Mar 1, 2026
b13f585
Merge pull request #1107 from tcsabina/master
tcsabina Mar 1, 2026
bea2515
CVAR: cl_fakeshaft - default to 1 (#1110)
ciscon Mar 23, 2026
7fb7618
DEMO: Add spawn crossing warning for demo playback
osm Apr 9, 2026
687b7e1
SOUND: Split voice playback volume from game volume
osm Apr 10, 2026
096296f
SOUND: Add qizmo voice support
osm Apr 10, 2026
23ea481
Merge pull request #1113 from osm/master
osm Apr 16, 2026
95eba3c
Merge pull request #1114 from osm/add-qizmo-voice-support
osm Apr 16, 2026
3120abd
TEAMSAYS: add took priority
osm Apr 24, 2026
2be5210
Merge pull request #1115 from osm/master
osm Apr 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,16 @@ ezQuake.aps
SysPrintf.log
.ezquake/
.vs
/.vscode
*.json.c
*.glsl.c
vcpkg_installed/
src/.msversion.h
/build*/

/.vscode
*.json.c
*.glsl.c
vcpkg_installed/
src/.msversion.h
/build*/
!.gitignore

# Local documentation files (not for repository)
CR*.md
EZQUAKE_HUD_*.md
TRACKER_*.md
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,7 @@ set(client_headers
${SOURCE_DIR}/screen.h
${SOURCE_DIR}/settings.h
${SOURCE_DIR}/settings_page.h
${SOURCE_DIR}/demo_spawnwarn.h
${SOURCE_DIR}/stats_grid.h
${SOURCE_DIR}/sys.h
${SOURCE_DIR}/teamplay.h
Expand Down Expand Up @@ -705,6 +706,7 @@ set(client
${SOURCE_DIR}/mvd_autotrack.c
${SOURCE_DIR}/mvd_utils.c
${SOURCE_DIR}/mvd_xmlstats.c
${SOURCE_DIR}/demo_spawnwarn.c
${SOURCE_DIR}/qtv.c
${SOURCE_DIR}/rulesets.c
${SOURCE_DIR}/sbar.c
Expand All @@ -713,6 +715,7 @@ set(client
${SOURCE_DIR}/snd_main.c
${SOURCE_DIR}/snd_mem.c
${SOURCE_DIR}/snd_mix.c
${SOURCE_DIR}/snd_qizmo.c
${SOURCE_DIR}/snd_voip.c
${SOURCE_DIR}/stats_grid.c
${SOURCE_DIR}/sys_sdl2.c
Expand Down
3 changes: 0 additions & 3 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,6 @@
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
},
"cacheVariables": {
"RENDERER_MODERN_OPENGL": "OFF"
}
},
{
Expand Down
3 changes: 3 additions & 0 deletions help_cmdline_params.json
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,9 @@
"-r-verify": {
"system-generated": true
},
"-r-dump-shaders": {
"description": "Write expanded shader source to qw/shaders/<name>.<type>"
},
"-ruleset": {
"flags": [
"incomplete"
Expand Down
46 changes: 46 additions & 0 deletions help_variables.json
Original file line number Diff line number Diff line change
Expand Up @@ -4162,6 +4162,28 @@
"group-id": "40",
"type": "string"
},
"demo_spawnwarn": {
"default": "0",
"desc": "Warns during demo playback when the current POV crosses a deathmatch spawn or teleporter exit.",
"group-id": "40",
"type": "boolean",
"values": [
{
"description": "Disable spawn crossing warnings in demos.",
"name": "false"
},
{
"description": "Enable spawn crossing warnings in demos.",
"name": "true"
}
]
},
"demo_spawnwarn_text": {
"default": "you crossed a spawn",
"desc": "Sets the centerprint text shown when demo_spawnwarn detects a spawn crossing.",
"group-id": "40",
"type": "string"
},
"developer": {
"default": "0",
"desc": "Enables debug mode which prints more messages into the console than for normal user.",
Expand Down Expand Up @@ -15849,6 +15871,7 @@
"r_drawflat_mode": {
"default": "0",
"desc": "Sets the method used to adjust wall & floor textures (/r_drawflat) by the corresponding color (/r_wallcolor & /r_floorcolor)",
"group-id": "50",
"remarks": "Works in GLSL modes only (see /gl_program_world).\nMode 0 will give best performance, mode 2 is the recommended setting for different colors.\nCan not be changed during a match.",
"type": "enum",
"values": [
Expand Down Expand Up @@ -17373,6 +17396,12 @@
"group-id": "40",
"type": "integer"
},
"r_tracker_row_spacing": {
"default": "0",
"desc": "Additional pixels to add between tracker message rows. Positive values increase spacing, negative values decrease it.",
"group-id": "40",
"type": "integer"
},
"r_tracker_proportional": {
"default": "0",
"desc": "Enable TrueType fonts on tracker text.",
Expand Down Expand Up @@ -21883,6 +21912,23 @@
}
]
},
"tp_tookpriorities": {
"default": "0",
"desc": "Controls whether the last item taken macro (%X or $took) uses the order of tp_took as item pickup priority.",
"group-id": "49",
"remarks": "When enabled, earlier items in tp_took have higher priority and can prevent lower priority pickups from replacing $took within tp_tooktimeout.\n\nExample:\ntp_took powerups rl lg ra ya ga mega pack gl sng ng ssg rockets cells nails shells health\ntp_tookpriorities 1",
"type": "boolean",
"values": [
{
"description": "Original, default behavior. The latest pickup replaces the previous one.",
"name": "false"
},
{
"description": "Use tp_took order as pickup priority.",
"name": "true"
}
]
},
"tp_pointtimeout": {
"default": "15",
"desc": "Time (in seconds) before the last pointed item (%j) is cleared.",
Expand Down
89 changes: 68 additions & 21 deletions src/EX_browser_pathfind.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,18 +372,40 @@ int SB_PingTree_SendQueryThread(void *thread_arg)
{
proxy_request_queue *queue = (proxy_request_queue *) thread_arg;
int i, ret;
double interval_ms = (1.0 / sb_proxinfopersec.value) * 1000.0;
double interval_ms;
#ifdef _WIN32
timerresolution_session_t timersession = {0, 0};
#endif

// Null check for queue
if (!queue) {
Com_DPrintf("SB_PingTree_SendQueryThread: queue is NULL\n");
return -1;
}

// Null check for queue data
if (!queue->data) {
Com_DPrintf("SB_PingTree_SendQueryThread: queue->data is NULL\n");
return -1;
}

interval_ms = (1.0 / sb_proxinfopersec.value) * 1000.0;

Sys_TimerResolution_InitSession(&timersession);
Sys_TimerResolution_RequestMinimum(&timersession);

for (i = 0; i < queue->items; i++) {
if (!queue->data[i].done) {
struct sockaddr_storage addr_to;
netadr_t netadr = SB_NodeNetadr_Get(queue->data[i].nodeid);
netadr_t netadr;

// Validate nodeid
if (queue->data[i].nodeid < 0 || queue->data[i].nodeid >= ping_nodes_count) {
Com_DPrintf("SB_PingTree_SendQueryThread: invalid nodeid %d\n", queue->data[i].nodeid);
continue;
}

netadr = SB_NodeNetadr_Get(queue->data[i].nodeid);

NetadrToSockadr(&netadr, &addr_to);
ret = sendto(queue->data[i].sock,
Expand Down Expand Up @@ -513,25 +535,46 @@ static qbool SB_PingTree_RecvQuery(proxy_request_queue *queue, FILE *f)
static void SB_PingTree_ScanProxies(void)
{
int i;
proxy_request_queue queue = { NULL, 0, false };
proxy_request_queue *queue = NULL;
size_t request = 0;
FILE *f = NULL;

// Allocate queue on heap
queue = (proxy_request_queue *) Q_malloc(sizeof(proxy_request_queue));
if (!queue) {
Com_Printf("Failed to allocate memory for proxy request queue\n");
return;
}

// Initialize queue fields
queue->data = NULL;
queue->items = 0;
queue->sending_done = false;
queue->allrecved = false;

for (i = 0; i < ping_nodes_count; i++) {
if (ping_nodes[i].proxport) {
queue.items++;
queue->items++;
}
}

if (!queue.items) return;
if (!queue->items) {
Q_free(queue);
return;
}

queue.data = (proxy_query_request_t *) Q_malloc(sizeof(proxy_query_request_t) * queue.items);
queue->data = (proxy_query_request_t *) Q_malloc(sizeof(proxy_query_request_t) * queue->items);
if (!queue->data) {
Com_Printf("Failed to allocate memory for proxy request data\n");
Q_free(queue);
return;
}

for (i = 0; i < ping_nodes_count; i++) {
if (ping_nodes[i].proxport) {
queue.data[request].done = false;
queue.data[request].nodeid = i;
queue.data[request].sock = UDP_OpenSocket(PORT_ANY);
queue->data[request].done = false;
queue->data[request].nodeid = i;
queue->data[request].sock = UDP_OpenSocket(PORT_ANY);
request++;
}
}
Expand All @@ -546,12 +589,20 @@ static void SB_PingTree_ScanProxies(void)
}

for (i = 0; i < sb_proxretries.integer; i++) {
queue.sending_done = false;
if (Sys_CreateDetachedThread(SB_PingTree_SendQueryThread, (void *) &queue) < 0) {
queue->sending_done = false;
if (Sys_CreateDetachedThread(SB_PingTree_SendQueryThread, (void *) queue) < 0) {
Com_Printf("Failed to create SB_PingTree_SendQueryThread thread\n");
// If thread creation fails, don't continue with this retry
continue;
}
SB_PingTree_RecvQuery(&queue, f);
if (queue.allrecved) {
SB_PingTree_RecvQuery(queue, f);

// Wait for the sending thread to complete before next retry
while (!queue->sending_done) {
Sys_MSleep(10);
}

if (queue->allrecved) {
break;
}
}
Expand All @@ -561,16 +612,12 @@ static void SB_PingTree_ScanProxies(void)
fclose(f);
}

while (!queue.sending_done) {
// XXX: use semaphore instead
Sys_MSleep(100);
}

for (i = 0; i < queue.items; i++) {
closesocket(queue.data[i].sock);
for (i = 0; i < queue->items; i++) {
closesocket(queue->data[i].sock);
}

Q_free(queue.data);
Q_free(queue->data);
Q_free(queue);
}

static nodeid_t SB_PingTree_NearestNodeGet(void)
Expand Down
10 changes: 8 additions & 2 deletions src/cl_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "r_renderer.h"
#include "r_performance.h"
#include "r_program.h"
#include "demo_spawnwarn.h"

extern qbool ActiveApp, Minimized;

Expand Down Expand Up @@ -111,7 +112,7 @@ cvar_t cl_pext = {"cl_pext", "1"}; // allow/disallow protocol extensions at
cvar_t cl_pext_limits = { "cl_pext_limits", "1" }; // enhanced protocol limits
cvar_t cl_pext_other = {"cl_pext_other", "0"}; // extensions which does not have own variables should be controlled by this variable.
cvar_t cl_pext_warndemos = { "cl_pext_warndemos", "1" }; // if set, user will be warned when saving demos that are not backwards compatible
cvar_t cl_pext_lagteleport = { "cl_pext_lagteleport", "0" }; // server-side adjustment of yaw angle through teleports
cvar_t cl_pext_lagteleport = { "cl_pext_lagteleport", "1" }; // server-side adjustment of yaw angle through teleports
#ifdef MVD_PEXT1_SERVERSIDEWEAPON
cvar_t cl_pext_serversideweapon = { "cl_pext_serversideweapon", "0", 0, onchange_pext_serversideweapon }; // server-side weapon selection
#endif
Expand Down Expand Up @@ -171,7 +172,7 @@ cvar_t cl_muzzleflash = {"cl_muzzleflash", "1"};
cvar_t cl_rocket2grenade = {"cl_r2g", "0"};
cvar_t cl_demospeed = {"cl_demospeed", "1"};
cvar_t cl_staticsounds = {"cl_staticSounds", "1"};
cvar_t cl_fakeshaft = {"cl_fakeshaft", "0", 0, Rulesets_OnChange_cl_fakeshaft};
cvar_t cl_fakeshaft = {"cl_fakeshaft", "1", 0, Rulesets_OnChange_cl_fakeshaft};
cvar_t cl_fakeshaft_extra_updates = {"cl_fakeshaft_extra_updates", "1"};
cvar_t cl_parseWhiteText = {"cl_parseWhiteText", "1"};
cvar_t cl_filterdrawviewmodel = {"cl_filterdrawviewmodel", "0"};
Expand Down Expand Up @@ -1239,6 +1240,7 @@ void CL_ClearState (void)
memset(cl_lightstyle, 0, sizeof(cl_lightstyle));
memset(cl_entities, 0, sizeof(cl_entities));
memset(cl_static_entities, 0, sizeof(cl_static_entities));
CL_SpawnWarn_ClearPoints();

// Set entnum for all entity baselines
for (i = 0; i < sizeof(cl_entities) / sizeof(cl_entities[0]); ++i) {
Expand Down Expand Up @@ -1832,6 +1834,8 @@ static void CL_InitLocal(void)
Cvar_Register(&cl_nolerp_on_entity);
Cvar_Register(&cl_newlerp);
Cvar_Register(&cl_lerp_monsters);
Cvar_Register(&demo_spawnwarn);
Cvar_Register(&demo_spawnwarn_text);
Cvar_Register(&cl_maxfps);
Cvar_Register(&cl_maxfps_menu);
Cvar_Register(&cl_physfps);
Expand Down Expand Up @@ -2687,6 +2691,7 @@ void CL_Frame(double time)
first_view = false;

CL_LinkEntities();
CL_SpawnWarn_UpdateWarning();

SCR_CalcRefdef();

Expand Down Expand Up @@ -2734,6 +2739,7 @@ void CL_Frame(double time)
}
else {
CL_LinkEntities();
CL_SpawnWarn_UpdateWarning();

R_PerformanceBeginFrame();
SCR_UpdateScreen();
Expand Down
Loading