Skip to content

Releases: rubocopter/penumbra_vr_rework

v0.1.0-alpha.6.2

Choose a tag to compare

@rubocopter rubocopter released this 27 Aug 11:26

Physical hands that respect the world, measured equipment grips, and much more forgiving doors, drawers, hatches, pickups, and opening-area mechanisms.

Fixed

  • Visible hands now sweep an approximate physical volume through static scenery, resolve overlaps, and slide along surfaces instead of freely crossing walls and furniture; correction lag is bounded so a deeply blocked pose cannot strand or permanently hide a hand
  • Tracking loss is isolated per hand and has a short grace period, preventing one transient invalid pose from removing both rigs
  • Finger fold axes turn into the palm consistently on both rigs; the little finger no longer rotates backwards (the short thumb chain remains static by design)
  • Flashlight, glowstick, hammer, pickaxe, broom, flare, and dynamite placement is calibrated against reconstructed object geometry and the hand's closing-finger volume instead of a fixed visual palm offset
  • VR interaction selects the joint whose child body was actually grabbed, so the opening snow hatch drives its lid joint rather than the wheel joint and is substantially easier to lift
  • Inserted handles forward interaction to the mechanism they drive: the steel bar near the opening hatch can now turn its support after placement instead of requiring the player to grab the support itself
  • Hinges use circular pick-point motion and sliders project onto their permitted axis, making lockers, drawers, doors, wheels, and levers less resistant and less prone to drifting off-axis
  • Locked swing doors retain their hinge axis and stop around their locked angle, including the tutorial door blocked by its padlock
  • Small and light pickups, including inventory items inside cramped lockers, receive stronger hand-nudge assistance; heavy, large, or breakable props receive a restrained response so bare hands do not casually explode barrels or punch loaded crates across the room
  • Held objects follow the collision-resolved physical palm pose while targeting and direct nudge preserve the raw controller intent
  • Locomotion no longer computes the head-rotation inverse twice per frame
  • The sound source filter is only pushed to the driver when it actually changes, instead of re-issuing identical state for every audible sound each update
  • VR eye framebuffer descriptors are zero-initialized, so a failed allocation attempt cannot destroy unrelated GL object names

Added

  • Per-item VrGripPoint, VrGripRadius, and VrGripTwist metadata: the attachment aligns a measured grip point with the closing fingers, derives curl from handle radius, and twists around the grip pivot
  • scripts/analyze-vr-grips.py, which reconstructs HUD-object geometry and hand skeleton poses, reports grip slices and bounds, and validates anchors without requiring repeated in-headset guesswork
  • Scale-free physical palm transforms and contact-distance prioritization for world selection, independent of the tiny visual mesh scale
  • Joint-selection and nudge diagnostics for map-specific interaction tuning
  • Release identifier (Penumbra VR vX.Y.Z) logged at the very start of every boot, independent of the SteamVR input path
  • Environment fingerprint in hpl.log: Windows build, RAM and free 32-bit address space, real GPU vendor/renderer/driver — plus remaining address space recorded at crash time
  • Controller bindings are now generated from a single declarative spec (scripts/generate-bindings.ps1); the build fails if the shipped JSONs drift from it
  • Unit tests for the pure VR math (tracking-space transform, recenter invariant, stick dead zone) run on every build and in CI

Known limitations

  • Hand collision uses one approximate palm/hand volume, not individual physical fingers; some clipping around thin geometry, handles, and animated fingers remains possible
  • The current hand asset has a short static thumb chain and a fused ring/middle mesh, so it cannot produce a complete anatomical wrap around every handle
  • The original global player state still permits only one active grab; simultaneous two-object holding and two-hand constraints are not implemented
  • Bundled equipment is calibrated individually, but unusual or map-specific held meshes may still need their own grip metadata

Install

  1. Download PenumbraVR-v0.1.0-alpha.6.2.zip and extract it completely.
  2. Run Install-PenumbraVR.bat.
  3. Start SteamVR, then launch Penumbra: Overture from Steam.

Package SHA-256: 048019b2b13f5a3931217f8ed270a83bc56a4f545a7e74f4f1b21d1845c90f22

Full changelog: v0.1.0-alpha.6.1...v0.1.0-alpha.6.2

v0.1.0-alpha.6.1

Choose a tag to compare

@rubocopter rubocopter released this 26 Aug 11:20

