Status: stable. Maven Central and Swift Package Manager artifacts are published from this tag.
Backward compatible with 3.6.x. Existing code compiles and runs unchanged against 4.0.0.
Renamed the top-level composables from Scene/ARScene to SceneView { } / ARSceneView { } across all public surfaces (KDocs, MCP packages, sample apps, docs, llms.txt, README, website). The old names are still accepted via deprecated aliases — no callers break.
- Nodes are now declared as composables inside the trailing content lambda; imperative node management is no longer the primary API.
LightNode'sapplyis a named parameter (apply = { intensity(…) }), not a trailing lambda — matches the Compose convention for layout-affecting side effects.rememberModelInstance(modelLoader, "models/file.glb")returnsnullwhile loading; all samples handle the null case explicitly.
Stream an ARCore (Android) or ARKit (iOS) session to the Rerun viewer for scrub-and-replay debugging. Same JSON-lines wire format on both platforms, single Python sidecar handles both.
- Android: new
io.github.sceneview.ar.rerun.RerunBridge+rememberRerunBridgecomposable helper. Non-blockingDispatchers.IOscope,Channel.CONFLATEDdrop-on-backpressure, rate-limited 10 Hz by default, runtimesetEnabled()kill switch. Zero new Gradle dependencies. - iOS: new
SceneViewSwift.RerunBridge(@ObservableObjectwith@Published eventCount),Network.frameworkNWConnectionon a dedicated utility queue. NewARSceneView.onFrame { frame, arView in … }modifier — usable independently of the bridge for any per-frame custom logic. - Wire format: 5 event types (
camera_pose,plane,point_cloud,anchor,hit_result), byte-identical output from Kotlin and Swift, enforced by 24 golden-string tests (12 per platform). - Python sidecar:
tools/rerun-bridge.py— reads the TCP stream and re-logs each event as the matching Rerun archetype (Transform3D,LineStrips3D,Points3D). Spawns the Rerun viewer automatically viarr.init(spawn=True). - Playground: new "AR Debug (Rerun)" example in the
ar-spatialcategory with per-platform code tabs. - Sample apps: new
RerunDebugDemotile insamples/android-demo(Samples tab) andsamples/ios-demo(Scenes → AR category).
New dedicated MCP server (npx rerun-3d-mcp) generating Rerun integration boilerplate from natural-language prompts. 5 tools, 73 vitest tests, Apache-2.0. Tarball 13.6 kB.
Production-grade monetization layer for sceneview-mcp:
- Cloudflare Worker (
gateway/) with Hono router, D1 database, KV namespace. - Stripe-first anonymous checkout: no login wall — user clicks CTA, pays, receives API key by email via Stripe webhook + KV single-use handoff.
- 4 plans: Free / Pro (€19) / Team (€49) / Enterprise — with tier gating and per-plan rate limiting.
POST /mcpproxy withX-Api-Keyauth, lite mode detection, and upstream routing.- Dashboard-less by design: billing managed entirely through the Stripe Customer Portal.
- 168 tests passing across gateway + hub packages.
- Live in production at
https://sceneview-mcp.mcp-tools-lab.workers.dev.
mcp/packages/hub-mcp is a unified MCP server dispatching to 11 SceneView-ecosystem libraries (automotive, gaming, healthcare, interior, realestate, architecture, ecommerce-3d, education, finance, legal-docs, french-admin). Anonymous telemetry on every tool call. Stripe billing layer + quota enforcement shared with the gateway.
sceneview-mcp now sends lightweight anonymous usage telemetry (tool name, tier, timestamp — no personal data) to a Cloudflare Worker via batched HTTP. Sponsor CTA fires every 10 tool calls.
sceneview-mcp@4.0.0 is promoted to the @latest dist-tag. Previous @latest was 3.6.5; @next pointed to 4.0.0-rc.5. The publishConfig: { tag: "next" } guard in package.json has been removed now that the gateway go-live pipeline has verified a real paying customer.
- Flutter:
flutter/sceneview_flutter— PlatformView bridge to SceneView on Android + SceneViewSwift on iOS; Kotlin 2.0 + Compose Compiler plugin compatibility fixed. - React Native:
react-native/react-native-sceneview— Fabric/Turbo bridge with nativeandroid/andios/modules scaffolded. - Web:
sceneview-webKotlin/JS package (npm view sceneview-web) — Filament.js (WASM) + WebXR, webpack 5 polyfills unblocked.
website-static/ now includes a GA4-backed analytics dashboard (/analytics) for tracking playground interactions, MCP install events, and Stripe checkout funnels.
- NodeAnimator (#388):
NodeAnimatornow writes animated values back to the targetNode's transform fields on every frame, fixing silent no-op animations that computed but discarded results. - Render tests (#803): Fixed intermittent SwiftShader JVM crashes in CI by sharing a single
Engineinstance per test class. The class-level@Ignoreworkarounds have been removed. - AR camera exposure (#792): Added
cameraExposureparameter toARSceneViewcomposable. - customer_creation bug:
stripe-client.tsnow guardsform.customer_creation = "always"withif (mode === "payment"), preventing a Stripe 400 error on subscription checkouts.
- 16 new JVM tests in
arsceneview(Rerun wire format + socket integration). - 12 new Swift tests in
SceneViewSwiftTests(cross-platform wire-format parity). - 73 new vitest tests in
mcp/packages/rerun. - 90+ new unit tests across
sceneviewandarsceneview(#814). - 168 gateway/hub tests.
- AGP bumped
8.11.1 → 8.13.2,maven-publish 0.35.0 → 0.36.0. activesupportbumped>= 7.2.3.1(CVE-2026-33176/33170/33169).
samples/android-demo: Sprint 1 refactor — 4-tab nav replaced with categorized list, 20 demos (including RerunDebugDemo).samples/android-tv-demo+samples/web-demo: broken asset refs fixed; all 8 previously-404 GLB/USDZ/HDR paths resolved.samples/ios-demo: AR Debug demo added in Scenes → AR category.
gradle.properties VERSION_NAME, all gradle.properties submodule files, npm packages, Flutter pubspec.yaml + podspec, llms.txt, docs, website, samples — synced to 4.0.0 via .claude/scripts/sync-versions.sh --fix.
Status: release candidate. Maven Central and Swift Package Manager artifacts are not published from this tag — pin to 4.0.0-rc.1 manually to test, or wait for the v4.0.0 stable tag.
Strictly additive to 3.6.2. Existing 3.6.x code compiles and runs unchanged.
Stream an ARCore (Android) or ARKit (iOS) session to the Rerun viewer for scrub-and-replay debugging. Same JSON-lines wire format on both platforms, single Python sidecar handles both.
- Android: new
io.github.sceneview.ar.rerun.RerunBridge+rememberRerunBridgecomposable helper. Non-blockingDispatchers.IOscope,Channel.CONFLATEDdrop-on-backpressure, rate-limited 10 Hz by default, runtimesetEnabled()kill switch. Zero new Gradle dependencies. - iOS: new
SceneViewSwift.RerunBridge(@ObservableObjectwith@Published eventCount),Network.frameworkNWConnectionon a dedicated utility queue. NewARSceneView.onFrame { frame, arView in … }modifier wired to the existingARSessionDelegate.session(_:didUpdate:)— usable independently of the bridge for any per-frame custom logic. - Wire format: 5 event types (
camera_pose,plane,point_cloud,anchor,hit_result), byte-identical output from Kotlin and Swift (enforced by 24 golden-string tests, 12 per platform). - Python sidecar:
samples/android-demo/tools/rerun-bridge.py— reads the TCP stream and re-logs each event as the matching Rerun archetype (Transform3D,LineStrips3D,Points3D). Spawns the Rerun viewer automatically viarr.init(spawn=True). - Playground: new "AR Debug (Rerun)" example in the
ar-spatialcategory — embeds the official Rerun Web Viewer fromapp.rerun.ionext to the SceneView canvas with per-platform code tabs for Android / iOS / Web / Flutter / React Native / Desktop / Claude. - Sample apps: new
RerunDebugDemotile in bothsamples/android-demo(Samples tab) andsamples/ios-demo(Scenes → AR category).
New dedicated MCP server — npx rerun-3d-mcp — that generates the Rerun integration boilerplate from natural-language prompts in any MCP client (Claude, Cursor, etc.). 5 tools:
setup_rerun_project— Gradle / SPM / Web / Python scaffolding with boilerplategenerate_ar_logger— Kotlin or Swift AR streaming helper, parameterized by data types and rategenerate_python_sidecar— TCP →rerun-sdkPython bridgeembed_web_viewer— HTML + module-script snippets for@rerun-io/web-viewerexplain_concept— focused docs forrrd,timelines,entities,archetypes,transforms
Published Apache-2.0. 73 vitest tests. Tarball size 13.6 kB (9 files).
sceneview-mcp gains the Rerun integration docs via the regenerated sceneview://api resource (82.5 kB, +5.4 kB vs 3.6.4). Stays on the @next dist-tag — @latest is intentionally pinned to 3.6.4 until the gateway go-live pipeline has a first real paying customer (see NOTICE-2026-04-11-mcp-gateway-live.md). Install the RC with npx sceneview-mcp@next.
Adds publishConfig: { tag: "next" } to mcp/package.json so future sessions can't accidentally promote the RC to @latest by running a bare npm publish.
- Added
cameraExposureparameter toARSceneViewcomposable, allowing developers to programmatically control the camera exposure applied to the AR scene.
- Render tests (#803): Fixed intermittent SwiftShader JVM crashes in CI by sharing a single
Engineinstance per test class instead of creating and tearing down one per test method. Affected classes (GeometryRenderTest,VisualVerificationTest,LightingRenderTest,RenderSmokeTest) are now stable; the class-level@Ignoreguards added as a temporary workaround have been removed. - MCP tiers test: Removed stale Polar URL from
tiers.test.tsthat was causing a test failure after the Polar → Stripe migration.
- 16 new JVM tests in
arsceneview(12 golden-JSON forRerunWireFormat, 4 socket integration forRerunBridgewith a mockServerSocket) - 12 new Swift tests in
SceneViewSwiftTests— identical golden strings, enforcing cross-platform wire-format parity at build time - 73 new vitest tests in
mcp/packages/rerun— 100% tool coverage - 90+ new unit tests across
sceneviewandarsceneviewmodules (#814) - Full suite validation:
./gradlew :arsceneview:compileDebugKotlin :arsceneview:testDebugUnitTest✓./gradlew :samples:android-demo:assembleDebug✓swift build --package-path SceneViewSwift✓swift test --package-path SceneViewSwift --filter Rerun*✓xcodebuild -project samples/ios-demo/SceneViewDemo.xcodeproj -scheme SceneViewDemo -destination 'generic/platform=iOS Simulator'✓
Propagated to 28 files via .claude/scripts/sync-versions.sh --fix + manual touches on docs/website/samples. The 4.0.0 major bump reflects two new capabilities (Rerun integration + the 4.0.0-beta.1 gateway lite proxy shipped earlier this day by a parallel session), not breaking API changes — 3.6.x code compiles unchanged against 4.0.0-rc.1.
Git tag v4.0.0-rc.1 + GitHub pre-release created. release.yml only matches strict semver v[0-9]+.[0-9]+.[0-9]+, so this RC tag does not trigger Maven Central / SPM publish. Promote to stable by bumping to v4.0.0 and tagging again.
- Extract
SceneRenderer— shared render loop between SceneView and ARSceneView - Decompose
Nodegod class intoNodeGestureDelegate,NodeAnimationDelegate,NodeState - Extract
ARPermissionHandlerinterface (testable without Activity) - Fix
ModelLoader.releaseSourceData()memory leak - Clean legacy Java collision code
- Add 175 JVM unit tests for sceneview module
- Add 15 JVM unit tests for arsceneview module
- Add 63 KMP tests for sceneview-core
- Add 18 Swift tests for SceneViewSwift (ShapeNode)
- Fix 8 MCP test regressions
- Add pre-push quality gate script
- Stability audit: all platforms PASS
- Rebrand to "3D & AR Explorer" (iOS + Android)
- iOS: Add model gallery, favorites, share, categorized browsing
- Android: Material 3 Expressive rewrite, 4 tabs, 40 models
- Fix Play Store build (duplicate assets in asset pack)
- Fix App Store build (private init access level)
- Fix AR camera tone mapper (rememberView → rememberARView)
- Redesign 8 sections on homepage
- Rewrite Showcase page from scratch
- Playground: 7 platform tabs, camera manipulator, Open in Claude
- Playground: geometry primitives preview, AR placeholders
- Fix Docs 404 (redirect page)
- Auto-deploy GitHub Pages workflow
- iOS: Add ShapeNode (23/24 Android parity)
- iOS: Fix GeometryMaterial.custom(), ViewNode platform guard
- Web: Fix SCENEVIEW_VERSION (1.3.0 → 3.6.0)
- TV: Fix missing assets (would crash at runtime)
- MCP: Align version 3.5.5 → 3.6.0
- Flutter + React Native: Prepare for publication
- CI: Web builds now blocking, Gradle verification added
- Fixed SceneSnapshot visionOS compilation (ARView unavailable)
- Fixed VideoNode memory leak (NotificationCenter observer never removed)
- Fixed CameraNode macOS support (removed unnecessary platform guards)
- Removed unreachable dead code in GeometryNode
- Migrated ALL pages from model-viewer/Three.js to sceneview.js
- Removed Three.js (53K LOC) and model-viewer.min.js
- Rewrote sceneview-demo.html to use SceneView.modelViewer() API
- Fixed 3 demo pages crashing from non-existent API calls
- Fixed model paths in claude-3d.html
- Deleted 5 dead demo pages + fixed sitemap.xml
- Added 404.html page for GitHub Pages
- Fixed og:image/twitter:image meta tags (SVG → PNG) across all 8 pages
- Fixed sceneview.js version mismatch (runtime 1.5.0 → 3.6.0)
- Fixed IBL path (relative → absolute) for embed/preview subdirectory pages
- Improved synthetic IBL fallback lighting for Claude Artifacts
- Generated 22 PNG exports from SVG sources (logo, app icon, favicon, social, npm, store)
- Created favicon.ico (multi-resolution)
- Updated Open Collective: logo, cover, tiers (Backer $10, Sponsor $50, Gold $200), 10 tags
- Added Claude Artifacts section to llms.txt (HTML template, CDN URLs, 26 models)
- Updated MCP tool count: 22 → 26 tools, 2360 tests across 98 suites
- Bumped Filament 1.70.0 → 1.70.1
- Fixed maintenance.yml (Filament version grep, graceful fallback)
- Fixed docs.yml (download-artifact version, deploy retry)
- All 10 workflows verified green
- Updated 100+ files from 3.5.0/3.5.1 to 3.6.0
- All satellite MCPs (automotive, gaming, healthcare, interior) aligned
- Native macOS support in SceneViewSwift (all source files + demo app)
- macOS App Store submission (build 357, pending review)
- iOS App Store submission (build 355, pending review)
- Environment picker UI with 6 HDR presets (Studio, Outdoor, Sunset, Night, Warm, Autumn)
- Proper macOS app icon sizes (16px to 1024px)
- Swift 6 strict concurrency fix (
@MainActoron HapticManager)
- Updated all dependency references from 3.4.7 to 3.5.0
- Published to npm as sceneview-mcp@3.5.3
- 1204 tests passing
- Extended app-store.yml with macOS deploy job (parallel iOS + macOS)
- Fixed TestFlight deploy failure (Swift 6 concurrency)
- Added ViewNode, SceneSnapshot, SceneEnvironment.allPresets to llms.txt
- Rebuilt docs site — zero stale version references
- Fixed CDN versions in README (1.2.0 → 3.5.1) and website (1.4.0 → 3.5.1)
- URL-based model loading (Android + iOS)
- 6 iOS HDR environments
- Progressive texture loading (Filament async)
- 25 models migrated to GitHub Releases CDN (Play Store compliance)
- Unified all version references across 60+ files to 3.5.0
- Fixed module gradle.properties (sceneview, arsceneview, sceneview-core)
- Updated MCP source + dist files, docs, website, samples, Flutter, React Native
- Fixed Flutter/React Native Android build files (were still on 2.3.0)
- Updated llms.txt, all docs, codelabs, cheatsheets, quickstarts
- Updated CLAUDE.md code samples and platform table
- Cross-platform version consistency across all READMEs
- 4 new tools:
get_platform_setup,migrate_code,debug_issue,generate_scene - 834 tests across all tools
- Orbit controls: corrected inverted horizontal/vertical camera drag
- 3 core math/collision bugs fixed
- Removed stale CI job
- Geometry demo: mini-city with 4 presets (City, Park, Abstract, Minimal)
- Meta tags, sitemap, favicon, canonical URLs polished
create_3d_artifactMCP tool with geometry type: procedural shapes with PBR materials- SceneView.js v1.1.0 published to npm: one-liner web 3D with auto Filament WASM loading
- Filament.js PBR rendering on website (replaced model-viewer)
- 9 MCP servers all at v2.0.0
- Real 3D rendering in browser via Google Filament compiled to WebAssembly
- 25 KB bundle (+ Filament.js from CDN)
- Live demo at sceneview.github.io
- Website mobile polish, 50+ broken links fixed
- GitHub Sponsors: 3 new tiers; Polar.sh approved with Stripe
- MCP v3.4.9:
create_3d_artifacttool (590 tests)
- Android demo: Play Store readiness (crash prevention, dark mode, store listing)
- MCP Server: Terms of Service, Privacy Policy, disclaimers added
- GitHub Sponsors tier structure
- Embeddable 3D viewer via single
<iframe>snippet - MCP
render_3d_previewaccepts code snippets and direct model URLs - Web demo: branded UI, model selector, loading indicator
- AR materials regenerated for Filament 1.70.0 — previous materials crashed all AR apps
MeshNodenow accepts optionalboundingBoxparameter
- 6 Dependabot vulnerabilities fixed, 15 audit issues resolved
- 28 stale repository references updated
- Website rebuilt: Kobweb replaced with static HTML/CSS/JS + model-viewer 3D
- Smart links:
/go(platform redirect),/preview(3D preview),/preview/embed(iframe viewer) - MCP
render_3d_previewtool for AI-generated 3D previews
- 21 secrets configured (Apple + Android + Maven + npm)
- README rewritten (622 to 200 lines)
- Web —
sceneview-webmodule: Filament.js (WASM) rendering + WebXR AR/VR - Desktop —
samples/desktop-demo: Compose Desktop, software 3D renderer - Android TV —
samples/android-tv-demo: D-pad controls, model cycling - Flutter —
samples/flutter-demo: PlatformView bridge (Android + iOS) - React Native —
samples/react-native-demo: Fabric bridge (Android + iOS)
- Unified
samples/android-demo— Material 3 Expressive, 4 tabs, 14 demos - Blue branding with isometric cube icon
- MCP Registry — SceneView MCP published at
io.github.ThomasGorisse/sceneview - 21 GitHub Secrets — Android + iOS + Maven + npm fully configured
- Apple Developer — Distribution certificate, provisioning profile, API key
- CI/CD — Play Store + App Store workflows ready
- 15 obsolete samples deleted, merged into unified platform demos
{platform}-demonaming convention across all 7 platforms- Code recipes preserved in
samples/recipes/
- material-icons-extended pinned to 1.7.8 (1.10.5 not published on Google Maven)
- wasmJs target disabled (kotlin-math lacks WASM variant)
- AR emulator script updated for new sample structure
- All modules aligned to 3.3.0 — sceneview, arsceneview, sceneview-core, MCP server, SceneViewSwift, docs, and all references across the repo are now at a single unified version
- iOS 17+ / macOS 14+ / visionOS 1+ via RealityKit — alpha
- Node types: ModelNode, AnchorNode, GeometryNode, LightNode, CameraNode, ImageNode, VideoNode, PhysicsNode, AugmentedImageNode
- PBR material system with textures
- Swift Package Manager distribution
- DynamicSkyNode — procedural time-of-day sky with sun position, atmospheric scattering
- FogNode — volumetric fog with density, color, and distance falloff
- ReflectionProbeNode — local cubemap reflections for realistic environment lighting
- ModelNode enhancements — named animation playback, runtime material swapping, collision shapes
- LightNode enhancements — shadow configuration, attenuation radius and falloff
- CameraNode enhancements — field of view, depth of field, exposure control
- 8 Swift sample snippets for iOS code generation
get_ios_setuptool for Swift/iOS project bootstrapping- Swift code validation in
validate_codetool - iOS-specific guides and documentation
- 65+ new tests covering edge cases and platform-specific behavior
- Test coverage for all 15+ SceneViewSwift node types
- Platform tests for iOS-specific RealityKit integration
- Platform logo ticker on homepage — infinite-scroll marquee showing all supported platforms and technologies (Android, iOS, macOS, visionOS, Compose, SwiftUI, Filament, RealityKit, ARCore, ARKit, Kotlin, Swift)
- CSS-only animation with fade edges, hover-to-pause, dark mode support
- Updated ROADMAP.md to reflect current state (SceneViewSwift exists, phased plan revised)
- Updated PLATFORM_STRATEGY.md — native renderer per platform architecture (Filament + RealityKit)
- All codelabs, cheatsheet, migration guide updated to 3.3.0
- iOS quickstart guide — step-by-step setup for SceneViewSwift
- iOS cheatsheet — quick reference for SwiftUI 3D/AR patterns
- 2 SwiftUI codelabs — hands-on tutorials for iOS 3D scenes and AR
autopilot-demo: remove deprecatedengineparameter fromPlaneNode,CubeNode,CylinderNodeconstructors (API aligned with composable node design)- CI: fix AR emulator stability — wait for launcher, dismiss ANR dialogs, kill Pixel Launcher before screenshots
model-viewer: scale up Damaged Helmet 0.25 → 1.0; add Fox model (CC0, KhronosGroup glTF-Sample-Assets) with model picker chip rowcamera-manipulator: scale up model 0.25 → 1.0; add gesture hint bar (Drag·Orbit / Pinch·Zoom / Pan·Move)
/maintainClaude Code skill + daily maintenance GitHub Action for automated SDK upkeep- AR emulator CI job using x86_64 Linux + ARCore emulator APK for screenshot verification
ROADMAP.mdadded covering 3.2–4.0 milestones
- Downgrade AGP from 8.13.2 → 8.11.1 for Android Studio compatibility
- Update AGP classpath in root
build.gradleto match - Refresh
gltf-camerasample: animated BrainStem character + futuristic rooftop night environment
VideoNode— render a video stream (MediaPlayer / ExoPlayer) as a textured 3D surface- Reactive animation API — drive node animations from Compose state
ViewNoderename —ViewNode2unified intoViewNode
ToneMapper.LinearinARSceneprevents overlit camera backgroundImageNodeSIGABRT: destroyMaterialInstancebefore texture on disposecameraNoderegistered withSceneNodeManagerso HUD-parented nodes render correctly- Entities removed from scene before destroy to prevent SIGABRT
UiHelperAPI corrected for Filament 1.56.0
- MCP server:
validate_code,list_samples,get_migration_guidetools + live Issues resource - 89 unit tests for MCP validator, samples, migration guide, and issues modules
The entire public API has been redesigned around Jetpack Compose. There is no source-compatible upgrade path from 2.x; see the Migration guide for a step-by-step walkthrough.
Nodes are no longer passed as a list. They are declared as composable functions inside a trailing content block:
// 2.x
Scene(
childNodes = rememberNodes {
add(ModelNode(modelInstance = loader.createModelInstance("helmet.glb")))
}
)
// 3.0
Scene {
rememberModelInstance(modelLoader, "models/helmet.glb")?.let { instance ->
ModelNode(modelInstance = instance, scaleToUnits = 1.0f)
}
}All node types (ModelNode, LightNode, CubeNode, SphereNode, CylinderNode, PlaneNode,
ImageNode, ViewNode, MeshNode, Node) are now @Composable functions inside SceneScope.
Child nodes are declared in a NodeScope trailing lambda, matching how Compose UI nesting works.
All AR node types (AnchorNode, PoseNode, HitResultNode, AugmentedImageNode,
AugmentedFaceNode, CloudAnchorNode, TrackableNode, StreetscapeGeometryNode) are now
@Composable functions inside ARSceneScope.
// Returns null while loading; recomposes with the instance when ready
val instance = rememberModelInstance(modelLoader, "models/helmet.glb")Replaces the previous boolean flag. Controls whether the 3D surface renders behind Compose layers
(SurfaceType.Surface, SurfaceView) or inline (SurfaceType.TextureSurface, TextureView).
PlaneVisualizer.java has been removed. PlaneVisualizer.kt replaces it.
The following legacy Java/Sceneform classes have been removed from the public API:
- All classes under
com.google.ar.sceneform.*— replaced by Kotlin equivalents under the same package path (.ktfiles). - All classes under
io.github.sceneview.collision.*— replaced by Kotlin equivalents. - All classes under
io.github.sceneview.animation.*— replaced by Kotlin equivalents.
All samples are now pure ComponentActivity + setContent { }. Fragment-based layouts have been
removed. The model-viewer-compose, camera-manipulator-compose, and ar-model-viewer-compose
modules have been merged into model-viewer, camera-manipulator, and ar-model-viewer
respectively.
ModelNode.isEditable—SideEffectwas resettingisEditableto the parameter default (false) on every recomposition, silently disabling gestures whenisEditable = truewas set only insideapply { }. PassisEditable = trueas a named parameter to maintain it correctly.- ARCore install dialog — Removed
canBeInstalled()pre-check that threwUnavailableDeviceNotCompatibleExceptionbeforerequestInstall()was called, preventing the ARCore install prompt from ever appearing on fresh devices. - Camera background black —
ARCameraStreamusedRenderableManager.Builder(4)with only 1 geometry primitive defined (invalid in Filament). Fixed toBuilder(1). - Camera stream recreated on every recomposition —
rememberARCameraStreamused a default lambda parameter as arememberkey; lambdas produce a new instance on every call, making the key unstable. Fixed by keying onmaterialLoaderonly. - Render loop stale camera stream — The render-loop coroutine captured
cameraStreamat launch; recomposition could recreate the stream while the loop kept updating the old (destroyed) one. Fixed with anAtomicReferenceupdated viaSideEffect.
SceneScope/ARSceneScope— fully declarative, reactive 3D/AR content DSLNodeScope— nested child nodes using Compose's natural trailing lambda patternSceneNodeManager— internal bridge that syncs Compose snapshot state with the Filament scene graph, enabling reactive updates without manualaddChildNode/removeChildNodecallsSurfaceType— explicit surface-type selection (SurfacevsTextureSurface)ViewNode— Compose UI content rendered as a 3D plane surface in the sceneEngine.drainFramePipeline()— consolidated fence-drain extension for surface resize/destroyrememberViewNodeManager()— lifecycle-safe window manager forViewNodecomposables- Autopilot Demo — new sample demonstrating autonomous animation and scene composition
- Camera Manipulator — new dedicated sample for orbit/pan/zoom camera control
Node.scaleGestureSensitivity— newFloatproperty (default0.5) that damps pinch-to-scale gestures. Applied as1f + (rawFactor − 1f) × sensitivityinonScale, making scaling feel progressive without reducing the reachable scale range. Set it per-node in theapplyblock alongsideeditableScaleRange.- AR Model Viewer sample — redesigned with animated scanning reticle (corner brackets +
pulsing ring), model picker (Helmet / Rabbit), auto-dismissing gesture hints,
enableEdgeToEdge(), and a clean Material 3 UI.
- AGP 8.9.1
- Filament 1.56.0 / ARCore 1.48.0
- Documentation improvements
- Camera Manipulator sample renamed