ComponentBase.isDirty and the Audio component's property type — see entries marked Breaking: for migration steps.StereoCanvasPanelRegistration for custom Canvas-based panel rendering with built-in stereo layout support. Apps can draw directly to a panel surface using drawFlat for mono content or drawStereo(depthOffsetMeters) for depth-offset-based stereo content with per-eye disparity.DepthLayer preset object with common depth offsets (SURFACE, NEAR, FAR, BACKGROUND) for use with CanvasPanelScope.drawStereo().ProjectionLight component and ProjectionLightSystem for panel-driven dynamic lighting that automatically derives light color from panel content.SceneTexture.readAverageColor() for reading the average color of a texture region via GPU mipmap sampling.SceneLight.setProjectionTexture() for binding projection textures directly to lights, with optional GPU-based color sampling via the useGpuSampling attribute on ProjectionLight.PakManager for mounting and reading ZIP-based asset packages via the pak:// URI scheme, enabling bundled asset distribution outside the APK.LocalizedAssetResolver for opt-in localized asset resolution. Place locale-specific variants in a locale subdirectory (e.g., models/fr/cube.glb), initialize with LocalizedAssetResolver.initialize(context), and the framework automatically resolves the best match based on device locale.IntrospectionRegistry API and adb shell dumpsys integration for live inspection of SDK subsystem counters and state. Supports --json, --list, and path-prefix filtering.ComponentBase.isDirty is removed. Use ComponentBase.hasAttributeChanges() instead for read-only change detection. Direct isDirty = true calls should be replaced with actual attribute mutations; isDirty = false calls should be replaced with entity.setComponent(component). Before:if (component.isDirty) { entity.setComponent(component) }
if (component.hasAttributeChanges()) { entity.setComponent(component) }
Audio component's audio property type changed from String to android.net.Uri. A deprecated Audio(String, Float, Float) helper is available for migration. Before:val entity = Entity.create(listOf( Audio("ambient_forest.ogg", 0.8f) )) val path: String = entity.getComponent<Audio>().audio
val entity = Entity.create(listOf( Audio(Uri.parse("ambient_forest.ogg"), 0.8f) )) val uri: Uri = entity.getComponent<Audio>().audio
LibraryLoader interface, FeatureManager.attach(), and AbstractSpatialFeature base class to support custom native library loading strategies and reduce boilerplate in SpatialFeature subclasses.GLXFInfo.allMeshesLoaded future that completes once every mesh-bearing entity in an inflated glXF has its SceneObject ready, enabling apps to defer visibility until all assets are loaded.SceneAudioPlayer.setPitch() for runtime pitch and playback rate control.pitch attribute to the Audio component for declarative pitch control.Material component baseColor being silently ignored, causing objects to render white instead of the specified color.Material PBR properties (roughness, metallic, unlit) not being applied to rendered objects.Box, Sphere, Dome, Quad, RoundedBox) causing incorrect face culling.matrix field instead of separate translation/rotation/scale fields, causing affected entities to render at incorrect positions.PanelDisplay when an async window callback fired after panel destruction.