Unvanquished 0.55.3, tonemapped vampires

Here comes Unvanquished 0.55.3, our third point release in the 0.55 cycle!

A dretch next to an Unvanquished box in the Vega map.
Our fellow dretch is delivering the new Unvanquished update to your door!

More game merges, and some vampires

As stated in the 0.55 blog post in October, we want to focus on the gameplay for the 0.55 cycle, especially merging what’s currently implemented on game servers that acts as a kind of staging areas for the project. This means, as stated on the current roadmap, the first task on the roadmap since October is to merge gameplay changes from Kai and Sweet’s servers.

The most notable thing being delivered is the Vampire mode implemented by Sweet, Kai and Reaper. This is an alternative build point mechanic. In default mode, teams are mining the build points with mining structures (drills, leeches) and are losing them by losing buildables. In vampire mode, each team gets a fixed pool of build points and destroying an enemy buildable captures the build point, actually vampirizing the build point pool of the other team (hence then name). A bar at the top of the screen displays the current state of the game.  The cvar to enable the vampire mode is g_BPVampire. Additionally, servers using vampire mode often tweak build point cvars to use fixed pools without mining structures: set g_maxMiners 0 and (for example) set g_BPInitialBudget 100.

The Vampire mode interface.
The Vampire mode interface.

Among changes by Sweet we merged are the ability for humans to refill their weapon while holding the blaster, various bot fixes like preventing them to fight with a construction kit or making them able to rebuild the reactor and the overmind.

This release also delivers the new vsay and Bot command menus implemented by Grise.

The new Bot tactic menu.
The new Bot tactic menu.

Among other things, Enneract improved the look of the new Chaingun, Gireen lowered the default bot skill, and Reaper reworked the Tyrant trample and attack interactions.

Merged from bmorel’s server is the move of entityType_t in the game logic to make it easier to develop mods while dealing less with engine source changes.

Too early to bloom

As of 0.55.2, bloom looked bad on many maps. The bloom effect was initially developed targeting clamped overbright (max brightness 1x for textures lit by a map’s baked-in lighting). But since 0.55.0 we had unclamped overbright, with max brightness 4x. With a lot of bright pixels on the screen already, bloom goes out of control. It was a problem that bloom could strongly alter the appearance of a map. 0.55.3 dials back the overbright a bit to max brightness 2x (matching default behavior of Quake 3 and Tremulous 1.1), but the effect of bloom could still be large sometimes.

So, with this version, the default behavior is to not use bloom. Selecting a graphics preset will disable bloom. It can also be configured independently under Options > Graphics > Effects.

Those having previously enabled bloom can disable it there, or just reapply they preferred preset. By luck, a new lighting operation, the tonemapper, may limit the effect of bad bloom, but you better disable bloom for now. By delivering this to players we also fulfill the need of mappers like Sweet who requested a way to make sure their maps look as intended on players’ devices.

The Dæmon engine is a project to bring modern rendering techniques to games like Unvanquished from the start, and we are still committed to this objective. So sometimes improvements may conflict with features we had for years, like bloom. Disabling bloom is actually an easy way to keep very active the development of new techniques while keeping some stability content producers are looking for.

Not too late for an update

This point release is also part of our effort to return to a more frequent release schedule. We would have preferred to ship it in February, but there it is! The 0.55.2 version was delivered for Christmas, The 0.55.3 one is ready for Easter! We’re sorry to have missed Valentine’s day. 😉️

Introducing the tonemapper

Reaper continued his impressive and abundant contributions to the renderer, and this time we can highlight the tonemapper! Reaper implemented a Lottes HDR->LDR tonemapper which modifies the light to prevent clamping and conserving details on high and low ends of the lighting range.

The tonemapper is also a ground work for the upcoming adaptive exposure feature!

Reaper also deeply rewrote parts of the engine, and re-implemented the GLSL shader cache in a better way… More details can be found on the changelog below.

An optional contact field for server owners

We now recommend admins of public game servers to fill the contact cvar to add a way to contact them if needed. This is optional and the format is totally free. One can put a forum or chat nickname, an e-mail address or whatever they like.

This can be used for example to reach a server owner who have not updated his server after an important release. For example when the 0.55 version was released, some invisible collision map bugs were mistakenly shipped. So we needed game servers owners to promptly update their servers to prevent players to face those unwanted bugs, and no server owner wants to keep a buggy build running.

