Skip to content

Releases: ReactVision/viro

v2.50.0

09 Dec 00:54

Choose a tag to compare

ReactVision 2.50.0 Release Notes

New Features

All features from ViroCore 2.50.0 are included, plus React Native specific bug fixes.


Cloud Anchors

Cross-platform AR anchor sharing between iOS and Android devices.

  • Cross-Platform: Share anchors between iOS and Android devices
  • Persistent: Anchors can be stored for 1-365 days
  • Accurate: Sub-centimeter accuracy in good conditions
  • Scalable: Supports multiple concurrent users
<ViroARSceneNavigator cloudAnchorProvider="arcore">
  {/* Use sceneNavigator.hostCloudAnchor() and resolveCloudAnchor() */}
</ViroARSceneNavigator>

API Highlights:

  • hostCloudAnchor(anchorId, ttlDays) - Upload anchor to Google's servers
  • resolveCloudAnchor(cloudAnchorId) - Retrieve anchor on another device
  • cancelCloudAnchorOperations() - Cancel pending operations

Geospatial API

Location-based AR with GPS coordinates using Google's ARCore Geospatial API.

  • Earth Tracking: Track device position using GPS and Visual Positioning System (VPS)
  • Three Anchor Types: WGS84 (absolute altitude), Terrain (relative to ground), and Rooftop (relative to buildings)
  • VPS Availability Check: Verify if enhanced positioning is available at a location
<ViroARSceneNavigator geospatialAnchorProvider="arcore">
  {/* Use createGeospatialAnchor(), createTerrainAnchor(), createRooftopAnchor() */}
</ViroARSceneNavigator>

API Highlights:

  • createGeospatialAnchor(lat, lng, altitude, quaternion) - WGS84 anchor
  • createTerrainAnchor(lat, lng, altitudeAboveTerrain, quaternion) - Ground-relative anchor
  • createRooftopAnchor(lat, lng, altitudeAboveRooftop, quaternion) - Building-relative anchor
  • getCameraGeospatialPose() - Get current location with accuracy metrics
  • checkVPSAvailability(lat, lng) - Check VPS support at location

Scene Semantics

ML-based scene understanding with 12 semantic labels.

  • 12 Semantic Labels: sky, building, tree, road, sidewalk, terrain, structure, object, vehicle, person, water, unlabeled
  • Real-time Processing: Per-frame label fractions
  • Use Cases: Outdoor detection, environment-aware content, safety warnings
// Enable via cloudAnchorProvider or geospatialAnchorProvider
// Use getSemanticLabelFractions() for environment detection

const { fractions } = await arSceneNavigator.getSemanticLabelFractions();
if (fractions.sky > 0.1) {
  console.log("User is outdoors!");
}

Depth Occlusion

Visual occlusion behind real-world objects for realistic AR blending.

  • Three Modes: Disabled, DepthBased, PeopleOnly
  • Realistic Blending: Virtual objects hidden behind real surfaces
  • People Segmentation: Option to only occlude behind detected people
<ViroARSceneNavigator occlusionMode="depthBased">
  {/* Virtual content properly occluded behind real surfaces */}
</ViroARSceneNavigator>

Occlusion Modes:

  • "disabled" - No occlusion (virtual objects always on top)
  • "depthBased" - Use depth data to occlude behind real surfaces
  • "peopleOnly" - Only occlude behind detected people

Extended glTF Support

Expanded glTF 2.0 support with 17 additional features for improved 3D model compatibility.

Core Geometry & Materials

  1. Non-indexed geometry support - Primitives without index buffers
  2. LINE_LOOP primitive type - Converted to line strip with closing segment
  3. TRIANGLE_FAN primitive type - Converted to individual triangles
  4. Mipmap filter modes - Proper separation of min/mip filtering
  5. Alpha masking (MASK mode) - With alphaCutoff support
  6. Emissive materials - emissiveFactor and emissiveTexture
  7. STEP animation interpolation - Discrete keyframe transitions
  8. Sparse accessor support - Override specific buffer values

