Skip to content

Releases: SceneView/sceneview-android

SceneView 3.0.0 — Compose-native rewrite

15 Mar 22:07

Choose a tag to compare

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 (.kt files).
  • 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.isEditableSideEffect was resetting isEditable to the parameter default
    (false) on every recomposition, silently disabling gestures when isEditable = true was set
    only inside apply { }. Pass isEditable = true as a named parameter to maintain it correctly.
  • ARCore install dialog — Removed canBeInstalled() pre-check that threw
    UnavailableDeviceNotCompatibleException before requestInstall() was called, preventing the
    ARCore install prompt from ever appearing on fresh devices.
  • Camera background blackARCameraStream used RenderableManager.Builder(4) with only
    1 geometry primitive defined (invalid in Filament). Fixed to Builder(1).
  • Camera stream recreated on every recompositionrememberARCameraStream used a default
    lambda parameter as a remember key; lambdas produce a new instance on every call, making the
    key unstable. Fixed by keying on materialLoader only.
  • Render loop stale camera stream — The render-loop coroutine captured cameraStream at
    launch; recomposition could recreate the stream while the loop kept updating the old (destroyed)
    one. Fixed with an AtomicReference updated via SideEffect.

New features

  • SceneScope / ARSceneScope — fully declarative, reactive 3D/AR content DSL
  • NodeScope — nested child nodes using Compose's natural trailing lambda pattern
  • SceneNodeManager — internal bridge that syncs Compose snapshot state with the Filament
    scene graph, enabling reactive updates without manual addChildNode/removeChildNode calls
  • SurfaceType — explicit surface-type selection (Surface vs TextureSurface)
  • ViewNode — Compose UI content rendered as a 3D plane surface in the scene
  • Engine.drainFramePipeline() — consolidated fence-drain extension for surface resize/destroy
  • rememberViewNodeManager() — lifecycle-safe window manager for ViewNode composables
  • Autopilot Demo — new sample demonstrating autonomous animation and scene composition
  • Camera Manipulator — new dedicated sample for orbit/pan/zoom camera control
  • Node.scaleGestureSensitivity — new Float property (default 0.5) that damps
    pinch-to-scale gestures. Applied as 1f + (rawFactor − 1f) × sensitivity in onScale,
    making scaling feel progressive without reducing the reachable scale range. Set it per-node in
    the apply block alongside editableScaleRange.
  • 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

13 Jan 10:13

Choose a tag to compare

v2.3.2

18 Jan 12:53

Choose a tag to compare

v2.3.1

18 Jan 13:37

Choose a tag to compare

v2.3.0

19 Apr 16:17

Choose a tag to compare

v2.2.1

12 Jun 13:06

Choose a tag to compare

  • Fix model viewer sample dependency
  • Cleanup and update dependencies
  • Handle ModelNode duplicate children names
  • Fixed possible null pointer on node move (#431) Thanks @hshapley
  • Change VideoMaterial structure

v2.2.0

29 May 17:07

Choose a tag to compare

  • Added ViewNode to ar-model-viewer sample (#461) Thanks @sameerjj
  • Added ability to set speed of animations (#464) Thanks @johnwhh
  • ShapeNode constructor from an Android Path
  • 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 lightNodes and cameraNodes parent (#484) Thanks @PMarchenko
  • Fix CameraNode destroy 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

29 Apr 16:59

Choose a tag to compare

  • Temporary bring back old ViewNode
  • Let developers define custom node name (#445)
  • Fixed ModelNode glTF nodes name conflict with custom nodes naming
  • Protect from double destroy calls on ARCore object (#451)
  • Refactored README.md

v2.1.0

27 Mar 01:03

Choose a tag to compare

  • 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)

v2.0.4

02 Mar 10:55

Choose a tag to compare

  • Removed the unused RECORD_AUDIO permission from arsceneview (#402)
  • Fixed redirecting the users to Google Play to install the Google Play services for AR on unsupported devices (#322)
  • Moved the ARCore.destroy call to a background thread to avoid ANRs (#408)