Skip to content

Releases: remileonard/libRealSpace

little steps near the end

Pre-release

Choose a tag to compare

@remileonard remileonard released this 31 May 17:29

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.ini with a single click.
  • Replaces the old [Controler] section in config.ini with 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 macos CMake preset targets clang with vcpkg.
  • All OpenGL includes now branch on __APPLE__ to use <OpenGL/gl.h> / <OpenGL/glu.h> instead of <GL/gl.h>.
  • GL_SILENCE_DEPRECATION is set where needed.
  • vrstrike is excluded from the macOS build (not supported).
  • -Wl,-no_fixup_chains linker 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_mode enum dispatches to RenderTargetingReticle (LCOS), RenderBombSight (CCIP), RenderMissileHud (SRM/LRM), RenderIrTargetHud (IRST), and RenderStraffingReticle (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_target filtering: 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 Camera instance (cockpit_camera) separate from the renderer's camera, correctly positioned and oriented each frame from the player plane's attitude.
  • project_to_screen now delegates to the plane-to-world matrix for 3D cockpit mode.

Config System Enhancements

  • Config::setInt and Config::setBool write-back methods added.
  • Config::save saves the current config to a file.
  • Config.hpp include guard fixed (<SimpeIni.h><SimpleIni.h> for case-sensitive file systems).
  • config.ini is now installed to the root of the install directory (not just assets/), and copied to the build directory for Debug builds.
  • New config.ini sections: [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 memcpy for contiguous opaque spans instead of per-pixel copies.
  • Eliminate redundant per-pixel bounds checks inside hot loops.

RLEShape: Pre-decoded Sprite Cache

  • RLEShape now decodes sprite data once at load time into an expand_buffer.
  • Subsequent Expand / ExpandWithBox calls blit directly from the pre-decoded buffer using memcpy for opaque spans.
  • Proper copy constructor and assignment operator added.
  • rightDist and botDist are now incremented by 1 at load time to match expected sprite extents.
  • Validity checks guard against out-of-range shape dimensions.

RSImageSet Refactor

  • InitFromPakEntry rewritten: correctly parses the palette offset (first DWORD) and image offset table (subsequent DWORDs until the first image).
  • InitFromTreEntry and InitFromRam removed (replaced by the unified InitFromPakEntry logic).
  • GetShape boundary check fixed (>>=).
  • removeFirstEmptyShape threshold changed from == 0 to <= 1 to handle 1-pixel placeholder shapes.

SCRenderer: LOD & Config Integration

  • LOD level is now read from config.ini ([Game] object_detail) instead of being hardcoded to LOD_LEVEL_MAX.
  • All drawModel call sites pass this->lodLevel correctly.
  • Palette loading is now guarded (if (entries)).
  • camera made public for external access.
  • fov and lodLevel exposed as public fields.

Math / Vector Additions

  • Vector3D::rotateByAxis(const Vector3D& w) — Rodrigues' rotation formula for angular velocity integration.
  • Vector3D::rotateByAxisInPlace convenience wrapper.
  • Vector3D::Length() now has a const overload.
  • Vector3D::Norm() removed; all callers updated to use Length().
  • Vector2D::operator- subtraction operator added.
  • Point2D::rotateAroundPoint now casts coordinates to float before 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: GetAreaBlockByID now also validates lod bounds (not just blockID).
  • RSCockpit: parseMONI_INST_RAWS_INFO now reads zoom_x/zoom_y correctly; ARTP/EJEC/GUNF always initialise from PAK archive.
  • RSHud: All TTAG sub-records (CLSR, TARG, NUMW, HUDM, IRNG, GFRC, MAXG, MACH, WAYP, RALT, LNDG, FLAP, SPDB, THRO, CALA) now read their z field before x/y. CIRC is now a typed MISD_CIRC struct 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 with Length(); AI pilot format string fixed (%d for integer speed).
  • DebugPacificStrikeMISN: setMission now correctly marked override.
  • DebugScreen: logical_width/logical_height initialised; local variable renamed to avoid shadowing width; Setup Mapping menu item added.
  • GameEngine::pumpEvents: mouse-to-legacy-space conversion uses logical_width/logical_height instead 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.ini is now loaded before initialising the VR screen.
  • ByteStream: const copy 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...
Read more

fixes_031_build

fixes_031_build Pre-release
Pre-release

Choose a tag to compare

@remileonard remileonard released this 28 Feb 15:59

libRealSpace 0.3.1 — Release notes (from lcos_030_buildfixes_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.cpp and src/engine/Config.hpp (singleton wrapper around SimpleIni).
    • vcpkg.json now depends on simpleini.
    • Engine CMake now locates and exposes SimpleIni include dir.
  • Default config file
    • Added resources/config.ini, copied into assets at build/install time.
  • 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.
  • Persistent default bindings
    • GameEngine::initKeyboard() loads default_bindings.cfg if present, otherwise generates bindings and saves them.

Changed / Improved

  • Window sizing now configurable
    • GameEngine::init() reads Window.width / Window.height from config (with defaults).
    • src/executables/sc/main.cpp loads ./assets/config.ini and applies Window.width/height/fullscreen.
    • Debugger main also loads config (note: it reads Display.Width/Height keys—see “Notes / Potential follow-ups”).
  • SDL initialization
    • RSScreen and DebugScreen now initialize SDL with SDL_INIT_JOYSTICK in addition to game controller support.
    • Fullscreen window flags now include SDL_WINDOW_ALLOW_HIGHDPI.
  • Rendering
    • SCRenderer::renderWorldToTexture() now renders additional neighboring blocks around block_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 targetImpactPointWorld and optional debug drawing hooks.
    • Radar mode ASST now 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.
  • Mission / audio behavior
    • SCMission tracks an in_combat flag 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 + 8 exceeds available buffer at the start of parsing, the code now allocates a larger buffer, copies data, and reinitializes the stream to avoid overrun.
  • ByteStream destructor
    • Clears cursor pointer in destructor.
  • HUD shape parsing
    • RSHud::parseREAL_CHUD_LARG_TARG_SHAP() now builds an RSImageSet via PakArchive (and assigns SHAPSET) instead of manually LZW-decoding into an RLEShape.
  • Removed noisy debug prints
    • RSMapTextureSet texture dump spam removed; palette transparency print removed; some mission parsing prints removed.

Format / content parsing coverage

  • RSEntity now registers/accepts additional REAL chunk handlers (stubs added):
    • REAL:INFO
    • OBJT/TRCR:INFO
    • MISS/DYNM:{ATMO,GRAV,AGRV}
    • APPR/POLY/TRIS:LNTH
    • OBJT/ORNT:SIGN handler wiring added
  • RSMission now registers MISN:CACH (parser stub) and LOAD parsing 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.IFF and config.ini.
  • vcpkg.json
    • added dependency: simpleini

lcos_030_build

lcos_030_build Pre-release
Pre-release

Choose a tag to compare

@remileonard remileonard released this 21 Feb 16:11

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 GameTimer abstraction with:
    • Timer base interface (src/engine/timer.h)
    • DesktopTimer with spike smoothing (src/engine/desktoptimer.h)
    • VRTimer with 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 initializes VRTimer.

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.
  • Added missing GL extension proc for glCheckFramebufferStatusEXT and 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:
    • Camera now has zoom, SetZoom()/GetZoom()
    • perspective calculation uses zoom-adjusted FOV.

HUD / Cockpit improvements (Strike Commander)

  • HUD LCOS shapes switched to image sets (RSImageSet) rather than single RLEShape for LCOS_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) in SCJdynPlane.
  • 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::CheckCollision ignores same-team hits.
    • SCMissionActors::defendTarget/defendArea logic now iterates all actors and filters by team.
  • Ground-attack behavior expanded (weapon selection, range heuristics for bombs, approach logic).
  • SCMission::update() early-exits when mission_ended is set.
  • Runway entity support:
    • New entity type rnwy
    • Parsing RNWY chunk in RealSpace entity parsing
    • Runway bounding boxes/orientation derived from overlay data during mission load/update/activation.

Core math / utilities

  • InvSqrt() now uses 1/sqrtf(x) (replaces the Quake-style fast inverse sqrt code).
  • Point2D converted from struct → class with built-in rotate() / rotateAroundPoint().
  • Vector2D gained rotateAroundPoint().
  • Matrix utilities:
    • Added Matrix::invertRigidBodyMatrixLocal()
    • Added Vector3D::transformPoint(const Matrix&)
    • Removed older inline rotation helper from header.

Parsing / data

  • RSArea now stores previously “unknown bytes” for objects into MapObject::unknowns (vector), and debugger displays them.
  • PSGameFlowParser opcode name updated: EFECT_OPT_U15EFECT_IF_LAST_MISS_SUCCESS, with corresponding handling in SCGameFlow.

Assets

  • Added resources/MID_36.IFF.

Tests

  • Added new unit tests:
    • tests/MathTests.cpp
    • tests/MatrixTests.cpp
  • Updated ByteStreamTests expectations for fixed-float reads and test data.
  • Fixed ByteStream::ReadByte() bounds check (>>=) and ReadFixedFloatBE() integer type.

vr_build_020

vr_build_020 Pre-release
Pre-release

Choose a tag to compare

@remileonard remileonard released this 03 Jan 18:15

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

Pre-release

Choose a tag to compare

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::saveBindings and InputActionSystem::loadBindings.

UI & UX

  • Refined file loading navigation in SCFileRequester.
  • Armament menu improvements in WeaponLoadoutScene::updateWeaponDisplay for clearer loadout summaries.

Simulation & Gameplay

  • Adjusted flight physics in SCJdynPlane::computeLift for 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::renderPlaneLined for visual analysis.

Quality & Infrastructure

  • Improved PAK archive management through PakArchive::Parse and related helpers.
  • Stabilized palette handling and image rendering in RSImage::SyncTexture and RSImage::UpdateContent.

Documentation

  • Expanded technical guides and specs (IFF format, mission structures, conversation flow) in doc/.

cd_voice_features

cd_voice_features Pre-release
Pre-release

Choose a tag to compare

@remileonard remileonard released this 09 Apr 17:48

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

Alpha build 0.0000002 Pre-release
Pre-release

Choose a tag to compare

@remileonard remileonard released this 06 Mar 08:43

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

Alpha build 0.0000001 Pre-release
Pre-release

Choose a tag to compare

@remileonard remileonard released this 05 Oct 15:00

This is a very alpha buggy release for those who want to try the game :)