Camera & Scene

  1. Perspective cameras - FOV, near/far planes, aspect ratio
  2. Orthographic cameras - xmag, ymag, clipping planes
  3. Default scene selection - Respects model.defaultScene

Lighting (KHR_lights_punctual)

  1. Directional lights - Color, intensity
  2. Point lights - Color, intensity, range/attenuation
  3. Spot lights - Color, intensity, range, inner/outer cone angles

Material Extensions

  1. KHR_materials_unlit - Constant/unlit lighting model
  2. Normal texture scale - Controls bump intensity
  3. Occlusion texture strength - Controls AO influence

Bug Fixes

Memory Leak Fix

  • Enhanced memory safety across 8 Java modules through Fabric architecture migration
  • Fixed null reference issues in prop application during React Native's pre-attachment phase
  • Improved stability during AR session transitions and low-end device scenarios
  • Migrated 30 methods to use Fabric's UIBlock pattern for safer memory management

Affected Modules:

  • ARSceneModule
  • ARSceneNavigatorModule
  • CameraModule
  • ControllerModule
  • NodeModule
  • SceneModule
  • SceneNavigatorModule
  • VRT3DSceneNavigatorModule

onClick iOS Fix

  • Fixed ViroText onClick event handling on iOS
  • Resolved issue where onClick prop was incorrectly passed to native code, interfering with event delegation
  • Fixes GitHub issue #272

AR Image Marker Fix

  • Improved ARImageMarker lifecycle management with proper weak reference patterns
  • Prevents retain cycles and memory leaks during image target tracking
  • Proper cleanup via removeARImageTarget() when updating targets

Setup

Expo Projects

{
  "expo": {
    "plugins": [
      [
        "@reactvision/react-viro",
        {
          "googleCloudApiKey": "YOUR_API_KEY",
          "cloudAnchorProvider": "arcore",
          "geospatialAnchorProvider": "arcore",
          "android": {
            "xRMode": ["AR"]
          }
        }
      ]
    ]
  }
}

Then rebuild:

npx expo prebuild --clean
npx expo run:ios
# or
npx expo run:android

Bare React Native Projects

iOS - Podfile:

use_frameworks! :linkage => :dynamic

pod 'ARCore/CloudAnchors', '~> 1.51.0'
pod 'ARCore/Geospatial', '~> 1.51.0'
pod 'ARCore/Semantics', '~> 1.51.0'

iOS - Info.plist:

<key>GARAPIKey</key>
<string>YOUR_GOOGLE_CLOUD_API_KEY</string>

Android - AndroidManifest.xml:

<meta-data
    android:name="com.google.android.ar.API_KEY"
    android:value="YOUR_GOOGLE_CLOUD_API_KEY" />

Requirements

  • iOS: iOS 12.0+, ARKit-capable device
  • Android: Android 7.0+ (API 24), ARCore-supported device
  • Google Cloud: Valid API key with ARCore API enabled
  • Depth Features: LiDAR (iOS) or ToF sensor/ARCore Depth API (Android)

v2.44.2

22 Nov 00:42

Choose a tag to compare

This is a minor patch update that removes some layers in the Android side to get 1:1 plane detection compared with direct ARCore implementations.

See at v2.44.1 for more details.

v2.44.1

19 Nov 23:07
d530ccb

Choose a tag to compare

Release Notes – v2.44.1

AR Plane Detection & Selection – Major Update

ViroARPlaneSelector – Complete Rewrite

Accurate Plane Shape Rendering

  • Planes now render using their actual geometric boundaries from ARKit/ARCore (via boundary vertices).
  • Automatic fallback to rectangular visualisation when vertex data is not available.
  • New useActualShape property to control rendering mode (default: true).

