@origingame/engine 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/web/origin-engine.d.ts +44 -5
  2. package/dist/web/origin-engine.js +279 -19
  3. package/dist/web/origin-engine_bg.wasm +0 -0
  4. package/dist/web/origin-engine_bg.wasm.d.ts +18 -5
  5. package/dist/web-publish/origin-engine-lanes.js +289 -48
  6. package/dist/web-publish/origin-engine-lanes_bg.wasm +0 -0
  7. package/dist/web-publish/origin-engine.d.ts +44 -5
  8. package/dist/web-publish/origin-engine.js +279 -38
  9. package/dist/web-publish/origin-engine_bg.wasm +0 -0
  10. package/dist/web-publish/origin-engine_bg.wasm.d.ts +18 -5
  11. package/dist/web-publish-2d/origin-engine-lanes.js +289 -48
  12. package/dist/web-publish-2d/origin-engine-lanes_bg.wasm +0 -0
  13. package/dist/web-publish-2d/origin-engine.d.ts +44 -5
  14. package/dist/web-publish-2d/origin-engine.js +279 -38
  15. package/dist/web-publish-2d/origin-engine_bg.wasm +0 -0
  16. package/dist/web-publish-2d/origin-engine_bg.wasm.d.ts +18 -5
  17. package/knowledge/README.md +2 -1
  18. package/knowledge/guides/three-to-og.md +393 -0
  19. package/knowledge/knowledge.json +2 -1
  20. package/knowledge/looks/catalogue.json +123 -2
  21. package/knowledge/package.json +3 -2
  22. package/knowledge/scaffold/origin-engine.json +2 -2
  23. package/knowledge/scaffold/template/package.json +1 -1
  24. package/knowledge/scaffold/template/project.ogt +1 -1
  25. package/knowledge/scripts/validate.ts +209 -27
  26. package/knowledge/skills/og-audio/SKILL.md +33 -7
  27. package/knowledge/skills/og-build/SKILL.md +66 -7
  28. package/knowledge/skills/og-core/SKILL.md +24 -8
  29. package/knowledge/skills/og-feel/SKILL.md +11 -3
  30. package/knowledge/skills/og-game/SKILL.md +680 -51
  31. package/knowledge/skills/og-i18n/SKILL.md +7 -7
  32. package/knowledge/skills/og-model/SKILL.md +374 -0
  33. package/knowledge/skills/og-platform-sdk/SKILL.md +7 -1
  34. package/knowledge/skills/og-taste/SKILL.md +7 -0
  35. package/knowledge/skills/og-ui/SKILL.md +39 -8
  36. package/knowledge/wiki/ai.md +20 -20
  37. package/knowledge/wiki/anim.md +537 -63
  38. package/knowledge/wiki/atmosphere.md +13 -13
  39. package/knowledge/wiki/audio.md +160 -20
  40. package/knowledge/wiki/camera.md +13 -13
  41. package/knowledge/wiki/commands.md +11 -11
  42. package/knowledge/wiki/debug.md +13 -13
  43. package/knowledge/wiki/game.md +8 -8
  44. package/knowledge/wiki/i18n.md +7 -7
  45. package/knowledge/wiki/index.md +81 -3
  46. package/knowledge/wiki/input.md +47 -47
  47. package/knowledge/wiki/load.md +83 -57
  48. package/knowledge/wiki/math.md +102 -102
  49. package/knowledge/wiki/nav.md +34 -34
  50. package/knowledge/wiki/net.md +10 -10
  51. package/knowledge/wiki/path.md +14 -14
  52. package/knowledge/wiki/physics.md +111 -100
  53. package/knowledge/wiki/platform.md +44 -44
  54. package/knowledge/wiki/probe.md +86 -86
  55. package/knowledge/wiki/reflect.md +30 -18
  56. package/knowledge/wiki/render.md +1243 -176
  57. package/knowledge/wiki/rng.md +14 -14
  58. package/knowledge/wiki/shapes.md +727 -0
  59. package/knowledge/wiki/stream.md +15 -15
  60. package/knowledge/wiki/system.md +8 -8
  61. package/knowledge/wiki/systems.md +2 -2
  62. package/knowledge/wiki/terrain.md +24 -20
  63. package/knowledge/wiki/tilemap.md +13 -13
  64. package/knowledge/wiki/time.md +4 -4
  65. package/knowledge/wiki/timeline.md +14 -14
  66. package/knowledge/wiki/transform.md +8 -8
  67. package/knowledge/wiki/tween.md +17 -17
  68. package/knowledge/wiki/ui.md +245 -269
  69. package/knowledge/wiki/video.md +5 -5
  70. package/knowledge/wiki/world.md +36 -36
  71. package/package.json +4 -4
  72. package/schema/api.schema.json +2238 -81
  73. package/shell/page.ts +4 -0
  74. package/shell/platform.ts +5 -0
  75. package/shell/player.ts +8 -2
  76. package/shell/transport.ts +6 -0
  77. package/src/generated/abi.ts +40 -1
  78. package/src/geom.ts +260 -0
  79. package/src/index.ts +19 -1
  80. package/src/node/device.ts +5 -2
  81. package/src/node/playtest-run.ts +1 -0
  82. package/src/node/polish.ts +34 -15
  83. package/src/node/run.ts +23 -6
  84. package/src/platform-local.ts +2 -0
  85. package/src/playtest.ts +8 -0
  86. package/src/runtime.ts +88 -6
  87. package/src/ui-kit/settings.ts +9 -0
  88. package/src/web/gl-state.ts +907 -0
  89. package/src/web/shell.ts +1 -1
  90. package/src/web/worker.ts +8 -2
  91. package/types/bindings.json +1222 -453
  92. package/types/index.d.ts +1868 -315
