PackageTrack
Sign in Get early access

flutter_scene

A flexible realtime 3D engine for Flutter games and apps, with glTF models, physics, skeletal animation, and PBR lighting.

0.22.2 15K downloads/mo #2478 most downloaded on pub.dev bdero/flutter_scene

What this package is like to depend on

Last release 5 days ago

19 Aug 2026

Ships unpredictably

gaps range from 9 days to 13 months

Nearly every release is documented

notes for 20 of 20 stable releases

3 versions withdrawn

withdrawn after publishing

4 years old

35 releases · first in 2023

20 releases in the last 12 months

see the full history below

Release timeline

35 releases · Jan 2023 to Aug 2026
2024 2025 2026
Release Pre-release Withdrawn

Releases

latest 35
  1. 0.22.2 19 Aug 2026
    Release notes
    • Four new agent skills alongside flutter_scene-idioms: flutter_scene-verification-loop (the run-settle-capture-correct visual loop and the blind-pairwise judgment rule), flutter_scene-looks (copy-paste EnvironmentSettings presets for a deliberate look), flutter_scene-procedural (terrain, noise, and instancing from code), and flutter_scene-performance (frame-budget measurement and a fixed remediation order). dart run flutter_scene:init and dart run flutter_scene:skills now install every bundled skill.
    Open source →
    Release notes
    • Four new agent skills alongside flutter_scene-idioms: flutter_scene-verification-loop (the run-settle-capture-correct visual loop and the blind-pairwise judgment rule), flutter_scene-looks (copy-paste EnvironmentSettings presets for a deliberate look), flutter_scene-procedural (terrain, noise, and instancing from code), and flutter_scene-performance (frame-budget measurement and a fixed remediation order). dart run flutter_scene:init and dart run flutter_scene:skills now install every bundled skill.
    Open source →
  2. 0.22.1 19 Aug 2026
    Release notes
    • Fixes the Settings dialog hanging the editor; all editor dialogs now open inside the main window (#344).
    • Builds against Flutter 3.47.1 and pairs with flutter_scene 0.22.2.
    Open source →
    Release notes
    • Camera controllers OrbitCameraController, FlyCameraController, and FollowCameraController drive a camera node from drag, scroll, and keyboard input with frame-rate-independent smoothing and clamped pitch. The CameraControls widget wires Flutter input to a controller; controllers also expose intent methods (orbitBy, dollyBy, look, ...) for driving them from any source.
    • Node.lookAt, Node.lookAtFrom, and the static Node.lookAtTransform orient a node's forward axis (local +Z) at a world-space target, aiming cameras, lights, and imported models without hand-building a view matrix.
    • Ship the flutter_scene-idioms agent skill, correct-usage guidance for coding agents that corrects the wrong assumptions carried from other 3D engines. dart run flutter_scene:init offers to install it, asking first at a terminal and never installing unattended without --skills.
    • Add dart run flutter_scene:skills to install, update, or --check the agent skill on its own, without touching the build hook or pubspec.
    Open source →
    Release notes
    • Camera controllers OrbitCameraController, FlyCameraController, and FollowCameraController drive a camera node from drag, scroll, and keyboard input with frame-rate-independent smoothing and clamped pitch. The CameraControls widget wires Flutter input to a controller; controllers also expose intent methods (orbitBy, dollyBy, look, ...) for driving them from any source.
    • Node.lookAt, Node.lookAtFrom, and the static Node.lookAtTransform orient a node's forward axis (local +Z) at a world-space target, aiming cameras, lights, and imported models without hand-building a view matrix.
    • Ship the flutter_scene-idioms agent skill, correct-usage guidance for coding agents that corrects the wrong assumptions carried from other 3D engines. dart run flutter_scene:init offers to install it, asking first at a terminal and never installing unattended without --skills.
    • Add dart run flutter_scene:skills to install, update, or --check the agent skill on its own, without touching the build hook or pubspec.
    Open source →
  3. 0.22.0 19 Aug 2026
    Release notes
    • Node.position, Node.rotation, and Node.scale read and write the local transform one component at a time, and editing a returned copy in place throws in debug builds rather than silently doing nothing.
    • Node.mutateLocalTransform edits the local matrix in place through a callback and marks the node dirty, the correct way to reach for the raw matrix.
    • A frame that draws nothing now prints once in debug builds naming the likely cause (not ready, empty region, no views composite to screen, no visible meshes, or a layer mask matching nothing).
    • Degenerate cameras now assert in debug builds, catching a view direction of zero length, an up parallel to it, and a field of view passed in degrees.
    • The web backend now throws on a bind to a shader uniform or texture name that does not exist, matching native, instead of silently sampling whatever was bound last.
    • SkinnedGeometry.uploadVertexData and setCustomAttribute now throw on a buffer whose length does not match the vertex count, instead of rendering garbage.
    • A Mesh whose primitive geometry is replaced now recomputes its bounds on its own, rather than over-culling until markLocalBoundsDirty is called.
    • An AnimationClip that binds zero of its channels now asserts in debug builds, naming the wanted nodes, since it otherwise plays while nothing moves.
    • Fixed the second and every later flutter run rendering nothing, from two hook invocations writing the same shader bundle filenames with different backend trims.
    • Fixed Scene.initializeStaticResources() reporting ready when the shader bundle loaded but held nothing this engine can read.
    • Fixed dart run flutter_scene:init then flutter run failing on a new app with "Flutter failed to list directory".
    • Fixed Node.clone() sharing the original's transform matrix.
    • Fixed the skinning joints texture being too narrow for small joint counts, which duplicated matrix columns.
    • Fixed ParticleSystem.reset() not restarting its random stream.
    • Mutating Node.localTransform in place without markTransformDirty() now throws in debug builds instead of silently doing nothing.
    • SceneViewsBuilder is now exported.
    • Documentation fixes for names that no longer exist (Environment, loadModel, the master channel requirement), plus a readme scene that needs no asset files and a list of the built-in geometry.
    Open source →
    Release notes

    The first release of the Flutter Scene Editor, a desktop app for authoring, inspecting, and iterating on scenes. It bundles everything it needs, including the offline shader toolchain, so there is nothing to install alongside it.

    In this build

    • A 3D viewport with transform gizmos, a scene-tree outliner, and a property inspector.
    • Live .fmat material editing that recompiles and hot-swaps as you edit.
    • @SceneComponent types from your project's source appear in the inspector automatically.
    • A render graph inspector for stepping through a frame's passes.
    • An MCP server for driving the editor from a coding agent.

    Requirements

    • macOS on Apple Silicon.
    • Running your project from the editor uses your own Flutter 3.47 (stable) or newer SDK.
    • Pairs with flutter_scene 0.22.0. The editor version tracks the package version it edits projects for.

    Install

    • Download flutter_scene_editor-0.22.0-macos-arm64.dmg, open it, and drag the app to Applications.
    • The build is signed and notarized, so it opens without a Gatekeeper warning.
    Open source →
    Release notes
    • Node.position, Node.rotation, and Node.scale read and write the local transform one component at a time, and editing a returned copy in place throws in debug builds rather than silently doing nothing.
    • Node.mutateLocalTransform edits the local matrix in place through a callback and marks the node dirty, the correct way to reach for the raw matrix.
    • A frame that draws nothing now prints once in debug builds naming the likely cause (not ready, empty region, no views composite to screen, no visible meshes, or a layer mask matching nothing).
    • Degenerate cameras now assert in debug builds, catching a view direction of zero length, an up parallel to it, and a field of view passed in degrees.
    • The web backend now throws on a bind to a shader uniform or texture name that does not exist, matching native, instead of silently sampling whatever was bound last.
    • SkinnedGeometry.uploadVertexData and setCustomAttribute now throw on a buffer whose length does not match the vertex count, instead of rendering garbage.
    • A Mesh whose primitive geometry is replaced now recomputes its bounds on its own, rather than over-culling until markLocalBoundsDirty is called.
    • An AnimationClip that binds zero of its channels now asserts in debug builds, naming the wanted nodes, since it otherwise plays while nothing moves.
    • Fixed the second and every later flutter run rendering nothing, from two hook invocations writing the same shader bundle filenames with different backend trims.
    • Fixed Scene.initializeStaticResources() reporting ready when the shader bundle loaded but held nothing this engine can read.
    • Fixed dart run flutter_scene:init then flutter run failing on a new app with "Flutter failed to list directory".
    • Fixed Node.clone() sharing the original's transform matrix.
    • Fixed the skinning joints texture being too narrow for small joint counts, which duplicated matrix columns.
    • Fixed ParticleSystem.reset() not restarting its random stream.
    • Mutating Node.localTransform in place without markTransformDirty() now throws in debug builds instead of silently doing nothing.
    • SceneViewsBuilder is now exported.
    • Documentation fixes for names that no longer exist (Environment, loadModel, the master channel requirement), plus a readme scene that needs no asset files and a list of the built-in geometry.
    Open source →
  4. 0.21.1 18 Aug 2026
    Release notes
    • Documentation only. The readme spells out how to turn Flutter GPU on for each platform, shows the build hook and the pubspec entry dart run flutter_scene:init writes, recommends converting assets ahead of time over importing glTF at runtime, and links the guides at fscene.dev.
    Open source →
    Release notes
    • Documentation only. The readme spells out how to turn Flutter GPU on for each platform, shows the build hook and the pubspec entry dart run flutter_scene:init writes, recommends converting assets ahead of time over importing glTF at runtime, and links the guides at fscene.dev.
    Open source →
  5. 0.21.0 17 Aug 2026
    Release notes
    • Requires Flutter 3.47.0 or newer. That is the first stable carrying the Flutter GPU support this package needs, so the constraint is a real minimum rather than the loose value earlier releases carried. A master build numbered 3.47.0-1.0.pre.N sorts below it and will not resolve.

    • Assets are generated into flutter_scene_generated/ at the app root and loaded by source path, the same way on every Flutter channel. dart run flutter_scene:init installs the hook, creates the directory with a .gitignore for its outputs, and adds the one pubspec assets entry it needs.

    • flutter pub add flutter_scene is the whole setup. flutter_scene's own build hook compiles the engine's shaders for the app being built, on every channel, so an app with no hook of its own renders a runtime-imported .glb everywhere including web.

    • Compiled shader bundles record the engine that built them and are rebuilt when it changes, so switching Flutter versions cannot leave a bundle the new engine refuses to read.

    • buildEngineAssets is an optional build-hook call that puts the engine's shaders in the app's own generated tree instead of flutter_scene's.

    • Breaking change, legacyOnly and dataAssetsIfAvailable are removed in favor of generatedTree, now the default in SceneAssetMode, TextureAssetMode, MaterialAssetMode, and TargetShaderBundleAssetMode. A hook still passing a removed mode fails the build naming its replacement, since outputs moved out of build/ into the generated tree and an app loading by explicit asset key reads its new keys from the tree's manifest.json. Re-run dart run flutter_scene:init to migrate a hook and add the pubspec entry. The Dart data assets modes remain as explicit opt-ins and prune the tree entries they replace.

    • A build with no generated assets now fails with the exact pubspec lines to add instead of producing an app that dies at its first load.

    • Fixed a .fmat reference written against the package root binding to a path beside its scene document, which left the material unresolved at load and the geometry on an opaque fallback. A reference only rebases onto the document when a file is actually there, matching how the source-root loader reads the same scene.

    • resolveShaderBundleKey resolves a shader bundle built by buildTargetShaderBundleJson (or flutter_gpu_shaders) by name, for loadShaderLibraryAsync.

    • Build stamps fingerprint a source over a megabyte by size and modification time instead of reading it, cutting about 5 seconds per gigabyte off every build. Set flutter_scene_strict_hashing: true under hooks: user_defines: in the app pubspec to content-hash everything.

    • Switching asset modes needs a clean build. Nothing prunes assets from a previous mode out of an app bundle.

    • Breaking change, buildScenes and buildTextures no longer take outputDirectory. Outputs go to the app's generated tree, so a hook passing it fails to compile; drop the argument.

    • Breaking change, FmatMaterialBundleIndex.fromJson requires assetKey. The bundle and its sidecar resolve from the index's own key, so a direct caller passes the key it parsed.

    • Node.extractMeshData flattens a subtree's geometry into one MeshData with the descendant transforms baked in, and MeshData.toTriMeshShape/toConvexHullShape turn that into a collider, so an imported model no longer needs a hand-written walk to collide.

    • MeshData.transformed places a snapshot by a matrix, carrying normals by the inverse transpose and, through a mirror, flipping both tangent handedness and triangle winding.

    • The lit shaders declare one prefiltered-radiance sampler instead of one per layout, freeing two fragment texture units so a skinned shadow-casting draw fits GLES drivers reporting the 16-unit minimum.

    • Breaking change for raw ShaderMaterial shaders that sample the environment, they declare prefiltered_radiance as RadianceSampler and supply a radianceCubeFragmentShader variant built with FLUTTER_SCENE_RADIANCE_CUBE. .fmat materials are unaffected.

    • A material or sky that samples the environment without a cubemap-radiance variant now keeps its 2D sampler and is bound a placeholder instead of a mismatched cubemap, and says so in debug builds. PreprocessedMaterial takes radianceCubeFragmentShader for code that builds one directly rather than through a loader.

    • Breaking change, EnvironmentMap.prefilteredRadianceTexture and EnvironmentMap.prefilteredRadianceCube are gone. The single prefiltered-radiance sampler replaces the layout pair, so code reading either field reads the one texture the map now carries.

    • RenderItem.windingFlipped derives from its geometry instead of being assignable, so a mirrored transform reverses winding without callers tracking it.

    • Breaking change, the fscene component codec API is declarative. ComponentCodec.serialize is abstract, ComponentPropertyDef and ComponentPropertyKind moved to the scene schema model (constraints replace min/max/read), and flat codecs extend DeclarativeComponentCodec, deriving schema, realization, and delta serialization from one ComponentField list.

    • .fscene version 3. Component properties delta-serialize (values equal to their schema default are omitted) and audio attenuation settings nest; version 2 documents read unchanged.

    • package:flutter_scene/annotations.dart, @SceneComponent and typed property annotations that lower to schema constraints for generated codecs.

    • Unknown component types realize as lossless ForeignComponent placeholders and round-trip untouched.

    • Physics components register in any mount order. A rigid body, collider, joint, or character controller added before its world (or its sibling dependency) registers when the dependency arrives instead of staying inert.

    • registerPhysicsBackend is public, so physics backend packages can register simulation factories the way audio backends do.

    • FsceneComponentRegistry.unregister removes a registered codec; documents carrying the type realize it as a lossless unknown-type placeholder.

    • nodeRefOf and resourceRefOf recover document references from live nodes and realized resources, so custom codecs (generated ones included) round-trip them.

    • Debug builds launched with FLUTTER_SCENE_SOURCE_ROOT read scene sources straight from the project, and ext.flutter_scene.reloadScene patches loaded scenes in place.

    • Component schemas carry declarative editor gizmos (ComponentSchema.gizmo, the GizmoSpec primitive model, the @SceneGizmo annotation), and the builtin lights, camera, colliders, audio, environment volumes, and particle emitters declare them.

    • Builtin component schemas declare richer editing constraints, the camera projection is a fixed-option enum, its field of view carries hard degree bounds, and shadow, area-light, and volume fields gained slider soft ranges.

    • Scene.captureRenderGraph records one frame's render graph (passes, CPU timings, data flow, snapshot copies of written targets) behind the Scene.debugAllowRenderGraphCapture opt-in, and RenderPassContext.debugBlackboardTexture exposes raw pipeline textures to debug overlays.

    • Screen-space contact shadows for the sun via DirectionalLight.contactShadows, grounding small contacts that shadow-map resolution and bias miss.

    • Screen-space indirect light via AmbientOcclusionSettings.indirectLight, crediting one bounce of scene radiance to newly visible sectors of the occlusion bitmask.

    • Rect area lights via RectAreaLight and RectAreaLightComponent, shaded with linearly transformed cosines so panel highlights stretch and fall off physically.

    • Film-look color grading via ColorGradingSettings.lut, loading Adobe .cube tables with ColorLut.fromCubeAsset and blending with lutBlend.

    • Environments persist the grading LUT (.cube reference and blend) in .fscene documents, and ColorLut.sourceAsset reports where a table was loaded from.

    • Percentage-closer soft shadows via DirectionalShadowFilter.pcss, sharpening shadows at contact and widening them with caster distance scaled by DirectionalLight.angularRadius.

    • Depth of field focuses on translucent depth-writing surfaces (fmat depth_write: true, transmissive PhysicallyBasedMaterial) instead of the backdrop seen through them.

    • Ground-truth ambient occlusion via AmbientOcclusionSettings.method, integrating horizon-slice visibility with sliceCount/stepsPerSlice controls and an optional constant-thickness visibilityBitmask mode.

    • AmbientOcclusionSettings.multiBounce keeps albedo-tinted bounce light in occluded creases instead of darkening them to gray.

    • AmbientOcclusionSettings.bentNormals steers indirect diffuse along the average unoccluded direction and enables SpecularAmbientOcclusionMode.bentCone.

    • Environment resources persist every ambient-occlusion control, including the new method, slice, thickness, bent-normal, and multi-bounce fields.

    • AmbientOcclusionSettings.intensity defaults to 1.0 and both methods are calibrated there; the obscurance estimator folds its former 2x, so halve any explicitly set obscurance intensity to keep its look.

    • Retuned enable-time defaults, bloom intensity 0.15, chromatic aberration 0.2, and auto-exposure clamps of -4 to +4 EV.

    • Breaking change, .fscene version 2 uses one native coordinate system and offline glTF import bakes source coordinates into it.

    • Removed Handedness, UpAxis, StageMetadata.unitsPerMeter, NodeSpec.excludeFromWindingParity, SkyEnvironmentSpec.castShadows, and the directional-light component schema's direction property.

    • Runtime glTF import keeps source buffers unchanged and resolves coordinate winding in the renderer.

    • Directional-light nodes aim along native local +Z and support explicit primary-light priority.

    • Fscene directional lights preserve the complete cascaded-shadow configuration.

    • Text scenes can reference a binary payload sidecar with payloadSource.

    • Fixed world-transform assignment under transformed parents corrupting the parent's cached transform.

    • Fixed in-memory glTF import dropping punctual lights and material variants.

    • GPU memory can be inspected and released. takeMemoryReport() reports what the engine's shared caches are pinning, releaseTexture/releaseScene give a claim back, and clearTextureCache/clearSceneTemplateCache drop everything.

    • ResourceGroup.track scopes a load to the group's lifetime, so dispose() releases the claims it took. Previously dispose() only released the progress notifier despite the name.

    • Fixed ResourceGroup throwing when it was disposed while a tracked load was still in flight, which is what tearing down a level mid-load does.

    • Fixed loadScene keeping a scene template claim when it threw after the template loaded, so a caller that got no Node no longer has to issue a compensating releaseScene.

    • PhysicallyBasedMaterial and glTF import support every ratified KHR_materials_* extension with scene-native property names.

    • Scene startup loads the shared physical-material shader bundle so every PhysicallyBasedMaterial property remains synchronous.

    • Shader build hooks keep only the target platform backends in generated bundles.

    • KHR_texture_transform applies independently to every built-in and advanced material texture.

    • Geometry and material textures support both UV0 and UV1, including textureInfo.texCoord in both glTF import paths.

    • ShaderMaterial owns the vertex stage too. Pass a vertexShader (per MeshVariant, so skinned and shadow passes can differ) and set uniforms and textures on either stage with ShaderStage, so a hand-written shader pair needs no subclassing.

    • Geometry can declare its own pipeline vertex layout with setVertexLayout, and VertexAttributeDescriptor/VertexBufferDescriptor/VertexLayoutDescriptor are public.

    • Custom vertex attributes work on skinned meshes.

    • A ShaderMaterial that supplies a vertex shader for some mesh kinds but not others warns in debug builds, naming the missing variant, instead of failing opaquely at pipeline creation.

    • Debug builds check a custom material's uniform blocks against the shader's reflection, so a misspelled or optimized-out block name and a buffer too small for its std140 layout raise named exceptions instead of failing at bind time or reading past the end.

    • Debug builds check a caller-declared vertex layout against the buffers actually bound, so a slot count mismatch raises instead of feeding the pipeline undefined vertex data.

    • IndexType, VertexFormat, and VertexStepMode are exported, so 32-bit indices and caller-declared layouts no longer need lib/src imports.

    • Made first-party shader/material hooks and examples DataAssets-only, with migration guidance for legacy assets.

    • buildMaterials registers generated outputs as DataAssets when available by default.

    • Added Node.castsShadows for excluding individual meshes from shadow passes.

    • Added GeometryBufferArena and GeometryBuilder.build({bufferArena, retainCpuData}) for lower-overhead immutable mesh batches.

    • Added per-instance colors through InstancedMesh.addInstance(color:) and setInstanceColor.

    • Breaking change, instanced vertex layouts now require instance_color and use an 80-byte instance stride instead of 64 bytes.

    • Added InstancedMesh.updateInstanceTransforms for allocation-light bulk motion and InstancedMesh.cullInstances for opt-in per-instance culling.

    • Added InstancedMesh.sortTransparentInstances to skip unnecessary particle sorting.

    • Added RenderView.cullingPlanes for application-defined frustum planes and Scene.warmUp(includeOffscreen:) for full-scene preparation.

    • Added SunLight.cacheStaticShadows and DirectionalLight.cacheStaticShadows for continuously changing shadow lights.

    • Added SunLight.shadowFilter and DirectionalShadowFilter.fixedPcf for stable lower-ALU shadow filtering.

    • Tightened stable cascade fitting to increase effective shadow resolution.

    • Reduced shadow-map color bandwidth with single-channel fp32 tiles.

    • Fixed cascade-edge striping from normal-biased receiver positions.

    • Switched material and resolve color conversion to exact sRGB transfer functions.

    • Cached instanced bounds and render data to keep moving-camera culling allocation-light.

    • Skipped per-instance bounds packing when instance culling is disabled.

    • Skipped per-instance culling when an entire batch is inside every active plane.

    • Reused large transient buffers across changing instance counts.

    • Translucent instanced meshes now sort as one batch, with instances ordered within it.

    • Translucent draws sort back to front by view-axis depth through their geometry bounds center.

    • Double-sided lit materials reverse geometric normals on back-facing fragments.

    • Fixed instanced meshes losing their lighting, shadow, and fog bindings on GLES, which drew them (and any mesh sharing their pipeline) black.

    • Fixed anisotropy strength being ignored by environment lighting and using an isotropic visibility term for analytic lights.

    • Fixed anisotropic materials exposing primitive triangles by importing and interpolating authored tangents.

    • Vertex payload layouts include UV1 and tangents under versioned names, growing unskinned payloads by 50% and skinned payloads by 30%; older .fscene layouts upgrade when loaded.

    • Fixed runtime glTF normal maps building color-filtered mips, which skewed minified normals and washed out reflective materials.

    • Fixed uncompressed .fsceneb textures uploading without mipmaps, so a cooked scene is mipmapped whether or not compressTextures is set.

    • Fixed cooked .fsceneb and .fstex textures sampling without anisotropic filtering, which blurred them at grazing angles.

    • Texture resources record what their pixels represent, so mip levels downsample by role (normal maps average as vectors, color in linear light).

    • buildScenes warns when a texture is not block aligned and falls back to uncompressed, instead of dropping the compressed form silently.

    • buildScenes and buildTextures take alignForCompression to resample a misaligned source up to the next multiple of 4 rather than failing or storing it uncompressed.

    • Cooked textures build their mip chain on a background isolate, so a large uncompressed scene no longer pays for it on the calling thread.

    • Devices measured to sample every texture at its base mip skip mip chains entirely, reclaiming the memory and transcode time they were spending on levels the sampler ignores, and say so once at startup.

    • Loose images cook to compressed, mipmapped .fstex through buildTextures, loaded by source path with loadTexture (shipped in 0.20.0, missing from its notes).

    • Fixed a RangeError when an updatable mesh rebuilds at a smaller vertex count.

    • Fixed ambient-occlusion banding and over-darkening with normalized sampling, robust normals, and depth-aware filtering.

    • Ambient occlusion gains power, detail, horizon, direct-light, depth-mip, and specular controls. Intensity now scales obscurance, defaults to 2.0, and its former contrast role is power.

    • Baked and screen-space ambient occlusion now combine with min instead of multiplication.

    • Added ToneMappingMode.agx with configurable Scene.agxWhite and Scene.agxContrast, persisted by environment resources.

    • Added Material.depthBias, a world-space camera offset for coplanar surface details.

    • Breaking change, custom Geometry.bind overrides must add the named parameter double depthBias = 0.0.

    • EnvironmentSettings preserves every ambient-occlusion control and can apply only its environment look with applyLookTo.

    • Added EnvironmentMap.constantDiffuse and declarative ConstantEnvironment ambient lighting.

    • Added declarative torus and icosphere geometry specs.

    • ParticleSystem.prewarm is now readable after construction.

    • Nested prefab material overrides and linked material/scene references now compose and round-trip.

    • Custom asset bundles can load fmat shaders from bytes and provide their own fmat material loader.

    • Cooked glTF scenes import photometric punctual lights for use with physical camera exposure.

    Open source →
  6. 0.20.0 27 Jul 2026
    Release notes
    • The .fscene document core (document model, stable ids, JSON/binary serialization, prefab composition, diffing) moved to the new pure-Dart scene package; flutter_scene re-exports it, so existing imports are unchanged.
    • Fixed the web backend dropping every uniform-block draw on drivers that pad uniform block sizes (Mesa on Linux).
    • New declarative scene API. SceneView.declarative, SceneNode, SceneMesh, and SceneModel describe scenes in build(), with bridges to and from the imperative API, which is unchanged.
    • Declarative animation control via SceneModel.animations (SceneAnimationSpec), plus cached model templates so equal sources load once and share GPU resources.
    • KHR_materials_variants support in both import paths via MaterialsVariantsComponent, declaratively via SceneModel.variant, with a new Configurator example.
    • Fixed animation blending collapsing rigs with mirrored bones.
    • Fixed slerp taking the long arc when interpolating between quaternions in opposite hemispheres.
    • Automatic exposure (eye adaptation) via Scene.autoExposure, metered entirely on the GPU.
    • Imported materials keep their source names via the new Material.name.
    • Fixed cloned skinned meshes all drawing with the last-updated skeleton.
    • Physics backends now implement the pure PhysicsSimulation contract from the scene package and no longer depend on Flutter, so the same simulations run under plain dart run.
    • One generic physics component layer for every backend. PhysicsWorld(RapierWorld()), plus concrete RigidBody, Collider, the joint components, and KinematicCharacterController; the backend-specific component classes are gone.
    • Backend-specific physics features stay first-class. RigidBody.handle, Collider.handles, and Joint.handle are public, so downcasting PhysicsWorld.simulation to a backend reaches capabilities beyond the shared contract, and the components subclass for typed backend components.
    • Physics is now an optional sub-barrel. Import package:flutter_scene/physics.dart (or package:scene/physics.dart for the pure contract); the core package:flutter_scene/scene.dart no longer carries physics types.
    • BasicSimulation (queries and triggers, pure Dart) replaces BasicPhysicsWorld/BasicCollider/BasicKinematicBody.
    • Colliders without a sibling RigidBody now attach as static geometry instead of throwing.
    • Spatial audio through an optional pluggable-backend contract. AudioEngine (implemented by flutter_scene_soloud and flutter_scene_fmod), with AudioListener, AudioSource/ClipAudioSource, AudioBus, and distance attenuation. Import package:flutter_scene/audio.dart; it is not in the core barrel.
    • CPU particle systems are now public. ParticleEmitterComponent (camera-facing billboards), MeshParticleEmitterComponent (instanced 3D debris), and TrailComponent (ribbon trails), all driven by a ParticleSystem built from emitter shapes, spawners, over-life distributions, and a module stack (acceleration, drag, size/color-over-life, rotation, flipbook, curl-noise turbulence), with new Particles and Explosion examples.
    • Sprites and billboard particles depth-test against opaque geometry again, so closer objects occlude them.
    Open source →
  7. 0.19.0 17 Jul 2026
    Release notes
    • Steady-state frame allocations cut sharply. Fullscreen passes reuse cached pipelines and per-draw uniform packs reuse scratch buffers.
    • Faster draw submission. Bindings clear only on pipeline change and the engine lighting set rebinds only when it actually changes.
    • Cheaper MeshGeometry.fromArrays for streamed meshes. Bulk attribute copies, no repack for typed index lists, and an optional caller-supplied bounds.
    • Depth of field with shaped bokeh via scene.depthOfField, driven by a thin-lens camera model with three quality tiers.
    • Cached shadow tiles for nodes marked shadowStatic, making static-world shadow rendering near free.
    • Alpha-masked materials are now alpha-tested in the shadow and depth passes, so cutouts cast and receive correctly.
    • Materials can declare per-frame scene inputs (scene_color, scene_depth) for refraction and depth-fade effects, and MaterialInputs gains specular.
    • Fixed .fmat skies with requires: [environment] sampling black on the roughness-mip layout, and ShaderSkySource.sampledEnvironment pins the sampled map.
    • The lit shader reads diffuse SH through one sampler, fixing skinned-mesh crashes on 16-unit GLES drivers (ANGLE on Windows).
    • Fixed white speckles in compressed textures on devices preferring BC formats.
    • Scene-graph conveniences. Node.meshNodes, Node.combinedWorldBounds, and PerspectiveCamera.framing.
    • 3D Gaussian splatting. Load .ply/.splat captures with GaussianSplats and draw them with SplatComponent, with a new example.
    • Scene content can be exposed to assistive technology via SemanticsComponent, including hosted widget-surface semantics.
    • WidgetComponent gains opt-in occlusionHiding.
    • Added Camera.worldToScreen.
    • A failed static-resource load no longer marks the engine ready to render; it retries instead of crashing mid-frame.
    • Point and spot lights. PointLightComponent and SpotLightComponent, unlimited BVH-culled lights, spot shadows, KHR_lights_punctual import, and a Lights example.
    • Geometry readback and derivation. Geometry.extractMeshData(), MeshData ops (unweld, extractEdges, merge), and LineSegmentsGeometry for thick lines.
    • Per-frame transient GPU data rides a completion-aware arena allocator, fixing whole-frame aborts past ~1MB of transients and collapsing per-draw buffer writes.
    • BREAKING: the custom-pass and material/geometry bind surfaces take a TransientWriter where they previously took a gpu.HostBuffer.
    • Large speedup for many-draw scenes on the web backend. No more per-draw buffer ghosting, vertex state cached in VAOs, redundant sampler calls skipped.
    • The web shim's HostBuffer is a faithful flutter_gpu port again.
    • On the web backend, an active but unbound uniform block reads zeros instead of rejecting the draw, fixing unlit .fmat materials rendering nothing.
    • Fixed ambient occlusion and reflections sampling the wrong depth for double-sided materials.
    • The .fmat compiler no longer lets declared but unread resources strip out of the generated shaders, which surfaced as build errors or draw-time crashes.
    • Built-in noise matched between CPU and GPU via package:flutter_scene/noise.dart and #include <noise.glsl> (the Dart side is native-only for now).
    • AmbientOcclusionSettings.depthMipChain (off by default) keeps occlusion accurate on grazing surfaces and large radii.
    • Distance fog via scene.fog, with falloff modes, a height term, light in-scatter, and sky-color blending.
    • Custom render passes via Scene.addRenderPass, powering the new Node.highlightColor selection outlines.
    • Custom passes can request scene buffers (depth, normals, shadowMap) through RenderInput.
    • Volumetric god rays via scene.godRays.
    • Load gating and warm-up. ResourceGroup, SceneView.loading/revealMinDuration, Scene.warmUp, and background-isolate GLB geometry packing.
    • Widget-texture captures stay on the GPU on texture-backed platforms, removing the per-capture CPU round trip.
    • .fmat materials gain a vertex stage (a Vertex() hook, varyings, custom attributes), applied consistently across the color, shadow, depth, and pick passes.
    • Built-in materials and geometries can now be constructed before Scene.initializeStaticResources() completes.
    • Added Scene.camera with CameraComponent auto-promotion, and a default camera so a bare SceneView(scene) always renders.
    • Camera-facing billboards and sprites via BillboardGeometry, SpriteMaterial, and Sprite.
    • Directional-shadow controls. shadowAmbientStrength, shadowCasterFaces, and cascades that extend toward the sun so long shadows stop dropping out.
    • Fixed the cascaded-shadow lookup misreading cascades on GLES and crashing the shader compiler on Windows.
    • BREAKING: vertex layouts are described by VertexLayoutDescriptor and unskinned geometry is structure of arrays (.fscene gains unskinned_soa; old files still load).
    • New procedural primitives. Cylinder, capsule, torus, disc, ring, and icosphere, each with a collisionShape physics bridge.
    • Geometry level of detail via LodComponent, with screen-size selection, hysteresis, and dithered cross-fade.
    • Image-based lighting prefilters into a mipped radiance cubemap, and EnvironmentMap.fromEquirectHdr keeps HDR intensity through the prefilter.
    • Spatial environment volumes with camera-driven blending via EnvironmentSettings, Scene.baseEnvironment, and EnvironmentVolume.
    • Sky-driven sun light via Scene.sunLight, aiming and coloring the directional light from the sky.
    • BREAKING: .fscene stages reference an environment resource instead of inline stage fields, and prefab host-node additions are Attachments.
    • Added Texture2D (generated mips, trilinear and anisotropic filtering) with TextureContent/TextureSampling; imported models are now mipmapped.
    • BREAKING: material texture slots hold a TextureSource instead of a raw gpu.Texture.
    • Added TextureAtlas for uniform tile grids.
    • Added geometric specular antialiasing to PhysicallyBasedMaterial.
    • Fixed the split-sum specular lookup sampling with its roughness axis flipped.
    • Fixed image-based lighting taking the shadow-ambient gate and Fresnel term from the normal-mapped normal.
    • Fixed normalScale not being applied to the perturbed normal.
    • Screen-space reflections via Scene.screenSpaceReflections, with an example and live tuning panel.
    • Screen-space reflections fade out on rough surfaces.
    • The environment BRDF lookup is generated at load as RGBA16F, removing banding and the bundled PNG.
    Open source →
  8. 0.18.1 13 Jun 2026
    Release notes
    • No code changes. Reworded the package description and added the logo as a pub.dev screenshot.
    Open source →
  9. 0.18.0 13 Jun 2026
    Release notes
    • Offscreen render targets via RenderTexture, Scene.views, and the RenderTextureView widget.
    • The prefiltered-radiance environment stores roughness bands as mips of one texture (smoother transitions, ~25% less memory).
    • Fixed dim image-based specular lighting on the web backend by re-baking radiance after the first presented frame.
    • The base shader bundle loads asynchronously on every backend; await Scene.initializeStaticResources() before constructing geometry or materials.
    • The flutter SDK constraint is now >=3.44.0; the real requirement is a 2026-06-09 or later master build (see the README).
    • Render targets serialize in .fscene via a renderTexture resource kind and a top-level views array.
    • Material texture slots accept a RenderTexture for live render-to-texture sampling.
    • Added render scaling (Scene.renderScale) and composite filtering (Scene.filterQuality), with per-view overrides.
    • Added FXAA and an automatic anti-aliasing mode; auto is the new default, so backends without MSAA now get FXAA.
    • Adopted hardware instancing for InstancedMesh. Breaking for direct VertexLayout construction, which now takes a list of VertexBuffers.
    • BREAKING: package exports are explicit show lists; file an issue if a symbol you used disappeared.
    • Added scene raycasting via Scene.raycast/raycastAll, with layer masks and Node.raycastable.
    • Added WidgetComponent, a live interactive widget subtree on a scene surface.
    • Added automatic widget-surface input, with WidgetInput.manual opt-out and SceneView.debugWidgetInput.
    • Added ScenePointer for programmatic scene input.
    • Added WidgetTexture and Camera.screenPointToRay.
    • Added UnlitMaterial.alphaMode.
    • Added Surface.lastSwapchainColorTexture for one-frame feedback effects.
    • Fixed vertically flipped texturing on the cuboid and wedge primitives.
    Open source →
  10. 0.17.0 10 Jun 2026
    Release notes
    • Added SceneView, a widget that renders a Scene and drives its frame loop.
    • Added debug-mode hot reload for .fmat materials and re-exported .glb scenes, patched in place.
    • Added DataAssets-backed GLB import with auto-discovery, cached composed documents, and dart run flutter_scene:init wiring.
    • Added AnimationClip.rebind/AnimationPlayer.rebind and Mesh.clone.
    • Skinned geometry from buildScenes carries a pose-union bound for sound frustum culling.
    • BREAKING: removed the .model format; convert with buildScenes or load GLBs at runtime.
    • BREAKING: .fmat materials are discovered under assets/ and loaded by source path via loadFmatMaterial.
    • Building .fmat materials and models requires flutter_gpu_shaders 0.5.0.
    • Added the .fscene/.fsceneb serialized scene format with prefabs, hot reload, and deterministic composition.
    • Added scene serialization via serializeScene and realizeStage/serializeStage, round-tripping byte-stably.
    • Added opt-in KTX2 texture compression for imported scenes, transcoded at load off the main isolate.
    • BREAKING: fixed vertically inverted image-based lighting; loaded panoramas now light correctly.
    • Added a skybox via Scene.skybox and the built-in EnvironmentSkySource.
    • Added custom sky shaders via ShaderSkySource and .fmat sky blocks.
    • Added sky-driven lighting via EnvironmentMap.fromSky and Scene.skyEnvironment, with time-sliced re-bakes.
    • Added built-in procedural skies, GradientSkySource and PhysicalSkySource.
    • Diffuse SH coefficients are sampled from a texture, and fromGpuTextures accepts a GPU-computed diffuseShTexture.
    • A .fmat compile failure during hot reload keeps the last good shaders and reports the error.
    • Build-hook conversions are cached by input content; set FLUTTER_SCENE_DISABLE_BUILD_CACHE to always reconvert.
    • Fixed progressive slowdown on the web backend from leaked framebuffers and per-frame program re-links.
    Open source →
  11. 0.16.0 06 Jun 2026
    Release notes
    • Added an abstract physics contract (bodies, colliders, joints, queries, events) with a built-in kinematic world; a full backend ships in flutter_scene_rapier.
    • Added WedgeGeometry, a triangular-prism ramp primitive.
    • Added optional screen-space ambient occlusion via Scene.ambientOcclusion, working on every backend.
    Open source →
  12. 0.15.0 26 May 2026
    Release notes
    • Added the .fmat custom-material format, compiled by buildMaterials and driven at runtime with typed parameters. See MATERIALS.md.
    • Added a post-processing suite via Scene.postProcess (bloom, color grading, vignette, chromatic aberration, film grain), each off by default.
    • Added PostEffect for custom post-processing shaders. See POST_PROCESSING.md.
    • The tone-mapping pass is now the resolve pass (exposure, grading, tone map, EOTF, bloom composite).
    • Fixed image-based lighting on the OpenGL ES backend.
    • Building .fmat custom materials requires flutter_gpu_shaders 0.4.4 or newer.
    Open source →
  13. 0.14.2 23 May 2026
    Release notes
    • Fixed mirrored geometry rendering inside-out; cull winding now follows the world-transform determinant.
    • Fixed material.doubleSided being ignored by the runtime glTF importer.
    Open source →
  14. 0.14.1 21 May 2026
    Release notes
    • Now WASM-compatible; build-hook helpers no longer pull dart:io onto the web graph.
    • Added a package example and a fuller description.
    • Bumped flat_buffers to ^25.9.23.
    • Internal lint and formatting cleanup.
    Open source →
  15. 0.14.0 21 May 2026
    Release notes

    Renderer overhaul, with several breaking changes.

    • Rendering is structured as a render graph (ShadowPass? -> ScenePass -> TonemapPass) with a transient-texture pool.
    • HDR pipeline. The scene renders to a float target and a tone-map pass writes the swapchain; custom shaders now output linear HDR premultiplied by alpha (see MATERIALS.md).
    • Tone mapping and exposure moved onto Scene (exposure, toneMapping, physicalCameraExposure).
    • Added DirectionalLight with PCF shadow mapping, assignable as Scene.directionalLight.
    • Image-based lighting rework. SH-9 diffuse, a GPU-prefiltered specular atlas, and the old brightness fudges removed.
    • BREAKING: Environment removed in favor of Scene.environment (an EnvironmentMap) and Scene.environmentIntensity.
    • BREAKING: EnvironmentMap always carries a prefiltered atlas plus SH-9; the procedural EnvironmentMap.studio() is the new default.
    • ShaderMaterial.useEnvironment now binds prefiltered_radiance and brdf_lut.
    • Web support. flutter_scene runs on Flutter web through a built-in WebGL2 backend, under both CanvasKit and Skwasm.
    • BREAKING: flutter_scene_importer folded into flutter_scene (package:flutter_scene/build_hooks.dart), with a curated gpu.dart for custom shaders.
    Open source →
  16. 0.13.0 12 May 2026
    Release notes
    • Added ShaderMaterial, custom fragment shaders with uniform and texture binding by name and render-state knobs.
    • Added MATERIALS.md, the custom-shader contract guide.
    • The example app gains a toon-shader demo.
    Open source →
  17. 0.12.0 10 May 2026
    Release notes
    • Added bounding-volume and frustum culling, with offline pose-union bounds for skinned content.
    • New bounds API on Geometry, Mesh, and Node, plus Camera.getFrustum.
    Open source →
  18. 0.11.1 09 May 2026
    Release notes
    • Fixed the Node.globalTransform setter scaling by the parent's determinant instead of composing with its inverse.
    Open source →
  19. 0.11.0 09 May 2026
    Release notes
    • Added a runtime GLB importer, Node.fromGlbBytes and Node.fromGlbAsset. (#12)
    • Bumped flutter_scene_importer to ^0.11.0 (pure Dart, no CMake).
    Open source →
  20. 0.10.0 09 May 2026
    Release notes
    • Migrated from the discontinued native_assets_cli to hooks 1.0; build hooks now import package:hooks/hooks.dart. (#82)
    • Dropped the obsolete --enable-experiment=native-assets flag that broke builds on Dart 3.10+. (#82)
    • Reorganized the repository as a pub workspace. (#36)
    • Updated flutter_gpu_shaders to ^0.4.0.
    Open source →
  21. 0.9.2-0 13 Apr 2025 pre-release
    Release notes
    • Fix globalTransform calculation.
    Open source →
  22. 0.9.1-0 13 Apr 2025 pre-release
    Release notes
    • Fix invalid usage of textureLod on desktop platforms.
    Open source →
  23. 0.9.0-0 13 Apr 2025 pre-release
    Release notes
    • Update to native_assets_cli 0.13.0.
    • Update to flutter_gpu_shaders 0.3.0.
    Open source →
  24. 0.8.0-0 04 Feb 2025 pre-release
    Release notes
    • Update to Flutter 3.29.0-1.0.pre.242.
    Open source →
  25. 0.7.0-0 07 Nov 2024 pre-release
    Release notes
    • Update to native_assets_cli 0.9.0.
    • Update to flutter_gpu_shaders 0.2.0.
    Open source →
  26. 0.6.0-0 06 Nov 2024 pre-release
    Release notes
    • Fix memory leak in transients buffer.
    • Optional MSAA support on iOS and Android (enabled by default).
    • Cull backfaces by default.
    • Fix animation blending bugs.
    • Pin native_assets_cli to <0.9.0.
    • Add car model and animation blending examples.
    • Fancy readme and FAQ.
    Open source →
  27. 0.5.0-0 08 Oct 2024 pre-release
    Release notes
    • Support non-embedded/URI-only image embeds.
    Open source →
  28. 0.4.0-0 04 Sep 2024 pre-release
    Release notes
    • Support node cloning for skins.
    • Fix default/animation-less pose.
    Open source →
  29. 0.3.0-0 03 Sep 2024 pre-release
    Release notes
    • Add animation playback (Animation, AnimationPlayer, AnimationClip).
    • Import animations from scene models.
    • Add support for cloning nodes.
    Open source →
  30. 0.2.1-1 08 Aug 2024 pre-release
    Release notes
    • Bump flutter_scene_importer version.
    Open source →
  31. 0.2.1-0 08 Aug 2024 pre-release
    Release notes
    • Switch to pre-release versioning.
    • Bump version of flutter_scene_importer.
    Open source →
  32. 0.2.0 06 Aug 2024 withdrawn
    Release notes
    • PredictedTransformComponent with PredictedController, client-side prediction of an owned entity with authoritative input-replay reconciliation, so local input renders instantly while the sim stays server-authoritative. Selected per entity through SceneReplication's localPrediction seam.
    • PredictedPhysicsComponent with PredictedPhysicsController, rollback prediction for an owned physics body. Mispredictions restore a retained world snapshot, adopt the authoritative pose, and replay pending inputs through the simulation. Needs a snapshot-capable backend (rapier).
    • PredictedPhysicsController.onWorldRestored fires after a rollback restore. A restore rewinds to the body set its snapshot captured, so a controller managing bodies dynamically (remote-player proxies) allocates a fixed pool before the first snapshot rather than recreating them.
    • NetworkTransformComponent re-anchors its interpolation buffer after an idle gap, so a resuming remote eases in instead of snapping.
    • The interpolation delay adapts to measured arrival cadence and jitter, easing between minDelay and the configured ceiling, so clean links render remotes barely behind while jittery ones buffer deep.
    • SceneReplication.inputTargetDepth passes the input buffer depth through to the client (1 suits local or stable links).
    • SceneReplication.minInterpolationDelay and SceneReplication.adaptiveInterpolation reach the interpolation buffer, so an app can floor the adaptive delay or hold it fixed.
    • Both predicted components reconcile at the tick the authoritative pose was snapshotted at, not the input ack's, so a deferred snapshot no longer discards the travel in between. They wait for a snapshot to date the pose before reconciling at all.
    • Both predicted components take maxCatchUpTicks and snap to authority past it, so a backgrounded tab or a long hitch does not replay every missed tick in one frame.
    • Requires dashwire_replication 0.2.1 for the input-command and prediction substrate.
    Open source →
    Release notes
    • BREAKING: the backend now implements the PhysicsSimulation contract from package:scene; the runtime dependency moved from flutter_scene to scene.
    • BREAKING: removed the Box3dRigidBody, Box3dCollider, and Box3dJoint types; construct only Box3dPhysicsWorld and attach flutter_scene's generic RigidBody, Collider, and joint components.
    • BREAKING: wrap the world in flutter_scene's PhysicsWorld now, PhysicsWorld(Box3dPhysicsWorld(...)), instead of adding the concrete components directly.
    • Require box3d ^0.1.1 for the Android native load fix.
    Open source →
    Release notes
    • Skinned mesh import.
    • Fix readme for pub.dev.
    Open source →
  33. 0.1.1 05 Aug 2024 withdrawn
    Release notes
    • Add registerSoloudAudioBackend(), so documents naming soloud as their audio engine realize a SoloudAudioEngine.
    • Require flutter_scene ^0.22.0.
    Open source →
    Release notes
    • Add registerFmodAudioBackend(), so documents naming fmod as their audio engine realize an FmodAudioEngine.
    • Ship a flutter_scene_components.json manifest for the fmodEvent component, kept in sync by a test.
    • Fix codec round-trip losses and registry lifecycle holes in FmodEventCodec.
    • Require flutter_scene ^0.22.0.
    Open source →
    Release notes
    • Rename PhysicallyBasedMaterial and UnlitMaterial.
    • Fix environment lighting problems in PhysicallyBasedMaterial.
    • Add default environment map.
    Open source →
  34. 0.1.0 03 Aug 2024 withdrawn
    Release notes
    • Rewrite for Flutter GPU.
    • Physically based rendering.
    • More conventional interface for scene construction.
    Open source →
  35. 0.0.1-dev.1 30 Jan 2023 pre-release
    Release notes
    • Initial render box.
    Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive