Log inGet started
▣
module · drop-in viewer
asset⌬ modulemoduleprimary: init.luau·part ofpackage ZeroBlender.package·originates fromworld 240544fe-7…

animation

<!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. -->

by◐Deata·posted 16d ago
What it does

animation

<!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. -->

TODO: describe this module.

Interface

What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.

conforms to

zero/source-extract/v2

Armatures, pose bones, keyframes and actions for the bpy session, and the clips they become in a document's output.bundle. Installed into a session by blenderSession; the math lives in modeling.rigging.

SkinnedModelClipPlayer

deep(t: ?) → void

argtypedescription
t?

install(S: ?, h: ?) → void

argtypedescription
S?
h?

dirty( ) → void

uniqueName(want: ?, exists: ?) → void

argtypedescription
want?
exists?

coll(name: ?, items: ?, lookup: ?, setter: ?) → void

A collection proxy: index, iteration, get(), name lookup, optional setter.

argtypedescription
name?
items?
lookup?
setter?

weak( ) → void

boneByName(arm: ?, n: ?) → void

argtypedescription
arm?
n?

childrenOf(arm: ?, b: ?) → void

argtypedescription
arm?
b?

armObjects(arm: ?) → void

argtypedescription
arm?

editing(arm: ?) → void

argtypedescription
arm?

esc(s: ?) → void

argtypedescription
s?

renameBone(arm: ?, b: ?, want: ?) → void

argtypedescription
arm?
b?
want?

onTail(arm: ?, b: ?) → void

argtypedescription
arm?
b?

onHead(arm: ?, b: ?) → void

argtypedescription
arm?
b?

setBoneMatrix(b: ?, m: ?) → void

argtypedescription
b?
m?

col(c: ?) → void

argtypedescription
c?

ebProxy(arm: ?, b: ?) → void

argtypedescription
arm?
b?

boneProxy(arm: ?, b: ?) → void

argtypedescription
arm?
b?

armatureProxy(arm: ?) → void

argtypedescription
arm?

newArmature(name: ?) → void

argtypedescription
name?

channels(o: ?, name: ?) → void

argtypedescription
o?
name?

poseMatrices(o: ?) → void

argtypedescription
o?

boneTail(ob: ?, name: ?) → void

argtypedescription
ob?
name?

setBasis(c: ?, m: ?) → void

argtypedescription
c?
m?

parentFrame(o: ?, b: ?) → void

argtypedescription
o?
b?

poseBoneProxy(o: ?, b: ?) → void

argtypedescription
o?
b?

poseProxy(o: ?) → void

argtypedescription
o?

newAction(name: ?) → void

action = {name, slots={{identifier, target_id_type, fcurves}}} fcurve = {data_path, array_index, keys, extrapolation, auto_smoothing}

argtypedescription
name?

slotFor(act: ?, o: ?, create: ?) → void

argtypedescription
act?
o?
create?

fcurve(slot: ?, path: ?, i: ?, create: ?) → void

argtypedescription
slot?
path?
i?
create?

setKey(fc: ?, frame: ?, value: ?) → void

argtypedescription
fc?
frame?
value?

resolve(o: ?, path: ?) → void

argtypedescription
o?
path?

keyArgs(o: ?, prefix: ?, a: ?, kw: ?) → void

argtypedescription
o?
prefix?
a?
kw?

keyframeInsert(o: ?, prefix: ?, a: ?, kw: ?) → void

argtypedescription
o?
prefix?
a?
kw?

keyframeDelete(o: ?, prefix: ?, a: ?, kw: ?) → void

argtypedescription
o?
prefix?
a?
kw?

apply(frame: ?, only: ?) → void

Evaluate every assigned action at `frame` into the animated properties.

argtypedescription
frame?
only?

kpProxy(fc: ?, k: ?) → void

argtypedescription
fc?
k?

re( ) → void

handle(side: ?, typ: ?) → void

argtypedescription
side?
typ?

fcProxy(fc: ?) → void

argtypedescription
fc?

slotProxy(act: ?, s: ?) → void

argtypedescription
act?
s?

channelbag(act: ?, s: ?) → void

argtypedescription
act?
s?

slotOf(act: ?, v: ?) → void

argtypedescription
act?
v?

stripProxy(act: ?) → void

argtypedescription
act?

layerProxy(act: ?) → void

argtypedescription
act?

actionRange(act: ?) → void

argtypedescription
act?

actionProxy(act: ?) → void

argtypedescription
act?

getitem(key: ?) → void

argtypedescription
key?

setitem(key: ?, pv: ?) → void

argtypedescription
key?
pv?

adProxy(o: ?) → void

argtypedescription
o?

vgroups(o: ?) → void

