ViroReact 2.56.0 - Front-facing Camera 🤳 and AR Gaming Upgrades 🕹️

Released 4 June 2026

This release turns ViroReact into a viable runtime for real-time, interactive AR and VR. A per-frame game loop, native on-screen controllers, runtime audio streaming, and physics-ready world mesh land together, alongside a neural depth pipeline for occlusion on non-LiDAR devices and front-camera (selfie) AR.


New components

  • ViroGameLoop — a headless node that fires per-frame JS callbacks from the native render loop. Supports a variable onUpdate, an onLateUpdate after physics, and an optional deterministic onFixedUpdate fixed-step mode at a configurable rate. Companion hooks (useGameLoop, useLateUpdate, useFixedUpdate) and ViroGameLoopUtils (setPosition / setRotation / setScale) let you drive nodes directly, bypassing the React reconciler for high-frequency transforms. (iOS, Android). Full reference.

  • ViroVirtualJoystick and ViroVirtualButton — native on-screen game controller components. Input is captured at the native layer and written straight to a thread-safe controller registry, bypassing the JS bridge for sub-2ms latency, while still firing optional JS callbacks (onStickChange, onPressIn, onPressOut) for UI feedback. Both share state through a common controllerId. (iOS, Android). Full Joystick reference, Full Button reference

  • StreamingAudioManager — real-time PCM audio streaming. Push raw float32 PCM chunks at runtime from any source (TTS, synthesizers, game-engine audio) and play them without loading a complete file. Includes create / stream / play / pause / volume / mute / destroy controls. (iOS, Android). Full reference.

  • ViroCameraTexture — binds a live device camera feed (front or back) to a named material's diffuse texture, so any geometry can display a real-time camera view. Ideal for mirror surfaces, picture-in-picture, and VR selfie effects while back-camera AR tracking stays active. (iOS, Android). Full reference

Native engine

  • VRODynamicMeshNode - a new C++ virocore API that lets vertex buffers be swapped every frame without recreating geometry or its GPU resources. Built for procedural meshes, external engine output, and real-time simulations. This is a native integration with no React Native component.

  • Bring your own simulation engine - taken together, the dynamic mesh node, fixed-step game loop, native controllers, PCM audio streaming, and world mesh collision let you plug an external simulation or game engine into ViroReact entirely at the native layer (C / C++), with no JavaScript or JSX engine code, and render its live output through Viro.


Updated components

ViroARSceneNavigator`

  • World Mesh — new worldMeshEnabled, worldMeshConfig, and onWorldMeshUpdated props surface real-world geometry as a subscribable, physics-ready mesh. Sourcing is automatic and persistent (ARMeshAnchor LiDAR → depth image → plane fallback), with per-consumer triangle decimation, vertex clustering for gap-free collision meshes, and asynchronous physics construction that never blocks the render thread. (iOS, Android; LiDAR accumulation requires iOS 13.4+)

  • Monocular depth (improved) — the iOS depth pipeline now uses Depth Anything V2 (metric, indoor), outputting depth in meters for significantly better occlusion on non-LiDAR devices. New props preferMonocularDepth, monocularDepthScale, monocularDepthTargetFPS, and depthDebugEnabled allow you to force neural depth, calibrate it, and cap the inference rate. Thermal throttling is automatic. (iOS 14.0+, A12 Bionic or newer)

  • Front camera / selfie AR — the new frontCameraEnabled prop switches the AR session to the front-facing camera (ARKit face tracking on iOS, ARCore Augmented Faces on Android) while keeping 3D nodes, lighting, physics, the game loop, and PCM audio fully functional. Plane detection, world mesh, and image/object tracking are unavailable in this mode. (iOS, Android; Android requires an ARCore-certified device)

Check out the ViroARSceneNavigator.


Fixes

  • Android 14+ (API 34) hard crash on AR anchors — anchor creation passed a non-Modified-UTF-8 ARCore anchor ID to NewStringUTF, causing a SIGABRT on Android 14 and above. Anchor IDs are now encoded correctly.

Platform support at a glance

FeatureiOSAndroid
ViroGameLoopYesYes
ViroVirtualJoystick / ViroVirtualButtonYesYes
StreamingAudioManagerYesYes
ViroCameraTextureYesYes
World Mesh (worldMeshEnabled)YesYes
Monocular depth propsYesNo
Front camera (frontCameraEnabled)YesYes

Full API reference and migration notes ship with the package documentation.