@zephyr3d/scene 0.9.26 → 0.9.27
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/animation/animationset.js +92 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/joint_dynamics/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- package/dist/animation/skeleton.js +21 -1
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/asset/model.js +6 -2
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +75 -23
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +4764 -3600
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/material.js +296 -296
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -1
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/shader/helper.js +404 -3
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/water.js +2057 -72
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/motionblur.js +663 -58
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +46 -44
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/sss.js +30 -2
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/render/abuffer_oit.js +37 -37
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +156 -5
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +1 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +49 -49
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +3 -3
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +57 -15
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +127 -20
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +6 -3
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/render_queue.js +36 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +4 -0
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +1 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +318 -9
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/underwater.js +624 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/water_caustics.js +1380 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/weightedblended_oit.js +33 -33
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/water.js +540 -4
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/water.js +22 -19
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +56 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/shadow_region.js +49 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +31 -2
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +53 -25
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1101 -21
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/shprojector.js +87 -87
- package/dist/utility/shprojector.js.map +1 -1
- package/package.json +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +0 -41
- package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
- package/dist/shaders/ssgi.js +0 -63
- package/dist/shaders/ssgi.js.map +0 -1
- package/dist/shaders/ssgi_reprojection.js +0 -118
- package/dist/shaders/ssgi_reprojection.js.map +0 -1
|
@@ -236,6 +236,8 @@ function cloneInterpolator(src) {
|
|
|
236
236
|
function createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint, translationRotation, translationScale, translationCorrection, translationAxisLocks, rotationCorrection) {
|
|
237
237
|
const si = srcSkeleton.joints.indexOf(srcJoint);
|
|
238
238
|
const di = dstSkeleton.joints.indexOf(dstJoint);
|
|
239
|
+
const srcReferencePose = srcSkeleton.retargetPose[si];
|
|
240
|
+
const dstReferencePose = dstSkeleton.retargetPose[di];
|
|
239
241
|
const srcBindPose = srcSkeleton.bindPose[si];
|
|
240
242
|
const dstBindPose = dstSkeleton.bindPose[di];
|
|
241
243
|
const srcLen = srcBindPose.position.magnitude;
|
|
@@ -244,10 +246,10 @@ function createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint,
|
|
|
244
246
|
dstNode: dstJoint,
|
|
245
247
|
dstJointIndex: di,
|
|
246
248
|
srcNode: srcJoint,
|
|
247
|
-
srcBindRotInv: Quaternion.inverse(
|
|
248
|
-
dstBindRot:
|
|
249
|
+
srcBindRotInv: Quaternion.inverse(srcReferencePose.rotation),
|
|
250
|
+
dstBindRot: dstReferencePose.rotation.clone(),
|
|
249
251
|
rotationCorrection,
|
|
250
|
-
srcBindPos:
|
|
252
|
+
srcBindPos: srcReferencePose.position.clone(),
|
|
251
253
|
dstBindPos: dstBindPose.position.clone(),
|
|
252
254
|
translationScale: translationScale ?? (srcLen > 1e-6 ? dstLen / srcLen : 1),
|
|
253
255
|
translationRotation,
|
|
@@ -275,15 +277,14 @@ function getBindPosition(skeleton, joint) {
|
|
|
275
277
|
const index = skeleton.joints.indexOf(joint);
|
|
276
278
|
return index >= 0 ? skeleton.bindPose[index].position : null;
|
|
277
279
|
}
|
|
278
|
-
function
|
|
280
|
+
function getSkeletonLocalReferenceTransform(skeleton, node, jointSet, cache) {
|
|
279
281
|
let transform = cache.get(node);
|
|
280
282
|
if (!transform) {
|
|
281
|
-
const
|
|
282
|
-
const
|
|
283
|
-
const rotation = bindPose.rotation.clone();
|
|
283
|
+
const position = getRigBindPoseForNode(skeleton, node).position.clone();
|
|
284
|
+
const rotation = getRigReferencePoseForNode(skeleton, node).rotation.clone();
|
|
284
285
|
const parent = node.parent;
|
|
285
286
|
if (parent && jointSet.has(parent)) {
|
|
286
|
-
const parentTransform =
|
|
287
|
+
const parentTransform = getSkeletonLocalReferenceTransform(skeleton, parent, jointSet, cache);
|
|
287
288
|
parentTransform.rotation.transform(position, position);
|
|
288
289
|
position.addBy(parentTransform.position);
|
|
289
290
|
Quaternion.multiply(parentTransform.rotation, rotation, rotation);
|
|
@@ -345,7 +346,7 @@ function getHumanoidLateralXSign(skeleton) {
|
|
|
345
346
|
if (!left || !right || !jointSet.has(left) || !jointSet.has(right)) {
|
|
346
347
|
continue;
|
|
347
348
|
}
|
|
348
|
-
const dx =
|
|
349
|
+
const dx = getSkeletonLocalReferenceTransform(skeleton, left, jointSet, cache).position.x - getSkeletonLocalReferenceTransform(skeleton, right, jointSet, cache).position.x;
|
|
349
350
|
if (Math.abs(dx) > 1e-5) {
|
|
350
351
|
score += dx;
|
|
351
352
|
weight++;
|
|
@@ -381,7 +382,7 @@ function getHumanoidForwardZSign(skeleton) {
|
|
|
381
382
|
if (!foot || !toes || !jointSet.has(foot) || !jointSet.has(toes)) {
|
|
382
383
|
continue;
|
|
383
384
|
}
|
|
384
|
-
const dz =
|
|
385
|
+
const dz = getSkeletonLocalReferenceTransform(skeleton, toes, jointSet, cache).position.z - getSkeletonLocalReferenceTransform(skeleton, foot, jointSet, cache).position.z;
|
|
385
386
|
if (Math.abs(dz) > 1e-5) {
|
|
386
387
|
score += dz;
|
|
387
388
|
weight++;
|
|
@@ -420,6 +421,13 @@ function getHumanoidRotationCorrection(srcSkeleton, dstSkeleton, srcSignSkeleton
|
|
|
420
421
|
z: determinant * axisZSign
|
|
421
422
|
};
|
|
422
423
|
}
|
|
424
|
+
function getRigReferencePoseForNode(skeleton, node) {
|
|
425
|
+
return skeleton.getRetargetPoseForJoint(node) ?? (node === skeleton.rootJoint ? skeleton.rootBindPose : {
|
|
426
|
+
position: node.position,
|
|
427
|
+
rotation: node.rotation,
|
|
428
|
+
scale: node.scale
|
|
429
|
+
});
|
|
430
|
+
}
|
|
423
431
|
function getRigBindPoseForNode(skeleton, node) {
|
|
424
432
|
return skeleton.getBindPoseForJoint(node) ?? (node === skeleton.rootJoint ? skeleton.rootBindPose : {
|
|
425
433
|
position: node.position,
|
|
@@ -463,11 +471,36 @@ function getHumanoidRootMotionScale(srcSkeleton, dstSkeleton) {
|
|
|
463
471
|
function findTranslationTrack(tracks) {
|
|
464
472
|
return tracks?.find((track)=>track instanceof NodeTranslationTrack) ?? null;
|
|
465
473
|
}
|
|
466
|
-
function
|
|
474
|
+
function isTranslationTrackAnimated(track) {
|
|
475
|
+
const inputs = track.interpolator.inputs;
|
|
476
|
+
const outputs = track.interpolator.outputs;
|
|
477
|
+
const cubic = track.interpolator.mode === 'cubicspline';
|
|
478
|
+
const stride = cubic ? 9 : 3;
|
|
479
|
+
const valueOffset = cubic ? 3 : 0;
|
|
480
|
+
if (inputs.length < 2) {
|
|
481
|
+
return false;
|
|
482
|
+
}
|
|
483
|
+
const first = [
|
|
484
|
+
outputs[valueOffset],
|
|
485
|
+
outputs[valueOffset + 1],
|
|
486
|
+
outputs[valueOffset + 2]
|
|
487
|
+
];
|
|
488
|
+
let maxValue = Math.max(1, Math.abs(first[0]), Math.abs(first[1]), Math.abs(first[2]));
|
|
489
|
+
let maxDelta = 0;
|
|
490
|
+
for(let i = 1; i < inputs.length; i++){
|
|
491
|
+
const base = i * stride + valueOffset;
|
|
492
|
+
for(let axis = 0; axis < 3; axis++){
|
|
493
|
+
maxValue = Math.max(maxValue, Math.abs(outputs[base + axis]));
|
|
494
|
+
maxDelta = Math.max(maxDelta, Math.abs(outputs[base + axis] - first[axis]));
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return maxDelta > maxValue * 1e-5;
|
|
498
|
+
}
|
|
499
|
+
function findAncestorTranslationTrack(clip, node, modelRoot, animatedOnly = false) {
|
|
467
500
|
let current = node.parent;
|
|
468
501
|
while(current){
|
|
469
502
|
const track = findTranslationTrack(clip.tracks.get(current));
|
|
470
|
-
if (track) {
|
|
503
|
+
if (track && (!animatedOnly || isTranslationTrackAnimated(track))) {
|
|
471
504
|
return {
|
|
472
505
|
node: current,
|
|
473
506
|
track
|
|
@@ -667,18 +700,20 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
667
700
|
const remapsByDstNode = new Map();
|
|
668
701
|
const srcJointSet = new Set(srcSkeleton.joints);
|
|
669
702
|
const dstJointSet = new Set(dstSkeleton.joints);
|
|
670
|
-
const
|
|
671
|
-
const
|
|
703
|
+
const srcReferenceRotByNode = new Map();
|
|
704
|
+
const srcBaseRotByNode = new Map();
|
|
705
|
+
const dstReferenceRotByNode = new Map();
|
|
672
706
|
const srcRotationTrackByNode = new Map();
|
|
673
707
|
for(let i = 0; i < srcSkeleton.joints.length; i++){
|
|
674
708
|
const joint = srcSkeleton.joints[i];
|
|
675
|
-
|
|
709
|
+
srcReferenceRotByNode.set(joint, srcSkeleton.retargetPose[i].rotation);
|
|
710
|
+
srcBaseRotByNode.set(joint, srcSkeleton.bindPose[i].rotation);
|
|
676
711
|
const track = findRotationTrack(sourceClip.tracks.get(joint));
|
|
677
712
|
srcRotationTrackByNode.set(joint, track);
|
|
678
713
|
collectTrackTimes(track, times);
|
|
679
714
|
}
|
|
680
715
|
for(let i = 0; i < dstSkeleton.joints.length; i++){
|
|
681
|
-
|
|
716
|
+
dstReferenceRotByNode.set(dstSkeleton.joints[i], dstSkeleton.retargetPose[i].rotation);
|
|
682
717
|
}
|
|
683
718
|
for (const remap of remaps){
|
|
684
719
|
const track = findRotationTrack(sourceClip.tracks.get(remap.srcNode));
|
|
@@ -705,7 +740,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
705
740
|
function getSrcBindWorldRot(node) {
|
|
706
741
|
let rot = srcBindWorldRots.get(node);
|
|
707
742
|
if (!rot) {
|
|
708
|
-
rot = (
|
|
743
|
+
rot = (srcReferenceRotByNode.get(node) ?? Quaternion.identity()).clone();
|
|
709
744
|
const parent = node.parent;
|
|
710
745
|
if (parent && srcJointSet.has(parent)) {
|
|
711
746
|
Quaternion.multiply(getSrcBindWorldRot(parent), rot, rot);
|
|
@@ -719,7 +754,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
719
754
|
function getDstBindWorldRot(node) {
|
|
720
755
|
let rot = dstBindWorldRots.get(node);
|
|
721
756
|
if (!rot) {
|
|
722
|
-
rot = (
|
|
757
|
+
rot = (dstReferenceRotByNode.get(node) ?? Quaternion.identity()).clone();
|
|
723
758
|
const parent = node.parent;
|
|
724
759
|
if (parent && dstJointSet.has(parent)) {
|
|
725
760
|
Quaternion.multiply(getDstBindWorldRot(parent), rot, rot);
|
|
@@ -738,7 +773,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
738
773
|
}
|
|
739
774
|
const parent = node.parent;
|
|
740
775
|
const parentWorldRot = parent && srcJointSet.has(parent) ? getSrcAnimWorldRot(parent, time) : null;
|
|
741
|
-
sampleRotationTrack(srcRotationTrackByNode.get(node) ?? null, time,
|
|
776
|
+
sampleRotationTrack(srcRotationTrackByNode.get(node) ?? null, time, srcBaseRotByNode.get(node) ?? Quaternion.identity(), tmpLocalRot);
|
|
742
777
|
if (parentWorldRot) {
|
|
743
778
|
Quaternion.multiply(parentWorldRot, tmpLocalRot, rot);
|
|
744
779
|
} else {
|
|
@@ -776,7 +811,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
776
811
|
}
|
|
777
812
|
let rot = dstAnimWorldRots.get(parent);
|
|
778
813
|
if (!rot) {
|
|
779
|
-
rot = (
|
|
814
|
+
rot = (dstReferenceRotByNode.get(parent) ?? Quaternion.identity()).clone();
|
|
780
815
|
const parentWorldRot = getDstParentAnimWorldRot(parent, time);
|
|
781
816
|
if (parentWorldRot) {
|
|
782
817
|
Quaternion.multiply(parentWorldRot, rot, rot);
|
|
@@ -802,7 +837,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
802
837
|
}
|
|
803
838
|
}
|
|
804
839
|
for (const remap of remaps){
|
|
805
|
-
if (!rotationTracksByRemap.get(remap)) {
|
|
840
|
+
if (!rotationTracksByRemap.get(remap) && !srcSkeleton.hasRetargetPose && !dstSkeleton.hasRetargetPose) {
|
|
806
841
|
continue;
|
|
807
842
|
}
|
|
808
843
|
const outputs = new Float32Array(outputsByRemap.get(remap));
|
|
@@ -1632,6 +1667,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
1632
1667
|
const options = typeof targetNameOrOptions === 'string' ? copyOptions ?? {} : targetNameOrOptions ?? {};
|
|
1633
1668
|
const destName = typeof targetNameOrOptions === 'string' ? targetNameOrOptions : options.targetName ?? animationName;
|
|
1634
1669
|
const rootMotion = options.rootMotion ?? 'scaled';
|
|
1670
|
+
const hipsTranslation = options.hipsTranslation ?? 'scaled';
|
|
1635
1671
|
const jointTranslations = options.jointTranslations ?? 'skip';
|
|
1636
1672
|
const sourceClip = sourceSet.get(animationName);
|
|
1637
1673
|
if (!sourceClip) {
|
|
@@ -1731,16 +1767,19 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
1731
1767
|
const dstHipsNode = dstSkeleton.humanoidJointMapping.body[HumanoidBodyRig.Hips];
|
|
1732
1768
|
const srcRootNode = srcSkeleton.rootJoint ?? srcHipsNode;
|
|
1733
1769
|
const dstRootNode = dstSkeleton.rootJoint ?? dstHipsNode;
|
|
1770
|
+
const hasSeparateHips = srcRootNode !== srcHipsNode && dstRootNode !== dstHipsNode;
|
|
1734
1771
|
const srcRootRot = computeParentChainRotation(srcRootNode, sourceSet.model, srcSkeleton);
|
|
1735
1772
|
const dstRootRot = computeParentChainRotation(dstRootNode, this._model, dstSkeleton);
|
|
1736
|
-
const
|
|
1737
|
-
const
|
|
1738
|
-
const
|
|
1739
|
-
const srcMotionTrack = srcRootTranslationTrack ?? srcAncestorTranslationTrackInfo?.track ??
|
|
1740
|
-
const srcMotionNode = srcRootTranslationTrack ? srcRootNode : srcAncestorTranslationTrackInfo ? srcAncestorTranslationTrackInfo.node :
|
|
1773
|
+
const rootTrackCandidate = findTranslationTrack(sourceClip.tracks.get(srcRootNode));
|
|
1774
|
+
const srcRootTranslationTrack = rootTrackCandidate && (!hasSeparateHips || isTranslationTrackAnimated(rootTrackCandidate)) ? rootTrackCandidate : null;
|
|
1775
|
+
const srcAncestorTranslationTrackInfo = !srcRootTranslationTrack ? findAncestorTranslationTrack(sourceClip, srcRootNode, sourceSet.model, hasSeparateHips) : null;
|
|
1776
|
+
const srcMotionTrack = srcRootTranslationTrack ?? srcAncestorTranslationTrackInfo?.track ?? null;
|
|
1777
|
+
const srcMotionNode = srcRootTranslationTrack ? srcRootNode : srcAncestorTranslationTrackInfo ? srcAncestorTranslationTrackInfo.node : null;
|
|
1741
1778
|
const srcMotionParentRot = srcMotionNode ? computeParentChainRotation(srcMotionNode, sourceSet.model, srcSkeleton) : srcRootRot;
|
|
1742
1779
|
const rootTranslationRotation = Quaternion.multiply(Quaternion.inverse(dstRootRot), srcMotionParentRot);
|
|
1743
|
-
const
|
|
1780
|
+
const resolveTranslationScale = (mode)=>typeof mode === 'number' ? mode : mode === 'none' ? 1 : getHumanoidRootMotionScale(srcSkeleton, dstSkeleton);
|
|
1781
|
+
const rootTranslationScale = rootMotion === 'scaled' ? resolveTranslationScale(options.rootMotionScale) : 1;
|
|
1782
|
+
const hipsTranslationScale = hipsTranslation === 'scaled' ? resolveTranslationScale(options.hipsTranslationScale) : 1;
|
|
1744
1783
|
const jointRemaps = [];
|
|
1745
1784
|
const jointRemapsByDstSkeleton = new Map([
|
|
1746
1785
|
[
|
|
@@ -1842,9 +1881,14 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
1842
1881
|
if (rootMotion === 'locked') {
|
|
1843
1882
|
dstRootTrack = createConstantTranslationTrack(dstRootBindPose.position);
|
|
1844
1883
|
} else if (srcMotionTrack && srcMotionNode) {
|
|
1845
|
-
const srcMotionBindPose =
|
|
1846
|
-
const
|
|
1884
|
+
const srcMotionBindPose = getRigReferencePoseForNode(srcSkeleton, srcMotionNode);
|
|
1885
|
+
const rootMotionAxisLocks = options.lockRootMotionAxes ?? (hasSeparateHips ? {
|
|
1886
|
+
y: true
|
|
1887
|
+
} : undefined);
|
|
1888
|
+
const rootRemap = createTranslationRetargetRemap(srcMotionNode, dstRootNode, srcMotionBindPose.position, dstRootBindPose.position, dstSkeleton.joints.indexOf(dstRootNode), rootTranslationScale, rootTranslationRotation, humanoidRotationCorrection ?? undefined, rootMotionAxisLocks, humanoidRotationCorrection ?? undefined);
|
|
1847
1889
|
dstRootTrack = retargetTranslationTrack(srcMotionTrack, rootRemap);
|
|
1890
|
+
} else {
|
|
1891
|
+
dstRootTrack = createConstantTranslationTrack(dstRootBindPose.position);
|
|
1848
1892
|
}
|
|
1849
1893
|
if (dstRootTrack) {
|
|
1850
1894
|
dstRootTrack.name = srcMotionTrack?.name ?? 'translation';
|
|
@@ -1853,6 +1897,24 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
1853
1897
|
dstClip.addTrack(dstRootNode, dstRootTrack);
|
|
1854
1898
|
}
|
|
1855
1899
|
}
|
|
1900
|
+
if (hasSeparateHips && hipsTranslation !== 'none') {
|
|
1901
|
+
const srcHipsTrack = findTranslationTrack(sourceClip.tracks.get(srcHipsNode)) ?? (srcSkeleton.hasRetargetPose ? createConstantTranslationTrack(getRigBindPoseForNode(srcSkeleton, srcHipsNode).position) : null);
|
|
1902
|
+
const dstHipsBindPose = getRigBindPoseForNode(dstSkeleton, dstHipsNode);
|
|
1903
|
+
let dstHipsTrack = null;
|
|
1904
|
+
if (hipsTranslation === 'locked') {
|
|
1905
|
+
dstHipsTrack = createConstantTranslationTrack(dstHipsBindPose.position);
|
|
1906
|
+
} else if (srcHipsTrack) {
|
|
1907
|
+
const srcHipsReferencePose = getRigReferencePoseForNode(srcSkeleton, srcHipsNode);
|
|
1908
|
+
const hipsRemap = createTranslationRetargetRemap(srcHipsNode, dstHipsNode, srcHipsReferencePose.position, dstHipsBindPose.position, dstSkeleton.joints.indexOf(dstHipsNode), hipsTranslationScale, undefined, humanoidRotationCorrection ?? undefined, undefined, humanoidRotationCorrection ?? undefined);
|
|
1909
|
+
dstHipsTrack = retargetTranslationTrack(srcHipsTrack, hipsRemap);
|
|
1910
|
+
}
|
|
1911
|
+
if (dstHipsTrack) {
|
|
1912
|
+
dstHipsTrack.name = srcHipsTrack?.name ?? 'translation';
|
|
1913
|
+
dstHipsTrack.target = dstHipsNode.persistentId;
|
|
1914
|
+
dstHipsTrack.jointIndex = dstSkeleton.joints.indexOf(dstHipsNode);
|
|
1915
|
+
dstClip.addTrack(dstHipsNode, dstHipsTrack);
|
|
1916
|
+
}
|
|
1917
|
+
}
|
|
1856
1918
|
for (const [srcNode, srcRemaps] of jointRemapsBySrcNode){
|
|
1857
1919
|
const srcTracks = sourceClip.tracks.get(srcNode);
|
|
1858
1920
|
if (!srcTracks) {
|
|
@@ -1865,7 +1927,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
1865
1927
|
if (srcTrack instanceof NodeRotationTrack || srcTrack instanceof NodeEulerRotationTrack) {
|
|
1866
1928
|
continue;
|
|
1867
1929
|
} else if (srcTrack instanceof NodeTranslationTrack) {
|
|
1868
|
-
if (srcNode === srcRootNode || srcTrack === srcMotionTrack || jointTranslations !== 'preserve') {
|
|
1930
|
+
if (srcNode === srcRootNode || hasSeparateHips && srcNode === srcHipsNode || srcTrack === srcMotionTrack || jointTranslations !== 'preserve') {
|
|
1869
1931
|
continue;
|
|
1870
1932
|
}
|
|
1871
1933
|
dstTrack = retargetTranslationTrack(srcTrack, remap);
|