Unvanquished 0.55.5, polishing it

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!

The new ban window by Grise.
The new ban window by Grise.

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.

A dretch wanting to play in the Vega map.
We don’t have that much screenshots to show, so here is a dretch wanting to play with you!

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.

Unvanquished + SDL3 = Love
Unvanquished + SDL3 = Love

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.

On the left: legacy naive lighting, on the right: colorspace-aware lighting.
On the left: legacy naive lighting, on the right: colorspace-aware 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! :bsuit:

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 in tr_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 to u_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 with RSF_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 in FS_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 when GL_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 into WindowConfig/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 by glConfig 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 with GL_DRAW_FRAMEBUFFER (Slipher)
  • Optional target parameter for R_BindFBO (Slipher)
  • Add BlitFramebuffer function to GL_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)

2 thoughts on “Unvanquished 0.55.5, polishing it”

  1. 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

Leave a Reply

Your email address will not be published. Required fields are marked *