Filling this cvar is currently optional but strongly recommended, as it helps to get in touch when needed.

We updated the server configuration sample accordingly.

Some news on ongoing work

A lot of things are being done in the background!

Illwieckz now has a working branch for a linear light blending mode, which is required for physically correct lighting.

Reaper has ongoing work to optimize some skeleton-related IPC to speed-up the model rendering.

Illwieckz and Slipher are working on modernizing our NaCl toolchain and runtime.

As a reminder, we use Native Client as a virtualization technology to sandbox the game code, which makes possible for players to download and securely play games downloaded from online servers. While Native Client is officially deprecated by Google, the WebAssembly alternative is not mature enough for our need. So we have to keep NaCl with us a little bit. Fortunately Google is still maintaining some NaCl components for their own need of already-released Android maintenance. We are then working on rebuilding the Saigo compiler which is based on latest Clang 20, and rebuilding the NaCl runtime.

As a result of those effort, Unvanquished 0.55.3 is already shipping a newly built nacl_loader for Linux on amd64 platform. This fixes the NaCl crash handling that was not working anymore on recent Linux kernels with the old loader we used.

Let’s play!

It’s time to download the game and join a server!

Changelog since the 0.55.2 release

Here follows a list of changes, not exhaustive, but meant to capture most of the work being done:

Game changelog

Gameplay

  • Humans now refill while holding the blaster (Sweet);
  • Cancel the trample when attacking (Reaper);
  • Vampire game mode (Sweet, Kai and Reaper);

Bots

  • Human bots don’t fight with the Construction Kit (Sweet);
  • Default skill is lowered (Gireen);
  • Bots without jetpack don’t use jetpack navigation data anymore (Slipher);
  • Bots can now rebuild the reactor and the overmind (Sweet);
  • Behavior tree fixes (Sweet);
  • Correct for delta angles with goon pounce/barb (Slipher);

User interface (game)

  • Add circle menu for bot commands (Grise, Sweet);
  • Add bind interface for the menu for bot commands (Grise);
  • Updated translations (Many);
  • Add vsay circle menu (Grise);
  • Add bind interface for the vsay circle menu (Grise);

Game media

  • Make the needammo vsay work again (Grise);
  • Fix NaN in a pulse rifle IQE file (Illwieckz);
  • Bake in ambient occlusion and adjust metal_orm of the Chaingun (Enneract);
  • Make ground fire shader entityMergable (Slipher);

Game server

  • Update the server config sample (Illwieckz);
  • Add the contact cvar (Illwieckz);

Framework (game)

  • Lua and FreeType are now built as submodule (Illwieckz).
  • The engine and the game now report the compiler they were built with, making easier to track compiler-specific bugs (Illwieckz);
  • Use type safe for IPC (Slipher);
  • Do not crash if sound is unknown (bmorel);
  • Generate automatic entity IDs for map entities without an ID (Sweet);
  • Add fast lookup for entity IDs (Sweet);
  • Move entityType_t in gamelogic (bmorel);

Rendering (game)

  • Fix an incorrect frame bug in MDV animation (Reaper);
  • Fix acid tube gas being too transparent (Slipher);
  • Fix realLight keyword for particle coloring (Slipher, Reaper);
  • Reorder the cgame data loading (Illwieckz);
  • Fix framerate-dependent animation blending (Slipher);
  • Disable bloom for now (Illwieckz);

Engine changelog

User interface (engine)

  • Add noforward/-forward-only command line arguments (Slipher);
  • Fix out of order shader log messages (Reaper);
  • Add r_materialSystemSkip and r_forceRendererTime (Reaper);
  • List commands in alphabetical order (Slipher);
  • List cvars in alphabetical order (Illwieckz);
  • Add debug info for shader compilation/link time (Reaper);
  • Fix –help output not appearing through a pipe (Slipher);
  • Make the error popup disableable (Illwieckz);
  • Rewrite the GLimp_LogComment() calls (Illwieckz);
  • Make surface parse error messages more meaningful (Reaper);

