@aura3d/assets 2.0.3 → 3.0.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 (38) hide show
  1. package/dist/GLTFAnimationRuntime.d.ts +95 -2
  2. package/dist/GLTFAnimationRuntime.d.ts.map +1 -1
  3. package/dist/GLTFAnimationRuntime.js +328 -3
  4. package/dist/GLTFAnimationRuntime.js.map +1 -1
  5. package/dist/GLTFExtensionSupport.js +2 -2
  6. package/dist/GLTFExtensionSupport.js.map +1 -1
  7. package/dist/GLTFLoader.d.ts +360 -1
  8. package/dist/GLTFLoader.d.ts.map +1 -1
  9. package/dist/GLTFLoader.js +197 -1
  10. package/dist/GLTFLoader.js.map +1 -1
  11. package/dist/KTX2BasisTextureTranscoder.d.ts +39 -0
  12. package/dist/KTX2BasisTextureTranscoder.d.ts.map +1 -1
  13. package/dist/KTX2BasisTextureTranscoder.js +70 -0
  14. package/dist/KTX2BasisTextureTranscoder.js.map +1 -1
  15. package/dist/TexturePipeline.d.ts +20 -0
  16. package/dist/TexturePipeline.d.ts.map +1 -1
  17. package/dist/TexturePipeline.js +20 -0
  18. package/dist/TexturePipeline.js.map +1 -1
  19. package/dist/TextureStreaming.d.ts +30 -0
  20. package/dist/TextureStreaming.d.ts.map +1 -1
  21. package/dist/TextureStreaming.js +53 -0
  22. package/dist/TextureStreaming.js.map +1 -1
  23. package/dist/browser-index.d.ts +7 -3
  24. package/dist/browser-index.d.ts.map +1 -1
  25. package/dist/browser-index.js +3 -1
  26. package/dist/browser-index.js.map +1 -1
  27. package/dist/gltf-runtime.d.ts +1 -1
  28. package/dist/gltf-runtime.d.ts.map +1 -1
  29. package/dist/gltf-runtime.js.map +1 -1
  30. package/dist/index.d.ts +7 -7
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +3 -3
  33. package/dist/index.js.map +1 -1
  34. package/dist/loaders/HDRLoader.d.ts +40 -0
  35. package/dist/loaders/HDRLoader.d.ts.map +1 -1
  36. package/dist/loaders/HDRLoader.js +158 -0
  37. package/dist/loaders/HDRLoader.js.map +1 -1
  38. package/package.json +4 -4
@@ -1,10 +1,64 @@
1
- import { AnimationAction, AnimationClip, AnimationMixer, type AnimationEvent, type AnimationMixerOptions, type AnimationValue, type LoopMode, type TwoBoneIkResult } from "@aura3d/animation";
2
- import { Scene } from "@aura3d/scene";
1
+ import { AnimationAction, AnimationClip, AnimationMixer, type AnimationEvent, type AnimationMixerOptions, type AnimationValue, type GroundRaycaster, type LoopMode, type TwoBoneIkResult } from "@aura3d/animation";
2
+ import { Scene, type Mat4 } from "@aura3d/scene";
3
3
  import type { GLTFAsset } from "./GLTFLoader.js";
