Skip to content

Releases: ReactVision/virocore

v3.0.3

Choose a tag to compare

@doranteseduardo doranteseduardo released this 07 Oct 03:49
2371024

v3.0.3

A patch release for Meta Quest, iOS and the physics and recording paths. The native build ships inside @reactvision/react-viro 3.0.3. It links Spatial 1.3.1, which pins platform requests to the database's region.

Meta Quest

  • A scene opened after another AR scene gets the room's planes. The session published each plane only to the scene attached when it was first found, so a plane scene opened from an AR scene never fired onAnchorFound. A new scene now receives every plane found so far.
  • The boundary is hidden while passthrough is on, through XR_META_boundary_visibility, and comes back for a fully virtual scene. The app has to declare com.oculus.permission.BOUNDARY_VISIBILITY; the viro Expo plugin does.

iOS

  • A session-only app no longer asks for location when it opens an AR scene. Core Location starts only when RVApiKey and RVProjectId are set, as before 3.0.2. An anchor hosted on a session records no GPS fix.
  • Camera texture recordings carry audio. The microphone is live only while recording.

Android

  • startRecording without RECORD_AUDIO fails through its callback instead of leaving the caller waiting forever, and camera-open and device errors reach it too.

Everywhere

  • onCollision fires against the AR world mesh, with the mesh's collisionTag. Ray and hit tests skip the mesh as before.
  • A session can carry a function region (setSession(..., functionRegion) on Android, +setStudioSessionBaseUrl:accessToken:clientTag:functionRegion: on iOS), which the cloud-anchor providers send as x-region. The three-argument forms still work.
  • VROGeospatial.h is one header again: both copies call the earth-tracking state Enabled. Nothing changes at runtime.

What's Changed

Other Changes

Full Changelog: v3.0.2...v3.0.3

v3.0.2

Choose a tag to compare

@doranteseduardo doranteseduardo released this 01 Oct 02:00

ViroCore 3.0.2

Web renderer fixes, Quest input and capture, and cloud anchors and co-location that work with a signed-in user instead of an API key. The web build ships inside @reactvision/viro-web-renderer 1.0.1, and the native build inside @reactvision/react-viro 3.0.2. It links Spatial 1.3.0 on every platform, visionOS included.

Web

  • The heap grows. It was fixed at 256 MB, and a single generated or photogrammetry GLB of 30 to 40 MB crossed it once decoded. abort("OOM") is permanent in Emscripten, so the whole renderer died rather than the one model. The heap now grows to 2 GB. A failure past that still aborts, and viro-web-renderer reports it through onAbort.
  • Taps are no longer mirrored vertically. Y was flipped twice on the way to unproject.
  • AR holds the last pose through a tracking dropout instead of snapping the scene to identity rotation. Limited applies the new rotation and holds the position.
  • Source textures (viroCreateSourceTexture, viroUpdateTextureFromSource) are filled by the GPU straight from a <video>, <canvas>, ImageBitmap or VideoFrame. The AR camera feed uses them instead of a per-frame readback and upload.

Meta Quest

  • Gaze works on every Quest. Where there is no eye tracker it falls back to the head pose. The head-pose hit drives hover and the reticle only, so it never takes fuse, pinch, rotate or drag away from the controller in use.
  • Screen capture. ViroViewOpenXR now creates a ViroMediaRecorder, sized to one eye's swapchain. A passthrough capture holds the virtual content on transparency, since the OS composites the room underneath.
  • AR hit test against the planes the session tracks, reachable through ViroViewOpenXR.performARHitTestWithRay from the camera along a ray or from an origin to a destination.
  • Two drags at once, one per hand. Each hand drags its own node and releases it independently. A hand can't grab a node the other one holds, and its own onMove and fuse stay on what it points at. Single-pointer platforms behave as before.
  • Controllers vibrate on click, on the hand that pressed.
  • The left-palm menu pinch with hand tracking reaches the app as the Menu button does. A pinch made during a system gesture no longer also counts as a select.

Cloud anchors and co-location

  • A signed-in session authenticates cloud anchors and the co-location channel (VROReactVisionAuth, com.viro.core.ReactVisionAuth). Each request reads its credential when it is sent, and a session wins over a key. On iOS a session that arrives after the AR scene mounted is picked up. With neither a session nor a key, a request fails right away with "Not signed in".
  • Cancelling works. rvCancelOperations() (ARScene.rvCancelOperations() on Android) cancels pending ReactVision hosts and resolves, which report ErrorCancelled once, and closes an open scan. An upload already in flight can still leave an anchor, which expires with its TTL.
  • Scan status reports its points. triangulatedPoints and minTriangulatedPoints show how far a scan is from the host floor.
  • A scan now needs 300 triangulated points to host, up from 40. This applies to key-only apps too. Maps of 96 and 211 points used to host, and then no other device could resolve against them.