Map-Based Plane Tracking

  • Replaced array-based tracking with Map<string, ViroARPlaneType> for reliable and deterministic plane handling.
  • Plane identification now uses anchorId, eliminating index-based race conditions.
  • Improved stability for both plane selection and update cycles.

Multi-Alignment Detection

  • Added new alignment mode: "Both" for concurrent horizontal and vertical plane detection.
  • 25 detectors per alignment type for broader and more consistent scene coverage.
  • Enhanced scene understanding through simultaneous multi-plane detection.

Plane Classification Support (iOS)

  • ARKit plane classification now exposed, including: Wall, Floor, Ceiling, Table, Seat, Door, Window.
  • Classification data is included in all plane update callbacks.
  • Enables semantic placement and surface-specific logic.

Enhanced Properties & Callbacks

  • onPlaneDetected?: (updateMap) => boolean — Validate planes before adding them.
  • disableClickSelection?: boolean — Enables visual-only mode.
  • useActualShape?: boolean — Controls shape rendering behaviour.

Visual Improvements

  • Updated material to a bright, translucent blue (rgba(0, 122, 255, 0.5)) for improved visibility.
  • cullMode: "None" enabled for better Android rendering compatibility.
  • Corrected alpha blending and depth buffer behaviour.

ViroARPlane Improvements

Improved Vertex Handling

  • More accurate 3D-to-2D vertex conversion for shape mapping.
  • Unified coordinate system handling across iOS and Android.
  • Corrected rotation logic for horizontal and vertical surfaces.

Enhanced Anchor Data

  • Plane anchors now provide full metadata: position, rotation, scale, centre, and dimensions.
  • Classification and vertex data included in all callbacks.
  • Consistent and reliable anchorId tracking throughout the plane lifecycle.

Architecture & Performance

16KB Page Size Support

  • Full compatibility with modern Android devices using 16KB memory pages.

Breaking Changes

Removed Properties (ViroARPlaneSelector)

  • maxPlanes removed (replaced by dynamic 25-detector-per-alignment behaviour).
  • ViroCommonProps and ViroObjectProps removed from type definitions.
    • These properties were previously documented but non-functional.
    • The component now exposes only explicit, fully supported props.

Internal State Refactor

  • Internal state has been migrated from an array to a Map.
    • (This affects only direct internal state access and does not impact typical usage.)

v2.43.6

09 Oct 04:41

Choose a tag to compare

This is a patch release targeting the pod installation issues happening in EAS mainly. We have tested this update in different installation scenarios all with success.

v2.43.5

08 Oct 00:36
c2c6b69

Choose a tag to compare

v2.43.5

iOS Improvements

  • Fixed pod install issues: Rebuilt ViroCore framework for iOS
    • Resolved pod installation failures
    • Improved compatibility with modern CocoaPods versions
    • Fixed framework architecture issues

Fabric Architecture Improvements

  • Enhanced Fabric compatibility: Migrated 30 methods across 8 Java modules to use Fabric's UIBlock pattern

    • Fixed ReactNoCrashBridgeNotAllowedSoftException errors in production
    • Replaced deprecated getNativeModule(UIManagerModule.class) with UIManagerHelper.getUIManager()
    • Updated to use com.facebook.react.fabric.interop.UIBlock and UIBlockViewResolver
    • Modules updated: ARSceneModule, ARSceneNavigatorModule, CameraModule, ControllerModule, NodeModule, SceneModule, SceneNavigatorModule, VRT3DSceneNavigatorModule
  • Improved prop handling: Added Fabric-aware error recovery system in VRTNodeManager

    • Removed isAttachedToWindow() checks that blocked prop updates in Fabric's pre-attachment phase
    • Implemented safelyApplyProp() pattern with automatic retry on transient failures
    • Enhanced error logging for better debugging
    • Refactored 28 @ReactProp methods for consistent error handling
    • Reduced boilerplate code by ~250 lines
  • Better resilience: Automatic prop retry handles GL context initialization timing issues

    • Prevents props from being silently lost during scene transitions
    • Recovers from view state timing issues on low-end devices
    • Improved stability during AR session interruptions

