Project study / Ryan Rose
Mural AI: native radar simulation, built in C++.
I developed Mural Radar Studio: a native Windows application bringing radar simulation, maritime scenarios, geospatial data and recorded exercises into one engineering project.
At a glance.
- Contribution
- Native C++20 Windows simulation, geospatial integration and recording/replay
- Delivered capability or measured result
- 480 scans across 8 radars with 250 targets each in 7.69 seconds in a local engine test
- Evidence available
- Documented development test; migration ongoing, not a frame-rate or radar-fidelity benchmark
- Configure a maritime scenario
- Run independent radar sensors
- Record complete scans
- Replay and review
The engineering challenge
Mural Radar Studio brings multiple radar sensors, moving vessels, geographic data and operator controls together around a shared simulation clock. Each sensor keeps its own settings, while scenario editing, view changes and exercise replay need to preserve the right application state.
My contribution: native C++ engineering
I worked on migrating the original JavaScript implementation into a native Windows application using C++20, Win32 and Direct2D, built with CMake and Visual Studio/MSVC. The work spans the simulation engine, desktop interface, network services and a separate batch runner for running scenarios without opening the interface.
I used AI-assisted development to iterate on implementation, investigate defects and build repeatable verification. The migration remains in progress, including interface and workflow parity; this is a working development application.
Geospatial data and connected systems
The application works with GeoJSON, HGT, DTED, WGS84 shapefiles and PMTiles, including offline UK mapping and terrain. Network work includes UDP input and output, selected ASTERIX formats, AIS references and NMEA.
AIS contextual references remain distinct from simulated radar detections. Missing terrain and stale data need explicit handling so the interface does not imply evidence that is unavailable.
Recording that preserves the exercise
Recording streams complete scans with pixels, tracks and metadata. Integrity checks, lazy replay and interrupted-tail recovery support reviewing recorded evidence rather than silently re-simulating the exercise. Live, recording and replay states remain separate.
Scenario, workspace and course progress can be saved and restored. Compatibility checks cover older file versions, while empty workspaces should not introduce hidden sensors.
A bounded simulation load test
A documented local development-machine test processed 480 complete scans across eight radars, with 250 targets per radar, in 7.69 seconds. This measures the simulation-engine workload in that test. It is not an interactive frame-rate measurement or a validation of physical radar fidelity.
Verification across the stack
Checks combine core tests, native window messages, actual control events, protocol fixtures and exported renders. Independent fixtures from the original JavaScript application help compare native behaviour. Loopback network tests and save/load checks exercise the application beyond isolated functions.
Visual review also identified inspector stacking, scrollbar, map-label and display-scaling defects. Code correctness, usable interface behaviour and real-world simulation fidelity require different evidence; physical radar fidelity needs separate validation.
The engineering toolkit
C++20, JavaScript, Win32, Direct2D, CMake, Visual Studio/MSVC, UDP, ASTERIX, AIS, NMEA, GeoJSON, HGT, DTED, WGS84 shapefiles and PMTiles, supported by automated regression testing.
Where this work applies
Native desktop tools, simulation and training applications, geospatial software, network integrations and systems that need dependable recording and replay. The useful starting point is a defined scenario and a testable behaviour.
Discuss a similar engineering problem.
Bring one workflow, integration or backend requirement. We’ll discuss the constraints and a practical first step.
Book a 30-minute discovery call ↗