@origingame/engine 0.4.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 (78) hide show
  1. package/dist/web/origin-engine.d.ts +8 -5
  2. package/dist/web/origin-engine.js +39 -19
  3. package/dist/web/origin-engine_bg.wasm +0 -0
  4. package/dist/web/origin-engine_bg.wasm.d.ts +6 -5
  5. package/dist/web-publish/origin-engine-lanes.js +49 -29
  6. package/dist/web-publish/origin-engine-lanes_bg.wasm +0 -0
  7. package/dist/web-publish/origin-engine.d.ts +8 -5
  8. package/dist/web-publish/origin-engine.js +39 -19
  9. package/dist/web-publish/origin-engine_bg.wasm +0 -0
  10. package/dist/web-publish/origin-engine_bg.wasm.d.ts +6 -5
  11. package/dist/web-publish-2d/origin-engine-lanes.js +49 -29
  12. package/dist/web-publish-2d/origin-engine-lanes_bg.wasm +0 -0
  13. package/dist/web-publish-2d/origin-engine.d.ts +8 -5
  14. package/dist/web-publish-2d/origin-engine.js +39 -19
  15. package/dist/web-publish-2d/origin-engine_bg.wasm +0 -0
  16. package/dist/web-publish-2d/origin-engine_bg.wasm.d.ts +6 -5
  17. package/knowledge/looks/catalogue.json +123 -2
  18. package/knowledge/package.json +1 -1
  19. package/knowledge/scaffold/origin-engine.json +2 -2
  20. package/knowledge/scaffold/template/package.json +1 -1
  21. package/knowledge/scaffold/template/project.ogt +1 -1
  22. package/knowledge/scripts/validate.ts +69 -6
  23. package/knowledge/skills/og-audio/SKILL.md +31 -5
  24. package/knowledge/skills/og-build/SKILL.md +44 -4
  25. package/knowledge/skills/og-core/SKILL.md +4 -3
  26. package/knowledge/skills/og-feel/SKILL.md +9 -1
  27. package/knowledge/skills/og-game/SKILL.md +199 -16
  28. package/knowledge/skills/og-platform-sdk/SKILL.md +6 -0
  29. package/knowledge/skills/og-taste/SKILL.md +7 -0
  30. package/knowledge/skills/og-ui/SKILL.md +24 -0
  31. package/knowledge/wiki/ai.md +20 -20
  32. package/knowledge/wiki/anim.md +526 -60
  33. package/knowledge/wiki/atmosphere.md +13 -13
  34. package/knowledge/wiki/audio.md +160 -20
  35. package/knowledge/wiki/camera.md +13 -13
  36. package/knowledge/wiki/commands.md +11 -11
  37. package/knowledge/wiki/debug.md +13 -13
  38. package/knowledge/wiki/game.md +8 -8
  39. package/knowledge/wiki/i18n.md +7 -7
  40. package/knowledge/wiki/index.md +25 -1
  41. package/knowledge/wiki/input.md +47 -47
  42. package/knowledge/wiki/load.md +76 -50
  43. package/knowledge/wiki/math.md +102 -102
  44. package/knowledge/wiki/nav.md +34 -34
  45. package/knowledge/wiki/net.md +10 -10
  46. package/knowledge/wiki/path.md +14 -14
  47. package/knowledge/wiki/physics.md +111 -100
  48. package/knowledge/wiki/platform.md +44 -44
  49. package/knowledge/wiki/probe.md +86 -86
  50. package/knowledge/wiki/reflect.md +17 -17
  51. package/knowledge/wiki/render.md +245 -176
  52. package/knowledge/wiki/rng.md +14 -14
  53. package/knowledge/wiki/shapes.md +26 -26
  54. package/knowledge/wiki/stream.md +15 -15
  55. package/knowledge/wiki/system.md +8 -8
  56. package/knowledge/wiki/systems.md +2 -2
  57. package/knowledge/wiki/terrain.md +19 -19
  58. package/knowledge/wiki/tilemap.md +13 -13
  59. package/knowledge/wiki/time.md +4 -4
  60. package/knowledge/wiki/timeline.md +14 -14
  61. package/knowledge/wiki/transform.md +8 -8
  62. package/knowledge/wiki/tween.md +17 -17
  63. package/knowledge/wiki/ui.md +243 -243
  64. package/knowledge/wiki/video.md +5 -5
  65. package/knowledge/wiki/world.md +36 -36
  66. package/package.json +4 -4
  67. package/schema/api.schema.json +639 -11
  68. package/shell/page.ts +4 -0
  69. package/src/generated/abi.ts +3 -0
  70. package/src/index.ts +11 -0
  71. package/src/node/device.ts +5 -2
  72. package/src/node/polish.ts +34 -15
  73. package/src/node/run.ts +23 -6
  74. package/src/runtime.ts +1 -0
  75. package/src/web/gl-state.ts +907 -0
  76. package/src/web/worker.ts +6 -0
  77. package/types/bindings.json +823 -349
  78. package/types/index.d.ts +650 -15
