Repository navigation
Releases: genesisinteractive/QuestRoomScan
Release list
Quest Room Scan 1.3.2
Requires Unity 6.2. Unity 6.0 installed the package and then failed to compile VRDocumentRaycaster, because WorldDocumentRaycaster does not exist before 6000.2.
Changed
- Minimum Unity version is
6000.2.
Install pin: https://github.com/genesisinteractive/QuestRoomScan.git#v1.3.2
Package 1.3.1: genesisinteractive URLs, profiled hitch log
The package now lives at genesisinteractive/QuestRoomScan; the previous GitHub URL redirects. When profileRefinement is on, every compositor frame over 25 ms is logged with the current pipeline stage, not only in the end summary.
Install:
https://github.com/genesisinteractive/QuestRoomScan.git#v1.3.1
1.3.0 — texture-quality regression fix
Fixes a texture-quality regression from 1.0–1.1: close-up keyframes were beating standing head-on views (N·V / distance, then exclusive blend admission). Standing, head-on frames now win when both exist. Close-up photos stay on disk and still fill holes.
Also: hosts can freeze and unfreeze with a custom spotlight cone.
Highlights
- Quality regression fix — atlas score is head-on × working-distance (peak 0.8–2 m), not
N·V / distance - Blend is hero-only; pass 2 is top-K; chart hero needs a cover floor
- Exposure gains match the standing pass-1 atlas (
exposureGainLimit1.6) - Denser keyframe bands (lean-in vs standing, 8° wall yaw); hand-heavy frames kept
FreezeInView(origin, direction, halfAngleDegrees, maxMetres)/ matching unfreeze. Length 0 is unbounded
Full notes in CHANGELOG.md.
Install: "com.genesis.roomscan": "https://github.com/arghyasur1991/QuestRoomScan.git#v1.3.0"
1.2.0 — texture refinement is much faster both in wall clock time and also holds 72 fps
Texture refinement is much faster and holds 72 fps on Quest 3 through unwrap and both bake passes (it used to drop into the 30s).
Also: denser keyframes, views that agree across seams, and game APIs for an anchor-frame mesh, when to present the refined result, and which scene planes to copy.
Highlights
- Holds 72 fps — pipelined one-keyframe-per-frame GPU atlas, texel-parallel shade, worker JPEG decode, xatlas capped to 3 niced threads
- Denser keyframes (0.15 m / 10° / 0.25 s) with worker-side capture encode
- Keyframe registration, chart-consistent blend, exposure equalisation, seam levelling
simplifyBeforeUnwrapdefault onScanResult.AnchorFrameMesh,PresentRefinedWhenReady,SceneFaceKind- Profiling kept, default off
Full notes in CHANGELOG.md.
Install: "com.genesis.roomscan": "https://github.com/arghyasur1991/QuestRoomScan.git#v1.2.0"
1.1.0 — analytic scan progress, body exclusion, hand-free bake
Analytic scan progress from the boundary of observed free space (leaks = free–void faces; ScanCoverage.LeakAreaM2 is the absolute gate), leak tint / hole list / continuous leak fill from one label volume, body-exclusion capsules at depth sample and voxel, hand-free texture bake, shell coverage and auto-fill as guidance, capped multi-view bake, head-cone freeze. Removes the legacy frozen-fraction / plateau progress blend.
Full notes: CHANGELOG.md → 1.1.0.
Install: "com.genesis.roomscan": "https://github.com/arghyasur1991/QuestRoomScan.git#v1.1.0"
QuestRoomScan 1.0.0 — first stable release
Real-time 3D room reconstruction for Meta Quest 3 / 3S in Unity 6 (URP, OpenXR + Meta XR SDK 205). Point the headset around a room and get a textured, persistent, relocatable mesh of it — GPU-only during the scan, with a high-level RoomScanSession facade for games and a full VR debug menu for development.
This is the first stable release. RoomScanSession is API-stable from here; breaking changes bump the major version. The v0.1.0 tag from March predates almost everything below.
Install, pinned:
"com.genesis.roomscan": "https://github.com/arghyasur1991/QuestRoomScan.git#v1.0.0"Then RoomScan → Setup Scene → Apply Game-Ready Setup. Full docs: README · ALGORITHM · CHANGELOG.
What the package does
Live scan (all on the GPU, zero CPU readback)
- TSDF volume integration from the Quest depth sensor (256³, RG8 SNorm + RGBA8 colour), with bilateral depth filtering, dilation, normals, adaptive weighting and pruning.
- GPU Surface Nets mesh extraction via compute shaders, rendered with a single
Graphics.RenderPrimitivesIndirectdraw. Adaptive per-vertex temporal damping, HC Laplacian smoothing, plane-snap regularization. - Two-layer real-time texturing: a triplanar world-space colour cache (~8 mm/texel) from the passthrough RGB camera, with vertex colour as fallback. Triplanar can be disabled to save ~240 MB.
- Presentation-only live-mesh birth fade and hold-and-morph between extractions, so the mesh grows in rather than popping.
FreezeInView/UnfreezeInViewto paint regions done;ScanCoverage/ScanProgressmetrics for guided UX; exclusion zones around tracked heads; render modes Wireframe / Vertex / Triplanar / Refined / Occlusion / Splat / None.
Scan priors from the Scene API (optional RoomUnderstanding)
ConfineScanToContainingRoom: TSDF clipped to the MRUK room the headset is in (outer walls / floor / ceiling expanded 50 cm, then hard-confined). Default off.StampScreenPlanes: MRUKSCREEN(TV) planes written as analytic TSDF slabs so glass depth does not become noise. Default on.
Refinement and persistence
- Texture refinement: xatlas UV unwrap (native plugin builds on macOS / Windows / Linux hosts), multi-view atlas bake from motion-gated keyframes, Sobel normal maps, UV-preserving post-bake simplification via meshoptimizer.
- Package-based persistence: each scan is a self-contained
pkg_YYYYMMDD_HHMMSS/(TSDF, triplanar, keyframes, refined mesh + atlas, splat) with a manifest.LoadRefinedOnlyAsyncloads mesh + atlas in under a second, no TSDF. OVRSpatialAnchorrelocation per package with per-artifact creation matrices, so artifacts made in different sessions line up. Each package also stores the Scene API UUID of the room it was scanned in.RoomSpaceRoot: parent your content under it and saved local coordinates reload into the same physical spot across sessions.
Game integration (RoomScanSession)
StartScanAsync→FreezeInView→FinalizeScanAsync→ScanResult(mesh + atlas + package id).LoadAsync(id)/LoadLatestAsync/LoadRefinedOnlyAsync;ListSavedScans/DeleteScanAsync/UnloadActiveScanAsync/ClearAllScansAsync.- One serialised permission queue.
StartScanAsyncrequests whatever is missing before bring-up —USE_SCENE(required), thenHEADSET_CAMERA/USE_ANCHOR_API(degrade gracefully) — so a bare call always gets its dialogs and no two can race.Request{Scene,Camera,Anchor}PermissionAsynclet a host front-load them for UX. - Scene-room occupancy that does not trust
GetCurrentRoom():IsHeadsetInsideASceneRoom,IsHeadsetInsideBoundSceneRoom,HeadsetSceneRoomUuid,BoundSceneRoomUuid,TryRebindBoundSceneRoomIfHeadsetMatches,CopyHeadsetRoomWallFaces(visible walls and TVs for pinning world-space UI). - Discovery control without surprise Space Setup:
WaitUntilRoomReadyAsync,HasSceneRooms,ReloadSceneFromDeviceAsync,RequestSpaceSetupAndReloadAsync. - Depth sensor and RGB camera run only during a scan; nothing opens at boot.
- Scene discovery always completes (
RoomReady/IsRoomLoadedsignal on zero rooms, denied permission, or a missingSceneLoadedEvent), so a host is never left waiting.
Beyond the mesh
- Gaussian Splat pipeline: keyframes + PLY point cloud → server training → on-device rendering (gated behind
HAS_GAUSSIAN_SPLATTING). - Optional YOLO object detection through Unity Inference Engine with GPU NMS (
HAS_AI_INFERENCE), projected into 3D and merged with MRUK anchors in aSceneObjectRegistry, with a debug visualizer. - Server-side atlas and mesh enhancement clients.
Tooling
- Game-ready setup wizard: Meta Building Blocks, URP pipeline, build profile, VR UI input pipeline,
AndroidManifestchecks, shader wiring, xatlas build, and game-proven defaults (extract 8 Hz, keyframes 0.4 m / 20° / 1 s, post-bake simplify 0.5). - Two-panel world-space VR debug menu: scan, saved-scan browser with load/delete, refine, Gaussian Splat, tools.
Requirements
Unity 6000.0+, URP 17, AR Foundation 6.1, Meta XR Core SDK + MRUK 205, Quest 3 / 3S. Android permissions USE_SCENE, USE_ANCHOR_API, horizonos.permission.HEADSET_CAMERA.
Used in production by CoasterMania on the Meta Store. MIT licensed.