crazykickboxer

/ Warzone 2100 / RTS

Holo Battlefield

Overview

A 1999 RTS, scanned

Holo Battlefield is a Vulkan particle renderer built into Warzone 2100. It draws the real terrain, the real unit and structure meshes, and the real combat state as dense fields of points, using the game's own textures, transforms and visibility rather than a substituted scene.

Terrain is sampled from the actual legacy fan or HQ surfaces using area-weighted triangle distributions, with barycentric placement driven by nested low-discrepancy identities and a fixed jitter. Those identities are seeded from the map's height and texture data and stay stable across quality changes, so raising detail adds points rather than reshuffling the ones already there. Sampling happens at load or when geometry is edited, never by rebuilding the cloud each frame.

Vehicles and structures reuse cached object-space templates transformed per instance, so hundreds of droids share one sampling pass. Authored UV colour, alpha cutouts, team masks and normals stay authoritative, and existing selection, damage, construction, repair and attachment state drives what you see.

A compute pass compacts the visible, stable identities into bounded indirect draw lists. Opaque support writes depth; fine emission and transparent effects are drawn separately, then HDR bloom and tone mapping run before the interface is composited on top.

An unofficial fan project, not affiliated with the Warzone 2100 Project. Every frame on this page is unmodified engine output.

Specification

Tech spec

Holo Battlefield technical specification
HostWarzone 2100, originally released 1999
BackendVulkan, Release C++ build
GPU requirementsCompute, storage buffers, indirect draws, large points, RGBA16F targets, D32 depth
FallbackUnsupported hardware keeps conventional Vulkan or OpenGL rendering
Terrain samplingArea-weighted triangles, barycentric, low-discrepancy identities with fixed jitter
Model samplingCached object-space templates, instanced per unit or structure
CullingCompute compaction of stable identities into bounded indirect lists
Model density4,400 samples per 10,000 square model units before modifiers
Surface caps32,768 to 131,072 per component across Low to Cinematic
Template cache2,097,152 samples
Tone mappingManual exposure, ACES highlight compression, six bloom resolutions
Profiling37 asynchronous GPU timestamps, plus CPU work, present wait and allocation counters
Tests119,753 checks, 32 compiled shader variants, 73 launcher checks
Reference deviceNVIDIA RTX 2050, Ryzen 5 7535HS, Windows x64

Features

What it does

  • Stable identities. Per-point frustum, visibility and nested level-of-detail checks keep a sample's identity as camera density changes, so the cloud does not swim when you move. Steep tiles can carry up to 8,192 candidate samples at High and above before global normalisation.
  • Filled, not wireframe. Surface, crease and team contributions were balanced so objects read as solid. Large meshes carry their true sample spacing through instance padding, which fixed an earlier class of holes where capped density and particle support disagreed.
  • Real lighting. Normal-based moon and sky illumination, approximate roughness and specular response, short heightfield contact and horizon samples, and the game's own dynamic lights, all shading depth-writing surfels.
  • Size hierarchy. Point-size classes derive from identity hashes, creases, silhouettes, distance and heat. Terrain stays fine; model edges and rare emitters get stronger centres. Selective HDR gain lifts emitters without brightening every material.
  • An optional cinematic lens. Axial distance is reconstructed from sampled depth and the inverse view projection, then a fixed 24-sample circular gather with relative-depth rejection blurs outside a configurable sharp band. Emitter discs are energy-normalised and capped, dim terrain is never inflated, and the interface stays sharp because it is drawn afterwards. Off by default in normal play.
  • Combat you can read. Real events drive flashes, warm fire lobes, ballistic sparks and debris, illuminated smoke and projectile presentation. Visual hashes and graphical time are used deliberately so none of it consumes the deterministic simulation's randomness.
  • A functional interface. The optional dark cyan skin recolours panels, frames and scan details through native drawing paths. Widget locations, hit testing, queues, tooltips, selection, minimap interaction and the semantic health, team and status colours are all untouched. It is real game UI, not a decorative overlay.
  • Comparison built in.holocompare switches between the previous and current detail passes, holoprofile runs a 240-frame warmup and 300-frame measurement, and choosing the classic renderer returns the conventional world.

Water

Reflections that keep the rules

Water follows the real map footprint across up to eight separate levels, with dark depth attenuation, wave normals and a Fresnel sky and moon response. Four world-anchored directions and wavelengths replaced an earlier three-direction field, and reflections sample that field at the receiving point so crests modulate the highlight and glints stretch along the wave.