@@ -18,7 +18,7 @@ module anim {
18
18
  # declarations follow, each quoted below
19
19
  ```
20
20
 
21
- <sub>`api.ogt` line 7707</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. |
@@ -106,7 +118,7 @@ fn graph {
106
118
  }
107
119
  ```
108
120
 
109
- <sub>`api.ogt` line 8022</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 8050</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 8070</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 8155</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 8163</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 8171</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 8281</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 8295</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 7791</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 7806</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 7845</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 7893</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 7941</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 7985</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 8093</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 8124</sub>
1115
+ <sub>`api.ogt` line 8423</sub>
756
1116
 
757
1117
  <a id="record-Skeleton2D"></a>
758
1118
 
@@ -808,7 +1168,7 @@ component Skeleton2D {
808
1168
  }
809
1169
  ```
810
1170
 
811
- <sub>`api.ogt` line 8188</sub>
1171
+ <sub>`api.ogt` line 8487</sub>
812
1172
 
813
1173
  <a id="record-Skeleton2DEvent"></a>
814
1174
 
@@ -839,7 +1199,7 @@ event Skeleton2DEvent {
839
1199
  }
840
1200
  ```
841
1201
 
842
- <sub>`api.ogt` line 8218</sub>
1202
+ <sub>`api.ogt` line 8517</sub>
843
1203
 
844
1204
  <a id="record-IkTarget2D"></a>
845
1205
 
@@ -890,7 +1250,7 @@ component IkTarget2D {
890
1250
  }
891
1251
  ```
892
1252
 
893
- <sub>`api.ogt` line 8229</sub>
1253
+ <sub>`api.ogt` line 8528</sub>
894
1254
 
895
1255
  ## Types
896
1256
 
@@ -906,7 +1266,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
906
1266
  handle SkeletonAsset "A rig: a glTF's nodes in topological order with their rest transforms, and its skins (joints and inverse bind matrices)."
907
1267
  ```
908
1268
 
909
- <sub>`api.ogt` line 7713</sub>
1269
+ <sub>`api.ogt` line 7767</sub>
910
1270
 
911
1271
  <a id="type-ClipAsset"></a>
912
1272
 
@@ -920,7 +1280,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
920
1280
  handle ClipAsset "An animation clip, resampled at the cook's rate, with its markers."
921
1281
  ```
922
1282
 
923
- <sub>`api.ogt` line 7714</sub>
1283
+ <sub>`api.ogt` line 7768</sub>
924
1284
 
925
1285
  <a id="type-GraphAsset"></a>
926
1286
 
@@ -934,7 +1294,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
934
1294
  handle GraphAsset "A blend-tree graph (`type animgraph`) whose clip references were resolved to clip handles."
935
1295
  ```
936
1296
 
937
- <sub>`api.ogt` line 7715</sub>
1297
+ <sub>`api.ogt` line 7769</sub>
938
1298
 
939
1299
  <a id="type-RootMotion"></a>
940
1300
 
@@ -959,7 +1319,7 @@ enum RootMotion {
959
1319
  }
960
1320
  ```
961
1321
 
962
- <sub>`api.ogt` line 7738</sub>
1322
+ <sub>`api.ogt` line 7792</sub>
963
1323
 
964
1324
  <a id="type-BlendshapeSource"></a>
965
1325
 
@@ -982,7 +1342,7 @@ enum BlendshapeSource {
982
1342
  }
983
1343
  ```
984
1344
 
985
- <sub>`api.ogt` line 7752</sub>
1345
+ <sub>`api.ogt` line 7806</sub>
986
1346
 
987
1347
  <a id="type-IkSolver"></a>
988
1348
 
@@ -1005,7 +1365,7 @@ enum IkSolver {
1005
1365
  }
1006
1366
  ```
1007
1367
 
1008
- <sub>`api.ogt` line 7765</sub>
1368
+ <sub>`api.ogt` line 7819</sub>
1009
1369
 
1010
1370
  <a id="type-IkSpace"></a>
1011
1371
 
@@ -1028,7 +1388,53 @@ enum IkSpace {
1028
1388
  }
1029
1389
  ```
1030
1390
 
1031
- <sub>`api.ogt` line 7778</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>
1032
1438
 
1033
1439
  <a id="type-ClipInfo"></a>
1034
1440
 
@@ -1055,7 +1461,7 @@ struct ClipInfo {
1055
1461
  }
1056
1462
  ```
1057
1463
 
1058
- <sub>`api.ogt` line 7996</sub>
1464
+ <sub>`api.ogt` line 8274</sub>
1059
1465
 
1060
1466
  <a id="type-Animation"></a>
1061
1467
 
@@ -1082,7 +1488,7 @@ struct Animation {
1082
1488
  }
1083
1489
  ```
1084
1490
 
1085
- <sub>`api.ogt` line 8006</sub>
1491
+ <sub>`api.ogt` line 8284</sub>
1086
1492
 
1087
1493
  <a id="type-GraphDesc"></a>
1088
1494
 
@@ -1106,21 +1512,21 @@ struct GraphDesc {
1106
1512
  }
1107
1513
  ```
1108
1514
 
1109
- <sub>`api.ogt` line 8015</sub>
1515
+ <sub>`api.ogt` line 8293</sub>
1110
1516
 
1111
1517
  <a id="type-Rig"></a>
1112
1518
 
1113
1519
  ### `Rig` (handle)
1114
1520
 
1115
- 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.
1116
1522
 
1117
1523
  A generational handle: a number the engine hands out. A dead handle is an error value, never a crash.
1118
1524
 
1119
1525
  ```ogt
1120
- 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."
1121
1527
  ```
1122
1528
 
1123
- <sub>`api.ogt` line 8029</sub>
1529
+ <sub>`api.ogt` line 8307</sub>
1124
1530
 
1125
1531
  <a id="type-HumanBone"></a>
1126
1532
 
@@ -1130,18 +1536,18 @@ One standard humanoid bone of a skeleton.
1130
1536
 
1131
1537
  | Field | Type | Default | Range | Unit | Notes | Doc |
1132
1538
  |---|---|---|---|---|---|---|
1133
- | `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. |
1134
1540
  | `node` | `string` | `""` | — | — | — | The skeleton node that is that bone. |
1135
1541
 
1136
1542
  ```ogt
1137
1543
  struct HumanBone {
1138
1544
  doc "One standard humanoid bone of a skeleton."
1139
- 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."
1140
1546
  field node String "The skeleton node that is that bone."
1141
1547
  }
1142
1548
  ```
1143
1549
 
1144
- <sub>`api.ogt` line 8031</sub>
1550
+ <sub>`api.ogt` line 8316</sub>
1145
1551
 
1146
1552
  <a id="type-Humanoid"></a>
1147
1553
 
@@ -1162,7 +1568,7 @@ struct Humanoid {
1162
1568
  }
1163
1569
  ```
1164
1570
 
1165
- <sub>`api.ogt` line 8037</sub>
1571
+ <sub>`api.ogt` line 8322</sub>
1166
1572
 
1167
1573
  <a id="type-HumanoidDesc"></a>
1168
1574
 
@@ -1186,7 +1592,7 @@ struct HumanoidDesc {
1186
1592
  }
1187
1593
  ```
1188
1594
 
1189
- <sub>`api.ogt` line 8043</sub>
1595
+ <sub>`api.ogt` line 8328</sub>
1190
1596
 
1191
1597
  <a id="type-RetargetDesc"></a>
1192
1598
 
@@ -1220,7 +1626,31 @@ struct RetargetDesc {
1220
1626
  }
1221
1627
  ```
1222
1628
 
1223
- <sub>`api.ogt` line 8057</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>
1224
1654
 
1225
1655
  <a id="type-FlipbookSheet"></a>
1226
1656
 
@@ -1234,7 +1664,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
1234
1664
  handle FlipbookSheet "A sprite sheet's frames and clips (a cooked `.ogt` of `type flipbook`), from og.load.flipbook."
1235
1665
  ```
1236
1666
 
1237
- <sub>`api.ogt` line 8077</sub>
1667
+ <sub>`api.ogt` line 8376</sub>
1238
1668
 
1239
1669
  <a id="type-FlipMode"></a>
1240
1670
 
@@ -1259,7 +1689,7 @@ enum FlipMode {
1259
1689
  }
1260
1690
  ```
1261
1691
 
1262
- <sub>`api.ogt` line 8086</sub>
1692
+ <sub>`api.ogt` line 8385</sub>
1263
1693
 
1264
1694
  <a id="type-FlipbookClipInfo"></a>
1265
1695
 
@@ -1290,7 +1720,7 @@ struct FlipbookClipInfo {
1290
1720
  }
1291
1721
  ```
1292
1722
 
1293
- <sub>`api.ogt` line 8132</sub>
1723
+ <sub>`api.ogt` line 8431</sub>
1294
1724
 
1295
1725
  <a id="type-FlipbookInfo"></a>
1296
1726
 
@@ -1321,7 +1751,7 @@ struct FlipbookInfo {
1321
1751
  }
1322
1752
  ```
1323
1753
 
1324
- <sub>`api.ogt` line 8144</sub>
1754
+ <sub>`api.ogt` line 8443</sub>
1325
1755
 
1326
1756
  <a id="type-Rig2D"></a>
1327
1757
 
@@ -1335,7 +1765,7 @@ A generational handle: a number the engine hands out. A dead handle is an error
1335
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."
1336
1766
  ```
1337
1767
 
1338
- <sub>`api.ogt` line 8179</sub>
1768
+ <sub>`api.ogt` line 8478</sub>
1339
1769
 
1340
1770
  <a id="type-Rig2DClipInfo"></a>
1341
1771
 
@@ -1364,7 +1794,7 @@ struct Rig2DClipInfo {
1364
1794
  }
1365
1795
  ```
1366
1796
 
1367
- <sub>`api.ogt` line 8258</sub>
1797
+ <sub>`api.ogt` line 8557</sub>
1368
1798
 
1369
1799
  <a id="type-Rig2DInfo"></a>
1370
1800
 
@@ -1397,7 +1827,7 @@ struct Rig2DInfo {
1397
1827
  }
1398
1828
  ```
1399
1829
 
1400
- <sub>`api.ogt` line 8269</sub>
1830
+ <sub>`api.ogt` line 8568</sub>
1401
1831
 
1402
1832
  <a id="type-Skeleton2DBox"></a>
1403
1833
 
@@ -1420,7 +1850,7 @@ struct Skeleton2DBox {
1420
1850
  }
1421
1851
  ```
1422
1852
 
1423
- <sub>`api.ogt` line 8288</sub>
1853
+ <sub>`api.ogt` line 8587</sub>
1424
1854
 
1425
1855
  ## Column kinds
1426
1856
 
@@ -1435,6 +1865,9 @@ Each is a factory, `SkeletonAsset(value?, options?)`, that makes one field of a
1435
1865
  | <a id="column-BlendshapeSource"></a>`BlendshapeSource` | `BlendshapeSource` | `Uint32Array` | 1 | A BlendshapeSource field: the variant's index. |
1436
1866
  | <a id="column-IkSolver"></a>`IkSolver` | `IkSolver` | `Uint32Array` | 1 | An IkSolver field: the variant's index. |
1437
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. |
1438
1871
  | <a id="column-FlipbookSheet"></a>`FlipbookSheet` | `FlipbookSheet` | `Uint32Array` | 2 | A FlipbookSheet handle field. |
1439
1872
  | <a id="column-Rig2D"></a>`Rig2D` | `Rig2D` | `Uint32Array` | 2 | A Rig2D handle field. |
1440
1873
 
@@ -1447,7 +1880,7 @@ column SkeletonAsset {
1447
1880
  }
1448
1881
  ```
1449
1882
 
1450
- <sub>`api.ogt` line 7717</sub>
1883
+ <sub>`api.ogt` line 7771</sub>
1451
1884
 
1452
1885
  ```ogt
1453
1886
  column ClipAsset {
@@ -1458,7 +1891,7 @@ column ClipAsset {
1458
1891
  }
1459
1892
  ```
1460
1893
 
1461
- <sub>`api.ogt` line 7724</sub>
1894
+ <sub>`api.ogt` line 7778</sub>
1462
1895
 
1463
1896
  ```ogt
1464
1897
  column GraphAsset {
@@ -1469,7 +1902,7 @@ column GraphAsset {
1469
1902
  }
1470
1903
  ```
1471
1904
 
1472
- <sub>`api.ogt` line 7731</sub>
1905
+ <sub>`api.ogt` line 7785</sub>
1473
1906
 
1474
1907
  ```ogt
1475
1908
  column RootMotion {
@@ -1480,7 +1913,7 @@ column RootMotion {
1480
1913
  }
1481
1914
  ```
1482
1915
 
1483
- <sub>`api.ogt` line 7745</sub>
1916
+ <sub>`api.ogt` line 7799</sub>
1484
1917
 
1485
1918
  ```ogt
1486
1919
  column BlendshapeSource {
@@ -1491,7 +1924,7 @@ column BlendshapeSource {
1491
1924
  }
1492
1925
  ```
1493
1926
 
1494
- <sub>`api.ogt` line 7758</sub>
1927
+ <sub>`api.ogt` line 7812</sub>
1495
1928
 
1496
1929
  ```ogt
1497
1930
  column IkSolver {
@@ -1502,7 +1935,7 @@ column IkSolver {
1502
1935
  }
1503
1936
  ```
1504
1937
 
1505
- <sub>`api.ogt` line 7771</sub>
1938
+ <sub>`api.ogt` line 7825</sub>
1506
1939
 
1507
1940
  ```ogt
1508
1941
  column IkSpace {
@@ -1513,7 +1946,40 @@ column IkSpace {
1513
1946
  }
1514
1947
  ```
1515
1948
 
1516
- <sub>`api.ogt` line 7784</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>
1517
1983
 
1518
1984
  ```ogt
1519
1985
  column FlipbookSheet {
@@ -1524,7 +1990,7 @@ column FlipbookSheet {
1524
1990
  }
1525
1991
  ```
1526
1992
 
1527
- <sub>`api.ogt` line 8079</sub>
1993
+ <sub>`api.ogt` line 8378</sub>
1528
1994
 
1529
1995
  ```ogt
1530
1996
  column Rig2D {
@@ -1535,4 +2001,4 @@ column Rig2D {
1535
2001
  }
1536
2002
  ```
1537
2003
 
1538
- <sub>`api.ogt` line 8181</sub>
2004
+ <sub>`api.ogt` line 8480</sub>