Releases: SceneView/sceneview-android
SceneView 3.0.0 — Compose-native rewrite
Changelog
3.0.0 — Compose-native rewrite
Breaking changes
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.
Scene and ARScene — new DSL-first signature
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)
}
}SceneScope — new composable DSL
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.
ARSceneScope — new AR composable DSL
All AR node types (AnchorNode, PoseNode, HitResultNode, AugmentedImageNode,
AugmentedFaceNode, CloudAnchorNode, TrackableNode, StreetscapeGeometryNode) are now
@Composable functions inside ARSceneScope.
rememberModelInstance — async, null-while-loading
// Returns null while loading; recomposes with the instance when ready
val instance = rememberModelInstance(modelLoader, "models/helmet.glb")SurfaceType — new enum
Replaces the previous boolean flag. Controls whether the 3D surface renders behind Compose layers
(SurfaceType.Surface, SurfaceView) or inline (SurfaceType.TextureSurface, TextureView).
PlaneVisualizer — converted to Kotlin
PlaneVisualizer.java has been removed. PlaneVisualizer.kt replaces it.
Removed classes
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.
Samples restructured
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.
Bug fixes
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 threw
UnavailableDeviceNotCompatibleExceptionbeforerequestInstall()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.
New features
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.
2.3.0
- AGP 8.9.1
- Filament 1.56.0 / ARCore 1.48.0
- Documentation improvements
- Camera Manipulator sample renamed
v2.3.3
- Reverted kotlin version to 2.20.x for wider compatibility by @kalmanbencze in #656
v2.3.2
- Make keepScreenOn behavior configurable in SceneView by @Antiglobalist in #645
- Updated filament library to version 1.68.2 by @kalmanbencze in #651
- Updated misc dependencies by @kalmanbencze in #652
- Fixed the dokka aggregated docs publishing by @kalmanbencze in #653
v2.3.1
- Upgraded filament to latest version 1.66.0 and regenerated all resources by @kalmanbencze in #640
- Bump Fuel to 3.0.0-alpha04 by @Rimusolamus in #641
- Upgraded gradle build config to use KTS and misc improvements by @kalmanbencze in #642
- Fix destroy calls order in ARCameraStream (fixes #644) by @ThomasGorisse
- Remove the ExpoPlayer release on ExoPlayerNode destroy (fixes #644) by @ThomasGorisse
- Various fixes in AR Augmented Image Sample by @ThomasGorisse
- Fix swapped arguments in the update function of the Cube (fixes #643) by @ThomasGorisse
v2.3.0
- Filament 1.56.0 (#581) - 🙏🏻 @kmayoral
- ARCore 1.48.0 (#581) - 🙏🏻 @kmayoral
- New camera manipulator implementation (#571) - 🙏🏻 @kubax2000
- Fix ViewNode2 rendering (#579) - 🙏🏻 @davidgarciaanton
- glTF Camera Sample
- Media3 ExoPlayer Node sample (#520) - 🙏🏻 @green7night
- Fix crash during animation (#553) - 🙏🏻 @ShafranIvan
- Memory management fixes in ViewNode2 (#597) - 🙏🏻 @davidgarciaanton
- Android API 35 (#581) - 🙏🏻 @kmayoral
- Kotlin 2.0.21 (#581) - 🙏🏻 @kmayoral
- Play all
ModelNodeanimations whenautoAnimate = true - Default camera far to 1000 units
- AGP 8.9.1
- Update dependencies
- Rename Camera Manipulator Sample
- Documentation
v2.2.1
v2.2.0
- Added
ViewNodeto ar-model-viewer sample (#461) Thanks @sameerjj - Added ability to set speed of animations (#464) Thanks @johnwhh
ShapeNodeconstructor from an AndroidPath- Customizable
rememberNode - Fixed camera manipulator transform conflict with camera node's one (#473) Thanks @wilfredbtan and @jacobmattsson
- Model Viewer Compose sample: Changed default camera position
- AR Model Viewer Compose sample: Add editable scale range
- AR Model Viewer Compose sample: Simplified model loading
- ARCore v1.43.0
- Filament v1.52.0
- Update Android dependencies
- Kotlin v1.9.24
- AGP v8.4.0
- Gradle v8.6
- Model Viewer Compose Sample: Scale x 2 on model double tap
- Model Viewer Compose Sample: Scale down default model size
- Fix World to Screen calculation (#499) Thanks @jacobmattsson
- Fix World to View calculation
- Fix View to World calculation (#400, #483) Thanks @dzivko1, @kubax2000, @den59k and @grassydragon
- Fix
lightNodesandcameraNodesparent (#484) Thanks @PMarchenko - Fix
CameraNodedestroy order (#475) Thanks @perunvolodymyr, @Denis-Makovskyi-ImproveIT, @jacobmattsson and @andytriboletti - Upgrade Gradle version to 8.2
- Upgrade AGP dependency from 8.1.4 to 8.2.1
- Removed flatbuffers and code related to loading models in Sceneform format (#477) Thanks @grassydragon
v2.1.1
v2.1.0
- Filament v1.51.0
- ARCore v1.42.0
- ViewNode v2.1.0 based on PlaneNode with ImageReader (Min SDK 28 required) and Filament Stream
- Rollback CameraGestureDetector Fixed copied version from Filament to possibly fix some Gestures
- Fixed CameraManipulator initialisation, update and default values
- Changed CameraManipulator initialisation, update and default values
- Delete sceneview_2_0_0 folder
- Update Android dependencies
- Update model viewer sample to use version 2.0.2 (#405)
- Fix ModelNode hierarchy (#443)
- Composable destroy ARCore - crash fix (#446)
- Safe destroying functions
- Geometries Vertices, Primitives Indices Setter with Engine parameter instead of var
- Single Default Collision System based Gesture Listener with HitResult output. You can use your own for Pick, Selection...
- Fixed SurfaceCallback.onResize() order with Engine Fence
- Removed default setKeepScreenOn (Please handle it on your side)
- Changed Lifecycle source on SceneView init
- Removed unnecessary Scenes Entitys functions = Use .scene.
- New GestureListener an OnTouchEvent parameters.
- Update AR Camera Pose and projection even on not tracking state
- Fixed Geometries updates with Engine parameter instead of possibly leaking val
- The second call of destroy() was removed to prevent crash (#438)