Skip to content

Releases: ReactVision/virocore

v2.54.0

02 Apr 03:09

Choose a tag to compare

React Viro β€” v2.54.0 Release Notes

Release date: March 31, 2026


What's New

Semantic Masking

Virtual objects can now react to what the camera sees in the real world. A material can be configured to appear only on specific surfaces β€” for example, render a cloud effect exclusively on pixels classified as sky, or hide a character wherever a person is detected. Eleven real-world categories are supported: sky, building, tree, road, sidewalk, terrain, structure, object, vehicle, person, and water. Available on both Android and iOS.

iOS setup: Semantic masking on iOS requires the ARCore Semantics pod. Add includeSemantics: true to your Expo plugin config in app.json to have it included automatically. If you are already using provider: "arcore" or includeARCore: true, the pod is already included and no extra config is needed.

["@reactvision/react-viro", {
  "ios": {
    "includeSemantics": true
  }
}]

Animated GLB Models

3D models in GLB/glTF format with embedded animations now play correctly. This covers the three main animation systems used by artists β€” skeletal rigs (character movement), morph targets (facial expressions, blend shapes), and skinning (soft-body deformation). No extra configuration is needed; animations embedded in the file are automatically available.

Permission Helpers

Two new utility functions make it easier to handle camera and location permissions:

  • requestRequiredPermissions(permissions?) β€” prompts the user for the specified permissions. Pass a list to request only what your feature needs ("camera", "microphone", "storage", "location"), or call with no arguments to request all four at once.
  • checkPermissions(permissions?) β€” reads the current permission status without prompting the user. Useful for checking what has already been granted before deciding whether to ask.

Expo 54 & 55 Support

The package is now compatible with both Expo SDK 54 and Expo SDK 55.


Bug Fixes

Android β€” App crash on launch (Android 15 / 16)

Apps were crashing immediately on launch on devices running Android 15 or 16 due to a new 16 KB memory page-size requirement introduced by Google. All native libraries have been rebuilt to comply with the new standard.

Android β€” App crash after returning from background

A combination of three separate issues caused a guaranteed crash whenever the operating system suspended the app and reclaimed GPU memory. On resume, the app attempted to use GPU resources that no longer existed. All three root causes have been fixed; the app now recovers cleanly from background suspension.

Android β€” ViroARImageMarker detection callback not firing

The onAnchorFound callback on ViroARImageMarker was never called on Android, making it impossible to respond to image detection events in JavaScript. The native event bridge has been corrected.

Android β€” Model texture overlaying the screen during video recording

When recording AR scenes, the 3D model's texture was incorrectly rendered over the entire screen instead of just the model. This was caused by a stale GPU state cache when switching between the display and recording graphics contexts. The cache is now correctly reset on each context switch.

