Migrating from 0.8 to 1.0
1.0 is the release the engine promises to keep: from it on, a break comes
only in a major version. To get there, 0.8's API changed in 2095 places,
308 of them left to you; 380 are backend internals no application called.
The rest a program carries out for you, and three
tools share the work. All three read one table,
flutter3d_build/lib/migrations/0.8_to_1.0.yaml, so they agree about what
changed.
- Your dependencies on 1.0.0-rc.1, your imports where the names now live
- Renames, moved names and deprecated calls rewritten by tools
- A short list of what needs a decision from you, each with a TODO in the code
Run the migration #
Commit or stash first: the migration edits your files in place, and a clean
git diff is the easiest way to read what it did.
dart pub global activate flutter3d_build 1.0.0-rc.1
dart pub global activate flutter3d_lints 1.0.0-rc.1
dart pub global run flutter3d_build:migrate --dry-run . # see what it would do
dart pub global run flutter3d_build:migrate .
Activate the tools globally rather than adding them to your project. Your pubspec still asks for 0.8, and a 1.0 tool cannot resolve beside it until the migration has moved the constraints.
migrate works through the project in this order:
- Dependencies. Every dependency on a flutter3d package moves to
^1.0.0-rc.1, or to the package's own number for the few that are versioned apart (pad_input,flutter3d_pointer_lock). A renamed package is renamed in the pubspec (pointer_lockisflutter3d_pointer_lock). Path and git dependencies are left alone and listed. - Imports of libraries that moved to another package are rewritten.
flutter pub get(ordart pub getfor a plain Dart package).dart fix --apply. Each flutter3d package ships alib/fix_data.yamlgenerated from the table. It renames what was renamed and imports moved names from where they live now. These are the same fixes your editor offers one at a time.- Rewrites that need the resolved code, which
dart fixcannot express: the deprecated capability getters (device.supportsWireframebecomesdevice.features.has(DeviceFeature.wireframe)), andimplements Xfor the types 1.0 madebase mixin classes. This step isdart pub global run flutter3d_lints:migrate, andmigrateruns it for you. - Dependencies again, for the packages the new imports need, such as
flutter3d_corewhen a name left theflutter3dfacade. - The report. It lists the files changed and what is left for you.
Every item on the list also has a
// TODO(flutter3d-1.0):above it in the code, with a link to its line below.
migrate reads the release your project is on from its pubspec.lock and
applies every migration table after it, so a project on 0.8 goes through
0.8_to_1.0.yaml and, once there is a later candidate, the tables after it
in the same run. --from <version> says the release when there is no lock.
--dry-run makes the same changes in a copy next to your project, prints
the report and removes the copy.
Afterwards, run flutter analyze. What is left is either on the report or
is a change in behaviour the analyzer cannot see. The table below says which
entries change behaviour.
In the editor #
flutter3d_lints is also an analysis server plugin. Listed in
analysis_options.yaml, it reports each use of something 1.0 changed: a
flutter3d_migrate warning with a quick fix where the change can be
written, and flutter3d_migrate_by_hand with the guide's link where it
cannot.
plugins:
flutter3d_lints: ^1.0.0-rc.1
The plugin also turns on the fixed-step rules described in its README. A
plugin's quick fixes are applied one at a time; dart fix does not apply
them in bulk, which is why step 5 above exists.
GameLoop to EngineLoop #
GameLoop is gone in 1.0, and
EngineLoop takes its place: the fixed step runs as named systems in ordered
phases, and plugins add theirs to the same loop. The change is a shape
rather than a rename, so no tool makes it for you:
// 0.8
final loop = GameLoop(input: input, onStep: (dt) => world.step(dt));
// every frame:
loop.advance(dt);
// 1.0
final loop = EngineLoop(input: input)
..addSystem('world', LoopPhase.physics, (ctx) => world.step(ctx.dt));
// every frame:
loop.frame(dt);
paused, alpha, playback, recorders, drainLook and longestFrame
keep their names. EngineLoop adds timing: (a WorldTiming, the step
rate and time scale) and catchUp: (what to do when a frame falls behind).
Their defaults are what GameLoop did. In a Flame game, HasFixedStep runs
an EngineLoop already: read engineLoop, and register your step work in
installStepSystems.
Data files #
Your levels, effects, data plugins and recordings do not need a migration to keep working: 1.0 reads every version of each format, lifting an old file through its format's chain each time it opens it. What stays behind is the file on disk. A tool that does not carry the chain, a diff, or an older checkout of the editor still sees the 0.8 shape.
dart pub global run flutter3d_build:migrate --data --dry-run . # list them
dart pub global run flutter3d_build:migrate --data --backup .
--data walks the project by the suffixes of every format below. Each
JSON file below its format's version is written again in the shape 1.0
writes, with the format envelope (format, version, requires,
generator) first. Every key it had is kept, including the ones 1.0 does
not know. The report has a line per file, assets/levels/first.level.json: f3d.level v1 → v4, and a list of what it did not carry over. That covers a
version newer than the tool, a document of another format under the suffix,
and the formats it leaves as they are. --backup keeps each file as it was
next to it, as <file>.v<N>.bak. flutter3d doctor, run in a project,
lists the files that are behind.
A level is lifted by the level reader itself, because a level from before version 3 addressed a prefab override by name, and only the reader that has read the prefabs can turn that into an id path. The level's digest is computed from what the reader reads, so a run recorded against the old file still matches the new one.
Runs are left at their version on purpose. .f3drun is at version 5 in
1.0. A run with change stamps on its starting world (the step each
component was last set at, which query().changed<T>() replays from) is
written at 5. So is a run that carries externalInputs, state fed in from
outside the simulation at a given step, which may say sourceTime,
receivedTime, quality, tag and unit. Version 5 also reserves
probes, what probes read while the run was recorded, and parent, the run
a branch starts from. A build from before 5 plays neither of the first two
correctly, so it must refuse them. Every other run is still written at the
lowest version that describes it, and an older build keeps playing it.
Lifting a version-1 run to 5 would only make those builds refuse it, so
--data does not. Input tapes follow the same rule. A version-1 tape with
button pairs where the game now has an axis is upgraded by the game's
ActionSet.upgradeTape when it is replayed, since only the game knows its
axes.
The formats owned by a package that needs the Flutter SDK (settings,
action maps, saves, racing tracks and ghosts, strategy matches) cannot be
loaded by a command-line tool. --data names those files and leaves them;
the game reads every version of them as before.
Generated from the FormatSpecs migrate --data loads — 24 formats, and 10 it leaves to the package that reads them.
| Format | Files | Package | This build reads | migrate --data |
|---|---|---|---|---|
f3d.model |
.f3d |
flutter3d_core |
v1–v2 | read as it is: its version is in its own header |
f3d.fmat |
.fmat |
flutter3d_core |
v1 | nothing to lift |
f3d.materialLanguage |
.f3dmat |
flutter3d_core |
v1–v3 | read as it is: its version is in its own header |
f3d.splat |
.f3dsplat |
flutter3d_core |
v1 | read as it is: its version is in its own header |
f3d.frameCapture |
.capture.json |
flutter3d_core |
v1–v2 | lifted to v2 through its chain |
f3d.pipeline |
.pipeline.json |
flutter3d_core |
v1 | nothing to lift |
f3d.shaderBundle |
.f3dshaders |
flutter3d_hardware |
v1–v2 | read as it is: its version is in its own header |
f3d.trace |
.f3dtrace |
flutter3d_hardware |
v1–v2 | read as it is: its version is in its own header |
f3d.project |
.f3dproj |
flutter3d_model_core |
v1–v2 | read as it is: its version is in its own header |
f3d.level |
.level.json |
flutter3d_sim |
v1–v5 | lifted to v5 by its reader |
f3d.visibility |
.visibility.json |
flutter3d_sim |
v1 | nothing to lift |
f3d.lightmap |
.lightmap.bin |
flutter3d_sim |
v1 | read as it is: its version is in its own header |
f3d.run |
.f3drun |
flutter3d_sim |
v1–v5 | kept below v5, at the lowest version that holds it |
f3d.save |
.save.json |
flutter3d_sim |
v1 | nothing to lift |
f3d.share |
.share.json |
flutter3d_sim |
v1 | nothing to lift |
f3d.inputTape |
.tape.json |
flutter3d_sim |
v1–v2 | kept below v2, at the lowest version that holds it |
f3d.telemetry |
.upload.json |
flutter3d_sim |
v1 | nothing to lift |
f3d.effect |
.f3dfx |
flutter3d_particles |
v1–v2 | lifted to v2 through its chain |
f3d.plugin |
.f3dplugin |
flutter3d_plugin_runtime |
v1–v4 | lifted to v4 through its chain |
f3d.physicalMaterial |
.material.json |
flutter3d_matter |
v1–v2 | lifted to v2 through its chain |
f3d.voxelWorld |
.voxels.json |
flutter3d_voxel |
v1 | nothing to lift |
f3d.experiment |
.f3d.experiment |
flutter3d_education |
v1 | nothing to lift |
f3d.assets |
flutter3d_assets.yaml |
flutter3d_build |
v1 | nothing to lift |
f3d.convertReport |
.report.json |
flutter3d_build |
v1 | nothing to lift |
f3d.settings |
.settings.json |
flutter3d_game |
v1–v2 | left as it is below v2: its package needs Flutter, and the game lifts it on every read |
f3d.actions |
.actions.json |
flutter3d_game |
v1 | nothing to lift: v1 is its only version |
f3d.saveSlots |
— | flutter3d_game |
v1 | nothing to lift: v1 is its only version |
f3d.cloudSaves |
— | flutter3d_game |
v1 | nothing to lift: v1 is its only version |
f3d.telemetryConsent |
— | flutter3d_game |
v1 | nothing to lift: v1 is its only version |
f3d.track |
.track.json |
flutter3d_game_racing |
v1 | nothing to lift: v1 is its only version |
f3d.ghost |
.ghost.json |
flutter3d_game_racing |
v1–v2 | left as it is below v2: its package needs Flutter, and the game lifts it on every read |
f3d.ghostTape |
.best.json |
flutter3d_game_kit |
v1 | nothing to lift: v1 is its only version |
f3d.match |
.match.f3drun |
flutter3d_game_strategy |
v1–v2 | left as it is below v2: its package needs Flutter, and the game lifts it on every read |
f3d.conformance |
.conformance.json |
flutter3d_conformance |
v1 | nothing to lift: v1 is its only version |
Every change, by package #
Each entry links here from its diagnostic and its TODO. How each one is carried out:
dart fix: applied bymigrate(step 4) and offered in your editor.migrate: applied bymigrate(steps 2 and 5).- by hand: on the report, with a TODO in your code.
- nothing to do: the classifier counts it as a break, but no call you can write is affected. It is listed so you know it was checked.
Generated from flutter3d_build/lib/migrations/ — 2095 entries from 0.8.5 to 1.0.0-rc.1, 308 by hand: 425 migrate, 308 by hand, 329 nothing to do, 528 dart fix, 380 gone internal, 125 migrate, with a TODO.
flame_flutter3d #
ActorSystemComponent(by hand). Thestep:parameter (aFixedStep) is nowtiming:(aWorldTiming) andcatchUp:(aCatchUp), used only when the game does not step the component itself; the publicstepfield is gone.AtmosphereComponent(migrate).AtmosphereComponentis abaseclass: a class below it isbaseitself, andimplements AtmosphereComponentbecomesextends AtmosphereComponent.BillboardAtlas(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).BridgeSpace(migrate).BridgeSpaceis a base mixin class:implements BridgeSpacebecomeswith BridgeSpace, on abaseclass.Bridged3d(by hand). SeeDrawn3d:tintis a settableLinearColor.CameraSyncController.takeRest(dart fix).CameraSyncController.takeRestiscaptureRest. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.CellGridComponent(migrate).color: Vector3(x, y, z)ofCellGridComponentiscolor: LinearColor(x, y, z).CellGridComponent(color:)is a vertex colour, a linearLinearColor:Vector4(r, g, b, a)isLinearColor(r, g, b, a).CellGridComponent(migrate).CellGridComponentis abaseclass: a class below it isbaseitself, andimplements CellGridComponentbecomesextends CellGridComponent.CellGridComponent.CellGridComponent(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.CellGridComponent.centreOf(dart fix).CellGridComponent.centreOfiscenterOf. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.CellGridComponent.colour(dart fix).CellGridComponent.colouriscolor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.CharacterBodyComponent(migrate).CharacterBodyComponentis abaseclass: a class below it isbaseitself, andimplements CharacterBodyComponentbecomesextends CharacterBodyComponent.ChaseCamera(dart fix).ChaseCameraisFlameChaseCamera. The racing genre has aChaseCameraof its own, so the Flame bridge's isFlameChaseCamera, with the same constructor and members.ChaseCameraComponent(dart fix).ChaseCameraComponentisFlameChaseCameraComponent. Renamed withFlameChaseCamera, which it carries; the same constructor and members.ChunkStreamer(migrate).drop: xofChunkStreamerisdrop: (dropped) => (x)(dropped.index, dropped.chunk).dropis handed oneChunkDrop, the piece and its index, where it took the two as parameters:(index, chunk) => ...is(dropped) => ...readingdropped.indexanddropped.chunk.migratewraps the old function,(dropped) => (old)(dropped.index, dropped.chunk), which runs as it did.CollisionBridge.onCollision(migrate).CollisionBridge.onCollisiontakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.CollisionBridge.onCollisiontakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CollisionBridge.onCollisionEnd(migrate).CollisionBridge.onCollisionEndtakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.CollisionBridge.onCollisionEndtakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CollisionBridge.onCollisionStart(migrate).CollisionBridge.onCollisionStarttakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.CollisionBridge.onCollisionStarttakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Drawn3d(by hand).Drawn3d.tintis a settableLinearColorwhere it was aVector4changed in place, so aTintEffectassigns it. A class implementingDrawn3ddeclaresLinearColor tint = LinearColor.white;(a field, or a getter and a setter) in place ofVector4 get tint.FlameInputBridge(by hand).FlameInputBridgetakesactions:, anActionMap, where it tookbindings:: the map a native game'sDesktopInputreads. Wrap an old table asActionMap(actions: ActionSet.common, buttons: table).Flutter3dFlameWidget(migrate).clearColor: Vector3(x, y, z)ofFlutter3dFlameWidgetisclearColor: LinearColor.fromSrgb(x, y, z).Flutter3dFlameWidget(clearColor:)takes aLinearColor, encoded to sRGB for the view once a frame. TheVector4it took was sRGB, so the same picture isclearColor: LinearColor.fromSrgb(r, g, b).Flutter3dFlameWidget(migrate, with a TODO).Flutter3dFlameWidgetis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.GridMover(migrate).onArrive: xofGridMoverisonArrive: (arrival) => (x)(arrival.column, arrival.row).onArriveis handed oneGridArrival, the cell reached, where it took its column and row as parameters:(column, row) => ...is(arrival) => ...readingarrival.columnandarrival.row.migratewraps the old function,(arrival) => (old)(arrival.column, arrival.row), which runs as it did.passablekeeps its two parameters: it is a function of the cell, not an event.GridMover(migrate).GridMoveris abaseclass: a class below it isbaseitself, andimplements GridMoverbecomesextends GridMover.HasFixedStep(by hand). Only code that implementsHasFixedStephas anything to do: it now has to providecreateEngineLoop,engineLoop,installStepSystems. Code that calls aHasFixedStepneeds no change.HasFixedStep.fixedStep(by hand).fixedStepis gone: the mixin runs anEngineLoop. ReadengineLoop, overridecreateEngineLoopto give it your ownWorldTimingandCatchUp, and register step work ininstallStepSystems.HasFlutter3d(migrate).clearColor: Vector3(x, y, z)ofHasFlutter3disclearColor: LinearColor.fromSrgb(x, y, z).HasFlutter3d.clearColoris aLinearColor, linear, assigned whole, where it was aVector4of sRGB numbers changed in place. The numbers it held keep the sky:clearColor.setValues(0.55, 0.75, 0.95, 1)isclearColor = LinearColor.fromSrgb(0.55, 0.75, 0.95); a read of.zis.b, in linear light. AnAtmosphereComponentassigns the day's sky to it, as it wrote into it before.InstancedActorComponent(migrate).InstancedActorComponentis abaseclass: a class below it isbaseitself, andimplements InstancedActorComponentbecomesextends InstancedActorComponent.InstancedObject3dComponent(migrate).tint:,color:ofInstancedObject3dComponent:Vector3(x, y, z)isLinearColor(x, y, z).color(the constructor's and the field) andtintare linearLinearColors;tintis assigned whole.color: Vector4(r, g, b, a)iscolor: LinearColor(r, g, b, a), the same numbers.InstancedObject3dComponent(migrate).InstancedObject3dComponentis abaseclass: a class below it isbaseitself, andimplements InstancedObject3dComponentbecomesextends InstancedObject3dComponent.InstancedPoseComponent(migrate).InstancedPoseComponentis abaseclass: a class below it isbaseitself, andimplements InstancedPoseComponentbecomesextends InstancedPoseComponent.KinematicBodyComponent(migrate).KinematicBodyComponentis abaseclass: a class below it isbaseitself, andimplements KinematicBodyComponentbecomesextends KinematicBodyComponent.MeshFlipbookComponent(migrate).MeshFlipbookComponentis abaseclass: a class below it isbaseitself, andimplements MeshFlipbookComponentbecomesextends MeshFlipbookComponent.ModelAnimationComponent(migrate).ModelAnimationComponentis abaseclass: a class below it isbaseitself, andimplements ModelAnimationComponentbecomesextends ModelAnimationComponent.Move3dEffect(migrate).Move3dEffectis abaseclass: a class below it isbaseitself, andimplements Move3dEffectbecomesextends Move3dEffect.Node3dComponent(migrate).tint: Vector3(x, y, z)ofNode3dComponentistint: LinearColor(x, y, z).tintis a linearLinearColorassigned whole:component.tint.setValues(1, 0.3, 0.25, 1)iscomponent.tint = const LinearColor(1, 0.3, 0.25), andtint.x,.y,.z,.waretint.r,.g,.b,.a. The numbers are the same; the tint was linear already.Node3dComponent(migrate).Node3dComponentis abaseclass: a class below it isbaseitself, andimplements Node3dComponentbecomesextends Node3dComponent.Object3dComponent(migrate).tint: Vector3(x, y, z)ofObject3dComponentistint: LinearColor(x, y, z).tintis a linearLinearColorassigned whole; seerc-flame-Node3dComponent-tint.Object3dComponent(migrate).Object3dComponentis abaseclass: a class below it isbaseitself, andimplements Object3dComponentbecomesextends Object3dComponent.Particles3dComponent(migrate).Particles3dComponentis abaseclass: a class below it isbaseitself, andimplements Particles3dComponentbecomesextends Particles3dComponent.PhysicsStepComponent(by hand).dynamicsis typed as theRigidDynamicsinterface now, which the Dart solverDynamicsand the native one both implement. Declare what you read it into asRigidDynamics; a call that needs the Dart solver's own members casts withas Dynamics.PhysicsStepComponent(by hand). Thestep:parameter (aFixedStep) is nowtiming:(aWorldTiming) andcatchUp:(aCatchUp), used only when the game does not step the component itself; the publicstepfield is gone.PlaneAxis(migrate, with a TODO).PlaneAxisis a class: aswitchover it that names every value gains_ => throw UnimplementedError().PlaneAxisis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.ProjectedViewfinder(migrate).ProjectedViewfinderis abaseclass: a class below it isbaseitself, andimplements ProjectedViewfinderbecomesextends ProjectedViewfinder.RigidBodyComponent(migrate).RigidBodyComponentis abaseclass: a class below it isbaseitself, andimplements RigidBodyComponentbecomesextends RigidBodyComponent.RigidBodyComponent(by hand).removeFromis aRigidDynamics?now: pass any solver, and declare a variable you read it into asRigidDynamics?.Rotate3dEffect(migrate).Rotate3dEffectis abaseclass: a class below it isbaseitself, andimplements Rotate3dEffectbecomesextends Rotate3dEffect.Scale3dEffect(migrate).Scale3dEffectis abaseclass: a class below it isbaseitself, andimplements Scale3dEffectbecomesextends Scale3dEffect.SpriteBillboardComponent(migrate).SpriteBillboardComponentis abaseclass: a class below it isbaseitself, andimplements SpriteBillboardComponentbecomesextends SpriteBillboardComponent.StepClock(nothing to do). Anabstract mixin classwhere it was an interface: its members never had bodies, and a class thatimplements StepClockcompiles as it did. A component may mix it in instead (with StepClock).Tap3dCallbacks.hitAt3d(migrate).Tap3dCallbacks.hitAt3dtakes oneTap3dProbe: an override reads its old parameters from it (parameter 1 is.screen, parameter 2 is.projector), and a call builds one.Tap3dCallbacks.hitAt3dtakes oneTap3dProbewhere it took its parameters. A tap target is a hook a component overrides for a tighter shape; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Taps3dComponent(migrate).Taps3dComponentis abaseclass: a class below it isbaseitself, andimplements Taps3dComponentbecomesextends Taps3dComponent.TiledWorld3d(migrate).TiledWorld3dis abaseclass: a class below it isbaseitself, andimplements TiledWorld3dbecomesextends TiledWorld3d.TiledWorld3d(migrate).spawn: xofTiledWorld3disspawn: (spawn) => (x)(spawn.object, spawn.at).spawnis handed oneTiledSpawn, the object and its middle, where it took the two as parameters:(object, at) => ...is(spawn) => ...readingspawn.objectandspawn.at.migratewraps the old function,(spawn) => (old)(spawn.object, spawn.at), which runs as it did.TintEffect(migrate).TintEffectis abaseclass: a class below it isbaseitself, andimplements TintEffectbecomesextends TintEffect.TintEffect.TintEffect(migrate).color: Vector3(x, y, z)ofTintEffect.TintEffectiscolor: LinearColor(x, y, z).TintEffect(color, controller)takes a linearLinearColor:TintEffect(Vector4(1, 0, 0, 1), c)isTintEffect(const LinearColor(1, 0, 0), c).TrailComponent(migrate).color: Vector3(x, y, z)ofTrailComponentiscolor: LinearColor(x, y, z).TrailComponent(color:)andcolorare a linearLinearColor, white by default:Vector4(r, g, b, a)isLinearColor(r, g, b, a).TrailComponent(migrate).TrailComponentis abaseclass: a class below it isbaseitself, andimplements TrailComponentbecomesextends TrailComponent.TrailComponent.TrailComponent(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.TrailComponent.color(nothing to do).coloriscolourunder its American name, which the rename entry forTrailComponent.colourcarries; an implementer overrides it by the new name.TrailComponent.colour(dart fix).TrailComponent.colouriscolor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.TransparentFlameGame(migrate).TransparentFlameGameis abaseclass: a class below it isbaseitself, andimplements TransparentFlameGamebecomesextends TransparentFlameGame.ViewCamera(nothing to do).rig,stiffnessandvieware getters over the camera'sViewFramingandVirtualCamerarather than fields; reading them is unchanged, and nothing outside the class could assign them.WrapSpace(migrate).WrapSpaceis abaseclass: a class below it isbaseitself, andimplements WrapSpacebecomesextends WrapSpace.
flame_flutter3d_audio #
AudioSceneComponent(migrate).AudioSceneComponentis abaseclass: a class below it isbaseitself, andimplements AudioSceneComponentbecomesextends AudioSceneComponent.AudioSceneComponent.close(dart fix).AudioSceneComponent.closeisdispose.closeisdispose, the one teardown verb. It stops every sound and disposes the speakers, asclosedid, and anopenafter it does nothing: a game that wants its sound again adds a newAudioSceneComponent.OpenedSpeakers(by hand). TheOpenedSpeakersrecord is gone:AudioSceneComponent.openeris aFuture<Speakers> Function(). An opener that made the record(scene: scene, close: close)returnsSpeakers(backend: backend, scene: scene), and one that answered null for no device throwsAudioDeviceException.SoundEmitterComponent(migrate).SoundEmitterComponentis abaseclass: a class below it isbaseitself, andimplements SoundEmitterComponentbecomesextends SoundEmitterComponent.SoundEmitterComponent.SoundEmitterComponent(dart fix). A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.SoundEmitterComponent.playing(dart fix).SoundEmitterComponent.playingisisPlaying. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.
flame_multiplayer #
BatonStream(nothing to do). The constructor'sholding:was declared asthis._holding, a private named parameter, and is a plainbool holdingnow. A call already passedholding:, so no call changes; only the signature's spelling did.BatonStream.holding(dart fix).BatonStream.holdingisisHolding. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.BatonStream.take(dart fix).BatonStream.takeisclaim. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.LoopbackParty(nothing to do). Declared byflutter3d_netnow and re-exported here, asPeerWire.LoopbackWire(nothing to do). Declared byflutter3d_netnow and re-exported here, asPeerWire.PeerRoom(nothing to do). Declared byflutter3d_netnow and re-exported here, asPeerWire.PeerRoom.met(dart fix).PeerRoom.metishasMet. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.PeerWire(by hand).PeerWireis anabstract base class: an adapterextends PeerWireand keeps itssendandlisten.slot,state,listenFromandclosehave defaults; overridecloseandstatefor a connection that has them.PeerWire.PeerWire(nothing to do). The constructor is no longerconst: a wire holds its listeners. An adapter's own constructor was notconsteither, since a connection is not a constant.PeerWire.listen(by hand). A wire has several listeners now:listenandlistenFromare the base class's, add a listener and return theRegistrationthat takes it away. An adapter no longer overrides them; it callsdeliver(message)(a party's wiredeliver(message, from: slot)) with each message that arrives, and drops the field that held the one listener. A wire wrapping another overrideslistenFromto hand back the inner wire's registration.PeerWire.send(migrate).PeerWire.sendtakes onePeerSend: an override reads its old parameters from it (parameter 1 is.message,reliable:is.reliable), and a call builds one.PeerWire.sendtakes onePeerSendwhere it took its parameters. A peer wire is a transport a network library implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.RollbackPlay(by hand). UseRollbackSessionwithlocalSlot,inputDelay: 3andmaxRollbackFrames: 20(RollbackPlay's defaults);captureLocalFrameiscapture,applyAndStepreadsframes[0]/frames[1]where it readbySlot, andendsAt,agreedEndandconnectedare on the session.RollbackSession(by hand).RollbackSessionis the one rollback, for two to thirty-two machines: it takeslocalSlot(the wire'sslotby default) andplayers, itsapplyAndStepreceives every slot's frame by slot, andonSettledalso receives the frames.RollbackSession(migrate).onSettled: xofRollbackSessionisonSettled: (settled) => (x)(settled.step, settled.after).onSettledis handed oneSettledStep, with the step, the state it ended in and the frames it ran on, where it took the step and the state as parameters:(step, after) => ...is(settled) => ...readingsettled.stepandsettled.after.migratewraps the old function,(settled) => (old)(settled.step, settled.after), which runs as it did.onMessageis new and takes aPeerMessage.WireHello(nothing to do). Declared byflutter3d_netnow and re-exported here, asPeerWire.WireHello.currentProtocolMajor(nothing to do). Protocol 3: a rollback's frames carry the reserved key"f3d": "rollback"(PeerWire.engineKey). A machine on protocol 2 is refused in the hello with the version to update to, and a game's own message never setsf3d.WireState(nothing to do). Declared byflutter3d_netnow and re-exported here, asPeerWire.
flame_multiplayer_dashwire #
DashwireWire.send(migrate).DashwireWire.sendtakes onePeerSend: an override reads its old parameters from it (parameter 1 is.message,reliable:is.reliable), and a call builds one.DashwireWire.sendtakes onePeerSendwhere it took its parameters. A peer wire is a transport a network library implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.
flutter3d #
- 1 name was the package's own (gone internal): they are not exported since 1.0.0-rc.1, and the import of
flutter3dthat brought them gets one diagnostic for all of them.package:flutter3d/parity_scene.dart. A backend's own tests import it frompackage:flutter3d_core/src/engine/render/parity_scene.dart. BundleAssetSource(by hand). A key the asset bundle does not hold throwsAssetNotFoundException(aFlutter3dException) naming the key, where it threw the platform'sFlutterError. CatchAssetNotFoundException, or the root, instead.ImpostorPart(migrate).ImpostorPartis a class:.cardis.card,.albedois.albedo,.normalDepthis.normalDepth; a destructuring pattern is yours to rewrite.ImpostorPartis a final class with the samecard,albedoandnormalDepth; only a destructuring pattern names the class.MaterialDecoder(by hand). Anabstract base classsince 1.0: writeextends MaterialDecoderwhere you wroteimplements MaterialDecoder, and mark the classfinal,baseorsealed.MaterialDecoder.decode(migrate).MaterialDecoder.decodetakes oneMaterialDecodeContext: an override reads its old parameters from it (parameter 1 is.bytes, parameter 2 is.fileName), and a call builds one.MaterialDecoder.decodetakes oneMaterialDecodeContextwhere it took its parameters. A material decoder is the plugin boundary for looks; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.MaterialDecoder.handles(migrate).MaterialDecoder.handlestakes oneMaterialProbe: an override reads its old parameters from it (parameter 1 is.fileName, parameter 2 is.bytes), and a call builds one.MaterialDecoder.handlestakes oneMaterialProbewhere it took its parameters. A material decoder is the plugin boundary for looks; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ModelAsset(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).ModelAsset.release(migrate).ModelAsset.releasebecomesx.dispose().dispose()is the one verb for ending what holds GPU memory. The asset remembers the device it was uploaded to, so the call takes nothing; a second call does nothing.ModelInstance(nothing to do). The constructor's private_drawnbecame the public nameddrawn, and a private_slotswas added. Nothing outside the library could pass either, so every call still compiles.ModelWardrobe(migrate).onDressed: xofModelWardrobeisonDressed: (dressed) => (x)(dressed.instance, dressed.key).onDressedis handed oneModelDressed, the model put on and the key it plays, where it took the two as parameters:(instance, key) => ...is(dressed) => ...readingdressed.instanceanddressed.key.migratewraps the old function,(dressed) => (old)(dressed.instance, dressed.key), which runs as it did.assetDeviceClass(by hand). There is no process-wide device class since 1.0: passdeviceClass:toloadModelAssetorloadModelByPath, and setHotSwap.instance.deviceClassfor hot reload.bindMaterial(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).bindSurfaceMaterial(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).loadMaterial(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).loadModelAsset(by hand). A release build missing the converted.f3dthrowsAssetNotFoundExceptionwith the generated path as itskey, where it threwStateError. CatchAssetNotFoundExceptioninstead.package:flutter3d_core/formats.dart(dart fix). Names re-exported frompackage:flutter3d_core/formats.dartare imported frompackage:flutter3d_core/formats.dart.package:flutter3d/flutter3d.dartre-exports the formats library through ashowlist now. The readers and writers a game calls are on it; the format internals (F3dSection, the KTX2 header fields, the material expression tree, the block encoders) are not. Importpackage:flutter3d_core/formats.dartfor those;dart fixadds the import, andmigratethe dependency onflutter3d_core.
flutter3d_addon_access #
package:flutter3d_addon_access/flutter3d_addon_access.dart(migrate).package:flutter3d_addon_access/flutter3d_addon_access.dartispackage:flutter3d_game_ui/access.dart.flutter3d_addon_accessis theaccess.dartlibrary offlutter3d_game_ui, with the API it had;package:flutter3d_game_ui/flutter3d_game_ui.dartexports it beside its siblings.package:flutter3d_addon_access/src/(migrate).package:flutter3d_addon_access/src/ispackage:flutter3d_game_ui/src/access/. What was underflutter3d_addon_access'slib/src/is underlib/src/access/offlutter3d_game_ui. Importing it was never the public API; the main library above is.
flutter3d_addon_atmosphere #
package:flutter3d_addon_atmosphere/flutter3d_addon_atmosphere.dart(migrate).package:flutter3d_addon_atmosphere/flutter3d_addon_atmosphere.dartispackage:flutter3d_post/atmosphere.dart.flutter3d_addon_atmosphereis theatmosphere.dartlibrary offlutter3d_post, with the API it had;package:flutter3d_post/flutter3d_post.dartexports it beside its siblings.package:flutter3d_addon_atmosphere/src/(migrate).package:flutter3d_addon_atmosphere/src/ispackage:flutter3d_post/src/atmosphere/. What was underflutter3d_addon_atmosphere'slib/src/is underlib/src/atmosphere/offlutter3d_post. Importing it was never the public API; the main library above is.
flutter3d_addon_camera #
package:flutter3d_addon_camera/flutter3d_addon_camera.dart(migrate).package:flutter3d_addon_camera/flutter3d_addon_camera.dartispackage:flutter3d_camera/flutter3d_camera.dart.flutter3d_addon_cameraisflutter3d_camera, renamed with nothing else changed;src/keeps its layout, which the package rename carries.
flutter3d_addon_capture #
package:flutter3d_addon_capture/flutter3d_addon_capture.dart(migrate).package:flutter3d_addon_capture/flutter3d_addon_capture.dartispackage:flutter3d_game_ui/capture.dart.flutter3d_addon_captureis thecapture.dartlibrary offlutter3d_game_ui, with the API it had;package:flutter3d_game_ui/flutter3d_game_ui.dartexports it beside its siblings.package:flutter3d_addon_capture/src/(migrate).package:flutter3d_addon_capture/src/ispackage:flutter3d_game_ui/src/capture/. What was underflutter3d_addon_capture'slib/src/is underlib/src/capture/offlutter3d_game_ui. Importing it was never the public API; the main library above is.
flutter3d_addon_ghost #
package:flutter3d_addon_ghost/flutter3d_addon_ghost.dart(migrate).package:flutter3d_addon_ghost/flutter3d_addon_ghost.dartispackage:flutter3d_game_kit/ghost.dart.flutter3d_addon_ghostis theghost.dartlibrary offlutter3d_game_kit, with the API it had;package:flutter3d_game_kit/flutter3d_game_kit.dartexports it beside its siblings.package:flutter3d_addon_ghost/src/(migrate).package:flutter3d_addon_ghost/src/ispackage:flutter3d_game_kit/src/ghost/. What was underflutter3d_addon_ghost'slib/src/is underlib/src/ghost/offlutter3d_game_kit. Importing it was never the public API; the main library above is.
flutter3d_addon_hud #
package:flutter3d_addon_hud/flutter3d_addon_hud.dart(migrate).package:flutter3d_addon_hud/flutter3d_addon_hud.dartispackage:flutter3d_game_ui/hud.dart.flutter3d_addon_hudis thehud.dartlibrary offlutter3d_game_ui, with the API it had;package:flutter3d_game_ui/flutter3d_game_ui.dartexports it beside its siblings.package:flutter3d_addon_hud/src/(migrate).package:flutter3d_addon_hud/src/ispackage:flutter3d_game_ui/src/hud/. What was underflutter3d_addon_hud'slib/src/is underlib/src/hud/offlutter3d_game_ui. Importing it was never the public API; the main library above is.
flutter3d_addon_light #
package:flutter3d_addon_light/flutter3d_addon_light.dart(migrate).package:flutter3d_addon_light/flutter3d_addon_light.dartispackage:flutter3d_post/light.dart.flutter3d_addon_lightis thelight.dartlibrary offlutter3d_post, with the API it had;package:flutter3d_post/flutter3d_post.dartexports it beside its siblings.package:flutter3d_addon_light/src/(migrate).package:flutter3d_addon_light/src/ispackage:flutter3d_post/src/light/. What was underflutter3d_addon_light'slib/src/is underlib/src/light/offlutter3d_post. Importing it was never the public API; the main library above is.
flutter3d_addon_motion #
package:flutter3d_addon_motion/flutter3d_addon_motion.dart(migrate).package:flutter3d_addon_motion/flutter3d_addon_motion.dartispackage:flutter3d_post/motion.dart.flutter3d_addon_motionis themotion.dartlibrary offlutter3d_post, with the API it had;package:flutter3d_post/flutter3d_post.dartexports it beside its siblings.package:flutter3d_addon_motion/src/(migrate).package:flutter3d_addon_motion/src/ispackage:flutter3d_post/src/motion/. What was underflutter3d_addon_motion'slib/src/is underlib/src/motion/offlutter3d_post. Importing it was never the public API; the main library above is.
flutter3d_addon_party #
package:flutter3d_addon_party/flutter3d_addon_party.dart(migrate).package:flutter3d_addon_party/flutter3d_addon_party.dartispackage:flutter3d_game_physics/party.dart.flutter3d_addon_partyis theparty.dartlibrary offlutter3d_game_physics, with the API it had;package:flutter3d_game_physics/flutter3d_game_physics.dartexports it beside its siblings. It needs the native physics core, so it is not influtter3d_game_kit, which builds none.package:flutter3d_addon_party/src/(migrate).package:flutter3d_addon_party/src/ispackage:flutter3d_game_physics/src/party/. What was underflutter3d_addon_party'slib/src/is underlib/src/party/offlutter3d_game_physics. Importing it was never the public API; the main library above is.
flutter3d_addon_photo_mode #
package:flutter3d_addon_photo_mode/flutter3d_addon_photo_mode.dart(migrate).package:flutter3d_addon_photo_mode/flutter3d_addon_photo_mode.dartispackage:flutter3d_game_ui/photo_mode.dart.flutter3d_addon_photo_modeis thephoto_mode.dartlibrary offlutter3d_game_ui, with the API it had;package:flutter3d_game_ui/flutter3d_game_ui.dartexports it beside its siblings.package:flutter3d_addon_photo_mode/src/(migrate).package:flutter3d_addon_photo_mode/src/ispackage:flutter3d_game_ui/src/photo_mode/. What was underflutter3d_addon_photo_mode'slib/src/is underlib/src/photo_mode/offlutter3d_game_ui. Importing it was never the public API; the main library above is.
flutter3d_addon_ragdoll #
package:flutter3d_addon_ragdoll/flutter3d_addon_ragdoll.dart(migrate).package:flutter3d_addon_ragdoll/flutter3d_addon_ragdoll.dartispackage:flutter3d_game_physics/ragdoll.dart.flutter3d_addon_ragdollis theragdoll.dartlibrary offlutter3d_game_physics, with the API it had;package:flutter3d_game_physics/flutter3d_game_physics.dartexports it beside its siblings. It needs the native physics core, so it is not influtter3d_game_kit, which builds none.package:flutter3d_addon_ragdoll/src/(migrate).package:flutter3d_addon_ragdoll/src/ispackage:flutter3d_game_physics/src/ragdoll/. What was underflutter3d_addon_ragdoll'slib/src/is underlib/src/ragdoll/offlutter3d_game_physics. Importing it was never the public API; the main library above is.
flutter3d_addon_reactions #
package:flutter3d_addon_reactions/flutter3d_addon_reactions.dart(migrate).package:flutter3d_addon_reactions/flutter3d_addon_reactions.dartispackage:flutter3d_game_kit/reactions.dart.flutter3d_addon_reactionsis thereactions.dartlibrary offlutter3d_game_kit, with the API it had;package:flutter3d_game_kit/flutter3d_game_kit.dartexports it beside its siblings.package:flutter3d_addon_reactions/src/(migrate).package:flutter3d_addon_reactions/src/ispackage:flutter3d_game_kit/src/reactions/. What was underflutter3d_addon_reactions'slib/src/is underlib/src/reactions/offlutter3d_game_kit. Importing it was never the public API; the main library above is.
flutter3d_addon_reflections #
package:flutter3d_addon_reflections/flutter3d_addon_reflections.dart(migrate).package:flutter3d_addon_reflections/flutter3d_addon_reflections.dartispackage:flutter3d_post/reflections.dart.flutter3d_addon_reflectionsis thereflections.dartlibrary offlutter3d_post, with the API it had;package:flutter3d_post/flutter3d_post.dartexports it beside its siblings.package:flutter3d_addon_reflections/src/(migrate).package:flutter3d_addon_reflections/src/ispackage:flutter3d_post/src/reflections/. What was underflutter3d_addon_reflections'slib/src/is underlib/src/reflections/offlutter3d_post. Importing it was never the public API; the main library above is.
flutter3d_addon_screens #
package:flutter3d_addon_screens/flutter3d_addon_screens.dart(migrate).package:flutter3d_addon_screens/flutter3d_addon_screens.dartispackage:flutter3d_game_ui/screens.dart.flutter3d_addon_screensis thescreens.dartlibrary offlutter3d_game_ui, with the API it had;package:flutter3d_game_ui/flutter3d_game_ui.dartexports it beside its siblings.package:flutter3d_addon_screens/src/(migrate).package:flutter3d_addon_screens/src/ispackage:flutter3d_game_ui/src/screens/. What was underflutter3d_addon_screens'slib/src/is underlib/src/screens/offlutter3d_game_ui. Importing it was never the public API; the main library above is.
flutter3d_addon_seeded_levels #
package:flutter3d_addon_seeded_levels/flutter3d_addon_seeded_levels.dart(migrate).package:flutter3d_addon_seeded_levels/flutter3d_addon_seeded_levels.dartispackage:flutter3d_game_kit/seeded_levels.dart.flutter3d_addon_seeded_levelsis theseeded_levels.dartlibrary offlutter3d_game_kit, with the API it had;package:flutter3d_game_kit/flutter3d_game_kit.dartexports it beside its siblings.package:flutter3d_addon_seeded_levels/src/(migrate).package:flutter3d_addon_seeded_levels/src/ispackage:flutter3d_game_kit/src/seeded_levels/. What was underflutter3d_addon_seeded_levels'slib/src/is underlib/src/seeded_levels/offlutter3d_game_kit. Importing it was never the public API; the main library above is.
flutter3d_addon_shading #
package:flutter3d_addon_shading/flutter3d_addon_shading.dart(migrate).package:flutter3d_addon_shading/flutter3d_addon_shading.dartispackage:flutter3d_post/shading.dart.flutter3d_addon_shadingis theshading.dartlibrary offlutter3d_post, with the API it had;package:flutter3d_post/flutter3d_post.dartexports it beside its siblings.package:flutter3d_addon_shading/src/(migrate).package:flutter3d_addon_shading/src/ispackage:flutter3d_post/src/shading/. What was underflutter3d_addon_shading'slib/src/is underlib/src/shading/offlutter3d_post. Importing it was never the public API; the main library above is.
flutter3d_addon_soundtrack #
package:flutter3d_addon_soundtrack/flutter3d_addon_soundtrack.dart(migrate).package:flutter3d_addon_soundtrack/flutter3d_addon_soundtrack.dartispackage:flutter3d_game_kit/soundtrack.dart.flutter3d_addon_soundtrackis thesoundtrack.dartlibrary offlutter3d_game_kit, with the API it had;package:flutter3d_game_kit/flutter3d_game_kit.dartexports it beside its siblings.ElementSoundsandElementCues, which reach the native physics core throughflutter3d_effects, are inpackage:flutter3d_game_physics/elements.dart: import it, and depend onflutter3d_game_physics.package:flutter3d_addon_soundtrack/src/(migrate).package:flutter3d_addon_soundtrack/src/ispackage:flutter3d_game_kit/src/soundtrack/. What was underflutter3d_addon_soundtrack'slib/src/is underlib/src/soundtrack/offlutter3d_game_kit. Importing it was never the public API; the main library above is.
flutter3d_addon_style #
package:flutter3d_addon_style/flutter3d_addon_style.dart(migrate).package:flutter3d_addon_style/flutter3d_addon_style.dartispackage:flutter3d_post/style.dart.flutter3d_addon_styleis thestyle.dartlibrary offlutter3d_post, with the API it had;package:flutter3d_post/flutter3d_post.dartexports it beside its siblings.package:flutter3d_addon_style/src/(migrate).package:flutter3d_addon_style/src/ispackage:flutter3d_post/src/style/. What was underflutter3d_addon_style'slib/src/is underlib/src/style/offlutter3d_post. Importing it was never the public API; the main library above is.
flutter3d_addon_touch #
package:flutter3d_addon_touch/flutter3d_addon_touch.dart(migrate).package:flutter3d_addon_touch/flutter3d_addon_touch.dartispackage:flutter3d_game_ui/touch.dart.flutter3d_addon_touchis thetouch.dartlibrary offlutter3d_game_ui;package:flutter3d_game_ui/flutter3d_game_ui.dartexports it beside its siblings. Two of its widgets merged with the ones that did the same job:TouchClusterisTouchControls, whosetoggle:iscorner:, andPedalisTouchButton.pedal, with the same parameters.package:flutter3d_addon_touch/src/(migrate).package:flutter3d_addon_touch/src/ispackage:flutter3d_game_ui/src/touch/. What was underflutter3d_addon_touch'slib/src/is underlib/src/touch/offlutter3d_game_ui. Importing it was never the public API; the main library above is.
flutter3d_addon_world #
package:flutter3d_addon_world/flutter3d_addon_world.dart(migrate).package:flutter3d_addon_world/flutter3d_addon_world.dartispackage:flutter3d_game_kit/world.dart.flutter3d_addon_worldis theworld.dartlibrary offlutter3d_game_kit, with the API it had, but forDaylight.lightWater, which reaches the native physics core throughflutter3d_effects: it is theDaylightOnWaterextension ofpackage:flutter3d_game_physics/elements.dart, called the same way once that library is imported.package:flutter3d_addon_world/src/(migrate).package:flutter3d_addon_world/src/ispackage:flutter3d_game_kit/src/world/. What was underflutter3d_addon_world'slib/src/is underlib/src/world/offlutter3d_game_kit. Importing it was never the public API; the main library above is.
flutter3d_addon_wrecks #
package:flutter3d_addon_wrecks/flutter3d_addon_wrecks.dart(migrate).package:flutter3d_addon_wrecks/flutter3d_addon_wrecks.dartispackage:flutter3d_game_physics/wrecks.dart.flutter3d_addon_wrecksis thewrecks.dartlibrary offlutter3d_game_physics, with the API it had;package:flutter3d_game_physics/flutter3d_game_physics.dartexports it beside its siblings. It needs the native physics core, so it is not influtter3d_game_kit, which builds none.package:flutter3d_addon_wrecks/src/(migrate).package:flutter3d_addon_wrecks/src/ispackage:flutter3d_game_physics/src/wrecks/. What was underflutter3d_addon_wrecks'slib/src/is underlib/src/wrecks/offlutter3d_game_physics. Importing it was never the public API; the main library above is.
flutter3d_addons_standard #
package:flutter3d_addons_standard/flutter3d_addons_standard.dart(migrate).package:flutter3d_addons_standard/flutter3d_addons_standard.dartispackage:flutter3d_post/standard.dart.flutter3d_addons_standardis thestandard.dartlibrary offlutter3d_post, with the API it had;package:flutter3d_post/flutter3d_post.dartexports it beside its siblings.package:flutter3d_addons_standard/src/(migrate).package:flutter3d_addons_standard/src/ispackage:flutter3d_post/src/standard/. What was underflutter3d_addons_standard'slib/src/is underlib/src/standard/offlutter3d_post. Importing it was never the public API; the main library above is.
flutter3d_app #
BinaryStorage(by hand).BinaryStorageis anabstract base class: an implementation is writtenextends BinaryStorage. ItswritereturnsFuture<void>and throws aStorageExceptionwhen the platform refused, where it answeredfalse: throw one where you returnedfalse, and drop thereturn true.BinaryStorage.write(by hand).writereturnsFuture<void>and throws aStorageExceptionwhen the platform refused, asStorage.writedoes, where it answeredfalse: replace a check of the answer withtry { await storage.write(…); } on StorageException catch (e) { … }. The exception'snameandmessagesay which document and why.Decal3D(migrate).color: Vector3(x, y, z)ofDecal3Discolor: LinearColor.fromSrgb(x, y, z).colorandemissiveare linearLinearColors; the oldcolordrew as sRGB, soLinearColor.fromSrgb(r, g, b, a)keeps the picture.Decal3D.emissive(migrate).emissive: Vector3(x, y, z)ofDecal3D.emissiveisemissive: LinearColor(x, y, z).emissiveis a linearLinearColor:Vector3(r, g, b)isLinearColor(r, g, b), the same numbers.DidNotStart(nothing to do). The widget is afinal class: a widget is composed, not subclassed, so a build method that wraps aDidNotStartis unchanged. A class that extended it builds one instead.DocumentText(dart fix).DocumentTextisLevelDocumentText. The functionLevelLoaderreads a level's text through isLevelDocumentText;DocumentTextis the editor's writer of documents influtter3d_editor_core.FileBinaryStorage.write(by hand).writereturnsFuture<void>and throws aStorageExceptionwhen the file could not be written, where it answeredfalse: replace a check of the answer withtry { await storage.write(…); } on StorageException catch (e) { … }.FileStorage(by hand).FileStorage.read,writeandremoveare asynchronous, asStorageis: await them, and catchStorageExceptionfromwritewherefalsewas checked.Flutter3dEngine(nothing to do).deviceandrendererare getters where they were final fields, since a device loss may replace either; every read compiles as it did.Issue(dart fix).Issueis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart. The one issue type every package reports through is the foundation's;flutter3d_appkeepsIssueLogandprintIssueand no longer re-exports the type.IssueSink(dart fix).IssueSinkis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart.IssueSinkis the foundation's, besideIssue.LevelLoadFailed(nothing to do). Nullable, asLoadingScreen.message: null isFlutter3dAppLocalizations.startOverin the reader's language.LevelLoadFailed(nothing to do). The widget is afinal class: a widget is composed, not subclassed, so a build method that wraps aLevelLoadFailedis unchanged. A class that extended it builds one instead.LevelLoader(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).Light3D.color(migrate).color: Vector3(x, y, z)ofLight3D.coloriscolor: LinearColor(x, y, z).coloris a linearLinearColor:Vector3(r, g, b)isLinearColor(r, g, b).LoadingScreen(nothing to do). The widget is afinal class: a widget is composed, not subclassed, so a build method that wraps aLoadingScreenis unchanged. A class that extended it builds one instead.LoadingScreen(nothing to do).LoadingScreen.messageandLevelLoadFailed.startOverLabelare nullable now: left out, they are the reader's language fromFlutter3dAppLocalizations, English when the app installs no delegate. A caller that passes a string still says its own words; only code reading the field as a non-nullStringsees the change.Material3D(by hand).Material3D.baseColorandemissiveare linearLinearColors (baseColor: LinearColor.fromSrgb(r, g, b)for a colour picked by eye, which is what the oldVector4drew as), andemissiveStrengthis nits: multiply a pre-1.0 number byRenderMaterial.defaultEmissiveStrength.MemoryPressureRelease(nothing to do). The widget is afinal class: a widget is composed, not subclassed, so a build method that wraps aMemoryPressureReleaseis unchanged. A class that extended it builds one instead.Mirror3D.tint(migrate).tint: Vector3(x, y, z)ofMirror3D.tintistint: LinearColor(x, y, z).tintis a linearLinearColor:Vector3(r, g, b)isLinearColor(r, g, b).RendererFailure(nothing to do). The widget is afinal class: a widget is composed, not subclassed, so a build method that wraps aRendererFailureis unchanged. A class that extended it builds one instead.Scene3D.clearColor(migrate).clearColor: Vector3(x, y, z)ofScene3D.clearColorisclearColor: LinearColor.fromSrgb(x, y, z).Scene3D(clearColor:)takes aLinearColor, in linear light, and encodes it to sRGB for the view. TheVector4it took was handed to the view as sRGB whatever its doc said, so to keep the picture write the old numbers asLinearColor.fromSrgb(r, g, b, a).Scene3DController(nothing to do).device,rendererandsceneare getters where they were fields, reading through the newengine; every read compiles as it did.SceneSurface(by hand).SceneSurfaceis aStatefulWidgetnow, so it can own the frame callback it takes asonFrame. Building one is unchanged; a class that extended it and overrodebuildhas to wrap aSceneSurfacein a widget of its own instead.Storage(by hand).read,writeandremoveare asynchronous: await them, inside anasyncfunction. A write the platform refused throws aStorageExceptionwhere it answeredfalse.Storage(by hand).Storageis asynchronous and anabstract base class.readanswersFuture<String?>,writeaFuture<void>that throws aStorageExceptionwhen the platform refused, andremoveaFuture<void>: await them, and catchStorageExceptionwhere a refused write used to befalse. An implementation is writtenextends Storagewithasyncoverrides; a test can useMemoryStorageinstead of its own.TerrainTiles(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).TerrainTiles.TerrainTiles(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.TerrainTiles.metresPerTexture(dart fix).TerrainTiles.metresPerTextureismetersPerTexture. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.VisibilityBatch(migrate).VisibilityBatchis a class:.nodeis.node,.boundsis.bounds; a destructuring pattern is yours to rewrite.VisibilityBatchis a final class with the samenodeandbounds; a batch handed toVisibilityCulleris built withVisibilityBatch(node: …, bounds: …). Only a destructuring pattern names the class.WidgetSurface.WidgetSurface(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.defaultDevices(by hand). There is no process-wide device registry. An engine owns one (Flutter3dEngine.devices, orFlutter3dView(device: DeviceSettings(devices: ...))), and an application that wants a backend or presenter of its own keeps a registry fromplatformDevices()and passes it:openDevice(width: w, height: h, registry: mine). A deviceopenDeviceopened remembers its registry, sopresentFramefinds the presenter without being handed it again. A test that put a fake in front of the real backends adds it to that registry instead.kFixedResolution(dart fix).kFixedResolutionisfixedResolution. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.package:flutter3d_editor_core/flutter3d_editor_core.dart(dart fix). Names re-exported frompackage:flutter3d_editor_core/flutter3d_editor_core.dartare imported frompackage:flutter3d_level_scene/flutter3d_level_scene.dart.flutter3d_appre-exportedLevelBatchingandmeshDataOffrom the editor's core; it depends on neither the editor nor a re-export now. Importpackage:flutter3d_level_scene/flutter3d_level_scene.dartfor them;dart fixadds the import, andmigratethe dependency.
flutter3d_audio #
AudioIssue(dart fix).AudioIssueisIssue.AudioIssueisIssue, the typeflutter3d_appreports in, now declared influtter3d_foundationand exported byflutter3d_audioandflutter3d_appalike, with the samemessage.AudioIssueSink(dart fix).AudioIssueSinkisIssueSink.AudioIssueSinkisIssueSink,void Function(Issue issue).SoLoudBackend(nothing to do).onIssueis anIssueSinkwhere it was anAudioIssueSink; the two renames above carry every caller, and a sink written as a closure needs no change.Speakers(by hand).Speakers.backendis anAudioBackend, not aSoLoudBackend. Declare what you read it into asAudioBackend;speakers.pause(),resume()anddispose()are onSpeakersitself. Code that needs the SoLoud class's own members (failedAssets) casts withas SoLoudBackend.openSpeakers(by hand).openSpeakersanswersFuture<Speakers>and throwsAudioDeviceExceptionwhen no audio device opens, where it answered null. Wrap the call intry { ... } on AudioDeviceException { ... }and play silent in theonbranch; drop the== nullcheck, and declare what you read it into asSpeakers.onIssuetakes anIssueSink.package:flutter3d_audio/testing.dart(by hand).soundTableInwas this repository's check of its demo games' sound banks against their source, not engine API, and is no longer published. Copy it into your own test helpers: it reads the file, collects the names afterstatic const SoundDefand the names insidestatic final SoundBank all = SoundBank(<SoundDef>[…]), and returns both sets.
flutter3d_audio_core #
AudioBackend(by hand).AudioBackendis anabstract base class: writeextends AudioBackendwhere you wroteimplements AudioBackend, and mark the classfinal,baseorsealed. The five voice members are still yours to write.open,pause,resumeanddisposehave bodies that do nothing; anopenordisposeyour backend already had now overrides them (add@override).MixingBackendandDirectionalBackendno longer extend it; they are base mixin classes with bodies that do nothing, so a backend that offers them writesextends AudioBackend with MixingBackend.AudioBackend.start(migrate).AudioBackend.starttakes oneVoiceStart: an override reads its old parameters from it (parameter 1 is.asset,gain:is.gain,pan:is.pan,rate:is.rate,loop:is.loop,muffle:is.muffle), and a call builds one.AudioBackend.starttakes oneVoiceStartwhere it took its parameters. An audio backend is a hook a platform implements, asked per voice, so the scene reuses one context and a backend must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.AudioBackend.update(migrate).AudioBackend.updatetakes oneVoiceUpdate: an override reads its old parameters from it (parameter 1 is.voice,gain:is.gain,pan:is.pan,rate:is.rate,muffle:is.muffle), and a call builds one.AudioBackend.updatetakes oneVoiceUpdatewhere it took its parameters. An audio backend is a hook a platform implements, asked per voice per frame, so the scene reuses one context and a backend must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.AudioScene(nothing to do).emittersandplayreturnAudioEmitter, the new name ofSoundEmitter; the old name is a typedef of the new one, so code that holds the result as aSoundEmitterstill compiles.playgained the optionalbusandfollow.LoopBand.LoopBand(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LoopBand.centre(dart fix).LoopBand.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SilentBackend.start(migrate).SilentBackend.starttakes oneVoiceStart: an override reads its old parameters from it (parameter 1 is.asset,gain:is.gain,pan:is.pan,rate:is.rate,loop:is.loop,muffle:is.muffle), and a call builds one.SilentBackend.starttakes oneVoiceStartwhere it took its parameters. An audio backend is a hook a platform implements, asked per voice, so the scene reuses one context and a backend must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.SilentBackend.update(migrate).SilentBackend.updatetakes oneVoiceUpdate: an override reads its old parameters from it (parameter 1 is.voice,gain:is.gain,pan:is.pan,rate:is.rate,muffle:is.muffle), and a call builds one.SilentBackend.updatetakes oneVoiceUpdatewhere it took its parameters. An audio backend is a hook a platform implements, asked per voice per frame, so the scene reuses one context and a backend must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.SilentVoice(nothing to do). The constructor takes named arguments (id:,asset:,gain:,pan:,rate:,loop:);SilentBackendmakes every voice, and a test reads them, so no caller builds one.SilentVoice.alive(dart fix).SilentVoice.aliveisisAlive. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.SoundEmitter(dart fix).SoundEmitterisAudioEmitter.SoundEmitterisAudioEmitterin the 1.0 audio model, with the same members. The old name is not kept as a typedef;dart fixrenames every use.
flutter3d_build #
package:flutter3d_build/src/six_way_bake.dart(migrate).package:flutter3d_build/src/six_way_bake.dartispackage:flutter3d_particles/flutter3d_particles.dart. The six-way smoke bake moved toflutter3d_particles, which owns the particle look it feeds; its public names are on the package's main library.AssetManifest.AssetManifest(migrate).AssetManifest(x0, x1)isAssetManifest(rules: x0, classes: x1). The rules, the device classes and the shader selection are named arguments: writeAssetManifest(rules: …, classes: …)where they were positional.ConvertCommandOptions(by hand). The readers in flutter3d_build throw their own leaf ofFlutter3dFormatExceptioninstead ofdart:core'sFormatException:ConvertUsageException(ConvertCommandSettings.parse),SourceFormatException(a PLY, USD, Godot or Unity text file, XML, a ZIP, or a filedecodeModelFilehas no reader for) andMigrationTableException(a migration table). Anon FormatExceptionaround one of them no longer catches: catch the leaf, orFlutter3dFormatExceptionfor all of them.ConvertOptions(dart fix).ConvertOptionsisConvertSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.ManifestFormatException(nothing to do).ManifestFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon ManifestFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.SixWayField(dart fix).SixWayFieldis imported frompackage:flutter3d_particles/flutter3d_particles.dart.SixWaySheet(dart fix).SixWaySheetis imported frompackage:flutter3d_particles/flutter3d_particles.dart.TextureFamily.parse(by hand).TextureFamily.parsethrows aConvertUsageExceptionnaming the families there are, instead of answering null for a word it does not know. A caller that had a fallback asksTextureFamily.tryParse, which answers null asparsedid:TextureFamily.tryParse(text) ?? fallback.bakeSixWay(dart fix).bakeSixWayis imported frompackage:flutter3d_particles/flutter3d_particles.dart.decodeModelFile(by hand). A file no reader claims, or one that is already a.f3d, throwsSourceFormatException(aFlutter3dFormatException) instead ofdart:core'sFormatException. Catch that, or the family.fileUriResolverFor(by hand). A converted document reads only files inside its own directory (forconvertFiles, inside the upload): a buffer, texture,mtllibor USD reference that climbs out with..or is absolute is refused. Move the files it names under the model's directory, or passroot:.kAssetPipelineVersion(dart fix).kAssetPipelineVersionisassetPipelineVersion. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix.kDefaultChunkThreshold(dart fix).kDefaultChunkThresholdisdefaultChunkThreshold. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kFlutter3dBuildVersionConstraint(dart fix).kFlutter3dBuildVersionConstraintisflutter3dBuildVersionConstraint. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix.kGitignoreEntry(dart fix).kGitignoreEntryisgitignoreEntry. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kHookBuildContent(dart fix).kHookBuildContentishookBuildContent. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.package:flutter3d_core/flutter3d_core.dart(dart fix). Names re-exported frompackage:flutter3d_core/flutter3d_core.dartare imported frompackage:flutter3d_core/flutter3d_core.dart.DeviceClassanddeviceClassPathare the core's, andflutter3d_buildno longer re-exports them.parseLodRatios(by hand).parseLodRatiosanswers a non-null list and throws aConvertUsageExceptionnaming the entry that is not a ratio between 0 and 1, instead of answering null. Drop the?? …after the call, and catchConvertUsageExceptionwhere the null was handled.recognisedExtensions(dart fix).recognisedExtensionsisrecognizedExtensions. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.smokePuff(dart fix).smokePuffis imported frompackage:flutter3d_particles/flutter3d_particles.dart.splitLargeMeshes(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.usage(dart fix).usageismodelConvertUsage.usageis the textrunConvert, the one-model converter, prints for arguments it cannot read;dart run flutter3d_build:convertis nowflutter3d convert, whose usage isconvertUsageinpackage:flutter3d_build/cli.dart.
flutter3d_conformance #
ConformanceCheck(migrate).ConformanceCheckis a class:.nameis.name,.runis.run; a destructuring pattern is yours to rewrite.ConformanceCheckis a final class with the samenameandrun, so a check can carry more in a minor. A record literal(name: 'x', run: check)becomesConformanceCheck(name: 'x', run: check); two checks with one name and one run are still equal, so filtering one list by another works as before.ConformanceDeclined(dart fix).ConformanceDeclinedisConformanceDeclinedException.ConformanceDeclinedisConformanceDeclinedException(decision H: a type that is thrown is named*Exception), with the same members. It now extendsCapabilityException(and through itFlutter3dException) instead of implementingExceptiondirectly, soon Exceptionstill catches it;dart fixrenames every use.ConformanceFailure(dart fix).ConformanceFailureisConformanceFailureException.ConformanceFailureisConformanceFailureException(decision H: a type that is thrown is named*Exception), with the same members. It now extendsCapabilityException(and through itFlutter3dException) instead of implementingExceptiondirectly, soon Exceptionstill catches it;dart fixrenames every use.FuzzTransform(migrate, with a TODO).FuzzTransformis a class: aswitchover it that names every value gains_ => throw UnimplementedError().FuzzTransformis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.OwnShaderSection(migrate).OwnShaderSectionis a class:.idis.id,.bytesis.bytes,.sdkis.sdk; a destructuring pattern is yours to rewrite.OwnShaderSectionis a final class with the sameid,bytesandsdk. TheownShaderscallback returnsOwnShaderSection(id: …, bytes: …, sdk: …)where it returned the record.PluginHarness(by hand).PluginHarnesshas nocapture,restoreordigest: the world the plugin acts on is the loop's. InsetUp, put the application's state inloop.world, or add a part for it —loop.snapshots.add(SnapshotPart.of(id: 'my.world', capture: world.save, restore: (context) => world.load(context.data)))— and the checks capture, restore and digest it throughEngineLoop.snapshots, the path a rollback takes.hasWorldis gone: a loop whose snapshots hold nothing is a run with no world.
flutter3d_core #
- 6 names were the package's own (gone internal): they are not exported since 1.0.0-rc.1, and the import of
flutter3d_corethat brought them gets one diagnostic for all of them.DrawItem,FramePassState,LightBuffer,RenderList,ShaderLightType,package:flutter3d_core/parity_scene.dart. A node or contributor usesFrameContext.noteDrawandFrameContext.invalidatePipeline. The limits areLightNode.maxLightsandLightNode.maxExtraLights,LightBuffer.reaches(light, channels)islight.reaches(channels), and a scene's overflow isscene.overflowingLights. A frame says what it drew inFrameResult. UseLightType. A backend's own tests import it frompackage:flutter3d_core/src/engine/render/parity_scene.dart. AdaptiveQuality.AdaptiveQuality(migrate).AdaptiveQuality(x0, x1)isAdaptiveQuality(x0, settings: x1). The settings and the policy are named arguments, so the constructor can take another one: writeAdaptiveQuality(table, settings: …)where the second argument was positional.AdaptiveQualitySettings(migrate).budgetMicros: xofAdaptiveQualitySettingsisbudget: Duration(microseconds: x). The frame time aimed at is aDuration:budgetMicros: 16667isbudget: Duration(microseconds: 16667). A read of the field isbudget.inMicroseconds.AdaptiveScaleSettings(migrate).targetMicros: xofAdaptiveScaleSettingsistarget: Duration(microseconds: x). The frame period aimed at is aDuration:targetMicros: 16667istarget: Duration(microseconds: 16667). A read of the field istarget.inMicroseconds.AnimationBlend(migrate, with a TODO).AnimationBlendis a class: aswitchover it that names every value gains_ => throw UnimplementedError(). An open set since 1.0, so a blend a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,valuesandnameare there;indexis not.AnimationInterpolation(migrate, with a TODO).AnimationInterpolationis a class: aswitchover it that names every value gains_ => throw UnimplementedError().AnimationInterpolationis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.AnimationPath(migrate, with a TODO).AnimationPathis a class: aswitchover it that names every value gains_ => throw UnimplementedError().AnimationPathis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis there too.AnimationPlayer.play(migrate).AnimationPlayer.play(x0)isAnimationPlayer.play(index: x0). The clip to start is a named argument:player.play(2)isplayer.play(index: 2), besideplayLayer's named options.play()with no clip still resumes the current one.AnimationPointer.parse(by hand).AnimationPointer.parsethrows anAnimationPointerFormatExceptionfor a pointer this engine does not animate, instead of answering null. Code that checked for null (a loader meeting a file's pointer) callsAnimationPointer.tryParse, which answers null asparsedid.AnimationPointerProperty(migrate, with a TODO).AnimationPointerPropertyis a class: aswitchover it that names every value gains_ => throw UnimplementedError().AnimationPointerPropertyis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis there too.AnimationPointerSink(migrate).AnimationPointerSinkis a base mixin class:implements AnimationPointerSinkbecomeswith AnimationPointerSink, on abaseclass.AnimationPointerTarget(migrate, with a TODO).AnimationPointerTargetis a class: aswitchover it that names every value gains_ => throw UnimplementedError().AnimationPointerTargetis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.AnimationTarget(migrate).AnimationTargetis a base mixin class:implements AnimationTargetbecomeswith AnimationTarget, on abaseclass.AnimationWrap(migrate, with a TODO).AnimationWrapis a class: aswitchover it that names every value gains_ => throw UnimplementedError().AnimationWrapis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.AssetSource.read(migrate).AssetSource.readtakes oneAssetReadwhere it took nothing: an override takes it, and a call hands one asking for nothing,const AssetRead().AssetSource.readtakes oneAssetReadwhere it took nothing: what a reader asks of the read, a progress listener, a cancel signal and a byte range, which a minor can add to without breaking a source written against 1.0. A source that cannot report, stop early or read a range ignores the request and reads the whole file, as before.migrategives an override the parameter and hands a callconst AssetRead(), which asks for nothing (AssetRead.whole).Atmosphere(by hand). Its colours areLinearColors (sky: const LinearColor(0.4, 0.6, 0.9), orvector.toLinearColor()), it isconst, andsunIntensityis lux: multiply a pre-1.0 value byLightNode.defaultIntensity.Atmosphere.ambientIntensity(by hand).Atmosphere.ambientIntensityis lux, assunIntensityalready was: multiply a pre-1.0 number byLightNode.defaultIntensity.Atmosphere.applyTo(nothing to do).applyTo(scene, clearColor: view.clearColor)isapplyTo(scene, view: view): the atmosphere puts its sky on the view itself, linear as both are, andcore-Atmospheremarks each use. Where it wrote the linear numbers into the sRGB vector as they were, a clear colour set from an atmosphere is lighter than in 0.8: the colour the sky was meant to be.BoolCondition(by hand).AnimationConditionhas a new case,BoolCondition: aswitchover aAnimationConditionthat names every case needs one for it, or a wildcard.CellGrid.mesh(migrate).color: Vector3(x, y, z)ofCellGrid.meshiscolor: LinearColor(x, y, z).mesh(color:)takes a linearLinearColor:Vector4(r, g, b, a)isLinearColor(r, g, b, a).CellGrid.mesh(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.CheckedModelWriter(by hand).CheckedModelWriteris anabstract base classthat extendsModelWriter. A writer that wroteimplements CheckedModelWriternow writesextends CheckedModelWriterand isfinalorbaseitself; its members stay as they were.ClusterDraws(dart fix).ClusterDrawsis imported frompackage:flutter3d_core/flutter3d_core.dart.ClusterIndices(migrate).ClusterIndicesis a class:.bufferis.buffer,.countis.count; a destructuring pattern is yours to rewrite.ClusterDraws.indicesForanswers aClusterIndices, a class with the record's fields as getters; a destructuring pattern names the class.CompareCondition(by hand).AnimationConditionhas a new case,CompareCondition: aswitchover aAnimationConditionthat names every case needs one for it, or a wildcard.CompiledFrameGraph.CompiledFrameGraph(nothing to do). The constructor took the compiler's own tables, which nothing outside the engine could fill. A compiled graph comes fromFrameGraph.compile, as it always did.ContributorFrame(by hand). A contributor counts its draw withframe.noteDraw()and says it bound a pipeline of its own withframe.invalidatePipeline(); the counters behind them are the renderer's.ContributorFrameis aFrameContextnow, and also says the view's projection, its jitter, the time and the scene's origin.ContributorLights(migrate).ContributorLightsis a base mixin class:implements ContributorLightsbecomeswith ContributorLights, on abaseclass.ContributorLights.bind(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ContributorLights.bind(migrate).ContributorLights.bindtakes oneLightBindRequest: an override reads its old parameters from it (parameter 1 is.encoder, parameter 2 is.stage,centre:is.center,center:is.center,radius:is.radius), and a call builds one.ContributorLights.bindtakes oneLightBindRequestwhere it took its parameters. A contributor's lights are mixed in by a test or a renderer of one's own; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ContributorRegistry(by hand).Renderer.contributorsandaddContributormoved to the one registry:renderer.renderSteps.addContributor(c),removeContributor(c), andrenderSteps.contributorsto list them.DebugColors(by hand). The overlay colours are linearLinearColors,static finalwhere they were getters making aVector4;DebugDrawencodes them back to the same display colours. Pass them on as they are; a read of.xis.r, in linear light.DebugDraw(migrate).color: Vector3(x, y, z)ofDebugDrawiscolor: LinearColor.fromSrgb(x, y, z). A line's colour is a linearLinearColor, which the overlay encodes for the display; theVector4was written to the screen as it was, an sRGB colour. The same line isLinearColor.fromSrgb(r, g, b, a)of the old numbers:addLine(a, b, Vector4(1, 0.5, 0, 1))isaddLine(a, b, LinearColor.fromSrgb(1, 0.5, 0)). The points are in scene space; a place in the world goes in throughaddWorldLine.DebugDrawGizmos(migrate).color: Vector3(x, y, z)ofDebugDrawGizmosiscolor: LinearColor.fromSrgb(x, y, z). Every gizmo's colour (addBox,addTransformedBox,addFrustum,addSphere,addBoneOctahedron,addJointCross,addNormals,addSkeletonOverlay) is a linearLinearColor; seerc-core-DebugDraw-coloursfor why the old numbers go throughLinearColor.fromSrgb.DebugDrawGizmos.addSphere(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.DebugDrawGizmos.buildForScene(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.DebugDrawOptions(dart fix).DebugDrawOptionsisDebugDrawSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.DecalNode(migrate).color: Vector3(x, y, z)ofDecalNodeiscolor: LinearColor.fromSrgb(x, y, z).DecalNode.coloris a linearLinearColorwith the opacity in its alpha (it was an sRGBVector4:LinearColor.fromSrgb(r, g, b, a)keeps the picture), andemissivea linearLinearColor. Both are assigned whole:decal.color.w = oisdecal.color = decal.color.withAlpha(o).DecalNode.emissive(migrate).emissive: Vector3(x, y, z)ofDecalNode.emissiveisemissive: LinearColor(x, y, z).emissiveis a linearLinearColor, assigned whole:Vector3(r, g, b)isLinearColor(r, g, b), the same numbers.DepthOfFieldSettings.lensFor(nothing to do). Answers aThinLenswhose getters are the record's fields,focalLengthandsensorWidth, so a read of one is unchanged; a destructuring pattern names the class (2b-core-ThinLens).DeviceClass.parse(migrate, with a TODO).DeviceClass.parsethrowsUnknownDeviceClassExceptionwhere it returned null: a null check beside a call becomestry … on UnknownDeviceClassException. A name that is not a class throwsUnknownDeviceClassException, naming the classes there are, where it answered null.DeviceClass.tryParseis the lookup that still answers null.DeviceClassMemory(by hand). Anabstract base classsince 1.0: writeextends DeviceClassMemorywhere you wroteimplements DeviceClassMemory, and mark the classfinal,baseorsealed.DeviceClassSelector(migrate).desktopMicros: xofDeviceClassSelectorisdesktopLimit: Duration(microseconds: x). The slowest probe frame a desktop may take is aDuration:desktopMicros: 8000isdesktopLimit: Duration(microseconds: 8000).choose(measuredMicros:)still takes the measurement in microseconds.DeviceMesh.clusters(migrate).DeviceMeshis a class:.tableis.table,.indicesis.indices; a destructuring pattern is yours to rewrite.clustersis aClusteredIndiceswith the sametableandindices.DiffuseModel(migrate, with a TODO).DiffuseModelis a class: aswitchover it that names every value gains_ => throw UnimplementedError(). An open set since 1.0, so a diffuse lobe a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,valuesandnameare there;indexis not.DracoException(nothing to do).DracoExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon DracoExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.DrawableGeometry(by hand).DrawableGeometryis anabstract base classthat mixes inMeshGeometry. Code that draws one is unchanged. A geometry of your own that implemented it nowextends DrawableGeometry(and isfinalorbaseitself), and keeps the members it wrote.DrawableGeometry.clusters(migrate).DrawableGeometryis a class:.tableis.table,.indicesis.indices; a destructuring pattern is yours to rewrite.clustersis aClusteredIndiceswith the sametableandindices: a geometry of your own returnsClusteredIndices(table: …, indices: …)or null.EffectiveAntiAliasing.none(dart fix).EffectiveAntiAliasing.noneisisNone. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.EnumHintValue.EnumHintValue(migrate).EnumHintValue(x0, x1)isEnumHintValue(x0, label: x1). The label is a named argument: writeEnumHintValue('opaque', label: 'Opaque')where the label was the second positional argument.EnvironmentCube(migrate).EnvironmentCubeis a class:.textureis.texture,.levelsis.levels; a destructuring pattern is yours to rewrite.EnvironmentMap.fromSky,fromPanoramaandfromEncodedanswer anEnvironmentCube, a class with the record's fields as getters; a destructuring pattern names the class.EnvironmentMap.fromEncoded(by hand). Completes with the environment, not a nullable one: bytes neither reader takes throw aPanoramaFormatException, and the rest asfromPanorama.EnvironmentMap.fromPanorama(by hand). Returns the environment, not a nullable one: a device without cubes throwsUnsupportedCapabilityException(askEnvironmentMap.isSupportedOn), and pixels that are notwidth × heightRGBA8 anArgumentError.EnvironmentMap.fromSky(by hand). Returns the environment, not a nullable one: a device without cubes throwsUnsupportedCapabilityExceptionand a sky that is off anArgumentError. AskEnvironmentMap.isSupportedOn(device)(andsky.enabled) first where the null meant "keep the flat ambient".F3dDecoder.decode(migrate).F3dDecoder.decodetakes oneModelDecodeContext: an override reads its old parameters from it (parameter 1 is.bytes, parameter 2 is.request, parameter 3 is.resolveUri), and a call builds one.F3dDecoder.decodetakes oneModelDecodeContextwhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.F3dDecoder.handles(migrate).F3dDecoder.handlestakes oneModelProbe: an override reads its old parameters from it (parameter 1 is.fileName, parameter 2 is.bytes), and a call builds one.F3dDecoder.handlestakes oneModelProbewhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.F3dFormatException(nothing to do).F3dFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon F3dFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.F3dModelWriter.write(migrate).F3dModelWriter.writetakes oneModelWriteContext: an override reads its old parameters from it (parameter 1 is.document,baseName:is.baseName), and a call builds one.F3dModelWriter.writetakes oneModelWriteContextwhere it took its parameters. A model writer is a hook a format implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.FabrikIk(nothing to do). Only the animation pose in its signature changed:PoseisAnimationPose(core-Pose-AnimationPoserenames it).FbxDecoder.decode(migrate).FbxDecoder.decodetakes oneModelDecodeContext: an override reads its old parameters from it (parameter 1 is.bytes, parameter 2 is.request, parameter 3 is.resolveUri), and a call builds one.FbxDecoder.decodetakes oneModelDecodeContextwhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.FbxDecoder.handles(migrate).FbxDecoder.handlestakes oneModelProbe: an override reads its old parameters from it (parameter 1 is.fileName, parameter 2 is.bytes), and a call builds one.FbxDecoder.handlestakes oneModelProbewhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.FieldPass.spec(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FileAssetSource.read(migrate).FileAssetSource.readtakes oneAssetReadwhere it took nothing: an override takes it, and a call hands one asking for nothing,const AssetRead().FileAssetSource.readtakes theAssetReadevery source'sreadtakes; a call is handedconst AssetRead(), which reads the whole file as before.FogSettings(migrate).color: Vector3(x, y, z)ofFogSettingsiscolor: LinearColor(x, y, z). The colours ofFogSettings,LightShaftSettings,VolumetricFogSettings(color,ambient) andXraySettingsare linearLinearColors, so the settings can beconst:color: Vector3(r, g, b)iscolor: LinearColor(r, g, b), orvector.toLinearColor().FootPlantGoal(by hand).AnimationGoalhas a new case,FootPlantGoal: aswitchover aAnimationGoalthat names every case needs one for it, or a wildcard.FrameCapture(by hand).FrameCapture.fromJsonandFrameCapture.parsereturn a capture or throw aFrameCaptureFormatExceptionwith the reason (another format, a newer version, no size) instead of returning null; catch it where a file may not be a capture. The constructor is no longerconst(FrameCaptureis aFormatDocumentnow).fileFormatisf3d.frameCaptureandfileVersion2; files written asflutter3d.frameCaptureversion 1 still read.FrameCaptureBuilder(dart fix).FrameCaptureBuilderis imported frompackage:flutter3d_core/flutter3d_core.dart.FrameGraphNode.supported(dart fix).FrameGraphNode.supportedisisSupported. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.FrameHistory(by hand). The history is kept per view now, so views drawn by separateRenderer.rendercalls each have their own past.of(node)isof(node, view)andmoved(node)ismoved(node, view): pass theRenderViewwhose last frame you mean, the one you hand torender.FrameHistory(by hand). The last view-projection is kept perRenderViewsince 1.0, not per camera, so two views of one camera each keep their own:viewProjection(view).FramePass(migrate).FramePassis a class:.nameis.name,.activeis.active,.microsis.micros,.gpuMicrosis.gpuMicros,.drawCallsis.drawCalls,.trianglesis.triangles,.pipelineSwitchesis.pipelineSwitches; a destructuring pattern is yours to rewrite.FramePassis a class whose getters are the record's fields, so reading one is unchanged; a record literal isFramePass(name: …), and a destructuring pattern names the class.FramePhase(by hand). The two phases were two anchors. Add a node withrenderer.renderSteps.addNode(node, at: RenderAnchor.afterScene)forFramePhase.overlayandat: RenderAnchor.beforePresentforFramePhase.present; a node that knows where it belongs overridesRenderNode.defaultAnchorand is added with noat.FrameResourceIds.hdrColour(dart fix).FrameResourceIds.hdrColourishdrColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.FrameResourceIds.sceneColour(dart fix).FrameResourceIds.sceneColourissceneColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.FrameResources.transient(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FrameTextureSource(migrate).FrameTextureSourceis a base mixin class:implements FrameTextureSourcebecomeswith FrameTextureSource, on abaseclass.FrameWorkBudget(migrate).microseconds: xofFrameWorkBudgetisallowance: Duration(microseconds: x). The allowance is aDuration:FrameWorkBudget(microseconds: 1000)isFrameWorkBudget(allowance: Duration(microseconds: 1000)). What it reports having spent (spent,remaining,averageCost) is still microseconds.FreeLook.metresPerSecond(dart fix).FreeLook.metresPerSecondismetersPerSecond. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.FullscreenDraw.FullscreenDraw(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FullscreenDraw.sampler(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FullscreenDraw.samplerFor(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FullscreenDraw.samplers(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FullscreenEffect(by hand).preferredPhaseisdefaultAnchor. An effect no longer registers itself anywhere: add it withrenderer.renderSteps.addNode(effect), which places it at its own anchor.GeneratedTangents(migrate).GeneratedTangentsis a class:.meshis.mesh,.copiedFromis.copiedFrom; a destructuring pattern is yours to rewrite.generateTangentsanswers aGeneratedTangents, a class with the record's fields as getters:final GeneratedTangents(:mesh) = ….GlbModelWriter.write(migrate).GlbModelWriter.writetakes oneModelWriteContext: an override reads its old parameters from it (parameter 1 is.document,baseName:is.baseName), and a call builds one.GlbModelWriter.writetakes oneModelWriteContextwhere it took its parameters. A model writer is a hook a format implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.GltfLoader.decode(migrate).GltfLoader.decodetakes oneModelDecodeContext: an override reads its old parameters from it (parameter 1 is.bytes, parameter 2 is.request, parameter 3 is.resolveUri), and a call builds one.GltfLoader.decodetakes oneModelDecodeContextwhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.GltfLoader.handles(migrate).GltfLoader.handlestakes oneModelProbe: an override reads its old parameters from it (parameter 1 is.fileName, parameter 2 is.bytes), and a call builds one.GltfLoader.handlestakes oneModelProbewhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.GltfWriter.usedGeometryQuantization(dart fix).GltfWriter.usedGeometryQuantizationisdidQuantizeGeometry. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.GltfWriter.usedVertexCacheReordering(dart fix).GltfWriter.usedVertexCacheReorderingisdidReorderVertexCache. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.HdrFormatException(nothing to do).HdrFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon HdrFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.HiZOcclusion.HiZOcclusion(nothing to do). The renderer makes the one it uses and feeds it the depths it read back from the GPU; one made by hand at 0.8.5 was never fed and answered nothing, so no code had a use for it.OcclusionMode.hiZin the render settings asks for it, as before.HighContrastSettings(migrate).outlineColor: Vector3(x, y, z)ofHighContrastSettingsisoutlineColor: LinearColor.fromSrgb(x, y, z).HighContrastSettings.outlineColoris a linearLinearColor, encoded to the display where the line is drawn: a display colour isLinearColor.fromSrgb(r, g, b).HitResult(nothing to do). Reading a hit is unchanged:node,distance,triangleIndexandapproximateread as before, and only writing them is gone. A hit is the caller's now, a new one per cast, where before 1.0 it was the caster's scratch that the next cast wrote over; a write into it changed nothing the engine read, so there is nothing to carry over. Keep a value of your own in a variable of your own.ImmediateTextureSource.acquire(nothing to do). Its parameter's type isRenderTargetSpecrenamed toRenderTargetDescriptor, which the rename of that type carries; a call passes the same value as before.ImmediateTextureSourceis exported byflutter3dagain, as at 0.8.5.ImpostorNode.ImpostorNode(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ImpostorNode.ImpostorNode.withCard(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ImpostorNode.centre(dart fix).ImpostorNode.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.InstanceHandle.live(dart fix).InstanceHandle.liveisisLive. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.InstanceHandle.setColor(migrate).color: Vector3(x, y, z)ofInstanceHandle.setColoriscolor: LinearColor(x, y, z). Takes a linearLinearColor;vector.toLinearColor()converts.InstancedMeshNode(migrate).color: Vector3(x, y, z)ofInstancedMeshNodeiscolor: LinearColor(x, y, z). An instance's colour is a linearLinearColor:addInstance(m, color: Vector4(r, g, b, a))isaddInstance(m, color: LinearColor(r, g, b, a)), andInstanceHandle.setColortakes one too.datastays aVector4.IrradianceAtlas(migrate).IrradianceAtlasis a class:.widthis.width,.heightis.height,.columnsis.columns,.momentsTopis.momentsTop,.texelsis.texels; a destructuring pattern is yours to rewrite.IrradianceField.toAtlasanswers anIrradianceAtlas, a class with the record's fields as getters; a destructuring pattern names the class.IrradianceField(by hand). Irradiance is aLinearColor:writeIrradianceandwriteIrradianceTexeltake one (vector.toLinearColor(), orLinearColor(r, g, b)), andreadIrradianceandsampleanswer one and take nooutvector; read.r,.g,.bwhere you read.x,.y,.z.toAtlasanswers anIrradianceAtlas(2b-core-IrradianceAtlas).IrradianceField.writeIrradiance(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.IrradianceField.writeIrradianceTexel(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.Ktx2FormatException(nothing to do).Ktx2FormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon Ktx2FormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.LightNode(by hand).intensityis in photometric units since 1.0: lux for a directional light, candela for a point, spot or area light. Multiply a pre-1.0 literal byLightNode.defaultIntensity(about 5 790.6) and the picture is the picture it was; or write the light's real lux or candela, or make it withLightNode.lumens.coloris aLinearColor:color: const LinearColor(1, 0.8, 0.6),light.color = vector.toLinearColor()where it waslight.color.setValues(...).LightNode.color(migrate).color: Vector3(x, y, z)ofLightNode.coloriscolor: LinearColor(x, y, z).coloris a linearLinearColor, assigned whole:color: Vector3(r, g, b)iscolor: LinearColor(r, g, b), the same numbers, andlight.color.setValues(r, g, b)islight.color = LinearColor(r, g, b).LightNode.maxExtraLights(nothing to do). A static getter now, with the same value (24), for the reasonmaxLightsis one.LightNode.maxLights(nothing to do). A static getter now, with the same value (8). Every read still compiles; only aconstexpression that used it does not, and it takes the number itself or a non-const variable.LightShaftSettings(migrate).color: Vector3(x, y, z)ofLightShaftSettingsiscolor: LinearColor(x, y, z).coloris a linearLinearColor; seef2-core-settings-colours.LightType(dart fix).LightTypeis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart.LightTypeisflutter3d_foundation's, so a level, a modeller project and a model file hold the same kinds the scene does,areaand a plugin's own among them; the facades export it as before.LightType(by hand). An open set since 1.0, so a light type a later minor adds does not break your code: aswitchover it needs a_ =>case.values,nameandindexare where they were;LightType.byNamereads a name back.LightType.index(nothing to do). A getter where it was a field, with the same values;LightTypegainedLightType.customandbase, so the set is open.LineStripNode(migrate).color: Vector3(x, y, z)ofLineStripNodeiscolor: LinearColor(x, y, z).LineStripNode(color:)andcolorare a linearLinearColor.LineStripNode.LineStripNode(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LineStripNode.colour(dart fix).LineStripNode.colouriscolor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LodGroup(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).LookGoal(by hand).AnimationGoalhas a new case,LookGoal: aswitchover aAnimationGoalthat names every case needs one for it, or a wildcard.LookSettings(migrate).lift:,gamma:,gain:ofLookSettings:Vector3(x, y, z)isLinearColor(x, y, z).lift,gammaandgainareLinearColors, one value per channel in red, green and blue, so the settings can beconst:lift: Vector3(0, 0, 0.1)islift: LinearColor(0, 0, 0.1), the same numbers, and a read of.xis.r.Material(dart fix).MaterialisRenderMaterial. The engine's material isRenderMaterial, so it no longer collides with Flutter'sMaterialwidget and thehide Materialclauses go. (SurfaceMaterialwas already the format-neutral material a decoder produces.)MaterialAlphaMode(migrate, with a TODO).MaterialAlphaModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError(). An open set since 1.0, so an alpha mode a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,valuesandnameare there;indexis not.MaterialBinary(dart fix).MaterialBinaryisExpressionBinary.MaterialBinarywas a second name ofExpressionBinary, the expression language's own, andMaterialTypeis also a Flutter widget's name: the type is spelled once now,ExpressionBinary, fromflutter3d_foundation, which the facades export.MaterialBindings(nothing to do).usesLightListbecame a final field instead of a getter. Reading it is the same;MaterialBindingsis final, so nothing overrode it.MaterialBuiltin(dart fix).MaterialBuiltinisExpressionBuiltin.MaterialBuiltinwas a second name ofExpressionBuiltin, the expression language's own, andMaterialTypeis also a Flutter widget's name: the type is spelled once now,ExpressionBuiltin, fromflutter3d_foundation, which the facades export.MaterialBuiltin.glsl(migrate).MaterialBuiltin.glslbecomesx.name.MaterialCall(dart fix).MaterialCallisExpressionCall.MaterialCallwas a second name ofExpressionCall, the expression language's own, andMaterialTypeis also a Flutter widget's name: the type is spelled once now,ExpressionCall, fromflutter3d_foundation, which the facades export.MaterialConstant(dart fix).MaterialConstantisExpressionConstant.MaterialConstantwas a second name ofExpressionConstant, the expression language's own, andMaterialTypeis also a Flutter widget's name: the type is spelled once now,ExpressionConstant, fromflutter3d_foundation, which the facades export.MaterialConstruct(dart fix).MaterialConstructisExpressionConstruct.MaterialConstructwas a second name ofExpressionConstruct, the expression language's own, andMaterialTypeis also a Flutter widget's name: the type is spelled once now,ExpressionConstruct, fromflutter3d_foundation, which the facades export.MaterialExpression(dart fix).MaterialExpressionisExpression.MaterialExpressionwas a second name ofExpression, the expression language's own, andMaterialTypeis also a Flutter widget's name: the type is spelled once now,Expression, fromflutter3d_foundation, which the facades export.MaterialExtensions(migrate).specularColor:,sheenColor:,attenuationColor:ofMaterialExtensions:Vector3(x, y, z)isLinearColor(x, y, z).specularColor,sheenColorandattenuationColorare linearLinearColors withconstdefaults:Vector3(r, g, b)isLinearColor(r, g, b).MaterialHintKind(migrate, with a TODO).MaterialHintKindis a class: aswitchover it that names every value gains_ => throw UnimplementedError().MaterialHintKindis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.MaterialInput.MaterialInput(dart fix). An input says the material language version it arrived in, so a source of an older version neither reads it nor loses a name to it: every input a version 1 source could read issince: 1, which is what the fix writes. Give an input a translator of your own adds the version that brings it.MaterialInput.type(nothing to do). Only a type it names was renamed (a name Flutter or Dart also declares); the type's rename carries its own fix, and a call needs none.MaterialInputRef(nothing to do). It extends the expression language'sExpressionVariable, named as its input;input, the constructor and a material visitor'svisitInputRefare unchanged.MaterialLet.value(nothing to do). Only a type it names was renamed (a name Flutter or Dart also declares); the type's rename carries its own fix, and a call needs none.MaterialLocalRef(nothing to do). It extendsExpressionVariable;name, the constructor andvisitLocalRefare unchanged.MaterialMap(migrate, with a TODO).MaterialMapis a class: aswitchover it that names every value gains_ => throw UnimplementedError().MaterialMapis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis there too.MaterialNegate(dart fix).MaterialNegateisExpressionNegate.MaterialNegatewas a second name ofExpressionNegate, the expression language's own, andMaterialTypeis also a Flutter widget's name: the type is spelled once now,ExpressionNegate, fromflutter3d_foundation, which the facades export.MaterialOutput(by hand).MaterialStatementhas a new case,MaterialOutput(out name = value;), which only a version 2vertexblock holds: aswitchover aMaterialStatementthat names every case needs one for it, or a wildcard. A reader of fragment, light, ambient or composite bodies never meets it and can refuse it;evaluateMaterialVertexruns a vertex block's outputs, andemitMaterialVertexwrites them.MaterialParamRef(nothing to do). It extendsExpressionVariable, named as its parameter;parameter, the constructor andvisitParamRefare unchanged.MaterialParameter.type(nothing to do). Only a type it names was renamed (a name Flutter or Dart also declares); the type's rename carries its own fix, and a call needs none.MaterialReturn.value(nothing to do). Only a type it names was renamed (a name Flutter or Dart also declares); the type's rename carries its own fix, and a call needs none.MaterialSample(nothing to do). It extendsExpression, whichMaterialExpressionnow names;slot,uv, the constructor andvisitSampleare unchanged.MaterialSortIds(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).MaterialStatement(migrate, with a TODO).MaterialStatementis a class: aswitchover it that names every value gains_ => throw UnimplementedError().MaterialStatementis anabstract base classwith a visitor rather than a sealed class, so a statement kind a later minor adds breaks noswitch: aswitchover the kinds ends with a wildcard, or reads every kind throughacceptand aMaterialStatementVisitor, whosevisitUnknownanswers for a kind it predates.MaterialExpressionhas the same visitor,MaterialExpressionVisitor.MaterialSwizzle(dart fix).MaterialSwizzleisExpressionSwizzle.MaterialSwizzlewas a second name ofExpressionSwizzle, the expression language's own, andMaterialTypeis also a Flutter widget's name: the type is spelled once now,ExpressionSwizzle, fromflutter3d_foundation, which the facades export.MaterialSyntaxError(dart fix).MaterialSyntaxErrorisMaterialSyntaxException.*Erroris for programmer mistakes, which a caller does not catch; this is something a correct program meets, so it is an exception and is named like one.MaterialSyntaxExceptionhas the same constructor and members and extendsFlutter3dFormatException.MaterialType(dart fix).MaterialTypeisExpressionType.MaterialTypewas a second name ofExpressionType, the expression language's own, andMaterialTypeis also a Flutter widget's name: the type is spelled once now,ExpressionType, fromflutter3d_foundation, which the facades export.MaterialVariant.MaterialVariant(migrate).MaterialVariant(x0, x1)isMaterialVariant(x0, values: x1). The values are a named argument: writeMaterialVariant('Rim', values: {…})where the map was the second positional argument.MeshBuilder.addVertex(migrate).color: Vector3(x, y, z)ofMeshBuilder.addVertexiscolor: LinearColor(x, y, z).addVertex(color:)takes a linearLinearColor, as a vertex colour is:color: Vector4(r, g, b, a)iscolor: LinearColor(r, g, b, a), the same numbers.MeshData.withColor(migrate).color: Vector3(x, y, z)ofMeshData.withColoriscolor: LinearColor(x, y, z).withColortakes a linearLinearColor:withColor(Vector4(r, g, b, a))iswithColor(LinearColor(r, g, b, a)), andwithColor(linearFromSrgb(r, g, b))iswithColor(LinearColor.fromSrgb(r, g, b)).MeshGeometry(migrate).MeshGeometryis a base mixin class:implements MeshGeometrybecomeswith MeshGeometry, on abaseclass.MeshNode(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).MeshNode.outlineColor(migrate).outlineColor: Vector3(x, y, z)ofMeshNode.outlineColorisoutlineColor: LinearColor.fromSrgb(x, y, z).MeshNode.outlineColoris a linearLinearColor. It held the display-referred channels aColorgives; say those asLinearColor.fromSrgb(r, g, b)(orcolor.toLinear()), and the ring is the colour it was.MeshNode.tint(migrate).tint: Vector3(x, y, z)ofMeshNode.tintistint: LinearColor(x, y, z).MeshNode.tintis aLinearColorassigned whole:node.tint.setValues(1, 0.3, 0.3, 1)isnode.tint = LinearColor(1, 0.3, 0.3),tint.wistint.a.MeshNode.worldBoundsCentre(dart fix).MeshNode.worldBoundsCentreisworldBoundsCenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.MeshNode.worldIsMirrored(dart fix).MeshNode.worldIsMirroredisisWorldMirrored. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.MeshOverlay(migrate).color: Vector4(x, y, z, w)ofMeshOverlayiscolor: LinearColor.fromSrgb(x, y, z, w).edge,point,ribbonandwashtake a linearLinearColorand write it as it is; they took the design's sRGB numbers in aVector4and decoded them withasDrawn, which is gone. The same picture isLinearColor.fromSrgb(r, g, b, a)of the old numbers, andMeshOverlay.asDrawn(v)isLinearColor.fromSrgb(v.x, v.y, v.z, v.w).MeshOverlay.asDrawn(migrate).MeshOverlay.asDrawnbecomesLinearColor.fromSrgb({0}.x, {0}.y, {0}.z, {0}.w).toVector4().MeshOverlay.asDrawn(v)is gone with the vector colours: the overlay takesLinearColor.fromSrgb(v.x, v.y, v.z, v.w).MeshOverlay.edge(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.MeshOverlay.point(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.MeshOverlay.ribbon(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.MeshOverlay.wash(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.MeshTangents(nothing to do).generateTangentsanswers aGeneratedTangentswhose getters are the record's fields,meshandcopiedFrom, so a read of one is unchanged; a destructuring pattern names the class (2b-core-GeneratedTangents).ModelCameraProjection(migrate, with a TODO).ModelCameraProjectionis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ModelCameraProjectionis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.ModelDecoder(by hand).ModelDecoderis anabstract base class, so a member added in a minor comes with a default and breaks no decoder. A decoder of your own that wroteimplements ModelDecodernow writesextends ModelDecoderand isfinalorbaseitself; its members stay as they were, and aconstconstructor still works.ModelDecoder.decode(migrate).ModelDecoder.decodetakes oneModelDecodeContext: an override reads its old parameters from it (parameter 1 is.bytes, parameter 2 is.request, parameter 3 is.resolveUri), and a call builds one.ModelDecoder.decodetakes oneModelDecodeContextwhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ModelDecoder.handles(migrate).ModelDecoder.handlestakes oneModelProbe: an override reads its old parameters from it (parameter 1 is.fileName, parameter 2 is.bytes), and a call builds one.ModelDecoder.handlestakes oneModelProbewhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ModelDocument(by hand).ModelDocumentis anabstract base class. A document of your own already extended it; the class that extends it is nowfinalorbaseitself (final class MyDocument extends ModelDocument).ModelFormat(by hand).ModelFormatis a class with constant values instead of an enum, so a later release can name a format without breaking aswitchwritten against this one.ModelFormat.gltfand the rest,valuesandnameare unchanged; an exhaustiveswitchover it needs a default case.ModelImpostor.ModelImpostor(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ModelImpostor.centre(dart fix).ModelImpostor.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ModelLight(migrate).color: Vector3(x, y, z)ofModelLightiscolor: LinearColor(x, y, z).ModelLight(color:)andModelLight.colorare aLinearColor, in linear light, where they were aVector3: writeLinearColor(r, g, b)for the same numbers.ModelLight.color(migrate).color: Vector3(x, y, z)ofModelLight.coloriscolor: LinearColor(x, y, z).ModelLight.coloris a linearLinearColor;Vector3(r, g, b)isLinearColor(r, g, b), and it goes onto aLightNode.coloras it is.ModelLightType(dart fix).ModelLightTypeisLightType. A model file's lights are the scene's kinds,LightType, with the samedirectional,pointandspot; the facades export it, and a file that imports only the core importsflutter3d_foundationfor it.ModelLightType(migrate, with a TODO).ModelLightTypeis a class: aswitchover it that names every value gains_ => throw UnimplementedError(). An open set since 1.0, so a light type a later minor reads (an area light) does not break your code: aswitchover it needs a_ =>case. The constants,valuesandname(the extension's owntype) are there;indexis not.ModelPart(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).ModelSplat.ModelSplat(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ModelSplat.colourSpace(dart fix).ModelSplat.colourSpaceiscolorSpace. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ModelWriteFormat(migrate, with a TODO).ModelWriteFormatis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ModelWriteFormatis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.ModelWriter(by hand).ModelWriteris anabstract base class. A writer of your own that wroteimplements ModelWriternow writesextends ModelWriterand isfinalorbaseitself; its members stay as they were.ModelWriter.write(migrate).ModelWriter.writetakes oneModelWriteContext: an override reads its old parameters from it (parameter 1 is.document,baseName:is.baseName), and a call builds one.ModelWriter.writetakes oneModelWriteContextwhere it took its parameters. A model writer is a hook a format implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.MorphSink(migrate).MorphSinkis a base mixin class:implements MorphSinkbecomeswith MorphSink, on abaseclass.NodeFrame(dart fix).NodeFrameisRenderFrame. What a node is handed isRenderFrame, aFrameContextthat also says the view, its matrices, the jitter, the time and the frame index.ObjLoader.decode(migrate).ObjLoader.decodetakes oneModelDecodeContext: an override reads its old parameters from it (parameter 1 is.bytes, parameter 2 is.request, parameter 3 is.resolveUri), and a call builds one.ObjLoader.decodetakes oneModelDecodeContextwhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ObjLoader.handles(migrate).ObjLoader.handlestakes oneModelProbe: an override reads its old parameters from it (parameter 1 is.fileName, parameter 2 is.bytes), and a call builds one.ObjLoader.handlestakes oneModelProbewhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ObjModelWriter.write(migrate).ObjModelWriter.writetakes oneModelWriteContext: an override reads its old parameters from it (parameter 1 is.document,baseName:is.baseName), and a call builds one.ObjModelWriter.writetakes oneModelWriteContextwhere it took its parameters. A model writer is a hook a format implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ObjNormals(migrate, with a TODO).ObjNormalsis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ObjNormalsis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.OcclusionMode(by hand). An open set since 1.0: aswitchover it needs a_ =>case.values,name,indexandbyNameare there.OcclusionTest(migrate).OcclusionTestis a base mixin class:implements OcclusionTestbecomeswith OcclusionTest, on abaseclass.OffAxisProjection.OffAxisProjection.symmetric(dart fix). Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.OrbitController.OrbitController(dart fix). Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.OrbitController.frameBounds(dart fix). Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.OrbitController.framingFov(dart fix).OrbitController.framingFovisframingFovY. Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.OutputTransform(by hand). An open set since 1.0: aswitchover it needs a_ =>case.values,name,indexandbyNameare there.OverlayBatch.vertex(migrate).color: Vector3(x, y, z)ofOverlayBatch.vertexiscolor: LinearColor(x, y, z).vertex(at, color)takes the linearLinearColorit writes:Vector4(r, g, b, a)isLinearColor(r, g, b, a), the same numbers.PackedLane(dart fix).PackedLaneis imported frompackage:flutter3d_core/flutter3d_core.dart.PackedMap(dart fix).PackedMapis imported frompackage:flutter3d_core/flutter3d_core.dart.PassSkip(by hand).PassSkiphas a new value,switchedOff, for a pass its settings turned off: aswitchover aPassSkipthat names every value needs a case for it, or a wildcard.PerspectiveProjection.PerspectiveProjection(dart fix). Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.PerspectiveProjection.copyWith(dart fix). Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.PerspectiveProjection.fovYRadians(dart fix).PerspectiveProjection.fovYRadiansisfovY. Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.PhotoFilter(migrate).lift:,gain:ofPhotoFilter:Vector3(x, y, z)isLinearColor(x, y, z).liftandgainareLinearColors, asLookSettings' are:Vector3(r, g, b)isLinearColor(r, g, b).Photometric(by hand).LightNode.intensityis already lux or candela since 1.0, sofromLux,fromCandela,toLuxandtoCandelawent: write the number. Before 1.0 they converted at 800 lm per engine unit; to keep a scene that used them as it looked, multiply byLightNode.defaultIntensity / Photometric.bulbAtOneMeter(about 91).referenceIlluminanceisPhotometric.bulbAtOneMeter.Photometric.toEngine(by hand). The renderer's own light scale is not API since 1.0: everything takes lux, candela or nits and the renderer converts. To carry a pre-1.0 number over, multiply it byLightNode.defaultIntensity(lights, ambient, the sky's sun) orRenderMaterial.defaultEmissiveStrength(emissive strength).PhysicalCamera.luxPerUnit(migrate).PhysicalCamera.luxPerUnitbecomesLightNode.defaultIntensity. The renderer's scale is internal; the number it was, about 5 790.6, isLightNode.defaultIntensity.PhysicalCamera.nitsPerUnit(migrate).PhysicalCamera.nitsPerUnitbecomesRenderMaterial.defaultEmissiveStrength. The renderer's scale is internal; the number it was, 1 843.2, isRenderMaterial.defaultEmissiveStrength, for carrying a pre-1.0 emissive over.PlanarReflectorNode.tint(migrate).tint: Vector3(x, y, z)ofPlanarReflectorNode.tintistint: LinearColor(x, y, z).tintis a linearLinearColor, settable now:tint: Vector3(r, g, b)istint: LinearColor(r, g, b).PlayheadStep(migrate).PlayheadStepis a class:.timeis.time,.reversingis.reversing,.stoppedis.stopped; a destructuring pattern is yours to rewrite.advanceTimeanswers aPlayheadStep, a class with the record's fields as getters:final PlayheadStep(:time) = ….PointerTargets(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).Pose(dart fix).PoseisAnimationPose. The engine's animation pose isAnimationPose, so it no longer shares a name with the simulation'sPose.ProbeFace(dart fix).ProbeFaceis imported frompackage:flutter3d_core/flutter3d_core.dart.Ray(dart fix).RayisLocalRay. The geometry library's float32 ray isLocalRay, so it no longer collides with vector_math'sRay. A ray in the world, with a double-precision origin, is the newWorldRay.Raycaster(nothing to do). Only the float32 ray in its signature changed:RayisLocalRay(core-Ray-LocalRayrenames it).ReachGoal(by hand).AnimationGoalhas a new case,ReachGoal: aswitchover aAnimationGoalthat names every case needs one for it, or a wildcard.ReactiveFrame(nothing to do). AReactiveFramewas only ever made by the renderer, which still makes it; the constructor took one of the engine's own uniform blocks.ReactiveShape(migrate, with a TODO).ReactiveShapeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ReactiveShapeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis there too.RenderMaterial.baseColor(migrate).baseColor: Vector3(x, y, z)ofRenderMaterial.baseColorisbaseColor: LinearColor.fromSrgb(x, y, z).RenderMaterial.baseColoris aLinearColor, linear, and assigned whole. It was aVector4holding the sRGB-encoded colour and changed in place.baseColor: Vector4(r, g, b, a)isbaseColor: LinearColor.fromSrgb(r, g, b, a)(the picture does not change);material.baseColor.setValues(...)ismaterial.baseColor = LinearColor.fromSrgb(...); a read of.xthat wanted the encoded number is.toSrgb().r, and.wis.a.RenderMaterial.emissive(migrate).emissive: Vector3(x, y, z)ofRenderMaterial.emissiveisemissive: LinearColor(x, y, z).RenderMaterial.emissiveis a linearLinearColor, assigned whole:emissive: Vector3(r, g, b)isemissive: LinearColor(r, g, b), andemissive.setValues(r, g, b)isemissive = LinearColor(r, g, b).RenderMaterial.emissiveStrength(by hand).emissiveStrengthis nits (cd/m²) since 1.0, the luminance an emissive of white shines at; the default isRenderMaterial.defaultEmissiveStrength(1 843.2), which is what the old default of one drew. Multiply a pre-1.0 number byRenderMaterial.defaultEmissiveStrengthto keep the glow:emissiveStrength: 4.0is4.0 * RenderMaterial.defaultEmissiveStrength. ASurfaceMaterial's strength is a file's plain multiple and is unchanged; loading converts it.RenderMaterial.parameters(migrate).parameters: Map(x)ofRenderMaterial.parametersisparameters: MaterialParameters.over(Map(x)). A material's parameters are aMaterialParameters, the one shapeRenderMaterial,Material3DandLevelMaterialshare.parameters: mapisparameters: MaterialParameters.over(map), which writes into the map you still hold. Indexing reads and writes as it did:material.parameters['wind']is the bound floats, andmaterial.parameters['wind'] = valuessets them (checked against the material's schema where it has one). A use as aMapreadsmaterial.parameters.uniforms, andkeysisnames.RenderNode(by hand).preferredPhaseisdefaultAnchor: returnRenderAnchor.beforePresentwhere it returnedFramePhase.present,RenderAnchor.afterSceneforFramePhase.overlay.executetakes aRenderFrame(the renamedNodeFrame).RenderNodeRegistry(by hand).Renderer.nodeswent with the other four ways into the frame: a pass is added withrenderer.renderSteps.addNode, which hands back aRegistration;renderSteps.nodesAt(anchor)lists what is where.RenderServices(migrate).RenderServicesis a base mixin class:implements RenderServicesbecomeswith RenderServices, on abaseclass.RenderServices.encodeScene(migrate).RenderServices.encodeScenetakes oneSceneEncodeRequest: an override reads its old parameters from it (frame:is.frame,encoder:is.encoder,scene:is.scene,viewProjection:is.viewProjection,cameraPosition:is.cameraPosition,casterIndex:is.casterIndex), and a call builds one.RenderServices.encodeScenetakes oneSceneEncodeRequestwhere it took its parameters. The renderer's services are mixed in by a test or a renderer of one's own; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.RenderSettings(migrate).frameWorkBudget: xofRenderSettingsisframeWorkBudget: Duration(microseconds: x). The allowance for work that can wait is aDuration:frameWorkBudget: 2000isframeWorkBudget: Duration(microseconds: 2000), andDuration.zero, the default, is still no limit.RenderSettings(by hand).clusteredLightsis on by default: a scene with more than eight lights is lit per cell of the view rather than per draw, and draws a different frame. PassclusteredLights: falsewhere the old picture is wanted. The physical camera is the default exposure model too (camera,physicalCamera), and its default camera draws exactly the old exposure, sophysicalCamera: falseis needed only where a camera is set and the multiplier alone is wanted.RenderSettings.copyWith(by hand).settings.copyWith(disabledPasses: {...})issettings.without({...})over the steps that own those passes; seef2-core-RenderSettings-disabledPassesfor the names.RenderSettings.disabledPasses(by hand).RenderSettings(disabledPasses: {...})isRenderSettings(...).without({...})over the steps that own those passes:bloomisRenderStep.bloom,lens flareRenderStep.lensFlare,ssaoandssao blurRenderStep.ambientOcclusion,contact shadowsRenderStep.contactShadows,reflectionsRenderStep.reflections,light shaftsRenderStep.lightShafts,volumetric fogRenderStep.volumetricFog,depth of fieldRenderStep.depthOfField,motion blurRenderStep.motionBlur,luminanceRenderStep.autoExposure,local exposureRenderStep.localExposure,spatial upscaleRenderStep.spatialUpscale,antialiasRenderStep.edgeSmoothingandRenderStep.sharpening,decalsRenderStep.decals,depth pyramidRenderStep.hiZOcclusion,viewport shadingRenderStep.viewportShading, the shadow passesRenderStep.shadows;RenderStep.ownsPassanswers for any other name. A pass of your own is switched off by theRenderStepit was added with (renderSteps.addNode(node, step: myStep)). A skipped pass is reported asPassSkip.switchedOffrather thanPassSkip.disabled. The transparent half and the scene colour copy have no step: they run when the scene holds glass.RenderSettings.needsSurfaceBuffer(by hand). A setting cannot see the frame, soneedsSurfaceBufferonly ever modelled the built-in passes. Ask the compiled frame instead:compiled.isConsumed(FrameResourceIds.surfaceBuffer)on theCompiledFrameGraphthe renderer built.RenderSettings.pixelAlteringPasses(dart fix).RenderSettings.pixelAlteringPassesispixelAlteringSteps. The setforMeasurementswitches off is aSet<RenderStep>now, handed towithout:settings.without(RenderSettings.pixelAlteringSteps). A caller that read the pass names reads each step'spasses.RenderSettings.undisablePasses(by hand). The namesdisabledPassesrefused,scene,compositeandobject ids, are not steps, so nowithoutcan switch them off and there is nothing to subtract.RenderStep(migrate).isOn: xofRenderStepisisOn: (context) => (x)(context.settings). A step's ownisOnis handed oneRenderStepContext, where it took the settings:(settings) => ...is(context) => ...readingcontext.settings, and may read the frame's views, device and quality too.migratewraps the old function,(context) => (old)(context.settings), which runs as it did.RenderStep(migrate).switchOff: xofRenderStepisswitchOff: (context) => (x)(context.settings). A step's ownswitchOffis handed oneRenderStepContext, where it took the settings, and still returns the settings with the step off:(settings) => ...is(context) => ...readingcontext.settings.migratewraps the old function,(context) => (old)(context.settings), which runs as it did.RenderStep.isOn(migrate).RenderStep.isOntakes oneRenderStepContext: an override reads its old parameters from it (parameter 1 is.settings), and a call builds one.RenderStep.isOntakes oneRenderStepContextwhere it took the settings. A step's switch could only read the settings it was asked about; the context also carries the frame's views, its device and the quality setting it is drawn at, and can gain members in a minor release.migratebuilds the context at a call,step.isOn(RenderStepContext(settings: s)).RenderView.RenderView(nothing to do).clearColor:keeps its name and takes what the field holds, aLinearColor(seecore-RenderView-clearColor); the analyzer names every call that still passes aVector4, andLinearColor.fromSrgb(r, g, b, a)is what it passes instead.RenderView.texturetakes it the same way.RenderView.clearColor(migrate).clearColor: Vector3(x, y, z)ofRenderView.clearColorisclearColor: LinearColor.fromSrgb(x, y, z). The clear colour is aLinearColor, linear like every other colour, and assigned whole. It was an sRGB-encodedVector4:clearColor: Vector4(r, g, b, a)isclearColor: LinearColor.fromSrgb(r, g, b, a)and draws the same picture, andview.clearColor.setValues(r, g, b, a)isview.clearColor = LinearColor.fromSrgb(r, g, b, a).Renderer(by hand). The renderer's own stages and test hooks are not its API since 1.0, so a shader change is not a major release. A stage is looked up by name,renderer.shaders['DebugLineVertex']!; thedebug*hooks are for the engine's own tests, throughpackage:flutter3d_core/src/engine/render/renderer.dart.Renderer(by hand). One way into the frame since 1.0,renderer.renderSteps:addContributor,removeContributorandcontributorsmoved there unchanged;addNode(node, phase: ...)isrenderSteps.addNode(node, at: anchor)(FramePhase.overlayisRenderAnchor.afterScene,FramePhase.presentisRenderAnchor.beforePresent, noatuses the node'sdefaultAnchor), and it hands back aRegistrationwhosecancelis whatremoveNodewas.Renderer.addMaterials(migrate).Renderer.addMaterialsbecomesx.renderSteps.addMaterials({0}). One way to add a bundle of materials:renderer.renderSteps.addMaterials, which a plugin already used. It returns theRegistrationthat takes the library out again.Renderer.kShadowedLights(dart fix).Renderer.kShadowedLightsisshadowedLights. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.Renderer.removeMaterials(by hand). Keep theRegistrationthatrenderer.renderSteps.addMaterials(library)returned andcancel()it; that takes the library out, as this did.Renderer.shadowedLights(nothing to do). A static getter now, with the same value (6), so a later minor can change the shadow atlas without a constant compiled into callers.ResourceDesc.resolve(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.ResourceOrigin(migrate, with a TODO).ResourceOriginis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ResourceOriginis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.ResourceSize(migrate, with a TODO).ResourceSizeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ResourceSizeis anabstract base classwith a visitor rather than a sealed class, so a size a later minor adds breaks noswitch: aswitchoverFrameFractionandAbsolutePixelsends with a wildcard, or reads them throughacceptand aResourceSizeVisitor, whosevisitUnknownanswers for a kind it predates.resolveis unchanged.Scene(by hand). A node joins its scene's lists when it is added (Scene.add); theregister*calls are the nodes' own since 1.0.ambientColoris aLinearColor:scene.ambientColor = const LinearColor(r, g, b), orvector.toLinearColor().addRenderTextureisaddTextureView,renderTexturesistextureViews.Scene.ambientIntensity(by hand).Scene.ambientIntensityis lux since 1.0, about 347 by default (the 0.06 it was). Multiply a pre-1.0 number byLightNode.defaultIntensity:scene.ambientIntensity = 0.3isscene.ambientIntensity = 0.3 * LightNode.defaultIntensity.SceneBvh(nothing to do). Only the float32 ray in its signature changed:RayisLocalRay(core-Ray-LocalRayrenames it).SceneNode(by hand). The scene graph's change counter is the engine's own since 1.0; a world position isnode.worldPosition(double precision) andsetWorldPosition.SceneNode.ownBoundsAreCullable(dart fix).SceneNode.ownBoundsAreCullableishasCullableOwnBounds. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.SceneNode.subtreeAlwaysDrawn(dart fix).SceneNode.subtreeAlwaysDrawnisisSubtreeAlwaysDrawn. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.SceneNode.visible(dart fix).SceneNode.visibleisisVisible. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.SceneNode.visibleInHierarchy(dart fix).SceneNode.visibleInHierarchyisisVisibleInHierarchy. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.SceneShadows(dart fix).SceneShadowsis imported frompackage:flutter3d_core/flutter3d_core.dart.ShadowAssignment(dart fix).ShadowAssignmentis imported frompackage:flutter3d_core/flutter3d_core.dart.ShadowCandidate(dart fix).ShadowCandidateis imported frompackage:flutter3d_core/flutter3d_core.dart.ShadowCastingMode(migrate, with a TODO).ShadowCastingModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError(). An open set since 1.0, so a mode a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name,casts,drawsColorandcastsFromEveryFaceare there;indexis not.ShadowCastingMode.drawsColour(dart fix).ShadowCastingMode.drawsColourisdrawsColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ShadowFaceScheduler(dart fix).ShadowFaceScheduleris imported frompackage:flutter3d_core/flutter3d_core.dart.ShadowFaceScheduler.recordDrawn(migrate).ShadowFaceScheduler.recordDrawn(x0)isShadowFaceScheduler.recordDrawn(only: x0). The faces drawn this frame are a named argument:recordDrawn(faces)isrecordDrawn(only: faces).ShadowSettings(nothing to do).maxResolutionandmaxCubeTileare static getters with the values they had (4096, 1024), so a later release can raise them. Every read compiles; only aconstexpression that used one does not, and it takes the number or a non-const value.ShadowSettings.sunAngularRadius(nothing to do). Only the value of the constant moved, to the sun's radius of 0.2666° to three figures; it is alsoSkySettings.sunAngularRadius's default now. Code that reads it gets the new one.ShadowSlotAllocator(dart fix).ShadowSlotAllocatoris imported frompackage:flutter3d_core/flutter3d_core.dart.Skeleton(nothing to do).maxJointsis a static getter with the value it had (64), so a later release can raise it. Every read compiles; only aconstexpression that used it does not, and it takes the number or a non-const value.SkippedPass(migrate).SkippedPassis a class:.nameis.name,.reasonis.reason; a destructuring pattern is yours to rewrite.SkippedPassis a final class with the samenameandreason, equal by both as the record was; one is built withSkippedPass(name: …, reason: …). Only a destructuring pattern names the class.SkyColor(by hand). ASkyColorreturns a linearLinearColorrather than aVector4:(look) => Vector4(r, g, b, 1)is(look) => LinearColor(r, g, b).SkyColour(dart fix).SkyColourisSkyColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SkyGradient(migrate).zenith:,horizon:,nadir:,sunColor:,color:ofSkyGradient:Vector3(x, y, z)isLinearColor(x, y, z).SkyGradient's stops andsunColorare linearLinearColors, and theSkyColorit hands out returns aLinearColor.SkyGradient.SkyGradient(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SkyGradient.colour(dart fix).SkyGradient.colouriscolor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SkyGradient.sunColour(dart fix).SkyGradient.sunColourissunColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SkySettings(migrate).zenith:,horizon:,nadir:,sunColor:,tint:ofSkySettings:Vector3(x, y, z)isLinearColor(x, y, z). The sky's colours areLinearColors:zenith,horizon,nadir,sunColorandtint, in the constructor, incopyWithand from theresolved*getters. The numbers mean what they did (linear, scene-referred), soVector3(0.1, 0.2, 0.5)becomesLinearColor(0.1, 0.2, 0.5), orvector.toLinearColor(); read.r,.g,.bwhere you read.x,.y,.z.directionToSunstays aVector3, andsamplestill answers one.SkySettings.sunIntensity(by hand). The disc'ssunIntensityis lux since 1.0, as a directional light is: multiply a pre-1.0 number byLightNode.defaultIntensity. Zero is still no disc.SolidColorTexture(migrate).color: Vector3(x, y, z)ofSolidColorTextureiscolor: LinearColor.fromSrgb(x, y, z).SolidColorTexture(color)takes a linearLinearColorand stores it sRGB-encoded, as a base-colour texture's texels are. TheVector4it took was the encoded texel, so the same bytes areSolidColorTexture(LinearColor.fromSrgb(r, g, b, a)), orSolidColorTexture.texel(r, g, b, a: a)for a texture of data rather than colour (a normal map's).coloristexel, the stored values;whiteandflatNormalare constants.SortMode(migrate, with a TODO).SortModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError(). An open set since 1.0, so a sort a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,valuesandnameare there;indexis not.SplatCloud.SplatCloud(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SplatCloud.centres(dart fix).SplatCloud.centresiscenters. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SplatCloud.colours(dart fix).SplatCloud.coloursiscolors. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SplatColourSpace(dart fix).SplatColourSpaceisSplatColorSpace. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SplatComposite(migrate, with a TODO).SplatCompositeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().SplatCompositeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.SplatOctreeException(nothing to do).SplatOctreeExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon SplatOctreeExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.SplatPlyException(nothing to do).SplatPlyExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon SplatPlyExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.SplatSpzException(nothing to do).SplatSpzExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon SplatSpzExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.StlLoader.decode(migrate).StlLoader.decodetakes oneModelDecodeContext: an override reads its old parameters from it (parameter 1 is.bytes, parameter 2 is.request, parameter 3 is.resolveUri), and a call builds one.StlLoader.decodetakes oneModelDecodeContextwhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.StlLoader.handles(migrate).StlLoader.handlestakes oneModelProbe: an override reads its old parameters from it (parameter 1 is.fileName, parameter 2 is.bytes), and a call builds one.StlLoader.handlestakes oneModelProbewhere it took its parameters. A model decoder is the plugin boundary for reading; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.StlModelWriter.write(migrate).StlModelWriter.writetakes oneModelWriteContext: an override reads its old parameters from it (parameter 1 is.document,baseName:is.baseName), and a call builds one.StlModelWriter.writetakes oneModelWriteContextwhere it took its parameters. A model writer is a hook a format implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.StlNormals(migrate, with a TODO).StlNormalsis a class: aswitchover it that names every value gains_ => throw UnimplementedError().StlNormalsis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.SurfaceAlphaMode(migrate, with a TODO).SurfaceAlphaModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().SurfaceAlphaModeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.SurfaceMaterial(migrate).baseColor: Vector3(x, y, z)ofSurfaceMaterialisbaseColor: LinearColor.fromSrgb(x, y, z).SurfaceMaterial.baseColorandemissiveare linearLinearColors.baseColorheld the authored sRGB-encoded tint as aVector4; it isLinearColor.fromSrgb(r, g, b, a)of the same numbers. Files keep what they stored: each reader and writer converts.SurfaceMaterial.emissive(migrate).emissive: Vector3(x, y, z)ofSurfaceMaterial.emissiveisemissive: LinearColor(x, y, z).emissiveis a linearLinearColor:Vector3(r, g, b)isLinearColor(r, g, b), the same numbers.TangentMethod(migrate, with a TODO).TangentMethodis a class: aswitchover it that names every value gains_ => throw UnimplementedError(). An open set since 1.0, so a method a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,valuesandnameare there;indexis not.TemporalClip(migrate, with a TODO).TemporalClipis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TemporalClipis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis there too.TextureSampling.TextureSampling(nothing to do). Only the wrap's type was renamed,TextureWraptoSamplerAddressMode; that rename's own fix carries every use.TextureSampling.wrapS(nothing to do). Only the wrap's type was renamed; that rename's own fix carries every use.TextureSampling.wrapT(nothing to do). Only the wrap's type was renamed; that rename's own fix carries every use.TextureWrap(dart fix).TextureWrapis imported frompackage:flutter3d_hardware/flutter3d_hardware.dart. One type says how a texture wraps:TextureWrapisSamplerAddressMode, the type aSamplerDescriptoralready took, soTextureSampling.wrapSandwrapThand a sampler their value as it is.repeatandclampToEdgekeep their names;mirroredRepeatismirror. Files keep their own words for it.package:flutter3dexports it; a file that imported onlypackage:flutter3d_core/formats.dartimportspackage:flutter3d_hardware/flutter3d_hardware.dartfor it.TextureWrap(migrate, with a TODO).TextureWrapis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TextureWrapis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.TextureWrap.mirroredRepeat(dart fix).TextureWrap.mirroredRepeatismirror.TextureWrap.mirroredRepeatisSamplerAddressMode.mirror, the same wrap.ThinLens(migrate).ThinLensis a class:.focalLengthis.focalLength,.sensorWidthis.sensorWidth; a destructuring pattern is yours to rewrite.DepthOfFieldSettings.lensForanswers aThinLens, a class, where it answered a record:final ThinLens(:focalLength) = …where the pattern wasfinal (:focalLength, :sensorWidth) = ….TonemapCurve.agxFull(dart fix).TonemapCurve.agxFullisagx.TonemapCurve.agxis the full AgX transform since 0.7.4;agxFullis the same curve under its old name.TonemapCurve.values(nothing to do). The list no longer holdsagxFull, which is gone; it drew the same picture asagx. Code that walks the list sees five curves where it saw six.TransparencyMode(by hand). An open set since 1.0: aswitchover it needs a_ =>case.values,name,indexandbyNameare there.TriangleBvh(nothing to do). Only the float32 ray in its signature changed:RayisLocalRay(core-Ray-LocalRayrenames it).TriangleHit(migrate).TriangleHitis a class:.triangleis.triangle,.distanceis.distance,.pointis.point; a destructuring pattern is yours to rewrite.TriangleBvh.raycastanswers aTriangleHit, a class with the record's fields as getters; a destructuring pattern names the class.TriggerCondition(by hand).AnimationConditionhas a new case,TriggerCondition: aswitchover aAnimationConditionthat names every case needs one for it, or a wildcard.TwoBoneIk(nothing to do). Only the animation pose in its signature changed:PoseisAnimationPose(core-Pose-AnimationPoserenames it).UniversalBlockFormat(migrate).UniversalBlockFormatis a class:.hasAlphais.hasAlpha; a destructuring pattern is yours to rewrite.universalBlockFormatanswers aUniversalBlockFormat, a class with the record's field as a getter.UsdzModelWriter.write(migrate).UsdzModelWriter.writetakes oneModelWriteContext: an override reads its old parameters from it (parameter 1 is.document,baseName:is.baseName), and a call builds one.UsdzModelWriter.writetakes oneModelWriteContextwhere it took its parameters. A model writer is a hook a format implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.VertexFetchOrder(migrate).VertexFetchOrderis a class:.indicesis.indices,.oldToNewis.oldToNew; a destructuring pattern is yours to rewrite.optimizeVertexFetchanswers aVertexFetchOrder, a class with the record's fields as getters; a destructuring pattern names the class.ViewModelNode(nothing to do). Only the frame type in its signature changed:NodeFrameisRenderFrame(core-NodeFrame-RenderFramerenames it).VolumetricFogSettings(migrate).color:,ambient:ofVolumetricFogSettings:Vector3(x, y, z)isLinearColor(x, y, z).colorandambientare linearLinearColors; seef2-core-settings-colours.XraySettings(migrate).color: Vector3(x, y, z)ofXraySettingsiscolor: LinearColor(x, y, z).coloris a linearLinearColor; seef2-core-settings-colours.advanceTime(nothing to do). Answers aPlayheadStepwhose getters are the record's fields,time,reversingandstopped, so a read of one is unchanged; a destructuring pattern names the class (2b-core-PlayheadStep).animationTrackKey(dart fix).animationTrackKeyis imported frompackage:flutter3d_core/flutter3d_core.dart.averageCacheMissRatio(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.broadcastArguments(nothing to do). Only a type it names was renamed (a name Flutter or Dart also declares); the type's rename carries its own fix, and a call needs none.buildPolyline(by hand).colors:is aList<LinearColor>andcolor:aLinearColor, linear as every vertex colour is:Vector4(r, g, b, a)isLinearColor(r, g, b, a).buildPolyline(dart fix). Public names are spelled the American way and say what they hold:colours:iscolors:,colour:iscolor:, the same values.chooseUniversalTarget(dart fix).chooseUniversalTargetis imported frompackage:flutter3d_core/flutter3d_core.dart.clusterEye(dart fix).clusterEyeis imported frompackage:flutter3d_core/flutter3d_core.dart.decodeImagePure(by hand).decodeImagePurecompletes with anRgba8Imageor fails with anImageFormatException; it no longer completes with null. Drop the!and the null check, and catch the exception where an unreadable image is expected.decodeJpeg(by hand).decodeJpegreturns aDecodedImageand throws anImageFormatExceptioninstead of returning null;decodePng(b) ?? decodeJpeg(b)becomesisPng(b) ? decodePng(b) : decodeJpeg(b)inside atry.decodeOctahedral(dart fix).decodeOctahedralis imported frompackage:flutter3d_core/flutter3d_core.dart.decodePng(by hand).decodePngreturns aDecodedImageand throws anImageFormatExceptionsaying why instead of returning null. Replaceif (decoded == null)with atry/on ImageFormatException, or askisPng(bytes)first when only the signature matters.encodeOctahedral(dart fix).encodeOctahedralis imported frompackage:flutter3d_core/flutter3d_core.dart.ensureSphereCapacity(dart fix).ensureSphereCapacityis imported frompackage:flutter3d_core/flutter3d_core.dart.escapesAssetBase(dart fix).escapesAssetBaseis imported frompackage:flutter3d_core/flutter3d_core.dart.gather(migrate).sky: Vector3(x, y, z)ofgatherissky: LinearColor(x, y, z).gather(..., sky:)andgatherProbe(..., sky:)take a linearLinearColor, black by default:sky: Vector3(r, g, b)issky: LinearColor(r, g, b).gatherProbe(migrate).sky: Vector3(x, y, z)ofgatherProbeissky: LinearColor(x, y, z).sky:is a linearLinearColor; seef2-core-gather-sky.gatherProbe(dart fix).gatherProbeis imported frompackage:flutter3d_core/flutter3d_core.dart.impostorCard(dart fix). American spelling in identifiers:impostorCard(centre:)isimpostorCard(center:), the same point.impostorDecode(dart fix).impostorDecodeis imported frompackage:flutter3d_core/flutter3d_core.dart.impostorEncode(dart fix).impostorEncodeis imported frompackage:flutter3d_core/flutter3d_core.dart.jitterOffset(dart fix).jitterOffsetis imported frompackage:flutter3d_core/flutter3d_core.dart.kDefaultVertexCacheSize(dart fix).kDefaultVertexCacheSizeisdefaultVertexCacheSize. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kF3dHeaderBytes(dart fix).kF3dHeaderBytesisf3dHeaderBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kF3dMagic(dart fix).kF3dMagicisf3dMagic. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kF3dSectionEntryBytes(dart fix).kF3dSectionEntryBytesisf3dSectionEntryBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kF3dVersion(dart fix).kF3dVersionisf3dVersion. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix.kFmatVersion(dart fix).kFmatVersionisfmatVersion. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kImpostorGrid(dart fix).kImpostorGridisimpostorGrid. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kIrradianceReach(dart fix).kIrradianceReachis imported frompackage:flutter3d_core/flutter3d_core.dart.kKtx2HeaderBytes(dart fix).kKtx2HeaderBytesisktx2HeaderBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kKtx2HeaderOffset(dart fix).kKtx2HeaderOffsetisktx2HeaderOffset. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kKtx2Identifier(dart fix).kKtx2Identifierisktx2Identifier. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kKtx2IndexBytes(dart fix).kKtx2IndexBytesisktx2IndexBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kKtx2IndexOffset(dart fix).kKtx2IndexOffsetisktx2IndexOffset. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kKtx2LevelIndexEntryBytes(dart fix).kKtx2LevelIndexEntryBytesisktx2LevelIndexEntryBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kKtx2LevelIndexOffset(dart fix).kKtx2LevelIndexOffsetisktx2LevelIndexOffset. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kMaterialInputs(dart fix).kMaterialInputsismaterialInputs. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kMaterialTextureBindings(dart fix).kMaterialTextureBindingsismaterialTextureBindings. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kMaxPayload(dart fix).kMaxPayloadis imported frompackage:flutter3d_core/flutter3d_core.dart.kNeutralColor(dart fix).kNeutralColoris imported frompackage:flutter3d_core/flutter3d_core.dart.kNeutralJoints(dart fix).kNeutralJointsis imported frompackage:flutter3d_core/flutter3d_core.dart.kNeutralTangent(dart fix).kNeutralTangentis imported frompackage:flutter3d_core/flutter3d_core.dart.kNeutralWeights(dart fix).kNeutralWeightsis imported frompackage:flutter3d_core/flutter3d_core.dart.kNoHit(dart fix).kNoHitis imported frompackage:flutter3d_core/flutter3d_core.dart.kPayloadBits(dart fix).kPayloadBitsispayloadBits. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kPayloadMask(dart fix).kPayloadMaskis imported frompackage:flutter3d_core/flutter3d_core.dart.kRadixThreshold(dart fix).kRadixThresholdis imported frompackage:flutter3d_core/flutter3d_core.dart.kRootMotionExtra(dart fix).kRootMotionExtraisrootMotionExtra. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kSortKeyBits(dart fix).kSortKeyBitsis imported frompackage:flutter3d_core/flutter3d_core.dart.kSplatFloatsPerVertex(dart fix).kSplatFloatsPerVertexis imported frompackage:flutter3d_core/flutter3d_core.dart.kSplatKeyMax(dart fix).kSplatKeyMaxis imported frompackage:flutter3d_core/flutter3d_core.dart.kSplatLeanLimit(dart fix).kSplatLeanLimitis imported frompackage:flutter3d_core/flutter3d_core.dart.kSplatLowPass(dart fix).kSplatLowPassis imported frompackage:flutter3d_core/flutter3d_core.dart.kSplatOctreeExtension(dart fix).kSplatOctreeExtensionissplatOctreeExtension. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kSplatOctreeHeaderBytes(dart fix).kSplatOctreeHeaderBytesissplatOctreeHeaderBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kSplatOctreeNodeBytes(dart fix).kSplatOctreeNodeBytesissplatOctreeNodeBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kSplatOctreeVersion(dart fix).kSplatOctreeVersionissplatOctreeVersion. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kSplatPageBytesPerSplat(dart fix).kSplatPageBytesPerSplatissplatPageBytesPerSplat. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kSplatReach(dart fix).kSplatReachis imported frompackage:flutter3d_core/flutter3d_core.dart.kSplatShC0(dart fix).kSplatShC0issplatShC0. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kSplatVerticesPerSplat(dart fix).kSplatVerticesPerSplatissplatVerticesPerSplat. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kSpzLatestVersion(dart fix).kSpzLatestVersionisspzLatestVersion. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kUniversalBlockKey(dart fix).kUniversalBlockKeyisuniversalBlockKey. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kUniversalBlockRgb(dart fix).kUniversalBlockRgbisuniversalBlockRgb. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kUniversalBlockRgba(dart fix).kUniversalBlockRgbaisuniversalBlockRgba. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.linearFromSrgb(migrate).linearFromSrgb(…)becomesLinearColor.fromSrgb(…).toVector4().linearFromSrgb(r, g, b, a)isLinearColor.fromSrgb(r, g, b, a), the same decoded numbers in the engine's one colour type, which every vertex-colour call now takes;.toVector4()of it is the vector the function returned, for code of your own that keeps one.lookAtRightHanded(dart fix).lookAtRightHandedis imported frompackage:flutter3d_core/flutter3d_core.dart.mergeSplats(dart fix). Public names are spelled the American way and say what they hold:centre:iscenter:, the same values.neutralColor(by hand).neutralColorisLinearColor.white, a constant, where it was a sharedVector4;Vector4.copy(neutralColor)isneutralColor.optimizeTriangleOrder(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.optimizeVertexCache(nothing to do). Only the constant itscacheSizedefaults to is renamed (kDefaultVertexCacheSizetodefaultVertexCacheSize, an entry of its own), with the same value, so every call compiles and behaves as before.optimizeVertexCacheis exported byflutter3dagain, as at 0.8.5.optimizeVertexFetch(nothing to do). Answers aVertexFetchOrderwhose getters are the record's fields,indicesandoldToNew, so a read of one is unchanged; a destructuring pattern names the class (2b-core-VertexFetchOrder).packLanes(dart fix).packLanesis imported frompackage:flutter3d_core/flutter3d_core.dart.packSceneSpheres(dart fix).packSceneSpheresis imported frompackage:flutter3d_core/flutter3d_core.dart.package:flutter3d_hardware/flutter3d_hardware.dart(dart fix). Names re-exported frompackage:flutter3d_hardware/flutter3d_hardware.dartare imported frompackage:flutter3d_hardware/flutter3d_hardware.dart.package:flutter3d_core/flutter3d_core.dartno longer re-exports the graphics vocabulary. A file that namesGraphicsDevice,TextureFormator a descriptor importspackage:flutter3d_hardware/flutter3d_hardware.dart, and the project depends onflutter3d_hardware.package:flutter3d/flutter3d.dartstill names what an application spells of it.paintSky(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.parseSplatPly(dart fix). Public names are spelled the American way and say what they hold:colourSpace:iscolorSpace:, the same values.parseSplatSpz(dart fix). Public names are spelled the American way and say what they hold:colourSpace:iscolorSpace:, the same values.probeFaceIsMirrored(dart fix).probeFaceIsMirroredis imported frompackage:flutter3d_core/flutter3d_core.dart.probeFaceViewProjection(dart fix).probeFaceViewProjectionis imported frompackage:flutter3d_core/flutter3d_core.dart.radixSortPackedKeys(dart fix).radixSortPackedKeysis imported frompackage:flutter3d_core/flutter3d_core.dart.rayAabb(nothing to do). Only the float32 ray in its signature changed:RayisLocalRay(core-Ray-LocalRayrenames it).raySphere(nothing to do). Only the float32 ray in its signature changed:RayisLocalRay(core-Ray-LocalRayrenames it).rayTriangle(nothing to do). Only the float32 ray in its signature changed:RayisLocalRay(core-Ray-LocalRayrenames it).readFmat(by hand). The readers in flutter3d_core throw their own leaf ofFlutter3dFormatExceptioninstead ofdart:core'sFormatException:GltfFormatException(glTF/GLB,GlbContainer,decodeDataUri),FmatFormatException(readFmat),CubeLutFormatException(CubeLut.parse),MeshoptFormatException,FbxFormatException,MaterialBundleExceptionandAnimationGraphFormatException(AnimationGraphJson.decode). Anon FormatExceptionaround one of them no longer catches: catch the leaf, orFlutter3dFormatExceptionfor all of them.samplerOptionsFor(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.selectVisibleClusters(dart fix).selectVisibleClustersis imported frompackage:flutter3d_core/flutter3d_core.dart.sortSplatKeys(dart fix).sortSplatKeysis imported frompackage:flutter3d_core/flutter3d_core.dart.specialiseMaterial(dart fix).specialiseMaterialisspecializeMaterial. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.splatColour(dart fix).splatColourissplatColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.universalBlockFormat(nothing to do). Answers aUniversalBlockFormatwhosehasAlphais the record's one field, so a read of it is unchanged; a destructuring pattern names the class (2b-core-UniversalBlockFormat).uploadCoatMap(dart fix).uploadCoatMapis imported frompackage:flutter3d_core/flutter3d_core.dart.uploadEncodedImage(migrate, with a TODO).uploadEncodedImagethrowsFlutter3dExceptionwhere it returned null: a null check beside a call becomestry … on Flutter3dException. It throws where it answered null, saying why: anImageFormatExceptionfor bytes it cannot read, aKtx2FormatExceptionfor a KTX2 file this build cannot open, aDeviceResourceExceptionfor a texture the device refuses. CatchFlutter3dExceptionwhere a missing texture was fine.uploadRgba8(migrate, with a TODO).uploadRgba8throwsDeviceResourceExceptionwhere it returned null: a null check beside a call becomestry … on DeviceResourceException. It throws the device'sDeviceResourceExceptionwhere it answered null for a texture the device refused.uploadSheenMap(dart fix).uploadSheenMapis imported frompackage:flutter3d_core/flutter3d_core.dart.
flutter3d_cpu #
- 167 names were the package's own (gone internal): they are not exported since 1.0.0-rc.1, and the import of
flutter3d_cputhat brought them gets one diagnostic for all of them.BlinnPhongShader,BloomDownsampleShader,BloomThresholdShader,BloomUpsampleShader,CameraVelocityShader,CompositeShader,ContactShadowResolveShader,ContactShadowShader,CpuPipeline,DebugLineShader,DebugLineVertexShader,DepthOfFieldShader,DepthPyramidShader,DofTileMaxShader,EasuShader,FieldDecayShader,FullscreenVertexShader,FxaaShader,IrradianceConvolveShader,LambertShader,LayoutFetch,LightSample,LightShaftsShader,LocalExposureBlurShader,LocalExposureShader,LuminanceShader,MeshInstancedVertexShader,MeshLightmappedVertexShader,MeshSkinnedVertexShader,MeshVertexShader,MotionBlurShader,MrtProbeShader,NormalsShader,ObjectIdShader,PackedFetch,ParticleMeshShader,ParticleMeshVertexShader,ParticleShader,ParticleSixWayShader,ParticleTexturedShader,ParticleVertexShader,PbrShader,ProbePrefilterShader,ReactiveShader,ReactiveSpriteShader,ReflectionsShader,SceneColourCopyShader,ShadowCopyShader,ShadowDepthMaskedShader,ShadowDepthShader,ShadowDistanceMaskedShader,ShadowDistanceShader,ShadowTileResetShader,ShadowTileResetVertexShader,SkyCubeShader,SkyCubeVertexShader,SkyShader,SkyVertexShader,SplatHashedShader,SplatShader,SsaoBlurShader,SsaoShader,Surface,TemporalAccumulateShader,TemporalResolveShader,ToonShader,UvFootprint,VelocityInstancedVertexShader,VelocityNeighborMaxShader,VelocityShader,VelocitySkinnedVertexShader,VelocityTileMaxShader,VelocityVertexShader,VertexTextureProbeShader,VertexTextureProbeVertexShader,ViewportShadeShader,VolumetricFogShader,VolumetricFogUpsampleShader,WboitResolveShader,XrayShader,accumulateLights,agxSigmoid,applyCommonMaps,applyEmissiveMap,applyFog,applyMetallicRoughnessMap,applyNormalMap,applyOcclusionMap,atlasDistance,attenuation,bayerCell,bloomSource,blueNoise,clusterAt,clusterRow,clustered,contributorLight,contributorLightCount,decodeOctahedral,diskTaps,encodeOctahedral,eyeDistance,fract,inSlots,irradianceEnabled,kColour,kExtraLights,kMapBaseColor,kMapEmissive,kMapMetallicRoughness,kMapNormal,kMapOcclusion,kMaxLights,kNormal,kPosition,kTangent,kTexcoord,kUnimplementedCpuFragmentShaders,kUnimplementedCpuVertexShaders,kVColour,kVLightmap,kVNormal,kVTangent,kVUv,kVWorld,lightCount,lightListLane,lightListRow,lightListScale,lightListTexel,mapUv,materialLodBias,pixelNoise,pixelRay,pointShadowFactor,premultiplies,probeFaceDirection,readSurface,rectangleClosestPoint,rectangleFormFactor,sampleIrradiance,sampleLight,sampleLightmap,shadowFactor,shadowNoise,shadowSlots,smoothstep,softParticleFade,splatNoiseOffset,ssaoKernel,toLinear,toSrgb,tonemapAces,tonemapAces2,tonemapAgx,tonemapAgxFull,tonemapBy,tonemapNeutral,tonemapReinhard,uvFootprint,viewDepth,vogelDisc,weightedBlendedWeight,worldAtDepth,writeLit,writeSurface,writeWeightedBlended. A stage of your own is written with the kit that stays —CpuStage,CpuFragmentShader,CpuVertexShader,ShaderBindings,FragmentContext— and a test that wanted an unlit stand-in usescpuUnlitStagefrompackage:flutter3d_cpu/testing.dart. A package that compiles onto the engine's stages imports them frompackage:flutter3d_cpu/builtin.dart, which semver does not cover. The engine'sdecodeOctahedral, fromflutter3d_core. The engine'sencodeOctahedral, fromflutter3d_core. BoundTexture.sampler(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.CpuComputeShader(by hand). Anabstract base classsince 1.0: writeextends CpuComputeShaderwhere you wroteimplements CpuComputeShader, mark the classfinal,baseorsealed, and give aconstconstructor asuper()it now has.CpuDevice(by hand). WhatCpuDeviceinherits fromGraphicsDevicechanged: the texture creators answer a non-null handle and throwDeviceResourceExceptionorUnsupportedCapabilityExceptionwhere they answered null,readPixelsisreadback, and the deprecatedsupportsX,maxAnisotropyandmaxColorAttachmentsarefeatures.has(...)andlimits. The entries forGraphicsDevicesay each.CpuDevice.createPipeline(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.CpuDevice.createStorageBuffer(migrate).CpuDevice.createStorageBufferbecomesx.createBuffer(BufferDescriptor(lengthInBytes: {0}.lengthInBytes, usage: BufferUsage.standardStorage), contents: {0}). One call makes every buffer: a storage buffer iscreateBufferwithBufferUsage.standardStorageand the bytes ascontents, plusBufferUsage.hostReadableorBufferUsage.indexwhere you asked for them by name.CpuDevice.createTexture(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.CpuDevice.readPixels(dart fix).CpuDevice.readPixelsisreadback.CpuEncoder(by hand). ACpuEncoderis made byCpuDevice.beginRenderPass, which hands it the device's features, format support and timestamp clock. Code that constructed one directly opens the pass on aCpuDeviceinstead.CpuFragmentShader(by hand). Anabstract base classsince 1.0: writeextends CpuFragmentShaderwhere you wroteimplements CpuFragmentShader, mark the classfinal,baseorsealed, and give aconstconstructor asuper()it now has.CpuVertexShader(by hand). Anabstract base classsince 1.0: writeextends CpuVertexShaderwhere you wroteimplements CpuVertexShader, mark the classfinal,baseorsealed, and give aconstconstructor asuper()it now has.CpuVertexShaderByIndex(by hand). Anabstract base classsince 1.0: writeextends CpuVertexShaderByIndexwhere you wroteimplements CpuVertexShaderByIndex, mark the classfinal,baseorsealed, and give aconstconstructor asuper()it now has.DepthOfFieldShader.circleOfConfusion(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.UnlitShader(by hand). was the software rasteriser's own: one of the engine's shader stages in Dart, a helper they share, or the encoder. It is not exported since 1.0, so a change to the engine's shaders is not a major release. A stage of your own is written with the kit that stays —CpuStage,CpuFragmentShader,CpuVertexShader,ShaderBindings,FragmentContext— and a test that wanted an unlit stand-in usescpuUnlitStagefrompackage:flutter3d_cpu/testing.dart.VertexFetch(by hand).VertexFetchis closed: its two kinds areLayoutFetchandPackedFetch. Reading vertices through one is unchanged; a fetch of your own builds aLayoutFetchover its buffer layout instead.ensureCpuBackendRegistered(by hand). There is no process-wide registry since 1.0:registerCpuBackend(registry, materialCompiler: ...)adds the software rasteriser to an engine's ownDeviceRegistry, as its fallback.flutter3d_app'splatformDevices()does it for this platform.kMeshVaryings(nothing to do). Only the value of the constant moved; code that readskMeshVaryingsgets the new one. It is a version or a layout size the engine stamps and checks itself.
flutter3d_editor_core #
AddLevelLight(nothing to do). Not a new case ofEditorCommand: it isAddLightunder its new name.AddLight(dart fix).AddLightisAddLevelLight. The editor's command isAddLevelLight;AddLightis the modeller's, influtter3d_model_core. Its journal name is stilladdLight, so a journal written before reads the same.ApplyOverrides(by hand).EditorCommandhas a new case,ApplyOverrides, one of the seven prefab commands: aswitchoverEditorCommandthat names every case needs one for it, or a wildcard. Nothing else changes; a command list built fromeditorCommandNamespicks it up by itself.CreatePrefab(by hand).EditorCommandhas a new case,CreatePrefab, one of the seven prefab commands: aswitchoverEditorCommandthat names every case needs one for it, or a wildcard. Nothing else changes; a command list built fromeditorCommandNamespicks it up by itself.DocumentText.compact(migrate).DocumentText.compact(x0, x1)isDocumentText.compact(x0, depth: x1). The indentation depth is a named argument:compact(value, 2)iscompact(value, depth: 2).Editing(nothing to do).kindandselectedbecame a getter and setter pair over the selection; reading and assigning them read the same.Editingis final, so nothing overrode them.Editing.mayOverwrite(dart fix).Editing.mayOverwriteiscanOverwrite. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.Editing.setOverride(nothing to do). Overrides are stored by id path; a path given by name or#<index>is still accepted and converted, so callers need no change.EditorCommand(migrate, with a TODO).EditorCommandis a class: aswitchover it that names every value gains_ => throw UnimplementedError().EditorCommandis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.EditorHistory(nothing to do).runtakes aDocumentCommand, which everyEditorCommandis: the parameter widened, so every call still fits.GeneratorRefused(dart fix).GeneratorRefusedisGeneratorException.GeneratorRefusedisGeneratorException(decision H: a type that is thrown is named*Exception), with the same members. It now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly, soon Exceptionstill catches it;dart fixrenames every use.GeneratorSource(migrate).GeneratorSourceis a base mixin class:implements GeneratorSourcebecomeswith GeneratorSource, on abaseclass.Handle.Handle(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Handle.centre(dart fix).Handle.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Handle.tint(migrate).tint: Vector3(x, y, z)ofHandle.tintistint: LinearColor(x, y, z). A handle'stintis a linearLinearColor, as every colour the engine takes is:Vector3(r, g, b)isLinearColor(r, g, b), and a read of.xis.r.LevelBatch(migrate).LevelBatchis a class:.nodeis.node,.meshis.mesh,.boundsis.bounds,.brushis.brush; a destructuring pattern is yours to rewrite.LevelBatch(influtter3d_level_scenenow) is a final class with the samenode,mesh,boundsandbrush; only a destructuring pattern names the class.LevelBatch(dart fix).LevelBatchis imported frompackage:flutter3d_level_scene/flutter3d_level_scene.dart. Building a scene from a level left the editor's core forflutter3d_level_scene, which the application's level loader and the editor both stand on.dart fixchanges the import, andmigrateadds the dependency.LevelBatching(dart fix).LevelBatchingis imported frompackage:flutter3d_level_scene/flutter3d_level_scene.dart. Building a scene from a level left the editor's core forflutter3d_level_scene, which the application's level loader and the editor both stand on.dart fixchanges the import, andmigrateadds the dependency.LevelScene(dart fix).LevelSceneis imported frompackage:flutter3d_level_scene/flutter3d_level_scene.dart. Building a scene from a level left the editor's core forflutter3d_level_scene, which the application's level loader and the editor both stand on.dart fixchanges the import, andmigrateadds the dependency.LevelSceneParts(dart fix).LevelScenePartsis imported frompackage:flutter3d_level_scene/flutter3d_level_scene.dart. Building a scene from a level left the editor's core forflutter3d_level_scene, which the application's level loader and the editor both stand on.dart fixchanges the import, andmigrateadds the dependency.LightPlan.changes(dart fix).LightPlan.changesishasChanges. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.Listed(dart fix).ListedisListedPiece. A row of a level's listing isListedPiece, a piece and its index;Listedis the modeller's row of a project.Look.tint(migrate).tint: Vector3(x, y, z)ofLook.tintistint: LinearColor(x, y, z). A look'stintis a linearLinearColor, as every colour the engine takes is:Vector3(r, g, b)isLinearColor(r, g, b), and a read of.xis.r.Looks.tintFor(nothing to do). The call is unchanged and so is the tint a look gives; only its type is, aLinearColor?whose channels arer,gandb, which is what a gizmo'stintnow takes as it is.MoveBy(dart fix).MoveByisMoveSelectionBy. The editor's command, which moves whatever is selected, isMoveSelectionBy;MoveByis the modeller's, which moves objects by id. Its journal name is stillmoveBy.MoveSelectionBy(nothing to do). Not a new case ofEditorCommand: it isMoveByunder its new name.OpenKind(dart fix).OpenKindis imported frompackage:flutter3d_sim/flutter3d_sim.dart. The kind that accepts a type and gives it no meaning was declared twice, here and influtter3d_game; it isflutter3d_sim's now, besideEntityKind, and both use it.vocabularyOfis unchanged.Part.Part(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Part.color(migrate).color: Vector3(x, y, z)ofPart.coloriscolor: LinearColor(x, y, z). A part'scoloris a linearLinearColor, as every colour the engine takes is:Vector3(r, g, b)isLinearColor(r, g, b), and a read of.xis.r.Part.colour(dart fix).Part.colouriscolor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Piece(migrate, with a TODO).Pieceis a class: aswitchover it that names every value gains_ => throw UnimplementedError().Pieceis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.PlacePrefab(by hand).EditorCommandhas a new case,PlacePrefab, one of the seven prefab commands: aswitchoverEditorCommandthat names every case needs one for it, or a wildcard. Nothing else changes; a command list built fromeditorCommandNamespicks it up by itself.Placeable.tint(migrate).tint: Vector3(x, y, z)ofPlaceable.tintistint: LinearColor(x, y, z). A palette row'stintis a linearLinearColor, as every colour the engine takes is:Vector3(r, g, b)isLinearColor(r, g, b), and a read of.xis.r.PluginCommand(by hand). A plugin's commands and components are published under its id:addCommand('sink', ...)through pluginboats's view registersboats.sink, so yourPluginCommand.namereturns'boats.sink', and a component kindbuoyancybecomesboats.buoyancy.PluginCommand(by hand).DocumentCommandhas a new case,PluginCommand: aswitchover aDocumentCommandthat names every case needs one for it, or a wildcard.RevertOverrides(by hand).EditorCommandhas a new case,RevertOverrides, one of the seven prefab commands: aswitchoverEditorCommandthat names every case needs one for it, or a wildcard. Nothing else changes; a command list built fromeditorCommandNamespicks it up by itself.SetOverride(by hand).EditorCommandhas a new case,SetOverride, one of the seven prefab commands: aswitchoverEditorCommandthat names every case needs one for it, or a wildcard. Nothing else changes; a command list built fromeditorCommandNamespicks it up by itself.SetPrefabField(by hand).EditorCommandhas a new case,SetPrefabField, one of the seven prefab commands: aswitchoverEditorCommandthat names every case needs one for it, or a wildcard. Nothing else changes; a command list built fromeditorCommandNamespicks it up by itself.UnpackPrefab(by hand).EditorCommandhas a new case,UnpackPrefab, one of the seven prefab commands: aswitchoverEditorCommandthat names every case needs one for it, or a wildcard. Nothing else changes; a command list built fromeditorCommandNamespicks it up by itself.atLeast(migrate).atLeastbecomesatLeast({0}.toLinearColor(), {1}).toVector3().atLeasttakes and gives aLinearColor. A call with aVector3is rewritten to convert both ways, which keeps it compiling; pass the colour as aLinearColorwhere you have one.contentsOf(dart fix).contentsOfispiecesOf. What is in a level ispiecesOf(level), besidehandlesOf;contentsOfis the modeller's, over a project.kGizmoSize(dart fix).kGizmoSizeisgizmoSize. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kLight(dart fix).kLightispaletteLight. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kLooksFile(dart fix).kLooksFileislooksFile. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.meshDataOf(dart fix).meshDataOfis imported frompackage:flutter3d_level_scene/flutter3d_level_scene.dart. Building a scene from a level left the editor's core forflutter3d_level_scene, which the application's level loader and the editor both stand on.dart fixchanges the import, andmigrateadds the dependency.orderedSteps(dart fix).orderedStepsis imported frompackage:flutter3d_education/lesson.dart. Reading a lesson's steps in order is what a lesson viewer needs as much as an editor, and a viewer does not depend on an editor, so it isflutter3d_education'slesson.dartnow. The function is the same; the import and the dependency onflutter3d_educationchange.tintFor(nothing to do). The call is unchanged and so are the numbers it answers; only their type is, aLinearColorwhose channels arer,gandb, which is what a gizmo's and a palette row'stintnow take as they are.viewsAlong(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.
flutter3d_editor_mcp #
package:flutter3d_editor_mcp/flutter3d_editor_mcp.dart(migrate).package:flutter3d_editor_mcp/flutter3d_editor_mcp.dartispackage:flutter3d_mcp/editor.dart.flutter3d_editor_mcpis theeditor.dartlibrary offlutter3d_mcp, with the API it had;package:flutter3d_mcp/flutter3d_mcp.dartexports it beside its siblings. It was on pub.dev asflutter3d_editor_mcp.package:flutter3d_editor_mcp/src/(migrate).package:flutter3d_editor_mcp/src/ispackage:flutter3d_mcp/src/editor/. What was underflutter3d_editor_mcp'slib/src/is underlib/src/editor/offlutter3d_mcp. Importing it was never the public API; the main library above is.EditorSession(by hand).savereturns aFuture<Answer>now, because it writes the file asynchronously.awaitit where its answer was read.EditorTool(nothing to do). Its tools answer anAnswer, which carries the picture now; the rename ofPictureAnswercarries the fix, and a tool that readsdid,saysorpngreads them as before.editorMcpVersion(nothing to do). Only the value of the constant moved; code that readseditorMcpVersiongets the new one. It is a version or a layout size the engine stamps and checks itself.package:flutter3d_mcp_kit/flutter3d_mcp_kit.dart(nothing to do).AnswerandPictureAnswerare still exported by the editor's library,package:flutter3d_mcp/editor.dart; they come fromkit.dartof the same package, and the import moves with the rest.
flutter3d_editor_widgets #
ColorField(migrate, with a TODO).ColorFieldis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.NumberField(migrate, with a TODO).NumberFieldis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.NumberUnit(migrate, with a TODO).NumberUnitis a class: aswitchover it that names every value gains_ => throw UnimplementedError().NumberUnitis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.NumberUnit.metres(migrate).NumberUnit.metresbecomesNumberUnit.meters. Public names are spelled the American way:NumberUnit.metresisNumberUnit.meters, the same unit.kLabelBesideFrom(dart fix).kLabelBesideFromislabelBesideFrom. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.
flutter3d_foundation #
LinearColor(by hand). A colour the engine hands out is aLinearColor, a value, where it was a vector:color.scale(f)changed it in place and isholder.color = color.scaled(f)on whatever held it; vector arithmetic on two colours is ontoVector3()ortoVector4()of each, or on their channels.LinearColor(migrate).LinearColorbecomesx.to{type}(). A colour the engine hands out is aLinearColorwhere it was a vector: where code of your own still takes the vector,toVector3()ortoVector4()gives it, with the same linear numbers.LinearColor.w(migrate).LinearColor.wbecomesx.a. A colour the engine hands out is aLinearColorwhere it was a vector:.wof it is.a.LinearColor.x(migrate).LinearColor.xbecomesx.r. A colour the engine hands out is aLinearColorwhere it was a vector:.xof it is.r.LinearColor.y(migrate).LinearColor.ybecomesx.g. A colour the engine hands out is aLinearColorwhere it was a vector:.yof it is.g.LinearColor.z(migrate).LinearColor.zbecomesx.b. A colour the engine hands out is aLinearColorwhere it was a vector:.zof it is.b.
flutter3d_game #
ActorAppearance(migrate).ActorAppearanceis a base mixin class:implements ActorAppearancebecomeswith ActorAppearance, on abaseclass.ActorVisuals.sync(migrate).ActorVisuals.sync(x0)isActorVisuals.sync(alpha: x0). The blend between the last two steps is a named argument:visuals.sync(alpha)isvisuals.sync(alpha: alpha).AutomapPainter(migrate, with a TODO).AutomapPainteris afinalclass: a class that extended or implemented it gets a TODO. A painter isfinalsince 1.0: paint with one from aCustomPainterof your own instead of extending it.AutomapPainter(dart fix).AutomapPainteris imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.AutomapPainter.AutomapPainter(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.AutomapPainter.metersAcross(nothing to do).metersAcrossismetresAcrossunder its American name, which that member's rename entry carries.AutomapPainter.metresAcross(dart fix).AutomapPainter.metresAcrossismetersAcross. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.AutomapView(migrate, with a TODO).AutomapViewis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.AutomapView(dart fix).AutomapViewis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.AutomapView.AutomapView(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.AutomapView.metersAcross(nothing to do).metersAcrossismetresAcrossunder its American name, which that member's rename entry carries.AutomapView.metresAcross(dart fix).AutomapView.metresAcrossismetersAcross. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.AxisBinding(nothing to do).ActionBindingis new in 1.0, sealed with its five shapes from the start, andAxisBindingis one of them. No 0.8 code has aswitchoverActionBindingto be missing a case.AxisComposite(nothing to do).ActionBindingis new in 1.0, sealed with its five shapes from the start, andAxisCompositeis one of them. No 0.8 code has aswitchoverActionBindingto be missing a case.Bindings.takeFrom(dart fix).Bindings.takeFromiscopyFrom. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.BugReportTape(migrate).BugReportTapeis a class:.startis.start,.tapeis.tape; a destructuring pattern is yours to rewrite.BugReportTapeis a final class with the samestartandtape; only a destructuring pattern names the class.ButtonBinding(nothing to do).ActionBindingis new in 1.0, sealed with its five shapes from the start, andButtonBindingis one of them. No 0.8 code has aswitchoverActionBindingto be missing a case.CloudDocument(by hand).CloudFetchhas a new case,CloudDocument: aswitchover aCloudFetchthat names every case needs one for it, or a wildcard.CloudEmpty(by hand).CloudFetchhas a new case,CloudEmpty: aswitchover aCloudFetchthat names every case needs one for it, or a wildcard.CloudMoved(by hand).CloudPuthas a new case,CloudMoved: aswitchover aCloudPutthat names every case needs one for it, or a wildcard.CloudStored(by hand).CloudPuthas a new case,CloudStored: aswitchover aCloudPutthat names every case needs one for it, or a wildcard.CloudUnavailable(by hand).CloudFetchhas a new case,CloudUnavailable: aswitchover aCloudFetchthat names every case needs one for it, or a wildcard.Credit(dart fix).Creditis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.Credit.Credit(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Credit.licence(dart fix).Credit.licenceislicense. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Credit.licenceUrl(dart fix).Credit.licenceUrlislicenseUrl. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Credit.traced(dart fix).Credit.tracedisisTraced. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.CreditsSection(by hand).headingdefaults to the player's language (Flutter3dGameLocalizations.art), andfootnotehas no default: a game that relied on "Sounds and surfaces are generated by this repository" passes its own line.CreditsSection(migrate, with a TODO).CreditsSectionis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.CreditsSection(dart fix).CreditsSectionis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.DemoFile(by hand).read,writeandclearare asynchronous, becauseStorageis: await them.DesktopInput(by hand).capture:takes aMouseCapture, the game's own: leave outcapture: PointerLock.instance, which is the default, and make a test's fake capture extendMouseCapture, whosechangesis aStream<bool>, true when the pointer is taken.DesktopInput(by hand). A slot is an action: bind a key toSlotActions.of(n)in the action map (DesktopInput.addSlotsTo(map, keys)), andDesktopInputrequests slotnon its press.addDefaultsTobinds the number row to the first four.DesktopInput(migrate).bindings: xofDesktopInputisactions: ActionMap(actions: ActionSet.common, buttons: x).DesktopInputreads anActionMap: passactions:wherebindings:was (ActionMap(actions: ActionSet.common, buttons: table)wraps an old table), and readactions.buttonswherebindingswas read.defaultBindings()isDesktopInput.addDefaultsTo(ActionMap(actions: ActionSet.common)).buttons, anddefaultActionMapis unchanged.DesktopInput.bindings(migrate).DesktopInput.bindingsbecomesx.actions.buttons. The table aDesktopInputreads is its map's buttons.DesktopInput.defaultBindings(migrate).DesktopInput.defaultBindingsbecomesx.addDefaultsTo(ActionMap(actions: ActionSet.common)).buttons. The keyboard's defaults are added to a map, whose buttons are the tabledefaultBindings()returned.DesktopInput.release(dart fix).DesktopInput.releaseisreleaseMouse. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.DragLook.take(dart fix).DragLook.takeisdrain. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.DualAxisBinding(nothing to do).ActionBindingis new in 1.0, sealed with its five shapes from the start, andDualAxisBindingis one of them. No 0.8 code has aswitchoverActionBindingto be missing a case.DualAxisComposite(nothing to do).ActionBindingis new in 1.0, sealed with its five shapes from the start, andDualAxisCompositeis one of them. No 0.8 code has aswitchoverActionBindingto be missing a case.FixtureAppearance(migrate).FixtureAppearanceis a base mixin class:implements FixtureAppearancebecomeswith FixtureAppearance, on abaseclass.FixtureAppearance.refresh(migrate).FixtureAppearance.refreshtakes oneFixtureRefreshContext: an override reads its old parameters from it (parameter 1 is.fixture, parameter 2 is.material), and a call builds one.FixtureAppearance.refreshtakes oneFixtureRefreshContextwhere it took its parameters. A fixture appearance is a hook a game implements, refreshed per fixture per frame, so the visuals reuse one context and an appearance must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.GameConfig(by hand).GameSettings(whatGameConfigbecame) is a value: change it withwithVolume(AudioBus.music, v),withValue(key, v),withoutValue(key)orcopyWith, each of which returns a new one. A volume isvolumeOf(AudioBus.music)where it wasvolumeOf('music'). A setting is a typedSettingKey:settingOf('pad.look', fallback)isvalueOf(GameSettingKeys.padLook), orchosenValueOf(key) ?? fallbackfor a default that is somebody else's (the system's reduce-motion); a game's own setting isSettingKey<T>('mygame.name', fallback: ...).bindingsisactions?.buttons: the controls are oneActionMap.fromJsontakesdefaultActions:and reads a file from before the envelope, moving its names to the namespaced ids.GameConfig(dart fix).GameConfigisGameSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.LevelWalk.spawnIn(nothing to do).spawnInreturns aSpawnPoint, a class whose gettersatandyawread as the record's fields did, sospawn.atandspawn.yaware unchanged; a destructuring(:at, :yaw)becomesSpawnPoint(:at, :yaw), which2f-game-SpawnPoint-classmarks.LightFixtureBuild(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).OpenKind(dart fix).OpenKindis imported frompackage:flutter3d_sim/flutter3d_sim.dart.OpenKindisflutter3d_sim's now, the same class the editor uses;openRegistryForis unchanged.PadAxisPair(by hand). Bind each direction of the axis as a button with a magnitude:InputSource.padHalfAxis('leftStickX', positive: false)to the negative action andpositive: trueto the positive one, in the action map's buttons.PadInput(by hand).PadInputreads anActionMap: passactions:wherebindings:was, and readactions.buttonswherebindingswas read.addDefaultsToandknowsPadtake the map (addDefaultsTo(map)returns it);defaultBindings()isPadInput.addDefaultsTo(ActionMap(actions: ActionSet.common)).buttons.PadInput(by hand).pad:takes aPadDevice, the game's own: leave outpad: Gamepad.instance, which is the default, writePadDevice.platform(slot: n)forGamepad(index: n), and make a test's fake pad extendPadDeviceand fill thePadReadingit is handed.heldButtonsholdsGamePadButtons, so compare withGamePadButton.startrather thanPadButton.start: acontainswith the old type still compiles and is always false.PadInput(by hand). What the sticks do is the action map's (seef4-game-PadRoutes);routes.lookRateislookRate.slotButtons: PadInput.dpadSlotsisPadInput.addSlotDefaultsTo(map), which binds the d-pad toSlotActions.storeSettingsis gone: the settings panel writes the dead zone and the look speed asGameSettingKeys, whichapplySettingsreads.PadInput.addDefaultsTo(migrate).PadInput.addDefaultsTobecomesPadInput.addDefaultsTo(ActionMap(actions: ActionSet.common, buttons: {0})).buttons.PadInput.addDefaultsToadds the pad's defaults to anActionMap: an old table goes in as its buttons, and the buttons are the table it returned.PadInput.bindings(migrate).bindings: xofPadInput.bindingsisactions: ActionMap(actions: ActionSet.common, buttons: x). APadInputreads anActionMap: an old table goes in as its buttons.PadInput.bindings(migrate).PadInput.bindingsbecomesx.actions.buttons. The table aPadInputreads is its map's buttons.PadInput.defaultBindings(migrate).PadInput.defaultBindingsbecomesx.addDefaultsTo(ActionMap(actions: ActionSet.common)).buttons. The pad's defaults are added to a map, whose buttons are the tabledefaultBindings()returned.PadPresses(nothing to do).offertakes theGameSettingsControllerthatgame-SettingsCubitrenames at the call site; nothing else changed.PadPresses.offer(migrate).menuButton: PadButton(x)ofPadPresses.offerismenuButton: GamePadButton(PadButton(x).id).menuButton:takes aGamePadButton, the game's own: writeGamePadButton.startforPadButton.start. The ids are the same, so a saved binding is unchanged.PadRoutes(by hand). A pad's sticks are bindings in the action map.PadRoutes.walkingis whatPadInput.addDefaultsTo(map)binds (the left stick walks, the right one looks);PadRoutes.driving(steerLeft:, steerRight:)isPadInput.addDrivingDefaultsTo(map, steerLeft:, steerRight:);lookRateisPadInput.lookRate. Pass noroutes:toPadInput.PadStickTarget(by hand).PadStickTargetis gone withPadStickUse: what a stick does is aDualAxisBindingonInputSource.padStick('left')or'right'in the action map, toDualAxisAction.move,DualAxisAction.lookor a game's ownDualAxisAction, which the game reads off theInputState.PadStickUse(by hand). Bind the stick to an action instead:DualAxisBinding(myAction, InputSource.padStick('left'))in the action map, and readinput.dualAxis(myAction)where the use'sroutewas called.PadStickUse.moveandlookareDualAxisAction.moveandlook;ignoredis no binding.Playing.capturesPointer(migrate).Playing.capturesPointerbecomesPlaying.ofPlatform().capturesPointer.Playingis an object:Playing.capturesPointerisPlaying.ofPlatform().capturesPointer.Playing.dragLook(migrate).Playing.dragLookbecomesPlaying.ofPlatform().usesDragLook.Playingis an object, and a boolean getter reads as a question in 1.0:Playing.dragLookisPlaying.ofPlatform().usesDragLook.Playing.touch(migrate).Playing.touchbecomesPlaying.ofPlatform().touch.Playingis an object:Playing.ofPlatform()reads the platform the static getters read, soPlaying.touchisPlaying.ofPlatform().touch. A game makes one where it starts and passes it on; a test constructsPlaying(touch: …, capturesPointer: …)instead of overriding the platform.Rebinding(nothing to do).bindingswent from required to optional, beside a newactionsmap andonConflict;Rebinding(bindings: table)means what it did.Rebindingis final, so nothing extends the constructor.RunSession(by hand).savereturns whether it wrote the run. A call that ignored the result is unchanged; a subclass that overridessavedeclares itbool save()and returnstrueonce the run is written.RunSession.carryFrom(migrate).RunSession.carryFromtakes oneRunCarryContext: an override reads its old parameters from it (parameter 1 is.level, parameter 2 is.next), and a call builds one.RunSession.carryFromtakes oneRunCarryContextwhere it took its parameters. A run session is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.RunSession.close(dart fix).RunSession.closeisdisposeLevel. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.RunSession.open(dart fix).RunSession.openisloadLevel. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.RunSession.restoreInto(migrate).RunSession.restoreIntotakes oneRunRestoreContext: an override reads its old parameters from it (parameter 1 is.level, parameter 2 is.snapshot), and a call builds one.RunSession.restoreIntotakes oneRunRestoreContextwhere it took its parameters. A run session is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.RunStatus(migrate, with a TODO).RunStatusis a class: aswitchover it that names every value gains_ => throw UnimplementedError().RunStatusis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.RunTimeline.RunTimeline(by hand).RunTimeline(rewind:, input:, stepSim:, restore:)isRunTimeline(rewind:, loop:): theEngineLoopthe run steps in, which the buffer is attached to (rewind.attach(loop), in place of adding its recorder toloop.recordersand callingkeyframewith the run's save). The run has to be a part of the loop's snapshots — a genre is, under its plugin id; a game's own run addsloop.snapshots.add(SnapshotPart.of(id:, capture:, restore:))— and its step a system of the loop's.inputandstepSecondsare the loop's.RunTimeline.input(nothing to do). Still readable: a getter for the loop'sinputwhere it was a field. Nothing outside the package implementsRunTimeline.RunTimeline.restore(by hand). The timeline restores through the loop's snapshots (loop.rewindTo(step, state:)), so the run is a part of them — a genre's is, under its plugin id — rather than a function handed to the timeline.RunTimeline.stepSeconds(nothing to do). Still readable: a getter for the loop'sstepSecondswhere it was a field. Nothing outside the package implementsRunTimeline.RunTimeline.stepSim(by hand). The timeline steps the loop it was given (loop.runSteps), so the run's step is a system of that loop, not a function handed to the timeline.RunTimeline.tracks(by hand).tracks(capture:, layout:)istracks(layout:, part:): the loop's capture is read at each step, andpart:— the run's part, a genre's plugin id — hands the layout that part's own data, which is what a layout written against the run'ssave()reads.SaveFile(by hand).read,readRecord,write,writeRecordandclearare asynchronous, becauseStorageis: await them. A save kept before slots is the default slot's (save.json);SaveSlotsholds more.ScrubMoved(by hand).ScrubAnswerhas a new case,ScrubMoved: aswitchover aScrubAnswerthat names every case needs one for it, or a wildcard.ScrubRefused(by hand).ScrubAnswerhas a new case,ScrubRefused: aswitchover aScrubAnswerthat names every case needs one for it, or a wildcard.SettingsCubit(by hand).GameSettingsControllertakessettings:where it tookconfig:, and the map the devices read asactions:.settingsis the current value, replaced on every change; keep yours current inapply.setVolumetakes anAudioBus, andsetSetting(name, value)issetValue(GameSettingKeys.<key>, value).SettingsCubit(dart fix).SettingsCubitisGameSettingsController.GameSettingsControlleris the same state machine as aValueListenablerather than aCubit: read.valuewhere.statewas read, listen with aValueListenableBuilderwhere aBlocBuilderwas, and calldispose()whereclose()was.rebindtakes any action and itspart(rebindActionis gone), andreset(defaults)takes the action map whereresetControlstook a button table.SettingsCubit.close(migrate).SettingsCubit.closebecomesFuture<void>.sync(x.dispose).GameSettingsControlleris aChangeNotifier:dispose()is what a cubit'sclose()was, and it answers nothing to await.SettingsCubit.state(migrate).SettingsCubit.statebecomesx.value.GameSettingsControlleris aValueListenable: itsvalueis what a cubit'sstatewas.SettingsFile(by hand).read,writeandclearare asynchronous, becauseStorageis. Read the settings inmain()beforerunApp(afterWidgetsFlutterBinding.ensureInitialized()) and hand theGameConfigto the screen, so the first key press uses them.writeanswersFuture<bool>.SettingsOverlay(by hand).SettingsOverlaytakessettings,sections,openingandcanOpen. Passsections: SettingsSection.standard(buses: ..., defaultActions: ..., padConnected: ..., credits: ..., colors: ..., privacy: ...)wheremixer,bindings,config,padConnected,defaultBindings,creditsand the rest were; the sections read and change theGameSettingsControllerthemselves.SettingsOverlay(dart fix).SettingsOverlayis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.SettingsOverlay(migrate, with a TODO).SettingsOverlayis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.SettingsPanel(migrate, with a TODO).SettingsPanelis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.SettingsPanel(dart fix).SettingsPanelis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.SettingsPanel(by hand).SettingsPanel(settings: controller, sections: [...])replaces the mixer, the config, the callbacks and the rest: the sections (SettingsSection.standard(...), orVolumesSection,ControlsSection,AccessibilitySection,MouseSection,GamepadSectionand their kin) read and change theGameSettingsController, and the panel closes through it.SettingsState(by hand).waitingForis the action of any kind that is listening, anInputAction<Object>?;waitingForActionis gone into it. A check for a button compares withis GameAction.SpawnPoint(migrate).SpawnPointis a class:.atis.at,.yawis.yaw; a destructuring pattern is yours to rewrite.TapToRestart(dart fix).TapToRestartis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.TimelineCommand(migrate, with a TODO).TimelineCommandis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TimelineCommandis anabstract base classrather thansealed, so a command added in a minor release breaks noswitch: a switch that named every command gains a case for the rest.TimelineLevelSwapped(by hand).TimelineCommandhas a new case,TimelineLevelSwapped: aswitchover aTimelineCommandthat names every case needs one for it, or a wildcard.TimelineReplayed(by hand).TimelineCommandhas a new case,TimelineReplayed: aswitchover aTimelineCommandthat names every case needs one for it, or a wildcard.TimelineReturned(by hand).TimelineCommandhas a new case,TimelineReturned: aswitchover aTimelineCommandthat names every case needs one for it, or a wildcard.TimelineScrubbed(by hand).TimelineCommandhas a new case,TimelineScrubbed: aswitchover aTimelineCommandthat names every case needs one for it, or a wildcard.TouchAction(dart fix).TouchActionis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.TouchButton(dart fix).TouchButtonis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.TouchButton(migrate, with a TODO).TouchButtonis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.TouchControls(dart fix).TouchControlsis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.TouchControls(migrate, with a TODO).TouchControlsis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.TouchSlot(dart fix).TouchSlotis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.TouchSlots(dart fix).TouchSlotsis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.TouchSlots(migrate, with a TODO).TouchSlotsis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.TouchStick(dart fix).TouchStickis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.TouchStick(migrate, with a TODO).TouchStickis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.TouchToggle(dart fix).TouchToggleis imported frompackage:flutter3d_game_ui/flutter3d_game_ui.dart. The widgets leftflutter3d_gameforflutter3d_game_ui, which stands on it;flutter3d_gamekeeps the input, the run, the settings and the saves they show.dart fixadds the import, andmigratethe dependency.TouchToggle(migrate, with a TODO).TouchToggleis afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.applySavedVolumes(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.bugReportTape(nothing to do). An attached buffer keeps the loop's captures; passpart:(the run's part, a genre's plugin id) so the report's start is the run's own snapshot, which a.f3drunholds. Without it the keyframe is handed over whole, which is right only for a buffer filled by hand.configureForTouch(dart fix).configureForTouchislockLandscapeForTouch. Called frommain()as before; it takes the game'sPlayingoptionally and asks the platform when given none.creditGaps(by hand).creditGapschecked this repository's demos against their asset folders and was not engine API; it lives in the repository's own test tooling now and no published package exports it. A test that used it copies it: it lists the asset folder withdart:ioand compares the names with the credits'files.ownedBindings(by hand). Read the map the devices share assettings.actionsOr(defaults)and hand that same map toGameSettingsController(actions: ...), which saves a copy of it on every rebind;SettingsFile(defaultActions: defaults)reads a saved map against the game's own.package:flutter3d_game/testing.dart(by hand).creditGapschecked this repository's demos against their asset folders and was not engine API. Copy it into the test that uses it: it lists the folder withdart:ioand compares the names with the credits'files.registerTimelineExtensions(by hand).capture:is gone:scrubToandreplayUnderNewCodeare registered always, through the timeline's loop.tracksis registered withentityLayout:, and reads the parttrackedPart:names (a genre's plugin id) when the layout reads the run's own save.replayDemo(by hand). Replay through the loop:replayDemoOnLoop(demo:, loop:, part:), where the loop steps the run (its genre installed, or the game's step as a system) andpartis the run's part of its snapshots — the genre's plugin id (PlatformerPlugin.id), or the id of theSnapshotPartthe game registered for its run. The file's start is restored as that part and each checkpoint digested from it, so recorded tapes check out as they did.replayDemoOnLoop(by hand).restore:andsave:are gone; passpart:, the id of the run's part of the loop's snapshots (a genre's plugin id, or theSnapshotPartthe game registered for its run with its ownsaveandrestore). The loop is rewound to step nought with the file's start as that part.rewindBufferFromDemo(by hand).rewindBufferFromDemo(demo:, stepsPerSecond:, input:, restore:, save:, stepSim:)isrewindBufferFromDemo(demo:, loop:, part:): the tape plays through the loop with the buffer attached, its start restored as the run's part. Steps per second are the loop's.settingsKeys(nothing to do). The settings argument is aGameSettingsController, whichgame-SettingsCubitrenames at the call site; nothing else changed.
flutter3d_game_platformer #
BreakableKind.spawn(migrate).BreakableKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.BreakableKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Checkpoint.onCollisionStart(migrate).Checkpoint.onCollisionStarttakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.Checkpoint.onCollisionStarttakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CheckpointKind.spawn(migrate).CheckpointKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.CheckpointKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CheckpointKind.validate(migrate).CheckpointKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.CheckpointKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ClimbableKind.spawn(migrate).ClimbableKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.ClimbableKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ClimbableKind.validate(migrate).ClimbableKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.ClimbableKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CollectibleKind.spawn(migrate).CollectibleKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.CollectibleKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CollectibleKind.validate(migrate).CollectibleKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.CollectibleKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ConveyorKind.spawn(migrate).ConveyorKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.ConveyorKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ConveyorKind.validate(migrate).ConveyorKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.ConveyorKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CrateKind(by hand). The solver is typed as theRigidDynamicsinterface now, which the DartDynamicsand the native solver both implement. Declare what you read it into asRigidDynamics; code that needs a member only the Dart solver has casts withas Dynamics.Crumbling.takeWeight(dart fix).Crumbling.takeWeightisbearWeight. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.CrumblingKind.spawn(migrate).CrumblingKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.CrumblingKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CrumblingKind.validate(migrate).CrumblingKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.CrumblingKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.EnemyKind.spawn(migrate).EnemyKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.EnemyKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.EnemyKind.validate(migrate).EnemyKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.EnemyKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.FollowCamera.FollowCamera(nothing to do). Only the type of thetuningdefault was renamed (FollowTuningisFollowSettings), and the parameters added beside it are optional; the rename's own fix carries every use of the type.FollowCamera.extraFov(dart fix).FollowCamera.extraFovisextraFovY. Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.FollowCamera.follow(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.FollowCamera.tuning(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FollowTuning(dart fix).FollowTuningisFollowSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.FollowTuning.FollowTuning(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.FollowTuning.recentre(dart fix).FollowTuning.recentreisrecenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.FollowTuning.recentreAbove(dart fix).FollowTuning.recentreAboveisrecenterAbove. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Gatherer(migrate).Gathereris a base mixin class:implements Gathererbecomeswith Gatherer, on abaseclass.Hazard.onCollision(migrate).Hazard.onCollisiontakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.Hazard.onCollisiontakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Hazard.onCollisionStart(migrate).Hazard.onCollisionStarttakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.Hazard.onCollisionStarttakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.HazardKind.spawn(migrate).HazardKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.HazardKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.HazardKind.validate(migrate).HazardKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.HazardKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Hunter.hunting(dart fix).Hunter.huntingisisHunting. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.KeyKind(dart fix).KeyKindisPlatformerKeyKind. The shooter declares aKeyKindof its own, which spawns a different mechanism for the samekeytype, so each genre's is named for it.KeyTaker(migrate).KeyTakeris a base mixin class:implements KeyTakerbecomeswith KeyTaker, on abaseclass.Launchable(migrate).Launchableis a base mixin class:implements Launchablebecomeswith Launchable, on abaseclass.LivesStrip(nothing to do). Only the style's type was renamed;game_platformer-ReadoutStylerenames theReadoutStylea caller passes.OneWayKind.spawn(migrate).OneWayKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.OneWayKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.OneWayKind.validate(migrate).OneWayKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.OneWayKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.PlatformerSimulation(by hand).dynamicsis aRigidDynamics?now, the interface the Dart and the native solver share. Declare what you read it into asRigidDynamics?, or cast withas Dynamics?for the Dart solver's own members.PlatformerSimulation.events(by hand). The run's buffer is gone; it publishes onto the bus. WithPlatformerPlugininstalled nothing is to be done but subscribe. Before:final events = sim.events.drain(); if (events.any((e) => e is RunnerDied)) camera.cut();in thepublishphase. After:loop.onStepEnd((s) { if (s.events.any((e) => e is RunnerDied)) camera.cut(); }), orloop.events.onStep<RunnerDied>(...). Stepped by hand:sim.publishTo(DirectBus()..onStep<GameEvent>('test', (d) => heard.add(d.event))).PurseReadout(nothing to do). Only the style's type was renamed;game_platformer-ReadoutStylerenames theReadoutStylea caller passes.ReadoutStyle(dart fix).ReadoutStyleisPlatformerReadoutStyle. The shooter and racing declare aReadoutStyleeach, with other fields, so each genre's is named for it.RunState(by hand).RunStateis a class with constants, so a state added in a minor release does not break an exhaustiveswitch.RunState.runningand the rest,values,nameandoutcomeread as before. Aswitchover aRunStateneeds adefault:(or_ =>) case,.indexis gone, andRunState.values.byName(x)isRunState.byName(x), which answers null for a word it does not know.Runner.Runner(nothing to do). Only the type of thetuningdefault was renamed (RunnerTuningisRunnerSettings), and the parameters added beside it are optional; the rename's own fix carries every use of the type.Runner.applyDamage(migrate).Runner.applyDamagetakes oneDamage: an override reads its old parameters from it (parameter 1 is.amount,from:is.from), and a call builds one.Runner.applyDamagetakes oneDamagewhere it took its parameters. Something that can be hurt is a hook a game implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Runner.events(by hand).eventsis anEventRegistry?the runner publishes itsRunnerEvents onto, set byPlatformerSimulation.publishTo. Before:runner.events = bufferandbuffer.drain(). After:runner.events = bus(or, for a whole run,sim.publishTo(bus)), and a subscriber on the bus:bus.onStep<Jumped>('game.jump', (d) => ...).Runner.tuning(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.RunnerTuning(dart fix).RunnerTuningisRunnerSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.Spring.onCollision(migrate).Spring.onCollisiontakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.Spring.onCollisiontakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Spring.onCollisionStart(migrate).Spring.onCollisionStarttakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.Spring.onCollisionStarttakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.SpringKind.spawn(migrate).SpringKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.SpringKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.SpringKind.validate(migrate).SpringKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.SpringKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Surfaces.Surfaces(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.Surfaces.tuningFor(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.SwimTuning(dart fix).SwimTuningisSwimSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.Water.Water(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.Water.tuning(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.platformerRegistry(nothing to do).dynamicstakes aRigidDynamics?, which aDynamicsis: the parameter widened, so every call still fits.
flutter3d_game_racing #
AiDriver.AiDriver(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.AiDriver.tuning(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.AiTuning(dart fix).AiTuningisAiSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.ChaseCamera.ChaseCamera(nothing to do). Only the type of thetuningdefault was renamed (ChaseTuningisChaseSettings), and the parameters added beside it are optional; the rename's own fix carries every use of the type.ChaseCamera.fov(dart fix).ChaseCamera.fovisfovY. Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.ChaseCamera.tuning(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.ChaseTuning(dart fix).ChaseTuningisChaseSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.ChaseTuning.ChaseTuning(dart fix). Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.ChaseTuning.baseFov(dart fix).ChaseTuning.baseFovisbaseFovY. Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.ChaseTuning.fovPerSpeed(dart fix).ChaseTuning.fovPerSpeedisfovYPerSpeed. Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.GhostFrame(dart fix).GhostFrameis imported frompackage:flutter3d_sim/flutter3d_sim.dart.GhostFrameis the simulation's own type now, where racing named it: importflutter3d_sim.GroundField(migrate).GroundFieldis a base mixin class:implements GroundFieldbecomeswith GroundField, on abaseclass.LapReadout(nothing to do). Only the style's type was renamed;game_racing-ReadoutStylerenames theReadoutStylea caller passes.PositionReadout(nothing to do). Only the style's type was renamed;game_racing-ReadoutStylerenames theReadoutStylea caller passes.RacePhase(by hand).RacePhaseis a class with constants, so the losing phase a race against the clock wants can arrive in a minor release without breaking an exhaustiveswitch.RacePhase.countdownand the rest,values,nameandoutcomeread as before. Aswitchover aRacePhaseneeds adefault:(or_ =>) case,.indexis gone, andRacePhase.values.byName(x)isRacePhase.byName(x), which answers null for a word it does not know.RacerProgress.finished(dart fix).RacerProgress.finishedisisFinished. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.RacingSimulation(by hand).dynamicsis aRigidDynamics?now, the interface the Dart and the native solver share. Declare what you read it into asRigidDynamics?, or cast withas Dynamics?for the Dart solver's own members.RacingSimulation.events(by hand). The race's buffer is gone; it publishes onto the bus. WithRacingPlugininstalled nothing is to be done but subscribe. Before:for (final e in race.events.drain()) { if (e is LapCompleted && e.isPlayer) showLap(); }. After:loop.events.onStep<LapCompleted>('game.lap', (d) { if (d.event.isPlayer) showLap(); }), or readStepEventSummary.eventsinloop.onStepEnd. Stepped by hand:race.publishTo(DirectBus()..onStep<GameEvent>('test', (d) => heard.add(d.event))).events.clear()on a restart has nothing to clear any more.ReadoutStyle(dart fix).ReadoutStyleisRacingReadoutStyle. The platformer and the shooter declare aReadoutStyleeach, with other fields, so each genre's is named for it.RoadMeshSettings.RoadMeshSettings(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.RoadMeshSettings.metresPerTile(dart fix).RoadMeshSettings.metresPerTileismetersPerTile. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SkyPreset(by hand).sunElevationDegandsunAzimuthDegaresunElevationandsunAzimuth, in radians, as every angle in the engine is (docs/CONTRACTS.md). Multiply a number in degrees by π/180 (x * (math.pi / 180.0)). A track file keeps itssunElevationDegandsunAzimuthDegkeys in degrees;SkyPreset.fromJsonconverts.SkyPreset(migrate).sunColor:,zenith:,horizon:,belowHorizon:ofSkyPreset:Vector3(x, y, z)isLinearColor(x, y, z). A sky preset's colours areLinearColors:sunColor,zenith,horizonandbelowHorizonin the constructor and as fields, and whatcolorAt,horizonFogColorandinScatterAlongreturn. The numbers mean what they did (linear), soVector3(0.7, 0.5, 0.4)becomesLinearColor(0.7, 0.5, 0.4), and.x,.y,.zread as.r,.g,.b. Directions (sunDirection,directionToSun) stayVector3s.SkyPreset.colourAt(dart fix).SkyPreset.colourAtiscolorAt. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SkyPreset.horizonFogColour(dart fix).SkyPreset.horizonFogColourishorizonFogColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SphereVehicle.SphereVehicle(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SphereVehicle.fitTyres(dart fix).SphereVehicle.fitTyresisfitTires. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SphereVehicle.grounded(dart fix).SphereVehicle.groundedisisGrounded. A boolean getter reads as a question in 1.0:groundedisisGrounded.SphereVehicle.pitStop(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.SphereVehicle.placeAt(migrate).SphereVehicle.placeAttakes oneVehiclePlacement: an override reads its old parameters from it (parameter 1 is.position, parameter 2 is.headingYaw,trackDistance:is.trackDistance), and a call builds one.SphereVehicle.placeAttakes oneVehiclePlacementwhere it took its parameters. A vehicle is a hook a racing game implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.SphereVehicle.step(migrate).SphereVehicle.steptakes oneVehicleStep: an override reads its old parameters from it (parameter 1 is.dt, parameter 2 is.input), and a call builds one.SphereVehicle.steptakes oneVehicleStepwhere it took its parameters. A vehicle is a hook a racing game implements, stepped per car per step, so the simulation reuses one context and a vehicle must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.SphereVehicle.tuning(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.SphereVehicle.tyres(dart fix).SphereVehicle.tyresistireSet. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SurfaceBand.SurfaceBand(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.SurfaceBand.centre(dart fix).SurfaceBand.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.TrackSpline.TrackSpline(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.TrackSpline.centre(dart fix).TrackSpline.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.TrackSpline.centreAt(dart fix).TrackSpline.centreAtiscenterAt. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Tyres(dart fix).TyresisTireSet. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.VehicleController(migrate).VehicleControlleris a base mixin class:implements VehicleControllerbecomeswith VehicleController, on abaseclass.VehicleController.grounded(dart fix).VehicleController.groundedisisGrounded. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.VehicleController.placeAt(migrate).VehicleController.placeAttakes oneVehiclePlacement: an override reads its old parameters from it (parameter 1 is.position, parameter 2 is.headingYaw,trackDistance:is.trackDistance), and a call builds one.VehicleController.placeAttakes oneVehiclePlacementwhere it took its parameters. A vehicle is a hook a racing game implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.VehicleController.step(migrate).VehicleController.steptakes oneVehicleStep: an override reads its old parameters from it (parameter 1 is.dt, parameter 2 is.input), and a call builds one.VehicleController.steptakes oneVehicleStepwhere it took its parameters. A vehicle is a hook a racing game implements, stepped per car per step, so the simulation reuses one context and a vehicle must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.VehicleTuning(dart fix).VehicleTuningisVehicleSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.VehicleTuning.VehicleTuning(dart fix). A car falls by the gravity of the world it drives in, as every body does, so the settings no longer carry one.racingWorld(20 m/s²,racingGravity) is the world a race is run in andraceInstages it; to keep a number of your own, give the race's worldracingWorld.copyWith(gravity: Vector3(0, -g, 0)). A tyre's grip is its μ times that gravity.
flutter3d_game_shooter #
AmmoGift(by hand).announcereturns aGiftAnnouncement(a message id with the gift, the amount and the detail) instead of an English sentence, so a game words it in its own language..englishis the sentence it used to return.AmmoReadout(nothing to do). Only the style's type was renamed;game_shooter-ReadoutStylerenames theReadoutStylea caller passes.ArmourGift(by hand).announcereturns aGiftAnnouncementinstead of an English sentence;.englishis the sentence it used to return.ArmourGift(dart fix).ArmourGiftisArmorGift. Public names are spelled the American way; the gift is the same under its new name.BlastResolver.resolve(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.ChaseBrain.onHurt(migrate).ChaseBrain.onHurttakes oneBrainHurt: an override reads its old parameters from it (parameter 1 is.mind, parameter 2 is.amount), and a call builds one.ChaseBrain.onHurttakes oneBrainHurtwhere it took its parameters. A brain is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ChaseBrain.onNoise(migrate).ChaseBrain.onNoisetakes oneBrainNoise: an override reads its old parameters from it (parameter 1 is.mind, parameter 2 is.at), and a call builds one.ChaseBrain.onNoisetakes oneBrainNoisewhere it took its parameters. A brain is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Collector(migrate).Collectoris a base mixin class:implements Collectorbecomeswith Collector, on abaseclass.GameSimulation(by hand).dynamicsis aRigidDynamics?now, the interface the Dart and the native solver share. Declare what you read it into asRigidDynamics?, or cast withas Dynamics?for the Dart solver's own members.GameSimulation.events(by hand). The run's buffer is gone; it publishes onto the bus. WithShooterPlugininstalled nothing is to be done but subscribe. Before:final events = sim.events.drain(); if (events.any((e) => e is PlayerDied)) showDeath();in thepublishphase. After:loop.events.onStep<PlayerDied>('game.died', (d) => showDeath()), or readStepEventSummary.eventsinloop.onStepEnd. Stepped by hand:sim.publishTo(DirectBus()..onStep<GameEvent>('test', (d) => heard.add(d.event))). Cutscene signals arrive on the same bus asSequenceSignals, withCutscene.signalsgone: subscribe toSequenceSignaland switch on itssignal.GameSimulation.systems(by hand). A rule hangs on the step throughaddSystem, as a system of the engine's loop does:sim.systems.add(ShooterPhases.afterActors, (step) => burn(step.dt), label: 'heat')issim.addSystem('heat', ShooterPhases.afterActors, (LoopContext step) => burn(step.dt)), every system needs a name unique in the run, andafter:/before:name other systems as before.StepPhase.beginandStepPhase.endareShooterPhases.beginandShooterPhases.end. Cancel theRegistrationaddSystemreturns wheresystems.remove(registration)was called. The system is handed aLoopContext:dtandphaseas the old context had, andstep,publishand, inside a loop,world.GameState(by hand).GameStateis a class with constants, so a state added in a minor release does not break an exhaustiveswitch.GameState.playingand the rest,values,nameandoutcomeread as before. Aswitchover aGameStateneeds adefault:(or_ =>) case,.indexis gone, andGameState.values.byName(x)isGameState.byName(x), which answers null for a word it does not know.Gift(by hand).announcereturns aGiftAnnouncement?instead of aString?. A gift of your own returnsGiftAnnouncement('<your id>', gift: name, amount: amount, detail: detail)and words that id where it shows messages; a caller that showed the string shows.english, or words the id.Gift.announce(migrate).Gift.announcetakes oneGiftAnnounce: an override reads its old parameters from it (parameter 1 is.amount, parameter 2 is.detail), and a call builds one.Gift.announcetakes oneGiftAnnouncewhere it took its parameters. A gift is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Gift.grantTo(migrate).Gift.grantTotakes oneGiftGrant: an override reads its old parameters from it (parameter 1 is.to, parameter 2 is.amount, parameter 3 is.detail), and a call builds one.Gift.grantTotakes oneGiftGrantwhere it took its parameters. A gift is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.HealthBar(nothing to do). Only the style's type was renamed;game_shooter-ReadoutStylerenames theReadoutStylea caller passes.HealthBar.HealthBar(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.HealthBar.armour(dart fix).HealthBar.armourisarmor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.HealthBar.maxArmour(dart fix).HealthBar.maxArmourismaxArmor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.HealthGift(by hand).announcereturns aGiftAnnouncementinstead of an English sentence;.englishis the sentence it used to return.HitscanBehaviour(dart fix).HitscanBehaviourisHitscanBehavior. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.InFlight.fromJson(migrate, with a TODO).InFlight.fromJsonthrowsSnapshotFormatExceptionwhere it returned null: a null check beside a call becomestry … on SnapshotFormatException. It throws aSnapshotFormatExceptionfor a row with no blast or no position, where it answered null; the component codec still leaves such a rocket out of a restore.Inventory.Inventory(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Inventory.addArmour(dart fix).Inventory.addArmourisaddArmor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Inventory.maxArmour(dart fix).Inventory.maxArmourismaxArmor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.KeyGift(by hand).announcereturns aGiftAnnouncementinstead of an English sentence;.englishis the sentence it used to return.KeyKind(dart fix).KeyKindisShooterKeyKind. The platformer declares aKeyKindof its own, which spawns a different mechanism for the samekeytype, so each genre's is named for it.KeyPips(nothing to do). Only the style's type was renamed;game_shooter-ReadoutStylerenames theReadoutStylea caller passes.KeyPips.KeyPips(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.KeyPips.colours(dart fix).KeyPips.coloursiscolors. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.MeleeBehaviour(dart fix).MeleeBehaviourisMeleeBehavior. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.MeleeBehaviour.arcDegrees(migrate).arcDegrees: xofMeleeBehaviour.arcDegreesisarc: x * pi / 180. A swing's width isarc, in radians like every angle the engine takes:arcDegrees: 100isarc: 100 * pi / 180, and a read ofarcDegreesisarc * 180 / pi.MonsterKind.spawn(migrate).MonsterKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.MonsterKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.MonsterKind.validate(migrate).MonsterKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.MonsterKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.NoteKind.validate(migrate).NoteKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.NoteKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.PickupKind.spawn(migrate).PickupKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.PickupKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.PickupKind.validate(migrate).PickupKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.PickupKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Player.applyDamage(migrate).Player.applyDamagetakes oneDamage: an override reads its old parameters from it (parameter 1 is.amount,from:is.from), and a call builds one.Player.applyDamagetakes oneDamagewhere it took its parameters. Something that can be hurt is a hook a game implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.PowerUpGift(by hand).announcereturns aGiftAnnouncementinstead of an English sentence;.englishis the sentence it used to return.ProjectileBehaviour(dart fix).ProjectileBehaviourisProjectileBehavior. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ReadoutStyle(dart fix).ReadoutStyleisShooterReadoutStyle. The platformer and racing declare aReadoutStyleeach, with other fields, so each genre's is named for it.Secret.onCollisionStart(migrate).Secret.onCollisionStarttakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.Secret.onCollisionStarttakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.SecretKind.spawn(migrate).SecretKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.SecretKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ShooterPhases(nothing to do). The constants keep their names and are passed toaddSystemwhere they were passed tosystems.add(2f-game_shooter-GameSimulation-systemssays how); only their type,LoopPhase, and the name each carries (shooter.afterActors) changed, which no call spells.ShotHit.struckSomething(dart fix).ShotHit.struckSomethingisdidStrikeSomething. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.Staged(by hand).Stagedtakes the stage's light fixtures as a requiredfixtures.stagebuilds aStagedwith them; code that constructs one by hand passes the list it built, orconst []for a stage without any.WeaponBehaviour(dart fix).WeaponBehaviourisWeaponBehavior. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.WeaponDef.WeaponDef(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.WeaponDef.behaviour(dart fix).WeaponDef.behaviourisbehavior. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.WeaponDef.cooldown(by hand).cooldownis adoubleof seconds now, the simulation's unit of time, and theDurationgetter is gone;cooldownSecondswas the same number and iscooldowntoo. Where aDurationis needed at the Flutter boundary, build it there:Duration(microseconds: (cooldown * 1e6).round()).WeaponDef.cooldownSeconds(dart fix).WeaponDef.cooldownSecondsiscooldown. Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.package:flutter3d_game_shooter/sample.dart(by hand). The shipped game's roster (Monsters,Weapons,sampleGifts,sampleRegistry,sampleRules,sampleArsenal) was one game's content and is no longer published: it lives in this repository'sflutter3d_demo_content, which is not on pub.dev. Copy the definitions your game uses into your own code; every type they are made of (MonsterDef,WeaponDef,MonsterKind,PickupKind,GiftRegistry,Arsenal) is still the genre's.package:flutter3d_game_shooter/staging.dart(by hand).stage(),Staged,startingInventoryandShooterHeadlessGameassembled this repository's shooter from its own roster and are no longer published: they live influtter3d_demo_content, which is not on pub.dev. Copystage()into your game and hand it your registry and inventory;ShooterPlugin(headless: ...)takes your ownHeadlessGame.
flutter3d_game_strategy #
AssignOrder.obey(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.AttackOrder.obey(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.Building.Building(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Building.centre(dart fix).Building.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.FogOfWar.centreOf(dart fix).FogOfWar.centreOfiscenterOf. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.FogOfWar.centreX(dart fix).FogOfWar.centreXiscenterX. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.FogOfWar.centreZ(dart fix).FogOfWar.centreZiscenterZ. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.MapCamera.MapCamera(nothing to do). Only the type of thetuningdefault was renamed (MapCameraTuningisMapCameraSettings), and the parameters added beside it are optional; the rename's own fix carries every use of the type.MapCamera.tuning(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.MapCameraTuning(dart fix).MapCameraTuningisMapCameraSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.Match(dart fix).MatchisStrategyMatch.Matchisdart:core's regular-expression match, which a library that names its own silently shadows: a strategy match isStrategyMatch, with the same constructor and members.MatchDemo(nothing to do). Only the value of the constant moved; code that readsMatchDemogets the new one. It is a version or a layout size the engine stamps and checks itself.MoveOrder.obey(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.OrderQueue.assign(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.OrderQueue.attackWith(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.OrderQueue.moveTo(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.ResourceNode.take(dart fix).ResourceNode.takeisharvest. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.Selection(dart fix).SelectionisUnitSelection. The strategy's ray-and-rectangle picking isUnitSelection, so it no longer shares a name with the modeller's elementSelectioninflutter3d_mesh.Squad.units(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.StrategyOrder(migrate, with a TODO).StrategyOrderis a class: aswitchover it that names every value gains_ => throw UnimplementedError().StrategyOrderis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.StrategyOrder.obey(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.StrategySimulation.add(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.StrategySimulation.units(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.TrainOrder.obey(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.Unit(dart fix).UnitisStrategyUnit.Unitis the foundation's unit of measurement since 1.0, and a public name has one home, so a unit on the map is aStrategyUnit. Nothing else about it changed.UnitOrder.UnitOrder.attack(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.UnitOrder.target(nothing to do). The signature namesStrategyUnit, the new name ofUnit(game_strategy-Unit);dart fixrenames the type where the caller spells it, and a call is unchanged.
flutter3d_hardware #
BackendRegistration(by hand).DeviceRegistry.addBackendhands back aRegistration;undo()iscancel().BindUniformBlockObject(dart fix).BindUniformBlockObjectis imported frompackage:flutter3d_hardware/flutter3d_hardware.dart.BlendFactor(migrate, with a TODO).BlendFactoris a class: aswitchover it that names every value gains_ => throw UnimplementedError().BlendFactoris an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.BlendFactor(by hand).BlendFactorhas new values (source1Color,oneMinusSource1Color,source1Alpha,oneMinusSource1Alpha): aswitchover aBlendFactorthat names every value needs a case for each, or a wildcard.BlendOperation(by hand).BlendOperationhas new values (min,max): aswitchover aBlendOperationthat names every value needs a case for each, or a wildcard.BlendOperation(migrate, with a TODO).BlendOperationis a class: aswitchover it that names every value gains_ => throw UnimplementedError().BlendOperationis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.CommandEncoder(by hand). Abase mixinonPassEncodersince 1.0: a backend writesextends PassEncoder with CommandEncoderwhere it wroteimplements CommandEncoder. New members ofPassEncoder(debug groups) have bodies.ComputeEncoder(by hand). Code that dispatches compute is unchanged: the new members and the optionaloffsetInBytes/sizeInBytesofbindStorageBufferare additions to call. Only a backend of your own that implementsComputeEncoderhas work: it adds the new members, and for a capability it lacks throwsUnsupportedCapabilityExceptionand leaves the feature out offeatures, as the hardware interface section of CONTRIBUTING.md describes.ComputePipelineHandle(by hand). A handle has no public constructor since 1.0: a device hands one out. A backend wraps its own object withwrapComputePipelinefrompackage:flutter3d_hardware/backend.dart, naming itself asownerso the handle'sdisposegives it back; a test's fake does the same.CullMode(migrate, with a TODO).CullModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().CullModeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.DepthRange(migrate, with a TODO).DepthRangeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().DepthRangeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.DeviceCapabilityForwarders(by hand). The deprecated capability getters are gone fromGraphicsDevice, and so is the mixin that answered them. Dropwith DeviceCapabilityForwardersand askfeatures,limitsandtextureFormatSupportdirectly (the getters' own migrations name the rewrite for each).DeviceRegistry.open(nothing to do). The signature is the same; what it throws when no backend starts is aDeviceUnavailableException(aResourceException) rather than aStateError, with each backend's refusal inrefusals. Code that caughtStateErrorthere catchesDeviceUnavailableException.DeviceRegistry.presenterFor(nothing to do). Matched withdevice is Trather than by exact runtime type, so a subclass of a registered device finds its presenter; nothing a caller writes changes.FakeBackend(by hand). WhatFakeBackendinherits fromGraphicsDevicechanged: the texture creators answer a non-null handle and throw where they answered null,readPixelsisreadback, and the deprecatedsupportsX,maxAnisotropyandmaxColorAttachmentsarefeatures.has(...)andlimits. The entries forGraphicsDevicesay each.FakeBackend.createPipeline(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FakeBackend.createTexture(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FakeBackend.createdTextures(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FakeBackend.disposed(dart fix).FakeBackend.disposedisisDisposed.disposedwas a public field anybody could set; it is the read-only getterisDisposed, and onlydispose()sets it.FakeBackend.uploadedTextures(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.FakePass(by hand). No positionalboolin 1.0:setDepthWrite(false)issetDepthWrite(enabled: false), and the same forsetDepthClampandsetAlphaToCoverage, on every pass encoder. A backend that overrides them takes{required bool enabled}.GeometryBuffer(by hand). A handle has no public constructor since 1.0: a device hands one out. A backend wraps its own object withwrapGeometryfrompackage:flutter3d_hardware/backend.dart, naming itself asownerso the handle'sdisposegives it back; a test's fake does the same.GeometryUsage(migrate, with a TODO).GeometryUsageis a class: aswitchover it that names every value gains_ => throw UnimplementedError().GeometryUsageis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.GraphicsDevice(by hand). Code that draws through a device is unchanged; its capability questions moved tofeatures,limitsandtextureFormatSupport(thesupportsXgetters are deprecated, anddart run flutter3d_build:migraterewrites them). A backend of your own that implementsGraphicsDevicemixes inDeviceCapabilityForwardersfor the deprecated getters, adds the new members, and throwsUnsupportedCapabilityExceptionfor what it cannot do yet.GraphicsDevice(by hand). Anabstract base classsince 1.0, so a member added in a minor breaks no backend: writeextends GraphicsDevicewhere you wroteimplements GraphicsDevice, mark the classfinal,baseorsealed, and dropDeviceCapabilityForwarders(the base class answers the deprecated getters). Feature-gated members have bodies that throwUnsupportedCapabilityException; override what your backend has. New:createPipelineAsync,lost,setLabel,releasePipeline. A capability mixin such asEncodedImageUploadiswith, notimplements.GraphicsDevice.createCubeRenderTarget(by hand). Returns aTextureHandle, not a nullable one: a device without cubes throwsUnsupportedCapabilityException— askfeatures.has(DeviceFeature.cubeTextures)first.GraphicsDevice.createCubeTextureFromPixels(by hand). Returns aTextureHandle, not a nullable one: a device without cubes throwsUnsupportedCapabilityException(askfeatures.has(DeviceFeature.cubeTextures)first), and faces of the wrong count or size aDeviceResourceException.GraphicsDevice.createStorageBuffer(migrate).GraphicsDevice.createStorageBufferbecomesx.createBuffer(BufferDescriptor(lengthInBytes: {0}.lengthInBytes, usage: BufferUsage.standardStorage), contents: {0}). One call makes every buffer: a storage buffer iscreateBufferwithBufferUsage.standardStorageand the bytes ascontents. Add| BufferUsage.hostReadablewhere you passedhostReadable: trueand| BufferUsage.indexwhere you passedbindableAsIndices: true; a call with either is left to you. A backend of your own drops its override and makes the storage usages increateBuffer.GraphicsDevice.createTextureFromPixels(by hand). Returns aTextureHandle, not a nullable one: pixels that are not the size the description needs throw aDeviceResourceException. Drop the!; where the null was a "texture left out", catchDeviceResourceExceptionthere.GraphicsDevice.maxAnisotropy(migrate).GraphicsDevice.maxAnisotropybecomesx.limits.maxSamplerAnisotropy.GraphicsDevice.maxColorAttachments(migrate).GraphicsDevice.maxColorAttachmentsbecomesx.limits.maxColorAttachments.GraphicsDevice.readBufferSync(by hand). A synchronous buffer read is a capability a device opts into, theSynchronousBufferReadbackmixin, since WebGPU has no such call. Askdevice is SynchronousBufferReadback(or forDeviceFeature.synchronousReadback) and callreadBufferSyncon the device as that type; a backend that implements it mixes the mixin in.GraphicsDevice.readPixels(dart fix).GraphicsDevice.readPixelsisreadback.readPixelsandreadbackwere two calls for the same bytes.readbackis the one left: a whole texture in a float format is converted asreadPixelsconverted it, and a texture that cannot be read throws (ArgumentError, orDeviceResourceException) wherereadPixelsanswered null, so a!after the call or a null check on its result can go.GraphicsDevice.supportsAlphaToCoverage(migrate).GraphicsDevice.supportsAlphaToCoveragebecomesx.features.has(DeviceFeature.alphaToCoverage).GraphicsDevice.supportsBlendColor(migrate).GraphicsDevice.supportsBlendColorbecomesx.features.has(DeviceFeature.blendConstant).GraphicsDevice.supportsCompute(migrate).GraphicsDevice.supportsComputebecomesx.features.has(DeviceFeature.compute).GraphicsDevice.supportsCubeTextures(migrate).GraphicsDevice.supportsCubeTexturesbecomesx.features.has(DeviceFeature.cubeTextures).GraphicsDevice.supportsFloat32Filtering(migrate).GraphicsDevice.supportsFloat32Filteringbecomes(x.features.has(DeviceFeature.float32Filterable) && x.features.has(DeviceFeature.float32Renderable)). The old getter answered two questions at once; the rewrite asks both. Keep only the one the code needs: sampling with a linear filter isfloat32Filterable, drawing into the texturefloat32Renderable.GraphicsDevice.supportsGpuTimestamps(migrate).GraphicsDevice.supportsGpuTimestampsbecomesx.features.has(DeviceFeature.gpuTimestamps).GraphicsDevice.supportsIndependentBlend(migrate).GraphicsDevice.supportsIndependentBlendbecomesx.features.has(DeviceFeature.independentBlend).GraphicsDevice.supportsMipmaps(migrate).GraphicsDevice.supportsMipmapsbecomesx.features.has(DeviceFeature.manualMipmaps).GraphicsDevice.supportsOffscreenMsaa(migrate).GraphicsDevice.supportsOffscreenMsaabecomesx.features.has(DeviceFeature.offscreenMultisample).GraphicsDevice.supportsRenderToMip(migrate).GraphicsDevice.supportsRenderToMipbecomesx.features.has(DeviceFeature.renderToMipLevel).GraphicsDevice.supportsStencil(migrate).GraphicsDevice.supportsStencilbecomesx.features.has(DeviceFeature.stencil).GraphicsDevice.supportsTextureFormat(migrate).GraphicsDevice.supportsTextureFormatbecomesx.textureFormatSupport({0}).sampled.GraphicsDevice.supportsWireframe(migrate).GraphicsDevice.supportsWireframebecomesx.features.has(DeviceFeature.wireframe).IndexType(migrate, with a TODO).IndexTypeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().IndexTypeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.LayeredShaderLibrary(dart fix).LayeredShaderLibraryis imported frompackage:flutter3d_hardware/flutter3d_hardware.dart.LoadAction(migrate, with a TODO).LoadActionis a class: aswitchover it that names every value gains_ => throw UnimplementedError().LoadActionis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.LoadedShaderLibrary(by hand). Abase mixinonShaderLibrarysince 1.0: writewith ShaderLibrary, LoadedShaderLibrarywhere you wroteimplements LoadedShaderLibrary.MinMagFilter(migrate, with a TODO).MinMagFilteris a class: aswitchover it that names every value gains_ => throw UnimplementedError().MinMagFilteris an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.MipFilter(migrate, with a TODO).MipFilteris a class: aswitchover it that names every value gains_ => throw UnimplementedError().MipFilteris an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.PassEncoder(by hand). Anabstract base mixin classsince 1.0: an encoder writesextends PassEncoder with CommandEncoder(orwith RenderBundleEncoder) where it wroteimplements CommandEncoder. The debug groups (pushDebugGroup,popDebugGroup,insertDebugMarker) have bodies that do nothing.PassEncoder(by hand). Code that records a pass is unchanged:drawgained the optionalfirstIndexandindexCount, and the new members are additions to call. Only an encoder of your own that implementsPassEncoderhas work: it adds the new members, throwingUnsupportedCapabilityExceptionfor what its backend lacks.PassEncoder.setBlendColor(migrate).PassEncoder.setBlendColorbecomesx.setBlendColor(LinearColor({0}.x, {0}.y, {0}.z, {0}.w)). The blend constant is aLinearColor, the engine's one colour type: the same four numbers, red, green, blue and alpha. An encoder of your own takes aLinearColorin its override.PassEncoder.setDepthWrite(migrate).PassEncoder.setDepthWrite(x0)isPassEncoder.setDepthWrite(enabled: x0). No positionalboolin 1.0:setDepthWrite(false)issetDepthWrite(enabled: false).PassStateApply(dart fix).PassStateApplyis imported frompackage:flutter3d_hardware/flutter3d_hardware.dart.PipelineHandle(by hand). A handle has no public constructor since 1.0: a device hands one out. A backend wraps its own object withwrapPipelinefrompackage:flutter3d_hardware/backend.dart, naming itself asownerso the handle'sdisposegives it back; a test's fake does the same.PolygonMode(migrate, with a TODO).PolygonModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().PolygonModeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.PresenterRegistration(by hand).DeviceRegistry.addPresenterhands back aRegistration;undo()iscancel().PrimitiveType(migrate, with a TODO).PrimitiveTypeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().PrimitiveTypeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.Recorded(migrate, with a TODO).Recordedis a class: aswitchover it that names every value gains_ => throw UnimplementedError().Recordedis anabstract base classrather than a sealed one, so a pass can gain calls in a minor release. Aswitchover a recorded command ends with a wildcard for the kinds it does not name.RecordedAlphaToCoverage(by hand).Recordedhas a new case,RecordedAlphaToCoverage: aswitchover aRecordedthat names every case needs one for it, or a wildcard.RecordedBlendColor(by hand). The recorded blend constant is aLinearColor: construct it withRecordedBlendColor(LinearColor(r, g, b, a)), and read.r,.g,.b,.awhere you read.x,.y,.z,.w.RecordedCall(by hand).Recordedhas a new case,RecordedCall: aswitchover aRecordedthat names every case needs one for it, or a wildcard.RecordedTexture.sampler(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.RecordingDevice(by hand). WhatRecordingDeviceinherits fromGraphicsDevicechanged: the texture creators answer a non-null handle and throw where they answered null,readPixelsisreadback, and the deprecatedsupportsX,maxAnisotropyandmaxColorAttachmentsarefeatures.has(...)andlimits. The entries forGraphicsDevicesay each.RecordingDevice.createPipeline(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.RecordingDevice.createTexture(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.RenderTargetDescriptor(nothing to do). ATextureDescriptornow (it extends it), with the same constructor, fields and equality, socreateTexturetakes either.RenderTargetPool(nothing to do).trimreturns the bytes it handed back instead of nothing. A call that ignores the result is unchanged, andRenderTargetPoolis final, so nothing overrides it.RenderTargetSpec(dart fix).RenderTargetSpecisRenderTargetDescriptor. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.SamplerAddressMode(migrate, with a TODO).SamplerAddressModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().SamplerAddressModeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.SamplerOptions(dart fix).SamplerOptionsisSamplerDescriptor. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.ShaderBundle.formatVersion(nothing to do). A bundle is version 2 now, which writes each stage's kind as a code;decodestill reads version 1, and a bundle is a build artifact the build writes again, so no code has to change.ShaderBundleRefused(dart fix).ShaderBundleRefusedisShaderBundleException.ShaderBundleRefusedisShaderBundleException(decision H: a type that is thrown is named*Exception), with the same members. It now extendsResourceException(and through itFlutter3dException) instead of implementingExceptiondirectly, soon Exceptionstill catches it, and it carries whatStaleShaderBundle(new since 0.8.5, gone in 1.0) carried:asset,refreshingandadvicefor a stale bundle.dart fixrenames every use.ShaderBundleStage.ShaderBundleStage(nothing to do).fragment:is optional now, beside a newkind:, so every call that passed it compiles and means what it did; a stage given neither is a vertex stage.ShaderHandle(by hand). A handle has no public constructor since 1.0: a device hands one out. A backend wraps its own object withwrapShaderfrompackage:flutter3d_hardware/backend.dart, naming itself asownerso the handle'sdisposegives it back; a test's fake does the same.ShaderLibrary(by hand). Anabstract base mixin classsince 1.0: writewith ShaderLibrary(orextends ShaderLibrary) where you wroteimplements ShaderLibrary.StageBindings(migrate).StageBindingsis a class:.blocksis.blocks,.samplersis.samplers; a destructuring pattern is yours to rewrite.StageBindingsis a class with the sameblocksandsamplers, so a binding kind can be added to it later. A literal(blocks: …, samplers: …)becomesStageBindings(blocks: …, samplers: …), and either field may be left out for an empty set.StencilFace(nothing to do).StencilFaceis gone. No member of the hardware layer took one: which face a stencil state is for is said byPassEncoder.setStencil(front, back: …), one state for both faces or a second for the back. A use of it is deleted with the value it named.StencilOperation(migrate, with a TODO).StencilOperationis a class: aswitchover it that names every value gains_ => throw UnimplementedError().StencilOperationis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.StorageBuffer(by hand). A handle has no public constructor since 1.0: a device hands one out. A backend wraps its own object withwrapStorageBufferfrompackage:flutter3d_hardware/backend.dart, naming itself asownerso the handle'sdisposegives it back; a test's fake does the same.StorageMode(migrate, with a TODO).StorageModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().StorageModeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.StoreAction(migrate, with a TODO).StoreActionis a class: aswitchover it that names every value gains_ => throw UnimplementedError().StoreActionis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.TextureAllocator(by hand). Anabstract base mixin classsince 1.0: writewith TextureAllocatorwhere you wroteimplements TextureAllocator. AGraphicsDevicealready is one.TextureAllocator.createTexture(by hand). An allocator (a backend, a test's fake) overridescreateTexture(TextureDescriptor descriptor)now. Make the 2D target it always made whendescriptor is RenderTargetDescriptor, and the general form (whatcreateTextureWithDescriptormade) otherwise, or refuse it withUnsupportedCapabilityException(DeviceFeature.textureWrites, …).TextureBlockLayout(dart fix).TextureBlockLayoutis imported frompackage:flutter3d_hardware/flutter3d_hardware.dart.TextureFormat(by hand).TextureFormathas new values (r8g8b8a8SNormInt,r8g8b8a8UInt,r8g8b8a8SInt,r16Float,r16g16Float,r16g16b16a16UInt,r16g16b16a16SInt,r32UInt,r32SInt,r32g32Float,r32g32UInt,r32g32SInt,r32g32b32a32UInt,r32g32b32a32SInt,r10g10b10a2UNormInt,r11g11b10UFloat,r9g9b9e5UFloat,d16UNormInt,d32Float): aswitchover aTextureFormatthat names every value needs a case for each, or a wildcard.TextureFormat(by hand). An open set since 1.0, so a format a later minor adds breaks noswitch: one over aTextureFormatneeds a_ =>case.values,name(the wire name a file stores) andindexare where they were;TextureFormat.byNamereplacesvalues.byNameandasNameMap.TextureFormatCompression(dart fix).TextureFormatCompressionis imported frompackage:flutter3d_hardware/flutter3d_hardware.dart.TextureHandle(by hand). A handle has no public constructor since 1.0: a device hands one out. A backend wraps its own object withwrapTexturefrompackage:flutter3d_hardware/backend.dart, naming itself asownerso the handle'sdisposegives it back; a test's fake does the same.TextureType(migrate, with a TODO).TextureTypeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TextureTypeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.Trace.formatVersion(nothing to do). A trace is version 2 now, which records an attachment's layer, a depth attachment's level, layer, face and read-only flags, and a created texture's whole descriptor.Trace.decodestill reads version 1, lifted unchanged, so a trace kept from before opens as it did and no code has to change.TraceBindTexture.sampler(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.TraceBlobWriter.take(dart fix).TraceBlobWriter.takeisdrain. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.TraceColorTarget(migrate).TraceColorTargetis a class:.textureis.texture,.resolveTextureis.resolveTexture,.loadActionis.loadAction,.storeActionis.storeAction,.clearValueis.clearValue,.faceis.face,.mipLevelis.mipLevel; a destructuring pattern is yours to rewrite.TraceColorTargetis a class with the same seven fields and alayer, withColorTarget's defaults, so it grows asColorTargetdoes. A literal(texture: …, loadAction: …, …)becomesTraceColorTarget(texture: …, loadAction: …, …), and a field at its default may be left out.TraceCreatePipeline.layout(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.TraceCreateTexture.spec(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.TraceCreateTexture.spec(nothing to do). The field widened fromRenderTargetDescriptorto theTextureDescriptorit extends, so a trace event built with a pool's target still compiles, and reads back as one. Code that readspecinto aRenderTargetDescriptorvariable declares it aTextureDescriptor, or testsis RenderTargetDescriptor.TraceDepthTarget(migrate).TraceDepthTargetis a class:.textureis.texture,.clearValueis.clearValue,.loadActionis.loadAction,.storeActionis.storeAction,.stencilLoadActionis.stencilLoadAction,.stencilStoreActionis.stencilStoreAction,.stencilClearValueis.stencilClearValue; a destructuring pattern is yours to rewrite.TraceDepthTargetis a class with the same seven fields andmipLevel,layer,face,depthReadOnlyandstencilReadOnly, withDepthTarget's defaults. A literal(texture: …, clearValue: …, …)becomesTraceDepthTarget(texture: …, clearValue: …, …), and a field at its default may be left out.TraceDraw.TraceDraw(migrate).TraceDraw(x0, x1)isTraceDraw(x0, instanceCount: x1). The instance count is a named argument, besidefirstIndexandindexCount: writeTraceDraw(pass, instanceCount: n)where it was the second positional argument.TraceEvent(nothing to do).TraceEventandTracePassEventareabstract baserather thansealed, so a HAL call added in a 1.x minor adds an event without a break. Aswitchover them needs adefaultbranch now (the analyzer says where); the replay's default throws naming the event's kind.TraceSetAlphaToCoverage(by hand).TracePassEventhas a new case,TraceSetAlphaToCoverage: aswitchover aTracePassEventthat names every case needs one for it, or a wildcard.TraceSetBlendColor(by hand). The traced blend constant is aLinearColor: construct the event withTraceSetBlendColor(pass, LinearColor(r, g, b, a)), and read.r,.g,.b,.awhere you read.x,.y,.z,.w. A trace file holds the same four numbers and reads as before.UniformMemberLayout(migrate).UniformMemberLayoutis a class:.offsetis.offset,.byteLengthis.byteLength,.elementsis.elements,.typeis.type; a destructuring pattern is yours to rewrite.UniformMemberLayoutis a class with the same four fields, so a layout can carry a stride later. A literal(offset: …, byteLength: …, elements: …, type: …)becomesUniformMemberLayout(offset: …, …), andelementsmay be left out for a member that is not an array.VertexFormat(by hand). An open set since 1.0: aswitchover it needs a_ =>case.values,name,index,bytesPerElement,componentCountandbyNameare there.VertexLayoutSpec(dart fix).VertexLayoutSpecisVertexLayoutDescriptor. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.VertexStepMode(migrate, with a TODO).VertexStepModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().VertexStepModeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.lookUpDevicePresenter(by hand).registry.presenterFor(device)on theDeviceRegistrythe device came from.openRegisteredDevice(by hand).registry.open(width:, height:)on the engine'sDeviceRegistry, oropenDevice(...)fromflutter3d_app.registerBackendOpener(by hand). Backends are added to an engine's ownDeviceRegistrysince 1.0:registry.addBackend(name, open, asFallback: ...), opened withregistry.open(width:, height:). A backend package'sregister*Backend(registry)does it for you;flutter3d_app'splatformDevices()makes one with this platform's.registerDevicePresenter(by hand).registry.addPresenter<T>(presenter)on the engine'sDeviceRegistry.
flutter3d_impeller #
- 44 names were the package's own (gone internal): they are not exported since 1.0.0-rc.1, and the import of
flutter3d_impellerthat brought them gets one diagnostic for all of them.BlendFactorToGpu,BlendOperationToGpu,CompareFunctionToGpu,CullModeToGpu,GpuCommandEncoder,GpuFrame,GpuLoadedShaderLibrary,GpuShaderLibrary,GpuTextureHandle,IndexTypeFromGpu,IndexTypeToGpu,LoadActionToGpu,MinMagFilterFromGpu,MinMagFilterToGpu,MipFilterFromGpu,MipFilterToGpu,PolygonModeToGpu,PrimitiveTypeToGpu,SamplerAddressModeFromGpu,SamplerAddressModeToGpu,SamplerOptionsFromGpu,SamplerOptionsToGpu,StencilFaceToGpu,StencilOperationToGpu,StencilStateToGpu,StorageModeFromGpu,StorageModeToGpu,StoreActionToGpu,TextureFormatFromGpu,TextureFormatToGpu,TextureTypeToGpu,VertexFormatFromGpu,VertexFormatToGpu,VertexLayoutSpecToGpu,VertexStepModeFromGpu,VertexStepModeToGpu,WindingOrderToGpu,colorFormatOrFallback,createGpuTexture,defaultColorFormatOfContext,defaultDepthStencilFormat,forgetDefaultColorFormat,impellerSectionOf,runningSdk. An application opens the backend withGpuRenderBackend.createor adds it to aDeviceRegistrywithregisterGpuBackend;GpuRenderBackend.frameImagegives a frame as adart:uiimage. GpuRenderBackend(by hand). WhatGpuRenderBackendinherits fromGraphicsDevicechanged: the texture creators answer a non-null handle and throw where they answered null,readPixelsisreadback, and the deprecatedsupportsX,maxAnisotropyandmaxColorAttachmentsarefeatures.has(...)andlimits. The entries forGraphicsDevicesay each.GpuRenderBackend.create(dart fix).GpuRenderBackend.createisopen. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.GpuRenderBackend.create(dart fix). Every backend opens in one shape,await X.open(width:, height:). Impeller sizes each target as it is drawn and does not hold the size, so any surface's size will do; pass the one you draw at.GpuRenderBackend.create(dart fix). An application's own stages reach the renderer one way on every backend: load the bundle withdevice.loadShaders(bytes)and hand the library torenderer.renderSteps.addMaterials, which takes it out again when its registration is cancelled.GpuRenderBackend.openno longer takesextraBundles.GpuRenderBackend.createPipeline(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.GpuRenderBackend.createStorageBuffer(migrate).GpuRenderBackend.createStorageBufferbecomesx.createBuffer(BufferDescriptor(lengthInBytes: {0}.lengthInBytes, usage: BufferUsage.standardStorage), contents: {0}). One call makes every buffer: a storage buffer iscreateBufferwithBufferUsage.standardStorage. Impeller refuses a storage usage either way, as it refused this call.GpuRenderBackend.createTexture(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.GpuRenderBackend.debugReadbackStagingCount(nothing to do). SeeGpuRenderBackend.emplace.GpuRenderBackend.debugTransientRecreations(nothing to do). SeeGpuRenderBackend.emplace.GpuRenderBackend.emplace(nothing to do).emplace,granule,noteRejectedSubmission,debugReadbackStagingCountanddebugTransientRecreationswere the backend's own plumbing between its device and its encoder, with flutter_gpu'sBufferViewin a public signature; they are not exported since 1.0, and nothing outside the backend has a use for them.GpuRenderBackend.granule(nothing to do). SeeGpuRenderBackend.emplace.GpuRenderBackend.noteRejectedSubmission(nothing to do). SeeGpuRenderBackend.emplace.GpuRenderBackend.readBufferSync(nothing to do). It only ever refused: a flutter_gpuDeviceBufferhas no read path, and the device is not aSynchronousBufferReadback.GpuRenderBackend.readPixels(dart fix).GpuRenderBackend.readPixelsisreadback.ensureGpuBackendRegistered(by hand). There is no process-wide registry since 1.0:registerGpuBackend(registry)adds Impeller and its presenter to an engine's ownDeviceRegistry.flutter3d_app'splatformDevices()does it for this platform.
flutter3d_lab #
package:flutter3d_lab/flutter3d_lab.dart(migrate).package:flutter3d_lab/flutter3d_lab.dartispackage:flutter3d_education/lab.dart.flutter3d_labis thelab.dartlibrary offlutter3d_education, with the API it had;package:flutter3d_education/flutter3d_education.dartexports it beside its siblings. It was on pub.dev asflutter3d_lab.package:flutter3d_lab/src/(migrate).package:flutter3d_lab/src/ispackage:flutter3d_education/src/lab/. What was underflutter3d_lab'slib/src/is underlib/src/lab/offlutter3d_education. Importing it was never the public API; the main library above is.PendulumLabRun(nothing to do). The defaultgravityis written asstandardGravity, which is the same 9.81 m/s²; every call means what it meant.PendulumSimulation(nothing to do). The defaultgravityis written asstandardGravity, which is the same 9.81 m/s²; every call means what it meant.
flutter3d_lti #
package:flutter3d_lti/flutter3d_lti.dart(migrate).package:flutter3d_lti/flutter3d_lti.dartispackage:flutter3d_education_lti/flutter3d_education_lti.dart.flutter3d_ltiisflutter3d_education_lti, with the API it had, besideflutter3d_educationand over its experiment. It was on pub.dev asflutter3d_lti.package:flutter3d_lti/src/(migrate).package:flutter3d_lti/src/ispackage:flutter3d_education_lti/src/. What was underflutter3d_lti'slib/src/is underflutter3d_education_lti's. Importing it was never the public API; the main library above is.AgsActivityProgress(dart fix).AgsActivityProgressis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.AgsActivityProgressisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.AgsClient(dart fix).AgsClientis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.AgsClientisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.AgsClient.platform(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.AgsException(nothing to do).AgsExceptionis still a final class with the same members; it now extendsResourceException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon AgsExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.AgsGradingProgress(dart fix).AgsGradingProgressis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.AgsGradingProgressisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.AgsScore(dart fix).AgsScoreis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.AgsScoreisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiClaim(dart fix).LtiClaimis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiClaimisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiDeploymentMismatchException(dart fix).LtiDeploymentMismatchExceptionis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiDeploymentMismatchExceptionisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiLaunchClaims(dart fix).LtiLaunchClaimsis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiLaunchClaimsisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiLaunchException(dart fix).LtiLaunchExceptionis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiLaunchExceptionisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiLaunchException(migrate, with a TODO).LtiLaunchExceptionis a class: aswitchover it that names every value gains_ => throw UnimplementedError().LtiLaunchExceptionis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.LtiLaunchValidator(dart fix).LtiLaunchValidatoris imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiLaunchValidatorisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiLaunchValidator.platform(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.LtiMessageType(migrate, with a TODO).LtiMessageTypeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().LtiMessageTypeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.LtiMessageType(dart fix).LtiMessageTypeis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiMessageTypeisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiNonceMismatchException(dart fix).LtiNonceMismatchExceptionis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiNonceMismatchExceptionisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiPlatformConfig(dart fix).LtiPlatformConfigisLtiPlatformSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.LtiStateMismatchException(dart fix).LtiStateMismatchExceptionis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiStateMismatchExceptionisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiTokenExpiredException(dart fix).LtiTokenExpiredExceptionis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiTokenExpiredExceptionisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiTokenInvalidException(dart fix).LtiTokenInvalidExceptionis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiTokenInvalidExceptionisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.LtiToolCredentials(dart fix).LtiToolCredentialsis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.LtiToolCredentialsisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.OidcLoginInitiation(dart fix).OidcLoginInitiationis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.OidcLoginInitiationisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.OidcLoginInitiation.platform(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.OidcLoginRedirect(dart fix).OidcLoginRedirectis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.OidcLoginRedirectisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.XapiActivity(dart fix).XapiActivityis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.XapiActivityisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.XapiActor(dart fix).XapiActoris imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.XapiActorisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.XapiClient(dart fix).XapiClientis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.XapiClientisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.XapiClient.lrs(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.XapiException(nothing to do).XapiExceptionis still a final class with the same members; it now extendsResourceException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon XapiExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.XapiLrsConfig(dart fix).XapiLrsConfigisXapiLrsSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.XapiResult(dart fix).XapiResultis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.XapiResultisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.XapiStatement(dart fix).XapiStatementis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.XapiStatementisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.XapiVerb(dart fix).XapiVerbis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.XapiVerbisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.generateRsaKeyPair(dart fix).generateRsaKeyPairis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.generateRsaKeyPairisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.generateUuidV4(dart fix).generateUuidV4is imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.generateUuidV4isflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.rsaPrivateKeyFromJwk(dart fix).rsaPrivateKeyFromJwkis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.rsaPrivateKeyFromJwkisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.rsaPrivateKeyToJwk(dart fix).rsaPrivateKeyToJwkis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.rsaPrivateKeyToJwkisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.rsaPublicKeyFromJwk(dart fix).rsaPublicKeyFromJwkis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.rsaPublicKeyFromJwkisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.rsaPublicKeyToJwk(dart fix).rsaPublicKeyToJwkis imported frompackage:flutter3d_education_lti/flutter3d_education_lti.dart.rsaPublicKeyToJwkisflutter3d_education_lti's, under the same name;migrateadds the dependency anddart fixthe import.
flutter3d_mcp_kit #
package:flutter3d_mcp_kit/flutter3d_mcp_kit.dart(migrate).package:flutter3d_mcp_kit/flutter3d_mcp_kit.dartispackage:flutter3d_mcp/kit.dart.flutter3d_mcp_kitis thekit.dartlibrary offlutter3d_mcp, with the API it had;package:flutter3d_mcp/flutter3d_mcp.dartexports it beside its siblings. It was on pub.dev asflutter3d_mcp_kit.package:flutter3d_mcp_kit/src/(migrate).package:flutter3d_mcp_kit/src/ispackage:flutter3d_mcp/src/kit/. What was underflutter3d_mcp_kit'slib/src/is underlib/src/kit/offlutter3d_mcp. Importing it was never the public API; the main library above is.package:flutter3d_mcp_kit/project_tools.dart(migrate).package:flutter3d_mcp_kit/project_tools.dartispackage:flutter3d_mcp/project_tools.dart. The project server's tool registry, a library offlutter3d_mcpnow, under the same name.Answer(migrate).Answeris a class:.didis.did,.saysis.says; a destructuring pattern is yours to rewrite.Answeris a class with the samedidandsays, and thepnga drawing tool hands back: writeAnswer(did: true, says: '…')where a tool built the record(did: true, says: '…').LoopbackMcpServer(nothing to do). Every signature is as it was. A request presents its token asAuthorization: Bearer <token>only; one sent as?token=is answered 401, and a body over 64 MiB is answered 413.McpTools.addTool(by hand).addTooltakes aToolSpec, and a plugin adding one must listPluginPermission.toolsin its manifest'spermissions, or the call throws aPluginException. Declare the namespace's schema version withdeclareSchemaVersion('1.0.0')before adding tools.McpTools.addTool(migrate).run: xofMcpTools.addToolisrun: (call) => (x)(call.arguments). A project tool's body,ProjectToolRun, takes oneToolCallwith theargumentsand the publishedname, where it took the arguments' map:(arguments) => ...is(ToolCall call) => ...readingcall.arguments.migratewraps the old body,(call) => (old)(call.arguments), which runs as it did. The application's own tools are refused a namespace that is one of the engine's areas (game,level,PluginManifest.reservedAreas): name them after the application.OfferedPrompt.prompt(by hand). The server builds the protocol prompt itself; readnameanddescriptionfrom theOfferedPrompt.OfferedTool(by hand).OfferedTooltakes aToolSpec, not the MCP library'sTool. Build it withToolSpec(name:, description:, inputSchema: {...}), or keep the library's schema builders inside your package and convert withToolSpec(inputSchema: ObjectSchema(...) as Map<String, Object?>).OfferedTool(migrate).run: xofOfferedToolisrun: (call) => (x)(call.session, call.arguments). A tool's body takes oneSessionToolCall, the session and the arguments together with the name it was called by, where it took the two as parameters:(session, arguments) => ...is(call) => ...readingcall.sessionandcall.arguments. One call object can be handed more in a minor (progress, cancellation), where a third parameter would break every tool.migratewraps the old body,(call) => (old)(call.session, call.arguments), which runs as it did; a call oftool.run(session, arguments)istool.runOn(session, arguments).OfferedTool.run(migrate).OfferedTool.runbecomesx.runOn({0}, {1}). A tool's body is called with oneSessionToolCall; a caller that holds the session and the arguments callsrunOn(session, arguments), which builds the call with the tool's own name:tool.run(session, args)istool.runOn(session, args).OfferedTool.tool(dart fix).OfferedTool.toolisOfferedTool.spec. A tool is aToolSpecnow, flutter3d's own type with JSON-map schemas: readspec.name,spec.description,spec.inputSchema.PictureAnswer(dart fix).PictureAnswerisAnswer.Answercarries the picture now, aspng, so there is one answer type: writeAnswer(did: …, says: …, png: bytes).ProjectToolRun(by hand). A project tool answers aToolResult(ToolResult.text('...'), orToolResult(content: [ToolText(...), ToolImage(png)], structuredContent: {...})), not aCallToolResult.ToolImage(nothing to do). Seemcpkit-ToolText: the other kind ofToolContent.ToolTableServer(by hand).ToolTableServerholds the MCP server instead of extending it: itsMCPServermembers are gone (usedone,shutdown,serverInfo),toResultreturns aToolResult,onProjectCallhears aToolResult, and tools may be published asarea.verbwithnames:.ToolTableServer(by hand).onCall(andonProjectCall) is handed oneAnsweredCallwhere it was handed four arguments, so a watcher keeps working when a call says more:onCall: (name, arguments, answer, elapsed) => ...isonCall: (AnsweredCall<A> call) => ..., readingcall.toolName,call.arguments,call.answerandcall.elapsed.ToolText(nothing to do).ToolTextandToolImageare the two kinds ofToolContentin flutter3d's ownToolResult, which replaces the MCP library's result type in every signature; there was no switch over flutter3d's content before, so none is missing a case.pictureResultOf(nothing to do). It returns aToolResultinstead of aCallToolResult; a server'stoResulttakes it as before.refuseArguments(by hand).refuseArgumentstakes aToolSpec; passoffered.spec.resultOf(nothing to do). It returns aToolResultinstead of aCallToolResult; a server'stoResulttakes it as before.
flutter3d_mesh #
ArrayModifier.fromJson(migrate, with a TODO).ArrayModifier.fromJsonthrowsModifierFormatExceptionwhere it returned null: a null check beside a call becomestry … on ModifierFormatException. It throws aModifierFormatExceptionnaming the field where it answered null;modifierFromJsonstill answers null for a modifier it skips.BooleanModifier.fromJson(migrate, with a TODO).BooleanModifier.fromJsonthrowsModifierFormatExceptionwhere it returned null: a null check beside a call becomestry … on ModifierFormatException. It throws aModifierFormatExceptionnaming the field where it answered null;modifierFromJsonstill answers null for a modifier it skips.Brush(dart fix).BrushisMeshBrush. The sculpting brush isMeshBrush;Brushis the level's box influtter3d_sim, and a file that imported both had to hide one.CornerAttributes(migrate).colour: Vector3(x, y, z)ofCornerAttributesiscolor: LinearColor(x, y, z). A corner's colour is a linearLinearColor, as a vertex colour is:CornerAttributes(colour: Vector4(r, g, b, a))isCornerAttributes(color: LinearColor(r, g, b, a)), andEditMesh'scolorOfanswers one andsetColortakes one.CornerAttributes.CornerAttributes(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.CornerAttributes.colour(dart fix).CornerAttributes.colouriscolor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.CsgOperation(migrate, with a TODO).CsgOperationis a class: aswitchover it that names every value gains_ => throw UnimplementedError().CsgOperationis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.EditMesh.colourOf(dart fix).EditMesh.colourOfiscolorOf. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.EditMesh.makeConsistent(dart fix).EditMesh.makeConsistentisensureConsistent. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.EditMesh.setColour(dart fix).EditMesh.setColourissetColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ElementLevel(migrate, with a TODO).ElementLevelis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ElementLevelis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.FaceTriangulator.fannedLastFace(dart fix).FaceTriangulator.fannedLastFaceisdidFanLastFace. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.FittedBox(dart fix).FittedBoxisFittedCuboid. A public name does not shadow one of Flutter's, andFittedBoxis a Flutter widget: the boxfitBoxByInertiaanswers isFittedCuboid, with the same fields.ImportReport(dart fix).ImportReportisMeshImportReport. WhatimportMeshDatareports about one mesh's weld isMeshImportReport;ImportReportisflutter3d_model_core's, about a whole document imported into a project.ImportReport.worthReporting(dart fix).ImportReport.worthReportingisisWorthReporting. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.IssueSeverity(migrate, with a TODO).IssueSeverityis a class: aswitchover it that names every value gains_ => throw UnimplementedError().IssueSeverityis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis there too.IssueSeverity(dart fix).IssueSeverityis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart. A mesh check, an export and a level's validation speak one severity,Severityfromflutter3d_foundation, withnote,warninganderrorand the same wire words.JournalledFloats(dart fix).JournalledFloatsisJournaledFloats. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.JournalledInts(dart fix).JournalledIntsisJournaledInts. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.MergeReport.worthReporting(dart fix).MergeReport.worthReportingisisWorthReporting. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.MeshAttribute(migrate, with a TODO).MeshAttributeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().MeshAttributeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.MeshBvh(nothing to do). Only the float32 ray in its signature changed:RayisLocalRay(core-Ray-LocalRayrenames it).MeshDomain(migrate, with a TODO).MeshDomainis a class: aswitchover it that names every value gains_ => throw UnimplementedError().MeshDomainis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.MeshHit(migrate).MeshHitis a class:.faceis.face,.triangleis.triangle,.distanceis.distance,.pointis.point; a destructuring pattern is yours to rewrite.MeshHitis a final class with the sameface,triangle,distanceandpoint, equal by all four as the record was; only a destructuring pattern names the class.MeshIssue.severity(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.MeshIssueKind.boundaryEdge(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.MeshIssueKind.degenerateFace(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.MeshIssueKind.duplicateVertex(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.MeshIssueKind.invertedShell(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.MeshIssueKind.isolatedVertex(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.MeshIssueKind.ngon(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.MeshIssueKind.nonManifoldVertex(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.MeshIssueKind.severity(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.MeshLayoutPlan.fannedAnyFace(dart fix).MeshLayoutPlan.fannedAnyFaceisdidFanAnyFace. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.MeshPicker(nothing to do). Only the float32 ray in its signature changed:RayisLocalRay(core-Ray-LocalRayrenames it).MirrorModifier.fromJson(migrate, with a TODO).MirrorModifier.fromJsonthrowsModifierFormatExceptionwhere it returned null: a null check beside a call becomestry … on ModifierFormatException. It throws aModifierFormatExceptionnaming the field where it answered null;modifierFromJsonstill answers null for a modifier it skips.Modifier(migrate, with a TODO).Modifieris a class: aswitchover it that names every value gains_ => throw UnimplementedError().Modifieris anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.OpResult.ok(dart fix).OpResult.okisisOk. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.ParametricShape(migrate, with a TODO).ParametricShapeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ParametricShapeis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.RecipeCategory(migrate, with a TODO).RecipeCategoryis a class: aswitchover it that names every value gains_ => throw UnimplementedError().RecipeCategoryis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.SculptMeshBvh(nothing to do). Only the float32 ray in its signature changed:RayisLocalRay(core-Ray-LocalRayrenames it).SimplifiedMesh(migrate).SimplifiedMeshis a class:.meshis.mesh,.erroris.error; a destructuring pattern is yours to rewrite.SimplifiedMeshis a final class with the samemeshanderror; only a destructuring pattern names the class.SmoothModifier.fromJson(migrate, with a TODO).SmoothModifier.fromJsonthrowsModifierFormatExceptionwhere it returned null: a null check beside a call becomestry … on ModifierFormatException. It throws aModifierFormatExceptionnaming the field where it answered null;modifierFromJsonstill answers null for a modifier it skips.SubdivisionModifier.fromJson(migrate, with a TODO).SubdivisionModifier.fromJsonthrowsModifierFormatExceptionwhere it returned null: a null check beside a call becomestry … on ModifierFormatException. It throws aModifierFormatExceptionnaming the field where it answered null;modifierFromJsonstill answers null for a modifier it skips.applyBrushStroke(nothing to do). It takes the same brush under its new name,MeshBrush; a call that passed aBrushpasses the renamed one, whichdart fixwrites.bevelledCube(dart fix).bevelledCubeisbeveledCube. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.fitBoxByInertia(nothing to do). It returns the same box under its new name,FittedCuboid; the rename of the type carries the fix, and a call needs none.importMeshData(nothing to do). The record it returns holds the same report under its new name,MeshImportReport; a pattern that named the type is renamed bydart fix.projectBrush(dart fix). Public names are spelled the American way and say what they hold:centre:iscenter:, the same values.simplifyMesh(dart fix). Public names are spelled the American way and say what they hold:isCancelled:isisCanceled:, the same values.simplifyMeshWithAttributes(dart fix). Public names are spelled the American way and say what they hold:isCancelled:isisCanceled:, the same values.simplifyMeshWithAttributesMeasured(dart fix). Public names are spelled the American way and say what they hold:isCancelled:isisCanceled:, the same values.unwrapMesh(dart fix). Public names are spelled the American way and say what they hold:isCancelled:isisCanceled:, the same values.
flutter3d_model_core #
AddLight.AddLight(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.AddLight.type(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.AssetAudit.baseCentre(dart fix).AssetAudit.baseCentreisbaseCenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.AssetAudit.clean(dart fix).AssetAudit.cleanisisClean. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.AuditCheck(migrate, with a TODO).AuditCheckis a class: aswitchover it that names every value gains_ => throw UnimplementedError().AuditCheckis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.BendJoint(by hand).BendJoint(degrees:)isBendJoint(angle:), in radians, as every angle in the engine is (docs/CONTRACTS.md): passradians(d)forddegrees. The journal and thebendJointMCP tool keep theirdegreesargument; their reader converts.BindWeightsJobRequest.BindWeightsJobRequest(dart fix). A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.BlendMode(dart fix).BlendModeisPaintBlendMode.BlendModeisdart:ui's, which Flutter's painting library exports: the mode a paint layer composites with isPaintBlendMode, with the same constants andblendChannel.BoneMap(migrate, with a TODO).BoneMapis afinalclass: a class that extended or implemented it gets a TODO. A value the rig builder returns,finalsince 1.0: hold one in a class of your own instead of extending it.BrushSample.fromJson(migrate, with a TODO).BrushSample.fromJsonthrowsProjectFormatExceptionwhere it returned null: a null check beside a call becomestry … on ProjectFormatException. It throws aProjectFormatExceptionnaming the field where it answered null for JSON it could not read.BudgetUsage.over(dart fix).BudgetUsage.overisisOver. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.BuiltRig(migrate, with a TODO).BuiltRigis afinalclass: a class that extended or implemented it gets a TODO. A value the rig builder returns,finalsince 1.0: hold one in a class of your own instead of extending it.CheckerTextureNode(migrate).colorA:,colorB:ofCheckerTextureNode:Vector4(x, y, z, w)isLinearColor(x, y, z, w). A checker'scolorAandcolorBareLinearColors, black and white by default as before: writeLinearColor(r, g, b, a)where they took aVector4.ChoiceHint(nothing to do). Not a new case ofParamHint: it isEnumHintunder its new name, so a switch that handledEnumHinthandles it oncedart fixrenames it.ColorTextureNode(migrate).value: Vector4(x, y, z, w)ofColorTextureNodeisvalue: LinearColor(x, y, z, w). A colour node'svalueis aLinearColor, linear RGBA as before: writeLinearColor(r, g, b, a)where it took aVector4.EnumHint(dart fix).EnumHintisChoiceHint. A command argument chosen from named values is hinted byChoiceHint;EnumHintis the material's (MaterialHintKind), fromflutter3d_core, and a file reading both no longer hides one.ExportFormat(migrate, with a TODO).ExportFormatis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ExportFormatis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.ExportIssue.severity(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.ExportResult(migrate, with a TODO).ExportResultis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ExportResultis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.ExportSeverity(dart fix).ExportSeverityis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart. A mesh check, an export and a level's validation speak one severity,Severityfromflutter3d_foundation, with the samewarninganderror.ExportSeverity(migrate, with a TODO).ExportSeverityis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ExportSeverityis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.Geometry(migrate, with a TODO).Geometryis a class: aswitchover it that names every value gains_ => throw UnimplementedError().Geometryis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.ImportOptions(dart fix).ImportOptionsisImportSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.ImpostorAtlas.cameraFor(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ImpostorBake(migrate).ImpostorBakeis a class:.atlasis.atlas,.sizeis.size,.rgbais.rgba; a destructuring pattern is yours to rewrite.ImpostorBakeis a final class with the sameatlas,sizeandrgba; only a destructuring pattern names the class.ImpostorCard.ImpostorCard.framing(dart fix). Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.ImpostorCard.cornersAt(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.JobRequest.fromJson(migrate, with a TODO).JobRequest.fromJsonthrowsProjectFormatExceptionwhere it returned null: a null check beside a call becomestry … on ProjectFormatException. It throws aProjectFormatExceptionnaming the field where it answered null for JSON it could not read.JobResult.fromJson(migrate, with a TODO).JobResult.fromJsonthrowsProjectFormatExceptionwhere it returned null: a null check beside a call becomestry … on ProjectFormatException. It throws aProjectFormatExceptionnaming the field where it answered null for JSON it could not read.JournalReplay.ok(dart fix).JournalReplay.okisisOk. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.Key(dart fix).KeyisKeyframe.Keyis a Flutter widget's identity, which every file that imports material and this package had tohide: a key of aKeyTableis aKeyframe, with the sametime,valuesand tangents.KeyTable.keys(nothing to do). Only a type it names was renamed (a name Flutter or Dart also declares); the type's rename carries its own fix, and a call needs none.LodSpec(dart fix).LodSpecisLodSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.ModelCommand(migrate, with a TODO).ModelCommandis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ModelCommandis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.ModelCredit(migrate).ModelCreditis a class:.titleis.title,.authoris.author,.licenceis.license,.urlis.url; a destructuring pattern is yours to rewrite.ModelCreditis a final class with the sametitle,authorandurl, andlicenseforlicence; a credit is built withModelCredit(title: …, author: …, license: …, url: …). Only a destructuring pattern names the class.ModelCredit.licence(dart fix).ModelCredit.licenceislicense. Public names are spelled the American way: a credit'slicencefield islicense, read and built alike.ModelHistory.ModelHistory(dart fix). A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.ModelHistory.ModelHistory.withSteps(dart fix). A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.ModelObject.ModelObject(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.ModelObject.copyWith(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.ModelObject.lods(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.ModelProjectView(migrate).ModelProjectViewis a base mixin class:implements ModelProjectViewbecomeswith ModelProjectView, on abaseclass.OriginPlacement(migrate, with a TODO).OriginPlacementis a class: aswitchover it that names every value gains_ => throw UnimplementedError().OriginPlacementis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.Outcome.ok(dart fix).Outcome.okisisOk. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.PaintLayer.PaintLayer(nothing to do). Only a type it names was renamed (a name Flutter or Dart also declares); the type's rename carries its own fix, and a call needs none.PaintLayer.blendMode(nothing to do). Only a type it names was renamed (a name Flutter or Dart also declares); the type's rename carries its own fix, and a call needs none.PaintMirror.fromJson(migrate, with a TODO).PaintMirror.fromJsonthrowsProjectFormatExceptionwhere it returned null: a null check beside a call becomestry … on ProjectFormatException. It throws aProjectFormatExceptionnaming the field where it answered null for JSON it could not read.PaintSample.PaintSample(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.PaintSample.centre(dart fix).PaintSample.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.PaintSample.fromJson(migrate, with a TODO).PaintSample.fromJsonthrowsProjectFormatExceptionwhere it returned null: a null check beside a call becomestry … on ProjectFormatException. It throws aProjectFormatExceptionnaming the field where it answered null for JSON it could not read.PaintStroke.PaintStroke(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.PaintStroke.colour(dart fix).PaintStroke.colouriscolor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.PaintVertexColor(nothing to do).PaintVertexColorisPaintVertexColourunder its American name, not a new command; the rename entry carries every use, acaseincluded.PaintVertexColour(dart fix).PaintVertexColourisPaintVertexColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.PaintVertexColour.PaintVertexColour(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.PaintVertexColour.colour(dart fix).PaintVertexColour.colouriscolor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.PanoramaSync.rebuiltLast(dart fix).PanoramaSync.rebuiltLastisdidRebuildLast. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.ParamHint(migrate, with a TODO).ParamHintis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ParamHintis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.ProfileBudgetReport.anyOver(dart fix).ProfileBudgetReport.anyOverishasAnyOver. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.ProfileTarget(migrate, with a TODO).ProfileTargetis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ProfileTargetis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.ProjectLight(migrate).color: Vector3(x, y, z)ofProjectLightiscolor: LinearColor(x, y, z). A project light'scoloris aLinearColor, asLightNode.coloris: writeLinearColor(r, g, b)where it took aVector3, and read.r,.gand.bwhere it read.x,.yand.z.ProjectLight(by hand). A project light'sintensityis lux for a directional light and candela for the others, asLightNode.intensityis, and a new light isLightNode.defaultIntensity(about 5 790.6), the light it always drew as. A number written for the pre-1.0 unit is that number timesLightNode.defaultIntensity. A project file of version 1 is lifted as it is read.ProjectLightType(dart fix).ProjectLightTypeis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart. A project's lights are the scene's kinds,LightTypefromflutter3d_foundation, with the same words, andareatoo.RemoveAnimationGraph(by hand).ModelCommandhas a new case,RemoveAnimationGraph: aswitchover aModelCommandthat names every case needs one for it, or a wildcard.RenderPreset.RenderPreset(nothing to do).clearColor:keeps its name and takes what the field holds, aLinearColor(seerc-model_core-RenderPreset-clearColorSrgb).RenderPreset.clearColor(migrate).clearColor: Vector3(x, y, z)ofRenderPreset.clearColorisclearColor: LinearColor.fromSrgb(x, y, z). The background is a linearLinearColor, asRenderView.clearColoris, where it was an sRGBVector4:LinearColor.fromSrgb(r, g, b, a)of the old numbers draws the same picture.RenderRefusal(dart fix).RenderRefusalisRenderRefusalException. A type that is thrown says so in its name, soon …Exceptionreads as what it catches:RenderRefusalisRenderRefusalException, with the samemessage.ResizeFilter(migrate, with a TODO).ResizeFilteris a class: aswitchover it that names every value gains_ => throw UnimplementedError().ResizeFilteris an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.RigBuildOptions(dart fix).RigBuildOptionsisRigBuildSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.RigPreview(migrate).RigPreviewis a class:.jointCountis.jointCount,.deformingCountis.deformingCount,.controllerCountis.controllerCount,.ikChainCountis.ikChainCount; a destructuring pattern is yours to rewrite.RigPreviewis a final class with the same four counts, equal by value as the record was; only a destructuring pattern names the class.SceneLighting(nothing to do). Theexposuredefault is written asRenderSettings.defaultExposurewhere it was the literal 1.6; the value is the same, so every call still compiles and draws as it did.SelectionMode(migrate, with a TODO).SelectionModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().SelectionModeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.SetAnimationGraph(by hand).ModelCommandhas a new case,SetAnimationGraph: aswitchover aModelCommandthat names every case needs one for it, or a wildcard.SetOrigin.SetOrigin(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ShapeDriver.fromJson(migrate, with a TODO).ShapeDriver.fromJsonthrowsProjectFormatExceptionwhere it returned null: a null check beside a call becomestry … on ProjectFormatException. It throws aProjectFormatExceptionnaming the field where it answered null for JSON it could not read.SimulationBakeRequest(migrate).SimulationBakeRequestis a base mixin class:implements SimulationBakeRequestbecomeswith SimulationBakeRequest, on abaseclass.SimulationCache.fromJson(migrate, with a TODO).SimulationCache.fromJsonthrowsProjectFormatExceptionwhere it returned null: a null check beside a call becomestry … on ProjectFormatException. It throws aProjectFormatExceptionnaming the field where it answered null for JSON it could not read.SkinWeightsBlob.fromJson(migrate, with a TODO).SkinWeightsBlob.fromJsonthrowsProjectFormatExceptionwhere it returned null: a null check beside a call becomestry … on ProjectFormatException. It throws aProjectFormatExceptionnaming the field where it answered null for JSON it could not read.StepAuthor(migrate, with a TODO).StepAuthoris a class: aswitchover it that names every value gains_ => throw UnimplementedError().StepAuthoris an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.TextureBlendMode(migrate, with a TODO).TextureBlendModeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TextureBlendModeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.TextureEncoding(migrate, with a TODO).TextureEncodingis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TextureEncodingis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.TextureFileFormat(migrate, with a TODO).TextureFileFormatis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TextureFileFormatis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.TextureInputSocket(migrate).TextureInputSocketis a class:.typeis.type,.fromis.from; a destructuring pattern is yours to rewrite.TextureInputSocketis a class with the sametypeandfrom: a node of your own declaresTextureInputSocket(type: …, from: …)ininputs.TextureNode(migrate, with a TODO).TextureNodeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TextureNodeis anabstract base classwith a visitor rather than a sealed class, so a node kind a later minor adds breaks noswitch: aswitchover the kinds ends with a wildcard, or reads every kind throughacceptand aTextureNodeVisitor, whosevisitUnknownanswers for a kind it predates.TextureUsage(dart fix).TextureUsageisTextureBudgetUsage. Whatmeasurefinds under a texture budget isTextureBudgetUsage;TextureUsageis the device's, the usage flags of a texture influtter3d_hardware.TextureValueType(migrate, with a TODO).TextureValueTypeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TextureValueTypeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.TransformPivot(migrate, with a TODO).TransformPivotis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TransformPivotis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.TransformSpace(migrate, with a TODO).TransformSpaceis a class: aswitchover it that names every value gains_ => throw UnimplementedError().TransformSpaceis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.TwoBoneIkResult(migrate, with a TODO).TwoBoneIkResultis afinalclass: a class that extended or implemented it gets a TODO. A value the rig builder returns,finalsince 1.0: hold one in a class of your own instead of extending it.UpAxis(migrate, with a TODO).UpAxisis a class: aswitchover it that names every value gains_ => throw UnimplementedError().UpAxisis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.bakeImpostor(dart fix). Public names are spelled the American way and say what they hold:centre:iscenter:,fovYRadians:isfovY:, the same values.bindWeightsJobRequestFor(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.buildSkeleton(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.elementCentre(dart fix).elementCentreiselementCenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.fromModelDocument(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.importInto(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.importReportOf(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.kHistoryBudgetBytes(dart fix).kHistoryBudgetBytesisdefaultHistoryBudgetBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kMaxSkinInfluences(dart fix).kMaxSkinInfluencesismaxSkinInfluences. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kPanoramaCubeLevels(dart fix).kPanoramaCubeLevelsispanoramaCubeLevels. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kPanoramaCubeSize(dart fix).kPanoramaCubeSizeispanoramaCubeSize. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectChecksumEntryBytes(dart fix).kProjectChecksumEntryBytesisprojectChecksumEntryBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectChecksumOffset(dart fix).kProjectChecksumOffsetisprojectChecksumOffset. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectHeaderBytes(dart fix).kProjectHeaderBytesisprojectHeaderBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectImageEntryBytes(dart fix).kProjectImageEntryBytesisprojectImageEntryBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectImportedEntryBytes(dart fix).kProjectImportedEntryBytesisprojectImportedEntryBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectMagic(dart fix).kProjectMagicisprojectMagic. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectMeshEntryBytes(dart fix).kProjectMeshEntryBytesisprojectMeshEntryBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectSectionEntryBytes(dart fix).kProjectSectionEntryBytesisprojectSectionEntryBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectSimulationEntryBytes(dart fix).kProjectSimulationEntryBytesisprojectSimulationEntryBytes. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kProjectVersion(dart fix).kProjectVersionisprojectVersion. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kRootMotionExtra(dart fix).kRootMotionExtraisrootMotionExtra. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.measure(nothing to do). It returns the same result under its new name,TextureBudgetUsage.package:flutter3d_mesh/flutter3d_mesh.dart(dart fix). Names re-exported frompackage:flutter3d_mesh/flutter3d_mesh.dartare imported frompackage:flutter3d_mesh/flutter3d_mesh.dart.WeightPair, whatbindWeightshands back, isflutter3d_mesh's, andflutter3d_model_coreno longer re-exports it: a caller that spells it depends onflutter3d_mesh.poseOf(nothing to do). Only the animation pose in its signature changed:PoseisAnimationPose(core-Pose-AnimationPoserenames it).previewRig(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.pruneSkinWeights(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.sceneFromProject(nothing to do). Only the engine's material type in its signature changed:MaterialisRenderMaterial(core-Material-RenderMaterialrenames it).
flutter3d_model_mcp #
package:flutter3d_model_mcp/flutter3d_model_mcp.dart(migrate).package:flutter3d_model_mcp/flutter3d_model_mcp.dartispackage:flutter3d_mcp/model.dart.flutter3d_model_mcpis themodel.dartlibrary offlutter3d_mcp, with the API it had;package:flutter3d_mcp/flutter3d_mcp.dartexports it beside its siblings. It was on pub.dev asflutter3d_model_mcp.package:flutter3d_model_mcp/src/(migrate).package:flutter3d_model_mcp/src/ispackage:flutter3d_mcp/src/model/. What was underflutter3d_model_mcp'slib/src/is underlib/src/model/offlutter3d_mcp. Importing it was never the public API; the main library above is.ModelHttpServer.start(by hand).onToolCallis handed oneAnsweredCall<PictureAnswer>; seerc-mcp_kit-ToolTableServer-onCall.ModelMcpServer(by hand).ModelMcpServer(onCall:)is handed oneAnsweredCall<PictureAnswer>; seerc-mcp_kit-ToolTableServer-onCall.ModelPictureTool(nothing to do). Its tools answer anAnswer, which carries the picture now; the rename ofPictureAnswercarries the fix, and a tool that readsdid,saysorpngreads them as before.ModelSession(nothing to do). The constructor gained an optionalroot:. The MCP toolssave,export,importandjournalrefuse a path outside the project around the session's file (the working directory with none).ModelSession.import(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.ModelSession.makeGameReady(dart fix).ModelSession.makeGameReadyisprepareForGame. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.modelMcpVersion(nothing to do). Only the value of the constant moved; code that readsmodelMcpVersiongets the new one. It is a version or a layout size the engine stamps and checks itself.package:flutter3d_mcp_kit/flutter3d_mcp_kit.dart(nothing to do). The kit's names the modeller's library re-exported are still exported bypackage:flutter3d_mcp/model.dart; they come fromkit.dartof the same package, and the import moves with the rest.
flutter3d_net #
LoopbackTransport(by hand). UseLoopbackWire.pair(delaySteps:, lossRate:, seed:), whose delay is in steps:(delaySeconds * stepsPerSecond).round(). Its ends are slots nought and one.NetSession(by hand).NetSessionis gone: the one rollback isflutter3d_net'sRollbackSession. Hand it the wire, this machine'slocalSlot, and anapplyAndStepthat reads every slot's frame by slot (frames[0],frames[1]) where it readlocalandremote;onSettledgains the frames. Over anEngineLoop, useEngineRollback, which saves and restores through the loop's snapshots.NetTransport(by hand).NetTransportis gone: every transport is aPeerWire, which a transportextends.sendgains{bool reliable = true}.NetTransportWire(by hand). Not needed any more: a transport is aPeerWirealready. Pass the transport itself.WebSocketTransport(nothing to do). It extendsPeerWirein place of implementingNetTransport, andsendgained an optionalreliable; making one, sending, listening and closing are unchanged.firstDifferingPath(dart fix).firstDifferingPathis imported frompackage:flutter3d_sim/flutter3d_sim.dart.firstDifferingPathis the simulation's, beside the snapshots it compares, andflutter3d_netno longer re-exports it.firstDifferingPath(migrate).firstDifferingPath(x0, x1, x2)isfirstDifferingPath(x0, x1, prefix: x2). The path to start from is a named argument:firstDifferingPath(a, b, 'world')isfirstDifferingPath(a, b, prefix: 'world').
flutter3d_net_webrtc #
WebRtcTransport(by hand).WebRtcTransportis aPeerWiresince 1.0, the one transportflame_multiplayerandflutter3d_netspeak, where it was aNetTransport.createOfferandawaitOffertake the signalling channel as aPeerWiretoo: hand them the relay's wire (PeerWire.partyor your adapter) where you handed aNetTransport, and declare what you keep the transport in as aPeerWire.WebRtcTransport.awaitOffer(dart fix).WebRtcTransport.awaitOfferisopenAnswering. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.WebRtcTransport.createOffer(dart fix).WebRtcTransport.createOfferisopenOffering. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.
flutter3d_particles #
BoxEmitter.emit(migrate).BoxEmitter.emittakes oneParticleBirth: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.origin, parameter 3 is.direction, parameter 4 is.random), and a call builds one.BoxEmitter.emittakes oneParticleBirthwhere it took its parameters. An emitter is a hook an effect implements, asked per particle, so the system reuses one context and an emitter must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ConeEmitter(migrate).halfAngleDegrees: xofConeEmitterishalfAngle: x * pi / 180.halfAngleDegreesishalfAngle, in radians, as every angle in the engine is (docs/CONTRACTS.md):halfAngle: 25.0 * math.pi / 180.0for what washalfAngleDegrees: 25.0. An.f3dfxfile keeps itshalfAngleDegreeskey; the reader converts.DriftEmitter.emit(migrate).DriftEmitter.emittakes oneParticleBirth: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.origin, parameter 3 is.direction, parameter 4 is.random), and a call builds one.DriftEmitter.emittakes oneParticleBirthwhere it took its parameters. An emitter is a hook an effect implements, asked per particle, so the system reuses one context and an emitter must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Emission(nothing to do). The constructor takes named arguments (effect:,origin:,perSecond:,direction:,remaining:);ParticleSystemmakes every emission fromemitandemitTimed, and a caller reads them.Emission.spent(dart fix).Emission.spentisisSpent. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.GradientKey(migrate).color: Vector3(x, y, z)ofGradientKeyiscolor: LinearColor(x, y, z). A key's colour is aLinearColor:GradientKey(0.5, Vector4(r, g, b, a))isGradientKey(0.5, LinearColor(r, g, b, a)); seeparticles-ParticleEffect-color.Particle.alive(dart fix).Particle.aliveisisAlive. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.Particle.color(dart fix).Particle.colorislinearRgba. A particle's colour islinearRgba, the sameVector4under a name that says what its four numbers are: linear RGB and an alpha read as brightness, written in place by every affector. Nothing else changed;LinearColor(p.linearRgba.x, p.linearRgba.y, p.linearRgba.z)reads it as a colour.ParticleAffector.apply(migrate).ParticleAffector.applytakes oneParticleStep: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.dt), and a call builds one.ParticleAffector.applytakes oneParticleStepwhere it took its parameters. An affector is a hook an effect implements, asked per particle per frame, so the system reuses one context and an affector must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ParticleColorGradient.apply(migrate).ParticleColorGradient.applytakes oneParticleStep: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.dt), and a call builds one.ParticleColorGradient.applytakes oneParticleStepwhere it took its parameters. An affector is a hook an effect implements, asked per particle per frame, so the system reuses one context and an affector must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ParticleColorOverLife(migrate)._from:,_to:ofParticleColorOverLife:Vector3(x, y, z)isLinearColor(x, y, z). Its two colours areLinearColors, and it can beconst:ParticleColorOverLife(LinearColor(1, 1, 1, 1), LinearColor(1, 0, 0, 1)); seeparticles-ParticleEffect-color.ParticleDrag.apply(migrate).ParticleDrag.applytakes oneParticleStep: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.dt), and a call builds one.ParticleDrag.applytakes oneParticleStepwhere it took its parameters. An affector is a hook an effect implements, asked per particle per frame, so the system reuses one context and an affector must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ParticleEffect.color(migrate).color: Vector3(x, y, z)ofParticleEffect.coloriscolor: LinearColor(x, y, z).coloris aLinearColor, the engine's one colour type, so an effect can beconst:color: Vector4(1.0, 0.5, 0.2, 1.0)iscolor: LinearColor(1.0, 0.5, 0.2, 1.0), orvector.toLinearColor(). The numbers mean what they did (linear, alpha as brightness); read.r,.g,.b,.awhere you read.x,.y,.z,.w.ParticleEmitter.emit(migrate).ParticleEmitter.emittakes oneParticleBirth: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.origin, parameter 3 is.direction, parameter 4 is.random), and a call builds one.ParticleEmitter.emittakes oneParticleBirthwhere it took its parameters. An emitter is a hook an effect implements, asked per particle, so the system reuses one context and an emitter must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ParticleFade.apply(migrate).ParticleFade.applytakes oneParticleStep: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.dt), and a call builds one.ParticleFade.applytakes oneParticleStepwhere it took its parameters. An affector is a hook an effect implements, asked per particle per frame, so the system reuses one context and an affector must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ParticleGlow.ParticleGlow(nothing to do). A light emitter makes its own glow and reads it asglow; one made by hand at 0.8.5 belonged to no emitter and counted nothing. Read the emitter'sglow, as before.ParticleGlow.centre(dart fix).ParticleGlow.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ParticleGlow.located(dart fix).ParticleGlow.locatedisisLocated. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.ParticleGradient(migrate).color:,from:,to:ofParticleGradient:Vector3(x, y, z)isLinearColor(x, y, z).ParticleGradient.constantand.lineartakeLinearColors; seeparticles-ParticleEffect-color.sampleIntostill writes aVector4.ParticleGravity(by hand).const ParticleGravity()with no argument now falls by the world's gravity (standardGravityfor a system without a world) instead of the fixed number 0.8 defaulted to, andaccelerationisdouble?, null for that case. Pass 0.8's number to keep the old look as a look; readacceleration ?? -standardGravitywhere a number was read.ParticleGravity.ParticleGravity(migrate).ParticleGravity(x0)isParticleGravity(acceleration: x0). The acceleration is a named argument: writeParticleGravity(acceleration: a)whereawas positional.ParticleSizeCurve.apply(migrate).ParticleSizeCurve.applytakes oneParticleStep: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.dt), and a call builds one.ParticleSizeCurve.applytakes oneParticleStepwhere it took its parameters. An affector is a hook an effect implements, asked per particle per frame, so the system reuses one context and an affector must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ParticleSizeOverLife.apply(migrate).ParticleSizeOverLife.applytakes oneParticleStep: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.dt), and a call builds one.ParticleSizeOverLife.applytakes oneParticleStepwhere it took its parameters. An affector is a hook an effect implements, asked per particle per frame, so the system reuses one context and an affector must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ParticleSpin.ParticleSpin(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ParticleSpin.apply(migrate).ParticleSpin.applytakes oneParticleStep: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.dt), and a call builds one.ParticleSpin.applytakes oneParticleStepwhere it took its parameters. An affector is a hook an effect implements, asked per particle per frame, so the system reuses one context and an affector must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ParticleSpin.randomiseStart(dart fix).ParticleSpin.randomiseStartisrandomizeStart. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.ParticleSystem(nothing to do).burst,emitandemitTimedcall their positional placeatwhere it wasorigin, and say it is in scene space; no call names a positional parameter. A place in the world goes in through the newburstInWorld,emitInWorldandemitTimedInWorld.ParticleSystem.boundsInto(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.ParticleSystem.emitFor(by hand).emitForemitted a whole frame's worth at once, so what it made depended on the frame rate. Callemitfor a burst, or give the emitter its rate and calladvance(dt), which spends it across fixed sub-steps.ParticleTurbulence.apply(migrate).ParticleTurbulence.applytakes oneParticleStep: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.dt), and a call builds one.ParticleTurbulence.applytakes oneParticleStepwhere it took its parameters. An affector is a hook an effect implements, asked per particle per frame, so the system reuses one context and an affector must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ParticleWind.apply(migrate).ParticleWind.applytakes oneParticleStep: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.dt), and a call builds one.ParticleWind.applytakes oneParticleStepwhere it took its parameters. An affector is a hook an effect implements, asked per particle per frame, so the system reuses one context and an affector must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.SixWayMaterial(migrate).emission:,ambient:ofSixWayMaterial:Vector3(x, y, z)isLinearColor(x, y, z). A six-way material'semissionandambientareLinearColors, black by default as before, and can be set in place: writeLinearColor(r, g, b)where they took aVector3.SphereEmitter.emit(migrate).SphereEmitter.emittakes oneParticleBirth: an override reads its old parameters from it (parameter 1 is.particle, parameter 2 is.origin, parameter 3 is.direction, parameter 4 is.random), and a call builds one.SphereEmitter.emittakes oneParticleBirthwhere it took its parameters. An emitter is a hook an effect implements, asked per particle, so the system reuses one context and an emitter must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.
flutter3d_physics #
CharacterController(nothing to do). Signatures are unchanged; two outcomes move. A face too steep to stand on stops sideways and rising motion as a wall, where walking into it used to climb it; falling onto it still slides down. A body caught between a static collider and a moving one is pushed out by the static one, so a closing platform no longer sets it into the floor. A level tuned against the old slide may need its slopes looked at.CharacterController.1(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.CharacterController.tuning(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.ClothSettings(nothing to do). The defaultgravityis written asstandardGravity, which is the same 9.81 m/s²; every call means what it meant.Collider(nothing to do). The constructor gained an optionalmaterial:, aPhysicalMaterialfrom the world's catalogue; every call that compiled means what it meant.Collider.world(nothing to do). The setter is gone:CollisionWorld.addsets the world andremoveclears it, as they always did. Reading it is unchanged.ColliderKind(by hand).ColliderKindis a class with constants (static,kinematic,trigger) and ablocksflag, so a later minor can add a role. The constants andnameread as before; aswitchover it needs a default case, andColliderKind.byNamereplacesvalues.byName.CollisionListener.onCollision(migrate).CollisionListener.onCollisiontakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.CollisionListener.onCollisiontakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CollisionListener.onCollisionEnd(migrate).CollisionListener.onCollisionEndtakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.CollisionListener.onCollisionEndtakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CollisionListener.onCollisionStart(migrate).CollisionListener.onCollisionStarttakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.CollisionListener.onCollisionStarttakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CollisionShape(migrate, with a TODO).CollisionShapeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().CollisionShapeis anabstract base class, open to a game's own shapes (CustomShape, or a subclass of it directly), so aswitchover the shapes needs a default case:boundsHalfExtentsandinertiaanswer for any shape.CollisionWorld.addBox(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.CollisionWorld.depenetrate(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.Contact.touching(dart fix).Contact.touchingisisTouching. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.CustomShape(nothing to do). A new subclass ofCollisionShape, which is open now; aswitchover the shapes takes the default casephysics-CollisionShapeadds.Dynamics(by hand).Dynamics.gravityis the world's gravity, a getter onworld.propertiesreturning a fresh vector, and no longer defaults to 22 m/s²: it isstandardGravityunless the world says otherwise. Set it on the world,world.properties = world.properties.copyWith(gravity: g), or passDynamics(gravity: g), which does the same; changing the returned vector in place does nothing. A game that relied on 22 sets its world to 22 where it stages.MovementTuning(dart fix).MovementTuningisMovementSettings. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name.MovementTuning.gravity(by hand).MovementSettings.gravityisdouble?and defaults to null, which falls by the world's gravity (CollisionWorld.properties) instead of a fixed 24 m/s². Set the game's world where it stages (the platformer'splatformerWorld, the shooter'sshooterWorldare 24), or passgravity:to keep a character's own; readCharacterController.gravitywhere a number was read.RayHit.hit(dart fix).RayHit.hitisdidHit. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.RigidBody(nothing to do). The constructor gained an optionalmaterial:, andfrictionandrestitutionbecamedouble?with the same defaults (0.6 and 0) when neither they nor a material say; every call that compiled means what it meant.SweepHit.hit(dart fix).SweepHit.hitisdidHit. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.contactBetween(dart fix).contactBetweenis imported frompackage:flutter3d_physics/flutter3d_physics.dart.pushOutsideObstacle(dart fix).pushOutsideObstacleis imported frompackage:flutter3d_physics/flutter3d_physics.dart.pushParticleOutside(dart fix).pushParticleOutsideis imported frompackage:flutter3d_physics/flutter3d_physics.dart.readNumber(dart fix).readNumberis imported frompackage:flutter3d_physics/flutter3d_physics.dart.
flutter3d_plugin_api #
PluginManifest.nameProblem(nothing to do). Every registry a plugin reaches through its host now asks it: a component codec, an event, a loop phase or system, a snapshot part, a data section, a world field, an entity kind, a behavior kind, a probe sampler, a question, an element's event kind and switch. A plugin from outside the engine that registers a bare name (health) is refused at install with aPluginExceptionnaming the name and the namespace it belongs in (acme.health), so a name the engine adds in a minor never meets one a plugin took. The engine is the packages this repository publishes (PluginManifest.engineNamespaces), not anything startingflutter3d_, and a plugin id may not be one of the engine's areas (PluginManifest.reservedAreas). No call changes; the names a plugin registers do, and the refusal says which.
flutter3d_plugin_runtime #
RuntimeShaders.RuntimeShaders(by hand).RuntimeShaderstakesaddMaterials: renderer.renderSteps.addMaterials, a function returning theRegistrationthat takes a library out again, and noremoveMaterials. Drop theremoveMaterials:argument.
flutter3d_samples #
kSamplesAsset(dart fix).kSamplesAssetissamplesAsset. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.kSamplesPath(dart fix).kSamplesPathissamplesPath. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.
flutter3d_shaders #
- 3 names were the package's own (gone internal): they are not exported since 1.0.0-rc.1, and the import of
flutter3d_shadersthat brought them gets one diagnostic for all of them.package:flutter3d_shaders/stage_bindings.dart,package:flutter3d_shaders/typed_blocks.dart,package:flutter3d_shaders/uniform_blocks.dart. A material of your own binds by name throughRenderMaterial.parameters, or through the accessors the.f3dmatbuild generates. LayerInfoBlock.sceneColour(dart fix).LayerInfoBlock.sceneColourissceneColor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.RequiredShader(migrate).RequiredShaderis a class:.nameis.name,.fragmentis.fragment; a destructuring pattern is yours to rewrite.RequiredShaderis a class with the samenameandfragment, and akindbeside them that can say a stage other than vertex or fragment. A literal(name: …, fragment: …)becomesRequiredShader(name: …, fragment: …).kComputeShaders(dart fix).kComputeShadersiscomputeShaders. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix.kRequiredShaders(dart fix).kRequiredShadersisrequiredShaders. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.
flutter3d_sim #
Actor(migrate).onDamage: xofActorisonDamage: (damage) => (x)(damage.amount, damage.from).Actor.onDamageis handed theDamageitself, where it took the amount and who dealt it as two parameters:(amount, from) => ...is(damage) => ...readingdamage.amountanddamage.from. A minor can tell a target more (what kind of harm, where it landed) through one object, where a third parameter would break every handler.migratewraps the old function,(damage) => (old)(damage.amount, damage.from), which runs as it did.Actor.applyDamage(migrate).Actor.applyDamagetakes oneDamage: an override reads its old parameters from it (parameter 1 is.amount,from:is.from), and a call builds one.Actor.applyDamagetakes oneDamagewhere it took its parameters. Something that can be hurt is a hook a game implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ActorSystem.events(by hand).eventsis the bus the actors publishActorHurtandActorDiedonto, anEventRegistry?, not a buffer. A genre's simulation sets it in itspublishTo, so a game that owns a genre does nothing. Before:actors.events = myBuffer, thenmyBuffer.drain(). After:actors.events = loop.events(withdeclareSimulationEvents(loop.events)once, which a genre plugin does for you), then subscribe:loop.events.onStep<ActorDied>('game.died', (d) => ...). Stepped by hand,actors.events = DirectBus()..onStep<ActorDied>(...).ActorSystem.focusBody(by hand). The setter is gone; the getter stays. Pass the body to the step instead of setting it beforehand:step(focusBody: body), orstep(foci: [...])for several.ActorSystem.focusBody=(by hand). The deprecated setter is gone; seesim-ActorSystem-focusBody. Name the body instep(focusBody: body)or instep(foci: [...]).AtLeastOne.AtLeastOne(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.AtLeastOne.check(migrate).AtLeastOne.checktakes oneLevelCheck: an override reads its old parameters from it (parameter 1 is.level, parameter 2 is.out), and a call builds one.AtLeastOne.checktakes oneLevelCheckwhere it took its parameters. A level rule is a hook a game brings; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.AtLeastOne.severity(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.Automap.everythingRevealed(dart fix).Automap.everythingRevealedisisEverythingRevealed. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.AxisAction(nothing to do).InputActionis new in 1.0, the sealed family of the action kinds:GameActionis its button, andAxisActionis one of the two new kinds beside it. No 0.8 code has aswitchoverInputActionto be missing a case, andGameActionis unchanged for everything that names it.Brain.onHurt(migrate).Brain.onHurttakes oneBrainHurt: an override reads its old parameters from it (parameter 1 is.mind, parameter 2 is.amount), and a call builds one.Brain.onHurttakes oneBrainHurtwhere it took its parameters. A brain is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Brain.onNoise(migrate).Brain.onNoisetakes oneBrainNoise: an override reads its old parameters from it (parameter 1 is.mind, parameter 2 is.at), and a call builds one.Brain.onNoisetakes oneBrainNoisewhere it took its parameters. A brain is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Brush.Brush(dart fix). American spelling in identifiers, as Flutter and Dart use. A level file keeps itscentrekey; only the Dart name changed.Brush.centre(dart fix).Brush.centreiscenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.BrushFace(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.ButtonKind.spawn(migrate).ButtonKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.ButtonKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ButtonKind.validate(migrate).ButtonKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.ButtonKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.CameraRig(dart fix).CameraRigis imported frompackage:flutter3d_camera/flutter3d_camera.dart.CameraRigplaces a view, which no step reads, so it isflutter3d_camera's now andflutter3d_simno longer exports it.migrateadds theflutter3d_cameradependency;dart fixadds the import.CameraRig.extraFov(dart fix).CameraRig.extraFovisextraFovY. Units in names: a field of view isfovY, the vertical angle, in radians (docs/CONTRACTS.md), and time in the simulation is adoubleof seconds. The value is the same under the new name.Damageable(migrate).Damageableis a base mixin class:implements Damageablebecomeswith Damageable, on abaseclass.Damageable.applyDamage(migrate).Damageable.applyDamagetakes oneDamage: an override reads its old parameters from it (parameter 1 is.amount,from:is.from), and a call builds one.Damageable.applyDamagetakes oneDamagewhere it took its parameters. Something that can be hurt is a hook a game implements; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.DataSourceTraceFormatException(nothing to do).DataSourceTraceFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon DataSourceTraceFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.Demo(nothing to do). Only the value of the constant moved; code that readsDemogets the new one. It is a version or a layout size the engine stamps and checks itself.DemoFormatException(nothing to do).DemoFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon DemoFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.DigestTraceFormatException(nothing to do).DigestTraceFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon DigestTraceFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.DoorKind.spawn(migrate).DoorKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.DoorKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.DoorKind.validate(migrate).DoorKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.DoorKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.DualAxisAction(nothing to do).InputActionis new in 1.0, the sealed family of the action kinds:GameActionis its button, andDualAxisActionis one of the two new kinds beside it. No 0.8 code has aswitchoverInputActionto be missing a case, andGameActionis unchanged for everything that names it.EcsWorld(nothing to do).restorerefuses a component written by a newer codec with aSnapshotFormatExceptionbefore it touches the world, and removes a resource that has a codec but is not in the save, where it used to keep the old one. A save this build wrote restores as before.EcsWorld.alive(dart fix).EcsWorld.aliveisisAlive. A boolean query reads as a question in 1.0:alive(entity)isisAlive(entity), as onSimWorld.EcsWorld.exclude(by hand).world.exclude<T>(because)isworld.components.exclude<T>(because), the registry's own, which returns aRegistration.EcsWorld.query(by hand).query()is the query builder now (world.query().having<A>() .without<B>().entities, in index order). The type-parameter form that walked one component's entities in the order they were added isqueryOf<A>().EcsWorld.register(by hand).world.register<T>('name', encode: e, decode: d)was a second door to the world's component registry with no version. Register a codec:world.components.register<T>(ComponentCodec<T>.of(id: 'name', encode: e, decode: (context) => d(context.data))), addingversion:when the shape changes andpublished: truefor what the view reads. The id is the same name, so a save written before reads back.EcsWorld.registerInPlace(by hand).world.registerInPlace<T>('name', encode: e, restore: r)isworld.components.register<T>(InPlaceCodec<T>.of(id: 'name', encode: e, restore: (value, data, version) => r(value, data))): the same component restored into the instance already there, now with a version.EduDataSource(by hand).EduDataSourceis anabstract base class. An adapter of your own that wroteimplements EduDataSourcenow writesextends EduDataSourceand isfinalorbaseitself.Entity(dart fix).Entityis imported frompackage:flutter3d_plugin_api/flutter3d_plugin_api.dart.Entityis the plugin API's, where a plugin's systems name it, andflutter3d_simno longer re-exports it.EntityDef.reservedKeys(nothing to do). The set now names every top-level key of an entity row the format keeps for itself (props,components,idand keys held for later); properties are underprops. A row withoutpropsstill reads in the old shape.EntityKind.spawn(migrate).EntityKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.EntityKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.EntityKind.validate(migrate).EntityKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.EntityKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.EntityRemap(migrate).EntityRemapis a class:.saveis.save,.droppedis.dropped; a destructuring pattern is yours to rewrite.EntityRemapis a class with the samesaveanddropped; only a destructuring pattern names the class.ExactlyOne.check(migrate).ExactlyOne.checktakes oneLevelCheck: an override reads its old parameters from it (parameter 1 is.level, parameter 2 is.out), and a call builds one.ExactlyOne.checktakes oneLevelCheckwhere it took its parameters. A level rule is a hook a game brings; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Exit.onCollisionStart(migrate).Exit.onCollisionStarttakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.Exit.onCollisionStarttakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ExitKind.spawn(migrate).ExitKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.ExitKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ExitKind.validate(migrate).ExitKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.ExitKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.FixedStep(by hand).FixedStepis gone. A game steps throughEngineLoop, whose step rate is aWorldTiming(timing:) and whose most steps a frame aCatchUp;loop.frame(dt)runs the steps owed andloop.alphais the interpolation fractionFixedStep.alphawas.FlameFlicker(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.FlowField.maxGoals(nothing to do). A getter where it was a constant, with the same value: a read is unchanged. Only aconstexpression that used it stops compiling; write the number there, or drop theconst.GameEvents(by hand). The drained buffer is gone: a genre's simulation publishes each event onto the engine's bus at the moment it happens, and a game subscribes. Before:for (final e in sim.events.drain()) { if (e is Jumped) jump(); }in a system after the step. After, on the loop the genre plugin is installed in:loop.events.onStep<Jumped>('game.jump', (d) => jump()), oronFramefor sound and particles, or the whole step at its end:loop.onStepEnd((s) => react(s.events.whereType<GameEvent>().toList())). A simulation stepped by hand (a test, a server) is handed aDirectBus: before,final events = sim.events.drain(); after,final heard = <GameEvent>[];sim.publishTo(DirectBus()..onStep<GameEvent>('test', (d) => heard.add(d.event))). A buffer of your own,final events = GameEvents(); events.add(e), becomes a bus you publish onto:bus.publish(e), with the event declared once with a codec,bus.declare<MyEvent>('mygame.myEvent', codec: MyEvent.codec). An event'snameis the name it is declared under now (platformer.landed,actor.hurt), so code that printed or compared the old descriptive names compares the event's type or fields instead.GameLoop(by hand).GameLoopis gone;EngineLoopruns the fixed step as phases of systems. Make anEngineLoop(input: …)(itstiming:andcatchUp:default to whatGameLoopdid), move the body ofonStepinto aLoopSystem— a function of theLoopContext, whosedtis the step — added withloop.addSystem(name, LoopPhase.physics, …), and callloop.frame(dt)wheregameLoop.advance(dt)was called;paused,alpha,playbackandrecordersare on the new loop under the same names. The guide's "GameLoop to EngineLoop" section has the whole shape.HeadlessGame(by hand).HeadlessGameis anabstract base class: a gameextends HeadlessGame(and isfinalorbase) instead of implementing it. A game that also implementedVersionedSimulationoverridesSimulationVersion? get simulationinstead.HeadlessGame.start(migrate).HeadlessGame.starttakes oneHeadlessStart: an override reads its old parameters from it (parameter 1 is.level, parameter 2 is.world, parameter 3 is.input), and a call builds one.HeadlessGame.starttakes oneHeadlessStartwhere it took its parameters. A headless game is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.HeadlessRun(by hand).HeadlessRunis anabstract base class: a runextends HeadlessRun(orRestorableRun).positionis aWorldPosition(vector.toWorldPosition()fromflutter3d_foundation), andeyeis aWorldPositiongetter that defaults topositioninstead ofvoid eye(Vector3 out).HeadlessRun.eye(by hand).eyeis aWorldPositiongetter: readrun.eyeinstead of passing a vector to fill.HeadlessRun.position(by hand).positionis aWorldPosition, in double precision: subtract withrelativeTo/distanceTo, or narrow it to aVector3relative to an origin withtoVector3Relative(origin).Health.Health(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Health.armour(dart fix).Health.armourisarmor. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Health.armourShare(dart fix).Health.armourShareisarmorShare. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Heightfield.fromJson(by hand). A malformed heightfield throwsLevelFormatException, notdart:core'sFormatException: catchLevelFormatException(orFlutter3dFormatException).HeightfieldGeometry.build(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.HeightfieldTiles.build(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.InputState.analogueValues(dart fix).InputState.analogueValuesisanalogValues. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.InputTape.fromJson(by hand). A tape that cannot be read throwsInputTapeFormatException, aFlutter3dFormatException, notdart:core'sFormatException. CatchInputTapeFormatException, orFlutter3dFormatExceptionfor every format the engine reads.JumpReach.JumpReach.of(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.KeyRing.take(dart fix).KeyRing.takeisadd. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.Level(nothing to do). Level documents are written at format 3: anidon every brush, light and entity, an entity's properties underprops, overrides keyed by id paths, and the format envelope. Older documents still read and are upgraded on save; code that reads entity rows fromtoJson()finds properties underprops.Levelnow extendsFormatDocument.Level(nothing to do). Only the constant's value moved, to 2 for prefabs and depth layers.Level.fromJsonreads version 1 as before, and a level that uses neither is still written as version 1; code that readsLevelgets the new number without a change.Level.digestHex(nothing to do). Nothing in code changes. The digest is now of the level's content, not of its format envelope, so a hash 0.8.5 stored differs from the one 1.0 computes for the same level:resimulateanswers a run recorded by 0.8.5 withResimulationLevelChanged, and a verifying server refuses it. Record such runs again. Format changes never move the digest again.Level.fogColor(migrate).fogColor: Vector3(x, y, z)ofLevel.fogColorisfogColor: LinearColor(x, y, z). A level's fog colour is aLinearColor; read.r,.g,.bwhere you read.x,.y,.z, and passfogColor: LinearColor(r, g, b)toLevel.LevelCollision.playerStart(migrate).LevelCollisionis a class:.positionis.position,.yawis.yaw; a destructuring pattern is yours to rewrite.playerStartanswers aPlayerStartwith the samepositionandyaw; only a destructuring pattern names the class.LevelFormatException(nothing to do).LevelFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon LevelFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.LevelIssue.severity(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.LevelIssueSeverity(dart fix).LevelIssueSeverityis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart. A mesh check, an export and a level's validation speak one severity,Severityfromflutter3d_foundation, with the samewarninganderror.LevelIssueSeverity(migrate, with a TODO).LevelIssueSeverityis a class: aswitchover it that names every value gains_ => throw UnimplementedError().LevelIssueSeverityis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.LevelLight.LevelLight(by hand).color:takes aLinearColor(LinearColor(1, 0.9, 0.8), orvector.toLinearColor()), andintensity:is candela, or lux for a directional light: multiply a pre-1.0 number byLevelLight.defaultIntensity(about 5 790.6, one pre-1.0 unit) and the light is as bright as it was. A level file is lifted the same way when it is read, so only lights made in code need this.LevelLight.color(migrate).color: Vector3(x, y, z)ofLevelLight.coloriscolor: LinearColor(x, y, z). A level light's colour is aLinearColorin linear light, as it always meant; read.r,.g,.bwhere you read.x,.y,.z.LevelLight.type(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.LevelLightType(migrate, with a TODO).LevelLightTypeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().LevelLightTypeis an open class with the format's words, so a later kind of light does not break aswitchover it: the constants andvaluesare the same, aswitchends with a wildcard, and.nameis.wireName.LevelLightType(dart fix).LevelLightTypeis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart. A level's lights are the scene's kinds,LightTypefromflutter3d_foundation, with the same words, andareatoo.LevelMaterial(migrate).baseColor: Vector3(x, y, z)ofLevelMaterialisbaseColor: LinearColor.fromSrgb(x, y, z).LevelMaterial.baseColoris a linearLinearColor. TheVector4held the sRGB numbers a level stores, and a level still stores them (read and written throughstoredBaseColor), so a material made in code isbaseColor: LinearColor.fromSrgb(r, g, b)of the old numbers and draws as it did.LevelMaterial.LevelMaterial(dart fix). American spelling in identifiers, as Flutter and Dart use. A level file keeps itstexelsPerMetrekey; only the Dart name changed.LevelMaterial.emissive(migrate).emissive: double(x)ofLevelMaterial.emissiveisemissiveStrength: double(x). A level material'semissiveis aLinearColor, as every material's is, and null (the default) glows in the colour the surface is painted. The number it was isemissiveStrength:emissive: 0.5isemissiveStrength: 0.5, and a read of the number ismaterial.emissiveStrength. A level file is unchanged: itsemissivekey is still the strength, and a colour is the newemissiveColor.LevelMaterial.texelsPerMetre(dart fix).LevelMaterial.texelsPerMetreistexelsPerMeter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LevelPatchRefused(by hand).LevelPatchResulthas a new case,LevelPatchRefused: aswitchover aLevelPatchResultthat names every case needs one for it, or a wildcard.LevelPatched(by hand).LevelPatchResulthas a new case,LevelPatched: aswitchover aLevelPatchResultthat names every case needs one for it, or a wildcard.LevelRule.check(migrate).LevelRule.checktakes oneLevelCheck: an override reads its old parameters from it (parameter 1 is.level, parameter 2 is.out), and a call builds one.LevelRule.checktakes oneLevelCheckwhere it took its parameters. A level rule is a hook a game brings; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.LevelSketch.room(nothing to do). Only a type or a positional parameter it names was renamed; no call names a positional parameter, and a type's rename carries its own fix.LiftKind.spawn(migrate).LiftKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.LiftKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.LiftKind.validate(migrate).LiftKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.LiftKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.LightBehaviour(dart fix).LightBehaviourisLightBehavior. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightFixture.LightFixture(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightFixture.behaviour(dart fix).LightFixture.behaviourisbehavior. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightFixtureKind.LightFixtureKind(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightFixtureKind.defaultBehaviour(dart fix).LightFixtureKind.defaultBehaviourisdefaultBehavior. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightFixtureKind.spawn(migrate).LightFixtureKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.LightFixtureKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.LightFixtureKind.validate(migrate).LightFixtureKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.LightFixtureKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Lightmap.Lightmap(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Lightmap.fromBytes(by hand). An unreadable lightmap throwsLightmapFormatException, notdart:core'sFormatException: catch it (orFlutter3dFormatException).Lightmap.kScale(dart fix).Lightmap.kScaleisirradianceScale. A public constant is lowerCamelCase in 1.0, as Effective Dart asks, without the k prefix. The value is the same under the new name.Lightmap.texelsPerMetre(dart fix).Lightmap.texelsPerMetreistexelsPerMeter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightmapBaker(dart fix).LightmapBakeris imported frompackage:flutter3d_build/lightmap.dart. A lightmap is baked once, before a level ships, and no step reads the baker, so it is a build step:flutter3d_build'slightmap.dart, anddart run flutter3d_build:lightmapfor the command.LightmapandLightmapLayout, which the loader reads, stay influtter3d_sim.LightmapBaker.LightmapBaker(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightmapBaker.texelsPerMetre(dart fix).LightmapBaker.texelsPerMetreistexelsPerMeter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightmapLayout.maxSize(nothing to do). A getter where it was a constant, with the same value: a read is unchanged. Only aconstexpression that used it stops compiling; write the number there, or drop theconst.LightmapLayout.plan(dart fix). American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightmapLayout.texelCentre(dart fix).LightmapLayout.texelCentreistexelCenter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.LightmapLayout.texelsPerMetre(dart fix).LightmapLayout.texelsPerMetreistexelsPerMeter. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.MechanismEvents.MechanismEvents(nothing to do). A mechanism world makes its own and reads it asevents; one made by hand at 0.8.5 belonged to no world and was never filled. Read the world'sevents, as before.Mover.reverseWhenBlocked(dart fix).Mover.reverseWhenBlockedisreversesWhenBlocked. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.MoverState(by hand).MoverStateis a class with constants (closed,opening,open,closing); comparisons read as before, and aswitchover it needs a default case.MovingPlatform.reverseWhenBlocked(dart fix).MovingPlatform.reverseWhenBlockedisreversesWhenBlocked. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.NavGrid.centreOf(dart fix).NavGrid.centreOfiscenterOf. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.NavGrid.centreOfCell(dart fix).NavGrid.centreOfCelliscenterOfCell. American spelling in identifiers, as Flutter and Dart use: the old British name is gone, and the new one means the same.Navigation(nothing to do).gridbecame a getter over the grid the constructor takes, and the constructor still takes it as the one positional argument. Readinggridand building aNavigationread the same.Pace.behind(dart fix).Pace.behindisisBehind. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.PlatformKind.spawn(migrate).PlatformKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.PlatformKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.PlatformKind.validate(migrate).PlatformKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.PlatformKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Playback.sampleAt(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.Portable(dart fix).Portableis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart.Portable, the arithmetic every fixed step agrees on, is the foundation's, under every package a step runs through, andflutter3d_simno longer re-exports it.Pose(dart fix).PoseisGhostFrame. What a recording keeps of a moment is a frame of a ghost, not a pose of the engine's:GhostFrame, the name racing gave it, with the sametime,position,yawandup.PulseLight(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.ReflectionProbeKind.validate(migrate).ReflectionProbeKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.ReflectionProbeKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.ResimulationDiverged(by hand).Resimulationhas a new case,ResimulationDiverged: aswitchover aResimulationthat names every case needs one for it, or a wildcard.ResimulationLevelChanged(by hand).Resimulationhas a new case,ResimulationLevelChanged: aswitchover aResimulationthat names every case needs one for it, or a wildcard.ResimulationOnOtherPhysics(by hand).Resimulationhas a new case,ResimulationOnOtherPhysics: aswitchover aResimulationthat names every case needs one for it, or a wildcard.ResimulationRetraced(by hand).Resimulationhas a new case,ResimulationRetraced: aswitchover aResimulationthat names every case needs one for it, or a wildcard.ResimulationStartDiffers(by hand).Resimulationhas a new case,ResimulationStartDiffers: aswitchover aResimulationthat names every case needs one for it, or a wildcard.RewindBuffer.keyframeDue(dart fix).RewindBuffer.keyframeDueisisKeyframeDue. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.Rider(migrate).Rideris a base mixin class:implements Riderbecomeswith Rider, on abaseclass.RigTuning(dart fix).RigTuningis imported frompackage:flutter3d_camera/flutter3d_camera.dart. Settings classes have one suffix in 1.0, Settings (a HAL type's is Descriptor), and each is final, const, with a copyWith that covers every field. The class is the same under the new name, and it isflutter3d_camera's now: a camera places a view, which no step reads.RoomDoor.RoomDoor(by hand).RoomDoortakes named arguments:RoomDoor('north', 1.0, 2.0, 3.0)isRoomDoor(side: 'north', offset: 1.0, width: 2.0, height: 3.0).RunOutcome(by hand).RunOutcomeis a class with constants (playing,lost,won), so a later minor can add an outcome. The constants,name,valuesandisOverread as before; aswitchover it needs a default case, andRunOutcome.byNamereplacesvalues.byName.SaveFound(by hand).SaveReadhas a new case,SaveFound: aswitchover aSaveReadthat names every case needs one for it, or a wildcard.SaveNotRead(by hand).SaveReadhas a new case,SaveNotRead: aswitchover aSaveReadthat names every case needs one for it, or a wildcard.SaveRefused(by hand).SaveUpgradehas a new case,SaveRefused: aswitchover aSaveUpgradethat names every case needs one for it, or a wildcard.SaveUpgraded(by hand).SaveUpgradehas a new case,SaveUpgraded: aswitchover aSaveUpgradethat names every case needs one for it, or a wildcard.ServiceDone(by hand).ServiceAnswerhas a new case,ServiceDone: aswitchover aServiceAnswerthat names every case needs one for it, or a wildcard.ServiceRefused(by hand).ServiceAnswerhas a new case,ServiceRefused: aswitchover aServiceAnswerthat names every case needs one for it, or a wildcard.ShadowCasting(migrate, with a TODO).ShadowCastingis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ShadowCastingis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.SnapshotFields.flag(by hand). No positionalboolin 1.0:flag(key, true)isflag(key, orElse: true).SnapshotFields.integer(migrate).SnapshotFields.integer(x0, x1)isSnapshotFields.integer(x0, orElse: x1). The value for a missing key is a named argument:data.integer('lives', 3)isdata.integer('lives', orElse: 3).SnapshotFields.number(migrate).SnapshotFields.number(x0, x1)isSnapshotFields.number(x0, orElse: x1). The value for a missing key is a named argument:data.number('hour', 8)isdata.number('hour', orElse: 8).SnapshotFormatException(nothing to do).SnapshotFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon SnapshotFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.SteadyLight(nothing to do). Only a type its declaration names was renamed; that rename's own fix carries every use.StepContext(dart fix).StepContextisLoopContext. Every system is handed aLoopContext:dtis the same,phaseis the loop'sLoopPhase, and the context also carries the step, the world andpublish. Import it frompackage:flutter3d_plugin_api.StepEvents(nothing to do). The extension is gone with the drained buffer; its two members' own entries (sim-StepEvents,corpus-sim-StepEvents-count) rewrite each call towhereType.StepEvents.count(migrate).StepEvents.countbecomesx.whereType<T>().length.counton a list of events is gone with the drained buffer:events.count<CollectibleTaken>()isevents.whereType<CollectibleTaken>().length.StepEvents.has(migrate).StepEvents.hasbecomesx.whereType<T>().isNotEmpty.hasandcounton a drained list are gone with the buffer. Before:events.has<Jumped>(),events.count<CollectibleTaken>(). After, on the list of a step's events (StepEventSummary.events, or what a subscriber collected):events.whereType<Jumped>().isNotEmpty,events.whereType<CollectibleTaken>().length. Or subscribe to the type itself:loop.events.onStep<Jumped>(...).StepPhase(by hand).StepPhaseis gone withStepSystems: a moment in a step is a place among the loop's systems.StepPhase.beginisbefore:the genre's step system andStepPhase.endisafter:it; a genre's own moment ("after the weapons fired") is a system of the genre's, named<genre>.<moment>, which a rule orders itself after. A phase of a game's own isloop.addPhase(LoopPhase.step('mygame.phase'), after: [...]).StepSystem(dart fix).StepSystemisLoopSystem. A system is aLoopSystem,void Function(LoopContext context), frompackage:flutter3d_plugin_api.StepSystems(by hand).StepSystemsis gone: a rule a game adds to a genre's step is a system in the engine's loop. Where it wassim.systems.add(StepPhase.end, (step) => rule(step.dt), label: 'rule'), it isloop.addSystem('rule', LoopPhase.physics, (context) => rule(context.dt), after: [PlatformerPlugin.stepSystem]), withbefore:for a rule that ran atStepPhase.begin; the genre's step is the system<genre>.stepin itsstepPhase.addreturned a handle thatremovetook;addSystemreturns aRegistration, andcancel()takes the system out.forPhaseisloop.systemsIn(phase).StepSystems.add(by hand).StepSystems.addorders by name, as the engine's loop does:order:is gone, and a system names the systems of its phase it runsafter:orbefore:, by theirlabel:. Where nothing is named, the order of adding decides, as equal orders did. A system that had a lowerorderthan another saysbefore: ['<the other's label>'].StepTimeTrace(by hand). Times are seconds now, as every time in the engine is (docs/CONTRACTS.md):millis,meanMillisandworstMillisareseconds,meanSecondsandworstSeconds, andobserve(step, cost)takes seconds. Divide a millisecond figure by 1000, or multiply a value read back by 1000 to show milliseconds. A written trace keeps itsmilliskey in milliseconds.StepTimeTraceFormatException(nothing to do).StepTimeTraceFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon StepTimeTraceFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.SystemRegistration(dart fix).SystemRegistrationisRegistration.addSystemreturns aRegistration;cancel()takes the system out, whereStepSystems.remove(registration)did. Its label is the name the system was added under.SystemRegistration.order(by hand). A registration has no number now: readafterandbefore, the labels it is ordered against, andsequence, when it was added.Takeable.onCollision(migrate).Takeable.onCollisiontakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.Takeable.onCollisiontakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Takeable.onCollisionStart(migrate).Takeable.onCollisionStarttakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.Takeable.onCollisionStarttakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.Tally.add(migrate).Tally.add(x0, x1)isTally.add(x0, howMany: x1). The count is a named argument:tally.add('coin', 5)istally.add('coin', howMany: 5).Tape.poses(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.TapesAgree(by hand).TapeBisectionhas a new case,TapesAgree: aswitchover aTapeBisectionthat names every case needs one for it, or a wildcard.TapesDiverge(by hand).TapeBisectionhas a new case,TapesDiverge: aswitchover aTapeBisectionthat names every case needs one for it, or a wildcard.Tolerance(dart fix).ToleranceisGeometryTolerance.Toleranceis a Flutter physics type that material exports: the simulation's named epsilons areGeometryTolerance, with the same constants.TriggerKind.spawn(migrate).TriggerKind.spawntakes oneEntitySpawn: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.context), and a call builds one.TriggerKind.spawntakes oneEntitySpawnwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.TriggerKind.validate(migrate).TriggerKind.validatetakes oneEntityCheck: an override reads its old parameters from it (parameter 1 is.entity, parameter 2 is.scope, parameter 3 is.out), and a call builds one.TriggerKind.validatetakes oneEntityCheckwhere it took its parameters. An entity kind is a hook a game extends; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.TriggerVolume.onCollisionStart(migrate).TriggerVolume.onCollisionStarttakes oneCollisionContext: an override reads its old parameters from it (parameter 1 is.self, parameter 2 is.other), and a call builds one.TriggerVolume.onCollisionStarttakes oneCollisionContextwhere it took its parameters. A collision listener is the hook a game overrides most, and a contact is handed to it per pair per step, so the world reuses one context and an override must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.TriggerVolume.takeOutcome(dart fix).TriggerVolume.takeOutcomeisdrainOutcome. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.VisibilityFormatException(nothing to do).VisibilityFormatExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon VisibilityFormatExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.WorldStep(by hand).dynamicsis aRigidDynamics?now, the interface the Dart and the native solver share. Declare what you read it into asRigidDynamics?, or cast withas Dynamics?for the Dart solver's own members.package:flutter3d_physics/flutter3d_physics.dart(dart fix). Names re-exported frompackage:flutter3d_physics/flutter3d_physics.dartare imported frompackage:flutter3d_physics/flutter3d_physics.dart.package:flutter3d_sim/flutter3d_sim.dartno longer re-exports the physics. The collision world, the bodies, the queries, the character controller, the cloth and the fluids are imported frompackage:flutter3d_physics/flutter3d_physics.dart, and the project depends onflutter3d_physics. What 0.8's physics held and another package holds now is imported from there:Portableand the vector crossings fromflutter3d_foundation, the world's properties, the materials and the constants fromflutter3d_matter. A game that wants one import takesflutter3d_game, which re-exportsCollisionWorld,ColliderandRigidDynamics.
flutter3d_sim_mcp #
DiagnosticTool(nothing to do). Its tools answer anAnswer, which carries the picture now; the rename ofPictureAnswercarries the fix, and a tool that readsdid,saysorpngreads them as before.DiagnosticView(migrate, with a TODO).DiagnosticViewis a class: aswitchover it that names every value gains_ => throw UnimplementedError().DiagnosticViewis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.PlaytestOutcome(migrate, with a TODO).PlaytestOutcomeis a class: aswitchover it that names every value gains_ => throw UnimplementedError().PlaytestOutcomeis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.ReadingPredicate(migrate, with a TODO).ReadingPredicateis a class: aswitchover it that names every value gains_ => throw UnimplementedError().ReadingPredicateis anabstract finalclass rather than a sealed one, so a case a later minor adds breaks noswitch: aswitchover its cases ends with a wildcard. The cases and their fields are unchanged.ReadingPredicateException(nothing to do).ReadingPredicateExceptionis still a final class with the same members; it now extendsFlutter3dFormatException(and through itFlutter3dException) instead of implementingExceptiondirectly. Everyon ReadingPredicateExceptionandon Exceptionstill catches it, and nothing outside the package could extend it.SimSession(nothing to do). The constructor gained an optionalroot:(the working directory by default);open,writeRun,expect,verifyandbisectrefuse a path outside it, as do the levels a run or a level names.SimTool(nothing to do). Its tools answer anAnswer, which carries the picture now; the rename ofPictureAnswercarries the fix, and a tool that readsdid,saysorpngreads them as before.package:flutter3d_mcp_kit/flutter3d_mcp_kit.dart(dart fix). Names re-exported frompackage:flutter3d_mcp_kit/flutter3d_mcp_kit.dartare imported frompackage:flutter3d_mcp/kit.dart.PictureAnsweris the agent kit's,package:flutter3d_mcp/kit.dart, andflutter3d_sim_mcpno longer re-exports it.renderMcpVersion(nothing to do). Only the value of the constant moved; code that readsrenderMcpVersiongets the new one. It is a version or a layout size the engine stamps and checks itself.simMcpVersion(nothing to do). Only the value of the constant moved; code that readssimMcpVersiongets the new one. It is a version or a layout size the engine stamps and checks itself.
flutter3d_stereo #
HeadPose(dart fix).HeadPoseis imported frompackage:flutter3d_foundation/flutter3d_foundation.dart. A tracked head is the engine's one pose,RigidPosefromflutter3d_foundation:orientationwhere it saidrotation, andRigidPose.identity()forHeadPose.still().HeadPose.HeadPose(dart fix). A pose's turn isorientation, asRigidPosenames it:HeadPose(rotation: q, position: p)isRigidPose(orientation: q, position: p).HeadPose.rotation(dart fix).HeadPose.rotationisorientation. A pose's turn isorientation, asRigidPosenames it.HeadPose.still(dart fix).HeadPose.stillisidentity. A pose at the origin, turned nowhere, isRigidPose.identity().HeadTracker(by hand).HeadTrackeris anabstract base class: writeextends HeadTrackerwhere you wroteimplements HeadTracker, and mark the classfinal,baseorsealed.poseis still yours to write;startandstophave bodies that do nothing, which your own override.LessonStereoView(nothing to do). The widget is afinal class: a widget is composed, not subclassed, so a build method that wraps aLessonStereoViewis unchanged. A class that extended it builds one instead.SensorHeadTracker.pose(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.StereoRig.applyHead(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.StereoRig.fitToViewport(dart fix).fitToViewport(verticalFieldOfView: a)isfitToViewport(fovY: a).StereoRig.verticalFieldOfView(dart fix).StereoRig.verticalFieldOfViewisfovY.StereoSurface(nothing to do). The widget is afinal class: a widget is composed, not subclassed, so a build method that wraps aStereoSurfaceis unchanged. A class that extended it builds one instead.StereoSurface.StereoSurface(dart fix).StereoSurface(verticalFieldOfView: a)isStereoSurface(fovY: a), the same angle in radians, named as every field of view in the engine is.StereoSurface.fovY(nothing to do).verticalFieldOfViewrenamed (the entry above carries it); the name is new only to code implementing the widget, which nothing does.StereoSurface.onListenerMoved(nothing to do). New onStereoSurface, which is a widget to build, not a type to implement: nothing outside the package implements it.StereoSurface.verticalFieldOfView(dart fix).StereoSurface.verticalFieldOfViewisfovY.decodeSensorEvent(nothing to do). Only a type it names moved or was renamed (one severity, one kind of light, one pose, a ghost's frame); that type's own entry carries the fix, and a call needs none.headRotationFromSensor(by hand).displayRotationDegrees:isdisplayRotation:, adoublein radians, as every angle in the engine is (docs/CONTRACTS.md): passrotation * math.pi / 180for what the platform reports in degrees.decodeSensorEventconverts the platform's payload itself.
flutter3d_testing #
FramePacing(dart fix).FramePacingisPacingReport.flutter3d_corehas aFramePacingof its own, the renderer's pacing policy, so the replay's statistics arePacingReport, with the same members.FramePacing(by hand). A pacing report keeps seconds where it kept milliseconds:p50,p99andmaxare seconds, andPacingReport.of(seconds, limit: 0.05)takes seconds whereFramePacing.of(millis, limitMillis: 50)took milliseconds.FramePacing.even(dart fix).FramePacing.evenisisEven. A boolean getter reads as a question in 1.0:evenisisEven.FramePacing.limitMillis(migrate).FramePacing.limitMillisbecomes(x.limit * 1000). A pacing report keeps seconds:limitMillisislimittimes a thousand.FramePacing.millis(migrate).FramePacing.millisbecomesx.seconds.map((double s) => s * 1000).toList(). A pacing report keeps seconds, as every time in the engine is:millisissecondstimes a thousand.FrameSubject(migrate).FrameSubjectis a class:.sceneis.scene,.camerais.camera; a destructuring pattern is yours to rewrite.FrameSubjectis a class with the samesceneandcamera: returnFrameSubject(scene: …, camera: …)where a builder or a replay subject returned the record.MaterialProgramStage(dart fix).MaterialProgramStageis imported frompackage:flutter3d_app/software.dart.QualityMeasurement(migrate).QualityMeasurementis a class:.settingis.setting,.costis.cost,.flipis.flip; a destructuring pattern is yours to rewrite.QualityMeasurementis a final class with the samesetting,costandflip; one is built withQualityMeasurement(…). Only a destructuring pattern names the class.RenderedFrame(migrate).RenderedFrameis a class:.pixelsis.pixels,.widthis.width,.heightis.height,.drawCallsis.drawCalls; a destructuring pattern is yours to rewrite.RenderedFrameis a class with the samepixels,width,heightanddrawCalls: build one withRenderedFrame(…)where a test built the record.ReplaySubject(by hand).ReplaySubjectlostrestore,stepandsave. A subject now hands the replay itsloop— anEngineLoopbuilt onReplayStart.input, with the game's genre installed and itssimulationset to the run, and the game's own systems (an elements step, a camera follow ononStepEnd) added as the game adds them — and itsgenre, theGenrePluginwhose run the tape recorded. The replay restores the tape's start as the genre's part, steps withloop.runSteps(1)and digests the genre's part ofloop.capture(), so recorded tapes keep passing. Seeapps/flutter3d_demo_platformer/test/replay_test.dart.renderFrame(nothing to do).clearColor:keeps its name and takes a linearLinearColor, asRenderView.clearColordoes, where it took an sRGBVector4; the analyzer names each call that passes one, andLinearColor.fromSrgb(r, g, b, a)is what it passes instead.replayPacing(migrate).limitMillis: xofreplayPacingislimit: x / 1000. A pacing report keeps seconds:limitMillis: 50islimit: 50 / 1000.
flutter3d_webgl #
- 11 names were the package's own (gone internal): they are not exported since 1.0.0-rc.1, and the import of
flutter3d_webglthat brought them gets one diagnostic for all of them.WebGlAttribute,WebGlBlock,WebGlEncoder,WebGlLoadedShaderLibrary,WebGlProgram,WebGlShader,WebGlShaderLibrary,WebGlTexture,compileWebGlShader,declarationsOf,fragmentOutputNames. An application opens the backend withopenWebGland adds it to aDeviceRegistrywithregisterWebGlBackend. WebGlDevice(by hand). was the WebGL2 backend's own: its handle types (WebGl*), its capability gates (webglGate*,webglRefuse*) or its encoders. None of it is exported since 1.0. An application opens the backend withopenWebGland adds it to aDeviceRegistrywithregisterWebGlBackend.WebGlDevice(by hand).WebGlDevice.openis asynchronous, as every backend'sopenis: await it, inside anasyncfunction, and hand on aFuture<GraphicsDevice>where a device was returned.WebGlDevice.create(dart fix).WebGlDevice.createisopen. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. Opening is asynchronous on every backend, soWebGlDevice.openanswers aFuture: putawaitin front of the call, in anasyncfunction.WebGlDevice.createStorageBuffer(migrate).WebGlDevice.createStorageBufferbecomesx.createBuffer(BufferDescriptor(lengthInBytes: {0}.lengthInBytes, usage: BufferUsage.standardStorage), contents: {0}). One call makes every buffer: a storage buffer iscreateBufferwithBufferUsage.standardStorage. WebGL2 refuses a storage usage either way, as it refused this call.WebGlDevice.open(nothing to do). Completes with aWebGlDevice, not a nullable one, andsourcesis optional (the engine's shaders by default). A browser without WebGL2 completes it with aDeviceUnavailableException; a null check after the call can go.WebGlDevice.readPixels(dart fix).WebGlDevice.readPixelsisreadback. SeeGraphicsDevice.readPixels: one readback, which converts a whole float target and throws where this answered null.WebGlFramePresenter(migrate, with a TODO).WebGlFramePresenteris afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.WebGlSampler(by hand). AWebGlSamplercarries the GL texture target its GLSL type samples (TEXTURE_2D,TEXTURE_CUBE_MAP,TEXTURE_2D_ARRAY,TEXTURE_3D) astarget, where it hadcube. Testtarget == WebGL2RenderingContext.TEXTURE_CUBE_MAPwherecubewas read.WebGlSectionSources(dart fix).WebGlSectionSourcesis imported frompackage:flutter3d_shaders/translate.dart. Thewebglsection of a loadable bundle isflutter3d_shaders'translate.dart, where a build hook with no Flutter SDK writes one, andflutter3d_webglno longer re-exports it.decodeWebGlSection(dart fix).decodeWebGlSectionis imported frompackage:flutter3d_shaders/translate.dart.encodeWebGlSection(dart fix).encodeWebGlSectionis imported frompackage:flutter3d_shaders/translate.dart.engineShaders(dart fix).engineShadersiswebGlEngineShaders. Each backend's shader table is named for its backend, so an application that opens WebGPU and falls back to WebGL imports both.ensureWebGlBackendRegistered(by hand). There is no process-wide registry since 1.0:registerWebGlBackend(registry)adds WebGL2 and its presenter to an engine's ownDeviceRegistry.flutter3d_app'splatformDevices()does it for this platform.openWebGl(by hand).WebGlDevice.open(width: w, height: h)is the one way to open the backend: its shaders default to the engine's own, and it throws aDeviceUnavailableExceptionwhereopenWebGlthrew aStateError. It is asynchronous, asopenWebGlwas, so theawaitstays. An engine that opens through aDeviceRegistrycallsregisterWebGlBackend(registry)instead.
flutter3d_webgpu #
- 148 names were the package's own (gone internal): they are not exported since 1.0.0-rc.1, and the import of
flutter3d_webgputhat brought them gets one diagnostic for all of them.GPU,GPUAdapter,GPUAdapterInfo,GPUBindGroup,GPUBindGroupDescriptor,GPUBindGroupEntry,GPUBindGroupLayout,GPUBindGroupLayoutDescriptor,GPUBindGroupLayoutEntry,GPUBlendComponent,GPUBlendState,GPUBuffer,GPUBufferBinding,GPUBufferBindingLayout,GPUBufferDescriptor,GPUCanvasConfiguration,GPUCanvasContext,GPUCanvasToneMapping,GPUColorDict,GPUColorTargetState,GPUCommandBuffer,GPUCommandEncoder,GPUCompilationInfo,GPUCompilationMessage,GPUComputePassDescriptor,GPUComputePassEncoder,GPUComputePipeline,GPUComputePipelineDescriptor,GPUDepthStencilState,GPUDevice,GPUDeviceDescriptor,GPUDeviceLostInfo,GPUError,GPUExtent3DDict,GPUFragmentState,GPUMultisampleState,GPUOrigin3DDict,GPUPipelineLayout,GPUPipelineLayoutDescriptor,GPUPrimitiveState,GPUProgrammableStage,GPUQuerySet,GPUQuerySetDescriptor,GPUQueue,GPURenderPassColorAttachment,GPURenderPassDepthStencilAttachment,GPURenderPassDescriptor,GPURenderPassTimestampWrites,GPURenderPipeline,GPURenderPipelineDescriptor,GPURequestAdapterOptions,GPUSampler,GPUSamplerBindingLayout,GPUSamplerDescriptor,GPUShaderModule,GPUShaderModuleDescriptor,GPUStencilFaceState,GPUSupportedFeatures,GPUSupportedLimits,GPUTexelCopyBufferInfo,GPUTexelCopyBufferLayout,GPUTexelCopyTextureInfo,GPUTexture,GPUTextureBindingLayout,GPUTextureDescriptor,GPUTextureView,GPUTextureViewDescriptor,GPUVertexAttribute,GPUVertexBufferLayout,GPUVertexState,GpuBufferUsage,GpuCanvas,GpuColorWrite,GpuErrorFilter,GpuFeature,GpuMapMode,GpuNavigator,GpuShaderStage,GpuTextureUsage,WebGpuBindingLayouts,WebGpuBoundBlock,WebGpuBoundSampler,WebGpuCode,WebGpuEncoder,WebGpuFrameArena,WebGpuGeometry,WebGpuGroupShape,WebGpuPipeline,WebGpuPipelineCache,WebGpuPipelineKey,WebGpuPipelineSignature,WebGpuShader,WebGpuShaderLibrary,WebGpuSlice,WebGpuStage,WebGpuVertexAttribute,WebGpuVertexBuffer,WebGpuVisibility,compileWebGpuStage,createWebGpuPipeline,gpuAddressMode,gpuAttachmentLoadOp,gpuAttachmentStoreOp,gpuBlendFactor,gpuBlendOperation,gpuBlockLayoutOf,gpuChecked,gpuCompareFunction,gpuCullMode,gpuFilterMode,gpuFrontFace,gpuIndexFormat,gpuKnowsTransientAttachments,gpuLoadOp,gpuMipmapFilterMode,gpuNavigator,gpuPrimitiveTopology,gpuRequiredLimits,gpuResolves,gpuShaderStageOf,gpuStencilOperation,gpuStoreOp,gpuStrings,gpuTextureFormat,gpuTextureFormatFeature,gpuVertexFormat,gpuVertexStepMode,gpuWritableBytes,package:flutter3d_webgpu/engine_compute_shaders.dart,paddedBytesPerRow,swapRedAndBlue,webgpuCreateCubeRenderTarget,webgpuCreateCubeTextureFromPixels,webgpuCreateTexture,webgpuCreateTextureFromPixels,webgpuDisposePersistentResources,webgpuEntryPoint,webgpuIsDepthStencil,webgpuIsTransientAttachment,webgpuOverwriteGeometry,webgpuOverwriteTexture,webgpuReleaseGeometry,webgpuReleaseTexture,webgpuStencilFingerprint,webgpuTexelBytes,webgpuUploadGeometry,webgpuVertexLayoutFingerprint,wgslFragmentOutputs. An application opens the backend withopenWebGpuand presents withWebGpuFramePresenter; nothing else is needed. A bundle's stages are read withdecodeWebGpuSection, which stays, and handed toWebGpuDevice.open; packing a section isflutter3d_shaders'compile.dartand the build hook's work. Remove the import and the code that handedengineComputeShadersto the device. GPURenderPassEncoder(nothing to do). The drawing members moved toGPURenderCommands, whichGPURenderPassEncoderimplements alongside the newGPURenderBundleEncoder; every call on a pass encoder is the same.GpuDeviceError(dart fix).GpuDeviceErrorisGpuDeviceException.*Erroris for programmer mistakes, which a caller does not catch; this is something a correct program meets, so it is an exception and is named like one.GpuDeviceExceptionhas the same constructor and members and extendsResourceException.WebGpuAttribute(by hand). SeeWebGpuStage.WebGpuBlock(by hand). SeeWebGpuStage.WebGpuBlockMember(by hand). SeeWebGpuStage.WebGpuDevice(by hand). was the WebGPU backend's own: its JavaScript bindings (GPU*), the translation tables (gpu*), the pipeline cache, the encoder or the allocators. None of it is exported since 1.0, so a change to the browser's API is not a major release. An application opens the backend withopenWebGpuand presents withWebGpuFramePresenter; nothing else is needed.WebGpuDevice.create(dart fix).WebGpuDevice.createisopen. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.WebGpuDevice.createStorageBuffer(migrate).WebGpuDevice.createStorageBufferbecomesx.createBuffer(BufferDescriptor(lengthInBytes: {0}.lengthInBytes, usage: BufferUsage.standardStorage), contents: {0}). One call makes every buffer: a storage buffer iscreateBufferwithBufferUsage.standardStorageand the bytes ascontents, plusBufferUsage.hostReadableorBufferUsage.indexwhere you asked for them by name.WebGpuDevice.debugDrainErrors(migrate).WebGpuDevice.debugDrainErrors(x0)isWebGpuDevice.debugDrainErrors(where: x0). The label is a named argument:debugDrainErrors('upload')isdebugDrainErrors(where: 'upload').WebGpuDevice.open(nothing to do). Completes with aWebGpuDevice, not a nullable one, andstagesis optional (the engine's own by default). A browser without WebGPU throws aDeviceUnavailableException; a null check after the call can go.WebGpuDevice.readBufferSync(nothing to do). It only ever refused: WebGPU has no synchronous readback, and the device is not aSynchronousBufferReadback. UsereadBufferormapBuffer.WebGpuDevice.readPixels(dart fix).WebGpuDevice.readPixelsisreadback.WebGpuFramePresenter(migrate, with a TODO).WebGpuFramePresenteris afinalclass: a class that extended or implemented it gets a TODO. A widget isfinalsince 1.0: wrap it in a widget of your own instead of extending it.WebGpuSampler(by hand). SeeWebGpuStage.WebGpuTexture(by hand).sampledViewIfMadeis gone:sampledViewmakes the view on first use and keeps it, so read that.WebGpuTextureDimension(by hand).WebGpuTextureDimensionhas new values (oneDimensional,twoDimensionalArray,threeDimensional,cubeArray): aswitchover aWebGpuTextureDimensionthat names every value needs a case for each, or a wildcard.WgslModuleCompiler(migrate).WgslModuleCompileris a base mixin class:implements WgslModuleCompilerbecomeswith WgslModuleCompiler, on abaseclass.encodeWebGpuSection(by hand). SeeWebGpuStage.engineShaders(dart fix).engineShadersiswebGpuEngineShaders. Each backend's shader table is named for its backend, so an application that opens WebGPU and falls back to WebGL imports both.openWebGpu(by hand).await WebGpuDevice.open(width: w, height: h)is the one way to open the backend: its stages default to the engine's own, and it throws aDeviceUnavailableExceptionwhereopenWebGputhrew aStateError.
pad_input #
GamepadPlatform.readPad(migrate).GamepadPlatform.readPadtakes onePadReadContext: an override reads its old parameters from it (parameter 1 is.index, parameter 2 is.out), and a call builds one.GamepadPlatform.readPadtakes onePadReadContextwhere it took its parameters. A gamepad platform is a hook a platform implements, read per pad per frame, so the gamepad reuses one context and a platform must not keep it; one context can gain members in a minor release, where a parameter added to the call would break every override written against 1.0.migrategives an override the context and reads each parameter it used from it, and a call builds one.PadAxis(migrate, with a TODO).PadAxisis a class: aswitchover it that names every value gains_ => throw UnimplementedError().PadAxisis an open set since 1.0, a class with constants rather than an enum, so a value a later minor adds does not break your code: aswitchover it needs a_ =>case. The constants,values,name(the same words the enum wrote) andbyNameare there;indexis not.PadSnapshot.connected(dart fix).PadSnapshot.connectedisisConnected. A boolean getter reads as a question in 1.0: it starts with is, has, can, uses, supports, did or was, as Effective Dart asks. The value is the same under the new name.
pointer_lock #
package:pointer_lock/pointer_lock.dart(migrate).package:pointer_lock/pointer_lock.dartispackage:flutter3d_pointer_lock/flutter3d_pointer_lock.dart.pointer_lockis published asflutter3d_pointer_lockfrom 0.4.3 on, with the same API:PointerLock,PointerLockPlatformandCaptureStatekeep their names. The dependency inpubspec.yamlchanges with the import:pointer_lock: ^0.4.0becomesflutter3d_pointer_lock: ^0.5.0, whichmigratewrites for you.package:pointer_lock/src/(migrate).package:pointer_lock/src/ispackage:flutter3d_pointer_lock/src/. What was underpointer_lock'slib/src/is underflutter3d_pointer_lock's, file for file. Importing it was never the public API; the main library above is.PointerLock.takeDelta(dart fix).PointerLock.takeDeltaisdrainDelta. Creation and teardown verbs follow one convention in 1.0: create (synchronous), open (a device or a session), load (an asset), decode (bytes), parse (text), dispose (teardown), close (a connection or a stream), and drain for a read that empties what it reads. The behaviour is the same under the new name.