v0.1.0-alpha.6.1 — 26 August 2026

Hotfix release: startup crash resilience on upgraded installs, occlusion filtering that actually reaches OpenAL, self-service crash reporting, and a packaged-in Visual C++ runtime.

Fixed

  • Upgraded installations no longer re-enable the legacy sound updater thread: builds up to alpha.5 wrote UseThreading=true into settings, silently racing OpenAL Soft's internal mixer once EFX was active (startup crash around the first menu sounds). The stored value is now ignored; nothing to do on your end, just update
  • Occlusion muffling and distance air absorption reach OpenAL for real: source filters created on demand had no type, so every high-frequency gain change was rejected and alpha.6's advertised low-pass behaviour never applied
  • VR eye framebuffer allocation failures (driver limits or the 32-bit address space at high render scales) now verify framebuffer completeness and retry at half size instead of leaving rendering broken

Added

  • Automatic crash reporting: unhandled exceptions write penumbravr_crash.dmp next to the executable and a flushed CRASH: line into hpl.log — bug reports only ever need files the game produced by itself
  • Stale-binding diagnostics: when move/turn actions stay inactive while other controls work (a SteamVR binding stored by an older alpha; reported on Valve Index), the log explains the one-time fix — SteamVR ▸ Settings ▸ Controllers ▸ Penumbra: Overture ▸ Reset to default
  • App-local Visual C++ 2022 runtime (msvcp140.dll, vcruntime140.dll) ships inside the package; no redistributable install needed

Install

Run Install-PenumbraVR.bat over your Steam copy of Penumbra: Overture (use -Restore to uninstall).

Full changelog: https://github.com/rubocopter/penumbra_vr_rework/blob/master/docs/RELEASES.md

v0.1.0-alpha.6 — Spatial audio

Choose a tag to compare

@rubocopter rubocopter released this 25 Aug 18:39

v0.1.0-alpha.6 — Spatial audio

A complete spatial-audio chain for Penumbra VR: binaural HRTF, occlusion muffling, distance absorption, ambient reverb, and a low-latency head-tracked listener — on a bundled OpenAL Soft runtime, so it works identically on every machine.

Penumbra is about what you hear coming. This release rebuilds the game's entire acoustic pipeline:

  • Head-tracked listener without lag — positional sounds follow your head pose in real time instead of last frame's camera matrix
  • Binaural HRTF (new setting) — Options → VR Settings → Display → Binaural audio (HRTF): Auto (headphone detection), Headphones, or Off. Restart required
  • Occlusion that muffles — walls and closed doors now dampen treble with a smooth fade; a creature behind a door sounds held back until you open it
  • Distance absorption — audible sources lose treble progressively with range, so far things read as far even in line of sight
  • Mine-gallery reverb — a restrained global EFX tail (2.6 s decay, high diffusion) that gives corridors and caverns depth without washing out the mix
  • Bundled OpenAL Soft 1.25.2 — app-local runtime guarantees EFX/HRTF support everywhere; LGPL license included under licenses/

Fixed

  • Legacy Creative device names ("Generic Software") no longer break modern OpenAL runtimes
  • OALWrapper hardened for first-time EFX activation: per-source filters are created on demand (fixes a startup access violation), EFX manager thread state is initialized before any failure path, and failed device opens no longer fall into the silent NULL driver
  • Legacy sound thread disabled by default — it raced against OpenAL Soft's internal mixer once EFX was active

Known limitations

  • Reverb is a single global preset; per-zone environments remain future work
  • HRTF validated informally on PS VR2 Sense headphone output only
  • Occlusion raycasts sample ~2×/second; very fast doors can pop between muffled and clear

Full details in docs/RELEASES.md.

Install: extract the zip completely and run Install-PenumbraVR.bat (Steam install detected automatically; every replaced file is backed up). Remove with Install-PenumbraVR.bat -Restore.

v0.1.0-alpha.5 — natural hand interaction, firm grabs and off-hand grabbing

Choose a tag to compare

@rubocopter rubocopter released this 25 Aug 10:31

Natural hand interaction: firm tracked grabs, direct object nudging, and bare off-hand grabbing.

New since v0.1.0-alpha.4

