flutter3d_model_core library

A model project: what is in it, what may be done to it, and what it refuses to export.

The headless half of the modeller, and the split is the one the level editor already made. flutter3d_editor_core holds a level being nudged and undone with no window in front of it, and everything that wanted to check a level without drawing it — a linter, a service, the tool an agent speaks to — could then depend on that rather than on an application. A model is the same shape of thing: a document, a stack of changes, and a set of rules about whether the result can leave.

Nothing here draws, reads a disk or knows what a viewport is. What it will hold is ModelProject and the objects in it, the sealed ModelCommand every edit is one of, the history that takes them back, and ExportReadiness.

What is here now is the spine: ModelProject with the objects in it, ProjectSelection, the sealed ModelCommand every edit is one of, ModelHistory behind them, and ExportReadiness for what a project will refuse to leave as. The commands arrive a handful at a time — see doc/model-editor-plan.md, doc-06 for the object ones, doc-07 for the mesh ones and doc-32n for the selection ones.

The two doors a project comes in and goes out through are here as well: toModelDocument and fromModelDocument for what every writer and loader in the repository speaks, and writeProject/readProject for the container a project is saved as. They were written against their own tests and reachable from nowhere else for a while, which is a thing worth not repeating: a file that only its test can import is a file the application cannot use.

Classes

