Hello grangers! While releasing Unvanquished 0.56 (check it out, it’s great!) we were short in time and could not go deep in all the changes. Let’s turn the lemon into lemonade, as this gives us the opportunity to write another blog post and to go deeper in details. Yay! 😋️
This blog post completes the first one and focuses on the game data and the data production pipeline: fixes and touch-ups for the game levels and textures, but also toolkit improvements and new features we provide to game level designers and texture artists.

Map tooling
The new build preset for maps (game levels) now uses area light as backsplash light, which is more consistent and gives more predictable results. We added specific material keywords to the Q3map2 map compiler (from the NetRadiant suite) to give the option to chose old or new behaviors.
For example when porting an old map and wanting to keep the old behavior on specific light emitting shaders, or when a buggy render is wanted from a light emitting shader for artistic license, the q3map_backsplashPoint material keyword can be used. Also when using old build presets using the old backsplash algorithm, the q3map_backsplashArea material keyword can enforce the new algorithm explicitly on specific light emitting shaders.
We also added the q3map_fast material keyword to force a specific light emitting shader to use the historically wrong short falloff. It can be useful when rebuilding old maps relying on the wrongness of the short light falloff, for example when that short light falloff was used for some special effects and for painting colors in a way light can’t look in the real world. Q3map2 already provided the q3map_noFast keyword for doing the contrary; now both options are available.
The q3map_backsplashPoint, q3map_backsplashArea, and the q3map_noFast shader keywords were added by Illwieckz to Q3map2.
Other fixes were implemented for making the tooling more robust, like fixing bugs.
Mappers need to rebuild Q3map2 for now to be able to use those new keywords, until a new release of NetRadiant is published. It should happen in a close future and it will bring many other improvements that are not specific to Unvanquished.
Build tooling
The Urcheon data build and packaging tool now supports the ability to use Q3map2 to compile as ASE or OBJ format the maps models designed in NetRadiant and stored in its .map format. This is needed for building large maps that have some parts of the game level done as separate .map files, or just map models done this way. This feature has been implemented by Illwieckz.
Texture tooling
In this section, the word map and mapping is used for textures used in materials. The game design lexicon can sometime be confusing!
Illwieckz implemented in our Sloth material generator the ability to make it skip specific textures to not generate materials for them, to keep the ability to generate materials for a whole texture set while making possible to write some of them by hand for extra control.
Illwieckz extended Sloth to automatically generate single-sided variants of translucent textures. That is useful when applied on translucent surface (like glass) separating the playing area with the outside. It can help to avoid some deluxe mapping bugs as deluxe mapping can’t be dual-sided. On the following screenshots, the glass opacity is exaggerated so it makes the bug obvious:
|
|
|
Our official texture sets now ship those variants starting with Unvanquished 0.56.
Illwieckz also implemented in Sloth the ability to configure some textures to use linear color maps or linear specular maps. Color maps being loaded in linear space is useful for some special effects and porting some existing translucent textures.
Specular maps should be in linear space, but historically, specular maps were introduced in games before game engines cared about colorspace. So most of the available texture sets were done with specularmaps in sRGB space. So to make it easier, specular maps are assumed to be “the old way” in sRGB space, and one can configure a single material or a whole texture set to be “the correct way” in linear space.
Some Unvanquished materials are already using those tweaks starting with Unvanquished 0.56.
Here it’s just a pragmatic choice: the real world is full of specular maps done the old way, so we assume they are done the old way and we give artists the ability to do them the right way from the start.
This is similar to what we did with normal maps before: in contrary to some engines like DarkPlaces, our engine follows by default the DirectX normal map convention despite our engine being written for OpenGL. That’s because XreaL mimicked Doom 3 which itself, despite being written for OpenGL, followed the DirectX convention (maybe because of the Nvidia plugin for Photoshop at the time?). So the default behavior is the inherited format, but we provide the ability to customize.
The same happens with specular maps: by default we handle them the wrong-but-historical way to allow us to load all those historical files the expected way, and then we offer the ability to customize.
Newer files like PBR maps are unaffected as they are expected to be stored in linear space and packed the ORM way from the start.
Build presets
In the following, we use the word map for a game level. Did I say the game design vocabulary was messed up?
We talked a bit about it in the previous blog post, how we now provide a preset for the linear blend regime and some presets for “building maps like we did before”. We not only added a build preset to build maps “like before 0.56”, but we also added a build preset to build maps “like before 0.52”. This build preset is the closest to what Tremulous did, but uses higher resolution. For example it does bogus short light falloff on purpose, like in 1999.
The new NetRadiant build menu entry for the linear blend regime also ships those two changes: area backsplash lights and no dirt mapping anymore.
As we just said, the backsplash light of light emitting shaders now uses area lights, which is the algorithm already used for their main light. This looks better and produces a more predictable result. The look of those backsplash may differ a bit, but it happens that it blends even better with the linear blend regime, which isn’t surprising as it adds consistency to something being more physically correct to begin with. Some lights may benefit minor polishing tweaks, but most of them don’t need any tweak. What’s more, some lights that would have required tweaks to be baked with area backsplash before the linear blend regime can now be baked with area backsplash with the linear blend regime without tweaking them.
Dirt mapping is now disabled in new build configuration. The buggy shadows seen in the screenshots above will be gone when rebuilding the maps with the new build preset.
Dirt mapping is a non-physical algorithm to simulate shadows in corners caused by occlusion. It has many unwanted side effects. One is the darkening of corners where skyboxes and walls meet; another is the unwanted darkening of some patch intersection, painting shadows inside natural curves.
Our lightmaps are now using enough precision (for more than a decade already) to actually render and store natural shadows in corners if light rays happen to not reach those areas in a physically correct way. So we don’t need anymore such tricks to work around the lightmap resolution limitation due to the computation power or VRAM from the previous millennium when Quake3 was still the cutting edge. This cancels a lot of bugs in precomputed lightmaps at the same time, so it’s all good.

