Here comes Unvanquished 0.55.5, our 6th release in the Unvanquished 0.55 development cycle! We expect this to be the last 0.55 point release. The next, major 0.56.0 release should come in the near future.
This point release only updates the engine and the game code. This release polishes the existing features and prepares for greater things to come, so there aren’t screenshots to show.
Game updates
On the game side, Gireen fixed the minimap zones, which is used for layered minimaps, a feature that was broken for a very long time!
Thanks to Grise, when a player is banned from a server, a window telling what’s happening to the player is now displayed. It’s actually quite funny that the only screenshot to show for this release is a ban window!

BMorel fixed the TOGGLE
map entity feature not working with rotating doors.
Reaper added an option to automatically clear the chat field when closing it, for those who prefer that behavior, and he also added an option to restore the console input on map change. Both of those improve the quality of life of in-game chatters.
He also implemented the caching of rotation bone index, to speed up the model rendering (more improvements speeding up that code will also come in future releases). He also removed some gamelogic/engine round trips when parsing entities during map load.
Slipher made sure the mouse wheel (up/down moves) can now be bound in the menus, added the ability to close the circle menus with a right mouse click, and fixed the chat ignoring the keyboard input after a mouse click. He also made sure players cannot call for voting a map with an invalid map name.
Kai improved the output of the admintest
command.

Illwieckz updated the presets and the option menus according to new renderer features implemented in the engine.
As usual, this release brings translation updates done by a bunch of contributors.
It’s also the right moment to invite translators to look at the new strings that were added in the whole 0.55 development cycle that are not translated yet, in order to get more complete translations in the upcoming 0.56.0 release. Translators can contribute Unvanquished translations on Weblate space.
Engine updates
We were busy bees…
It would be very hard to explain everything. Reaper, Slipher and Illwieckz did a lot of renderer work, for optimizing it, cleaning it up, improving the implementations, refactoring and generalizing the code, and preparing for great features and changes to come.
Reaper and Slipher worked on reducing some memory leaks, in both engine and game code in fact. Memory leaks in game code aren’t a problem for the virtualized public game as everything is freed by the engine at the end of the game, but they can be annoying when running servers on debuggers. And memory leaks in engine are something we should not have. So, this effort improves the situation for both the players (engine fixes) and for the mod developers (game fixes).
Slipher fixed some glitches related to the depth fade shader affecting smoke particles and acid clouds. He also reworked the fog code, fixing many bugs and improving the way it looks!
Slipher also made it possible to re-register images and shaders with different flags. This can be useful to mappers using an image from a texture pack both the default way and with custom parameters in different places.

As showcased in our previous blog post Living in the future!, we finally moved to SDL3 and enabled native Wayland support in our downloadable builds of the game! We also upgraded a lot our build environment and updated a lot of other libraries. That SDL3 work is a joint effort of Reaper, Illwieckz and Slipher.
Since SDL3 is a bit too new for some releases, we distribute a prebuilt SDL3 in our build dependencies for people wanting to build the game themselves (our script for rebuilding SDL3 oneself is also provided). People wanting to rely on the system SDL3 when packaging the game for a Linux distribution can use the new -DUSE_EXTERNAL_DEPS_LIBS=OFF
CMake option to not use the prebuilt SDL3 we provide.
Reaper implemented builtin stack traces in the engine, but that requires a very recent compiler, so it is not yet enabled in the release.
As a side note, among the notable efforts done for the 0.55.5 release, we upgraded our MinGW-compatible Breakpad fork of that crash reporting system in a way it can support DWARF5 debug symbols while retaining the ability to deal with MinGW binaries.
Things being almost there
Let’s tease a bit!
Illwieckz finally merged his work for making the renderer colorspace-aware. The first commits in that branch were written in 2019! That’s part of a very long-standing effort started in 2016 to improve the lighting in the Dæmon engine. Everything from that effort was already merged but that! To profit from that feature, a map should be rebuilt with the -sRGB
q3map2 light compilation flag.
This feature is not used yet because we need to figure out a way to ensure compatibility for translucent shaders, to make them work with both legacy maps and the newly maps that will be produced in the future to leverage the new lighting. So for now, we haven’t distributed any map rebuilt for that feature. We do hope that the incoming 0.56.0 version will finish making our assets compatible with both legacy and sRGB maps, so we can distribute entirely rebuilt maps relying on the new lighting.