4
+ /**
5
+ * Structural material sink for `material:<name>.<leaf>` animation-pointer tracks. Kept
6
+ * structural (instead of importing the rendering `Material`) so the animation runtime stays
7
+ * decoupled from the renderer; the production bridge adapts the live material library.
8
+ */
9
+ export interface GLTFSceneAnimationMaterialSink {
10
+ readonly name: string;
11
+ setAnimationParameter(parameter: string, value: number | readonly number[]): void;
12
+ }
4
13
  export interface GLTFSceneAnimationRuntimeOptions {
5
14
  readonly scene: Scene;
6
15
  readonly clips: readonly AnimationClip[];
7
16
  readonly asset?: Pick<GLTFAsset, "meshes" | "skins">;
17
+ /**
18
+ * Resolves a glTF material name to its live material sink. When absent, every
19
+ * `material:*` track is reported as a missing target (diagnosed, never silent).
20
+ */
21
+ readonly resolveAnimationMaterial?: (name: string) => GLTFSceneAnimationMaterialSink | undefined;
22
+ /**
23
+ * Optional foot-planting post-pass (E2): after clip/pose tracks are applied, leg chains
24
+ * are solved against `ground` (heightfield, moving-platform adapter, …) and written back
25
+ * with `setFootPlanting`. Legs whose nodes are missing are reported, never faked.
26
+ */
27
+ readonly footPlanting?: GLTFootPlantingConfig;
28
+ }
29
+ /** One leg chain for the foot-planting post-pass, addressed by glTF node names. */
30
+ export interface GLTFootPlantingLegConfig {
31
+ readonly side: "left" | "right";
32
+ readonly hip: string;
33
+ readonly knee: string;
34
+ readonly ankle: string;
35
+ readonly pole?: readonly [number, number, number];
36
+ }
37
+ export interface GLTFootPlantingConfig {
38
+ readonly legs: readonly GLTFootPlantingLegConfig[];
39
+ readonly ground: GroundRaycaster;
40
+ readonly ankleHeight?: number;
41
+ readonly rayStartHeight?: number;
42
+ readonly maxRayDistance?: number;
43
+ readonly plantThreshold?: number;
44
+ readonly hipDropFactor?: number;
45
+ /**
46
+ * Actor-local → world matrix (column-major 16). The runtime skeleton usually lives in
47
+ * import units (the certified walk girl is centimeter-scale) while `ground` speaks world
48
+ * meters (the engine auto-normalizes model nodes for display). With this matrix the
49
+ * post-pass raycasts and solves in world space — the same space the renderer draws — and
50
+ * maps solved targets back to actor-local for write-back. Solved errors stay in world
51
+ * units. Omit only when the runtime scene already is the world scene (identity).
52
+ */
53
+ readonly worldFromLocal?: Mat4;
54
+ }
55
+ export interface GLTFootPlantingApplyResult {
56
+ readonly groundedFeet: number;
57
+ readonly averageTargetError: number;
58
+ readonly lockedSides: readonly ("left" | "right")[];
59
+ readonly missingLegNodes: readonly string[];
60
+ /** Pelvis drop applied to hips this solve (≤ 0) so over-extended legs can reach. */
61
+ readonly hipOffset: number;
8
62
  }
9
63
  /**
10
64
  * Resolve a requested clip name to the best available clip name.
@@ -79,6 +133,9 @@ export interface GLTFSceneAnimationApplyResult {
79
133
  readonly tracksApplied: number;
80
134
  readonly transformTracksApplied: number;
81
135
  readonly morphWeightTracksApplied: number;
136
+ readonly materialTracksApplied: number;
137
+ readonly lightTracksApplied: number;
138
+ readonly footPlanting?: GLTFootPlantingApplyResult;
82
139
  readonly skinningPalettesUpdated: number;
83
140
  readonly missingTargets: readonly string[];
84
141
  readonly unsupportedTracks: readonly string[];
@@ -98,6 +155,10 @@ export interface GLTFSceneAnimationClipBindingDiagnostics {
98
155
  readonly boundTrackCount: number;
99
156
  readonly transformTrackCount: number;
100
157
  readonly morphWeightTrackCount: number;
158
+ readonly materialTrackCount: number;
159
+ readonly lightTrackCount: number;
160
+ readonly boundMaterialNames: readonly string[];
161
+ readonly boundLightNames: readonly string[];
101
162
  readonly missingTargetCount: number;
102
163
  readonly unsupportedTrackCount: number;
103
164
  readonly skinningBindingCount: number;
@@ -251,8 +312,18 @@ export declare class GLTFSceneAnimationRuntime {
251
312
  private readonly nodesByName;
252
313
  private readonly morphRenderablesByNodeName;
253
314
  private readonly skinningBindings;
315
+ private footPlanting;
316
+ private footRig;
254
317
  private lastApply?;
255
318
  constructor(options: GLTFSceneAnimationRuntimeOptions);
319
+ /**
320
+ * Enable, replace, or clear (undefined) the foot-planting post-pass. Replacing the leg
321
+ * set, ground, or solve parameters resets foot-lock state so a stale lock can never drag
322
+ * a foot after retargeting. A matrix-only refresh (same shape, new `worldFromLocal`)
323
+ * keeps locks: the engine re-sends the model matrix every frame because time-animated
324
+ * model nodes move, and world-space locks stay valid across that refresh.
325
+ */
326
+ setFootPlanting(config: GLTFootPlantingConfig | undefined): void;
256
327
  applyClipByName(name: string, time: number): GLTFSceneAnimationApplyResult;