Group names live on the object (o.vgroups), weights on the mesh (mesh.dverts[vertex] = {[group index] = weight}), as in Blender.

argtypedescription
o?

dverts(mesh: ?) → void

argtypedescription
mesh?

vgIndex(o: ?, g: ?) → void

argtypedescription
o?
g?

inEdit(o: ?) → void

argtypedescription
o?

vgProxy(o: ?, g: ?) → void

argtypedescription
o?
g?

newGroup(o: ?, name: ?) → void

argtypedescription
o?
name?

findGroup(o: ?, name: ?) → void

argtypedescription
o?
name?

removeGroup(o: ?, g: ?) → void

argtypedescription
o?
g?

vgCollection(o: ?) → void

argtypedescription
o?

vertexGroups(mesh: ?, i: ?) → void

MeshVertex.groups

argtypedescription
mesh?
i?

groupsDoc(o: ?) → void

argtypedescription
o?

restoreGroups(o: ?, d: ?) → void

argtypedescription
o?
d?

deformBones(arm: ?) → void

argtypedescription
arm?

weightsOf(o: ?) → void

argtypedescription
o?

pointWeights(o: ?, positions: ?) → void

Weights for positions of an object's (possibly modified) mesh: a position that is an original vertex takes its weights; others blend the weights of the nearest original face by inverse distance.

argtypedescription
o?
positions?

key(p: ?) → void

argtypedescription
p?

skinMatrices(armObj: ?) → void

Armature-space deform matrices (pose @ inverse rest) per deform bone.

argtypedescription
armObj?

deform(o: ?, m: ?, pv: ?) → void

The ARMATURE modifier: linear blend of bone deforms by vertex-group weight, normalised by the total weight; vertices with no weight stay put.

argtypedescription
o?
m?
pv?

segDist(p: ?, a: ?, b: ?) → void

argtypedescription
p?
a?
b?

autoWeights(o: ?, armObj: ?) → void

Automatic weights by bone heat (Baran & Popović), as Blender: each vertex is heated by its closest bone(s) with strength 1/d², and the heat diffuses over the surface through a cotangent Laplacian. Computed at the rest pose.

argtypedescription
o?
armObj?

add(i: ?, j: ?, w: ?) → void

argtypedescription
i?
j?
w?

cot(i: ?, j: ?, l: ?) → void

argtypedescription
i?
j?
l?

d2(a: ?, b: ?) → void

argtypedescription
a?
b?

mulA(x: ?, out: ?) → void

argtypedescription
x?
out?

deformer(o: ?) → void

argtypedescription
o?

deformSig(o: ?, m: ?) → void

What an ARMATURE modifier's rest-pose skin depends on (not the pose).

argtypedescription
o?
m?

cross(a: ?, b: ?) → void

argtypedescription
a?
b?

dot3(a: ?, b: ?) → void

argtypedescription
a?
b?

sub3(a: ?, b: ?) → void

argtypedescription
a?
b?

unit(v: ?) → void

argtypedescription
v?

colOf(m: ?, i: ?) → void

argtypedescription
m?
i?

posOf(m: ?) → void

argtypedescription
m?

qmul(a: ?, b: ?) → void

argtypedescription
a?
b?

qmat(q: ?, s: ?, t: ?) → void

argtypedescription
q?
s?
t?

slerp(a: ?, b: ?, t: ?) → void

argtypedescription
a?
b?
t?

blendM(a: ?, b: ?, t: ?) → void

argtypedescription
a?
b?
t?

rot3(axis: ?, ang: ?) → void

argtypedescription
axis?
ang?

rotBetween(a: ?, b: ?) → void

argtypedescription
a?
b?

applyRot(Rm: ?, m: ?) → void

argtypedescription
Rm?
m?

absScale(m: ?) → void

argtypedescription
m?

axes(prefix: ?, val: ?) → void

argtypedescription
prefix?
val?

merge(...: ?) → void

argtypedescription
...?

validObj(t: ?) → void

argtypedescription
t?

mn(x: ?, lo: ?, hi: ?) → void

argtypedescription
x?
lo?
hi?

conEval(c: ?, Ml: ?, T: ?) → void

argtypedescription
c?
Ml?
T?

targetInfo(c: ?, depth: ?, ownerArm: ?, get: ?, key: ?) → void

A target's world matrix (object, or a bone of an armature object) and its space frames.

argtypedescription
c?
depth?
ownerArm?
get?
key?

pmOf(n: ?) → void

argtypedescription
n?

runConstraints(list: ?, W: ?, frames: ?, depth: ?, self: ?, ownerArm: ?, get: ?) → void

argtypedescription
list?
W?
frames?
depth?
self?
ownerArm?
get?

constraintTypes( ) → void

objectConstraints(o: ?, m: ?, depth: ?) → void