iOS β€” Portal scene interior not rendering (#452)

On iOS, looking through a ViroPortalScene showed only the camera feed β€” none of the 3D content inside the portal was visible. This was caused by leftover GPU stencil state from the previous frame that prevented interior content from passing the render test. The stencil state is now correctly reset each frame.

iOS β€” EAS cloud build failure (Podfile syntax error) (#441)

iOS builds through Expo Application Services (EAS) were failing with a CocoaPods syntax error in the generated Podfile. The Expo plugin now generates a valid Podfile in all build environments.


Summary

Area Change
New feature Semantic masking for materials (Android + iOS)
New feature Animated GLB β€” skeletal, morph targets, skinning
New feature requestRequiredPermissions utility
New feature checkPermissions utility
Platform Expo 54 & 55 support
Fix β€” Android Crash on launch on Android 15 / 16 (16 KB page size)
Fix β€” Android Crash after returning from background
Fix β€” Android ViroARImageMarker onAnchorFound never fired
Fix β€” Android Model texture overlay during video recording
Fix β€” iOS Portal scene interior content not rendering (#452)
Fix β€” iOS EAS cloud build Podfile syntax error (#441)

v2.53.1

12 Mar 00:21

Choose a tag to compare

Hotfix: In MALI GPU devices, the camera texture may get frozen while switching AR scenes.

v2.53.0

11 Mar 00:33

Choose a tag to compare

ViroCore v2.53.0 β€” Release Notes

ReactVision Cloud Anchors (ReactVisionCCA)

Two new providers are available as part of the ReactVisionCCA (RVCA) SDK integration. ReactVisionCCA is a proprietary closed-source library β€” its implementation is not part of the open-source ViroCore distribution.

Visual Cloud Anchors (RVCCACloudAnchorProvider)

Routes hostCloudAnchor / resolveCloudAnchor through the ReactVision platform instead of Google Cloud Anchors. Set cloudAnchorProvider to reactvision on VROARSession.

  • Hosting: scan your environment briefly, then call hostCloudAnchor. The SDK processes recent camera frames and uploads anchor data to the ReactVision backend. Returns an error immediately if the environment has not been sufficiently observed β€” no silent fallback.
  • Resolving: call resolveCloudAnchor with the anchor ID. The SDK matches the live camera feed against stored anchor data and returns a pose once a confident localisation is established. Cross-platform (iOS host β†’ Android resolve and vice versa) is fully supported.
  • TTL: hostCloudAnchor accepts a ttlDays parameter (1–365) to control anchor expiry on the backend.
  • GPS tagging: call setLastKnownLocation(lat, lng, alt) before hosting to embed GPS coordinates as anchor metadata.
  • Operation tracking: hostCloudAnchor / resolveCloudAnchor return an operation ID; query progress via getOperationStatus() or cancel via cancelOperation() / cancelAllOperations().

Cloud Anchor management API (no active AR frame required):

Method Description
getCloudAnchor(id) Fetch full anchor record including attached assets and resolve stats
listCloudAnchors(limit, offset) Paginated list of anchors for the project
updateCloudAnchor(id, name, description, isPublic) Update anchor metadata
deleteCloudAnchor(id) Permanently delete an anchor
findNearbyCloudAnchors(lat, lng, radius, limit) Proximity search by GPS coordinate
attachAssetToCloudAnchor(anchorId, ...) Attach an uploaded asset (3D model, image, video, etc.) to an anchor
removeAssetFromCloudAnchor(anchorId, assetId) Detach an asset
trackResolution(anchorId, ...) Record a resolve attempt for analytics

Geospatial Anchors (RVCCAGeospatialProvider)

GPS-based anchors that persist at real-world coordinates. Independent of any AR session β€” can be used from any C++ context.

CRUD:

Method Description
createAnchor(request) Create an anchor at a GPS coordinate with optional scene/asset link
getAnchor(id) Retrieve anchor with full linked content expanded
listAnchors(limit, offset) Paginated list for the configured project
findNearby(lat, lng, radius, limit) Proximity search (radius in metres, default 500 m)
updateAnchor(id, request) Update position, altitude mode, name, description, or linked content
deleteAnchor(id) Permanently delete an anchor

Content linking:

Method Description
linkSceneAsset(anchorId, sceneAssetId) Attach a scene asset to an anchor
linkScene(anchorId, sceneId) Attach a full scene to an anchor
unlinkContent(anchorId) Remove all linked content

Asset upload:

uploadAsset(assetType, filename, data, appUserId) β€” uploads a file to ReactVision storage and returns a URL + asset ID. Supported assetType values: "3d-model", "image", "video", "audio". The returned asset ID can be linked to a geospatial anchor via updateAnchor.


Shader modifier system β€” major expansion

The renderer now supports the full range of custom GPU effects from modifier code:

  • Custom sampler2D uniforms β€” parseCustomUniforms() no longer skips sampler declarations. Each named sampler in modifier code is assigned its own texture unit and bound at draw time via VROMaterialSubstrateOpenGL.
  • Custom varyings β€” a varyings list on a modifier injects out declarations in the vertex shader and matching in declarations in the fragment shader, allowing vertex-stage modifiers (Geometry) to pass typed data to fragment-stage modifiers (Surface / Fragment).
  • Scene depth buffer access β€” when a modifier sets requiresSceneDepth, the choreographer retains the depth render target as a readable texture and VROMaterialSubstrateOpenGL binds it as scene_depth_texture (+ scene_viewport_size) before the draw call. On Adreno/Mali GPUs that cannot sample depth in-pass, an automatic blit to GL_R32F is inserted.
  • Live AR camera texture access β€” when a modifier sets requiresCameraTexture, the session's camera texture and UV transform matrix are bound as ar_camera_texture + ar_camera_transform. On Android, samplerExternalOES and #extension GL_OES_EGL_image_external are injected automatically; iOS uses a standard sampler2D. Developer GLSL is platform-agnostic.
  • Deterministic priority ordering β€” VROShaderModifier has a priority field. Modifiers are sorted by priority before injection (stable_sort). Engine internals (AR shadow, occlusion) use priority βˆ’100; user modifiers default to 0; debug overlays use 100.

AR plane detection improvements

  • VROARPlaneAnchor::hasSignificantChanges β€” threshold logic changed from AND to OR. Previously both the absolute (>1 cm) and relative (>5%) extent thresholds had to pass simultaneously; large mature planes almost never triggered updates. Either threshold now fires an update independently.
  • Update throttle β€” the fixed 100 ms minimum interval between plane anchor updates is replaced with an adaptive throttle: 33 ms for the first 20 updates, 66 ms thereafter. Captures ARKit's rapid initial detection burst without flooding the update path at steady state.
  • Default detection orientation β€” horizontal + vertical plane detection now enabled by default at the C++ layer (VROARScene), iOS native layer (VRTARScene), and JS fallback.

Bug fixes

  • GLB / 3D model colours washed out (VROMaterialShaderBinding.cpp, standard_fsh.glsl) β€” material_emissive_color was being added to the fragment output for every material. GLB PBR data often carries a non-zero emission value that pushed diffuse+specular results toward white. Removed material_emissive_color and material_alpha_cutoff from the standard shader binding; these were incorrectly applied to all materials instead of only emissive/masked ones.

  • Android β€” physics body null-pointer crash on scene close (ViroRenderer/capi/Node_JNI.cpp) β€” GL-thread lambdas queued by nativeSetTransformDelegate / nativeRemoveTransformDelegate called node->setTransformDelegate() without checking weak_ptr expiry. Added expiry guard; expired nodes are now silently skipped.

  • iOS β€” startVideoRecording / stopVideoRecording broken on iOS 17+ (VROViewRecorder.mm, VROViewAR.mm) β€” multiple independent failures combined: AVAssetWriter startWriting return value unchecked, pixel buffer pool not validated, writer created before view was laid out, AVAudioSession missing AVAudioSessionModeVideoRecording and setActive:YES (ARKit takes over the audio session on iOS 17+). All fixed; generateFinalVideoFile now falls back to video-only output when audio is unavailable.

v2.52.0

09 Feb 20:29

Choose a tag to compare

Summary

This release adds shader customization support for iOS and Android, fixes critical memory leaks, and improves AR depth functionality.

Key Features

Shader System (New)

  • Cross-platform shader support
  • Real-time shader customization for iOS and Android
  • Shader propagation down node trees
  • Standardized fragment output
  • Texture and animation support in shaders
  • Optimized material sharing for better performance

AR & Depth Improvements

  • Depth-based AR hit testing
  • Monocular depth fallback for non-LiDAR devices
  • Fixed depth frame alignment issues

Critical Bug Fixes

  • iOS Memory Leaks (Critical): Fixed all memory leaks on iOS platform
  • Material Overflow: Fixed cloned materials array overflow crashes
  • Portal Crashes: Fixed crashes when unmounting portals on iOS
  • Gravity Type Crash: Fixed Android crash (gravity now uses 3D vector [x, y, z] instead of number)
  • VRX Asset Loading: Fixed VRX asset loading issues on iOS
  • hitResultId: Fixed availability in AR hit tests

Other Improvements

  • Performance throttle to prevent system overload
  • Refactored thread lock implementation
  • Removed debug logs from production code
  • Improved TypeScript type definitions

What's Changed

Other Changes

Full Changelog: v2.51.0...v2.52.0

v2.51.0

01 Feb 20:59

Choose a tag to compare

What's Changed

  • Merge develop β†’ main (AR stability + depth estimation for non-LiDAR) by @doranteseduardo in #289

Full Changelog: v2.50.0...v2.51.0

What's Changed

Other Changes

Full Changelog: v2.50.0...v2.51.0

v2.50.0

09 Dec 00:51

Choose a tag to compare

ViroCore 2.50.0 Release Notes

New Features

Cloud Anchors

Share AR experiences across multiple devices and platforms. Cloud Anchors enable cross-platform anchor sharing between iOS and Android devices with sub-centimeter accuracy.

  • 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

API Highlights:

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

Geospatial API

Enable location-based AR experiences using Google's ARCore Geospatial API. Place virtual content at real-world geographic coordinates that persists across sessions.

  • 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
  • Cross-Platform: Works on both iOS and Android

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-powered real-time semantic segmentation of the camera feed. Classify pixels into 12 categories for environment-aware AR experiences.

  • 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

API Highlights:

  • isSemanticModeSupported() - Check device support
  • setSemanticModeEnabled(enabled) - Enable/disable processing
  • getSemanticLabelFractions() - Get all label percentages
  • getSemanticLabelFraction(label) - Get specific label percentage

Depth Occlusion

Proper visual occlusion of virtual content behind real-world objects.

  • Three Modes: Disabled, DepthBased, PeopleOnly
  • Realistic Blending: Virtual objects hidden behind real surfaces
  • People Segmentation: Option to only occlude behind detected people
  • Debug Visualization: Color-coded depth overlay

Requirements:

  • iOS: LiDAR devices (iPhone 12 Pro+, iPad Pro 2020+)
  • Android: ARCore Depth API compatible devices

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

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 (for Cloud Anchors, Geospatial, and Scene Semantics)
  • Depth Features: LiDAR (iOS) or ToF sensor/ARCore Depth API (Android)

What's Changed

Other Changes

  • fix video crashing on Android because of unresolved ExoPlayer breaking changes by @Buthrakaur in #154
  • ARCore 1.43, Fix Broken Builds by @doranteseduardo in #168
  • Bump actions/checkout from 3.3.0 to 4.1.6 by @dependabot[bot] in #166
  • Bump actions/upload-artifact from 3.1.2 to 4.3.3 by @dependabot[bot] in #162
  • Bump actions/setup-java from 3 to 4 by @dependabot[bot] in #147
  • Bump maxim-lobanov/setup-xcode from 1.5.1 to 1.6.0 by @dependabot[bot] in #146
  • Bump androidx.test:rules from 1.4.0 to 1.5.0 in /android by @dependabot[bot] in #139
  • Bump gradle/wrapper-validation-action from 1 to 3 by @dependabot[bot] in #157
  • Bump org.jetbrains.kotlin:kotlin-stdlib from 1.8.21 to 2.0.0 in /android by @dependabot[bot] in #169
  • Bump actions/checkout from 4.1.6 to 4.1.7 by @dependabot[bot] in #178
  • Bump softprops/action-gh-release from 1 to 2 by @dependabot[bot] in #179
  • Bump com.google.android.material:material from 1.6.1 to 1.12.0 in /android by @dependabot[bot] in #176
  • Bump org.jetbrains.kotlin:kotlin-gradle-plugin from 1.8.21 to 2.0.0 in /android by @dependabot[bot] in #177
  • Bump org.awaitility:awaitility from 4.1.1 to 4.2.1 in /android by @dependabot[bot] in #181
  • Bump actions/upload-artifact from 4.3.3 to 4.3.6 by @dependabot[bot] in #188
  • Bump com.google.ar:core from 1.41.0 to 1.45.0 in /android by @dependabot[bot] in #189
  • Bump androidx.recyclerview:recyclerview from 1.2.1 to 1.3.2 in /android by @dependabot[bot] in #193
  • Bump org.awaitility:awaitility from 4.2.1 to 4.2.2 in /android by @dependabot[bot] in #194
  • Bump androidx.preference:preference-ktx from 1.1.1 to 1.2.1 in /android by @dependabot[bot] in #138
  • Fixed permission related issues for the SDK by @darshanio in #183
  • Bump actions/upload-artifact from 4.3.6 to 4.4.0 by @dependabot[bot] in #195
  • Bump androidx.test.espresso:espresso-core from 3.1.0 to 3.6.1 in /android by @dependabot[bot] in #196
  • Bump androidx.test.ext:truth from 1.4.0 to 1.6.0 in /android by @dependabot[bot] in #197
  • Bump org.jetbrains.kotlin:kotlin-stdlib-jdk7 from 1.8.21 to 2.0.20 in /android by @dependabot[bot] in #198
  • Bump actions/checkout from 4.1.7 to 4.2.0 by @dependabot[bot] in #203
  • Bump actions/checkout from 4.2.0 to 4.2.1 by @dependabot[bot] in #212
  • Bump actions/upload-artifact from 4.4.0 to 4.4.3 by @dependabot[bot] in #213
  • Bump actions/checkout from 4.2.1 to 4.2.2 by @dependabot[bot] in #216
  • Bump actions/upload-artifact from 4.4.3 to 4.6.0 by @dependabot[bot] in #228
  • update: add safety checks to prevent crashes on iOS by @tadjik1 in #257
  • Improved Plane Detection by @doranteseduardo in #260
  • Bunch of features by @doranteseduardo in #272
  • v2.45.0 by @doranteseduardo in #273

New Contributors

Full Changelog: v1.21.0...v2.50.0

1.22.0-alpha1

13 Oct 09:45

Choose a tag to compare

1.22.0-alpha1 Pre-release
Pre-release

What's Changed

Other Changes

  • fix video crashing on Android because of unresolved ExoPlayer breaking changes by @Buthrakaur in #154
  • ARCore 1.43, Fix Broken Builds by @doranteseduardo in #168
  • Bump actions/checkout from 3.3.0 to 4.1.6 by @dependabot in #166
  • Bump actions/upload-artifact from 3.1.2 to 4.3.3 by @dependabot in #162
  • Bump actions/setup-java from 3 to 4 by @dependabot in #147
  • Bump maxim-lobanov/setup-xcode from 1.5.1 to 1.6.0 by @dependabot in #146
  • Bump androidx.test:rules from 1.4.0 to 1.5.0 in /android by @dependabot in #139
  • Bump gradle/wrapper-validation-action from 1 to 3 by @dependabot in #157
  • Bump org.jetbrains.kotlin:kotlin-stdlib from 1.8.21 to 2.0.0 in /android by @dependabot in #169
  • Bump actions/checkout from 4.1.6 to 4.1.7 by @dependabot in #178
  • Bump softprops/action-gh-release from 1 to 2 by @dependabot in #179
  • Bump com.google.android.material:material from 1.6.1 to 1.12.0 in /android by @dependabot in #176
  • Bump org.jetbrains.kotlin:kotlin-gradle-plugin from 1.8.21 to 2.0.0 in /android by @dependabot in #177
  • Bump org.awaitility:awaitility from 4.1.1 to 4.2.1 in /android by @dependabot in #181
  • Bump actions/upload-artifact from 4.3.3 to 4.3.6 by @dependabot in #188
  • Bump com.google.ar:core from 1.41.0 to 1.45.0 in /android by @dependabot in #189
  • Bump androidx.recyclerview:recyclerview from 1.2.1 to 1.3.2 in /android by @dependabot in #193
  • Bump org.awaitility:awaitility from 4.2.1 to 4.2.2 in /android by @dependabot in #194
  • Bump androidx.preference:preference-ktx from 1.1.1 to 1.2.1 in /android by @dependabot in #138
  • Fixed permission related issues for the SDK by @darshanio in #183
  • Bump actions/upload-artifact from 4.3.6 to 4.4.0 by @dependabot in #195
  • Bump androidx.test.espresso:espresso-core from 3.1.0 to 3.6.1 in /android by @dependabot in #196
  • Bump androidx.test.ext:truth from 1.4.0 to 1.6.0 in /android by @dependabot in #197
  • Bump org.jetbrains.kotlin:kotlin-stdlib-jdk7 from 1.8.21 to 2.0.20 in /android by @dependabot in #198
  • Bump actions/checkout from 4.1.7 to 4.2.0 by @dependabot in #203

New Contributors

Full Changelog: v1.21.0...1.22.0-alpha1

v1.21.0

19 Feb 21:43

Choose a tag to compare

What's Changed

Exciting New Features πŸŽ‰

Other Changes

New Contributors

Full Changelog: rc-1.20.2...v1.21.0

rc-1.20.2

22 Sep 17:08
7ade896

Choose a tag to compare

rc-1.20.2 Pre-release
Pre-release
  • no changes

rc-1.20.1

19 Sep 03:38
9a30496

Choose a tag to compare

  • no changes