GL_OVR_multiview2 (vr.multiview, on by default): the scene drawn once from
between the eyes into a two-layer target, each view's positions moved to
its eye in the vertex programs; the sky as though infinitely far, what the
game projects itself by its depth, screen reads from a composite of both
eyes. At one spot in 'Halo': both eyes 6.3 ms -> 4.0 ms, the frame's work
7.9 -> 5.8 ms. Also: no VR facing during cinematics, hands held still under
the system menu. Merged with reservations; one-time diagnostics log what
may still be off.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Seated in a level's opening cinematic (a passenger), the right controller
turned the game's camera the flat screen shows. The scripted-camera rule
went back out: the main menu is a scripted camera and was immersive.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A scripted camera outside a cinematic (a level's intro) was drawn in
stereo from the head, with the weapon at the controllers in it; it now
goes to the screen like a cinematic. Under the system menu the headset
reports no hands and the weapon fell back to the head; the hands last
seen in focus stand in meanwhile, their buttons let go.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sprites, light volumes (a plasma bolt's glow) and lens flare tests are
projected on the CPU into screen pixels with w 1 and their depth in z, and
the widgets' vertex program takes them to clip space: taken for a point
1 world unit away, a bolt 30 away stood 3 m off in stereo and seemed to be
swallowed half way. Where w is 1 and depth is tested, the depth comes from
z by the shared camera's projection (mv_depth), and the eye's offset is by
it. (Also logs, once each, the other targets the pass draws into.)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Measured at one spot in 'Halo': both eyes 6.3 ms one by one, 4.0 ms at
once; the frame's work 7.9 ms against 5.8 ms (90 Hz).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The shared view reaches further right than the left eye: the sun there
was measured on a stale picture and its glow shrank as the head turned.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sun's glow measures the picture about the sun where the shared camera
has it; the left eye's picture, copied as it is, put the sun elsewhere
(a black patch on the rock, the sun through a gap as the head turned). It
is now laid where it lies in the shared camera's picture. Logs, once each,
the render targets drawing into both eyes reads.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A lens flare is drawn in screen space, at where the sun is in the shared
view, which is wider than an eye's: drawn alike in both layers, the sun
and its occlusion test landed elsewhere in each eye (the sky seemed to tear
open onto the sun). Screen-space positions now take each view's mapping
without the eye's offset.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sky is drawn about the camera (its view has no position), so no eye
stands aside of it; the eye's offset made it a dome a few metres away,
flat and swimming (the sea in 'Halo' is the sky's). Its draws take rows
without the offset.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With GL_OVR_multiview2 (vr.multiview), the scene is drawn once, from a
camera between the eyes whose view takes in both (plus a margin), into a
two-layer back buffer: every NV2A vertex program gets a two-view variant
that moves each view's clip position to its eye (x' = a x + b w + c, from
the shared view's and the eye's edges and the eye's place; nv2a_vsh.c),
screen-space geometry excepted. Sampling the back buffer meanwhile reads
the left eye's picture; visibility counts are halved. The host copies each
layer to its eye's image (host_xr_copy_layer_array).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Seated first person that turns with the vehicle, right-stick steering,
controller-aimed guns (as by handles), own body at wheel and gun, eyes
raised over enclosing hulls, vehicle guns converging on the player's aim,
comfort vignette, X as the action button, and a vehicle-spawn test aid.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The right stick's deflection past the dead zone is squared
(vr.vehicle_steer_curve) and eased in over ~0.12 s
(vr.vehicle_steer_smoothing): a Ghost's or Banshee's crosshair moves
finely near the middle and no longer leaps; full deflection still steers
the whole vr.vehicle_steer_degrees.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The game steers a vehicle gun's shots (within its deviation cone) at what
the camera aims at; VR had replaced that camera with the barrel's own
line, right on foot but not seated, where a Banshee's nose rises as it
hovers and a tank's turret lags: the Banshee's crosshair rode high. Seated,
the camera is now the player's eyes and the unit's aim (the stick's steer,
the controller at a gun), and the crosshair floats on that line; the
barrel-line crosshair is gone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
debug.vehicle_spawn: holding both thumbsticks in for 1.5 s puts the next
vehicle the map has loaded (not the Pelican, dropship or lifepod) a few
metres ahead of the player, cycling through them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A vehicle's gun, once manned, fires along its own barrel (not the aiming
vector) from its primary trigger, moved onto the vehicle's camera line if
it fires from its camera. The crosshair ran from the right hand along the
controller instead, and the Scorpion's shells landed above and behind it.
It now floats on the gun's own line (weapon_vr_manned_gun_line), as the
turret actually points.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The collision model's top lifted the Scorpion's driver onto the turret as
it swung over him (screenshots); it never caught anything the set heights
did not.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Like the Ghost's: the driver sits down in the hull (screenshot: the
compartment's inside). The raise applies to a vehicle's driver and gunner
only; riders on a tank's back sit on it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Their collision models leave out what hid the view (screenshots: the
Ghost's hood arches over the rider's eyes, the Shade's shield sits at
them). The eyes now rise by a set height per kind of hull
(vr.ghost_eye_raise, vr.banshee_eye_raise, vr.turret_eye_raise), and at
least over the collision model's top.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Their rider bends down into the vehicle, and the eyes at his head looked
into his own shoulders.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Their riders sit down in the hull, drawn from behind in the game; from the
rider's head the view met its inside. The eyes now rise to above the hull's
top over the head and up to 50 cm ahead of it (a downward ray against the
vehicle's own collision model), plus vr.enclosed_seat_clearance.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Seated as a driver or gunner, the player's body is drawn (its hands on
the wheel or the gun's handles, as the seat animates them), its head
shrunk to nothing out of the eyes' way. A gunner's view is moved back from
the gun's sights (vr.gunner_camera_back). Glass tints and reflects half as
much (vr.glass_strength), which up close hid the view through the
Warthog's windscreen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Seated, the first-person camera stood where the seat's chase camera turns
about (the vehicle's middle, low); it is now at the rider's head marker.
X now does what the game's prompts say it does (action, reload); B takes
the flashlight (tap) and grenade switch (hold).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Seated, the view stays behind the player's own eyes (vr.vehicle_first_person)
and turns with the vehicle, smoothly between ticks (its interpolated
heading); the head looks around freely, and recentring faces the vehicle's
forward. A driver who steers by facing (jeep, boat, plane, scout, fighter)
steers with the right stick: aside up to vr.vehicle_steer_degrees off the
heading, up and down for pitch (vr.vehicle_pitch_degrees). Gunners, the
tank's driver and passengers aim with the right controller, and turn in
the seat with the stick. The crosshair and its distance follow the
vehicle's aim. While the vehicle turns the player, the eye images darken
from their edges (vr.comfort_vignette, host_xr_set_vignette).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The grip's forward runs through the fist (towards the index finger), not
along the fingers; the step towards the wrist is taken along the drawn
hand's fingers (vr.grenade_back) instead.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The hands are drawn over the world, so they hid the grenade wherever they
overlapped it, and turning the palm up showed it behind the hand. It is now
drawn in the first-person pass with them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The held grenade is drawn in front of the left palm (vr.grenade_right,
_forward, _up from the grip) at 0.55 of its size (vr.grenade_scale).
A hand-thrown grenade is no longer brought up to the projectile's final
velocity, which made every throw as far; strength now runs from 0.25 to
full at 5 m/s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first-person view leaves out the player's body and what hangs from it,
the grenade in hand too. While the left trigger holds it, it is drawn at
the left controller each frame. Logs the grenade's hold and release for
testing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The left trigger holds the grenade in the hand (the game keeps it there
past the throw animation); letting go throws it from the left hand, along
the fastest the hand moved over its last 150 ms, as hard as that was (full
at 4 m/s). Without a throw (vr.grenade_throw_speed, 1.5 m/s) the game
throws as before. The left hand's swing is no melee while throwing, and
the arms keep their pose through the throw animation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Halo draws its centre prompts as crosshair elements of the weapon HUD.
Only the reticle states now go to the crosshair layer; the message states
are drawn in the head-locked HUD, also while zoomed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The crosshair used to be cut out of the HUD image (an 80x80 region around
the centre) and moved to where the weapon aims, taking with it whatever
else lay there, such as part of the reload prompt. Now it is drawn alone
first (hud_draw_crosshair), captured into its layer, and the HUD is drawn
afterwards without it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Shots started at an offset from the unit's eye point (its sight
position), the crosshair at the same offset from the drawn camera; the two
need not agree, and the shots ran parallel to the crosshair's line, a few
centimetres higher (plain on the pistol's small crosshair). Both now start
at the same point in the world, the drawn weapon's muzzle.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>