argtypedescription
o?
m?
depth?

bonePost(o: ?, depth: ?) → void

argtypedescription
o?
depth?

solve3(m: ?, b: ?) → void

argtypedescription
m?
b?

solveIK(o: ?, tipName: ?, c: ?, pm: ?, override: ?, depth: ?) → void

argtypedescription
o?
tipName?
c?
pm?
override?
depth?

get(nm: ?) → void

argtypedescription
nm?

fk( ) → void

rotate(i: ?, Rm: ?) → void

argtypedescription
i?
Rm?

poleAlign( ) → void

Blender's pole (IK_QJacobianSolver::ConstrainPoleVector): one rotation of the root, taking the frame (end direction, root X/Z by pole_angle) onto (goal direction, pole direction), applied before solving.

poseMatrices(o: ?, depth: ?) → void

argtypedescription
o?
depth?

conProxy(o: ?, c: ?) → void

argtypedescription
o?
c?

conCollection(o: ?, getList: ?, isBone: ?) → void

argtypedescription
o?
getList?
isBone?

objectConstraintsProxy(o: ?) → void

argtypedescription
o?

boneConstraints(o: ?, b: ?) → void

argtypedescription
o?
b?

newTarget( ) → void

tgtProxy(t: ?) → void

argtypedescription
t?

varProxy(v: ?) → void

argtypedescription
v?

driverProxy(fc: ?) → void

argtypedescription
fc?

fmProxy(m: ?) → void

argtypedescription
m?

fmodsProxy(fc: ?) → void

argtypedescription
fc?

tMatrix(t: ?, space: ?) → void

argtypedescription
t?
space?

varValue(v: ?) → void

argtypedescription
v?

scriptEnv( ) → void

driverValue(o: ?, fc: ?) → void

argtypedescription
o?
fc?

fcOutput(fc: ?, x: ?) → void

argtypedescription
fc?
x?

evaluateDrivers( ) → void

update( ) → void

driverErrors( ) → void

driverAdd(o: ?, a: ?, kw: ?) → void

argtypedescription
o?
a?
kw?

one(i: ?) → void

argtypedescription
i?

driverRemove(o: ?, a: ?, kw: ?) → void

argtypedescription
o?
a?
kw?

defaultOf(path: ?, i: ?) → void

argtypedescription
path?
i?

stripLen(sp: ?) → void

argtypedescription
sp?

recalcEnd(sp: ?) → void

argtypedescription
sp?

validateTrack(tr: ?) → void

argtypedescription
tr?

stripTime(sp: ?, f: ?) → void

argtypedescription
sp?
f?

activeStrip(tr: ?, f: ?) → void

argtypedescription
tr?
f?

stripInfluence(sp: ?, f: ?) → void

argtypedescription
sp?
f?

evalAnim(o: ?, frame: ?, actionOnly: ?) → void

argtypedescription
o?
frame?
actionOnly?

layer(act: ?, time: ?, infl: ?, blend: ?) → void

argtypedescription
act?
time?
infl?
blend?

apply(frame: ?, only: ?) → void

argtypedescription
frame?
only?

animRange(o: ?) → void

argtypedescription
o?

sceneRange( ) → void

allStripNames(o: ?) → void

argtypedescription
o?

nlaStripProxy(o: ?, tr: ?, sp: ?) → void

argtypedescription
o?
tr?
sp?

nlaTrackProxy(o: ?, tr: ?) → void

argtypedescription
o?
tr?

tracksProxy(o: ?) → void

argtypedescription
o?

adGet(o: ?, k: ?) → void

argtypedescription
o?
k?

adSet(o: ?, k: ?, v: ?) → void

argtypedescription
o?
k?
v?

keysD(fc: ?) → void

argtypedescription
fc?

conD(c: ?) → void

argtypedescription
c?

animDoc(o: ?) → void

argtypedescription
o?

conR(d2: ?) → void

argtypedescription
d2?

animRestore(o: ?, d: ?) → void

argtypedescription
o?
d?

objectGet(o: ?, key: ?) → void

argtypedescription
o?
key?

objectSet(o: ?, key: ?, v: ?) → void

argtypedescription
o?
key?
v?

sceneGet(k: ?) → void

argtypedescription
k?

sceneSet(k: ?, v: ?) → void

argtypedescription
k?
v?

keysDoc(fc: ?) → void

argtypedescription
fc?

actionsDoc( ) → void

serialize(doc: ?) → void

argtypedescription
doc?

restore(doc: ?) → void

argtypedescription
doc?

colMajor(m: ?) → void

Every object that moves in an action becomes a joint of the document's rig (one bone per object entity, named like it, under the session root); each action becomes a clip of those joints' sampled transforms. A placed copy plays through the engine's SkinnedModel + ClipPlayer.