Reflections show visible real model and effect particles, and this is the part worth stating plainly: the game's visibility rules are preserved inside the reflection, so a reflection can never reveal an opponent you have not scouted. A prettier implementation that ignored that would be a competitive exploit.

Shorelines get a spatially broken wash and restrained foam. Real water impacts throw ballistic spray and three expanding ripple populations that live for roughly one and a half to two seconds, stop at non-water tiles, and draw from the same bounded effects capacity as everything else.

Distance and valley haze, cool ambient light, sky lighting and the game's actual smoke supply atmospheric depth. No unrelated backdrop scenery was substituted to make the screenshots look better.

Budgets

Five presets, hard caps

Every preset is a set of explicit capacities rather than a vague quality slider. These are ceilings, not guaranteed visible counts.

Particle budgets by quality preset
Low4,000,000 terrain anchors, 32,768 dynamic, 65,536 wreckage, density target 1.0
Medium10,000,000 terrain anchors, 65,536 dynamic, 131,072 wreckage, density target 1.4
High24,000,000 terrain anchors, 131,072 dynamic, 262,144 wreckage, density target 2.0
Ultra32,000,000 terrain anchors, 196,608 dynamic, 393,216 wreckage, density target 2.5
Cinematic40,000,000 terrain anchors, 262,144 dynamic, 524,288 wreckage, density target 3.0

Deliberate stress tests were run past capacity. High averaged 879 failed allocations per frame and Medium 428. Those are counted, bounded drops rather than hidden overflow, which is why the counters exist.

Measurements

Measured on one machine

Recorded renderer measurements by stage
Baseline, live1.02 M visible, 1.96 ms CPU, 10.09 ms GPU, 515 MiB
High, lake scene2.24 M visible, 1.39 ms CPU, 14.21 ms GPU, 717 MiB
High, stress3.98 M visible, 4.04 ms CPU, 27.22 ms GPU, 717 MiB
Medium, stress1.51 M visible, 3.61 ms CPU, 12.86 ms GPU, 358 MiB
Latest, sharp3.12 M visible, 1.55 ms CPU, 20.01 ms GPU, 745 MiB
Latest, cinematic lens3.12 M visible, 1.56 ms CPU, 20.23 ms GPU, 745 MiB

Scene-specific observations on one development device, not public frame-rate guarantees. The baseline used a 1280x720 internal resolution and the later figures 1600x900, so they are not a like-for-like comparison. Combat populations differ between scenes, CPU work excludes present wait, and the final comparisons ran with validation layers enabled. The sharp and cinematic pair is directly comparable: same resolution, same budgets, 23,992,060 terrain anchors and 861,829 templates, zero dropped allocations in both.

Launcher

Sixty-four settings, safely written

A native C# WinForms launcher starts the game. The top row selects the enhanced Vulkan renderer, classic Vulkan or OpenGL, resolution, display mode and quality from Low to Cinematic. Six tabs expose particles and detail, lighting and colour, the cinematic lens, water and atmosphere, combat and effects, and advanced settings.

Its schema is generated from the engine's own settings, so the 64 fields carry the real defaults and ranges and editable numeric dropdowns validate against them rather than against a duplicated list that could drift.

Writing the configuration is the part that had to be careful. The INI merge preserves unrelated keys, comments and sections, removes duplicate managed keys, and saves atomically while retaining a backup. A running-game guard prevents competing writes, paths resolve relative to the executable, and process launch uses Windows argument quoting without shell interpretation.

Honesty check

What is not implemented

The renderer is substantially upgraded and playable. These are the things it does not do, published rather than left for you to discover.

  • No full-scene ray tracing. Reflections have limited coverage, terrain itself is not reflected, and there is no general wake history or shockwave refraction.
  • Smoke is not globally sorted. Small GPU combat-smoke populations are not sorted across the scene and are not raymarched volumes.
  • Contact lighting is approximate. Short heightfield samples, not full model shadow mapping or ambient occlusion.
  • Not delivered: automatic exposure, general wakes and chromatic aberration.
  • Close surfels and subpixel aliasing remain possible. Moving-camera review found no obvious redistribution, but that is qualitative evidence rather than exhaustive proof.
  • Foundation edits can stall. Exceptional refreshes reached roughly 328 ms for 591,461 samples. That is an optimisation limitation outside steady-frame averages.
  • Validation is concentrated on one Windows and NVIDIA device. Broad hardware coverage, multi-machine network testing and cross-version save certification are absent. The renderer is built to avoid consuming simulation randomness, but that is a design property, not a certified multiplayer compatibility claim.
  • The launcher needs Windows and .NET Framework and its expected relative runtime layout.

Media

Gallery