@@ -18,7 +18,7 @@ module anim {
18
18
  # declarations follow, each quoted below
19
19
  ```
20
20
 
21
- <sub>`api.ogt` line 7139</sub>
21
+ <sub>`api.ogt` line 7761</sub>
22
22
 
23
23
  ## Contents
24
24
 
@@ -43,18 +43,30 @@ module anim {
43
43
  | [`og.AnimationGraph`](#record-AnimationGraph) | component | Runs a blend-tree graph (og.anim.graph) on a skeleton: its layers' state machines pick motions by the parameters p0...p7, which the graph names in `param` order (`param speed` is p0, the next `param` is p1, ...). |
44
44
  | [`og.Blendshapes`](#record-Blendshapes) | component | Morph-target weights of the skeleton entity's mesh, in the order of the glTF mesh's targets. With `source` clips the playing clips' weight channels write them; with `component` game code does. |
45
45
  | [`og.IkChain`](#record-IkChain) | component | An inverse-kinematics constraint on a skeleton, applied after its clips and graph: the chain of `bones` bones ending at joint `tip` turns so the tip reaches `target`. Put it on its own entity (a skeleton can have many chains); chains apply in query order. |
46
+ | [`og.LookAt`](#record-LookAt) | component | An aim constraint on a skeleton, applied after its clips, graph and IK chains: `joint` turns so its `axis` points at `target` and its `upAxis` leans towards `up` (three.js Object3D.lookAt: +Z at the target, +Y up). The direction is held within maxYaw and maxPitch of the animated forward; with `bones` above 1 the joint's parents share the turn. Put it on its own entity (a head, the eyes, a turret's barrel); constraints apply in query order, and og.JointLimit clamps the joints it turns. |
47
+ | [`og.JointLimit`](#record-JointLimit) | component | How far a joint may turn from its rest rotation when og.anim's solvers (og.IkChain, og.LookAt, og.FootLock) turn it: a swing of `axis` within a cone and a twist about it within a range. A hinge (a knee, an elbow) is `axis` along the hinge, `swing` 0 (or a little play) and the bend range as twistMin...twistMax. Put it on its own entity, one per joint; the animated pose itself is never clamped. |
48
+ | [`og.FootLock`](#record-FootLock) | component | Foot locking: while the playing clips plant `foot` (within 5 mm of its lowest in each clip, the notion retargeting uses, weighed across blends and cross-fades: planted when the planting clips hold at least half the pose), the foot stays where it touched the ground, through clip blends and root motion, its leg bent by two-bone IK and the foot keeping its animated orientation; when the clips lift it, the foot rejoins its animation over `release`. Put it on its own entity, one per foot; locks apply after root motion and before og.IkChain, in query order, and og.JointLimit clamps the leg. The lock is world state (the `og.anim` state block). |
49
+ | [`SpringSpace`](#type-SpringSpace) | enum | Where a spring bone's tails move. |
50
+ | [`SpringSpace()`](#column-SpringSpace) | column kind | A SpringSpace field: the variant's index. |
51
+ | [`og.SpringBone`](#record-SpringBone) | component | A spring (jiggle) bone chain, three-vrm's VRMSpringBone: `joint` and its `bones` - 1 parents swing after their parents' motion. Each joint's tail (the next joint of the chain; for the last joint its first child, or its parent bone continued at the same length) is a point pulled towards where the animated pose puts it by a damped spring (`frequency`, `damping`), under `gravity`, held at the bone's length, and the joint turns to point at it. Applied after og.IkChain and og.LookAt, top joint first; put it on its own entity (a tail, an ear, a strand of hair, a single jiggling node), one per chain. Deterministic under the fixed tick; the tails' positions and velocities are world state (the `og.anim` state block), so a restore continues a swing exactly. A changed chain (another skeleton, length or space) restarts at the animated pose. |
52
+ | [`SpringColliderShape`](#type-SpringColliderShape) | enum | The shape of a spring collider. |
53
+ | [`SpringColliderShape()`](#column-SpringColliderShape) | column kind | A SpringColliderShape field: the variant's index. |
54
+ | [`og.SpringCollider`](#record-SpringCollider) | component | A collider spring bones are kept out of, three-vrm's VRMSpringBoneCollider: a sphere or a capsule riding on a joint of a skeleton (a head, a chest, an upper arm), so hair, ears and tails do not swing through the body. Each tick, after a tail of an og.SpringBone of the same skeleton has stepped and before its joint turns, the tail is pushed out of every collider whose `layers` meet the spring's `colliders` (in query order) to `radius` plus the spring's `radius`, keeping its bone's length. Put it on its own entity, one per shape; colliders follow the pose as it is when a chain is swung, so one on a joint an earlier chain swung follows that swing. |
46
55
  | [`og.AnimationEvent`](#record-AnimationEvent) | event | A named marker of a clip that playback passed in the last tick (read in the tick after it fired, like every event). Cross-fades and blends fire every contributing clip's markers. |
47
56
  | [`ClipInfo`](#type-ClipInfo) | struct | One clip of a loaded animation. |
48
57
  | [`Animation`](#type-Animation) | struct | What og.load.animation registered from a model's `#anim` blob. |
49
58
  | [`GraphDesc`](#type-GraphDesc) | desc struct | A blend-tree graph to register. |
50
59
  | [`og.anim.graph`](#fn-graph) | function | Register a blend-tree graph for AnimationGraph.asset. Its `clip` lines are resolved by name against `clips`. |
51
- | [`Rig`](#type-Rig) | handle | A humanoid map from og.load.rig (a cooked `.ogt` of `type rig`): the naming scheme a skeleton's node names follow and the standard bones it names outright. |
60
+ | [`Rig`](#type-Rig) | handle | A humanoid map from og.load.rig (a cooked `.ogt` of `type rig`): the naming scheme a skeleton's node names follow, the standard bones it names outright and, with `footHeight`, how high its ankles stand above the ground. |
61
+ | [`Rig()`](#column-Rig) | column kind | A Rig handle field (0 is none): a humanoid map og.load.rig answered. |
52
62
  | [`HumanBone`](#type-HumanBone) | struct | One standard humanoid bone of a skeleton. |
53
63
  | [`Humanoid`](#type-Humanoid) | struct | Which node of a skeleton is each standard humanoid bone (what retargeting maps). |
54
64
  | [`HumanoidDesc`](#type-HumanoidDesc) | desc struct | A skeleton and, optionally, the rig that says how its bones are named. |
55
65
  | [`og.anim.humanoid`](#fn-humanoid) | function | The standard humanoid bones of a skeleton, as retargeting sees them: to check a rig before retargeting onto it. |
56
66
  | [`RetargetDesc`](#type-RetargetDesc) | desc struct | A clip made for one skeleton, to play on another (other proportions, rest pose or bone names). |
57
- | [`og.anim.retarget`](#fn-retarget) | function | A new clip for `target` from a clip of `source`: each animated humanoid bone turns as the source's does from its rest pose (after a rest correction, so a T-pose drives an A-pose and other bone frames agree), the target keeps its bone lengths, the hips travel the source's distance scaled by the leg ratio (root motion kept, hip height scaled), and with footIk the feet land where the source's do, scaled. Same name, duration and markers. The cook does the same for a model's `animation { library }` import setting; this is for clips chosen at run time. |
67
+ | [`og.anim.retarget`](#fn-retarget) | function | A new clip for `target` from a clip of `source`: each animated humanoid bone turns as the source's does from its rest pose (after a rest correction, so a T-pose drives an A-pose and other bone frames agree; fingers turn from their hand, so a hand pose holds whatever the arm does), the target keeps its bone lengths, the hips travel the source's distance scaled by the leg ratio (root motion kept, hip height scaled), and with footIk the feet land where the source's do, scaled, on the ground each rig's `footHeight` names (else its rest pose's foot heights). The target's twist bones (unmapped nodes named `twist`, or Rigify's `DEF-….001`, on an upper or lower arm or leg) take a share of their segment's twist by how far along it they sit. Same name, duration and markers. The cook does the same for a model's `animation { library }` import setting; this is for clips chosen at run time. |
68
+ | [`MirrorDesc`](#type-MirrorDesc) | desc struct | A clip to play on the other side of the skeleton it was made for. |
69
+ | [`og.anim.mirror`](#fn-mirror) | function | A new clip that plays `clip` on the other side: every frame reflected in the skeleton's x = 0 plane, each node taking its counterpart's motion (a left swing becomes the right's), rotations moved in model space so left and right bone frames need not mirror each other, root motion's sideways travel and turns flipped. Assumes a symmetric rest pose; a sided node without a counterpart keeps its rest pose. Same name, duration and markers (markers keep their names). Mirroring twice gives the clip back. A clip known ahead needs no call: a graph's `clip` line with `mirror true` plays it mirrored, and the cook's `animation { mirror "<clip>" }` writes the mirrored clip into the model. |
58
70
  | [`FlipbookSheet`](#type-FlipbookSheet) | handle | A sprite sheet's frames and clips (a cooked `.ogt` of `type flipbook`), from og.load.flipbook. |
59
71
  | [`FlipbookSheet()`](#column-FlipbookSheet) | column kind | A FlipbookSheet handle field. |
60
72
  | [`FlipMode`](#type-FlipMode) | enum | How a flipbook clip runs past its last frame. |
@@ -68,7 +80,7 @@ module anim {
68
80
  | [`Rig2D`](#type-Rig2D) | handle | A 2D rig (a cooked `.ogt` of `type rig2d`): bones, slots, region, mesh, bounding-box and child-armature attachments, IK constraints, child armatures and clips, from og.load.rig2d. |
69
81
  | [`Rig2D()`](#column-Rig2D) | column kind | A Rig2D handle field. |
70
82
  | [`og.Skeleton2D`](#record-Skeleton2D) | component | Plays a clip of a 2D rig at the entity: the og.skeleton2d system advances it by scaled time (Time.scaledDt) after the game's systems and fires its events as og.Skeleton2DEvent; extraction draws its slots, in their order, as textured triangles of the sprite batch at `layer` (region attachments as quads, mesh attachments weighted to bones and deformed by the clip), lit by og.Lighting2D when the layer is in its range, as a sprite there is. The rig's pixels are `unit` to a world unit and +y is up; the entity's og.Transform places, turns (about z) and scales it. |
71
- | [`og.Skeleton2DEvent`](#record-Skeleton2DEvent) | event | A 2D skeleton's clip passed one of its events (`event 0.2 "step"` in the rig) in the last tick: footsteps, the frame a swing lands. Read in the tick after, like every event; a clip started at 0 fires its events at 0, a looping clip fires each once per pass. |
83
+ | [`og.Skeleton2DEvent`](#record-Skeleton2DEvent) | event | A 2D skeleton's clip, or the clip a child armature in one of its slots plays, passed one of its events (`event 0.2 "step"` in the rig) in the last tick: footsteps, the frame a swing lands. Read in the tick after, like every event; a clip started at 0 fires its events at 0, a looping clip fires each once per pass. |
72
84
  | [`og.IkTarget2D`](#record-IkTarget2D) | component | Moves one IK constraint of a 2D skeleton (Rig2DInfo.constraints) to a point: a foot planted on the ground under it, a hand on a ledge, a tail's tip. A constraint is a chain of any length: one bone points at the target, two are solved exactly (bending the way the rig says), three or more by FABRIK from the animated pose, curling the way the rig says. Put it on its own entity, one per constraint; og.skeleton2d writes `reached` and `error`, and the drawn pose solves the same way. |
73
85
  | [`Rig2DClipInfo`](#type-Rig2DClipInfo) | struct | One clip of a loaded 2D rig. |
74
86
  | [`Rig2DInfo`](#type-Rig2DInfo) | struct | What og.load.rig2d registered, or og.anim.rig2dInfo reads back from a handle. |
@@ -106,7 +118,7 @@ fn graph {
106
118
  }
107
119
  ```
108
120
 
109
- <sub>`api.ogt` line 7454</sub>
121
+ <sub>`api.ogt` line 8300</sub>
110
122
 
111
123
  <a id="fn-humanoid"></a>
112
124
 
@@ -136,13 +148,13 @@ fn humanoid {
136
148
  }
137
149
  ```
138
150
 
139
- <sub>`api.ogt` line 7482</sub>
151
+ <sub>`api.ogt` line 8335</sub>
140
152
 
141
153
  <a id="fn-retarget"></a>
142
154
 
143
155
  ### `og.anim.retarget`
144
156
 
145
- A new clip for `target` from a clip of `source`: each animated humanoid bone turns as the source's does from its rest pose (after a rest correction, so a T-pose drives an A-pose and other bone frames agree), the target keeps its bone lengths, the hips travel the source's distance scaled by the leg ratio (root motion kept, hip height scaled), and with footIk the feet land where the source's do, scaled. Same name, duration and markers. The cook does the same for a model's `animation { library }` import setting; this is for clips chosen at run time.
157
+ A new clip for `target` from a clip of `source`: each animated humanoid bone turns as the source's does from its rest pose (after a rest correction, so a T-pose drives an A-pose and other bone frames agree; fingers turn from their hand, so a hand pose holds whatever the arm does), the target keeps its bone lengths, the hips travel the source's distance scaled by the leg ratio (root motion kept, hip height scaled), and with footIk the feet land where the source's do, scaled, on the ground each rig's `footHeight` names (else its rest pose's foot heights). The target's twist bones (unmapped nodes named `twist`, or Rigify's `DEF-….001`, on an upper or lower arm or leg) take a share of their segment's twist by how far along it they sit. Same name, duration and markers. The cook does the same for a model's `animation { library }` import setting; this is for clips chosen at run time.
146
158
 
147
159
  ```ts
148
160
  og.anim.retarget(world: World, desc?: RetargetDesc): Result<ClipInfo>
@@ -159,14 +171,44 @@ Binding symbol `og_anim_retarget` · publish builds: kept
159
171
 
160
172
  ```ogt
161
173
  fn retarget {
162
- doc "A new clip for `target` from a clip of `source`: each animated humanoid bone turns as the source's does from its rest pose (after a rest correction, so a T-pose drives an A-pose and other bone frames agree), the target keeps its bone lengths, the hips travel the source's distance scaled by the leg ratio (root motion kept, hip height scaled), and with footIk the feet land where the source's do, scaled. Same name, duration and markers. The cook does the same for a model's `animation { library }` import setting; this is for clips chosen at run time."
174
+ doc "A new clip for `target` from a clip of `source`: each animated humanoid bone turns as the source's does from its rest pose (after a rest correction, so a T-pose drives an A-pose and other bone frames agree; fingers turn from their hand, so a hand pose holds whatever the arm does), the target keeps its bone lengths, the hips travel the source's distance scaled by the leg ratio (root motion kept, hip height scaled), and with footIk the feet land where the source's do, scaled, on the ground each rig's `footHeight` names (else its rest pose's foot heights). The target's twist bones (unmapped nodes named `twist`, or Rigify's `DEF-….001`, on an upper or lower arm or leg) take a share of their segment's twist by how far along it they sit. Same name, duration and markers. The cook does the same for a model's `animation { library }` import setting; this is for clips chosen at run time."
163
175
  param world World "The world whose animation owns the skeletons and the clip."
164
176
  param desc RetargetDesc "The clip, the two skeletons and their rigs."
165
177
  returns Result.ClipInfo "The new clip (what AnimationPlayer.clip takes). Refused for an unregistered clip, skeleton or rig, a skeleton without recognisable hips (name them in a `type rig` file), or a rig naming a missing node."
166
178
  }
167
179
  ```
168
180
 
169
- <sub>`api.ogt` line 7502</sub>
181
+ <sub>`api.ogt` line 8355</sub>
182
+
183
+ <a id="fn-mirror"></a>
184
+
185
+ ### `og.anim.mirror`
186
+
187
+ A new clip that plays `clip` on the other side: every frame reflected in the skeleton's x = 0 plane, each node taking its counterpart's motion (a left swing becomes the right's), rotations moved in model space so left and right bone frames need not mirror each other, root motion's sideways travel and turns flipped. Assumes a symmetric rest pose; a sided node without a counterpart keeps its rest pose. Same name, duration and markers (markers keep their names). Mirroring twice gives the clip back. A clip known ahead needs no call: a graph's `clip` line with `mirror true` plays it mirrored, and the cook's `animation { mirror "<clip>" }` writes the mirrored clip into the model.
188
+
189
+ ```ts
190
+ og.anim.mirror(world: World, desc?: MirrorDesc): Result<ClipInfo>
191
+ ```
192
+
193
+ | Parameter | Type | Optional | Doc |
194
+ |---|---|---|---|
195
+ | `world` | `World` | no | The world whose animation owns the skeleton and the clip. |
196
+ | `desc` | `MirrorDesc` | yes | The clip and its skeleton. |
197
+
198
+ **Returns** `Result<ClipInfo>`: The new clip (what AnimationPlayer.clip takes). Refused for an unregistered clip or skeleton.
199
+
200
+ Binding symbol `og_anim_mirror` · publish builds: kept
201
+
202
+ ```ogt
203
+ fn mirror {
204
+ doc "A new clip that plays `clip` on the other side: every frame reflected in the skeleton's x = 0 plane, each node taking its counterpart's motion (a left swing becomes the right's), rotations moved in model space so left and right bone frames need not mirror each other, root motion's sideways travel and turns flipped. Assumes a symmetric rest pose; a sided node without a counterpart keeps its rest pose. Same name, duration and markers (markers keep their names). Mirroring twice gives the clip back. A clip known ahead needs no call: a graph's `clip` line with `mirror true` plays it mirrored, and the cook's `animation { mirror \"<clip>\" }` writes the mirrored clip into the model."
205
+ param world World "The world whose animation owns the skeleton and the clip."
206
+ param desc MirrorDesc "The clip and its skeleton."
207
+ returns Result.ClipInfo "The new clip (what AnimationPlayer.clip takes). Refused for an unregistered clip or skeleton."
208
+ }
209
+ ```
210
+
211
+ <sub>`api.ogt` line 8369</sub>
170
212
 
171
213
  <a id="fn-clip"></a>
172
214
 
@@ -197,7 +239,7 @@ fn clip {
197
239
  }
198
240
  ```
199
241
 
200
- <sub>`api.ogt` line 7587</sub>
242
+ <sub>`api.ogt` line 8454</sub>
201
243
 
202
244
  <a id="fn-clip-2"></a>
203
245
 
@@ -228,7 +270,7 @@ fn clip {
228
270
  }
229
271
  ```
230
272
 
231
- <sub>`api.ogt` line 7595</sub>
273
+ <sub>`api.ogt` line 8462</sub>
232
274
 
233
275
  <a id="fn-clip-3"></a>
234
276
 
@@ -259,7 +301,7 @@ fn clip {
259
301
  }
260
302
  ```
261
303
 
262
- <sub>`api.ogt` line 7603</sub>
304
+ <sub>`api.ogt` line 8470</sub>
263
305
 
264
306
  <a id="fn-rig2dInfo"></a>
265
307
 
@@ -289,7 +331,7 @@ fn rig2dInfo {
289
331
  }
290
332
  ```
291
333
 
292
- <sub>`api.ogt` line 7708</sub>
334
+ <sub>`api.ogt` line 8580</sub>
293
335
 
294
336
  <a id="fn-skeleton2dBoxes"></a>
295
337
 
@@ -319,7 +361,7 @@ fn skeleton2dBoxes {
319
361
  }
320
362
  ```
321
363
 
322
- <sub>`api.ogt` line 7722</sub>
364
+ <sub>`api.ogt` line 8594</sub>
323
365
 
324
366
  ## Components, resources and events
325
367
 
@@ -356,7 +398,7 @@ component Skeleton {
356
398
  }
357
399
  ```
358
400
 
359
- <sub>`api.ogt` line 7223</sub>
401
+ <sub>`api.ogt` line 7845</sub>
360
402
 
361
403
  <a id="record-AnimationPlayer"></a>
362
404
 
@@ -418,7 +460,7 @@ component AnimationPlayer {
418
460
  }
419
461
  ```
420
462
 
421
- <sub>`api.ogt` line 7238</sub>
463
+ <sub>`api.ogt` line 7860</sub>
422
464
 
423
465
  <a id="record-AnimationGraph"></a>
424
466
 
@@ -494,7 +536,7 @@ component AnimationGraph {
494
536
  }
495
537
  ```
496
538
 
497
- <sub>`api.ogt` line 7277</sub>
539
+ <sub>`api.ogt` line 7899</sub>
498
540
 
499
541
  <a id="record-Blendshapes"></a>
500
542
 
@@ -567,7 +609,7 @@ component Blendshapes {
567
609
  }
568
610
  ```
569
611
 
570
- <sub>`api.ogt` line 7325</sub>
612
+ <sub>`api.ogt` line 7947</sub>
571
613
 
572
614
  <a id="record-IkChain"></a>
573
615
 
@@ -638,7 +680,325 @@ component IkChain {
638
680
  }
639
681
  ```
640
682
 
641
- <sub>`api.ogt` line 7373</sub>
683
+ <sub>`api.ogt` line 7995</sub>
684
+
685
+ <a id="record-LookAt"></a>
686
+
687
+ ### `og.LookAt` (component)
688
+
689
+ An aim constraint on a skeleton, applied after its clips, graph and IK chains: `joint` turns so its `axis` points at `target` and its `upAxis` leans towards `up` (three.js Object3D.lookAt: +Z at the target, +Y up). The direction is held within maxYaw and maxPitch of the animated forward; with `bones` above 1 the joint's parents share the turn. Put it on its own entity (a head, the eyes, a turret's barrel); constraints apply in query order, and og.JointLimit clamps the joints it turns.
690
+
691
+ Token `og.LookAt`, registered under the schema name `og.LookAt`; its value type is `LookAt`.
692
+
693
+ | Field | Type | Default | Range | Unit | Notes | Doc |
694
+ |---|---|---|---|---|---|---|
695
+ | `skeleton` | `Entity` | `0` | — | — | — | The entity with the og.Skeleton this constraint turns. |
696
+ | `joint` | `number` | `0` | ≥ 0 | — | — | The joint that aims (an index into the skin's joints): the head, an eye. |
697
+ | `bones` | `number` | `1` | 1 … 8 | — | — | How many joints share the turn: `joint` and its parents (3 spreads a look over neck, chest and spine), each parent taking an even share and `joint` the rest. |
698
+ | `target` | `Vector3` | `{ x: 0, y: 0, z: 0 }` | — | `m` | — | The point to look at, in `space`. |
699
+ | `space` | `IkSpace` | `"world"` | — | — | — | What `target` and `up` are relative to: world (the frame the skeleton entity's og.Transform is in) or model. |
700
+ | `axis` | `Vector3` | `{ x: 0, y: 0, z: 1 }` | — | — | — | The joint's forward, in its own frame: the axis turned onto the target. |
701
+ | `upAxis` | `Vector3` | `{ x: 0, y: 1, z: 0 }` | — | — | — | The joint's up, in its own frame: yaw turns about it, pitch towards it, and it rolls towards `up`. |
702
+ | `up` | `Vector3` | `{ x: 0, y: 1, z: 0 }` | — | — | — | The up hint, a direction in `space` the joint's `upAxis` leans to (three.js Object3D.up); the zero vector keeps the animated roll. |
703
+ | `maxYaw` | `number` | `3.1416` | 0 … 3.1416 | `rad` | tunable | The largest turn about `upAxis`, left or right of the animated forward. |
704
+ | `maxPitch` | `number` | `1.5708` | 0 … 1.5708 | `rad` | tunable | The largest turn towards or away from `upAxis`, from the animated forward. |
705
+ | `weight` | `number` | `1` | 0 … 1 | — | tunable | How much of the turn is applied (0 = the animated pose, 1 = aimed). |
706
+ | `clamped` | `boolean` | `false` | — | — | read only | Written: the target lay outside maxYaw or maxPitch, so the joint aims at the nearest direction inside them. |
707
+
708
+ ```ogt
709
+ component LookAt {
710
+ doc "An aim constraint on a skeleton, applied after its clips, graph and IK chains: `joint` turns so its `axis` points at `target` and its `upAxis` leans towards `up` (three.js Object3D.lookAt: +Z at the target, +Y up). The direction is held within maxYaw and maxPitch of the animated forward; with `bones` above 1 the joint's parents share the turn. Put it on its own entity (a head, the eyes, a turret's barrel); constraints apply in query order, and og.JointLimit clamps the joints it turns."
711
+ field skeleton Entity "The entity with the og.Skeleton this constraint turns."
712
+ field joint u32 "The joint that aims (an index into the skin's joints): the head, an eye." {
713
+ min 0
714
+ }
715
+ field bones u32 "How many joints share the turn: `joint` and its parents (3 spreads a look over neck, chest and spine), each parent taking an even share and `joint` the rest." {
716
+ default 1
717
+ min 1
718
+ max 8
719
+ }
720
+ field target Vector3 "The point to look at, in `space`." {
721
+ unit m
722
+ }
723
+ field space IkSpace "What `target` and `up` are relative to: world (the frame the skeleton entity's og.Transform is in) or model."
724
+ field axis Vector3 "The joint's forward, in its own frame: the axis turned onto the target." {
725
+ default 0 0 1
726
+ }
727
+ field upAxis Vector3 "The joint's up, in its own frame: yaw turns about it, pitch towards it, and it rolls towards `up`." {
728
+ default 0 1 0
729
+ }
730
+ field up Vector3 "The up hint, a direction in `space` the joint's `upAxis` leans to (three.js Object3D.up); the zero vector keeps the animated roll." {
731
+ default 0 1 0
732
+ }
733
+ field maxYaw f32 "The largest turn about `upAxis`, left or right of the animated forward." {
734
+ default 3.1416
735
+ min 0
736
+ max 3.1416
737
+ unit rad
738
+ tunable true
739
+ }
740
+ field maxPitch f32 "The largest turn towards or away from `upAxis`, from the animated forward." {
741
+ default 1.5708
742
+ min 0
743
+ max 1.5708
744
+ unit rad
745
+ tunable true
746
+ }
747
+ field weight f32 "How much of the turn is applied (0 = the animated pose, 1 = aimed)." {
748
+ default 1
749
+ min 0
750
+ max 1
751
+ tunable true
752
+ }
753
+ field clamped bool "Written: the target lay outside maxYaw or maxPitch, so the joint aims at the nearest direction inside them." {
754
+ readonly true
755
+ }
756
+ }
757
+ ```
758
+
759
+ <sub>`api.ogt` line 8039</sub>
760
+
761
+ <a id="record-JointLimit"></a>
762
+
763
+ ### `og.JointLimit` (component)
764
+
765
+ How far a joint may turn from its rest rotation when og.anim's solvers (og.IkChain, og.LookAt, og.FootLock) turn it: a swing of `axis` within a cone and a twist about it within a range. A hinge (a knee, an elbow) is `axis` along the hinge, `swing` 0 (or a little play) and the bend range as twistMin...twistMax. Put it on its own entity, one per joint; the animated pose itself is never clamped.
766
+
767
+ Token `og.JointLimit`, registered under the schema name `og.JointLimit`; its value type is `JointLimit`.
768
+
769
+ | Field | Type | Default | Range | Unit | Notes | Doc |
770
+ |---|---|---|---|---|---|---|
771
+ | `skeleton` | `Entity` | `0` | — | — | — | The entity with the og.Skeleton whose joint this limits. |
772
+ | `joint` | `number` | `0` | ≥ 0 | — | — | The limited joint (an index into the skin's joints). |
773
+ | `axis` | `Vector3` | `{ x: 0, y: 1, z: 0 }` | — | — | — | The twist axis in the joint's rest frame: along the bone for a ball joint, along the hinge for a hinge. |
774
+ | `swing` | `number` | `3.1416` | 0 … 3.1416 | `rad` | tunable | The cone half-angle the axis may swing away from its rest direction (0 locks it: a hinge; pi is free). |
775
+ | `twistMin` | `number` | `-3.1416` | -3.1416 … 3.1416 | `rad` | tunable | The least twist about `axis` from rest (a hinge's bend one way). |
776
+ | `twistMax` | `number` | `3.1416` | -3.1416 … 3.1416 | `rad` | tunable | The most twist about `axis` from rest (a hinge's bend the other way). |
777
+
778
+ ```ogt
779
+ component JointLimit {
780
+ doc "How far a joint may turn from its rest rotation when og.anim's solvers (og.IkChain, og.LookAt, og.FootLock) turn it: a swing of `axis` within a cone and a twist about it within a range. A hinge (a knee, an elbow) is `axis` along the hinge, `swing` 0 (or a little play) and the bend range as twistMin...twistMax. Put it on its own entity, one per joint; the animated pose itself is never clamped."
781
+ field skeleton Entity "The entity with the og.Skeleton whose joint this limits."
782
+ field joint u32 "The limited joint (an index into the skin's joints)." {
783
+ min 0
784
+ }
785
+ field axis Vector3 "The twist axis in the joint's rest frame: along the bone for a ball joint, along the hinge for a hinge." {
786
+ default 0 1 0
787
+ }
788
+ field swing f32 "The cone half-angle the axis may swing away from its rest direction (0 locks it: a hinge; pi is free)." {
789
+ default 3.1416
790
+ min 0
791
+ max 3.1416
792
+ unit rad
793
+ tunable true
794
+ }
795
+ field twistMin f32 "The least twist about `axis` from rest (a hinge's bend one way)." {
796
+ default -3.1416
797
+ min -3.1416
798
+ max 3.1416
799
+ unit rad
800
+ tunable true
801
+ }
802
+ field twistMax f32 "The most twist about `axis` from rest (a hinge's bend the other way)." {
803
+ default 3.1416
804
+ min -3.1416
805
+ max 3.1416
806
+ unit rad
807
+ tunable true
808
+ }
809
+ }
810
+ ```
811
+
812
+ <sub>`api.ogt` line 8088</sub>
813
+
814
+ <a id="record-FootLock"></a>
815
+
816
+ ### `og.FootLock` (component)
817
+
818
+ Foot locking: while the playing clips plant `foot` (within 5 mm of its lowest in each clip, the notion retargeting uses, weighed across blends and cross-fades: planted when the planting clips hold at least half the pose), the foot stays where it touched the ground, through clip blends and root motion, its leg bent by two-bone IK and the foot keeping its animated orientation; when the clips lift it, the foot rejoins its animation over `release`. Put it on its own entity, one per foot; locks apply after root motion and before og.IkChain, in query order, and og.JointLimit clamps the leg. The lock is world state (the `og.anim` state block).
819
+
820
+ Token `og.FootLock`, registered under the schema name `og.FootLock`; its value type is `FootLock`.
821
+
822
+ | Field | Type | Default | Range | Unit | Notes | Doc |
823
+ |---|---|---|---|---|---|---|
824
+ | `skeleton` | `Entity` | `0` | — | — | — | The entity with the og.Skeleton whose foot this holds. |
825
+ | `foot` | `number` | `0` | ≥ 0 | — | — | The foot joint (an index into the skin's joints); the two bones above it are the leg that bends. |
826
+ | `weight` | `number` | `1` | 0 … 1 | — | tunable | How much of the lock is applied (0 = the animated foot, 1 = held). |
827
+ | `release` | `number` | `0.15` | 0 … 2 | `s` | tunable | Seconds the foot takes to rejoin its animation once lifted (0: at once). |
828
+ | `maxDistance` | `number` | `0.5` | ≥ 0 | `m` | tunable | Farther than this from where the animation puts the foot, the lock lets go (a leg cannot stretch). |
829
+ | `planted` | `boolean` | `false` | — | — | read only | Written: the playing clips plant the foot this tick. |
830
+ | `locked` | `boolean` | `false` | — | — | read only | Written: the foot is held at its lock this tick. |
831
+
832
+ ```ogt
833
+ component FootLock {
834
+ doc "Foot locking: while the playing clips plant `foot` (within 5 mm of its lowest in each clip, the notion retargeting uses, weighed across blends and cross-fades: planted when the planting clips hold at least half the pose), the foot stays where it touched the ground, through clip blends and root motion, its leg bent by two-bone IK and the foot keeping its animated orientation; when the clips lift it, the foot rejoins its animation over `release`. Put it on its own entity, one per foot; locks apply after root motion and before og.IkChain, in query order, and og.JointLimit clamps the leg. The lock is world state (the `og.anim` state block)."
835
+ field skeleton Entity "The entity with the og.Skeleton whose foot this holds."
836
+ field foot u32 "The foot joint (an index into the skin's joints); the two bones above it are the leg that bends." {
837
+ min 0
838
+ }
839
+ field weight f32 "How much of the lock is applied (0 = the animated foot, 1 = held)." {
840
+ default 1
841
+ min 0
842
+ max 1
843
+ tunable true
844
+ }
845
+ field release f32 "Seconds the foot takes to rejoin its animation once lifted (0: at once)." {
846
+ default 0.15
847
+ min 0
848
+ max 2
849
+ unit s
850
+ tunable true
851
+ }
852
+ field maxDistance f32 "Farther than this from where the animation puts the foot, the lock lets go (a leg cannot stretch)." {
853
+ default 0.5
854
+ min 0
855
+ unit m
856
+ tunable true
857
+ }
858
+ field planted bool "Written: the playing clips plant the foot this tick." {
859
+ readonly true
860
+ }
861
+ field locked bool "Written: the foot is held at its lock this tick." {
862
+ readonly true
863
+ }
864
+ }
865
+ ```
866
+
867
+ <sub>`api.ogt` line 8120</sub>
868
+
869
+ <a id="record-SpringBone"></a>
870
+
871
+ ### `og.SpringBone` (component)
872
+
873
+ A spring (jiggle) bone chain, three-vrm's VRMSpringBone: `joint` and its `bones` - 1 parents swing after their parents' motion. Each joint's tail (the next joint of the chain; for the last joint its first child, or its parent bone continued at the same length) is a point pulled towards where the animated pose puts it by a damped spring (`frequency`, `damping`), under `gravity`, held at the bone's length, and the joint turns to point at it. Applied after og.IkChain and og.LookAt, top joint first; put it on its own entity (a tail, an ear, a strand of hair, a single jiggling node), one per chain. Deterministic under the fixed tick; the tails' positions and velocities are world state (the `og.anim` state block), so a restore continues a swing exactly. A changed chain (another skeleton, length or space) restarts at the animated pose.
874
+
875
+ Token `og.SpringBone`, registered under the schema name `og.SpringBone`; its value type is `SpringBone`.
876
+
877
+ | Field | Type | Default | Range | Unit | Notes | Doc |
878
+ |---|---|---|---|---|---|---|
879
+ | `skeleton` | `Entity` | `0` | — | — | — | The entity with the og.Skeleton whose joints this swings. |
880
+ | `joint` | `number` | `0` | ≥ 0 | — | — | The chain's last joint (an index into the skin's joints): the tip of a tail, an ear. |
881
+ | `bones` | `number` | `1` | 1 … 16 | — | — | How many joints swing: `joint` and its parents (1 is the joint alone). |
882
+ | `frequency` | `number` | `3` | 0 … 30 | `hz` | tunable | How fast a tail springs back to its animated place: the spring's natural frequency (0: no spring, it only hangs and swings). |
883
+ | `damping` | `number` | `0.3` | 0 … 2 | — | tunable | The damping ratio: 0 swings on, 1 settles without overshooting (critical damping). |
884
+ | `tipFrequency` | `number` | `1` | 0 … 4 | — | tunable | The last joint's frequency as a multiple of `frequency`, the joints between in proportion along the chain (1: every joint alike; 0.25: the tip springs back four times slower than the top, a soft strand on a stiff root). |
885
+ | `tipDamping` | `number` | `1` | 0 … 4 | — | tunable | The last joint's damping ratio as a multiple of `damping`, the joints between in proportion along the chain (1: every joint alike). |
886
+ | `gravity` | `Vector3` | `{ x: 0, y: 0, z: 0 }` | — | `mps2` | — | An acceleration on every tail, in `space` (three-vrm's gravityDir times gravityPower): (0, -9.8, 0) makes a chain droop. |
887
+ | `space` | `SpringSpace` | `"world"` | — | — | — | Where the tails move: world (the frame the skeleton entity's og.Transform is in, so the chain lags behind the entity's motion) or model (only the animation moves it). |
888
+ | `weight` | `number` | `1` | 0 … 1 | — | tunable | How much of the swing is applied (0 = the animated pose, 1 = the spring's). |
889
+ | `radius` | `number` | `0` | ≥ 0 | `m` | tunable | The tails' radius against og.SpringCollider (three-vrm's hitRadius): a tail stays this far outside every collider it meets (0: a point). |
890
+ | `colliders` | `number` | `4294967295` | — | — | — | The og.SpringCollider layers the tails are pushed out of, as bits: a collider on the same skeleton counts when its `layers` meet these. |
891
+ | `lag` | `number` | `0` | — | `m` | read only | Written: the farthest a tail is from its animated place this tick. |
892
+
893
+ ```ogt
894
+ component SpringBone {
895
+ doc "A spring (jiggle) bone chain, three-vrm's VRMSpringBone: `joint` and its `bones` - 1 parents swing after their parents' motion. Each joint's tail (the next joint of the chain; for the last joint its first child, or its parent bone continued at the same length) is a point pulled towards where the animated pose puts it by a damped spring (`frequency`, `damping`), under `gravity`, held at the bone's length, and the joint turns to point at it. Applied after og.IkChain and og.LookAt, top joint first; put it on its own entity (a tail, an ear, a strand of hair, a single jiggling node), one per chain. Deterministic under the fixed tick; the tails' positions and velocities are world state (the `og.anim` state block), so a restore continues a swing exactly. A changed chain (another skeleton, length or space) restarts at the animated pose."
896
+ field skeleton Entity "The entity with the og.Skeleton whose joints this swings."
897
+ field joint u32 "The chain's last joint (an index into the skin's joints): the tip of a tail, an ear." {
898
+ min 0
899
+ }
900
+ field bones u32 "How many joints swing: `joint` and its parents (1 is the joint alone)." {
901
+ default 1
902
+ min 1
903
+ max 16
904
+ }
905
+ field frequency f32 "How fast a tail springs back to its animated place: the spring's natural frequency (0: no spring, it only hangs and swings)." {
906
+ default 3
907
+ min 0
908
+ max 30
909
+ unit hz
910
+ tunable true
911
+ }
912
+ field damping f32 "The damping ratio: 0 swings on, 1 settles without overshooting (critical damping)." {
913
+ default 0.3
914
+ min 0
915
+ max 2
916
+ tunable true
917
+ }
918
+ field tipFrequency f32 "The last joint's frequency as a multiple of `frequency`, the joints between in proportion along the chain (1: every joint alike; 0.25: the tip springs back four times slower than the top, a soft strand on a stiff root)." {
919
+ default 1
920
+ min 0
921
+ max 4
922
+ tunable true
923
+ }
924
+ field tipDamping f32 "The last joint's damping ratio as a multiple of `damping`, the joints between in proportion along the chain (1: every joint alike)." {
925
+ default 1
926
+ min 0
927
+ max 4
928
+ tunable true
929
+ }
930
+ field gravity Vector3 "An acceleration on every tail, in `space` (three-vrm's gravityDir times gravityPower): (0, -9.8, 0) makes a chain droop." {
931
+ unit mps2
932
+ }
933
+ field space SpringSpace "Where the tails move: world (the frame the skeleton entity's og.Transform is in, so the chain lags behind the entity's motion) or model (only the animation moves it)."
934
+ field weight f32 "How much of the swing is applied (0 = the animated pose, 1 = the spring's)." {
935
+ default 1
936
+ min 0
937
+ max 1
938
+ tunable true
939
+ }
940
+ field radius f32 "The tails' radius against og.SpringCollider (three-vrm's hitRadius): a tail stays this far outside every collider it meets (0: a point)." {
941
+ min 0
942
+ unit m
943
+ tunable true
944
+ }
945
+ field colliders u32 "The og.SpringCollider layers the tails are pushed out of, as bits: a collider on the same skeleton counts when its `layers` meet these." {
946
+ default 4294967295
947
+ }
948
+ field lag f32 "Written: the farthest a tail is from its animated place this tick." {
949
+ readonly true
950
+ unit m
951
+ }
952
+ }
953
+ ```
954
+
955
+ <sub>`api.ogt` line 8166</sub>
956
+
957
+ <a id="record-SpringCollider"></a>
958
+
959
+ ### `og.SpringCollider` (component)
960
+
961
+ A collider spring bones are kept out of, three-vrm's VRMSpringBoneCollider: a sphere or a capsule riding on a joint of a skeleton (a head, a chest, an upper arm), so hair, ears and tails do not swing through the body. Each tick, after a tail of an og.SpringBone of the same skeleton has stepped and before its joint turns, the tail is pushed out of every collider whose `layers` meet the spring's `colliders` (in query order) to `radius` plus the spring's `radius`, keeping its bone's length. Put it on its own entity, one per shape; colliders follow the pose as it is when a chain is swung, so one on a joint an earlier chain swung follows that swing.
962
+
963
+ Token `og.SpringCollider`, registered under the schema name `og.SpringCollider`; its value type is `SpringCollider`.
964
+
965
+ | Field | Type | Default | Range | Unit | Notes | Doc |
966
+ |---|---|---|---|---|---|---|
967
+ | `skeleton` | `Entity` | `0` | — | — | — | The entity with the og.Skeleton whose spring bones this keeps out. |
968
+ | `joint` | `number` | `0` | ≥ 0 | — | — | The joint the collider rides on (an index into the skin's joints). |
969
+ | `shape` | `SpringColliderShape` | `"sphere"` | — | — | — | A sphere about `offset`, or a capsule from `offset` to `tail`. |
970
+ | `offset` | `Vector3` | `{ x: 0, y: 0, z: 0 }` | — | `m` | — | The sphere's centre, or the capsule's first end, in the joint's frame. |
971
+ | `tail` | `Vector3` | `{ x: 0, y: 0, z: 0 }` | — | `m` | — | The capsule's other end, in the joint's frame (a sphere ignores it). |
972
+ | `radius` | `number` | `0.1` | ≥ 0 | `m` | tunable | The radius, in metres of the skeleton's model space (the joint's own scale does not apply). |
973
+ | `layers` | `number` | `1` | — | — | — | The layers this collider is on, as bits (a spring bone's `colliders` picks them). |
974
+
975
+ ```ogt
976
+ component SpringCollider {
977
+ doc "A collider spring bones are kept out of, three-vrm's VRMSpringBoneCollider: a sphere or a capsule riding on a joint of a skeleton (a head, a chest, an upper arm), so hair, ears and tails do not swing through the body. Each tick, after a tail of an og.SpringBone of the same skeleton has stepped and before its joint turns, the tail is pushed out of every collider whose `layers` meet the spring's `colliders` (in query order) to `radius` plus the spring's `radius`, keeping its bone's length. Put it on its own entity, one per shape; colliders follow the pose as it is when a chain is swung, so one on a joint an earlier chain swung follows that swing."
978
+ field skeleton Entity "The entity with the og.Skeleton whose spring bones this keeps out."
979
+ field joint u32 "The joint the collider rides on (an index into the skin's joints)." {
980
+ min 0
981
+ }
982
+ field shape SpringColliderShape "A sphere about `offset`, or a capsule from `offset` to `tail`."
983
+ field offset Vector3 "The sphere's centre, or the capsule's first end, in the joint's frame." {
984
+ unit m
985
+ }
986
+ field tail Vector3 "The capsule's other end, in the joint's frame (a sphere ignores it)." {
987
+ unit m
988
+ }
989
+ field radius f32 "The radius, in metres of the skeleton's model space (the joint's own scale does not apply)." {
990
+ default 0.1
991
+ min 0
992
+ unit m
993
+ tunable true
994
+ }
995
+ field layers u32 "The layers this collider is on, as bits (a spring bone's `colliders` picks them)." {
996
+ default 1
997
+ }
998
+ }
999
+ ```
1000
+
1001
+ <sub>`api.ogt` line 8239</sub>
642
1002
 
643
1003
  <a id="record-AnimationEvent"></a>
644
1004
 
@@ -669,7 +1029,7 @@ event AnimationEvent {
669
1029
  }
670
1030
  ```
671
1031
 
672
- <sub>`api.ogt` line 7417</sub>
1032
+ <sub>`api.ogt` line 8263</sub>
673
1033
 
674
1034
  <a id="record-Flipbook"></a>
675
1035
 
@@ -725,7 +1085,7 @@ component Flipbook {
725
1085
  }
726
1086
  ```
727
1087
 
728
- <sub>`api.ogt` line 7525</sub>
1088
+ <sub>`api.ogt` line 8392</sub>
729
1089
 
730
1090
  <a id="record-FlipbookEvent"></a>
731
1091
 
@@ -752,7 +1112,7 @@ event FlipbookEvent {
752
1112
  }
753
1113
  ```
754
1114
 
755
- <sub>`api.ogt` line 7556</sub>
1115
+ <sub>`api.ogt` line 8423</sub>
756
1116
 
757
1117
  <a id="record-Skeleton2D"></a>
758
1118
 
@@ -773,6 +1133,7 @@ Token `og.Skeleton2D`, registered under the schema name `og.Skeleton2D`; its val
773
1133
  | `loop` | `boolean` | `true` | — | — | — | Wrap at the clip's end; otherwise hold the last pose and set `finished`. Rig2DInfo.clips says what the rig's author meant. |
774
1134
  | `flipX` | `boolean` | `false` | — | — | — | Mirror the rig left to right about the entity's position (a character facing left). |
775
1135
  | `layer` | `number` | `0` | — | — | — | The sprite layer it draws in, sorted with the sprites there (after them when they share the layer). |
1136
+ | `skin` | `number` | `0` | ≥ 0 | — | — | The skin it wears: an index into Rig2DInfo.skins (0 is the rig's default; `rig.skins.indexOf("armor")` finds one by name). A skin shows its own attachment wherever the setup pose or a clip shows the default's; a slot the skin leaves alone shows the default's. Change it any tick: the pose is drawn from it. |
776
1137
  | `finished` | `boolean` | `false` | — | — | read only | Written: a clip that does not loop reached its end (or its start, played backwards). |
777
1138
 
778
1139
  ```ogt
@@ -798,19 +1159,22 @@ component Skeleton2D {
798
1159
  }
799
1160
  field flipX bool "Mirror the rig left to right about the entity's position (a character facing left)."
800
1161
  field layer i32 "The sprite layer it draws in, sorted with the sprites there (after them when they share the layer)."
1162
+ field skin u32 "The skin it wears: an index into Rig2DInfo.skins (0 is the rig's default; `rig.skins.indexOf(\"armor\")` finds one by name). A skin shows its own attachment wherever the setup pose or a clip shows the default's; a slot the skin leaves alone shows the default's. Change it any tick: the pose is drawn from it." {
1163
+ min 0
1164
+ }
801
1165
  field finished bool "Written: a clip that does not loop reached its end (or its start, played backwards)." {
802
1166
  readonly true
803
1167
  }
804
1168
  }
805
1169
  ```
806
1170
 
807
- <sub>`api.ogt` line 7620</sub>
1171
+ <sub>`api.ogt` line 8487</sub>
808
1172
 
809
1173
  <a id="record-Skeleton2DEvent"></a>
810
1174
 
811
1175
  ### `og.Skeleton2DEvent` (event)
812
1176
 
813
- A 2D skeleton's clip passed one of its events (`event 0.2 "step"` in the rig) in the last tick: footsteps, the frame a swing lands. Read in the tick after, like every event; a clip started at 0 fires its events at 0, a looping clip fires each once per pass.
1177
+ A 2D skeleton's clip, or the clip a child armature in one of its slots plays, passed one of its events (`event 0.2 "step"` in the rig) in the last tick: footsteps, the frame a swing lands. Read in the tick after, like every event; a clip started at 0 fires its events at 0, a looping clip fires each once per pass.
814
1178
 
815
1179
  Token `og.Skeleton2DEvent`, registered under the schema name `og.Skeleton2DEvent`; its value type is `Skeleton2DEvent`.
816
1180
 
@@ -820,20 +1184,22 @@ Token `og.Skeleton2DEvent`, registered under the schema name `og.Skeleton2DEvent
820
1184
  | `clip` | `number` | `0` | — | — | — | The clip index. |
821
1185
  | `name` | `string` | `""` | — | — | — | The event's name (at most 63 bytes). |
822
1186
  | `time` | `number` | `0` | — | `s` | — | The event's time in the clip. |
1187
+ | `armature` | `string` | `""` | — | — | — | Empty for the skeleton's own clip; for an event of a child armature shown in one of its slots, that armature's name (`clip` and `time` are then the child's clip and its time): a flame's crackle apart from the keeper's footsteps (at most 63 bytes). |
823
1188
 
824
1189
  ```ogt
825
1190
  event Skeleton2DEvent {
826
- doc "A 2D skeleton's clip passed one of its events (`event 0.2 \"step\"` in the rig) in the last tick: footsteps, the frame a swing lands. Read in the tick after, like every event; a clip started at 0 fires its events at 0, a looping clip fires each once per pass."
1191
+ doc "A 2D skeleton's clip, or the clip a child armature in one of its slots plays, passed one of its events (`event 0.2 \"step\"` in the rig) in the last tick: footsteps, the frame a swing lands. Read in the tick after, like every event; a clip started at 0 fires its events at 0, a looping clip fires each once per pass."
827
1192
  field entity Entity "The entity with the og.Skeleton2D."
828
1193
  field clip u32 "The clip index."
829
1194
  field name String "The event's name (at most 63 bytes)."
830
1195
  field time f32 "The event's time in the clip." {
831
1196
  unit s
832
1197
  }
1198
+ field armature String "Empty for the skeleton's own clip; for an event of a child armature shown in one of its slots, that armature's name (`clip` and `time` are then the child's clip and its time): a flame's crackle apart from the keeper's footsteps (at most 63 bytes)."
833
1199
  }
834
1200
  ```
835
1201
 
836
- <sub>`api.ogt` line 7647</sub>
1202
+ <sub>`api.ogt` line 8517</sub>
837
1203
 
838
1204
  <a id="record-IkTarget2D"></a>
839
1205
 
@@ -884,7 +1250,7 @@ component IkTarget2D {
884
1250
  }
885
1251
  ```
886
1252
 
887
- <sub>`api.ogt` line 7657</sub>
1253
+ <sub>`api.ogt` line 8528</sub>
888
1254
 
889
1255
  ## Types
890
1256
 
@@ -900,7 +1266,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
900
1266
  handle SkeletonAsset "A rig: a glTF's nodes in topological order with their rest transforms, and its skins (joints and inverse bind matrices)."
901
1267
  ```
902
1268
 
903
- <sub>`api.ogt` line 7145</sub>
1269
+ <sub>`api.ogt` line 7767</sub>
904
1270
 
905
1271
  <a id="type-ClipAsset"></a>
906
1272
 
@@ -914,7 +1280,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
914
1280
  handle ClipAsset "An animation clip, resampled at the cook's rate, with its markers."
915
1281
  ```
916
1282
 
917
- <sub>`api.ogt` line 7146</sub>
1283
+ <sub>`api.ogt` line 7768</sub>
918
1284
 
919
1285
  <a id="type-GraphAsset"></a>
920
1286
 
@@ -928,7 +1294,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
928
1294
  handle GraphAsset "A blend-tree graph (`type animgraph`) whose clip references were resolved to clip handles."
929
1295
  ```
930
1296
 
931
- <sub>`api.ogt` line 7147</sub>
1297
+ <sub>`api.ogt` line 7769</sub>
932
1298
 
933
1299
  <a id="type-RootMotion"></a>
934
1300
 
@@ -953,7 +1319,7 @@ enum RootMotion {
953
1319
  }
954
1320
  ```
955
1321
 
956
- <sub>`api.ogt` line 7170</sub>
1322
+ <sub>`api.ogt` line 7792</sub>
957
1323
 
958
1324
  <a id="type-BlendshapeSource"></a>
959
1325
 
@@ -976,7 +1342,7 @@ enum BlendshapeSource {
976
1342
  }
977
1343
  ```
978
1344
 
979
- <sub>`api.ogt` line 7184</sub>
1345
+ <sub>`api.ogt` line 7806</sub>
980
1346
 
981
1347
  <a id="type-IkSolver"></a>
982
1348
 
@@ -999,7 +1365,7 @@ enum IkSolver {
999
1365
  }
1000
1366
  ```
1001
1367
 
1002
- <sub>`api.ogt` line 7197</sub>
1368
+ <sub>`api.ogt` line 7819</sub>
1003
1369
 
1004
1370
  <a id="type-IkSpace"></a>
1005
1371
 
@@ -1022,7 +1388,53 @@ enum IkSpace {
1022
1388
  }
1023
1389
  ```
1024
1390
 
1025
- <sub>`api.ogt` line 7210</sub>
1391
+ <sub>`api.ogt` line 7832</sub>
1392
+
1393
+ <a id="type-SpringSpace"></a>
1394
+
1395
+ ### `SpringSpace` (enum)
1396
+
1397
+ Where a spring bone's tails move.
1398
+
1399
+ A string: one of the variants below. The zero value is `"world"`.
1400
+
1401
+ | Variant | Doc |
1402
+ |---|---|
1403
+ | `"world"` | The frame the skeleton entity's og.Transform is written in: the chain lags behind the entity's motion (walking, root motion, a jump). |
1404
+ | `"model"` | The skeleton's model space: only the animation moves the chain (a teleport or a vehicle carrying the entity does not). |
1405
+
1406
+ ```ogt
1407
+ enum SpringSpace {
1408
+ doc "Where a spring bone's tails move."
1409
+ variant world "The frame the skeleton entity's og.Transform is written in: the chain lags behind the entity's motion (walking, root motion, a jump)."
1410
+ variant model "The skeleton's model space: only the animation moves the chain (a teleport or a vehicle carrying the entity does not)."
1411
+ }
1412
+ ```
1413
+
1414
+ <sub>`api.ogt` line 8153</sub>
1415
+
1416
+ <a id="type-SpringColliderShape"></a>
1417
+
1418
+ ### `SpringColliderShape` (enum)
1419
+
1420
+ The shape of a spring collider.
1421
+
1422
+ A string: one of the variants below. The zero value is `"sphere"`.
1423
+
1424
+ | Variant | Doc |
1425
+ |---|---|
1426
+ | `"sphere"` | A ball of `radius` about `offset`. |
1427
+ | `"capsule"` | A capsule of `radius` about the segment from `offset` to `tail`. |
1428
+
1429
+ ```ogt
1430
+ enum SpringColliderShape {
1431
+ doc "The shape of a spring collider."
1432
+ variant sphere "A ball of `radius` about `offset`."
1433
+ variant capsule "A capsule of `radius` about the segment from `offset` to `tail`."
1434
+ }
1435
+ ```
1436
+
1437
+ <sub>`api.ogt` line 8226</sub>
1026
1438
 
1027
1439
  <a id="type-ClipInfo"></a>
1028
1440
 
@@ -1049,7 +1461,7 @@ struct ClipInfo {
1049
1461
  }
1050
1462
  ```
1051
1463
 
1052
- <sub>`api.ogt` line 7428</sub>
1464
+ <sub>`api.ogt` line 8274</sub>
1053
1465
 
1054
1466
  <a id="type-Animation"></a>
1055
1467
 
@@ -1076,7 +1488,7 @@ struct Animation {
1076
1488
  }
1077
1489
  ```
1078
1490
 
1079
- <sub>`api.ogt` line 7438</sub>
1491
+ <sub>`api.ogt` line 8284</sub>
1080
1492
 
1081
1493
  <a id="type-GraphDesc"></a>
1082
1494
 
@@ -1100,21 +1512,21 @@ struct GraphDesc {
1100
1512
  }
1101
1513
  ```
1102
1514
 
1103
- <sub>`api.ogt` line 7447</sub>
1515
+ <sub>`api.ogt` line 8293</sub>
1104
1516
 
1105
1517
  <a id="type-Rig"></a>
1106
1518
 
1107
1519
  ### `Rig` (handle)
1108
1520
 
1109
- A humanoid map from og.load.rig (a cooked `.ogt` of `type rig`): the naming scheme a skeleton's node names follow and the standard bones it names outright.
1521
+ A humanoid map from og.load.rig (a cooked `.ogt` of `type rig`): the naming scheme a skeleton's node names follow, the standard bones it names outright and, with `footHeight`, how high its ankles stand above the ground.
1110
1522
 
1111
1523
  A generational handle: a number the engine hands out. A dead handle is an error value, never a crash.
1112
1524
 
1113
1525
  ```ogt
1114
- handle Rig "A humanoid map from og.load.rig (a cooked `.ogt` of `type rig`): the naming scheme a skeleton's node names follow and the standard bones it names outright."
1526
+ handle Rig "A humanoid map from og.load.rig (a cooked `.ogt` of `type rig`): the naming scheme a skeleton's node names follow, the standard bones it names outright and, with `footHeight`, how high its ankles stand above the ground."
1115
1527
  ```
1116
1528
 
1117
- <sub>`api.ogt` line 7461</sub>
1529
+ <sub>`api.ogt` line 8307</sub>
1118
1530
 
1119
1531
  <a id="type-HumanBone"></a>
1120
1532
 
@@ -1124,18 +1536,18 @@ One standard humanoid bone of a skeleton.
1124
1536
 
1125
1537
  | Field | Type | Default | Range | Unit | Notes | Doc |
1126
1538
  |---|---|---|---|---|---|---|
1127
- | `bone` | `string` | `""` | — | — | — | The standard bone: hips, spine, chest, upperChest, neck, head, then leftShoulder, leftUpperArm, leftLowerArm, leftHand, the right arm, leftUpperLeg, leftLowerLeg, leftFoot, leftToes and the right leg. |
1539
+ | `bone` | `string` | `""` | — | — | — | The standard bone: hips, spine, chest, upperChest, neck, head, then leftShoulder, leftUpperArm, leftLowerArm, leftHand, the right arm, leftUpperLeg, leftLowerLeg, leftFoot, leftToes and the right leg, then each hand's fingers (VRM 1.0 names): leftThumbMetacarpal, leftThumbProximal, leftThumbDistal, leftIndexProximal, leftIndexIntermediate, leftIndexDistal, the same for Middle, Ring and Little, and the right hand's. |
1128
1540
  | `node` | `string` | `""` | — | — | — | The skeleton node that is that bone. |
1129
1541
 
1130
1542
  ```ogt
1131
1543
  struct HumanBone {
1132
1544
  doc "One standard humanoid bone of a skeleton."
1133
- field bone String "The standard bone: hips, spine, chest, upperChest, neck, head, then leftShoulder, leftUpperArm, leftLowerArm, leftHand, the right arm, leftUpperLeg, leftLowerLeg, leftFoot, leftToes and the right leg."
1545
+ field bone String "The standard bone: hips, spine, chest, upperChest, neck, head, then leftShoulder, leftUpperArm, leftLowerArm, leftHand, the right arm, leftUpperLeg, leftLowerLeg, leftFoot, leftToes and the right leg, then each hand's fingers (VRM 1.0 names): leftThumbMetacarpal, leftThumbProximal, leftThumbDistal, leftIndexProximal, leftIndexIntermediate, leftIndexDistal, the same for Middle, Ring and Little, and the right hand's."
1134
1546
  field node String "The skeleton node that is that bone."
1135
1547
  }
1136
1548
  ```
1137
1549
 
1138
- <sub>`api.ogt` line 7463</sub>
1550
+ <sub>`api.ogt` line 8316</sub>
1139
1551
 
1140
1552
  <a id="type-Humanoid"></a>
1141
1553
 
@@ -1156,7 +1568,7 @@ struct Humanoid {
1156
1568
  }
1157
1569
  ```
1158
1570
 
1159
- <sub>`api.ogt` line 7469</sub>
1571
+ <sub>`api.ogt` line 8322</sub>
1160
1572
 
1161
1573
  <a id="type-HumanoidDesc"></a>
1162
1574
 
@@ -1180,7 +1592,7 @@ struct HumanoidDesc {
1180
1592
  }
1181
1593
  ```
1182
1594
 
1183
- <sub>`api.ogt` line 7475</sub>
1595
+ <sub>`api.ogt` line 8328</sub>
1184
1596
 
1185
1597
  <a id="type-RetargetDesc"></a>
1186
1598
 
@@ -1214,7 +1626,31 @@ struct RetargetDesc {
1214
1626
  }
1215
1627
  ```
1216
1628
 
1217
- <sub>`api.ogt` line 7489</sub>
1629
+ <sub>`api.ogt` line 8342</sub>
1630
+
1631
+ <a id="type-MirrorDesc"></a>
1632
+
1633
+ ### `MirrorDesc` (desc struct)
1634
+
1635
+ A clip to play on the other side of the skeleton it was made for.
1636
+
1637
+ A desc: every field may be omitted and takes its default; `{}` is valid.
1638
+
1639
+ | Field | Type | Default | Range | Unit | Notes | Doc |
1640
+ |---|---|---|---|---|---|---|
1641
+ | `clip` | `ClipAsset` | `0` | — | — | — | The clip, made for `skeleton`. |
1642
+ | `skeleton` | `SkeletonAsset` | `0` | — | — | — | The skeleton the clip was made for (og.load.animation's `skeleton`); its left and right nodes are paired by name, the side tokens every rig naming scheme writes swapped (LeftArm and RightArm, thigh.L and thigh.R, J_Bip_L_ and J_Bip_R_, calf_l and calf_r). |
1643
+
1644
+ ```ogt
1645
+ struct MirrorDesc {
1646
+ doc "A clip to play on the other side of the skeleton it was made for."
1647
+ desc true
1648
+ field clip ClipAsset "The clip, made for `skeleton`."
1649
+ field skeleton SkeletonAsset "The skeleton the clip was made for (og.load.animation's `skeleton`); its left and right nodes are paired by name, the side tokens every rig naming scheme writes swapped (LeftArm and RightArm, thigh.L and thigh.R, J_Bip_L_ and J_Bip_R_, calf_l and calf_r)."
1650
+ }
1651
+ ```
1652
+
1653
+ <sub>`api.ogt` line 8362</sub>
1218
1654
 
1219
1655
  <a id="type-FlipbookSheet"></a>
1220
1656
 
@@ -1228,7 +1664,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
1228
1664
  handle FlipbookSheet "A sprite sheet's frames and clips (a cooked `.ogt` of `type flipbook`), from og.load.flipbook."
1229
1665
  ```
1230
1666
 
1231
- <sub>`api.ogt` line 7509</sub>
1667
+ <sub>`api.ogt` line 8376</sub>
1232
1668
 
1233
1669
  <a id="type-FlipMode"></a>
1234
1670
 
@@ -1253,7 +1689,7 @@ enum FlipMode {
1253
1689
  }
1254
1690
  ```
1255
1691
 
1256
- <sub>`api.ogt` line 7518</sub>
1692
+ <sub>`api.ogt` line 8385</sub>
1257
1693
 
1258
1694
  <a id="type-FlipbookClipInfo"></a>
1259
1695
 
@@ -1284,7 +1720,7 @@ struct FlipbookClipInfo {
1284
1720
  }
1285
1721
  ```
1286
1722
 
1287
- <sub>`api.ogt` line 7564</sub>
1723
+ <sub>`api.ogt` line 8431</sub>
1288
1724
 
1289
1725
  <a id="type-FlipbookInfo"></a>
1290
1726
 
@@ -1315,7 +1751,7 @@ struct FlipbookInfo {
1315
1751
  }
1316
1752
  ```
1317
1753
 
1318
- <sub>`api.ogt` line 7576</sub>
1754
+ <sub>`api.ogt` line 8443</sub>
1319
1755
 
1320
1756
  <a id="type-Rig2D"></a>
1321
1757
 
@@ -1329,7 +1765,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
1329
1765
  handle Rig2D "A 2D rig (a cooked `.ogt` of `type rig2d`): bones, slots, region, mesh, bounding-box and child-armature attachments, IK constraints, child armatures and clips, from og.load.rig2d."
1330
1766
  ```
1331
1767
 
1332
- <sub>`api.ogt` line 7611</sub>
1768
+ <sub>`api.ogt` line 8478</sub>
1333
1769
 
1334
1770
  <a id="type-Rig2DClipInfo"></a>
1335
1771
 
@@ -1358,7 +1794,7 @@ struct Rig2DClipInfo {
1358
1794
  }
1359
1795
  ```
1360
1796
 
1361
- <sub>`api.ogt` line 7686</sub>
1797
+ <sub>`api.ogt` line 8557</sub>
1362
1798
 
1363
1799
  <a id="type-Rig2DInfo"></a>
1364
1800
 
@@ -1374,6 +1810,7 @@ What og.load.rig2d registered, or og.anim.rig2dInfo reads back from a handle.
1374
1810
  | `bones` | `readonly string[]` | `[]` | — | — | — | The bones' names, parents first. |
1375
1811
  | `slots` | `readonly string[]` | `[]` | — | — | — | The slots' names, in draw order. |
1376
1812
  | `constraints` | `readonly string[]` | `[]` | — | — | — | The IK constraints' names: an index here is IkTarget2D.constraint. |
1813
+ | `skins` | `readonly string[]` | `[]` | — | — | — | Its skins' names, `default` (the rig's own attachments) first: an index here is Skeleton2D.skin. |
1377
1814
  | `clips` | `readonly Rig2DClipInfo[]` | `[]` | — | — | — | Its clips, in file order. |
1378
1815
 
1379
1816
  ```ogt
@@ -1385,11 +1822,12 @@ struct Rig2DInfo {
1385
1822
  field bones List.String "The bones' names, parents first."
1386
1823
  field slots List.String "The slots' names, in draw order."
1387
1824
  field constraints List.String "The IK constraints' names: an index here is IkTarget2D.constraint."
1825
+ field skins List.String "Its skins' names, `default` (the rig's own attachments) first: an index here is Skeleton2D.skin."
1388
1826
  field clips List.Rig2DClipInfo "Its clips, in file order."
1389
1827
  }
1390
1828
  ```
1391
1829
 
1392
- <sub>`api.ogt` line 7697</sub>
1830
+ <sub>`api.ogt` line 8568</sub>
1393
1831
 
1394
1832
  <a id="type-Skeleton2DBox"></a>
1395
1833
 
@@ -1412,7 +1850,7 @@ struct Skeleton2DBox {
1412
1850
  }
1413
1851
  ```
1414
1852
 
1415
- <sub>`api.ogt` line 7715</sub>
1853
+ <sub>`api.ogt` line 8587</sub>
1416
1854
 
1417
1855
  ## Column kinds
1418
1856
 
@@ -1427,6 +1865,9 @@ Each is a factory, `SkeletonAsset(value?, options?)`, that makes one field of a
1427
1865
  | <a id="column-BlendshapeSource"></a>`BlendshapeSource` | `BlendshapeSource` | `Uint32Array` | 1 | A BlendshapeSource field: the variant's index. |
1428
1866
  | <a id="column-IkSolver"></a>`IkSolver` | `IkSolver` | `Uint32Array` | 1 | An IkSolver field: the variant's index. |
1429
1867
  | <a id="column-IkSpace"></a>`IkSpace` | `IkSpace` | `Uint32Array` | 1 | An IkSpace field: the variant's index. |
1868
+ | <a id="column-SpringSpace"></a>`SpringSpace` | `SpringSpace` | `Uint32Array` | 1 | A SpringSpace field: the variant's index. |
1869
+ | <a id="column-SpringColliderShape"></a>`SpringColliderShape` | `SpringColliderShape` | `Uint32Array` | 1 | A SpringColliderShape field: the variant's index. |
1870
+ | <a id="column-Rig"></a>`Rig` | `Rig` | `Uint32Array` | 2 | A Rig handle field (0 is none): a humanoid map og.load.rig answered. |
1430
1871
  | <a id="column-FlipbookSheet"></a>`FlipbookSheet` | `FlipbookSheet` | `Uint32Array` | 2 | A FlipbookSheet handle field. |
1431
1872
  | <a id="column-Rig2D"></a>`Rig2D` | `Rig2D` | `Uint32Array` | 2 | A Rig2D handle field. |
1432
1873
 
@@ -1439,7 +1880,7 @@ column SkeletonAsset {
1439
1880
  }
1440
1881
  ```
1441
1882
 
1442
- <sub>`api.ogt` line 7149</sub>
1883
+ <sub>`api.ogt` line 7771</sub>
1443
1884
 
1444
1885
  ```ogt
1445
1886
  column ClipAsset {
@@ -1450,7 +1891,7 @@ column ClipAsset {
1450
1891
  }
1451
1892
  ```
1452
1893
 
1453
- <sub>`api.ogt` line 7156</sub>
1894
+ <sub>`api.ogt` line 7778</sub>
1454
1895
 
1455
1896
  ```ogt
1456
1897
  column GraphAsset {
@@ -1461,7 +1902,7 @@ column GraphAsset {
1461
1902
  }
1462
1903
  ```
1463
1904
 
1464
- <sub>`api.ogt` line 7163</sub>
1905
+ <sub>`api.ogt` line 7785</sub>
1465
1906
 
1466
1907
  ```ogt
1467
1908
  column RootMotion {
@@ -1472,7 +1913,7 @@ column RootMotion {
1472
1913
  }
1473
1914
  ```
1474
1915
 
1475
- <sub>`api.ogt` line 7177</sub>
1916
+ <sub>`api.ogt` line 7799</sub>
1476
1917
 
1477
1918
  ```ogt
1478
1919
  column BlendshapeSource {
@@ -1483,7 +1924,7 @@ column BlendshapeSource {
1483
1924
  }
1484
1925
  ```
1485
1926
 
1486
- <sub>`api.ogt` line 7190</sub>
1927
+ <sub>`api.ogt` line 7812</sub>
1487
1928
 
1488
1929
  ```ogt
1489
1930
  column IkSolver {
@@ -1494,7 +1935,7 @@ column IkSolver {
1494
1935
  }
1495
1936
  ```
1496
1937
 
1497
- <sub>`api.ogt` line 7203</sub>
1938
+ <sub>`api.ogt` line 7825</sub>
1498
1939
 
1499
1940
  ```ogt
1500
1941
  column IkSpace {
@@ -1505,7 +1946,40 @@ column IkSpace {
1505
1946
  }
1506
1947
  ```
1507
1948
 
1508
- <sub>`api.ogt` line 7216</sub>
1949
+ <sub>`api.ogt` line 7838</sub>
1950
+
1951
+ ```ogt
1952
+ column SpringSpace {
1953
+ doc "A SpringSpace field: the variant's index."
1954
+ array Uint32Array
1955
+ stride 1
1956
+ value SpringSpace
1957
+ }
1958
+ ```
1959
+
1960
+ <sub>`api.ogt` line 8159</sub>
1961
+
1962
+ ```ogt
1963
+ column SpringColliderShape {
1964
+ doc "A SpringColliderShape field: the variant's index."
1965
+ array Uint32Array
1966
+ stride 1
1967
+ value SpringColliderShape
1968
+ }
1969
+ ```
1970
+
1971
+ <sub>`api.ogt` line 8232</sub>
1972
+
1973
+ ```ogt
1974
+ column Rig {
1975
+ doc "A Rig handle field (0 is none): a humanoid map og.load.rig answered."
1976
+ array Uint32Array
1977
+ stride 2
1978
+ value Rig
1979
+ }
1980
+ ```
1981
+
1982
+ <sub>`api.ogt` line 8309</sub>
1509
1983
 
1510
1984
  ```ogt
1511
1985
  column FlipbookSheet {
@@ -1516,7 +1990,7 @@ column FlipbookSheet {
1516
1990
  }
1517
1991
  ```
1518
1992
 
1519
- <sub>`api.ogt` line 7511</sub>
1993
+ <sub>`api.ogt` line 8378</sub>
1520
1994
 
1521
1995
  ```ogt
1522
1996
  column Rig2D {
@@ -1527,4 +2001,4 @@ column Rig2D {
1527
2001
  }
1528
2002
  ```
1529
2003
 
1530
- <sub>`api.ogt` line 7613</sub>
2004
+ <sub>`api.ogt` line 8480</sub>