Hands and interaction

  • Bare off-hand interaction on PS VR2 Sense: L2 in the default right-handed profile (R2 in the mirrored left-handed profile) can target and grab nearby objects.
  • Off-hand trigger bindings in every bundled controller profile (HTC Vive, Valve Index/Knuckles, Oculus Touch, Pico 4, Pico Neo 3, Windows Mixed Reality): each hand's index trigger maps to /actions/offhand/in/interact, matching the PS VR2 scheme — controller profiles ship in parity from now on.
  • Dedicated /actions/offhand SteamVR action set, restricted at runtime to the physical off-hand controller without activating the full mirrored gameplay layout.
  • Per-hand interaction-source and held-body ownership: tracking, visibility, throwing, and haptics follow the controller that initiated the grab.
  • Create/recenter remains available in both dominant-hand modes through the global action set.
  • Throttled input and nudge diagnostics in hpl.log.

Physics

  • Direct hand nudge for dynamic world objects and hinged doors, with contact-point impulses and subtle per-hand haptics.
  • Held physics objects now stay fixed to the rendered palm instead of trailing, floating, or orbiting around the controller.
  • Map-defined Newton velocity caps are raised only while grabbing or dragging and restored on release; jointed bodies use a bounded velocity servo.
  • Throw velocity is transformed into world space and clamped to reject controller spikes.

Items and pickup

  • Pickup items touched by the palm take priority over overlapping furniture; normal line-of-sight checks remain in place away from direct contact.
  • Item-use rays now follow the aim-pose rotation; the item indicator is smaller, view-facing, and anchored to the ray origin.
  • Hand nudge excludes inventory items and held bodies, and applies gentler limits to grabbable/movable props so pickups are not launched accidentally.

Known limitations

  • Interaction still uses one global player state: both hands can initiate a grab, but simultaneous two-object holding and two-hand constraints on one object are not implemented.
  • Hand nudge is an impulse-based proxy for dynamic bodies, not a rigid hand collider against static level geometry; rendered hands can still pass visually through walls.
  • Off-hand grabbing has been hardware-tested on PS VR2 Sense only; other bundled profiles use their standard SteamVR trigger inputs for off-hand interact but remain unvalidated per device.

What to test

  • Grab and hold objects with either hand (off-hand via L2/R2 or the opposite-hand index trigger), drag heavy items, nudge doors and props.
  • Throws from both hands — check trajectory and speed stability.
  • Item use (flashlight, glowstick…) while holding something with the other hand.

v0.1.0-alpha.4 — equipped objects (experimental) and graphics presets

Choose a tag to compare

@rubocopter rubocopter released this 24 Aug 00:14

Graphics presets and the first pass of equipped objects visible in the hands.

The held-object system is experimental and in a very green state. Items render attached to the visible hand rigs and melee combat works, but grip poses, finger wrap, and per-item placement are approximate and will keep changing. Expect visible imperfections.

New since v0.1.0-alpha.3

Graphics:

  • New [VR] RenderScale\ setting (0.5-2.0, default 1.0) that multiplies the SteamVR recommended eye buffer size at startup; the main performance lever on modern headsets (restart required after changing it).
  • One-click graphics presets in Options - VR Settings: Performance, Balanced, and Quality bundles of render scale, shadows, shader quality, texture quality, and anisotropic filtering.
  • Texture anisotropic filtering now defaults to 16x instead of Off.
  • Fixed [Screen] Vsync\ never being loaded and [Graphics] Refractions\ never being saved.

Hands and equipped objects (experimental):

  • The flashlight, glowstick, flare, melee weapons (hammer, pickaxe, broom), and thrown items render as attachments on top of the visible hand rig instead of replacing it, so the hand is seen holding the object.
  • Items anchor to a palm socket in the controller frame (between palm and finger knuckles, shifted toward the thumb) with per-item rotation and scale; the placement is rigid relative to the hand while moving.
  • Melee weapons and thrown items keep their full gameplay logic: damage sweeps, charging, and throw release from the rendered item pose.
  • Fixed a crash when opening the notebook while a flare was equipped (use-after-free on the flare light pointer).
  • The notebook draws without a depth test, so world geometry can no longer clip it or hide its text.
  • The thrown item honours the VrScale of its hud file again; ships a held-dynamite override at 6.0.

Known limitations (held objects)

  • The forced grip does not close the fist completely yet; the finger wrap is still shallow and the thumb stays static (known model limitation).
  • Per-item placement is a first pass: some items still intersect the hand or sit slightly off the palm line.
  • The system may change without notice between builds.

