In a seat seen from it (vr.vehicle_view "first_person"), vr.body now draws
the player's body as the game seats it, with only the head and neck taken
away: its own animation has the hands on the Warthog's wheel (turning with
the steering), on the turret's handles, on the Banshee's controls. The
view rides at its head, so its shoulders sat inside the near plane, cut
into flat shards across the view: the chest and all on it go back 12 cm
and down 4 cm (along the way the body faces, from its shoulders, so a
gunner's follows the turret), each arm reaches from its moved shoulder to
where the animation had its hand, elbow bent as before, and the hands are
put back as animated.
Dumps on the device, driver and gunner of a Warthog (b30) and a Banshee's
pilot (b40), looking down: the arms reach the wheel, handles and controls,
the chest and legs below, the shoulder shards gone but for a small flap at
the view's lower corner.
At 1.5x the GPU needed 11.5 ms a frame (timestamps, vr.timing_gpu_stamps),
over 90 Hz's 11.1, almost all of it the eyes' pixels. The runtime's
visibility mask (XR_KHR_visibility_mask, 15.6% of each eye's image on the
Frame) is now drawn first in each eye's pass at the near plane, black, so
the scene is not shaded there (vr.visibility_mask, on). Two things it took:
the device binds its target and viewport lazily, so the mask binds the
eye's first (halo_vr_bind_current_target); and its depth goes through the
position, not gl_FragDepth, which turned Adreno's early depth culling off
for the rest of the pass (it saved 0.3 ms that way, 1.5 ms this way).
On the device in a30 at 1.5x: the GPU's frame from 11.5 to 10.0 ms (the
eyes 4.4/5.1 to 3.6/4.1), 85.5 fps with 45 misses in 10 s to 89.4 with 2
to 5. Cutscenes (the 3D screen, not masked) hold 78 to 89.
Also: vr.timing_gpu_passes (each pass waited for; Zink's glFinish costs
too much for it to mean much), glQueryCounterEXT and
glGetQueryObjectui64vEXT for the guest, the mask's share logged.
vr.body is now "off", "legs" (the hips down: all above the spine scaled
away, set 5 cm behind the eyes) or "torso" (the chest down, 10 cm behind
and 15 cm below, as before), and BODY on the VR settings' second page sets
it, taking effect at once. Looking down, the legs alone have nothing near
the eyes (no shards, no collar), though from above the hips' top hides
much of the legs; the torso shows the chest armour and a dark collar.
Dumps only: which reads better worn is for the player.
Halo draws no body of the player's own in first person. With vr.body
"legs" (off by default) the eyes' passes draw the player's unit, on foot
and outside cutscenes, from a copy of its bones' matrices: the head, neck
and upper arms (and all under them) scaled away, the body turned to the
head's yaw (as the first-person shoulders now are) and moved under the
head, 12 cm behind the eyes. What the unit carries (its third-person
weapon) is not drawn with it, nor is its shadow. The body's bone names are
logged once, with which are hidden. The head-yaw direction is now shared
with the shoulders (vr_head_yaw_forward). Built only; not yet run.
SteamVR's GL binding makes its own context current for every swapchain
acquire, wait and release (and the game's again after), each a flush,
fences and trace markers in Zink: on the device they were a fifth of the
game thread's cycles. The eyes and the quad (HUD or flat screen) are now
parts of one atlas swapchain, acquired by whichever part comes first and
released as the frame ends; the layers take their parts' rectangles
(halo_xr_info.x, .y). Every layer shown is still drawn the frame it is
shown, as a new image of the atlas is each frame's.
On the device at 90 Hz and 1.0x: a30 play from 10.3 to 7.8-9.9 ms of CPU
a frame, 84-90 to 87-90 fps; a10's opening cutscene at 89-90 fps. Dumps of
a stereo frame (eyes, HUD) and a cutscene frame (the 3D screen's eyes)
show each part where it belongs.
docs/VR_ARCHITECTURE.md: the View system layer (short press, 1 s, 3 s) and
what a recentre does, the Touch and Index fallbacks, QUIT TO STEAM, the
settings file's version, migration and ranges, the display rate request and
its automatic fall back to 72 Hz (which the doc did not mention), the nine
host imports, and status rows for each of these marked not yet run on the
device, with the standard's items still to do.
far keeps the HUD as it was (15 m, 10 m wide, head-locked, drawn from the
head). near brings it to 1.5 m, 1.1 m wide (40 degrees), in LOCAL space at
the head's place turned by its yaw and pitch but not its roll. leash holds
that panel level in the room, following the head's position, and eases it
(about 0.3 s) to the head's yaw only once the head is 25 degrees off it;
a recentre or a return from a flat screen puts it ahead again.
vr.hud_distance and vr.hud_width now default to 0, the mode's own, and
override it when above 0. The HUD pass is drawn from the head's place
turned as the panel is (vr_hud_view), with bounds from the same distance
and width in every mode, and the menus' pointer meets the panel where it
is. Documented in docs/VR_ARCHITECTURE.md.
When a level's tags load, the VR build adds widget tags cloned from the
solo pause menu's (same font, colours, buttons and boxes): a fifth item,
VR SETTINGS, in the pause list (its button hints move under the mission
objectives to make room), and a screen of nine settings in two columns -
controls, aim, gun hand, turning, room-scale, scope, vehicle view,
steering and cutscenes. A or right steps a setting on, left back, B
returns to the pause menu; the laser pointer clicks them too.
Changes are written into config.toml (config_write_real/_string join
config_write_boolean) and the VR layer takes them up at once
(vr_reload_settings). cache_file_add_tag adds tags made in memory after
a map's own; the buttons' text and changes come through a new game data
input function and two event handler functions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vr.roomscale (off by default, after the PC mod HaloCEVR's) moves the
player's collision pill each tick by how far the head walked from where
they stand, through collision_move_pill so walls stop or slide it as
walking does. The eyes lean from that standing place blended between its
last two ticks, as the game's camera is, so walking adds no latency and
no judder at the 30 Hz ticks. Vehicles, cutscenes, scripted holds,
death and network games pause it; a jump of over 0.5 m in a tick is
taken up without moving. vr.diag_walk_speed walks the synthetic head for
unattended checks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The hand's aim drives the menus' mouse pointer (halo_ui_pointer_update),
on the flat screen or, for the pause menu in stereo, the HUD's panel.
The trigger clicks, the right B goes back, and a dot on the reticle's
layer marks the spot. After the PC mod HaloCEVR's menu pointer.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The HUD panel defaults to 15 m away and 10 m wide (about 37 degrees, as
the PC mod HaloCEVR's), so the eyes need not refocus between it and the
world. Its pass is drawn from the head's camera with frustum bounds
matching the panel, so nav points and friends' names sit over what they
mark rather than following the hand's aim. The motion sensor turns with
the head too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
While a hand-aimed weapon is zoomed, a pass between the eyes and the HUD
renders the view along the gun into a corner of the back buffer, sized
to the scope's 768x768 image. It goes through a sight mask (round, or
the sniper rifle's wide one) onto a layer held at the gun, at the PC
mod HaloCEVR's per-weapon offsets. The eyes never zoom: the first-person
gun stays in the hand and the HUD layer drops the zoom mask.
vr.scope and vr.scope_size are the settings; vr.diag_zoom_seconds zooms
unattended for dumps (vr-scope.bmp). The docs now cover the VR controls,
gestures, weapon feel and scope, and credit LivingFray's HaloCEVR for
their designs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vr.vehicle_view "first_person" (the default) has the director treat every
seat as first person, which hides the player's body, and puts the eyes at
the player's head in the seat (a seat's camera marker is where the chase
camera sits). The view turns with the vehicle's yaw only, the horizon
kept level; a passenger seat facing aside keeps its turn from the
vehicle. The player's own gun is put away in driver and gunner seats.
vr.vehicle_steering "stick" (the default) leaves a driver's facing to the
game, so the right stick steers (and pitches the Banshee) as on a flat
screen while the head only looks; "head" and "hand" steer where you look
or point. Gunners aim with the head relative to the vehicle, so a turret
follows the head without turning the view.
vr.diag_drive_seconds seats the player as the nearest vehicle's driver,
for unattended checks (after cheat_all_vehicles). The headset went
offline before the first vehicle test ran; the build is warning-clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The build is registered on the Frame as a Lepton devkit title, HaloCEVR,
which deploy.sh keeps up to date, so the game starts from the Steam
library without the Mac. SteamVR offers an app only the rate its display
setting is on, so vr.refresh_rate takes the highest offered at or below
it; the docs say where to set 90 Hz.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It is staged in build/android/jniLibs-vr, which only the vr flavour
packages, instead of beside the flat build's libraries.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Recover transparent geometry submit (+1,285 meaningful code, zero exact losses); reconcile COMMON ownership and Q10 85+EXT1 credit, actions/main data, and separately disclosed denominator corrections. Preserve canonical-only repairs and all held research. C09 is ordinary disclosed cleanup, not a claim of proven scaffolding intent. Clean rebuild, 1,663 tests, parks, audits, provider links and independent EXT1 check pass. Local reconciliation only.
Import only independently reviewed production changes. Preserve canonical physics and virtual-keyboard repairs; keep B3 and all unresolved holds out.
Record exactly four approved canary debits (6987 meaningful bytes), six Halo admissions and two revocations. Keep vendor ioinit/storage work separate. Full build, 8252-row sweep, 1318 tests, park/admission/fake audits and 621-object binding pass within approved debit bounds.
Do not publish donor research dumps or private assets. README and unrelated user research remain untouched. See frontier_publication_reconciliation_20260927.md for complete evidence limits and accounting.
PD2 from e3c053cd, HS-only append. +53122 raw data+1658 padding=54780, no code/functions/objects. Current provider seals and negative tests pass; full build, stable sweep, parks, admission, 1318 tools tests pass. No scorer upgrade or actions credit.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Source from Claude donor d18a7cee; independent stock and W3 builds, full build and stable sweep: +11 meaningful /16 padded Halo code, +1796 data, zero exact losses. 1161 tools tests pass. No declaration-batch or general UB exception.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Independently gate storage + K, OQ-4 P-a/P-b1, four static-local packets and comment-only disclosures. Preserve all 7641 exact owner rows, 71 valid parks and 1161 passing tests; code/data credit unchanged. G and game_engine admission remain held because current canonical loses populate_statistic_buffer. Existing collision static-local repair is not duplicated. No donor tree, held candidate, scorer or private asset imported.
Archives 714 meaningful bytes of new strict code, fresh full-board gates, source evidence and failed controls. Qualifies cross-build source inference and blanket Od claims. Whole-object hardware-bitmap admission remains pending; no holds lifted or push performed.
Records 2 canonical gains, 1481 meaningful / 1504 padded bytes, zero regressions, unchanged data and object counts, source-provenance limits and preserved holds. Archives selected donor evidence and fresh canonical verification pins. No publication performed.
Archive bounded source evidence and canonical section, warning, test and regression checks for actor_path_refresh and display_scenario_help. Distinguish 2024 non-tail-padding bytes from 2048 padded bytes and the frozen scorer delta2029: linear decoding of the actor jump table includes five trailing NOP bytes. No scorer change or new admission exception. Donor remains untouched; nothing pushed.
Independently reconcile W7 from 26684ca8: +1440 credited/padded bytes, 117 relocations, no new helpers or runtime owners. Retire only main_update_time's park in the same commit. Full build, stable board sweep with zero regressions, ownership/admission, warnings, fake scan and 1161 tests pass. No scorer or header changes.
Independently reconcile the +968-byte landing from 455dffad. All seven target-only view casts strip without changing runtime sections; both new helper copies match January and link with selected providers in both orders. Batch: +3 functions, +4208 canonical credited code bytes, +4224 padded, zero regressions; 1161 tests pass. No whole-object or data credit changes.