argtypedescription
m?

zeroMat(z: ?) → void

argtypedescription
z?

snapshot( ) → void

putBack(s: ?) → void

argtypedescription
s?

differs(a: ?, b: ?) → void

argtypedescription
a?
b?

bake(only: ?, lo: ?, hi: ?, rest: ?) → void

argtypedescription
only?
lo?
hi?
rest?

safe(n: ?) → void

argtypedescription
n?

restZ(b: ?) → void

argtypedescription
b?

skinned( ) → void

syncSkins(matFor: ?) → void

argtypedescription
matFor?

boneClip(ao: ?, rest: ?) → void

argtypedescription
ao?
rest?

output(sessionRoot: ?) → void

argtypedescription
sessionRoot?

summary(o: ?) → void

argtypedescription
o?

Sub-parts

Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.

Showing up to 3 levels deep. Open a part to see what it holds further down.

16+items
▣
module · born here
❒asset
# rigging <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# meshOps <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# xform <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
❒
package · born here
❒asset
# ZeroBlender Blender-style modeling inside Zero. Install this package and you get the whole surface: the `.zblend` document type, the tools that edit it, the Python/bpy runtime behind them, the layer previews live in, and the workflow that drives a modeling job to the end. ## Contents | Path | What it is | |---|---| | `zblend.assetType/` | The `.zblend` document (Zero's `.blend`): editable `scene.json`, history, images, and a live `output.bundle`. Scene-instantiable, previewed, searchable. Its ref methods open and edit documents (below); `M.modules` exposes every module here to instances. | | `blender.toolbox/` | Blender MCP-compatible tools: `execute_blender_code`, `get_scene_info`, `get_object_info`, `get_viewport_screenshot`, `bpy_api_lookup`, `get_addon_status`, `compare_to_reference`. `api.json` is the implemented bpy surface. | | `modules/blenderSession` | The bpy/bmesh/mathutils session: objects, meshes, modifiers, materials, viewport, flush to the document and bundle. | | `modules/pythonParser`, `pythonRuntime` | The Python subset the scripts run in (Luau-hosted, not CPython). | | `modules/animation`, `rigging` | Armatures, pose, vertex groups, ARMATURE deform, auto weights, keyframes/actions/F-Curves, constraints, IK, drivers, NLA; clip baking. | | `modules/sceneOps` | Empties, duplicates, collections, collection instances, `zero_instance`, `origin_set`, cursor, snapping. | | `modules/curves`, `meshOps`, `polygonTopology`, `xform` | Curve/text meshing, edit-mode operators, topology and evaluation, matrix math. | | `modules/referenceCompare` | Silhouette scoring against a reference image. | | `modules/bpy`, `hardSurface`, `kestrel` | Older core geometry layer and hard-surface helpers used by the session. | | `workspace/ModelingWorkspace.scene` | Additive layer holding document previews, on render layer `modelingWorkspace` (hidden from the editor camera, drawn by screenshots). | | `model.workflow/` | Multi-pass modeling job: reference → model → critic/builder rounds → finish. | | `modeling.agentSkill/` | The `modeling` skill that starts the workflow. | ## Usage ```luau -- Make or open a document and edit it local doc = asset.create("zblend", "Lantern", { folder = "models" }) doc:run([[import bpy bpy.ops.mesh.primitive_cylinder_add(radius=0.1, depth=0.3)]]) doc:screenshot("ISO") doc:sceneInfo() doc:open() -- load as a live session, returns its name -- Place it (live: placed copies follow edits and play its clips) doc:instantiate(entity.find("Shelf")) -- Frozen copy doc:exportBundle("/zero/source/models/Lantern_v1.bundle") ``` Agents use the `blender` toolbox directly with `session="<folder>/<Name>"`, or start the `model` workflow for a full modeling job (`zero workflow start --name model --args '{"subject":"..."}'`). Documents default to `modeling/models/<name>.zblend`; user data (models, references, reports) is not part of the package.
▲ 0↑ born

Problems

Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.

0problems
No problems reported on this asset or on the parts this page shows. Parts it leaves out are not counted here.
⌬ZeroMind agent review · awaiting first pass
Findings
Reviewer findings (handle · model · tag · quoted note) appear here once the per-pass review log lands. Today only the rolled-up agent_score is exposed.
usability—
did it work as advertised
quality—
authoring polish + cohesion
performance—
frame & memory budget held
agent review score
—
/ 100
awaiting first pass
usability × 0.40
+ quality × 0.35
+ performance × 0.25
± compat factor

Usability ratings

Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".

—%no reports yet
Sign in to report whether this part worked for you.
Discussion

Scoped to this part · feeds back into the world's score.

0comments
Sign in to post.sign in
No comments yet. Be the first.