Develop
Develop
Select your platform

Meta Spatial SDK

Updated: Feb 12, 2026|
Version
0.10.0
Transform your apps into mixed reality with Spatial SDK, a native Android framework to give your users an innovative spatial experience.

Version 0.10.0 Release Notes

Version 0.10.0 is our monthly update to Meta Spatial SDK. We made a variety of updates, ranging from runtime component removal and panel resize APIs to full body tracking and AI-driven debug tooling.

What's New

  • Add Entity.removeComponent<T>() and Entity.tryRemoveComponent<T>() for removing components from entities at runtime.
  • Add visual grab handle rendering for panels with animated hover, grab, and resize state transitions. Include audio feedback (grab and drop sounds) for panel grab interactions. IsdkPanelPaddingRenderSystem exposes grabbableEdgeMesh, grabbableCornerMesh, resizeCornerMesh, grabAudio, and dropAudio fields for customization.
  • Enhance Entity.toString() to print the entity ID and all attached components for easier debugging. Use optional EntityDebugInfo.includeComponentsInToString flag to enable full component value dumps. Use EntityDebugInfo.captureCreationCallstack to record creation callstacks and timestamps for debugging entity lifecycle issues.
  • Add SpatialLogger as a centralized logging utility with runtime-configurable log levels. Configure global and per-category log levels via ADB properties: adb shell setprop debug.spatial.log.level <LEVEL>.
  • Add Entity.willBeDeleted() method that returns true if destroy() has been called on the entity in the current frame, allowing systems to check whether an entity is scheduled for deletion before it is fully removed.
  • Add SceneTexture.clear(r, g, b, a) method to clear a texture with a solid color specified by RGBA float values.
  • Add feature-level hit testing support, enabling features such as GSplat to participate in ray intersection and ISDK interactions alongside standard scene objects.
  • Add batch node transform update APIs for SceneObject: setLocalNodePoses() for sparse or sequential node updates, setLocalNodePosesRange() for contiguous range updates, setLocalNodeTransformsBatch() and setLocalNodeTransformsRange() for direct float array APIs with transform component flags, and the static companion method for multi-object batch updates.
  • Add world locking for MRUK to keep virtual content stationary relative to the real world without manually parenting every object to anchors. Enabled by default; toggle with MRUKFeature.setWorldLockingEnabled(Boolean) and query with MRUKFeature.isWorldLockingEnabled(). After recentering, scene anchors stay aligned with the real world.
  • Add Entity.requireComponent<T>(errorMessage) method that throws a RuntimeException with a custom message if the component is not found on the entity.
  • Add HEAD_LOCKED and HEAD_RELATIVE stereo audio offset modes to the AudioSessionStereoOffsets component. HEAD_LOCKED anchors audio to the user's head position and rotation, ignoring the entity's position. HEAD_RELATIVE anchors audio to the user's head position but rotates stereo space based on the emitter's horizontal orientation.
  • Add support for playing animations by name in the Animated component. Set the animationName property to the name of the animation track in the glTF file instead of using the track index. When animationName is set, it takes precedence over track.
  • Add support for 44.1kHz and other non-standard audio sample rates. Audio files are no longer restricted to multiples of 16kHz. Files with other sample rates are automatically resampled to 48kHz.
  • Add experimental SceneMaterial.setRenderOrder() API for fine-grained control over material render ordering. Valid range is -3 to +3; higher values render later.
  • Add DataModel.getComponentIdsForEntity() to query which components are attached to an entity.
  • Add SceneTexture.fromResource() for loading textures from any Android drawable resource type (bitmaps, vectors, shapes) with optional scaling. Use baseTextureScale attribute on Material for scaling textures in component XML.
  • Add URI-based mesh creators with query parameter support via registerMeshCreator(baseUrl, (entity, uri) -> SceneMesh) to enable parameterized procedural mesh generation from a single registered creator.
  • Add Quaternion factory methods for common rotation patterns: fromAxisAngle(axis, angleDegrees) and fromAxisAngleRadians(axis, angleRadians), fromEuler(pitch, yaw, roll) (also accepts Vector3), fromTwoVectors(from, to) for vector-to-vector rotation, and fromDirection(direction, up) for look-at style orientation.
  • Add runtime addition and removal of metrics and overlay messages to OVRMetricsSystem. Use registerMetric(), registerMetrics(), and unregisterMetric() for dynamic metric management. Use registerOverlayMessage() and unregisterOverlayMessage() for dynamic overlay messages. Use OVRMetricsTicks with ticksPerSecond() and maxTickTimeMs() for monitoring ECS tick performance.
  • Add distance and angle utility methods on Pose, Quaternion, and Vector3: Vector3.isWithinDistance(other, distance) for proximity checks using squared distance internally, Quaternion.isWithinAngle(other, angleRadians) and isWithinAngleDegrees() for angular similarity checks, and corresponding Pose.isWithinDistance() and Pose.isWithinAngle() convenience methods.
  • Add audio focus awareness. Override VrActivity.audioPauseMode() to choose ACTIVITY_FOCUS (default), OPENXR_FOCUS, or MANUAL. Use Scene.setAudioEnabled() for manual audio control.
  • Add Scene.removeObject() method to remove a SceneObject from a scene without destroying it, allowing natural garbage collection.
  • Add experimental Panel Resize API with PanelSceneObject.resize(newWidthInPx, newHeightInPx) for programmatic runtime resizing and IsdkPanelResize component for interactive user-driven resizing through corner handles (adding this component auto-creates IsdkPanelGrabHandle on the entity). ResizeMode controls resize behavior: Simple modifies the entity Scale component (default), Relayout adjusts panel pixel dimensions and re-renders UI to preserve layout quality, and None disables built-in handling so custom resize logic can be written via InputListener on the PanelSceneObject. Use HandleSegmentType enum for identifying grab edges, grab corners, and resize corners on panels. Includes haptic and audio feedback on resize start and end.
  • Add experimental sticky grab interaction support via ISDK to allow users to maintain grip on objects after the grab gesture ends, until an explicit release gesture. For hand tracking, release is triggered when all fingers are fully extended. For controllers, the grip button toggles grab on and off.
  • Add experimental CachedQuery for incremental entity tracking to maintain a stable entity set and update incrementally, avoiding full re-queries each frame. Support onAdd, onUpdate, and onDelete callbacks for entity lifecycle events with filtering. Use native-level .filter DSL for attribute-based filtering and where { has(...) } DSL syntax for consistency with Query. Use hasChangedSince query opcode for efficient incremental change detection.
  • Add experimental full body tracking support with 14 new lower-body joints added to JointType (legs, ankles, and feet) for full-body skeleton tracking. Use JointSet enum to select between DEFAULT (upper body and hands) and FULL_BODY joint topologies. Use Scene.setBodyTrackingJointSet() to configure which joint set the body tracking system provides. Use BodyTrackingFidelity enum with LOW and HIGH levels, and Scene.setBodyTrackingFidelity() for quality/performance control.
  • Add AIDebugToolsFeature for headless, AI-driven app testing and debugging via ADB broadcast intents. Debug commands include get_entities, get_viewer_pose, set_viewer_pose, get_crash_history, and get_stack_trace. Inspect panel UI through panel discovery, UI element inspection, and programmatic view clicking. Interact with entities through lookup by name, detail inspection, transform modification, and teleportation. Use CrashMonitor, LogcatMonitor, and TombstoneMonitor for runtime crash detection and diagnostics.
  • Improvements

  • Brighten hand outlines.
  • Decouple Physics APIs from the core library into the com.meta.spatial.physics feature module. This is a breaking change.
  • Remove the synthetic GLTF root node from the mesh hierarchy. Node indices now correspond directly to their GLTF node indices.
  • Improve entity and component debug logging. Include the attribute name and entity ID in getComponent error messages. Provide explicit error messages during mesh creation when a required component is missing, including the entity ID, component name, and a listing of all attached components. Include human-readable attribute names and full entity debug info (creation callstack, time alive, component list) in entity debug error messages when EntityDebugInfo flags are enabled.
  • Accept an optional initialPose parameter in CastInputForwardFeature to customize the starting position of the input forwarding virtual camera.
  • Redesign IsdkPanelGrabHandle with a multi-segment handle system (edges, corners, resize corners) replacing the single box collider. This is a breaking change. Remove offset and padding properties and replace with grabHandleCollisionWidths, resizeCornerCollisionSizes, resizeCornerCollisionInset, outset, zOffset, color, and scaleFactor.
  • Support up to 256 virtual sounds in the audio engine with automatic focus management, selecting the best 16 for simultaneous playback based on distance, volume, and priority. Sounds transition smoothly to prevent audio artifacts.
  • Auto-generate component registration during the build. Use ComponentRegistrations.all() in componentsToRegister() instead of maintaining manual lists.
  • Lazily populate SceneObject.materials on first access, providing up to 16x faster entity creation. Change the property type from Array<SceneMaterial>? to List<SceneMaterial>?.
  • Make Material.sceneTextureCache private. Use Material.registerSceneTexture(key, texture) to register dynamically generated textures for use with the Material component via baseTextureAndroidResourceId. This is a breaking change.
  • Deprecated

  • Deprecate PanelSceneObject.getDisplay(), getTexture(), getLayer(), getPanelShapeConfig(), getSwapchain(), and getSurface(). Use property accessors instead.
  • Removed

  • Remove the experimental PanelConfigOptions2 API. This is a breaking change. All PanelConfigOptions2 classes, constructors, extension functions, and builder methods have been deleted. Use PanelConfigOptions and PanelShapeConfig instead. Replace PanelSceneObject constructors that accepted PanelConfigOptions2 with constructors using PanelConfigOptions or PanelShapeConfig. Replace getPanelConfigOptions2() with getPanelShapeConfig(). Replace reshape(PanelConfigOptions2) with reshape(PanelShapeConfig). Replace PanelRegistration.fromConfigOptions2 { ... } with the standard PanelRegistration constructors.
  • Remove SpatialInterface physics methods: enablePhysicsDebugLines(), setGravity(), createPhysicsObject(), deletePhysics(), tickPhysics(), tickUpdatePhysicsState(). Use PhysicsFeature and PhysicsBridge instead.
  • Remove the deprecated generateComponents Gradle task. This task has been deprecated since version 0.6.0 and is no longer needed. Remove any references to generateComponents in your build.gradle.
  • What's Fixed

  • Fix Compose panels receiving duplicate hover and input events when two controllers point at the same panel. Now only one controller can hover a panel at a time.
  • Fix incorrect 2D HitInfo UV coordinates on curved panels. UV coordinates from PointerEvent were calculated as if the panel was flat.
  • Fix a bug where interacting with a panel during a shape change (e.g., panel animation) could permanently block locomotion and hide the raycast indicator.
  • Fix entity deletion timing so that destroyed entities remain accessible during the same frame in which destroy() is called. Previously, entities were immediately removed, which could cause inconsistent behavior when systems accessed entities during the same tick.
  • Fix HitInfo.distance to return the actual distance from the interactor to the hit point instead of a hardcoded value of 1.0.
  • Fix bug in IsdkSystem where lambda observers registered with registerObserver() or registerInteractableObserver() would be garbage collected after a few seconds, causing them to stop receiving events.
  • Fix misleading native assert message when calling getComponent on an entity that does not have the requested component. The error now correctly identifies the missing attribute.
  • Fix SamplerConfig not being applied to dynamically created SceneTexture objects. Sampler settings now work correctly for textures created in code, not just those loaded from glTF files.
  • Fix changedSince queries not correctly detecting newly created entities due to incorrect version update ordering in the ECS data model.
  • Fix texture bug during texture initialization where textures would briefly appear black.