Releases: remileonard/libRealSpace
Release list
little steps near the end
libRealSpace v0.4 — config_build_040
Release date: 2026-05-31
Previous release:fixes_031_build(v0.3.1)
New: Graphical Configuration Tool (config)
A brand-new standalone executable has been added — config — a lightweight ImGui-based configuration editor that lets users tweak all game settings without editing files by hand.
- General tab: resolution picker (auto-populated from SDL display modes), fullscreen toggle, object/world detail sliders, video effects checkboxes (CPC palette, scanlines, pixel scale, Super Eagle 2×).
- Controls tab: full input binding UI (see below).
- Settings are saved back to
config.iniwith a single click. - Replaces the old
[Controler]section inconfig.iniwith a proper[Input]section pointing to a bindings file.
New: Control Mapping UI (DebugControlMapping)
A dedicated control-remapping system is now available, shared between the config tool and the debugger.
- Lists all mappable sim actions (flight, combat, views, MFD, radio, etc.).
- Supports keyboard, joystick axis, joystick button, gamepad axis, and gamepad button bindings.
- Live capture mode: press a button or move an axis to bind it to an action (5-second timeout).
- Displays currently connected joysticks with their GUID.
- Bindings are saved/loaded from
default_bindings.cfg. - Keyboard bindings file path is now configurable via
config.ini([Input] bindings_file).
New: Post-Processing Shader Pipeline (RSScreen)
A new GLSL post-processing pipeline has been introduced, driven by config.ini [Video] settings:
| Option | Effect |
|---|---|
fx_cpc_palette |
Quantises colours to the Amstrad CPC 6128 palette using ordered (Bayer 4×4) dithering |
fx_scanlines |
Adds CRT scanline darkening every other logical pixel row |
fx_pixel_scale |
Pixel-art upscaling — snaps UV sampling to a grid of N×N pixels |
- OpenGL extension loading is handled by the new
GLExtensions.h/.cpp, with a no-op fallback on macOS/Linux where extensions are available natively. - Logical vs. drawable window sizes are now tracked separately (
logical_width/logical_height) to support HiDPI/Retina displays correctly.
macOS Build Support
The project can now be built on Apple Silicon (arm64) and macOS in general:
- A new
macosCMake preset targetsclangwithvcpkg. - All OpenGL includes now branch on
__APPLE__to use<OpenGL/gl.h>/<OpenGL/glu.h>instead of<GL/gl.h>. GL_SILENCE_DEPRECATIONis set where needed.vrstrikeis excluded from the macOS build (not supported).-Wl,-no_fixup_chainslinker option added for Apple Silicon targets (neosc,debugger,config).
Gameplay features
- update the Indiana jones map
- end mission screen now show air and ground kills
- new weapon GBU_15 is working
- new weapon Rocket POD (LAU3) is working
- new weapon physics, better gun aiming and bomb droping, better missile (they can now miss the targets, beware)
HUD & Cockpit Overhaul (SCCockpit)
The cockpit and HUD system has been significantly reworked:
- HUD data-driven rendering: HUD element positions (altitude band, speed band, heading compass, pitch ladder, all text tags) are now read from the binary HUD data (
TTAG,HINF,ALTI,ASPD,HEAD,LADD), making the HUD faithful to the original game assets. - Pitch ladder (
RenderPitchLadder): proper roll-rotated bars, dashed lines below the horizon, tick marks, and degree labels. - Altitude & speed bands (
RenderAltiBandRoll,RenderSpeedBandRoll): scrolling tape instruments reading from asset-defined step sizes. - Heading compass (
RenderHeadingCompas): scrolling compass tape with waypoint marker. - Text tags (
RenderTextTags/printTTAG): all HUD text fields (closure speed, range, weapon name/count, HUD mode, G-force, Mach, waypoint, radar altitude, gear/flaps/airbrake/throttle) are now drawn using the position data embedded in the game's HUD file. - CP_BIG (large HUD) support: the zoomed cockpit view now uses the large HUD asset and a 30° FOV camera, while the standard view keeps 45°.
- Weapon mode rendering: a proper
weapon_modeenum dispatches toRenderTargetingReticle(LCOS),RenderBombSight(CCIP),RenderMissileHud(SRM/LRM),RenderIrTargetHud(IRST), andRenderStraffingReticle(STRAF). - Lead-angle & target prediction: the gun reticle now iteratively predicts target position at time-of-flight with target velocity compensation, and draws both a lead diamond (predicted position) and a target box (current position).
- RAWS improvements: the radar-warning receiver now uses per-contact icon indices for both the normal and zoomed views, based on the aircraft type name.
current_targetfiltering: the cockpit now only sets a valid target for the current radar mode (AARD for air targets, AGRD for ground targets).- Camera: cockpit camera is now a proper
Camerainstance (cockpit_camera) separate from the renderer's camera, correctly positioned and oriented each frame from the player plane's attitude. project_to_screennow delegates to the plane-to-world matrix for 3D cockpit mode.
Config System Enhancements
Config::setIntandConfig::setBoolwrite-back methods added.Config::savesaves the current config to a file.Config.hppinclude guard fixed (<SimpeIni.h>→<SimpleIni.h>for case-sensitive file systems).config.iniis now installed to the root of the install directory (not justassets/), and copied to the build directory for Debug builds.- New
config.inisections:[Game],[Video],[Input]— the old[Controler]section has been removed.
Performance: FrameBuffer Blit Optimisation
All four blit variants (blit, blitWithMask, blitWithMaskAndOffset, blitLargeBuffer) have been rewritten to:
- Pre-compute clipped row/column ranges outside the inner loop.
- Use
memcpyfor contiguous opaque spans instead of per-pixel copies. - Eliminate redundant per-pixel bounds checks inside hot loops.
RLEShape: Pre-decoded Sprite Cache
RLEShapenow decodes sprite data once at load time into anexpand_buffer.- Subsequent
Expand/ExpandWithBoxcalls blit directly from the pre-decoded buffer usingmemcpyfor opaque spans. - Proper copy constructor and assignment operator added.
rightDistandbotDistare now incremented by 1 at load time to match expected sprite extents.- Validity checks guard against out-of-range shape dimensions.
RSImageSet Refactor
InitFromPakEntryrewritten: correctly parses the palette offset (first DWORD) and image offset table (subsequent DWORDs until the first image).InitFromTreEntryandInitFromRamremoved (replaced by the unifiedInitFromPakEntrylogic).GetShapeboundary check fixed (>→>=).removeFirstEmptyShapethreshold changed from== 0to<= 1to handle 1-pixel placeholder shapes.
SCRenderer: LOD & Config Integration
- LOD level is now read from
config.ini([Game] object_detail) instead of being hardcoded toLOD_LEVEL_MAX. - All
drawModelcall sites passthis->lodLevelcorrectly. - Palette loading is now guarded (
if (entries)). cameramadepublicfor external access.fovandlodLevelexposed as public fields.
Math / Vector Additions
Vector3D::rotateByAxis(const Vector3D& w)— Rodrigues' rotation formula for angular velocity integration.Vector3D::rotateByAxisInPlaceconvenience wrapper.Vector3D::Length()now has aconstoverload.Vector3D::Norm()removed; all callers updated to useLength().Vector2D::operator-subtraction operator added.Point2D::rotateAroundPointnow casts coordinates tofloatbefore trigonometry (fixes implicit-conversion warnings).
Timer: FPS Auto-Calibration
DesktopTimer now runs a 90-frame warm-up phase to measure the actual display refresh rate, then snaps to a standard FPS value (60, 30, 20, or 15) before engaging the spike-detection / smoothing logic. This prevents the first few seconds of play from having incorrect delta times.
Bug Fixes
- RSArea:
GetAreaBlockByIDnow also validateslodbounds (not justblockID). - RSCockpit:
parseMONI_INST_RAWS_INFOnow readszoom_x/zoom_ycorrectly; ARTP/EJEC/GUNF always initialise from PAK archive. - RSHud: All
TTAGsub-records (CLSR,TARG,NUMW,HUDM,IRNG,GFRC,MAXG,MACH,WAYP,RALT,LNDG,FLAP,SPDB,THRO,CALA) now read theirzfield beforex/y.CIRCis now a typedMISD_CIRCstruct instead of a raw byte vector. ASPD/ALTI/HEAD/LADD INFO blocks now parse their structured fields before the raw byte dump. - DebugGameFlow: null-pointer guard added before accessing shape dimensions in mission info rendering.
- DebugStrike:
Vector3D::Norm()replaced withLength(); AI pilot format string fixed (%dfor integer speed). - DebugPacificStrikeMISN:
setMissionnow correctly markedoverride. - DebugScreen:
logical_width/logical_heightinitialised; local variable renamed to avoid shadowingwidth;Setup Mappingmenu item added. - GameEngine::pumpEvents: mouse-to-legacy-space conversion uses
logical_width/logical_heightinstead of physical pixel dimensions. - sc/main.cpp and debugger/main.cpp:
GameEngine::init()and activity setup moved outside the loader thread to avoid race conditions. - vrstrike/main.cpp:
config.iniis now loaded before initialising the VR screen. - ByteStream:
constcopy constructor and assignment operator added. - FrameBuffer::printText_SM: space character now advances cursor without attempting to look up a shape; newline line-height reduced by 1 pixel; inter-letter spacing reduced by 1 pixel; fixed-width advance corrected.
- **RSVGA...
fixes_031_build
libRealSpace 0.3.1 — Release notes (from lcos_030_build → fixes_031_build)
Compare: lcos_030_build...fixes_031_build
Date: 2026-02-28
Highlights
- Bumped version to 0.3.1.
- New INI-based configuration support (SimpleIni) + shipped default
assets/config.ini. - Input system improvements: joystick (raw SDL joystick) axis/button bindings + persistent default bindings file.
- Cockpit/HUD & MFD improvements: new radar single-target view, damage MFD page, better targeting indicators, gunsight HUD offset adjustable in debugger.
- Parser robustness & format coverage: IFF lexer bounds fix; additional REAL/MISN chunk handlers.
Added
- Config system (SimpleIni)
- Added
src/engine/Config.cppandsrc/engine/Config.hpp(singleton wrapper around SimpleIni). vcpkg.jsonnow depends on simpleini.- Engine CMake now locates and exposes SimpleIni include dir.
- Added
- Default config file
- Added
resources/config.ini, copied into assets at build/install time.
- Added
- Joystick support (raw SDL joystick)
- New input types:
JOYSTICK_BUTTON,JOYSTICK_AXIS. - Keyboard bindings expanded with
bindJoystickButtonToAction/bindJoystickAxisToAction. - Debugger controller UI now enumerates joystick axes/buttons dynamically when not using SDL game controller mapping.
- New input types:
- Persistent default bindings
GameEngine::initKeyboard()loadsdefault_bindings.cfgif present, otherwise generates bindings and saves them.
Changed / Improved
- Window sizing now configurable
GameEngine::init()readsWindow.width/Window.heightfrom config (with defaults).src/executables/sc/main.cpploads./assets/config.iniand appliesWindow.width/height/fullscreen.- Debugger main also loads config (note: it reads
Display.Width/Heightkeys—see “Notes / Potential follow-ups”).
- SDL initialization
RSScreenandDebugScreennow initialize SDL withSDL_INIT_JOYSTICKin addition to game controller support.- Fullscreen window flags now include
SDL_WINDOW_ALLOW_HIGHDPI.
- Rendering
SCRenderer::renderWorldToTexture()now renders additional neighboring blocks aroundblock_id(9 renders total).
- Cockpit / HUD / MFD
- Target projection code refactored into
SCCockpit::project_to_screen. - HUD target indicator now uses shape assets (
TARG->SHAPSET) and displays “in range” marker (MISD->SHAP) when applicable. - Added tracking of
targetImpactPointWorldand optional debug drawing hooks. - Radar mode
ASSTnow uses a dedicated single-target radar rendering implementation that shows only the current target and prints altitude/heading/speed next to it. - Added Damage MFD page (
RenderMFDSDamage) and integrated it into both 2D and virtual cockpit rendering paths. - Camera MFD width calculation fixed (was incorrectly using height).
- Gunsight HUD angular offset is now adjustable via a new debugger menu panel (“GunSight HUD angular offset”) and used in virtual cockpit.
- Target projection code refactored into
- Mission / audio behavior
SCMissiontracks anin_combatflag set when an AI actor targets the player.SCStrike::runFrame()switches music to track 5 during combat, otherwise uses mission tune.
- Target selection
SCStrike::findTarget()now:- filters enemies within 30,000 units,
- sorts candidates by distance,
- cycles to the next target (instead of always snapping to nearest).
- Camera look-at
setCameraLookat()now:- if target is very far (> 20000), uses plane forward direction instead of target framing,
- passes an explicit up vector into
camera->lookAt(...).
- Palette LUT
BuildPaletteLUT()now searches only the green ramp[128..159](instead of all 0..255) and uses 128 as the starting best index.
Fixed
- IFFSaxLexer bounds/size handling
- If the computed
chunk_size + 8exceeds available buffer at the start of parsing, the code now allocates a larger buffer, copies data, and reinitializes the stream to avoid overrun.
- If the computed
- ByteStream destructor
- Clears
cursorpointer in destructor.
- Clears
- HUD shape parsing
RSHud::parseREAL_CHUD_LARG_TARG_SHAP()now builds anRSImageSetviaPakArchive(and assignsSHAPSET) instead of manually LZW-decoding into anRLEShape.
- Removed noisy debug prints
- RSMapTextureSet texture dump spam removed; palette transparency print removed; some mission parsing prints removed.
Format / content parsing coverage
RSEntitynow registers/accepts additional REAL chunk handlers (stubs added):REAL:INFOOBJT/TRCR:INFOMISS/DYNM:{ATMO,GRAV,AGRV}APPR/POLY/TRIS:LNTHOBJT/ORNT:SIGNhandler wiring added
RSMissionnow registersMISN:CACH(parser stub) andLOADparsing was cleared out (now empty).
Packaging / build system
- Top-level
CMakeLists.txt- project version 0.3.0 → 0.3.1
- assets now also copy
MID_36.IFFandconfig.ini.
vcpkg.json- added dependency: simpleini
lcos_030_build
Release notes — lcos_030_build (from vr_build_020)
Highlights
- Version bump: project version updated to 0.3.0 (
CMakeLists.txt). - New timing system (desktop + VR): introduced a unified
GameTimerabstraction with:Timerbase interface (src/engine/timer.h)DesktopTimerwith spike smoothing (src/engine/desktoptimer.h)VRTimerwith OpenXR predicted timing + frame limiting (src/executables/vrstrike/vrtimer.h)- Engine loops now call
GameTimer::update()(e.g.GameEngine, debugger) - Desktop executables initialize
DesktopTimer; VR initializesVRTimer.
VR / OpenXR
- ImGui timing/debug overlay in VR:
- ImGui context initialization in
VRScreen - Offscreen rendering of ImGui into an OpenXR swapchain
- Presented as a quad layer alongside the stereo projection.
- ImGui context initialization in
- Added missing GL extension proc for
glCheckFramebufferStatusEXTand FBO completeness checks. - More robust OpenXR frame end composition: projection layer + optional ImGui quad layer.
Rendering / UI
- Render-to-texture resolution changed from 800×600 to 128×128 (
SCRenderer::initRenderToTexture, viewport + copy). - Camera zoom support:
Cameranow haszoom,SetZoom()/GetZoom()- perspective calculation uses zoom-adjusted FOV.
HUD / Cockpit improvements (Strike Commander)
- HUD LCOS shapes switched to image sets (
RSImageSet) rather than singleRLEShapeforLCOS_SHAP, enabling richer shape usage. - Gun pipper / CCIP-like reticle improvements:
- Refined cannon impact prediction and HUD projection
- Uses LCOS shapes and draws distance-to-target indicators via shape selection.
- Added MFD camera view rendering:
- Reads the OpenGL texture, rescales, converts RGBA → VGA palette via LUT, blits into the cockpit MFD.
- Includes palette LUT builder for faster conversion.
- Virtual cockpit changes:
- Cleanup routine for cockpit textures to avoid buildup across frames.
- Slight HUD placement tweak and cannon angular offset adjustment.
Input / Gameplay toggles
New bindings added in GameEngine:
- F10 / F11:
SPEC_KEY_1,SPEC_KEY_2 - G: weapon mode toggle (
WEAPON_MODE_TOGGLE) - I: infinite ammo toggle (
INFINIT_AMMO_TOGGLE) - K: single target / assist mode (
SINGLE_TARGET_MODE)
In SCStrike:
- Toggle air weapons mode, infinite ammo, single target radar mode, and camera-on-MFD.
Simulation / Physics
- Flight simulation moved to delta-time (
dt) driven updates (not SDL tick-derived TPS) inSCJdynPlane. - Gravity/thrust/speed-of-sound computations updated to scale with
dt. - Added angular velocity tracking for better weapon prediction / trajectory correction.
AI / Mission logic
- Team filtering and friendly-fire avoidance:
SCSimulatedObject::CheckCollisionignores same-team hits.SCMissionActors::defendTarget/defendArealogic now iterates all actors and filters by team.
- Ground-attack behavior expanded (weapon selection, range heuristics for bombs, approach logic).
SCMission::update()early-exits whenmission_endedis set.- Runway entity support:
- New entity type
rnwy - Parsing
RNWYchunk in RealSpace entity parsing - Runway bounding boxes/orientation derived from overlay data during mission load/update/activation.
- New entity type
Core math / utilities
InvSqrt()now uses1/sqrtf(x)(replaces the Quake-style fast inverse sqrt code).Point2Dconverted from struct → class with built-inrotate()/rotateAroundPoint().Vector2DgainedrotateAroundPoint().- Matrix utilities:
- Added
Matrix::invertRigidBodyMatrixLocal() - Added
Vector3D::transformPoint(const Matrix&) - Removed older inline rotation helper from header.
- Added
Parsing / data
RSAreanow stores previously “unknown bytes” for objects intoMapObject::unknowns(vector), and debugger displays them.PSGameFlowParseropcode name updated:EFECT_OPT_U15→EFECT_IF_LAST_MISS_SUCCESS, with corresponding handling inSCGameFlow.
Assets
- Added
resources/MID_36.IFF.
Tests
- Added new unit tests:
tests/MathTests.cpptests/MatrixTests.cpp
- Updated
ByteStreamTestsexpectations for fixed-float reads and test data. - Fixed
ByteStream::ReadByte()bounds check (>→>=) andReadFixedFloatBE()integer type.
vr_build_020
What's Changed
This pull request introduces significant improvements to the build system, asset management, and script parsing for the project. The most important changes are grouped below by theme.
Build System & Testing Enhancements:
Added Google Test support and enabled unit testing in the CMakeLists.txt, making it easier to write and run C++ tests.
Included the tests directory in the build, integrating unit tests into the project structure.
Updated the project version and added a new executable target (vrstrike) to the build (CMakeLists.txt). [1] [2]
Features:
Added pacific strike mission, objects, and gameplay functions.
Added Wings of glory objects loading
Added Strike Commander MidGames parser and playing to GamePlay
VR support
add new VRScreen to use OpenXR for VR rendering on compatible helmet.
Camera and Rendering Enhancements (VR/Custom Matrices):
Added support for custom projection and view matrices in the Camera class, enabling direct matrix injection (useful for VR and advanced rendering scenarios). This includes new methods for setting, clearing, and querying custom matrices, and logic to use them when enabled (src/engine/Camera.h, src/engine/Camera.cpp). [1] [2] [3] [4]
Extended RSScreen with virtual methods and structures for optional VR stereo rendering, and refactored window/context management to use member variables instead of statics (src/engine/RSScreen.h, src/engine/RSScreen.cpp). [1] [2] [3] [4] [5]
Added a new drawModel overload in SCRenderer that accepts a scale parameter, improving flexibility for model rendering (src/engine/SCRenderer.cpp, src/engine/SCRenderer.h). [1] [2]
Refactored renderer viewport binding logic to support custom viewport sizes, with a helper for the default window-sized viewport (src/engine/SCRenderer.cpp). [1] [2]
Input Handling Improvements:
Added a new RADAR_MODE_TOGGLE action to the input system, with corresponding bindings for keyboard and mouse, improving control mapping flexibility (src/engine/GameEngine.h, src/engine/GameEngine.cpp). [1] [2] [3]
Math/Utility Improvements:
Made several Vector3D operators const-correct, allowing usage with const objects and improving code safety (src/commons/Matrix.h).
Loader and UI Improvements:
Improved loading screen visuals by using RGBA color fills and corrected font asset pathing. Also made minor thread and initialization fixes in the loader (src/engine/Loader.cpp). [1] [2] [3] [4] [5] [6] [7]
Included RSScreen.h in the loader header for improved encapsulation (src/engine/Loader.h).
Other Minor Fixes:
Minor code organization and bugfixes, including static-to-member refactoring in RSScreen, and a fix for the SCMouse class member ordering (src/engine/SCMouse.h). [1] [2]
playable_build_with_debug_tools
Release Notes – v0.1.0
Highlights
- More realistic missile smoke generation via
SCSmokeSet::generateMissileSmokeTextures. - Kill board now renders with a dedicated palette and dynamic updates in
KillBoardScene::Render. - Enhanced key binding load/save support through
InputActionSystem::saveBindingsandInputActionSystem::loadBindings.
UI & UX
- Refined file loading navigation in
SCFileRequester. - Armament menu improvements in
WeaponLoadoutScene::updateWeaponDisplayfor clearer loadout summaries.
Simulation & Gameplay
- Adjusted flight physics in
SCJdynPlane::computeLiftfor more consistent lift behavior. - Mission statistics now update during post-flight evaluation in
SCStrike::runFrame.
Tooling & Debugging
- Expanded entity inspection within the debugger via
DebugStrike::renderMenu, including mass, thrust, and armament details. - Custom polygon and debug-line rendering support added in
SCPlane::renderPlaneLinedfor visual analysis.
Quality & Infrastructure
- Improved PAK archive management through
PakArchive::Parseand related helpers. - Stabilized palette handling and image rendering in
RSImage::SyncTextureandRSImage::UpdateContent.
Documentation
- Expanded technical guides and specs (IFF format, mission structures, conversation flow) in doc/.
cd_voice_features
What's Changed
- Cddata by @remileonard in #5
- Intro MidGames
- Better mission script support
- wide screen
- Legder / Catalog
- Load save files from Strike commander
- Bomb sight
- Cannon
- many bug fixes
Full Changelog: first_gameplay...cd_voice_features
Alpha build 0.0000002
Neo Strike Commander Alpha build 0.0000002
First build with in mission gameplay, first mission is okish.
What's Changed
- Implementation of the mission scripting system
- Implementation of the scene system in missions
- AI implementation
- New simplified flight model for AI
- Music improvement
- Font usage improvement
- Gameflow script implementation improvement
- Creation of the weapon selection screen
- Creation of the catalog presentation screen
- Creation of the accounts presentation screen
- Refactoring tasks
Full Changelog: very_alpha_build_01...first_gameplay
how to use
- unarchive neosc.zip
- copy the datafile from strike commander floppy disk version to the assets directory
- double click on neosc.exe
- enjoy :)
Alpha build 0.0000001
This is a very alpha buggy release for those who want to try the game :)