v2.43.4

27 Aug 23:33
7f82022

Choose a tag to compare

🛠 ReactVision 2.43.4

React Native 0.79 has several internal changes that break some features of the ReactVision platform, we have updated the dependencies and then tracked the major issues.

  • Added support for Expo 53 and React Native 0.79.5
  • Fixed props issues affecting various components and features (e.g. materials, sources, scale etc)
  • Fixed ViroVideo remote URL not working.
  • Fixed a context issue in ARSceneNavigator (thanks to iamprometheus)

v2.43.2

05 Jul 05:19
f52f5df

Choose a tag to compare

🛠 ReactVision 2.43.2 – Patch Release

This patch addresses several issues introduced in the previous release and brings improved stability across platforms.

🔧 Fixes
• Resolved linking issues that affected certain environments when integrating ReactVision.
• Fixed the Expo plugin compatibility for both Android and iOS, restoring expected behaviour.
• Patched internal problems in the new event handling layer, improving reliability and interaction consistency.

v2.43.1

26 Jun 20:27

Choose a tag to compare

🚀 React Native New Architecture Support

We’re excited to introduce support for React Native's New Architecture in the ReactVision (Viro) library! This release integrates with the new Fabric rendering system via a custom interop layer.


✅ What’s New

  • Fabric Integration: Introduced a custom Fabric Interop Layer for seamless communication between JS and native code.
  • Full Backward Compatibility: No migration steps required — continues to support existing usage and APIs (assuming you're using a compatible Expo version).
  • Component Updates: Over 50 core components updated for compatibility with the new rendering pipeline.

📘 Notes

  • Only New Architecture is supported from this release onward.
  • No migration required — existing usage remains compatible.
  • Updated examples for New Architecture will be published soon.

v2.43.0

14 Apr 21:24
18d5a30

Choose a tag to compare

📦 Release Notes – v2.43.0

🚀 What’s New

This release brings important stability improvements across both iOS and Android, along with full compatibility for Expo 52+ and React Native 0.76.9+. It also resolves a series of crashes and memory issues related to component unmounting, AR navigation, and property updates.


🔧 Fixes & Improvements

To improve compatibility, we've relaxed the version constraints for React Native and Expo. Projects can now run on Expo SDK 52 or higher, and React Native 0.76.9 or above, making upgrades smoother and less restrictive.

On iOS, we addressed crashes occurring during component unmounting—especially around navigation—by adding extra safety checks when accessing nodes and parent portal references. We've also improved the unmounting sequence to avoid accessing invalid memory.

For both platforms, we fixed errors that were happening when updating shadow node properties. These issues were caused by operations on null or already-detached nodes. We’ve added defensive coding, including try-catch wrappers and detailed error logging. On Android specifically, the onTearDown() method has been rewritten to ensure proper cleanup of resources, cancellation of active tasks, and state resets.

We also tackled AR-related crashes, especially on iOS, where the app could crash if methods were called on the SceneNavigator during teardown. Now, AR sessions are correctly finalised during cleanup.

Finally, we resolved memory leaks tied to ViroARPlaneSelector. This was caused by abrupt unmounting and improper handling of its child components. The selector logic has been refactored to ensure stability and prevent crashes.


✅ Recommended Update

To take advantage of all these fixes, we recommend updating your project to use:

  • Expo SDK 52 or later
  • React Native 0.76.9 or later

🧰 Troubleshooting

If you encounter issues after updating, first ensure your project is using the latest version of Expo. Most problems are resolved by aligning with the supported SDK and React Native versions.

v2.41.6

09 Jun 19:24

Choose a tag to compare

This is a hot fix, I found the Expo plugin was broken because of dependencies mismatch that cause a crash when trying to use ViroVideo.

It also updates the telemetry route, pointing it to ReactVision servers instead of the old NativeVision.