What to test

  • Graphics presets and the render scale lever (compare frame timing at 0.75, 1.0, and 1.25).
  • Equipped items: flashlight, glowstick, flare, hammer, pickaxe, dynamite — visibility, placement, and melee damage.
  • The notebook with items equipped (earlier builds crashed here).

v0.1.0-alpha.3 — controller coverage and input resilience

Choose a tag to compare

@rubocopter rubocopter released this 23 Aug 10:43

Controller coverage and input resilience fixes driven by the first external Valve Index tester report. The same experimental caveats as earlier alphas apply, and PS VR2 Sense remains the only hardware-validated controller family.

New since v0.1.0-alpha.2

  • Controller diagnostics in \hpl.log: detected headset driver and both controller types are recorded at startup, with an explicit warning when a type has no bundled default profile.
  • The legacy polling fallback now drives movement from the strongest qualifying analog axis, so joystick-only devices (Valve Index, WMR) keep usable movement when no SteamVR action binding is active.
  • New default binding profiles: \pico4_controller\ and \pico_neo3_controller\ (Pico 4/Ultra and Neo 3 through SteamVR bridges) and \holographic_controller\ (the WMR identifier many SteamVR drivers report).
  • SteamVR Input dropouts are bridged for 500 ms with the last known input state before falling back to legacy polling; the previous single-frame fallback swallowed held inputs and left movement dead on controllers whose sticks do not assert the legacy touch bit.
  • Game messages re-anchor themselves in room space when another UI surface closes, fixing tutorial text following the player after opening/closing the inventory.

What to test

Index, Touch, Pico, and WMR owners: check \hpl.log\ for the new [VR input]\ controller-type lines, confirm thumbstick movement works after opening and closing menus, and retest the cases that felt partial before.

v0.1.0-alpha.2 — natural hand animation

Choose a tag to compare

@rubocopter rubocopter released this 22 Aug 17:03

Natural hand animation and aiming polish. The same experimental caveats as alpha.1 apply, and PS VR2 Sense remains the only hardware-validated controller family.

New since v0.1.0-alpha.1

  • Per-finger hand animation driven by the SteamVR skeletal summary: on PS VR2 Sense, Valve Index, and Touch controllers every finger follows its own measured curl, so fingers move independently instead of folding in lockstep.
  • Devices without skeletal input synthesize a natural closing sequence from grip/trigger: pinky and ring start first, middle follows, index stays tied to the trigger.
  • All finger weights pass through an exponential smoother (~70 ms) with a soft deadzone: hands rest fully open and joints move with slight inertia instead of snapping or jittering.
  • Fold axes corrected per hand: the left rig is a Y-mirror of the right, so un-flipped axes curled the left fingers into the back of the hand instead of toward the palm.
  • One plain ±Z fold axis shared by the four fingers removes the widened double middle finger caused by curling around diverging anatomical axes while Ring/Middle share one fused mesh tube.
  • Pinky folds at exact Middle/Ring parity with its axis tilted 15° away from the ring lane, removing the pinky-toward-ring contortion.
  • Thumb frozen at bind pose by decision: its rig chain is too short to reach anything meaningful and no sweep direction read as visible bending on hardware.
  • Interaction laser of both hands uses the SteamVR aim pose with automatic grip-pose fallback when a driver does not provide /pose/aim.

Known limitations (hands)

  • Ring/Middle share one fused tube in the source mesh, so their tips cannot spread independently; the thumb chain is too short to reach the palm flesh, so it stays static during grips.
  • Legacy devices (Vive wands, WMR polling fallback) have no per-finger input: hands follow the synthesized grip sequence only.
  • The full alpha.1 limitations in docs/RELEASES.md still apply.

Install

Double-click Install-PenumbraVR.bat inside the zip: it merges the mod into your Steam installation of Penumbra Overture, backs up every replaced file, and can restore them with -Restore. Launch the game through Steam as usual (SteamVR must be running).

Problems? Open an issue at https://github.com/rubocopter/penumbra_vr_rework/issues and attach the hpl.log.

Penumbra VR v0.1.0-alpha.1 (experimental public alpha)

Choose a tag to compare

@rubocopter rubocopter released this 20 Aug 14:47

Releases

v0.1.0-alpha.1 — 20 August 2026