All platforms

  • Loading a glTF no longer copies the model. It moves into a shared pointer and images decode in place, which lowers peak memory on large files. VROPlatformLoadImageWithBufferedData takes its buffer by const &.
  • Remounting a navigator with physics no longer crashes (btDbvtBroadphase::destroyProxy on teardown).
  • iOS: text no longer comes back garbled after a navigator remounts. The old view's GL cleanup ran in the new view's context.
  • Android: remounting a navigator no longer crashes (AAssetManager_open on a null manager in the new renderer's first frame).
  • Quest: hit tests, screenshots and recordings work. A hit test from JS crashed on the OpenXR thread, a screenshot aborted on an assertion, and every recording after the first came out black.
  • Quest: the laser follows a dragged object, and a drag whose node leaves the scene (a scene change mid-drag) ends instead of crashing.
  • iOS: a gesture in flight during AR teardown no longer crashes (EXC_BAD_ACCESS in handleLongPress:).

What's Changed

Other Changes

New Contributors

Full Changelog: v3.0.1...v3.0.2

v3.0.1

Choose a tag to compare

@doranteseduardo doranteseduardo released this 21 Sep 23:31
efa030b

Release Notes

v3.0.1

Four fixes to shared coordinate frames on Meta Quest, all of them in the same call path, each one hidden behind the last. The renderer ships inside @reactvision/react-viro as prebuilt binaries; upgrade that package to 3.0.1 to get these.

Fixed

  • Four OpenXR extensions are now requested at instance creation. XR_FB_spatial_entity_storage, XR_FB_spatial_entity_sharing, XR_META_spatial_entity_sharing and XR_META_spatial_entity_group_sharing. xrGetInstanceProcAddr refuses a function whose extension was not enabled, so xrShareSpacesMETA never loaded, the capability flag stayed false, and every shared-frame call reported the feature unavailable on hardware that supports it.

    The last two are different extensions and the distinction is easy to miss: xrShareSpacesMETA is declared by XR_META_spatial_entity_sharing, while XR_META_spatial_entity_group_sharing only adds the group-uuid recipient and filter. Enabling the group one alone loads no function and reports "XR_META_spatial_entity_group_sharing not present" — naming the extension that is present rather than the one that is not. static_asserts now fail the build if any of the four leaves the list.

  • The event loop forwards XR_TYPE_EVENT_DATA_SPATIAL_ANCHOR_CREATE_COMPLETE_FB and XR_TYPE_EVENT_DATA_SHARE_SPACES_COMPLETE_META. onSpatialEvent had handlers for both; xrPollEvent's switch forwarded three of the five types it handles and dropped these two into default. Every spatial-entity call is asynchronous and answers through an event, so an event that is not forwarded is a call that never completes — no error, no timeout, just a callback that is never invoked. On device the anchor was created successfully and nothing was ever told about it.

  • The group filter chains on XrSpaceQueryInfoFB::next, not ::filter. filter takes the FB filter types — uuid, component — and the runtime rejects an unrecognised one with XR_ERROR_VALIDATION_FAILURE. The group filter is an extension struct and chains like every other META addition to an FB call.

Verified on a Quest 3: xrCreateSpatialAnchorFB → STORABLE and SHARABLE → xrShareSpacesMETA round-trips, and a group query recovers the frame.

Requires horizonos.permission.IMPORT_EXPORT_IOT_MAP_DATA in the app manifest, which @reactvision/react-viro 3.0.1's config plugin adds. Without it the Meta runtime hides the group-sharing extension from enumeration rather than failing the call, so the headset appears not to support shared anchors.

What's Changed

Other Changes

Full Changelog: v3.0.0...v3.0.1

What's Changed

Other Changes

Full Changelog: v3.0.0...v3.0.1

v3.0.0

Choose a tag to compare

@doranteseduardo doranteseduardo released this 20 Sep 02:53

Release Notes

v3.0.0

One renderer now covers five targets: OpenGL ES on Android, Metal on iOS, Metal into a CompositorServices immersive space on Apple Vision Pro, OpenXR on Meta Quest, and WebGL2 through WebAssembly on the web.

Behind ViroReact 3.0.0's headline capabilities, the engine work is the world mesh and scan pipeline that VPS is built on, the shared coordinate frames co-location needs, and mixed reality on Quest.

Added

  • World mesh and room-scale scanning. The depth-derived mesh that VPS snapshots and reattaches — accumulated from ARKit's LiDAR and ARCore's Depth API, serialised into a scan's own location frame, and restored against a resolved one for occlusion and physics. VROARScene owns the mesh, its configuration and its lifetime.
  • The web target. The WebAssembly build under wasm/: the C API that @reactvision/viro-web-renderer drives, the scene bindings, and the renderer work behind them.
  • Co-location. VROColocationSession as the platform-neutral holder, Colocation_JNI on Android, VROColocationBridge for iOS and visionOS, and shared spatial anchors on Quest through xrShareSpacesMETA.
  • Quest. Plane detection through XR_EXT_plane_detection, passthrough compositing, per-ray drag ownership and the input controller work behind mixed reality.
  • Scan and world-mesh state are readable from the bridge. rvGetScanStatusJson() and rvGetScanDiagnosticsJson() on VROARSession report how a scan in progress is doing and why the last one ended as it did; nativeRvGetWorldMeshStats does the same for the world mesh over JNI. The JSON shape is defined once on VROARSession rather than restated in each bridge, so the two platforms cannot drift. All three are read-only snapshots taken on the render thread and are cheap enough to poll.

Changed

  • Web text renders in Roboto. The preloaded typeface is now Apache 2.0 licensed and matches the face already used on Android and Quest, so the three platforms agree. The preloaded data drops from 2.3 MB to 389 KB.
  • Android shader assets are generated at build time. android/shaders.gradle regenerates sharedCode/src/main/assets/*.glsl from ViroRenderer/ during preBuild, keeping the shipped copies in step with the sources automatically. The generated files stay committed, so a build after a shader change will modify the working tree.
  • iOS pods build at deployment target 15.0. A post_install hook rewrites every pod target, as Xcode 26 and later reject anything lower.

Fixed

  • Compound physics shapes distribute mass by child volume, and a compound built from given parts no longer drifts on every physics update.
  • Alpha cutoff binds only for Mask transparency mode; every other mode fades continuously instead of vanishing at half alpha.
  • Vertex colours and glTF doubleSided are honoured.
  • A FixedToPlane drag no longer snaps to the aim point on float noise, and aiming square at the plane no longer produces a NaN world transform.
  • Calls made before the AR session exists are queued and flushed in order rather than dropped without a callback.
  • On visionOS the renderer archive now carries the ReactVisionCCA slices it references, so an application no longer fails to link on symbols it never used.

What's Changed

Other Changes

Full Changelog: v2.58.1...v3.0.0

v2.58.1

Choose a tag to compare

@doranteseduardo doranteseduardo released this 18 Aug 04:51

v2.58.1

Stability update

Full Changelog: v2.58.0...v2.58.1

v2.58.0

Choose a tag to compare

@doranteseduardo doranteseduardo released this 17 Aug 02:36
6efbe67

v2.58.0

Highlights

AR Session Recording

  • VROARSession gains an optional local recording surface (startRecording/stopRecording/getRecordingStatus) — video.mp4 + session.jsonl (raw IMU + ground-truth pose), for offline analysis/replay via tinyvio. iOS (AVAssetWriter) and Android (MediaCodec/MediaMuxer) implementations, both with sorted, race-free sidecar/video finalization.

Fixes

  • glTF: sparse accessors and non-indexed (draw-arrays) primitives no longer fail to load (VIRO-3664).

Notes

  • Pairs with @reactvision/react-viro 2.58.0.

See CHANGELOG.md for full detail.

What's Changed

Other Changes

Full Changelog: v2.57.5...v2.58.0

v2.57.5

Choose a tag to compare

@benmotanoti benmotanoti released this 28 Jul 01:01
c8551e8

What's Changed

Other Changes

Full Changelog: v2.57.3...v2.57.5

What's Changed

Other Changes

Full Changelog: v2.57.3...v2.57.5

v2.57.3

Choose a tag to compare

@doranteseduardo doranteseduardo released this 08 Jul 01:46
2c5ded6

v2.57.3

Highlights

  • Front-camera AR no longer references the ARKit TrueDepth API in core (iOS) — fixes App Store review 2.5.1. VROARSessioniOS now uses a registered config provider instead of instantiating ARFaceTrackingConfiguration; the ObjC host VROFrontCameraProvider is supplied at runtime by the optional @reactvision/react-viro-face-tracking package (the only place that references the TrueDepth API). Core ViroKit ships free of it. The ViroCameraTexture selfie feed is unaffected (AVFoundation).
  • Android 15+ 16 KB launch crash fixed (viro#491). Removed the non-16 KB-aligned prebuilt libvrapi.so, force-loaded via libviro_renderer.so's NEEDED entry on every launch.
  • Removed the Oculus Mobile SDK (VrApi) renderer path. VROSceneRendererOVR / VROInputControllerOVR are no longer compiled; superseded by VROSceneRendererOpenXR.
  • LiDAR depth confidence fixed (iOS). AR hit-test depthConfidence now reads ARKit's sceneDepth.confidenceMap (normalised to 0–1) instead of returning the raw depth value, so the > 0.3 confidence gate discards low-quality hits as intended. Monocular depth unaffected.
  • ViroVideo lifecycle crash & ANR fixed (Android, viro#478). (1) AVPlayer guards its ExoPlayer listener callbacks with a mDestroyed flag, so callbacks after the native player is deleted no longer reach freed memory (fixes the background/foreground crash). (2) removed two GL-thread↔main-thread deadlocks that froze/ANR'd the app when leaving a ViroVideo screen (GL thread blocked calling ExoPlayer on the main thread while the main thread was in GLSurfaceView.surfaceDestroyed() waiting for the GL thread): getCurrentTimeInSeconds()/getVideoDurationInSeconds() (called every frame from the render thread) now read a volatile cache refreshed on the main thread instead of a blocking hop (also removes per-frame playback jank), and nativeDeleteVideoTexture no longer calls pause() on the GL thread before deleting (redundant — deletion already stops/releases the player). AVPlayer.destroy() additionally defers ExoPlayer.release() off the teardown call.

Notes

  • Rebuild the prebuilt AARs before publishing; confirm no shipped .so lists libvrapi.so as NEEDED.
  • iOS: VROFrontCameraProvider.{h,mm} must be in the ViroKit target; verify ARFaceTracking is absent from the built ViroKit.
  • Pairs with @reactvision/react-viro 2.57.3; front-camera face tracking needs the optional package.

See CHANGELOG.md for full detail.

What's Changed

Other Changes

Full Changelog: v2.57.2...v2.57.3

v2.57.2

Choose a tag to compare

@doranteseduardo doranteseduardo released this 29 Jun 20:45

v2.57.2 — 16 KB page-size alignment (completion)

This release completes the 16 KB memory-page alignment work started in previous releases,
unblocking Google Play / Meta Quest Store submission for Android 15+ devices.

Highlights

  • All bundled native libraries are now 16 KB-page aligned. v2.57.0 aligned
    libopenxr_loader.so, but libc++_shared.so was still 4 KB-aligned (2**12)
    and kept failing the requirement. Because it's a prebuilt copied verbatim from
    the NDK sysroot, the -Wl,-z,max-page-size=16384 linker flag (which already
    aligns everything Viro compiles) can't touch it — and NDK r21–r26 ship it at
    4 KB. The Android NDK was bumped from r25 (25.2.9519653) → r27
    (27.1.12297006)
    , whose libc++_shared.so is 16 KB-aligned, across all
    native modules (sharedCode, viroreact, viroar, virocore,
    reactvisioncca).

Notes

  • Every 64-bit (arm64-v8a) library now reports ≥ 16 KB segment alignment —
    most at 16 KB (2**14), with libvrapi.so / libgvr*.so at 64 KB (2**16).
    Verified with Google's check_elf_alignment.sh (0 unaligned).
  • ELF segment alignment is one half of the requirement; ensure the consuming
    app also packages each .so uncompressed and 16 KB-aligned in the APK/AAB
    (AGP 8.2+ handles this automatically).
  • Pairs with @reactvision/react-viro 2.57.2.

See CHANGELOG.md for full detail.

Full Changelog: v2.57.1...v2.57.2

v2.57.1

Choose a tag to compare

@doranteseduardo doranteseduardo released this 28 Jun 01:17

v2.57.1 — Mixed Reality on Meta Quest

This release adds a mixed-reality AR backend to the OpenXR renderer, so the
engine's AR component API (VROARScene / VROARPlaneAnchor / the anchor delegate)
works on Meta Quest 3 / 3S with passthrough.

Highlights

  • VROARSessionOpenXR — a new VROARSession subclass that mirrors
    VROARSessionARCore, reusing the existing anchor → delegate → JNI → JS chain
    unchanged. Plane detection is sourced from the Quest room model via
    XR_FB_scene / XR_FB_spatial_entity / XR_FB_spatial_entity_query;
    XR_EXT_plane_detection is wired as a fallback. VROSceneRendererOpenXR owns
    and drives the session per frame and wires it to the scene's AR delegate.

  • Passthrough layer styling — setPassthroughStyle(opacity, edgeRGBA) via
    xrPassthroughLayerSetStyleFB.

  • Passthrough black-background fix — VRODisplayOpenGLOpenXR::bind() now
    clears with a configurable alpha (0 for passthrough), and the projection layer
    is composited over the passthrough underlay with source-alpha blending, so empty
    regions reveal the room.

  • Deferred-renderer state fix — passthrough / hand-tracking / style values set
    before the lazily-created renderer exists are now cached and re-applied in
    initRenderer().

Notes

  • Quest room planes require the horizonos.permission.USE_ANCHOR_API Spatial Data
    permission and a completed Space Setup on the headset.
  • Bring-up-era OpenXR renderer diagnostics (alpha probe, blend-mode enumeration,
    passthrough-only flag, redundant clear) have been removed now that the
    passthrough composite path is validated.

See CHANGELOG.md for full detail.

Full Changelog: v2.57.0...v2.57.1