257
328
  /** Names of every clip registered on this runtime, in declaration order. */
258
329
  clipNames(): readonly string[];
@@ -289,6 +360,28 @@ export declare class GLTFSceneAnimationRuntime {
289
360
  snapshot(): GLTFSceneAnimationRuntimeSnapshot;
290
361
  inspectClipBindings(name?: string): readonly GLTFSceneAnimationClipBindingDiagnostics[];
291
362
  reindexScene(): void;
363
+ private findSceneLight;
364
+ /**
365
+ * Foot-planting post-pass (E2): solves the configured leg chains against the ground and
366
+ * writes the solved hip/knee/ankle world positions back onto the skeleton. Position-only
367
+ * write-back (rotations stay as animated); missing leg nodes are reported in
368
+ * `missingLegNodes` and skipped, never faked. Returns undefined when unconfigured.
369
+ */
370
+ private applyFootPlanting;
371
+ /**
372
+ * Applies one sampled `material:<name>.<leaf-path>` value to the live material sink.
373
+ * Returns false (→ missing target, diagnosed) when no sink resolves, the leaf maps to no
374
+ * renderer uniform, or the value shape is wrong. Throws on a sampled value that is not
375
+ * finite, matching the node-path converters below.
376
+ */
377
+ private applyMaterialTrackValue;
378
+ /**
379
+ * Applies one sampled `light:<name>.<leaf>` value to the live scene light of that name.
380
+ * The loader instantiates each node-referenced `KHR_lights_punctual` light as a scene light
381
+ * carrying its node's name; extension-defined lights no node references have no scene object,
382
+ * so a light track matching no scene light is reported missing (diagnosed, never silent).
383
+ */
384
+ private applyLightTrackValue;
292
385
  private refreshSkinningPalettes;
293
386
  private inspectClipBinding;
294
387
  private applySampledTargets;
@@ -1 +1 @@
1
- {"version":3,"file":"GLTFAnimationRuntime.d.ts","sourceRoot":"","sources":["../../../../packages/assets/src/GLTFAnimationRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GLTFAnimationRuntime.d.ts","sourceRoot":"","sources":["../../../../packages/assets/src/GLTFAnimationRuntime.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { AnimationAction, AnimationClip, AnimationMixer, normalizeQuat, slerpQuat, solveTwoBoneIk } from "@aura3d/animation";
1
+ import { AnimationAction, AnimationClip, AnimationMixer, createFootIkRig, normalizeQuat, slerpQuat, solveTwoBoneIk } from "@aura3d/animation";
2
2
  import { invertMat4, MAX_RENDERABLE_SKINNING_JOINTS, multiplyMat4, Renderable, Scene, transformPoint } from "@aura3d/scene";
3
3
  /**
4
4
  * Synonym groups for fuzzy clip-name matching. Real catalog assets label the same
@@ -259,6 +259,8 @@ export class GLTFSceneAnimationRuntime {
259
259
  nodesByName = new Map();
260
260
  morphRenderablesByNodeName = new Map();
261
261
  skinningBindings = [];
262
+ footPlanting;
263
+ footRig;
262
264
  lastApply;
263
265
  constructor(options) {
264
266
  this.options = options;
@@ -266,6 +268,24 @@ export class GLTFSceneAnimationRuntime {
266
268
  this.clipsByName.set(clip.name, clip);
267
269
  }
268
270
  this.reindexScene();
271
+ if (options.footPlanting)
272
+ this.setFootPlanting(options.footPlanting);
273
+ }
274
+ /**
275
+ * Enable, replace, or clear (undefined) the foot-planting post-pass. Replacing the leg
276
+ * set, ground, or solve parameters resets foot-lock state so a stale lock can never drag
277
+ * a foot after retargeting. A matrix-only refresh (same shape, new `worldFromLocal`)
278
+ * keeps locks: the engine re-sends the model matrix every frame because time-animated
279
+ * model nodes move, and world-space locks stay valid across that refresh.
280
+ */
281
+ setFootPlanting(config) {
282
+ if (config !== undefined && config.legs.length === 0) {
283
+ throw new Error("glTF foot planting requires at least one leg.");
284
+ }
285
+ if (!sameFootPlantingShape(this.footPlanting, config)) {
286
+ this.footRig = undefined;
287
+ }
288
+ this.footPlanting = config;
269
289
  }
270
290
  applyClipByName(name, time) {
271
291
  const clip = this.clipsByName.get(name);
@@ -337,7 +357,8 @@ export class GLTFSceneAnimationRuntime {
337
357
  unsupportedTracks.push(track.target);
338
358
  continue;
339
359
  }
340
- if (!clipMaskAllowsNode(sample.mask, target.nodeName))
360
+ // Bone masks filter node tracks only; material/light property tracks always apply.
361
+ if (target.kind === "node" && !clipMaskAllowsNode(sample.mask, target.nodeName))
341
362
  continue;
342
363
  blendInto(accumulators, track.target, track.valueType, track.sample(wrappedTime), weight, sample.additive === true);
343
364
  }
@@ -534,6 +555,150 @@ export class GLTFSceneAnimationRuntime {
534
555
  }
535
556
  }
536
557
  }
558
+ findSceneLight(name) {
559
+ return this.options.scene.collectLights().find((light) => light.name === name);
560
+ }
561
+ /**
562
+ * Foot-planting post-pass (E2): solves the configured leg chains against the ground and
563
+ * writes the solved hip/knee/ankle world positions back onto the skeleton. Position-only
564
+ * write-back (rotations stay as animated); missing leg nodes are reported in
565
+ * `missingLegNodes` and skipped, never faked. Returns undefined when unconfigured.
566
+ */
567
+ applyFootPlanting() {
568
+ const config = this.footPlanting;
569
+ if (!config)
570
+ return undefined;
571
+ this.options.scene.updateWorldTransforms();
572
+ // Actor-local → world for the solve, world → actor-local for write-back. The rig and
573
+ // the ground both speak world space (meters); the skeleton may live in import units
574
+ // (centimeters). Points convert through the matrix pair; hipOffset rides along inside
575
+ // the converted hip target point so any affine (scale, rotation, centering) is exact.
576
+ const toWorld = config.worldFromLocal;
577
+ const toLocal = toWorld ? invertMat4(toWorld) : undefined;
578
+ const solvePoint = (point) => (toWorld ? transformPoint(toWorld, point) : point);
579
+ // Solved legs arrive as readonly tuples; copy into mutable points for the transform.
580
+ const actorPoint = (point) => {
581
+ const mutable = [point[0], point[1], point[2]];
582
+ return toLocal ? transformPoint(toLocal, mutable) : mutable;
583
+ };
584
+ const missingLegNodes = [];
585
+ const resolved = [];
586
+ for (const leg of config.legs) {
587
+ const hip = this.nodesByName.get(leg.hip)?.[0];
588
+ const knee = this.nodesByName.get(leg.knee)?.[0];
589
+ const ankle = this.nodesByName.get(leg.ankle)?.[0];
590
+ if (!hip)
591
+ missingLegNodes.push(`${leg.side}:hip:${leg.hip}`);
592
+ if (!knee)
593
+ missingLegNodes.push(`${leg.side}:knee:${leg.knee}`);
594
+ if (!ankle)
595
+ missingLegNodes.push(`${leg.side}:ankle:${leg.ankle}`);
596
+ if (!hip || !knee || !ankle)
597
+ continue;
598
+ resolved.push({ side: leg.side, hip, knee, ankle, pole: leg.pole });
599
+ }
600
+ if (resolved.length === 0) {
601
+ return { groundedFeet: 0, averageTargetError: 0, lockedSides: [], missingLegNodes, hipOffset: 0 };
602
+ }
603
+ if (!this.footRig) {
604
+ this.footRig = createFootIkRig({
605
+ legs: resolved.map((entry) => ({
606
+ side: entry.side,
607
+ hip: solvePoint(worldPosition(entry.hip)),
608
+ knee: solvePoint(worldPosition(entry.knee)),
609
+ ankle: solvePoint(worldPosition(entry.ankle)),
610
+ ...(entry.pole ? { pole: entry.pole } : {})
611
+ })),
612
+ raycaster: config.ground,
613
+ ...(config.ankleHeight !== undefined ? { ankleHeight: config.ankleHeight } : {}),
614
+ ...(config.rayStartHeight !== undefined ? { rayStartHeight: config.rayStartHeight } : {}),
615
+ ...(config.maxRayDistance !== undefined ? { maxRayDistance: config.maxRayDistance } : {}),
616
+ ...(config.plantThreshold !== undefined ? { plantThreshold: config.plantThreshold } : {}),
617
+ ...(config.hipDropFactor !== undefined ? { hipDropFactor: config.hipDropFactor } : {})
618
+ });
619
+ }
620
+ const solved = this.footRig.solveFootPlacement({
621
+ legs: resolved.map((entry) => ({
622
+ side: entry.side,
623
+ hip: solvePoint(worldPosition(entry.hip)),
624
+ knee: solvePoint(worldPosition(entry.knee)),
625
+ ankle: solvePoint(worldPosition(entry.ankle)),
626
+ ...(entry.pole ? { pole: entry.pole } : {})
627
+ }))
628
+ });
629
+ for (const foot of solved.feet) {
630
+ const entry = resolved.find((candidate) => candidate.side === foot.side);
631
+ if (!entry)
632
+ continue;
633
+ // The rig returns the pelvis drop separately: apply it to the hip so an over-extended
634
+ // leg can reach its planted foot. Solved knee/ankle targets already account for the
635
+ // drop — the rig re-solves over-extended legs from the dropped hip — so they write
636
+ // back directly; a leg that needed no drop keeps phase-one targets and lets its knee
637
+ // absorb the pelvis motion by bending, the natural single-pelvis compromise.
638
+ // Refresh down the chain after each write: setWorldPosition reads the parent's world
639
+ // matrix, so the knee must see the new hip world before its own write (same for ankle).
640
+ // Solved targets are world-space; convert to actor-local for the write-back.
641
+ const hipTarget = actorPoint([foot.hip[0], foot.hip[1] + solved.hipOffset, foot.hip[2]]);
642
+ setWorldPosition(entry.hip, [hipTarget[0], hipTarget[1], hipTarget[2]]);
643
+ entry.hip.updateWorldTransform();
644
+ const kneeTarget = actorPoint(foot.knee);
645
+ setWorldPosition(entry.knee, [kneeTarget[0], kneeTarget[1], kneeTarget[2]]);
646
+ entry.knee.updateWorldTransform();
647
+ const ankleTarget = actorPoint(foot.ankle);
648
+ setWorldPosition(entry.ankle, [ankleTarget[0], ankleTarget[1], ankleTarget[2]]);
649
+ }
650
+ this.options.scene.updateWorldTransforms();
651
+ return {
652
+ groundedFeet: solved.groundedFeet,
653
+ averageTargetError: solved.averageTargetError,
654
+ lockedSides: solved.feet.filter((foot) => foot.locked).map((foot) => foot.side),
655
+ missingLegNodes,
656
+ hipOffset: solved.hipOffset
657
+ };
658
+ }
659
+ /**
660
+ * Applies one sampled `material:<name>.<leaf-path>` value to the live material sink.
661
+ * Returns false (→ missing target, diagnosed) when no sink resolves, the leaf maps to no
662
+ * renderer uniform, or the value shape is wrong. Throws on a sampled value that is not
663
+ * finite, matching the node-path converters below.
664
+ */
665
+ applyMaterialTrackValue(materialName, leafPath, value, trackTarget) {
666
+ const parameters = materialParametersForLeaf(leafPath);
667
+ const sink = this.options.resolveAnimationMaterial?.(materialName);
668
+ if (parameters === undefined || sink === undefined)
669
+ return false;
670
+ const numeric = asMaterialLeafValue(value, trackTarget);
671
+ for (const parameter of parameters) {
672
+ sink.setAnimationParameter(parameter, numeric);
673
+ }
674
+ return true;
675
+ }
676
+ /**
677
+ * Applies one sampled `light:<name>.<leaf>` value to the live scene light of that name.
678
+ * The loader instantiates each node-referenced `KHR_lights_punctual` light as a scene light
679
+ * carrying its node's name; extension-defined lights no node references have no scene object,
680
+ * so a light track matching no scene light is reported missing (diagnosed, never silent).
681
+ */
682
+ applyLightTrackValue(lightName, leaf, value, trackTarget) {
683
+ if (lightLeafApplies(leaf) === false)
684
+ return false;
685
+ const light = this.findSceneLight(lightName);
686
+ if (!light)
687
+ return false;
688
+ if (leaf === "intensity") {
689
+ light.intensity = asScalar(value, trackTarget);
690
+ return true;
691
+ }
692
+ if (leaf === "color") {
693
+ light.color = asVec3(value, trackTarget);
694
+ return true;
695
+ }
696
+ const rangeHolder = light;
697
+ if (typeof rangeHolder.range !== "number")
698
+ return false;
699
+ light.range = asPositiveScalar(value, trackTarget);
700
+ return true;
701
+ }
537
702
  refreshSkinningPalettes() {
538
703
  if (this.skinningBindings.length === 0) {
539
704
  return { updated: 0, missingTargets: [] };
@@ -571,6 +736,10 @@ export class GLTFSceneAnimationRuntime {
571
736
  let boundTrackCount = 0;
572
737
  let transformTrackCount = 0;
573
738
  let morphWeightTrackCount = 0;
739
+ let materialTrackCount = 0;
740
+ let lightTrackCount = 0;
741
+ const boundMaterialNames = new Set();
742
+ const boundLightNames = new Set();
574
743
  const boundNodeNames = new Set();
575
744
  const missingTargets = new Set();
576
745
  const unsupportedTracks = new Set();
@@ -581,6 +750,26 @@ export class GLTFSceneAnimationRuntime {
581
750
  continue;
582
751
  }
583
752
  supportedTrackCount += 1;
753
+ if (target.kind === "material") {
754
+ materialTrackCount += 1;
755
+ if (materialParametersForLeaf(target.leaf) === undefined || this.options.resolveAnimationMaterial?.(target.materialName) === undefined) {
756
+ missingTargets.add(track.target);
757
+ continue;
758
+ }
759
+ boundTrackCount += 1;
760
+ boundMaterialNames.add(target.materialName);
761
+ continue;
762
+ }
763
+ if (target.kind === "light") {
764
+ lightTrackCount += 1;
765
+ if (lightLeafApplies(target.leaf) === false || this.findSceneLight(target.lightName) === undefined) {
766
+ missingTargets.add(track.target);
767
+ continue;
768
+ }
769
+ boundTrackCount += 1;
770
+ boundLightNames.add(target.lightName);
771
+ continue;
772
+ }
584
773
  if (target.path === "weights") {
585
774
  morphWeightTrackCount += 1;
586
775
  const renderables = this.morphRenderablesByNodeName.get(target.nodeName) ?? [];
@@ -608,6 +797,10 @@ export class GLTFSceneAnimationRuntime {
608
797
  boundTrackCount,
609
798
  transformTrackCount,
610
799
  morphWeightTrackCount,
800
+ materialTrackCount,
801
+ lightTrackCount,
802
+ boundMaterialNames: [...boundMaterialNames].sort(),
803
+ boundLightNames: [...boundLightNames].sort(),
611
804
  missingTargetCount: missingTargets.size,
612
805
  unsupportedTrackCount: unsupportedTracks.size,
613
806
  skinningBindingCount: this.skinningBindings.length,
@@ -620,12 +813,32 @@ export class GLTFSceneAnimationRuntime {
620
813
  applySampledTargets(clipName, time, sampled, blendedClipCount) {
621
814
  let transformTracksApplied = 0;
622
815
  let morphWeightTracksApplied = 0;
816
+ let materialTracksApplied = 0;
817
+ let lightTracksApplied = 0;
623
818
  const missingTargets = [];
624
819
  for (const [trackTarget, value] of sampled.sampledTargets) {
625
820
  const target = parseAnimationTarget(trackTarget);
626
821
  if (!target) {
627
822
  continue;
628
823
  }
824
+ if (target.kind === "material") {
825
+ if (this.applyMaterialTrackValue(target.materialName, target.leaf, value, trackTarget)) {
826
+ materialTracksApplied += 1;
827
+ }
828
+ else {
829
+ missingTargets.push(trackTarget);
830
+ }
831
+ continue;
832
+ }
833
+ if (target.kind === "light") {
834
+ if (this.applyLightTrackValue(target.lightName, target.leaf, value, trackTarget)) {
835
+ lightTracksApplied += 1;
836
+ }
837
+ else {
838
+ missingTargets.push(trackTarget);
839
+ }
840
+ continue;
841
+ }
629
842
  if (target.path === "weights") {
630
843
  const renderables = this.morphRenderablesByNodeName.get(target.nodeName) ?? [];
631
844
  if (renderables.length === 0) {
@@ -650,14 +863,18 @@ export class GLTFSceneAnimationRuntime {
650
863
  transformTracksApplied += 1;
651
864
  }
652
865
  this.options.scene.updateWorldTransforms();
866
+ const footPlanting = this.applyFootPlanting();
653
867
  const skinning = this.refreshSkinningPalettes();
654
868
  return {
655
869
  clipName,
656
870
  time,
657
871
  ...(blendedClipCount === undefined ? {} : { blendedClipCount }),
658
- tracksApplied: transformTracksApplied + morphWeightTracksApplied,
872
+ tracksApplied: transformTracksApplied + morphWeightTracksApplied + materialTracksApplied + lightTracksApplied,
659
873
  transformTracksApplied,
660
874
  morphWeightTracksApplied,
875
+ materialTracksApplied,
876
+ lightTracksApplied,
877
+ ...(footPlanting === undefined ? {} : { footPlanting }),
661
878
  skinningPalettesUpdated: skinning.updated,
662
879
  missingTargets: [...missingTargets, ...skinning.missingTargets],
663
880
  unsupportedTracks: sampled.unsupportedTracks
@@ -867,7 +1084,27 @@ export class GLTFSceneAnimationMixerBinding {
867
1084
  export function createGLTFSceneAnimationMixer(options) {
868
1085
  return new GLTFSceneAnimationMixerBinding(options);
869
1086
  }
1087
+ /**
1088
+ * Pointer-bound leaf paths (`material:`/`light:`) use the FIRST dot as the name/leaf split:
1089
+ * the binding emits `material:<name>.<property-path…>` where the property path itself may
1090
+ * contain dots (`pbrMetallicRoughness.baseColorFactor`), while glTF material/light names with
1091
+ * dots are rare. Names containing "." therefore resolve by first segment and are documented
1092
+ * as unsupported in the animation-pointer limits.
1093
+ */
870
1094
  function parseAnimationTarget(target) {
1095
+ for (const prefix of ["material:", "light:"]) {
1096
+ if (target.startsWith(prefix)) {
1097
+ const rest = target.slice(prefix.length);
1098
+ const separator = rest.indexOf(".");
1099
+ if (separator <= 0 || separator === rest.length - 1)
1100
+ return undefined;
1101
+ const name = rest.slice(0, separator);
1102
+ const leaf = rest.slice(separator + 1);
1103
+ return prefix === "material:"
1104
+ ? { kind: "material", materialName: name, leaf }
1105
+ : { kind: "light", lightName: name, leaf };
1106
+ }
1107
+ }
871
1108
  const separator = target.lastIndexOf(".");
872
1109
  if (separator <= 0 || separator === target.length - 1) {
873
1110
  return undefined;
@@ -877,10 +1114,44 @@ function parseAnimationTarget(target) {
877
1114
  return undefined;
878
1115
  }
879
1116
  return {
1117
+ kind: "node",
880
1118
  nodeName: target.slice(0, separator),
881
1119
  path
882
1120
  };
883
1121
  }
1122
+ /**
1123
+ * Maps an animation-pointer material leaf path to the renderer uniform parameters it drives.
1124
+ * Only leaves with uniforms the production bridge provably writes (see TypedGLBActor tint
1125
+ * path: `u_baseColor`, `u_baseColorFactor`, `u_emissiveColor`, `u_emissiveFactor`,
1126
+ * `u_emissiveStrength`, `u_metallic`, `u_roughness`) are supported; every other leaf stays
1127
+ * diagnostic-only, preserving diagnose-and-drop for the unmapped remainder. Matches on the
1128
+ * last path segment so `pbrMetallicRoughness.baseColorFactor` and `baseColorFactor` agree.
1129
+ */
1130
+ function materialParametersForLeaf(leafPath) {
1131
+ const leaf = leafPath.slice(leafPath.lastIndexOf(".") + 1);
1132
+ switch (leaf) {
1133
+ case "baseColorFactor":
1134
+ return ["u_baseColorFactor", "u_baseColor"];
1135
+ case "emissiveFactor":
1136
+ return ["u_emissiveFactor", "u_emissiveColor"];
1137
+ case "metallicFactor":
1138
+ return ["u_metallic"];
1139
+ case "roughnessFactor":
1140
+ return ["u_roughness"];
1141
+ case "emissiveStrength":
1142
+ return ["u_emissiveStrength"];
1143
+ case "clearcoatFactor":
1144
+ return ["u_clearcoatFactor"];
1145
+ case "clearcoatRoughnessFactor":
1146
+ return ["u_clearcoatRoughnessFactor"];
1147
+ default:
1148
+ return undefined;
1149
+ }
1150
+ }
1151
+ /** Light leaves the runtime can drive on a live scene light. Anything else stays diagnostic-only. */
1152
+ function lightLeafApplies(leaf) {
1153
+ return leaf === "intensity" || leaf === "color" || leaf === "range";
1154
+ }
884
1155
  function resolveIKSkin(skins, skinName) {
885
1156
  if (skinName === undefined) {
886
1157
  const skin = skins.find((candidate) => candidate.jointNames.length >= 3);
@@ -907,6 +1178,40 @@ function firstTwoBoneJointChain(skin) {
907
1178
  }
908
1179
  return [root, mid, end];
909
1180
  }
1181
+ /**
1182
+ * True when two foot-planting configs solve the same rig the same way. The world matrix is
1183
+ * deliberately excluded: the engine refreshes `worldFromLocal` every frame (time-animated
1184
+ * model nodes move) and that refresh must not reset world-space foot locks.
1185
+ */
1186
+ function sameFootPlantingShape(previous, next) {
1187
+ if (previous === next)
1188
+ return true;
1189
+ if (!previous || !next)
1190
+ return false;
1191
+ if (previous.ground !== next.ground)
1192
+ return false;
1193
+ if (previous.ankleHeight !== next.ankleHeight)
1194
+ return false;
1195
+ if (previous.rayStartHeight !== next.rayStartHeight)
1196
+ return false;
1197
+ if (previous.maxRayDistance !== next.maxRayDistance)
1198
+ return false;
1199
+ if (previous.plantThreshold !== next.plantThreshold)
1200
+ return false;
1201
+ if (previous.hipDropFactor !== next.hipDropFactor)
1202
+ return false;
1203
+ if (previous.legs.length !== next.legs.length)
1204
+ return false;
1205
+ return previous.legs.every((leg, index) => {
1206
+ const other = next.legs[index];
1207
+ return other !== undefined
1208
+ && leg.side === other.side
1209
+ && leg.hip === other.hip
1210
+ && leg.knee === other.knee
1211
+ && leg.ankle === other.ankle
1212
+ && (leg.pole ?? []).join(",") === (other.pole ?? []).join(",");
1213
+ });
1214
+ }
910
1215
  function worldPosition(node) {
911
1216
  node.updateWorldTransform();
912
1217
  return [node.transform.worldMatrix[12], node.transform.worldMatrix[13], node.transform.worldMatrix[14]];
@@ -967,6 +1272,26 @@ function asNumberArray(value) {
967
1272
  }
968
1273
  return [...value];
969
1274
  }
1275
+ function asScalar(value, target) {
1276
+ if (typeof value !== "number" || !Number.isFinite(value)) {
1277
+ throw new Error(`glTF animation track "${target}" sampled an invalid scalar.`);
1278
+ }
1279
+ return value;
1280
+ }
1281
+ function asPositiveScalar(value, target) {
1282
+ const scalar = asScalar(value, target);
1283
+ if (!(scalar > 0)) {
1284
+ throw new Error(`glTF animation track "${target}" sampled a non-positive range.`);
1285
+ }
1286
+ return scalar;
1287
+ }
1288
+ function asMaterialLeafValue(value, target) {
1289
+ if (typeof value === "number")
1290
+ return asScalar(value, target);
1291
+ if (Array.isArray(value))
1292
+ return asNumberArray(value);
1293
+ throw new Error(`glTF animation track "${target}" sampled an invalid material value.`);
1294
+ }
970
1295
  function sampleClipTracks(clip, time, weight, additive) {
971
1296
  const accumulators = new Map();
972
1297
  const unsupportedTracks = [];