Like the old point backsplash light, dirt mapping is kept enabled in the older build presets we still provide for those needing to rebuild a map the old way. Things can still be done the old way, but that comes with the same bugs as before, per definition.
Models
RedSky edited the armoury model: he resized and translated the model in source, and fixed the bottom of the armoury feet that were missing some faces. This was visible when placed on translucent surfaces.
Slipher adjusted the rocket missile model. The models now use normal culling so back faces aren’t drawn on top, and rotation angles are now updated since gamelogic is being fixed to use the
correct coordinate system.
Reaper updated the dynamic light values of weapons to adapt to engine-side changes.
Maps and texture sets
So, translucent textures are now generated with a single-sided variant when the texture set is managed by Sloth.
Some translucent textures received minor adaptations to make them work in both the old “naive” blend regime and the new linear blend regime.
Illwieckz reworked some of the default materials from the common texture set. This texture set is providing functional materials (like hint, nobuild, things like that), but also base colors. The RGB values of those color materials are now painted in engine without loading any file.
Illwieckz added the common/skycaulk functional material. It acts like a caulk surface (solid, sealing the map, but not rendering anything) but isn’t painted on minimap like a sky texture. It is meant to be used on the invisible sides of sky brushes, to avoid sky brushes being painted on the minimap.
The Chasm map is the first map to use the skycaulk material.
Illwieckz also implemented some geometry optimization to the Chasm map and some linear tweaks to its snowflake particle material.
|
|
|
Illwieckz worked on the Vega map to improve its shadows, like making some transparent textures casting shadows properly, or lights producing softer shadows, by making neon lights emitting light as a surface, not as a point. They were already implemented a light emitting shaders, but their configuration made them acting like point lights. Their light intensity haven’t been modified, they now just emit light like a surface should. On the following screenshots, we can see on the how the top left grates are now letting light go through them:
Illwieckz also tweaked light subdivision in some maps to make them look better. Light subdivision is the mechanism used by the map compiler to emulate large lighting surfaces (like neons): instead of spawning a single light source, it spawns multiple smaller light sources to over the whole surface. The default subdivision (inherited from the Paleolithic era) is sometimes more than suboptimal but also very fast, so it’s a good idea to keep it as a default for most lights and tweak the ones that suffer from it. The Vega map is among the maps that received such care.
Slipher removed the polygonOffset keyword from Vega grate textures, it was a mistake.
The glass texture from the trak5 texture set, used in Parpax, Station15 and Spacetracks, received linear compatibility tweaks using the new ifStatic feature. The ifStatic feature was implemented by Slipher in engine, as mentioned in the previous blog post, and Illwieckz made use of it to make that glass texture compatible with both the old “naive” and the new “linear” rendering pipeline.
Illwieckz made sure those glasses in Station15 and Spacetracks use the said onesided variant to avoid deluxe mapping glitches, and reworked their alignment for consistency.
Slipher reworked the waterfall haze of Station15 to use using soft particles for better looking.
Yet again in the Station15 map, Reaper fixed disappearing plants with wrong alpha and culling and fixed back-face culling being applied to one-sided plants.
The Forlorn map received a fix for some overlapping brushes, and its glass also got tweaked for compatibility with the linear blend regime, those two improvements have been done by Illwieckz. We merged a navcon for battlesuits for the Forlorn map by BMorel. It was submitted long time ago but had been overlooked.
Sweet reworked the texture application of a forcefield surface in the Platform23 map and Illwieckz implemented linear tweaks for that forcefield effect. This may be improved in the future, but what was done is good enough to restore the gameplay element of it.
Now that all stock maps got rebuilt with the new linear blend regime, they all received new levelshots.
NetRadiant – master branch
- q3map2: fix a division by zero – Illwieckz
- q3map2: add the
q3map_backsplashPoint/Areashader keywords – Illwieckz - q3map2: add the
q3map_fastoption to force the usage of a fast light falloff on a light shader – Illwieckz - q3map2: some memory workaround and fix – Illwieckz
- q3map2: do not set explicit Unvanquished minimap background color, let the game decide – Illwieckz
- q3map2: workaround a stupid GCC bug doing a buffer overflow in
memset()– Illwieckz - q3map2: also write the Unvanquished minimap bounds – Illwieckz
- And more…
Sloth – master branch
- generate culled and non-culled variants of translucent textures – Illwieckz
- add support for rawColorMap, rawSpecularMap, and linear variants – Illwieckz
- add the
ignorekeyword to not generate a shader for a texture – Illwieckz
Map editor support – 0.56 branch
- buildmenu: reword the sRGB options the explicit way, also use them on BSP stage – Illwieckz
- buildmenu: disable dirt mapping in the new release preset – Illwieckz
- buildmenu: add release build for the linear pipeline, provide old release build – Illwieckz
Urcheon – 0.56 branch
- urcheon/texset: fix sloth file listing – Illwieckz
- profile/map: reword the sRGB options the explicit way, also use them on BSP stage – Illwieckz
- profile/map: disable dirt mapping in the new release preset – Illwieckz
- profile/map: add release build for the linear pipeline, provide old release build – Illwieckz
- urcheon/action: move
compile_aseandcompile_objafter iqm model and shader generation – Illwieckz - urcheon/action: add
compile_obj– Illwieckz - urcheon/action: add
compile_aseand use it for mapmodels – Illwieckz
map-antares – 0.56 branch
- meta: update levelshot – Illwieckz
map-chasm – 0.56 branch
- meta: update levelshot – Illwieckz
- materials: use
rawColorMapin chasm_custom – Illwieckz - map: cut-out the unseen part of a terrain – Illwieckz
- map: cut-out the unseen part of a cliff – Illwieckz
- map: reshape the unseen part of a rock – Illwieckz
- map: cut-out the outside size of a terrain brush – Illwieckz
- map: cut-out the unseen size of a terrain brush – Illwieckz
- map: cut-out the outside size of a rock – Illwieckz
- map: delete some unseen terrain brushes behind a cliff – Illwieckz
- map: delete some unseen cliff brushes behind another cliff – Illwieckz
- map: delete some unseen terrain brushes behind a cliff – Illwieckz
- map: cut-out the unseen size of a rock – Illwieckz
- map: delete some unseen terrain brushes behind a cliff – Illwieckz
- map: move some template brushes to a less noticeable place – Illwieckz
- map: delete some unseen terrain brushes on the outside – Illwieckz
- map: delete some unseen rock brushes – Illwieckz
- map: cut-out the unseen size of a rock – Illwieckz
- map: reduce the unseen size of a rock – Illwieckz
- map: use skycaulk – Illwieckz
map-forlorn – 0.56 branch
- meta: update levelshot – Illwieckz
- map: fix two brushes overlapping – Illwieckz
- materials: use
rawColorMapinforlorn_custom– Illwieckz - Create
forlorn-human_bsuit.navcon– Bmorel
map-parpax – 0.56 branch
- meta: update levelshot – Illwieckz
- map: use
shared_trak5/glass_onesidedto workaround deluxe mess on glass – Illwieckz
map-perseus – 0.56 branch
- meta: update levelshot – Illwieckz
map-plat23 – 0.56 branch
- meta: update levelshot – Illwieckz
- materials: set
rawSpecularMaponrock01– Illwieckz - materials: use
rawColorMapinplat23_custom– Illwieckz - mirror a forcefield texture – Sweet
map-spacetracks – 0.56 branch
- meta: update levelshot – Illwieckz
- map: align some glass in Dock 2 – Illwieckz
- map: let NetRadiant delete empty
func_groups– Illwieckz - map: use
shared_trak5/glass_onesidedto workaround deluxe mess on glass – Illwieckz
map-station15 – 0.56 branch
- meta: update levelshot – Illwieckz
- map: align more glass – Illwieckz
- map: a glass door requires the glass to be twosided – Illwieckz
- map: align glass texture on cargo bay hall – Illwieckz
- map: align glass texture on appreciation annex – Illwieckz
- Use soft particles for waterfall – Slipher
- map: use
shared_trak5/glass_onesidedto workaround deluxe mess on glass – Illwieckz - Fix disappearing plants with wrong alpha and culling – Reaper
- Fix back-face culling being applied to one-sided plants – Reaper
map-thunder – 0.56 branch
- meta: update levelshot – Illwieckz
- materials: set
rawSpecularMaponrock01– Illwieckz - Fix remapped shader not found – Slipher
map-vega_src.dpkdir – 0.56 branch
- meta: update levelshot – Illwieckz
- map: tweak higher resolution shadows and light subdivision in selected places – Illwieckz
- map: fix shadows on patch surfaces in Observatory – Illwieckz
map-yocto_src.dpkdir – 0.56 branch
- meta: update levelshot – Illwieckz
- materials: reduce backsplash of ex lights – Illwieckz
- map: fix mistakenly caulked surface – Illwieckz
- materials: reduce backsplash of q4power lights – Illwieckz
- map: fix light stuck in ceiling – Illwieckz
res-buildables – 0.56 branch
- arm: delete now useless iqe.cfg – Illwieckz
- arm: do a iqe→iqm→iqe round-trip conversion and fix NaN – Illwieckz
- materials: use
rawColorMapin medistat – Illwieckz - Patch-up arm model – RedSky
res-players – 0.56 branch
- Fix double loading of human model texture – Slipher
res-weapons – 0.56 branch
- Adjustments to correctly render rocket missile model – Slipher
- Update dynamic light values – Reaper
tex-common – 0.56 branch
- materials: use
$whiteandrgbgenconst for colors – Illwieckz - materials: rewrite portal and mirror using a builtin image – Illwieckz
- materials: use engine builtin images – Illwieckz
- materials: use
mapinstead ofdiffuseMap, there is no lightmap to use – Illwieckz - urcheon: properly copy the transparent tga – Illwieckz
- materials: add
common/skycaulk– Illwieckz
tex-exm – 0.56 branch
- force rebuild sloth shaders with new sloth – Illwieckz
tex-pk02 – 0.56 branch
- materials: set
rawSpecularMaponrock01– Illwieckz - force rebuild sloth shaders with new sloth – Illwieckz
tex-trak5 – 0.56 branch
- materials: edit glass by hand to use
ifStatic linearBlending– Illwieckz - force rebuild sloth shaders with new sloth – Illwieckz
tex-vega – 0.56 branch
- materials: add missing normal map to
trim03b_green– Illwieckz - materials: subdivide
trim03blights – Illwieckz - materials: subdivide
panel05andpanel06lights – Illwieckz - materials: subdivide
panel08alight – Illwieckz - materials: make glass pass light properly – Illwieckz
- materials: make the grates project shadows – Illwieckz
- materials: use
rawColorMapin shared_vega – Illwieckz - Remove
polygonOffsetfrom grate textures – Slipher















🛠️🪛️ Here was our first Unvanquished 0.56 article focusing on code :
https://unvanquished.net/unvanquished-0-56-we-deliver/ 👀️👀️👀️