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.lengthbefore 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 ownevaluateShapeDriversLive) 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 offEditMesh.positionOfrather than from anywhere a caller has to build aFloat32Listby 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.lengthbefore 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
Marker3Din 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 — asubdivideSimpleat real resolution, say — moves todoc-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 onindexand 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
meshforward frameCount frames of dt seconds each, onestepClothcall per frame — cheap enough, at the scale this cache is meant for, to fit inside aJobchunk'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 shapeanim-25asks 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 sobakeRootMotionhas 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:shapeKeyMorphTargetsis whattoModelDocumentcalls 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 commandmat-11's CPU compositor and this file's ownencodePngexisted 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 ownbevelEdges/bevelVertices(bevel.dart), wired into the undo stack fortut-04. - BindSkin
-
Sets objectId's own ModelObject.skeletonIndex to skeletonIndex —
which of
project.skeletonsits mesh is skinned to,doc-26's ownBindSkin. A mesh with no skin of its own readsnull; 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:bindWeightsisO(vertex count × bone count), the same per-vertex size class JobRequest's own meshBytes conversion exists for, not theO(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.flipis 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
weightstrack 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
.fmatit 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
.valuesrather than written out by hand, the same waybuiltInMaterialHintsreadsSurfaceAlphaMode.valuesfor 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, wiringfillHoles(flutter3d_mesh) into the undo stack, the "button" its own doc comment saysExportReadiness'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,IkConstraintinProjectSkeleton.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.cutsis 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 whatAnimationTrackis 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.
- Link
- Wires from's output into nodeId's input socket named input.
- LinkMaterialFile
-
Points a material row at a standalone
.fmaton 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
idargument — 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 ownImportReport, 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 reasonmat-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 toSetTexture'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
mirrorWeightsalready 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' ownjoint. - PanoramaSync
-
Keeps
Scene.environmentin 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.versioncurrently 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,
outputincluded, 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
insertafter aremoveAtwould. - 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 throughApplyClipResult(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 ownretopologize, 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' ownaxisparameter injoint_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 ownMaterial Studioalready 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 besideexposure(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 aSetPostFieldthis 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.blendwherever 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 leftnullkeeps 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, 1it gets from clamping an angle into itsfrom–tospan before handing the result on. - ShapeSet
-
keys and weights are index-aligned:
weights[i]is how muchkeys[i]currently pulls toward its own sculpted shape, the samebase + Σ weightᵢ × deltaᵢblendShapeKey.blendalready computes. - ShrinkSelection
- The selection minus everything on its edge.
- SimulationBakeRequest
-
One bake that fills a SimulationCache for one object — what
ApplySimulationCacheneeds 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 shapeEditMesh.setSkin's ownVertexAttributesalready carries, laid end to end across every vertex slot in order rather than boxed oneVertexAttributesat 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
Marker3Din 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
Imagenode 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
rootandmid—tipnever rotates, the same convention its own engine namesake uses. - Unlink
- 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
VertexAttributesactually 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 ownRigTemplate.humanoidorder (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 bybuildSkeleton(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 capflutter3d_mesh'stoVertexAttributesbakes 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 ownF3D\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
flutter3dRootMotionan 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
IIdoes 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
sourceNamestotargetNamesusing humanoidBoneNames plus L/R pairing —anim-17's own "по словарю гуманоида и L/R" (by the humanoid dictionary and L/R). -
bakeAllTransforms(
ModelProject project) → ModelProject -
projectwith 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 clipclipIndex, captured alongsidedriversas a BakeDriversJobRequest — null whenclipIndexnames no clip. -
bakeIk(
{required ModelProject project, required ProjectClip clip, required IkConstraint constraint, required double fps}) → ProjectClip -
clip, withconstraint's own root and middle joints' rotation tracks replaced by resolveIkConstraint's own output, sampled every1/[fps]seconds from zero throughclip's own duration —BakeIk(clip, fps)'s own row. "Export always bakes" because nothing plays a liveIkConstraintback: 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 clipclipIndex, captured alongsideconstraintandfpsas a BakeIkJobRequest — null whenclipIndexnames 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> -
projectrendered from every one ofatlas's angles, composited into one atlas image. -
bakeLookAt(
{required ModelProject project, required ProjectClip clip, required LookAtConstraint constraint, required double fps}) → ProjectClip -
clip, withconstraint's own joint's rotation track replaced by resolveLookAtConstraint's own output, sampled every1/[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 ordinaryAnimationPath.weightstrack onshapeTargetObjectId— 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 ownoutputNodeIdnode, baked atsize×sizeand written out as plain RGBA8 —mat-10'sTextureGraphfinally able to answer in pixels. Null whengraphdoes not TextureGraph.validate clean, oroutputNodeIdnames 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) againstbones, using inverse distance to each bone's own segment and — whenuseVisibilityis true — aTriangleBvhbuilt overtriangles(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 objectobjectId, bound tobonesas a BindWeightsJobRequest — null whenobjectIdnames 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
formatis stored in —blockWidthbyblockHeighttexels,bytesPerBlockbytes 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 ofmarkers, each a world-space position named by requiredMarkers(template). -
clipsOf(
ModelProject project) → List< Listed> -
Every animation clip in
project, by the indexretargetClip,bakeIkandbakeDriversall 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.txtprojectneeds, or null when it owes nothing. -
creditsIn(
ModelProject project) → List< ModelCredit> -
Every credit
projectowes, 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)> -
sampleCountevenly-spaced points acrosstable's own duration, eachtable's owncomponentread 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 reasonAnimationTrack.sampleitself holds it, and a cubic-spline track matchesAnimationTrack.sampleexactly, 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> -
idsoflevelinmesh, described — or, with noids, every live element of that level up tolimit. -
dirtyRectOf(
List< (int, int)> tiles, int canvas) → (int, int, int, int)? -
The texel rectangle
tilescover, or null when there are none —(x, y, width, height), clamped to a canvas ofcanvastexels a side. -
dirtyTilesBetween(
PaintStack? before, PaintStack? after) → List< (int, int)> -
Which tiles differ between
beforeandafter, 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 -
textdrawn opaquely intopixels— 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 -
textdrawn 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
idoflevelis, 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
idoflevelfaces, 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 ofQuaternion.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
driversevaluated againstclipattime, summed per shape index into ashapeCount-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 toprofile.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 owndecodePngcannot read, are carried over unchanged. -
formatByteSize(
int bytes) → String -
bytesas"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
bytesdeclares 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 -
documentmerged intoproject: 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 — atoptions'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
bytesbegin the way a project file does. -
jobRequestFor(
ModelProject project, int objectId, int uptoIndex) → JobRequest? -
project's own objectobjectId, its modifiers0..uptoIndexcaptured as a JobRequest the same way ApplyModifier would bake them synchronously — the modifier atuptoIndexfolded in even when its own slot is disabled, for the reasonApplyModifier's own doc comment gives. -
lightOverflowOf(
SceneLighting lighting) → int -
How many of
lighting's own lightsLightBufferwould not fit into one frame — the same arithmeticRenderer.renderreports onFrameResult.lightsDropped(renderer.dart's ownlights.gather(scene .lights)followed bylights.overflow), run here against a throwawaySceneinstead 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 ownmixamorig:LeftArm, 3ds Max Biped'sBip01_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 ofsourceNamesandtargetNamesis 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 againstbudget: what they would cost in total if every one of them were encoded tobudget.targetFormat, and which of them are individually wider or taller thanbudget.maxSideregardless of weight. -
mirrorBoneName(
String name) → String -
name's own left/right mirror by theleft/rightprefixrig_template.dartalready uses (leftHip/rightHip), ornameunchanged for a centerline bone (hips,spine, ...) that has none. -
mirrorSkinWeights(
Map< int, List< weights, List<WeightPair> >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
weightsonto its mirror image across the plane perpendicular toaxis(0=x,1=y,2=z, matchingflutter3d_mesh's ownmirrorWeightsconvention) atplane, remapping bone indices throughbones' 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 owntoJsonrather than switched on here, so a modifier kind added toflutter3d_meshis listed by name the day it lands instead of the day somebody remembers this file:kindis whatmodifierFromJsonalready reads it back by, so it cannot drift. -
normalizeSkinWeights(
Map< int, List< weights) → Map<WeightPair> >int, List< WeightPair> > -
Rescales every vertex's own weights in
weightsto sum to one, viaflutter3d_mesh's ownnormalizeWeights— the same renormalizeanim-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 vertexsamplestouches, 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.fromPanoramareads, or null when it is not one. -
parametricShapeFrom(
Map< String, Object?> json) → ParametricShape? -
The shape
jsondescribes, 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 -
projectas 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 aPoseholding each one's rest transform. -
previewRig(
RigTemplate template, {RigBuildOptions options = const RigBuildOptions()}) → RigPreview -
buildSkeleton's own preview:
templateandoptions, 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< weights, {int maxInfluences = kMaxSkinInfluences, double threshold = 1e-3}) → Map<WeightPair> >int, List< WeightPair> > -
Drops influences below
thresholdand keeps at mostmaxInfluencesof what remains (the largest ones), for every vertex inweights. -
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
pathbelongs 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 ownrenderPost. -
renderProject(
RenderRequest request, {required GraphicsDevice deviceFactory(int width, int height)}) → Future< Uint8List> -
request.projectdrawn fromrequest.view, as PNG bytes, on a devicedeviceFactorybuilds for the occasion — see this library's own doc comment for why that is a parameter rather than aCpuDevicebuilt 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 ofviewsin 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.markerKeyin 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 tonewWidth×newHeightbyfilter. -
resolveIkConstraint(
{required ModelProject project, required IkConstraint constraint, ProjectClip? clip, double time = 0.0}) → ({Quaternion mid, double reachError, Quaternion root}) -
constraint, solved againstproject's own rest transforms and whichever rotationsclipgives its root and middle joints attime— "applied after FK": the pre-solve rotations (fromclipwhen it animates them,project's own rest pose otherwise) seed which way the chain is already bent, exactly the reasoningTwoBoneIk.solve's own doc comment gives for reading a livePoseinstead 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}) -
constraintsolved 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 addresssourceSkeleton's own joints insourceProject— ontotargetSkeleton's joints intargetProject, throughboneMap. -
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 skeletonsourceSkeletonIndexand clipsourceClipIndex, retargeted ontotargetProject's own skeletontargetSkeletonIndexthroughboneMap— 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 -
skeletoninprojectas the rig algorithms read a rig: every joint, every object a joint hangs from, and every object inalsoNodes— 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 movingsource's own nodes — ontotarget's joints, throughboneMap. -
rigIssues(
ModelProject project, ProjectProfile profile) → List< ExportIssue> -
Everything wrong with
project's skeletons and clips, measured againstprofile. -
sceneFromProject(
ModelProject project, GraphicsDevice device, {Material restyle(ModelObject object, Material material)?, int? weightsJoint, bool wires = false}) → Scene -
project's objects as aSceneondevice— 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 inprojectholds. -
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
maxKeysframes ofcache, evenly spaced across it (both ends included), asShapeKeys —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< weights, Map<WeightPair> >int, List< adjacency, {double lambda = 0.5, int iterations = 1}) → Map<int> >int, List< WeightPair> > -
Blends each vertex in
weightslambdaof the way toward the average of its ownadjacencyneighbours' weights,iterationstimes — vertexAdjacency's own consumer, and the same shrink-resistant Laplacian shapeflutter3d_mesh'ssmoothVertexWeightsalready applies to anEditMeshdirectly, 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→tipsotipreachestargetas closely as the chain's own two bone lengths allow, and returns the local rotationsrootandmidneed 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,handleLengthseconds out from the key on either side — a straight line from the key throughvalue + tangent * dt, the ordinary Hermite-handle construction: the tangent is a slope (value per second), and a line at that slope forhandleLengthseconds is exactly the segment a person drags to change it. -
texelDensityOf(
ModelProject project, ModelObject object) → double? -
How densely
objectmeasures withinproject— texels/m, the number the status line divides by 100 for "tex/cm" and_texelDensityIssuebelow 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 itsProjectProfile.texturesbudget —mat-22's "texture outside budget," read frommat-28'smeasurerather 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
textwill be atscale, in pixels. -
toModelDocument(
ModelProject project, {bool withLods = false}) → ModelDocument -
projectas the documentF3dWriter— and the glTF and OBJ writers when they arrive — already accepts. -
toPowerOfTwo(
int n) → int -
nrounded 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 itnhappened to fall. -
valueRange(
KeyTable table, int component) → ({double max, double min}) -
The lowest and highest value
table's owncomponentreaches 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' ownTriangleBvhindexes, so a caller supplies the mesh's shape exactly once. -
wireMeshFor(
EditMesh mesh, {double thickness = wireThickness}) → MeshData? -
The polygon edges of
meshas 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
idnames — 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
.f3dprojfile.
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
templateand 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"). - SourceLink = ({String path, String sha})
-
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
fromis 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.