@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.
- package/dist/GLTFAnimationRuntime.d.ts +95 -2
- package/dist/GLTFAnimationRuntime.d.ts.map +1 -1
- package/dist/GLTFAnimationRuntime.js +328 -3
- package/dist/GLTFAnimationRuntime.js.map +1 -1
- package/dist/GLTFExtensionSupport.js +2 -2
- package/dist/GLTFExtensionSupport.js.map +1 -1
- package/dist/GLTFLoader.d.ts +360 -1
- package/dist/GLTFLoader.d.ts.map +1 -1
- package/dist/GLTFLoader.js +197 -1
- package/dist/GLTFLoader.js.map +1 -1
- package/dist/KTX2BasisTextureTranscoder.d.ts +39 -0
- package/dist/KTX2BasisTextureTranscoder.d.ts.map +1 -1
- package/dist/KTX2BasisTextureTranscoder.js +70 -0
- package/dist/KTX2BasisTextureTranscoder.js.map +1 -1
- package/dist/TexturePipeline.d.ts +20 -0
- package/dist/TexturePipeline.d.ts.map +1 -1
- package/dist/TexturePipeline.js +20 -0
- package/dist/TexturePipeline.js.map +1 -1
- package/dist/TextureStreaming.d.ts +30 -0
- package/dist/TextureStreaming.d.ts.map +1 -1
- package/dist/TextureStreaming.js +53 -0
- package/dist/TextureStreaming.js.map +1 -1
- package/dist/browser-index.d.ts +7 -3
- package/dist/browser-index.d.ts.map +1 -1
- package/dist/browser-index.js +3 -1
- package/dist/browser-index.js.map +1 -1
- package/dist/gltf-runtime.d.ts +1 -1
- package/dist/gltf-runtime.d.ts.map +1 -1
- package/dist/gltf-runtime.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/loaders/HDRLoader.d.ts +40 -0
- package/dist/loaders/HDRLoader.d.ts.map +1 -1
- package/dist/loaders/HDRLoader.js +158 -0
- package/dist/loaders/HDRLoader.js.map +1 -1
- 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
|
-
|
|
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 = [];
|