Framework (engine)

  • Faster and/or more precise reverse square root approximation (Illwieckz);
  • Fix incorrect heatHaze shader macro (Reaper);
  • Identify the game by its name in SDL (Kai);
  • Migrate renderer commands to the C++ interface (Slipher);
  • Fix /net_restart on Windows with running server (Slipher);
  • Fix build NaCl from Visual Studio (Slipher);
  • Add USE_FLOAT_EXCEPTIONS CMake option and common.floatExceptions.* cvars to enable floating point exception trapping (Illwieckz);
  • Add more fault commands to test for floating point exception trapping (Illwieckz);
  • Add “dummy game” cgame module to quickly test how a map renders without a full featured-game (Slipher);
  • Fix generator expressions with VS CMake integration (Slipher);
  • Reorganize files for making possible to build NaCl games with Saigo (Illwieckz);
  • Improve a bit the build script to build external dependencies (Illwieckz);
  • Rebuild the NaCl loader for Linux amd64 (Slipher);
  • Fix fatal C++ exception handling for MSVC native exe (Slipher);
  • Produce NaCl crash dump upon C++ exception (Slipher);
  • Add cvar to disable native exe crash handling (Slipher);
  • Don’t abort for non-main thread NaCl crash (Slipher);

Rendering (engine)

  • Fix unnecessary generic shader permutations (Reaper);
  • Rewrite the packing of color modulation information (Reaper);
  • Fix light styles with u_Color (Reaper);
  • NUKE leftover CPU lightGrid functionality (Reaper);
  • Fix ambientColor keyword (Reaper);
  • Port some rendering cvars to the new style (Reaper);
  • Define appropriate flags for all engine commands (Slipher);
  • Fix bug with 2d drawing GL state (Reaper);
  • Fix crash in GenerateWorldMaterials() (Reaper);
  • Allocate material memory for stages rather than surfaces (Reaper);
  • Fix material system dynamic stages (Reaper);
  • Use UBOs for texData when possible (Reaper);
  • Use a UBO for materials instead of an SSBO (Reaper);
  • Update QuatFromMatrix() from the tracing code to avoid compiler optimization mistakes (Illwieckz);
  • Use faster invere square root in QuatFromMatrix() like it was meant to be (Illwieckz);
  • Use dGPU if both dGPU and iGPU are available on Windows (Reaper);
  • Fix light grid array size calculation to avoid compiler optimization mistakes (Illwieckz);
  • Clean-up GLBuffer interface, use DSA (Reaper);
  • NUKE unused GLIndirectBuffer (Reaper);
  • Clean-up material system buffer bindings (Reaper);
  • Fix loading .dds images with paths prefixed with dds/ (like DarkPlaces/Doom 3) (Illwieckz);
  • Fix glsl_restart with material system (Reaper);
  • Fix alpha = 1 colorMod (Reaper);
  • Detect and rewrite NaN in IQM model (Illwieckz);
  • Workaround for atomic ops on AMD (Reaper);
  • Implement Lottes HDR->LDR tonemapper (Reaper);
  • Fix a crash with r_noportals (Reaper);
  • Fix texture scroll (Reaper);
  • NUKE unused refractionMap/dispersionMap (Reaper);
  • Disable unsupported GLSL extensions on low GLSL version (Illwieckz);
  • Don’t restart the video on macOS when toggling fullscreen (Slipher);
  • Add the setWindowOrigin command (Slipher);
  • Implement partial overbright clamping like Quake 3 (Slipher);
  • Add the r_overbrightQ3 cvar to simulate Quake 3 overbright (Slipher);
  • Fix the UI being affected by subgroup profiler (Reaper);
  • Improve shader building (Reaper);
  • Fix CGEN_IDENTITY_LIGHTING` with 2D drawing (Slipher);
  • Use a simple screenSpace vertex GLSL shader and deduplicate many (Reaper);
  • Change the cameraEffects GLSL shader to use the screenSpace vertex shader (Reaper);
  • Add some non-bitwise alternative for some low-end devices (Illwieckz);
  • NUKE surface sorting by fog and allow merging main surfaces regardless of fogNum (Reaper);
  • Rewrite unpackUnorm4x8() with explicit uint casting and do explicit uint casting in GLSL shaders (Illwieckz);
  • NUKE some duplicated code (Reaper);
  • Move duplicate code from ParseFace() and ParseTriSurf() into ParseTriangleSurface() (Reaper);
  • Move SF_TRIANGLES plane calculation to map loading (Reaper);
  • Add GeometryOptimiser (Reaper);
  • Merge duplicate map vertices (Reaper).

One thought on “Unvanquished 0.55.3, tonemapped vampires”

Leave a Reply

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