AddClip
Appends an empty ProjectClip — no tracks yet — to project's own list, at the index SetKey/PoseJoint address it by afterward: the last one, project.clips.length before this ran.
AddImage
Adds an image a material can sample, interned by content.
AddJoint
Adds objectId to skeleton skeletonIndex's own joint list, at inverseBindMatrix (identity when the object's own bind pose is already its rest pose).
AddLathe
Adds a shape turned from a profile on the (radius, height) half-plane.
AddLight
Adds a light to the project's own lighting, with nothing lit in particular.
AddLod
Appends a new level of detail to id's own list.
AddMaterial
Adds a material to the project's table, painted with nothing in particular.
AddModifier
Appends modifier to id's own stack, enabled.
AddNode
Adds one node to a material's TextureGraph, creating the graph itself first if the material had none.
AddPrimitive
Adds one of the primitives the mesh package builds.
AddShapeDriver
Adds driver to id's own ModelObject.shapeDrivers — anim-34d's own row, the project-side half of a shape key that tracks a joint's rotation instead of a person's slider. ShapeDriver.shapeIndex has to name one of id's own current shape keys and ShapeDriver.jointId one of the project's own objects, the same two things a driver evaluated against a live clip (shape_driver.dart's own evaluateShapeDriversLive) would otherwise silently read as "nothing" for.
AddShapeFromMesh
Adds a new shape key to id's own shape set, seeded from the object's current mesh positions — the standard "sculpt it, then capture it" shape-key workflow, ShapeKey's constructor read straight off EditMesh.positionOf rather than from anywhere a caller has to build a Float32List by hand first.
AddSkeleton
Appends an empty ProjectSkeleton — no joints yet — to project's own list, at the index AddJoint/BindSkin address it by afterward: the last one, project.skeletons.length before this ran.
AddSocket
Adds a named point with no geometry of its own — a place for an accessory or an attachment to hang off of, the way an empty in Blender or a Marker3D in Godot works. See SocketGeometry's own doc comment for why it shares its type with what an imported empty group already becomes.
AdoptTexture
pro-pt-04: the texture a material already had, taken as the bottom layer of its paint stack.
ApplyClipResult
ApplyJobResult
Writes a JobResult into the object it answers for — the one command that ever does, and the only step a finished JobRequest ever takes in the history.
ApplyModifier
Bakes the modifiers at 0..index (this session's row says "heavy" work — a subdivideSimple at real resolution, say — moves to doc-24's job runner; nothing here is heavy yet, so this still runs where it is called) into id's own base mesh, and drops them from the stack. What is left on index and after keeps running, now over the newly baked base.
ApplySimulationCache
Writes a finished SimulationCache into the object it answers for — the one command that ever does, the same role ApplyJobResult already plays for a modifier bake.
ApplyTransform
Bakes an object's transform into its geometry and stands the node at the world's own axes.
AssetAudit
Everything AssetAudit.of measured and what it made of it.
AssignMaterial
Paints one object with a material, or takes its paint off.
AuditFinding
One thing wrong with an asset, in a sentence with its numbers in it.
AutosavePolicy
How often an autosave is allowed to happen.
BakeClothJobRequest
Bakes mesh forward frameCount frames of dt seconds each, one stepCloth call per frame — cheap enough, at the scale this cache is meant for, to fit inside a Job chunk's own per-step time budget on the web without batching several frames into one chunk.
BakeDriversJobRequest
bakeShapeDrivers (anim-20's own row) through the same job shape.
BakeIkJobRequest
bakeIk (anim-15's own row) through the job/runner shape anim-25 asks every rig bake to share.
BakeMapKind
Which maps BakeMaps knows how to produce.
BakeMaps
Bakes maps from sourceId's surface onto targetId's UVs.
BakeParticleSystemJobRequest
Bakes frameCount frames of system, advancing it by dt seconds between each — advancePerFrame runs once per frame, so a caller wanting an emission already burning when the cache starts advances system itself first.
BakeRigidBodyJobRequest
Bakes frameCount frames of a box, halfExtents on a side, falling from startPosition onto a floor at y = 0, dt seconds apart.
BakeRootMotionIntoClip
Restores clip clipIndex's own translation track for rootJoint from whatever ExtractRootMotion last saved under extras[kRootMotionExtra] — the exact inverse, key for key — and clears the extra once restored.
BakeRootMotionJobRequest
ExtractRootMotion (anim-16's own row) through the same job shape — see this library's own doc comment for why there is nothing for run to compute ahead of time: extraction is already a single cheap, synchronous ModelCommand. This exists so bakeRootMotion has the same request/run/apply shape its four siblings do; the "job" is the command itself, handed back rather than built fresh by whoever applies it.
BakeSimulationToShapes
Turns id's own baked ModelObject.simulationCache into up to maxKeys shape keys on the same object, appended to whatever ShapeSet it already has — pro-sim-05's own row, the export path a shape key already has: shapeKeyMorphTargets is what toModelDocument calls on every key a ShapeSet carries, cloth-baked or sculpted by hand, so nothing downstream of this command has to know which one it was.
BakeTextureGraph
Bakes a material's own ProjectMaterial.graph to pixels and wires the result into whichever texture slots its OutputTextureNodes each name — mat-12's own row, the command mat-11's CPU compositor and this file's own encodePng existed to be called from.
BakeToMesh
Turns a shape that still knows its parameters into a mesh that can be edited.
BendJoint
Turns joint jointIndex of skeleton skeletonIndex by degrees about axis, measured from its bind pose rather than from wherever it stands — tut-09's own row.
BevelEdges
Cuts a corner off every selected edge or vertex, walling the gap with a new face per edge and a new n-gon per vertex — flutter3d_mesh's own bevelEdges/bevelVertices (bevel.dart), wired into the undo stack for tut-04.
BindSkin
Sets objectId's own ModelObject.skeletonIndex to skeletonIndex — which of project.skeletons its mesh is skinned to, doc-26's own BindSkin. A mesh with no skin of its own reads null; this is the one command that ever sets it to something else.
BindWeightsJobRequest
bindWeights (anim-22's own row) through the job/runner shape — the one rig bake that crosses an isolate the way JobRequest does: bindWeights is O(vertex count × bone count), the same per-vertex size class JobRequest's own meshBytes conversion exists for, not the O(keyframe count) size class the clip bakes above are.
BlendMode
The blend mode a PaintLayer composites with — the plan's own five and no others.
BlendTextureNode
Two colours combined by mode, mixed by factor.
BoneMap
A source bone name → target bone name mapping, used by retargetClip to find, for each animated source bone, which bone (if any) on the target skeleton it drives.
BoneSegment
One bone, as the line segment bindWeights measures distance and visibility against — head to tail, both bind-pose world positions.
BoolHint
A flag, on or off. RecalculateNormals.flip is one of these.
BridgeLoops
Joins the two open borders the selection names with a ring of quads — ux-39.
BrushSample
One brush hit within a drag: where it landed, in the same space worldTransformOf answers in, and how far its influence reaches.
BudgetUsage
One bar's own number: how much of a profile's limit is spent, in the unit the limit is named in — triangles, joints, influences, bytes.
BuildTopology
Builds topology for an imported object, so its mesh can be edited — ux-16.
BuiltRig
What buildSkeleton hands back: the joints as freshly-made socket objects, ready to append to a project, and the ProjectSkeleton that addresses them.
ChannelsTextureNode
One channel of a colour input, alone, as a mask.
CheckerTextureNode
A flat two-colour grid, scale squares across. No inputs.
ColorTextureNode
A flat colour, painted everywhere. No inputs.
CommandJournal
One JSON Lines record, and the one way back into a project from nothing but that record.
CompositeGraph
Which passes of the chain are on, and what an edit to one of them reached.
CompositePass
One pass of the chain.
DeleteElements
Takes the selected elements out of the mesh.
DeleteKeys
Removes the keys at indices from clip clipIndex track trackIndex — KeyTable.deleteKeys, wired into the undo stack. Refused, rather than applied, when indices would leave the track with no keys at all: a track drives something for as long as the document exists, and one with nothing to sample is not a smaller track, it is a broken one.
DeleteObjects
Deletes everything selected, and everything under it.
DeleteShape
Removes shapeIndex from id's own shape set, shifting every later shape's index down by one — and, in every clip, dropping that same component from any weights track driving this object, so a track built for four shapes comes out driving three rather than reading one of them's slot as whatever the deleted shape's neighbour now occupies.
DissolveEdges
Takes the selected edges out, leaving the faces either side joined.
DoubleHint
A real number, moving by step between min and max where either is given, labelled with unit where the argument counts something — metres, radians — rather than a bare fraction.
DrawQuad
pro-rt-02: one quad of a retopology, drawn by naming its four corners.
DriverAxis
Which local axis of a joint's rotation a ShapeDriver reads.
DuplicateMaterial
Copies a material to a new row, for a variant that starts from it.
DuplicateObjects
Copies everything selected, offset by nothing, and selects the copies.
EditedGeometry
A mesh with its topology, being edited.
EmbedMaterial
Takes a material off the .fmat it deferred to, so its look is owned by the project alone from here on — the inverse of LinkMaterialFile.
EnumHint
One of values and nothing else — a command argument's own enum, read from that enum's .values rather than written out by hand, the same way builtInMaterialHints reads SurfaceAlphaMode.values for its own.
ExportBlocked
It would write, and something in it will not load.
ExportFile
One file an export produced.
ExportIssue
One thing wrong with a project, before it leaves.
ExportReadiness
Everything a project has to answer for before it can be written out.
ExportRefused
Nothing to write, and why.
ExportResult
What asking to export gave back.
ExportWritten
The bytes, and what was lost on the way.
ExtractRootMotion
Flattens clip clipIndex's own translation track for rootJoint to its first key's own value — the root stands still — after saving every key's real value under the clip's own extras[kRootMotionExtra], so BakeRootMotionIntoClip can restore them exactly.
Extrude
Pulls the selected faces out along their own normal.
FillHoles
Closes every open boundary loop in the selected object's own mesh with one new face — mesh-81n's own row, wiring fillHoles (flutter3d_mesh) into the undo stack, the "button" its own doc comment says ExportReadiness's "won't load" leaves a person without. Selects the faces it made, the same "an operation that adds geometry selects what it made" rule every other mesh command here already follows.
Geometry
What an object is made of.
GrowSelection
The selection plus everything touching it.
HistoryStep
One entry: what was done, and what the document was before it.
IkConstraint
A two-bone IK solve, root → mid → effector, bent after FK so the effector reaches target — anim-15's own row, IkConstraint in ProjectSkeleton.constraints.
ImageDimensions
The width and height an encoded image's own header names.
ImageTextureNode
A texture, or a solid colour, sampled as-is. No inputs.
ImportCounts
A tally of what an import actually produced, for a screen that wants to say "312 objects, 4 materials" before anyone opens the outliner to count.
ImportedGeometry
Buffers as they arrived, with no topology behind them.
ImportOptions
How to interpret a file fromModelDocument is bringing in, for the two facts a format's geometry does not settle on its own.
ImportReport
What importReportOf found, beyond the project itself.
ImpostorAtlas
The angles an impostor holds and where each of them lives in its atlas.
ImpostorCard
The two triangles an impostor is drawn on, in the plane facing the camera about the up axis.
InsetFaces
Shrinks every selected face inward and walls the ring it leaves — ux-39.
IntHint
A whole number, moving by step between min and max where either is given. LoopCut.cuts is one of these.
InvertSelection
Everything that was not selected, and nothing that was.
InvertTextureNode
A mask flipped: 1 minus its input.
JobRequest
One object's modifier stack, folded over a mesh captured at the moment this was built — a value, not a live reference to the project or the object it came from.
JobResult
What JobRequest.run answered.
JournalReplay
What CommandJournal.replay reached.
Key
One keyframe in a KeyTable — a time, a value, and the two tangents a cubic-interpolated key carries whether or not the table is currently showing them.
KeyShape
Records id's own current shape weights as a keyframe at time, in clip clipIndex — KeyShape's own row, an auto-key from whatever SetShapeWeight last set rather than a value handed in separately, the same "capture the live state" shape every auto-key in this plan takes.
KeyTable
An editable keyframe track — anim-04's own row, the mutable half of what AnimationTrack is the immutable, sample-ready half of.
LevelsTextureNode
A mask remapped between blackPoint and whitePoint, then gamma.
LightingSync
The scene's own lights, following a project's SceneLighting.
Wires from's output into nodeId's input socket named input.
LinkMaterialFile
Points a material row at a standalone .fmat on disk — mat-08's own verb for what ProjectMaterial.fmat already had a field for.
LinkToSource
Records where an object's geometry came from — ux-48.
Listed
One row of a listing: what to call it, and the id a later command — AssignMaterial, SetParametric, an MCP tool's id argument — addresses it by.
LodMeshCache
The simplified mesh each (objectId, lodIndex) pair produces, kept until the object's own version moves past the one it was generated at.
LodSpec
A target ratio and the screen size below which it takes over.
LookAtConstraint
One joint turned to face target, within the angles it is allowed — anim-31n's other half, and the reason that row names a look-at alongside the two-bone solve: a hero who plants a foot on a step also has to follow something with their head, and a head that follows without a limit turns to face its own back.
LoopCut
Cuts a ring of edges across the quads the selected edge runs through.
MarkSeam
Marks or clears the UV seam flag on the selected edges — pro-uv-01.
MergeByDistance
Welds vertices closer together than distance.
MeshAudit
What rebuilding one imported object's topology had to decide — the counts from importMeshData's own ImportReport, at its default weld.
MirrorJoints
Sets every joint index in jointMirror's own values to the mirror image, across axis (0=x, 1=y, 2=z), of the joint its key names — MirrorJoints, delegating to SetRestPose once per target rather than repeating its own world-transform recompute.
ModelCommand
One change, as a value.
ModelHistory
A project, the changes made to it, and the way back.
ModelObject
One thing in the project.
ModelProject
The document.
ModelProjectView
The one thing a selection asks a project.
ModifierEvaluationCache
evaluatedMesh for whichever objects have asked, kept across calls so that asking twice about an object nothing has touched costs one fold, not two.
ModifierSlot
One entry of ModelObject.modifiers: a modifier and whether the stack runs it.
MoveBy
Moves everything selected.
MoveKeys
Shifts the keys at indices on clip clipIndex track trackIndex by deltaTime — KeyTable.moveKeys, wired into the undo stack.
MoveNode
Moves nodeId to a new spot in TextureGraphPanel's own canvas.
NoiseTextureNode
Deterministic noise, by seed — never Random, the same reason mat-11's own row rules it out for baking. No inputs.
NormalFromHeightTextureNode
A height mask read as a slope and written back as a tangent-space normal.
Outcome
What a command did.
OutputTextureNode
The graph's own result — what mat-11's bake reads. A graph may hold more than one, each naming which material slot it feeds: mat-12's own question, answered by slot rather than by this file adding a second way to address a texture slot next to SetTexture's own five names.
PackAtlas
pro-uv-08n: several objects' UVs packed into one shared square, and their materials pointed at one material.
PaintLayer
One layer of a PaintStack: a sparse grid of PaintTiles and the BlendMode it composites with.
PaintMirror
Mirrors every vertex a stroke touched across a plane once the stroke itself is done — the same parameters mirrorWeights already takes, carried here as one value instead of four loose ones.
PaintSample
One dab of a texture-painting stroke: where the brush touched the surface, and how far it reached.
PaintStack
An ordered stack of PaintLayers, bottom (layers index 0) to top.
PaintStroke
Paints samples onto the object's own texture, as one step.
PaintTile
One straight-alpha RGBA8 paintTileSize×paintTileSize tile.
PaintVertexColour
pro-pt-06n: the same brush, writing into the mesh's own vertex colour instead of a texture.
PaintWeights
A weight-paint brush stroke, as one undo step — anim-10's own row, closed exactly as its own wording promised: "a stroke is one Cmd-Z."
PaintWeightsMode
How a sample changes a vertex's weight at paintWeights' own joint.
PanoramaSync
Keeps Scene.environment in step with SceneLighting.panorama.
ParametricGeometry
A shape that still knows its own parameters.
ParamHint
What a control for one of a ModelCommand's ModelCommand.arguments should look like, without either of them knowing what the argument means.
PoseJoint
Keys joint's own current path component — translation, rotation or scale, read off its live local transform rather than taken as an argument — onto clip clipIndex at frame. anim-05's own row: an auto-key, for a gizmo drag that poses a joint and then asks the pose it already reached to be remembered.
ProfileBudgetReport
Every "Screen 19" bar's own number, measured once against project's own ProjectProfile.
ProjectClip
A named set of ProjectTracks that play together — the project-side AnimationClip.
ProjectLight
One light in SceneLighting.lights, addressed by its position in the list — the same convention ProjectMaterial's own table uses, and for the same reason: nothing here needs to survive a reorder the way an object survives one under undo, so a row is only ever appended or collapsed, and every command that names one takes the index it is at right now.
ProjectLightType
Which kind of light a ProjectLight is.
ProjectMaterial
One material in a project's table.
ProjectModelDocument
A ModelProject seen as a ModelDocument, with a cache that survives repeated conversions of the project as it changes.
ProjectOpened
The file read.
ProjectProfile
The limits a project is being built against.
ProjectRead
What readProject gives back.
ProjectRefused
The file not read, and one sentence saying what is wrong with it.
ProjectSection
Section kinds.
ProjectSelection
Everything selected, in one value.
ProjectSkeleton
A skinned skeleton: which objects are joints, and how each undoes the bind pose — the project-side ModelSkin, addressed by object id where that one is addressed by node index.
ProjectTrack
One AnimationTrack, retargeted from a node index onto an object id.
ReadinessCache
Readiness for a project, recomputed only where the project moved.
RecalculateNormals
Makes every face wind the same way as its neighbours.
RegenerateLods
Forces every one of id's own cached LOD meshes to regenerate on the next ask, whatever ModelObject.version currently says — for after a change to the simplification algorithm itself, which a version bump alone already covers for the ordinary case of an edited base mesh.
Reimport
Reads a linked object's geometry again, and keeps everything else — ux-48.
RemoveJoint
Removes jointIndex from skeleton skeletonIndex, reassigning every vertex weight it carried to the removed joint's own parent joint (or dropping it, renormalized among what is left, when the parent is not itself one of this skeleton's joints) and shifting every weight naming a later joint index down by one.
RemoveLight
Drops a light out of the project's own lighting.
RemoveMaterial
Drops a material out of the project's table.
RemoveModifier
Drops the modifier at index from id's own stack.
RemoveNode
Deletes nodeId from a material's TextureGraph — see the library comment for why nothing, output included, is protected from this.
RemoveShapeDriver
Removes index from id's own ModelObject.shapeDrivers, shifting every later driver's own index down by one — the same "index into a list" shape DeleteShape and RemoveModifier already give their own stacks. Unlike DeleteShape, nothing else in the document names a driver by its position, so there is nothing further to shift.
Rename
Renames one object.
RenameJoint
Renames the object at joint jointIndex of skeleton skeletonIndex — Rename's own refusal for a blank name, reached through a skeleton's own joint index rather than an id directly.
RenameShape
Renames shapeIndex in id's own shape set.
RenderPreset
What a RenderSnapshotJob is asked for.
RenderProjectView
The six axis views plus a three-quarter angle.
RenderRequest
What renderProject draws, and how.
RenderShading
What a surface is drawn as.
RenderSnapshotJob
A snapshot of project at preset, each tile rendered on a device of its own from tileDevice.
ReorderModifier
Moves the modifier at from on id's own stack to to, the rest shifting to make room the way a list's own insert after a removeAt would.
ReparentJoint
Reparents the object at joint jointIndex of skeleton skeletonIndex under to — an object id, which need not itself be a joint of this skeleton (a hand may be parented under a wrist bone that is itself not skinned, for instance). A thin wrapper over SetParent, addressed through a skeleton's own joint index rather than an id directly — the cycle check and the refusals are SetParent's own, not repeated here.
ReplaceDocument
Swaps the whole document for next, as one undo step.
RetargetClipJobRequest
retargetClip (anim-17's own row) through the same job shape — answers with a ProjectClip, which a caller applies through ApplyClipResult(clip: result) (append — a retarget always lands as a new clip on the target project, never a replacement of the source it read).
RetargetRig
A skeleton as retargeting reads it: every node a joint hangs from, and which of them are the joints.
RetargetSource
A file opened for retargeting alone — project and skeleton are read by retargetClip, never merged into the document being edited.
Retopologize
Rebuilds the selected object's surface as quads — pro-rt-01's own retopologize, as a command.
RigBuildOptions
Knobs buildSkeleton reads beyond the template and the markers themselves — anim-33d's own row, screen 16's rig-composition switches given a backend.
RigMirrorAxis
Which axis is the left/right mirror plane. x (the default) matches this engine's own left/right convention elsewhere — see MirrorJoints' own axis parameter in joint_commands.dart, which this row's own reflection math mirrors. A value class rather than an enum for the same reason RigTemplate is one.
RigNode
One node of a rig as retargeting reads it.
RigTemplate
A stock rig shape buildSkeleton knows how to lay out.
RigTrack
A track and the node it moves.
RotateBy
Turns everything selected.
ScaleBy
Scales everything selected.
SceneEnvironmentPreset
Which built-in sky a project's viewport is lit against, as a value rather than a texture — the project file has no room to carry six cube faces of its own, and mat-15's own Material Studio already established the vocabulary these three names come from.
SceneLighting
A project's own lighting, environment, ambient level, shadow request and post-processing — everything mat-23's own row names, held as one value on ModelProject.lighting.
ScenePostSettings
Post-processing knobs a project carries as document state.
SculptStroke
One sculpting stroke: a brush, the points it was dragged through, and the pressure at each of them.
SelectAll
Everything there is, at whatever the modeller is pointing at.
SelectByMaterial
Every face on one material slot.
SelectEdgeLoop
The edges in line with one edge.
SelectEdgeRing
The edges across the strip of quads one edge runs through.
SelectElements
Picks whole objects by id, or switches to mesh mode on one object and picks vertices, edges or faces of it by id — a click, named.
SelectFacing
Every face pointing the way axis does — ux-19.
SelectLinked
Everything joined to the selection by a chain of edges.
SelectNear
Everything at the live level within radius of point — ux-19.
SelectNone
Nothing, at whatever the modeller is pointing at.
Separate
Takes the selected faces out of one object and makes them another.
SetEnvironment
Sets the project's own built-in sky.
SetInterpolation
Switches clip clipIndex track trackIndex between linear, step and cubic — KeyTable.setInterpolation, wired into the undo stack. Every key's own tangents survive the switch, KeyTable.setInterpolation's own guarantee.
SetKey
Writes (or replaces) the keyframe at time on clip clipIndex track trackIndex — KeyTable.setKey, wired into the undo stack.
SetLightField
Sets one field of one light by name.
SetLightTransform
Puts a transform on one light, replacing whatever it had — the same shape SetTransform gives an object, scoped to SceneLighting.lights' own index addressing the way RemoveLight and SetLightField already are.
SetLodRatio
Changes one of id's own levels of detail's target ratio, leaving its screen threshold alone.
SetMaterialField
Sets one field of a material by name.
SetMaterialGraph
Replaces (or clears) the whole TextureGraph a material's texture slots can be baked from.
SetModifierField
One field of the modifier at index on id's own stack, replaced.
SetNodeField
Sets one non-link field of a node — SetMaterialField's own shape, one node down.
SetObjectLocked
Locks or unlocks one object — ux-14.
SetObjectVisible
Shows or hides one object — ux-14.
SetOrigin
Moves an object's origin without moving the object.
SetPanorama
Lights the scene with a panorama the project carries — ux-49.
SetParametric
Replaces the parameters of a shape that still has them.
SetParent
Hangs one object under another.
SetProfileLimits
Changes ModelProject.profile's own maxJoints/maxInfluences, refusing a value the shader or the vertex storage cannot represent.
SetRestPose
Sets joint jointIndex of skeleton skeletonIndex's own rest pose to worldTransform — a world-space transform, since that is the space a gizmo or a "match this other bone" tool naturally has one in — and recomputes both the joint object's own local transform and the skeleton's own inverse bind matrix for it, "с пересчётом inverseBind", the row's own words.
SetRig
One history step for a whole auto-rig result. See this file's own library comment for the shape and what each field is for.
SetSceneLightingField
Sets one scene-wide lighting field by name — everything on SceneLighting that is not a light or the environment: ambientIntensity, shadows, exposure, and ScenePostSettings.bloomEnabled under its own name, bloomEnabled — the post panel draws it beside exposure (see that panel's own doc comment for why), so it is set the same way, through the one command every other scene-wide field already goes through, rather than a SetPostField this row would be the only command left needing.
SetShapeDriverField
Changes one field of the shape driver at index on id's own ModelObject.shapeDrivers — anim-34d's own generic setter, the same shape SetModifierField gives a modifier's own fields.
SetShapeWeight
Sets shapeIndex's current preview weight to weight on id's own shape set — a live value, blended by ShapeKey.blend wherever the object is drawn, not a keyframe; KeyShape is what records one of those, from whatever this last set.
SetTangent
Sets the key at index's own tangents on clip clipIndex track trackIndex, leaving its time and value untouched — KeyTable .setTangent, wired into the undo stack. Either tangent left null keeps whatever that key already had, KeyTable.setTangent's own rule.
SetTexture
Points a material's texture slot at an image, or clears it.
SetTransform
Puts a transform on one object, replacing whatever it had.
ShapeDriver
A shape key driven by how far one joint has turned, rather than by a person's own slider — the project-side half of a face that flinches when an elbow locks, without anyone keying the flinch by hand.
ShapeDriverCurve
How a ShapeDriver remaps the 0, 1 it gets from clamping an angle into its from–to span before handing the result on.
ShapeSet
keys and weights are index-aligned: weights[i] is how much keys[i] currently pulls toward its own sculpted shape, the same base + Σ weightᵢ × deltaᵢ blend ShapeKey.blend already computes.
ShrinkSelection
The selection minus everything on its edge.
SimulationBakeRequest
One bake that fills a SimulationCache for one object — what ApplySimulationCache needs to know about whatever produced the frames.
SimulationCache
vertexCount vertices, snapshotted once per frame in frames.
SkinWeightsBlob
A bind-weights job's own answer, flattened: eight Float32s per vertex slot — the local joint index (into the new skeleton's own ProjectSkeleton.joints) at four slots, then the weight at each of those same four slots — the same shape EditMesh.setSkin's own VertexAttributes already carries, laid end to end across every vertex slot in order rather than boxed one VertexAttributes at a time, since that is the form a job answers in and toJson can base64 whole.
SlideEdges
Moves the selected loop along the edges that cross it — ux-39.
SnapshotCamera
Where a snapshot's camera stands and what it looks at.
SocketGeometry
No geometry at all — a named point for something else to hang off of, the way an empty in Blender or a Marker3D in Godot works.
SubdivideMesh
Subdivides the selected object's mesh — pro-sc-08's own "Subdivide" button, and the coarse-to-fine step a sculptor takes when the shape is right and the detail is not.
TextureBakeCache
A structural-hash-keyed memo of already-baked node rasters, reused across calls to bakeTextureGraph and bakeTextureFull — the object a caller keeps alive across edits so an unchanged Image node is never redecoded. Empty and inert until a bake fills it.
TextureBudget
A preset for how big a texture may be on one export target, and what format it should end up encoded as.
TextureGraph
An immutable network of TextureNodes.
TextureGraphIssue
One thing TextureGraph.validate found wrong, named by the node it is about.
TextureInfo
What a texture panel needs before anything decodes a pixel.
TextureNode
One node in a TextureGraph. Sealed — see the library comment for why eleven kinds and no others.
TextureUsage
What measure found: the project's images, recomputed under one TextureBudget.
ToggleModifier
Flips whether the modifier at index on id's own stack runs.
ToggleModifierExport
Turns the modifier at index on or off for the file — ux-13.
TransformElements
Moves, turns or scales the selected elements.
Triangulate
Cuts every selected face into triangles.
TwoBoneIkResult
The result of one solveTwoBoneIk call: the corrected local rotations for root and mid — tip never rotates, the same convention its own engine namesake uses.
Takes whatever is wired into nodeId's input socket back off it.
UnlinkSource
Takes an object off the file it was linked to, so its geometry is the project's own from here on — the inverse of LinkToSource.
UnwrapCommand
Lays out a UV for the selected faces, or the whole mesh when nothing is selected, by method.
UnwrapMethod
Which algorithm UnwrapCommand hands a face's own island to.
UvTransformTextureNode
A colour input resampled at a moved, scaled and turned UV.
Vector3Hint
Three numbers moving together — a translation, an axis, a scale — each taking step and unit the way a single DoubleHint would.
WeightPair
One joint's pull on a vertex, before it is capped to the four slots VertexAttributes actually stores — mesh-60's own row.

Enums

AuditCheck
Which of the audit's questions a finding answers.
ExportFormat
What the model can be taken out as: the writers this application offers out of flutter3d_formats' own list.
ExportSeverity
Whether an issue stops the export or spoils the result.
OriginPlacement
Where an object's own origin sits, for SetOrigin.
ProfileTarget
What kind of machine a profile is written for.
RecoveryDecision
What opening a project should do when a newer autosave exists for it.
ResizeFilter
Which algorithm resizeRgba samples with.
SelectionMode
Which kind of thing is being selected.
StepAuthor
Who made a HistoryStep — mcp-10n's own reason HistoryStep names one at all: an agent's own ModelHistory.undo should not reach past a person's own step and take back work nobody asked it to.
TextureBlendMode
How BlendTextureNode combines its two colour inputs.
TextureChannel
One RGBA channel to read out of a colour input.
TextureEncoding
How a texture's pixels are written — mat-30's own row: "an encoder …, an option de export; в glTF PNG."
TextureFileFormat
The badge a texture slot shows for what actually samples on the GPU.
TextureValueType
What one socket on a TextureNode carries.
TransformPivot
The point a turn or a scale happens about.
TransformSpace
Whose axes a transform is expressed in.
UpAxis
document as a project of imported objects, which is what opening a glTF becomes.

Constants

assetMaxSize → const double
The largest overall size, in metres, that reads as one asset: a hundred metres, a large building. A file past it was almost always written in centimetres or millimetres and read as metres.
assetMinSize → const double
The smallest overall size, in metres, that reads as an asset in metres: a centimetre. Anything smaller is a unit mistake far more often than a model of a grain of sand.
humanoidBoneNames → const List<String>
The humanoid bone names autoMap knows, in anim-21's own RigTemplate.humanoid order (rig_template.dart, packages /flutter3d_model_core). That table's own bone list is private to its file, so this is a second, hand-kept copy rather than an import — the two are meant to name the same seventeen joints, and a rig built by buildSkeleton(RigTemplate.humanoid, ...) maps onto another one built the same way name-for-name, which is what makes retargeting onto the same skeleton an identity (retargetClip's own first acceptance clause).
kHistoryBudgetBytes → const int
How many bytes of mesh journal a history may hold before the oldest steps are dropped — pro-sc-06's own number.
kMaxSkinInfluences → const int
Simultaneous bone influences a vertex may keep — the plan's own decision log entry З1, "four influences as a hard limit" (doc/model-editor-plan.md), the same cap flutter3d_mesh's toVertexAttributes bakes into storage. pruneSkinWeights' own default.
kPanoramaCubeLevels → const int
How many convolved levels follow the base.
kPanoramaCubeSize → const int
How big a cube a panorama is turned into.
kProjectChecksumEntryBytes → const int
One entry of the checksum table: u32 section kind, u32 CRC-32.
kProjectChecksumOffset → const int
Where the header keeps the CRC-32 of the checksum section itself.
kProjectHeaderBytes → const int
kProjectImageEntryBytes → const int
One entry of the image table: u32 offset into the blob, u32 length.
kProjectImportedEntryBytes → const int
One entry of the imported-mesh table: u32 vertex offset, u32 vertex length, u32 index offset, u32 index length, all into the blob.
kProjectMagic → const int
F3DP, little-endian, so a file opened in a text editor announces itself on the first line and does not collide with .f3d's own F3D\n.
kProjectMeshEntryBytes → const int
One entry of the edited-mesh table: u32 offset into the blob, u32 length.
kProjectSectionEntryBytes → const int
kProjectSimulationEntryBytes → const int
One entry of the simulation-cache table: u32 offset into the blob, u32 length. The shape of the frames it addresses — how many, and how long each is — is in the object's own manifest record, for the reason ProjectSection.simulationCaches gives.
kProjectVersion → const int
Moves only when an existing record changes meaning. A new section does not need it, because an older reader steps over a kind it does not know.
kRootMotionExtra → const String
The key ExtractRootMotion/BakeRootMotionIntoClip store a clip's own unflattened root translation under, inside ProjectClip.extras — the flutter3dRootMotion an export "by code" reads instead of baking the motion into the clip itself.
paintTileSize → const int
The edge length of one PaintTile, in pixels.
renderSheetViews → const List<RenderProjectView>
The four views a sheet renders, one per quadrant, left-to-right then top-to-bottom: front and right make the top row, top and iso the bottom — three orthographic views plus the one perspective view, the same "silhouette from every side" a person reaches for on a real drafting sheet.
tinyFontHeight → const int
How many pixels tall.
tinyFontSpacing → const int
One blank column between glyphs, so II does not read as one letter.
tinyFontWidth → const int
How many pixels wide one glyph is, before drawTinyText's own scale.
wireThickness → const double
How thick a wire is, as a fraction of the mesh's own bounding diagonal.

Properties

modelCommandNames → List<String>
Every command a journal, a project file or an agent can name — the keys of _modelCommandReaders, in the order they are written there.
final

Functions

autoMap(List<String> sourceNames, List<String> targetNames) → BoneMap
Guesses a BoneMap from sourceNames to targetNames using humanoidBoneNames plus L/R pairing — anim-17's own "по словарю гуманоида и L/R" (by the humanoid dictionary and L/R).
bakeAllTransforms(ModelProject project) → ModelProject
project with every object's own node transform baked into its geometry, where that is possible — ui-17's own "bake node transforms" checkbox.
bakeDriversJobRequestFor(ModelProject project, int clipIndex, List<ShapeDriver>? drivers, int shapeTargetObjectId, int shapeCount) → BakeDriversJobRequest?
project's own clip clipIndex, captured alongside drivers as a BakeDriversJobRequest — null when clipIndex names no clip.
bakeIk({required ModelProject project, required ProjectClip clip, required IkConstraint constraint, required double fps}) → ProjectClip
clip, with constraint's own root and middle joints' rotation tracks replaced by resolveIkConstraint's own output, sampled every 1/[fps] seconds from zero through clip's own duration — BakeIk(clip, fps)'s own row. "Export always bakes" because nothing plays a live IkConstraint back: the two tracks this writes are ordinary rotation keyframes, sampled and read exactly like any other joint's, needing no IkConstraint or worldTransformOf call ever again.
bakeIkJobRequestFor(ModelProject project, int clipIndex, IkConstraint constraint, {required double fps}) → BakeIkJobRequest?
project's own clip clipIndex, captured alongside constraint and fps as a BakeIkJobRequest — null when clipIndex names no clip.
bakeImpostor({required ModelProject project, required ImpostorAtlas atlas, required Vector3 centre, required double distance, required TileDevice tileDevice, double fovYRadians = math.pi / 8, RenderSettings settings = const RenderSettings(), Vector4? clearColor}) → Future<ImpostorBake>
project rendered from every one of atlas's angles, composited into one atlas image.
bakeLookAt({required ModelProject project, required ProjectClip clip, required LookAtConstraint constraint, required double fps}) → ProjectClip
clip, with constraint's own joint's rotation track replaced by resolveLookAtConstraint's own output, sampled every 1/[fps] seconds — the look-at's own bakeIk, and for the same reason: nothing plays a live LookAtConstraint back, so what leaves in a file has to be ordinary keyframes.
bakeShapeDrivers({required ProjectClip clip, required List<ShapeDriver> drivers, required int shapeTargetObjectId, required int shapeCount}) → ProjectClip
clip, with one more track added: drivers' own combined output, sampled at every time any of their joints already carries a rotation keyframe at, written as an ordinary AnimationPath.weights track on shapeTargetObjectId — so that playing the baked clip back needs no driver, no joint lookup, and no evaluateShapeDriversLive call at all, the same "запечённое = живое" trade every other bake in this package makes.
bakeTextureFull(TextureGraph graph, int outputNodeId, Map<int, Uint8List> images, {int size = 2048}) → Future<Uint8List?>
The same bake as bakeTextureGraph, at a size meant for export rather than a panel's own thumbnail, run off this isolate when one exists.
bakeTextureGraph(TextureGraph graph, int outputNodeId, Map<int, Uint8List> images, {int size = 256, TextureBakeCache? cache}) → Uint8List?
graph's own outputNodeId node, baked at size×size and written out as plain RGBA8 — mat-10's TextureGraph finally able to answer in pixels. Null when graph does not TextureGraph.validate clean, or outputNodeId names nothing in it.
bindWeights({required List<Vector3> positions, required List<int> triangles, required List<BoneSegment> bones, double falloffPower = 2.0, bool useVisibility = true, double epsilon = 1e-4}) → Map<int, List<WeightPair>>
Computes raw, un-pruned, un-normalized per-vertex bone weights for positions (bind-pose vertex positions) against bones, using inverse distance to each bone's own segment and — when useVisibility is true — a TriangleBvh built over triangles (flat vertex-index triples) to drop a bone a vertex has no straight line of sight to.
bindWeightsJobRequestFor({required ModelProject project, required int objectId, required List<BoneSegment> bones, double falloffPower = 2.0, bool useVisibility = true, double epsilon = 1e-4, int maxInfluences = kMaxSkinInfluences, double pruneThreshold = 1e-3}) → BindWeightsJobRequest?
project's own object objectId, bound to bones as a BindWeightsJobRequest — null when objectId names no object, or the object has no edited mesh to bind into.
blockLayoutFor(TextureFileFormat format) → ({int blockHeight, int blockWidth, int bytesPerBlock})?
The block a compressed format is stored in — blockWidth by blockHeight texels, bytesPerBlock bytes each — or null for TextureFileFormat.rgba8 (one texel a value, no block at all) and TextureFileFormat.other (unknown, so no block size to name).
boneSegmentsOf(RetargetRig rig) → List<BoneSegment>
rig's own RetargetRig.joints, as BoneSegments — one per joint, in that same order, the same local addressing WeightPair.joint already means everywhere in this engine (bind_weights.dart's own BoneSegment class comment). BoneSegment.head is a joint's own parent's world position; BoneSegment.tail is the joint's own; BoneSegment.name is the joint's own RigNode.name, for mirrorSkinWeights' own lookup.
boundsOfMesh(EditMesh mesh) → Aabb3?
The box around every live vertex of mesh, or null for a mesh with none.
buildSkeleton(RigTemplate template, Map<String, Vector3> markers, {required Aabb3 bounds, RigBuildOptions options = const RigBuildOptions(), required int firstObjectId, String? skeletonName, Matrix4? meshWorld}) → BuiltRig
Builds a template-shaped rig out of markers, each a world-space position named by requiredMarkers(template).
clipsOf(ModelProject project) → List<Listed>
Every animation clip in project, by the index retargetClip, bakeIk and bakeDrivers all take. See skeletonsOf for why this stopped being an empty list.
contentsOf(ModelProject project) → List<Listed>
Every object in project, in the order the outliner shows them.
crc32(List<int> bytes) → int
The CRC-32 of bytes, the polynomial PNG and zip use.
creditsFile(ModelProject project, {String? documentName}) → String?
The CREDITS.txt project needs, or null when it owes nothing.
creditsIn(ModelProject project) → List<ModelCredit>
Every credit project owes, deduplicated and in a stable order.
creditsLine(ModelProject project) → String?
The same thing as one line, for a format that carries a copyright field rather than a file beside it — glTF's own asset.copyright.
curveSamples(KeyTable table, int component, {required int sampleCount}) → List<(double, double)>
sampleCount evenly-spaced points across table's own duration, each table's own component read through KeyTable.sample — so a step track comes out piecewise-constant (holding the previous key's value until the next key's time) for the same reason AnimationTrack.sample itself holds it, and a cubic-spline track matches AnimationTrack.sample exactly, because this is that call, not a second interpolation written to look the same.
decideRecovery({DateTime? savedAt, DateTime? autosaveAt}) → RecoveryDecision
Chooses RecoveryDecision by comparing when the project was last written (savedAt, null for a path that has never been saved) against when its autosave was last written (autosaveAt, null when none exists).
describeElements(EditMesh mesh, ElementLevel level, {Iterable<int>? ids, int limit = 50}) → List<DescribedElement>
ids of level in mesh, described — or, with no ids, every live element of that level up to limit.
dirtyRectOf(List<(int, int)> tiles, int canvas) → (int, int, int, int)?
The texel rectangle tiles cover, or null when there are none — (x, y, width, height), clamped to a canvas of canvas texels a side.
dirtyTilesBetween(PaintStack? before, PaintStack? after) → List<(int, int)>
Which tiles differ between before and after, as (tx, ty) pairs.
drawTile(ModelProject project, RenderPreset preset, int index, TileDevice tileDevice, {required int tileWidth, required int tileHeight, GraphicsDevice? on}) → Future<Uint8List>
One tile of a snapshot, drawn on a device of its own, as raw RGBA bytes.
drawTinyText(Uint8List pixels, {required int width, required int height, required int x, required int y, required String text, int scale = 1, int red = 0xFF, int green = 0xFF, int blue = 0xFF}) → void
text drawn opaquely into pixels — RGBA8, width × height — with its top-left corner at (x, y).
drawTinyTextWithShadow(Uint8List pixels, {required int width, required int height, required int x, required int y, required String text, int scale = 1}) → void
text drawn so it can be read over anything: black one pixel down and right, then white on top.
elementCentre(EditMesh mesh, ElementLevel level, int id) → Vector3?
Where id of level is, in the object's own space — a vertex's position, an edge's midpoint, a face's centroid — or null when nothing there is alive.
elementNormal(EditMesh mesh, ElementLevel level, int id) → Vector3?
Which way id of level faces, or null when nothing decides it: a vertex in no face, an edge whose two sides cancel out.
eulerOf(Quaternion q) → Vector3
q's own rotation as yaw (around Y), pitch (around X) and roll (around Z), in radians — the inverse of Quaternion.euler(yaw, pitch, roll), which composes a rotation from exactly these three in that order.
evaluateShapeDriversLive({required ProjectClip clip, required List<ShapeDriver> drivers, required double time, required int shapeCount}) → List<double>
Every driver in drivers evaluated against clip at time, summed per shape index into a shapeCount-long weight list — the additive combination the row's own "аддитивно" asks for: two drivers naming the same ShapeDriver.shapeIndex add rather than the second overwriting the first, so a shape two joints both push stays pushed by both.
FitTexturesToProfile(ModelProject project, {TextureBudget? budget}) → ModelProject
project's own images, each clamped independently on width and height to profile.textures.maxSide — not scaled to fit a box keeping its own proportions, clamped axis by axis, so a 1000×600 image against a 512px budget becomes 512×512 rather than 512×307. Images already within budget, and any this package's own decodePng cannot read, are carried over unchanged.
formatByteSize(int bytes) → String
bytes as "170 КБ", "3 МБ" or similar — the largest unit whose whole number is at least one, capped at gigabytes because nothing this repository hands to a texture slot is bigger than that.
fromModelDocument(ModelDocument document, {ImportOptions options = const ImportOptions()}) → ModelProject
The profile does not come back, because a file does not record one: a project is measured against the machine it is being built for, and that belongs to the workspace rather than to the model.
hintsForModifier(Modifier modifier) → Map<String, ParamHint>
What a modifier panel should offer a control for, per field of modifier's own kind.
imageDimensions(Uint8List bytes) → ImageDimensions?
The dimensions bytes declares in its own PNG, JPEG or KTX2 header, or null if none of the three headers matches or the file is too short to hold the one it starts with.
importInto(ModelProject project, ModelDocument document, {ImportOptions options = const ImportOptions()}) → ImportReport
document merged into project: every one of its objects added under a fresh id, its materials and images folded into the existing tables by content, and its own hierarchy and roots preserved as roots of the merged project too — at options's own scale and up-axis correction, the same ones fromModelDocument would apply importing the document on its own.
importReportOf(ModelDocument document, {ImportOptions options = const ImportOptions()}) → ImportReport
fromModelDocument, with the decoder's warnings and a tally of what came in alongside the project it produces.
isProjectFile(Uint8List bytes) → bool
Whether bytes begin the way a project file does.
jobRequestFor(ModelProject project, int objectId, int uptoIndex) → JobRequest?
project's own object objectId, its modifiers 0..uptoIndex captured as a JobRequest the same way ApplyModifier would bake them synchronously — the modifier at uptoIndex folded in even when its own slot is disabled, for the reason ApplyModifier's own doc comment gives.
lightOverflowOf(SceneLighting lighting) → int
How many of lighting's own lights LightBuffer would not fit into one frame — the same arithmetic Renderer.render reports on FrameResult.lightsDropped (renderer.dart's own lights.gather(scene .lights) followed by lights.overflow), run here against a throwaway Scene instead of a real one.
lightsOf(ModelProject project) → List<Listed>
Every light in project's own scene lighting, by the index RemoveLight and SetLightField address one with — ux-19.
liveElements(EditMesh mesh, ElementLevel level) → Iterable<int>
Every live element of level, each exactly once, in id order.
looseAutoMap(List<String> sourceNames, List<String> targetNames) → BoneMap
A synonym-and-prefix-tolerant autoMap — anim-18's own row. Retargeting a mocap file means matching a rig this engine never built and that rarely shares a single literal bone name with one: Mixamo's own mixamorig:LeftArm, 3ds Max Biped's Bip01_L_UpperArm, or simply a different capitalisation of the same word. autoMap itself stays exact-match only — loosening it would risk the "same skeleton — identity" guarantee its own doc comment leans on — so this is the separate, looser pass instead: every one of sourceNames and targetNames is read through _looseCanonicalOf, and two names that land on the same one of humanoidBoneNames pair up.
materialIssues(ModelProject project) → List<ExportIssue>
Every material's own issues, independent of which objects paint with it.
materialsOf(ModelProject project) → List<Listed>
Every material in project's table, addressed the way AssignMaterial and SetMaterialField already do: by row.
measure(ModelProject project, TextureBudget budget) → TextureUsage
Weighs project's images against budget: what they would cost in total if every one of them were encoded to budget.targetFormat, and which of them are individually wider or taller than budget.maxSide regardless of weight.
mirrorBoneName(String name) → String
name's own left/right mirror by the left/right prefix rig_template.dart already uses (leftHip/rightHip), or name unchanged for a centerline bone (hips, spine, ...) that has none.
mirrorSkinWeights(Map<int, List<WeightPair>> weights, List<Vector3> positions, List<BoneSegment> bones, {int axis = 0, double plane = 0.0, double tolerance = 1e-4}) → Map<int, List<WeightPair>>
Copies each vertex's weights in weights onto its mirror image across the plane perpendicular to axis (0=x, 1=y, 2=z, matching flutter3d_mesh's own mirrorWeights convention) at plane, remapping bone indices through bones' own names via mirrorBoneName — anim-17's own left/right dictionary, reused rather than a second naming scheme invented here.
modelCommandFromJson(Object? json) → ModelCommand?
Reads a command back out of a journal, or null.
modifiersOf(ModelProject project, int id) → List<Listed>
id's own modifier stack, top of the list first — the order ReorderModifier and SetModifierField index it in — with what each one is and whether the picture and the file both run it (ux-19). The kind is read out of the modifier's own toJson rather than switched on here, so a modifier kind added to flutter3d_mesh is listed by name the day it lands instead of the day somebody remembers this file: kind is what modifierFromJson already reads it back by, so it cannot drift.
normalizeSkinWeights(Map<int, List<WeightPair>> weights) → Map<int, List<WeightPair>>
Rescales every vertex's own weights in weights to sum to one, via flutter3d_mesh's own normalizeWeights — the same renormalize anim-09's paint operations already use, so a seam vertex bound equally to two bones reads as exactly 0.5/0.5 rather than half of whatever the raw falloff happened to sum to.
paintWeights({required ModelProject project, required EditMesh mesh, required ProjectSkeleton skeleton, required int joint, required List<BrushSample> samples, required double strength, PaintWeightsMode mode = PaintWeightsMode.paint, PaintMirror? mirror, bool normalize = false, int? maxInfluences}) → void
Paints joint's influence over every vertex samples touches, hit-tested against each vertex's current posed position — the low-level brush PaintWeights runs inside one journal step: paintWeights(joint, samples, strength, mode, mirror, normalize, maxInfluences).
panoramaPixels(Uint8List bytes) → ByteData?
A Radiance file as the RGBA8 EnvironmentMap.fromPanorama reads, or null when it is not one.
parametricShapeFrom(Map<String, Object?> json) → ParametricShape?
The shape json describes, or null if this build cannot build it.
parametricShapeJson(ParametricShape shape) → Map<String, Object?>
A parametric shape as JSON.
planExport(ModelProject project, {required ExportFormat format, String name = 'model', bool force = false, bool bakeTransforms = false, TextureEncoding textureEncoding = TextureEncoding.png, Set<int> only = const <int>{}, bool applyModifiers = true}) → ExportResult
project as files, or the reason it is not.
polygonEdgesOf(EditMesh mesh) → List<(int, int)>
Every edge of every live face of mesh, each once, as a pair of vertex indices with the smaller first.
poseOf(ModelProject project, ProjectSkeleton skeleton) → Pose
skeleton's own joints, as a Pose holding each one's rest transform.
previewRig(RigTemplate template, {RigBuildOptions options = const RigBuildOptions()}) → RigPreview
buildSkeleton's own preview: template and options, without building either the objects or the skeleton — cheap enough to call on every keystroke of screen 16's own composition card, since it is nothing but counting _BoneSpecs.
pruneSkinWeights(Map<int, List<WeightPair>> weights, {int maxInfluences = kMaxSkinInfluences, double threshold = 1e-3}) → Map<int, List<WeightPair>>
Drops influences below threshold and keeps at most maxInfluences of what remains (the largest ones), for every vertex in weights.
readProject(Uint8List bytes) → ProjectRead
The project in bytes, or one sentence saying why not.
recoveryPathFor(String? path, {required String sessionId}) → String
The storage key an autosave for the project opened from path belongs under.
renderPost(RenderSettings from, CompositeGraph graph, {BloomSettings? bloom, LookSettings? look, bool? tonemap}) → ({CompositeGraph graph, RenderSettings settings})
Edits one post pass's own numbers and says what that reached — pro-rn-03's own renderPost.
renderProject(RenderRequest request, {required GraphicsDevice deviceFactory(int width, int height)}) → Future<Uint8List>
request.project drawn from request.view, as PNG bytes, on a device deviceFactory builds for the occasion — see this library's own doc comment for why that is a parameter rather than a CpuDevice built here.
renderSheet({required ModelProject project, int width = 512, int height = 512, RenderShading shading = RenderShading.material, Set<int> selection = const <int>{}, int? weightsJoint, bool labels = true, List<RenderProjectView> views = renderSheetViews, required GraphicsDevice deviceFactory(int width, int height)}) → Future<Uint8List>
project, as PNG bytes of views in two rows, left to right then top to bottom — a 2×2 grid for the default four, 4×2 with one empty tile for all seven of RenderProjectView.values.
requiredMarkers(RigTemplate template) → List<String>
The marker keys buildSkeleton reads for template — every _BoneSpec.markerKey in its own table, in table order. Exposed so a caller (or a test) can ask what a template needs without hand-copying the table.
resizeRgba(Uint8List rgba, int width, int height, int newWidth, int newHeight, {ResizeFilter filter = ResizeFilter.bilinear}) → Uint8List
rgba (width×height, four bytes a pixel) resampled to newWidth×newHeight by filter.
resolveIkConstraint({required ModelProject project, required IkConstraint constraint, ProjectClip? clip, double time = 0.0}) → ({Quaternion mid, double reachError, Quaternion root})
constraint, solved against project's own rest transforms and whichever rotations clip gives its root and middle joints at time — "applied after FK": the pre-solve rotations (from clip when it animates them, project's own rest pose otherwise) seed which way the chain is already bent, exactly the reasoning TwoBoneIk.solve's own doc comment gives for reading a live Pose instead of constructing a bend plane from the pole alone.
resolveLookAtConstraint({required ModelProject project, required LookAtConstraint constraint, ProjectClip? clip, double time = 0.0}) → ({double aimError, Quaternion rotation})
constraint solved once: the joint's own new local rotation, and how much of the turn its limits refused.
retargetClip({required ProjectClip sourceClip, required ModelProject sourceProject, required ProjectSkeleton sourceSkeleton, required ModelProject targetProject, required ProjectSkeleton targetSkeleton, required BoneMap boneMap, bool lockFeet = true, double groundY = 0.0, double footTolerance = 1e-3}) → ProjectClip
Retargets sourceClip — a clip whose tracks address sourceSkeleton's own joints in sourceProject — onto targetSkeleton's joints in targetProject, through boneMap.
retargetClipJobRequestFor({required ModelProject sourceProject, required int sourceSkeletonIndex, required int sourceClipIndex, required ModelProject targetProject, required int targetSkeletonIndex, required BoneMap boneMap, bool lockFeet = true, double groundY = 0.0, double footTolerance = 1e-3}) → RetargetClipJobRequest?
sourceProject's own skeleton sourceSkeletonIndex and clip sourceClipIndex, retargeted onto targetProject's own skeleton targetSkeletonIndex through boneMap — captured as a RetargetClipJobRequest, or null when any of the three indices names nothing.
retargetRigOf(ModelProject project, ProjectSkeleton skeleton, {Iterable<int> alsoNodes = const <int>[]}) → RetargetRig
skeleton in project as the rig algorithms read a rig: every joint, every object a joint hangs from, and every object in alsoNodes — the objects a clip's own tracks move, which a bone map may name whether or not they are joints.
retargetTracks({required List<RigTrack> tracks, required RetargetRig source, required RetargetRig target, required BoneMap boneMap, bool lockFeet = true, double groundY = 0.0, double footTolerance = 1e-3}) → List<RigTrack>
Retargets tracks — tracks moving source's own nodes — onto target's joints, through boneMap.
rigIssues(ModelProject project, ProjectProfile profile) → List<ExportIssue>
Everything wrong with project's skeletons and clips, measured against profile.
sceneFromProject(ModelProject project, GraphicsDevice device, {Material restyle(ModelObject object, Material material)?, int? weightsJoint, bool wires = false}) → Scene
project's objects as a Scene on device — a key and a fill light and the project's own lights, the hierarchy walked, no camera (each caller frames its own).
shapesOf(ModelProject project, int id) → List<Listed>
id's own shape keys, by the index SetShapeWeight and ShapeDriver address one with — ux-19. Empty for an object with none, and for an id nothing in project holds.
shouldSave(AutosavePolicy policy, {required bool isDirty, required DateTime now, required DateTime lastEditAt, DateTime? lastSavedAt}) → bool
Whether right now is a moment AutosavePolicy says to write.
simulationCacheToShapeKeys(SimulationCache cache, {int maxKeys = 8}) → List<ShapeKey>
Up to maxKeys frames of cache, evenly spaced across it (both ends included), as ShapeKeys — pro-sim-05's own option (a).
skeletonsOf(ModelProject project) → List<Listed>
Every skeleton in project, by the index ModelObject.skeletonIndex and every rig command already address one with.
smoothSkinWeights(Map<int, List<WeightPair>> weights, Map<int, List<int>> adjacency, {double lambda = 0.5, int iterations = 1}) → Map<int, List<WeightPair>>
Blends each vertex in weights lambda of the way toward the average of its own adjacency neighbours' weights, iterations times — vertexAdjacency's own consumer, and the same shrink-resistant Laplacian shape flutter3d_mesh's smoothVertexWeights already applies to an EditMesh directly, worked out here over the plain vertex-index map bindWeights itself produces instead.
solveTwoBoneIk({required Vector3 rootWorldPosition, required Vector3 midWorldPosition, required Vector3 tipWorldPosition, required Quaternion rootParentWorldRotation, required Quaternion rootWorldRotation, required Quaternion midWorldRotation, required Vector3 target, required Vector3 pole}) → TwoBoneIkResult
Bends root → mid → tip so tip reaches target as closely as the chain's own two bone lengths allow, and returns the local rotations root and mid need for that — the caller's own job to write back into whatever keyframe it came from.
tangentHandles(KeyTable table, int keyIndex, int component, {double handleLength = 0.1}) → ({Vector2 inHandle, Vector2 outHandle})
The screen-space positions of key keyIndex's own two tangent handles, handleLength seconds out from the key on either side — a straight line from the key through value + tangent * dt, the ordinary Hermite-handle construction: the tangent is a slope (value per second), and a line at that slope for handleLength seconds is exactly the segment a person drags to change it.
texelDensityOf(ModelProject project, ModelObject object) → double?
How densely object measures within project — texels/m, the number the status line divides by 100 for "tex/cm" and _texelDensityIssue below compares against a profile's own target. Public — mat-33d's own line — for the status line to read directly, rather than the answer staying trapped inside the warning that used to be the only thing that read it.
textureBudgetIssues(ModelProject project) → List<ExportIssue>
project's own images against its ProjectProfile.textures budget — mat-22's "texture outside budget," read from mat-28's measure rather than a second walk of its own.
textureInfo(Uint8List bytes) → TextureInfo?
bytes' own declared size, format and weight — from a PNG/JPEG header via imageDimensions, or a KTX2 header read one level further — or null for anything else, or a file too short to hold what it claims to be.
tinyTextWidth(String text, {int scale = 1}) → int
How wide text will be at scale, in pixels.
toModelDocument(ModelProject project, {bool withLods = false}) → ModelDocument
project as the document F3dWriter — and the glTF and OBJ writers when they arrive — already accepts.
toPowerOfTwo(int n) → int
n rounded to the nearest power of two, ties going to the higher one — a texture unit that wants power-of-two dimensions cares about the nearer size, not which side of it n happened to fall.
valueRange(KeyTable table, int component) → ({double max, double min})
The lowest and highest value table's own component reaches across every key — what a curve editor scales its vertical axis to fit.
vertexAdjacency(List<int> triangles) → Map<int, List<int>>
Every vertex directly joined to another by a triangle edge in triangles (flat triples of vertex indices) — the "mesh adjacency" smoothSkinWeights blends against, built straight from the same triangle list bindWeights' own TriangleBvh indexes, so a caller supplies the mesh's shape exactly once.
wireMeshFor(EditMesh mesh, {double thickness = wireThickness}) → MeshData?
The polygon edges of mesh as a solid mesh of three-sided prisms.
worldBoundsOf(ModelProject project) → Aabb3?
The box around every object in project, in world space.
worldTransformOf(ModelProject project, int id, {Map<int, Quaternion>? rotationOverrides}) → Matrix4
The world transform of the object id names — its own ModelObject.transform, composed with its parent's, and so on out to whichever ancestor has none.
writeProject(ModelProject project, {ModelHistory? history, int maxHistoryBytes = 4 * 1024 * 1024}) → Uint8List
The project as a .f3dproj file.

Typedefs

AtlasCell = ({double height, double width, double x, double y})
A rectangle of the atlas, in 0..1.
DescribedElement = ({double? area, Vector3 at, int id, double? length, Vector3? normal})
One element, in the object's own space.
ImpostorBake = ({ImpostorAtlas atlas, Uint8List rgba, int size})
A baked impostor: the atlas's own pixels, and the atlas that laid them out.
ImpostorView = ({AtlasCell cell, int index, double yaw})
Where one baked view sits in the atlas, and which way it was taken from.
MaskRead = double Function(int x, int y)
A mask's own gate at one texel — see PaintStroke.maskImage.
ModelCredit = ({String author, String licence, String title, String url})
What an export owes somebody for one object — gal-05.
RigPreview = ({int controllerCount, int deformingCount, int ikChainCount, int jointCount})
buildSkeleton's own preview — previewRig — of what a template and RigBuildOptions combination would build, without building it: how many joints, how many of them actually deform a mesh, how many rig controllers, how many IK chains. anim-33d's own row, for the composition-card UI screen 16 draws ("N bones · M deforming").
Where an object's geometry came from, and what that file looked like when it was last read — ux-48's own "link to source".
TextureInputSocket = ({int? from, TextureValueType type})
One input socket's own declared type and, if from is not null, which node is wired into it.
TileDevice = GraphicsDevice Function(int width, int height)
Makes the device one tile of a snapshot is drawn on, width × height.

Exceptions / Errors

RenderRefusal
Why renderProject declined to draw.