Mappers can start testing the feature with this 0.55.5 released engine (but we better not host such maps on servers yet). This feature deserves its own blog post, stay tuned. 😉
Reaper also worked a lot on reworking the model code to speed-it-up, but most of those changes would break the compatibility so we hope to deliver that in the upcoming 0.56.0 release as well (still to be merged).
Let’s play
So, the release is out, it’s time to upgrade (our updater will do it for you!), download the game if you never played it yet, and join a game!
Detailed changelog
Client game:
- Add a window displaying a player he has been banned (Grise)
- Make possible to automatically clear the chat field when closing it (Reaper)
- Add the option to restore the console input on map change (Reaper)
- Fix minimap zones (Gireen)
- Use consistent flags for registering 2D shaders (Slipher)
- Cache rotation bone index (Reaper)
- Set
r_accurateSRGB
in presets (Illwieckz) - Suppress bogus warnings and error (Reaper)
- Fix potential double free with entity names (Slipher)
- Remove unused sound files and icons (Slipher)
- Lots of RmlUI-related code cleanup and fixes (Slipher)
- Don’t load the disconnection image twice (Slipher)
- Make mouse wheel bindable in the bind menu (Slipher)
- Fix chat ignoring input after mouse click (Slipher)
- Hide mouse in chat field in different way (Slipher)
- Fix assertion failure in UI map list (Slipher)
- Close circle menus with right click (Slipher)
- NUKE unused
Debug
function declaration (Reaper) - Set
r_readonlyDepthBuffer
in presets and add a menu for it (Illwieckz)
Server game
- Don’t allow voting invalid map names (Slipher)
- Don’t show empty parentheses if the level name is empty with the
admintest
command (Kai) - Fix classname memory leak (Reaper)
- Don’t do an engine round-trip to parse entities (Reaper)
- Fix
vtos
/etos
(Reaper) - Don’t use a static string to get
mapEntity
names (Reaper) - Fix the remaining
entity
/mapEntity
string memory leaks (Reaper) - Fix
TOGGLE
not working for rotating doors (BMorel) - Fix double free with map entity strings (Slipher)
- Fix potential double free with entity names/targets (Slipher)
- Fix
/setviewpos <entityNum>
(Reaper)
Engine:
- GL bind rework and cleanup (Reaper)
- Fix
r_showEntityTransforms
drawing garbage for sprites and wrong culling (Slipher) - Remove the
trRefEntity_t::cull
field (Slipher) - Add translucent solid option for showing cull bbox (Slipher)
- Fix
r_showLightTiles
GLSL code (Slipher) - Implement staging buffer and use it for material system (Reaper)
- Use staging buffer for the geometry cache (Reaper)
- Material system clean-up (Slipher)
- GLSL cleanup: make
var_FadeDepth
a scalar (Reaper) - NUKE unused
R_InitSkyTexCoords
(Reaper) - Reset staging buffer when freeing it (Reaper)
- Pack material data, material system clean-up (Reaper)
- Ensure correct alignment for buffer writes (Reaper)
- NUKE lots of useless or unused GL stuff (Reaper)
- Move some classes around for PushBuffer (Reaper)
- In terminate handler, rethrow exception correctly (Slipher)
- Add cvar for disabling NaCl crash dumps (Slipher)
- Implement
con_persistOnMapChange
to keep the console input on map change (Reaper) - Fix
flags & RSF_2D
intr_shader.cpp
(Illwieckz) - Require VAO and VBO excplicitly (Illwieckz)
- Defer shader building, for PushBuffer (Reaper)
- More GL bind rework (Reaper)
- Generalise shader post-processing (Reaper)
- Migrate from
depthTextureInitial
tou_DepthMap
, for PushBuffer (Reaper) - NUKE useless buffer unmapping and
R_SyncRenderThread
in material system (Reaper) - Fix two bugs with
/listmap
commands (Slipher) - Forbid bad map names in map commands (Slipher)
- Allow loading an image multiple times with different params (Slipher)
- NUKE
RGBA16
format handling (Slipher) - Enable two OpenGL introspections based on version being at least 3.0 (Slipher)
- (Almost) NUKE
glDriverType_t
(Slipher) - Fix wrong usage pattern of
R_SyncRenderThread
(Slipher) - Don’t search generated textures in shader hash table (Slipher)
- Nuke
SHADER_3D_(DYNAMIC/STATIC)
distinction (Slipher) - Set PRODUCT_APPID as WMCLASS on Linux (Illwieckz)
- Document shader register flags
RSF_*
(Slipher) - Allow shaders to be re-registered with different flags (Slipher)
- Show shader register flags in
/listshaders
(Slipher) - Clean up shader sort types (Slipher)
- Fix bad depth buffer reads with depth fade (Slipher)
- Disable GLU with GLEW (Slipher)
- Fix libcurl deprecation warning (
CURLOPT_PROTOCOLS
) (Slipher) - Require UBO for material system (Slipher)
- Clean-up remnants of forward lighting NUKE (Slipher)
- Simplify
R_CreateBuiltinImages
(Slipher) - Don’t generate depth shader for heat haze (Slipher)
- Register
gfx/2d/bigchars
withRSF_2D
(Slipher) - Fix
/listshaders
alignment for 0-stage shaders (Slipher) - Remove unused
console
shader (Slipher) - Mutualize
ColorShiftLighting
decision (Illwieckz) - Implement native sRGB support (Illwieckz)
- Add the
EXP_CLAMP
bit to clamp the expression value (Illwieckz) - Move VBO/vertex specification to separate headers, void circular dependencies when adding GLVAOs (Reaper)
- NUKE
R_CreateStaticIBO2
(Reaper) - Use VAOs to switch most vertex formats (Reaper)
- Silence a “maybe uninitialized vec3 use” warning in Material code (Illwieckz)
- Replace deprecated c++ syntax (Reaper)
- Use
shrink_to_fit
to deallocate inFS_FCloseFile
(Reaper) - Fix useless allocations in VM FileSystem functionality (Reaper)
- Remove bindless_image layout declaration from compute header (Reaper)
- Disable realtime lighting when
GL_ARB_texture_float
isn’t available (Illwieckz) - Only read
GL_MAX_UNIFORM_BLOCK_SIZE
whenGL_ARB_uniform_buffer_object
is available (Illwieckz) - Fix SSAO + material system on AMD (Slipher)
- Avoid a DSA function with VAOs (Slipher)
- Make the sRGB conversion work in older GLSL (Illwieckz)
- Don’t log bad uvs for white/black lightmaps (Reaper)
- Fix ShaderProgramDescriptor definition order (Reaper)
- Fix log spam due to bad autosprite configuration (Reaper)
- Remove a few unread variables (Slipher)
- Don’t draw global fog twice (Slipher)
- Split
RB_RenderPostDepthLightTile
into two functions (Slipher) - Let dynamic lights render with
r_depthShaders 0
(Slipher) - Remove unused depth tile calculations (Slipher)
- Fix
GLIMP_LOGCOMMENT
crashes (Slipher) - Do not load heatHaze map when heatHaze is disabled (Illwieckz)
- Do not re-enable stages after parsing (Illwieckz)
- Log error message for
curl_easy_setopt
(Slipher) - Disable precompiled headers on macOS (Illwieckz)
- Make screenSpace work when
GL_EXT_gpu_shader4
is missing (Illwieckz, Slipher) - Add some support for C++17-23 (Reaper)
- Do not require
GL_ARB_texture_float
in shader (Illwieckz) - Update googletest submodule to v1.16.0 (Slipher)
- Clean-up remnants of non-UBO lighting code (Slipher)
- Fix lighttile shader texture bindings (Slipher)
- Fix inconsequential texture binding mistakes (Slipher)
- Remove SetShaderProgramUniforms from material shaders (Slipher)
- Remove
GLShader_depthReduction::SetShaderProgramUniforms
(Slipher) - Split
glconfig_t
/glconfig2_t
intoWindowConfig
/GLConfig
(Reaper) - Pre-build more GLSL shaders (Reaper)
- NUKE unused
MarkShaderBuildFog
(Reaper) - Report game version in userinfo (Kai)
- Add the
USE_CPP23
option to CMake (Reaper) - NUKE
sseLoadVec3Unsafe
(Reaper) - Suppress broken GCC flag (Reaper)
- Fix C++23 flags (Slipher)
- Path stripping flags (Slipher)
- Fix compiler flags (Reaper)
- Fix stack overflow with
PrintStackTrace
(Reaper) - Make the
StackTrace
logs less noisy (Reaper) - Clean-up
DaemonFlags
(Reaper) - Clean-up unused
glConfig
(Reaper) - Fix
vid_restart
broken byglConfig
change (Slipher) - Add
r_materialSeparatePerShader
to debug materials (Slipher) - Mark user-registered shaders for building (Slipher)
- Adjust marking shaders for building (Slipher)
- Fix badly architectured audio file reads (Reaper)
- Add more material system debug commands (Reaper)
- Remove padding from end of material uniform struct (Slipher)
- Don’t use assert shorthands in headers (Slipher)
- Fix bad material SSBO uniform layout for multiple of 16 (Slipher)
- Rewrite material system uniform SSBO packing (Slipher)
- Add back padding to material uniforms struct (Slipher)
- Clarify function of material uniform struct packing (Slipher)
- Material uniform packing: add back arrays (Slipher)
- Detect Apple hardware and driver (Illwieckz)
- Allow software rendering in macOS virtual machines (Illwieckz)
- Avoid creating useless liquidMapping FBO (Slipher)
- Material System: always write all of a given stage’s data (Reaper)
- Don’t set
CMAKE_FIND_ROOT_PATH
in toolchain files (Slipher) - Download test deps archive when not released yet (Illwieckz)
- Copy all macOS frameworks from deps (Illwieckz)
CURL_STATICLIB is now injected by
CURLTargets.cmake
(Slipher)- Switch to SDL3 (Reaper, Illwieckz, Slipher)
- Disable the “accent menu” on macOS when using SDL3 (Slipher)
- Fix
r_displayIndex
on Linux (Slipher) - Only include
gmp.h
on MSVC to disable a warning (Illwieckz) - Remove erroneous newlines from log messages (Slipher)
- Clean C-isms from
GLimp_DetectAvailableModes
(Slipher) - Fix inconsistent
r_displayIndex
logic (Slipher) - Override SDL’s architecture detection (Slipher)
- Properly set the APPID the SDL3 way, drop the SDL2 setting (Illwieckz)
- Disable DPI scaling (Illwieckz)
- Remove buggy part of
r_separateMaterialPerShader
(Slipher) - Fix Xonotic heightmaps in material system (Slipher)
- Add cvar to skip some shader build logs (Reaper)
- Don’t draw global fog twice in the Material system (Slipher)
- A little bit of fog-related cleanup (Slipher)
- Make global fog independent of view direction (Slipher)
- Fix wrong coordinate system used for fog (Slipher)
- Allow reusing image requested with lower min detail (Slipher)
- Linearize fog colors (Illwieckz)
- Fix wrong assert about material uniforms (Slipher)
- Refactor glTextureBarrier code into function (Slipher)
- Add texture barrier for depth sampler in more spots (Slipher)
- Fix material system GLSL compile error on Intel (Slipher)
- Fix crash on dummygame load with
r_lazyShaders = 1
(Slipher) - Clean up outdated comment about GLSL embedding (Slipher)
- Auto-generate GLSL shader list file (Slipher)
- Do not assume a shader without a stage is fog (Illwieckz)
- NUKE unused FBO creation code (Slipher)
- Remove references to GL renderbuffers (Slipher)
- Substitute
GL_FRAMEBUFFER
withGL_DRAW_FRAMEBUFFER
(Slipher) - Optional target parameter for
R_BindFBO
(Slipher) - Add
BlitFramebuffer
function toGL_fboShim
(Slipher) - Fix missing
FBO shim
for glFramebufferTexture3D (Slipher) - Reduce log spam on registering shader with different flags (Slipher)
- Make
R_RemapShader
multiple registration-aware (Slipher) - Improve fog vertex interpolation (Slipher)
- Count Fog full distance, not only along view axis (Slipher)
- NUKE fog image but try to emulate it exactly in GLSL (Slipher)
- Use a piecewise function for distance to fog alpha (Slipher)
- Mark
lightMappingMaterial
shaders for building correctly (Reaper) - Add extended log options (Reaper)
- Add
STRIP_SOURCE_PATHS=OFF
to fix GDB stacktrace and Linux profilers like Orbit (Illwieckz) - Rework the internal image detection (Illwieckz)
- Do not rely on previously set data for
cinematic
, numberize and rename (Illwieckz) - Resize builtin images as 1×1 (Illwieckz)
- Simplify builtin color image name parsing, forget about unused aliases (Illwieckz)
- Rename the builtin images (Illwieckz)
- Make the black builtin image opaque (Illwieckz)
- NUKE the red, green and blue builtin images (Illwieckz)
- Rename the builtin font images (Illwieckz)
- Use
GL_RGBA8
explicitly for glyphes (Illwieckz) - Remove outdated comment about
map_restart
(Slipher) - NUKE the
sv_floodProtect
cvar (Slipher) - Rework and migrate server cvars (Slipher)
- Define constants for network rate limits (Slipher)
- Clean up GeoIP remnants (Slipher)
- Fix missing deform index for
fogQuake3
shaders (Slipher) - Treat shader deform index like a GLSL macro (Slipher)
- Use external deps if the directory exist and add an option to not use libs from them (Illwieckz)
- Only set
-march
when the architecture is known (Illwieckz) - Fix breakpad linking on Linux (Illwieckz)
- Add a conditional file generation helper (Illwieckz)
- Use the conditional file generation helper to generate
shaders.cpp
(Illwieckz) - Latch the
r_arb_texture_barrier
cvar (Slipher) - Copy depth buffer if texture barrier is unavailable, fix broken depth fade on Apple Silicon (Slipher)
- Fix
SDL_SetWindowFullscreen
error checking (Slipher) - Partially fix black loading screen on Mac (Slipher)
Native Client:
- Strip newlines from NaCl Windows error string (Slipher)
Breakpad:
- Merge upstream to get DWARF5 support, port the MinGW support (Illwieckz)
External deps:
- Migrate
external_deps/cygtar.py
to Python3 (Slipher) - Fix script incompatible with Mac’s bash (Slipher)
- Fix pkgconfig macos build (Slipher)
- Remove pkgconfig from Windows list (Slipher)
- Don’t munge SDL config (Slipher)
- Fix import lib paths for MSVC (Slipher)
- Check for bad DLL dependencies (Slipher)
- Fix GLEW armhf build (Slipher)
- Fix GLEW windows build (Slipher)
- Print error when curl not found (Slipher)
- Ensure existence of cmake directory (Slipher)
- Install macos frameworks in
lib/
(Illwieckz) - Fix DMG mounting on macOS (Illwieckz)
- Do not rebuild NaCl runtime outside of
linux-amd64
(Illwieckz) - Add ncurses to Linux dependencies (Illwieckz)
- Fix JPEG and OpenAL download (Illwieckz)
- Fix SDL2 windows build (Illwieckz)
- Add CMake and configure wrappers (Illwieckz)
- Use
-O3
and-fPIC
for all packages (Illwieckz) - Bump lib versions (Illwieckz)
- Enable and force intrinsics for multiple libraries (Illwieckz)
- Avoid libwinpthread dependency on JPEG dll (Slipher)
- Rework the OpenAL build (Illwieckz)
- Bump macOS requirement to 10.14 because of OpenAL (Illwieckz)
- Disable Nettle fat (Illwieckz)
- Do not install Linux shared libs (Illwieckz)
- Strip static libraries (Illwieckz)
- Use the same
STRIP
everytime we need to strip something (Illwieckz) - Refactor the GLEW build (Illwieckz)
- Check for absolute paths in result (Slipher)
- Make pkg-config working when cross-compiling (Illwieckz)
- Disable
-fpic
when building Nettle, we already use-fPIC
to fix the arm64 build (Illwieckz) - Update SDL to SDL3 (Illwieckz, Slipher)
- Disable SDL3 deps on unwanted audio libs (Slipher)
- Remove the SDL workaround for missing
bin/
folder (Illwieckz) - Deduplicate the nproc guess (Illwieckz)
- Rework the virtual platforms (Illwieckz)
- Improve extract, build and install logging (Illwieckz)
- Deduplicate build iterating (Illwieckz)
- Reformat and reword the help message (Illwieckz)
- Rework the help and error messages, also fix a bug (Illwieckz)
CI:
- Fix macOS (Reaper)
- Update compiler and OS versions (Reaper)
- Run client tests for Linux native builds (Slipher)
works good.
CPU AMD Ryzen 9 7945HX
GPU Navi 31 Radeon RX 7900M
Mesa Version 25.2.3~kisak1~n
Vulkan Instance Version: 1.4.321
Linux 6.16.9-amdr18