Experimental public alpha. The full game is playable in VR, but this is not a
stable release: expect bugs and behaviours that still need polish. The
installer backs up every replaced file and can restore them, so trying the mod
does not risk the stock game.

Fixed installer compatibility on systems where the underlying .NET Framework
does not provide System.IO.Path.GetRelativePath (Windows PowerShell 5.1 /
legacy .NET Framework).

Fixed after the initial alpha download (included in this package):

  • Recenter with the Create button now also works in right-handed mode: the
    movement input was silently overriding the recenter flag and dropping an
    idle Create press into the legacy fallback, which has no Create on PS VR2.
  • Interaction ray uses the SteamVR aim pose on every controller profile, with
    automatic grip-pose fallback; a missing aim binding can no longer break hand
    tracking.
  • Thrown and released objects inherit the real hand velocity rotated into
    world space, so throws go where the gesture points instead of whipping
    backwards.
  • The death screen, examine/gameplay messages, and radio subtitles are
    anchored at the UI Distance setting instead of glued to the headset.
  • Equipped HUD items no longer render collision-only submeshes; flashlight
    beam origin sits at the lens instead of floating ahead.
  • Easier grabbing: larger hand interaction volume and a firmer held-object
    feel.

What is in this build

  • Device-independent SteamVR Input actions (gameplay, UI, and global action
    sets) with automatic fallback to the historical OpenVR polling path.
  • A single rigid TrackingToWorld transform for the HMD, both hands, held
    objects, and world-space UI; orientation recentering; snap/smooth/disabled
    turning through world yaw.
  • Persistent VR comfort settings in the [VR] section of settings.cfg,
    editable in-game under Options → VR Settings, grouped into CONTROLS,
    MOVEMENT, CALIBRATION, and DISPLAY sections, with contextual disabling
    (snap angle vs smooth speed depending on Turn Mode; "Detection depth"
    label under physical crouch) and a one-press Recenter action row.
  • Dominant-hand selection (Left/Right) that reselects the mirrored action set
    and drives interaction, pointer, throw, and haptics.
  • Seated and standing play modes; player height with a Calibrate button that
    measures the HMD height and rejects implausible samples.
  • Physical, button, and hybrid crouch that drive the real gameplay collider;
    physical crouch calibrates a standing HMD height with a plausibility band
    (0.90–2.20 m).
  • Room-anchored fullscreen menus and cinematics with scalable text;
    compositor-safe black loading frames for map changes, new game, tutorial,
    and saved-game routes.
  • Controller-ray menu and inventory pointing, restored inventory action
    popups, and localized inventory actions.
  • Semantic haptics routed through intent-named profiles.
  • Room-scale collision reconciliation for swing doors (no walking through
    while leaning) and the held-door collision bypass fix.
  • Rigged HUD hand models animated from the SteamVR skeletal summary.
  • A reversible installer that merges the mod into the Steam installation,
    backs up replaced files, and restores them on request; double-click
    Install-PenumbraVR.bat installs, -Restore uninstalls.

Known limitations

  • Experimental. The hand fold state is frozen as an experimental final and
    still shows incorrect visual behaviours (ring/middle finger fused tube,
    limited index-finger range, basic grip/trigger blend poses).
  • PS VR2 Sense is the only controller family validated on hardware. HTC Vive,
    Valve Index, Meta Quest/Oculus Touch, and Windows Mixed Reality bindings are
    bundled as default profiles but are untested on hardware. Native OpenXR is
    not implemented.
  • Dominant-hand, play-mode, and player-height settings are implemented but
    have not had a full recorded hardware pass on every route.
  • The build is Win32 (legacy third-party binaries); the engine rendering keeps
    the OpenVR compositor path.
  • No guarantee of behaviour across graphics drivers or unusual Windows setups;
    controller reconnection and unusual SteamVR configurations receive limited
    testing.

What to test

The full regression checklist is in the readme. The highest-value checks for
an external tester: Steam launch and tutorial, recenter, new game and save
loading, inventory use and combining, both handedness modes, the three turn
modes, the three crouch modes (physical/button/hybrid), seated play mode, and
the Calibrate button on the Player Height row.

Reporting problems

Open an issue at https://github.com/rubocopter/penumbra_vr_rework/issues.
Attach the hpl.log from the game folder and, for installer problems, the
console output of Install-PenumbraVR.ps1.