Repository navigation
52-measure: measure in VR (V1) + align / distribute / drop from the VR radial (V2) - #422
Merged
Merged
Conversation
…ns, readable troika labels, kept as 48 B2 items - Tools > Measure (radial) arms a trigger tool: every press puts a point down, snapped through the SAME snap-engine search as the desktop (vertex / edge / face, the measure flags) inside a 3 deg cone around the laser - a virtual camera down the ray turns the engine's px radius into an angle; the desktop bias is scaled to the cone (unscaled, an edge seen edge-on beat a corner 1.2 deg off - measured on IWER). A raw point lands on the grid when grid snapping is on. - chains with lengths / angles / total; a double tap (or the Measure ring's Keep) keeps the chain as a 48 B2 measurement ITEM (replicated, undoable, saved); the radial opens on the Measure ring while the tool is up: Keep / Undo point / Discard / Snap / Done (the sculpt ring's rule) - Selected > Edit measurement: a press near a point (by angle) picks it up, the next puts it down snapped, a press elsewhere adds one - measure.js's own edit step (measureEditStep, shared with the desktop click): one undo entry and one message per placed point. Edit mesh is no longer offered for a measurement item. - labels: VRMeasureLabels = troika text on a plate, facing the viewer, a constant ANGLE tall (0.03 rad) so they read the same near and far; measureCore.layoutLabels keeps them apart (every label is the same px tall). MeasureOverlay now draws items in a headset too. - hands: a pinch while measuring says "pick up a controller" and adds nothing (52 input rule) - Interact / leaving the headset / another tool ends it (a chain of 2+ points is kept, the desktop check rule) - tests: vitest vrMeasureCore (14); IWER suite vr-measure-iwer (T M L K N G E H F rows, two peers); vr-radial-menu's Tools list gains Measure. Frame cost on IWER: 0.16 ms/frame (hover search 0.24 ms at 30 Hz, labels 0.06 ms), 20 draw calls for a 4-point chain. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…- the desktop's results, one undo, peers see it
- Selected > Arrange (2+ objects): ONE ring, the radial's two-level rule - Axis (cycles X / Y / Z, value line),
Align min / centre / max, Even centres / Even gaps (3+, greyed below), Drop to ground, Align to (Selection /
Active, the Inspector's switch). Labels carry the axis ("Align X min").
- every sector is DATA (vr/arrangeCore.js, a leaf): sectorOp + arrangeCall name the SAME align.js call, with the
same arguments, that the multi-select Inspector's Arrange buttons and the object menu's Transform rows make -
so the move, the ONE transformSet undo entry and the replication (the move path) are the desktop's own.
- unit-level parity (tests/unit/vrArrangeParity, 23): the table per desktop control, and the REAL align.js run on
two identical scenes, one through the desktop call and one through the ring sector, lands every object in the
same place with one undo entry each (counterfactual: mapping gaps -> centres goes red on 4 checks).
- IWER row A: Selected > Arrange > Align X min picked with the stick (two peers), ONE Undo restores the set on
both, X even gaps, Drop to ground on A and B.
- icons: align-start/center/end-vertical, align-horizontal-space-around, arrow-down-to-line in the VR icon table.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…t in the desktop icon map - iconLint) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… the rings with SHOTS=<dir> (vrEyes) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Collaborator
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
52-measure — V1 measure in VR + V2 align / distribute / drop from the VR radial
Base: the 53 union (
origin/feat/53-int, started early per the 52 rules); 52-int merges v1.43.0 into feat/52 first.V1 — Measure in VR
measureEditStep, which is now shared with the desktop click (desktop behaviour unchanged).VRMeasureLabels.sveltedraws troika text on a dark plate. Each label faces the viewer and is a constant 0.03 rad tall, so it reads the same near and far.layoutLabelskeeps labels from overlapping.V2 — Arrange from the radial
vr/arrangeCore.js) naming the samealign.jscall the desktop makes. That gives the same results, one undo entry, and replication through the move path.Proof
vrMeasureCore(14) andvrArrangeParity(23). The parity test runs the realalign.json two identical scenes, one through the desktop call and one through the ring sector, and checks they land the same. Counterfactual: mapping gaps → centres turns 4 checks red.vr-measure-iwer(two peers): 71 checks green. Rows: Tools from the stick · corner snap (snap-off counterfactual in-suite) · labels facing and growing with distance · double-tap keep, synced to B · grid · edit + undo on both peers · hands · Arrange by stick with one undo on both peers · frame cost.~/.code/lanes-30/after-52/52-measure/.Shared-file touch points (small additive edits)
vrRadialMenu.js: one import, one call inregisterBuiltins,ringTitle('measure'), and Edit mesh hidden for a measurement item.vr/iconData.js: six icons appended.debugHooks.js: four rows.MeasureOverlay.svelte: draws items in VR and mounts the VR labels.measure.js: exportsMEASURE_TARGETS/MEASURE_BIAS/RADIUS_MOUSEandmeasureEditStep.tests/e2e/vr-radial-menu: the Tools list gains Measure.Owed on a real Quest (int + device checklist)
Laser feel and the 3° cone, label legibility at the true eye resolution, haptic ticks, double-tap timing, and how the Arrange ring reads.
🤖 Generated with Claude Code