@zephyr3d/editor 0.3.7 → 0.3.8
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/assets/{index-ySiLtSxz.js → index-BZ1L8ggE.js} +43 -3
- package/dist/assistant/zephyr-types-index.json +13230 -9488
- package/dist/images/icon1024.png +0 -0
- package/dist/index.html +1 -1
- package/dist/modules/zephyr3d_backend-webgl.js +2 -0
- package/dist/modules/zephyr3d_backend-webgl.js.map +1 -1
- package/dist/modules/zephyr3d_backend-webgpu.js +457 -16
- package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
- package/dist/modules/zephyr3d_device.js +27 -0
- package/dist/modules/zephyr3d_device.js.map +1 -1
- package/dist/modules/zephyr3d_loaders.js +208 -1
- package/dist/modules/zephyr3d_loaders.js.map +1 -1
- package/dist/modules/zephyr3d_scene.js +774 -80
- package/dist/modules/zephyr3d_scene.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgl/dist/capabilities_webgl.js +2 -0
- package/dist/vendor/zephyr3d/backend-webgl/dist/capabilities_webgl.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/capabilities_webgpu.js +2 -0
- package/dist/vendor/zephyr3d/backend-webgpu/dist/capabilities_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js +55 -10
- package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/computepass_webgpu.js +4 -0
- package/dist/vendor/zephyr3d/backend-webgpu/dist/computepass_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/device.js +44 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/device.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js +58 -5
- package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/timestamp_query.js +297 -0
- package/dist/vendor/zephyr3d/backend-webgpu/dist/timestamp_query.js.map +1 -0
- package/dist/vendor/zephyr3d/device/dist/base_types.js.map +1 -1
- package/dist/vendor/zephyr3d/device/dist/device.js +27 -0
- package/dist/vendor/zephyr3d/device/dist/device.js.map +1 -1
- package/dist/vendor/zephyr3d/device/dist/index.d.ts +81 -1
- package/dist/vendor/zephyr3d/loaders/dist/gltf/gltf_importer.js +208 -1
- package/dist/vendor/zephyr3d/loaders/dist/gltf/gltf_importer.js.map +1 -1
- package/dist/vendor/zephyr3d/loaders/dist/index.d.ts +8 -0
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js +334 -63
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/animation/morphtargetgrouptrack.js +66 -0
- package/dist/vendor/zephyr3d/scene/dist/animation/morphtargetgrouptrack.js.map +1 -0
- package/dist/vendor/zephyr3d/scene/dist/asset/model.js +9 -0
- package/dist/vendor/zephyr3d/scene/dist/asset/model.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/index.d.ts +260 -4
- package/dist/vendor/zephyr3d/scene/dist/index.js +7 -0
- package/dist/vendor/zephyr3d/scene/dist/index.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/posteffect/sao.js +1 -1
- package/dist/vendor/zephyr3d/scene/dist/posteffect/sao.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/executor.js +270 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js +19 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/types.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/scene.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/scene.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js +2 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js +70 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
- package/package.json +6 -6
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Disposable, makeObservable, releaseObject, retainObject, Vector4, Vector3, DRef, AABB, Frustum, ClipState, Interpolator, Quaternion, randomUUID, DWeakRef, Matrix4x4, nextPowerOf2, Observable, weightedAverage, ObservableVector3, ObservableQuaternion, ASSERT, Ray, Vector2, applyMixins, float2half, objectKeys, halton23, CubeFace, ObservableVector4, castObservable, radian2degree, degree2radian, uint8ArrayToBase64, base64ToUint8Array, mimeTypeOf, clamp01 as clamp01$
|
|
1
|
+
import { Disposable, makeObservable, releaseObject, retainObject, Vector4, Vector3, DRef, AABB, Frustum, ClipState, Interpolator, Quaternion, InterpolatorScalar, randomUUID, DWeakRef, Matrix4x4, nextPowerOf2, Observable, weightedAverage, ObservableVector3, ObservableQuaternion, ASSERT, Ray, Vector2, applyMixins, float2half, objectKeys, halton23, CubeFace, ObservableVector4, castObservable, radian2degree, degree2radian, uint8ArrayToBase64, base64ToUint8Array, mimeTypeOf, clamp01 as clamp01$2, smoothStep, applyPatch, guessMimeType, diff, PRNG, splitStringByGraphemes, packFloat3, isPowerOf2, clamp as clamp$1, Matrix3x3, PathUtils, textToBase64, HttpFS, MemoryFS, objectEntries, flushPendingDisposals } from '@zephyr3d/base';
|
|
2
2
|
import { PBPrimitiveType, matchVertexBuffer, PBInsideFunctionScope, ProgramBuilder, PBShaderExp, isFloatTextureFormat, getVertexAttributeIndex, VERTEX_ATTRIB_POSITION, VERTEX_ATTRIB_TEXCOORD0, getVertexAttributeFormat, hasDepthChannel, PBStructTypeInfo, PBArrayTypeInfo, PBPrimitiveTypeInfo, getVertexFormatComponentCount, TextureAtlasManager } from '@zephyr3d/device';
|
|
3
3
|
|
|
4
4
|
/** @internal */ let appInstance;
|
|
@@ -3198,6 +3198,67 @@ const tmpVec3$1 = new Vector3();
|
|
|
3198
3198
|
}
|
|
3199
3199
|
}
|
|
3200
3200
|
|
|
3201
|
+
function clamp01$1(value) {
|
|
3202
|
+
return value < 0 ? 0 : value > 1 ? 1 : value;
|
|
3203
|
+
}
|
|
3204
|
+
/**
|
|
3205
|
+
* Animates a model-level morph target group by name.
|
|
3206
|
+
* @public
|
|
3207
|
+
*/ class MorphTargetGroupTrack extends AnimationTrack {
|
|
3208
|
+
_groupName;
|
|
3209
|
+
_interpolator;
|
|
3210
|
+
_state;
|
|
3211
|
+
/**
|
|
3212
|
+
* Create a morph target group animation track.
|
|
3213
|
+
* @param groupName - Morph target group name
|
|
3214
|
+
* @param interpolator - Scalar interpolator for the group weight
|
|
3215
|
+
* @param embedded - Whether this track is embedded
|
|
3216
|
+
*/ constructor(groupName, interpolator, embedded){
|
|
3217
|
+
super(embedded ?? false);
|
|
3218
|
+
this._groupName = groupName ?? '';
|
|
3219
|
+
this._interpolator = interpolator ?? InterpolatorScalar.constant(0);
|
|
3220
|
+
this._state = [
|
|
3221
|
+
0
|
|
3222
|
+
];
|
|
3223
|
+
}
|
|
3224
|
+
/** Morph target group name controlled by this track. */ get groupName() {
|
|
3225
|
+
return this._groupName;
|
|
3226
|
+
}
|
|
3227
|
+
set groupName(value) {
|
|
3228
|
+
this._groupName = value ?? '';
|
|
3229
|
+
}
|
|
3230
|
+
/** Scalar interpolator for this track. */ get interpolator() {
|
|
3231
|
+
return this._interpolator;
|
|
3232
|
+
}
|
|
3233
|
+
set interpolator(value) {
|
|
3234
|
+
if (value && value.target !== 'number') {
|
|
3235
|
+
throw new Error(`MorphTargetGroupTrack(): interpolator target must be 'number'`);
|
|
3236
|
+
}
|
|
3237
|
+
this._interpolator = value ?? InterpolatorScalar.constant(0);
|
|
3238
|
+
}
|
|
3239
|
+
/** {@inheritDoc AnimationTrack.clone} */ clone() {
|
|
3240
|
+
return new MorphTargetGroupTrack(this._groupName, this._interpolator.clone(), false);
|
|
3241
|
+
}
|
|
3242
|
+
/** {@inheritDoc AnimationTrack.calculateState} */ calculateState(target, currentTime) {
|
|
3243
|
+
this._interpolator.interpolate(currentTime, this._state);
|
|
3244
|
+
return clamp01$1(this._state[0]);
|
|
3245
|
+
}
|
|
3246
|
+
/** {@inheritDoc AnimationTrack.applyState} */ applyState(node, weight) {
|
|
3247
|
+
if (this._groupName) {
|
|
3248
|
+
node.setMorphTargetGroupWeight(this._groupName, clamp01$1(weight));
|
|
3249
|
+
}
|
|
3250
|
+
}
|
|
3251
|
+
/** {@inheritDoc AnimationTrack.mixState} */ mixState(a, b, t) {
|
|
3252
|
+
return a + (b - a) * t;
|
|
3253
|
+
}
|
|
3254
|
+
/** {@inheritDoc AnimationTrack.getBlendId} */ getBlendId() {
|
|
3255
|
+
return `morph-target-group:${this._groupName}`;
|
|
3256
|
+
}
|
|
3257
|
+
/** {@inheritDoc AnimationTrack.getDuration} */ getDuration() {
|
|
3258
|
+
return this._interpolator.maxTime;
|
|
3259
|
+
}
|
|
3260
|
+
}
|
|
3261
|
+
|
|
3201
3262
|
/**
|
|
3202
3263
|
* Standardized humanoid joint names for consistent skeleton mapping across models and animations.
|
|
3203
3264
|
*
|
|
@@ -6068,7 +6129,7 @@ function cloneInterpolator(src) {
|
|
|
6068
6129
|
...src.outputs
|
|
6069
6130
|
]);
|
|
6070
6131
|
}
|
|
6071
|
-
function createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint, translationRotation, translationScale, translationAxisLocks) {
|
|
6132
|
+
function createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint, translationRotation, translationScale, translationCorrection, translationAxisLocks, rotationCorrection) {
|
|
6072
6133
|
const si = srcSkeleton.joints.indexOf(srcJoint);
|
|
6073
6134
|
const di = dstSkeleton.joints.indexOf(dstJoint);
|
|
6074
6135
|
const srcBindPose = srcSkeleton.bindPose[si];
|
|
@@ -6081,24 +6142,28 @@ function createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint,
|
|
|
6081
6142
|
srcNode: srcJoint,
|
|
6082
6143
|
srcBindRotInv: Quaternion.inverse(srcBindPose.rotation),
|
|
6083
6144
|
dstBindRot: dstBindPose.rotation.clone(),
|
|
6145
|
+
rotationCorrection,
|
|
6084
6146
|
srcBindPos: srcBindPose.position.clone(),
|
|
6085
6147
|
dstBindPos: dstBindPose.position.clone(),
|
|
6086
|
-
translationScale: (srcLen > 1e-6 ? dstLen / srcLen : 1),
|
|
6148
|
+
translationScale: translationScale ?? (srcLen > 1e-6 ? dstLen / srcLen : 1),
|
|
6087
6149
|
translationRotation,
|
|
6150
|
+
translationCorrection,
|
|
6088
6151
|
translationAxisLocks
|
|
6089
6152
|
};
|
|
6090
6153
|
}
|
|
6091
|
-
function createTranslationRetargetRemap(srcNode, dstNode, srcBindPos, dstBindPos, dstJointIndex, translationScale, translationRotation, translationAxisLocks) {
|
|
6154
|
+
function createTranslationRetargetRemap(srcNode, dstNode, srcBindPos, dstBindPos, dstJointIndex, translationScale, translationRotation, translationCorrection, translationAxisLocks, rotationCorrection) {
|
|
6092
6155
|
return {
|
|
6093
6156
|
dstNode,
|
|
6094
6157
|
dstJointIndex,
|
|
6095
6158
|
srcNode,
|
|
6096
6159
|
srcBindRotInv: Quaternion.identity(),
|
|
6097
6160
|
dstBindRot: Quaternion.identity(),
|
|
6161
|
+
rotationCorrection,
|
|
6098
6162
|
srcBindPos: srcBindPos.clone(),
|
|
6099
6163
|
dstBindPos: dstBindPos.clone(),
|
|
6100
6164
|
translationScale,
|
|
6101
6165
|
translationRotation,
|
|
6166
|
+
translationCorrection,
|
|
6102
6167
|
translationAxisLocks
|
|
6103
6168
|
};
|
|
6104
6169
|
}
|
|
@@ -6106,6 +6171,151 @@ function getBindPosition(skeleton, joint) {
|
|
|
6106
6171
|
const index = skeleton.joints.indexOf(joint);
|
|
6107
6172
|
return index >= 0 ? skeleton.bindPose[index].position : null;
|
|
6108
6173
|
}
|
|
6174
|
+
function getSkeletonLocalBindTransform(skeleton, node, jointSet, cache) {
|
|
6175
|
+
let transform = cache.get(node);
|
|
6176
|
+
if (!transform) {
|
|
6177
|
+
const bindPose = getRigBindPoseForNode(skeleton, node);
|
|
6178
|
+
const position = bindPose.position.clone();
|
|
6179
|
+
const rotation = bindPose.rotation.clone();
|
|
6180
|
+
const parent = node.parent;
|
|
6181
|
+
if (parent && jointSet.has(parent)) {
|
|
6182
|
+
const parentTransform = getSkeletonLocalBindTransform(skeleton, parent, jointSet, cache);
|
|
6183
|
+
parentTransform.rotation.transform(position, position);
|
|
6184
|
+
position.addBy(parentTransform.position);
|
|
6185
|
+
Quaternion.multiply(parentTransform.rotation, rotation, rotation);
|
|
6186
|
+
}
|
|
6187
|
+
transform = {
|
|
6188
|
+
position,
|
|
6189
|
+
rotation
|
|
6190
|
+
};
|
|
6191
|
+
cache.set(node, transform);
|
|
6192
|
+
}
|
|
6193
|
+
return transform;
|
|
6194
|
+
}
|
|
6195
|
+
function getHumanoidLateralXSign(skeleton) {
|
|
6196
|
+
const mapping = skeleton.humanoidJointMapping;
|
|
6197
|
+
if (!mapping) {
|
|
6198
|
+
return 0;
|
|
6199
|
+
}
|
|
6200
|
+
const pairs = [
|
|
6201
|
+
[
|
|
6202
|
+
HumanoidBodyRig.LeftShoulder,
|
|
6203
|
+
HumanoidBodyRig.RightShoulder
|
|
6204
|
+
],
|
|
6205
|
+
[
|
|
6206
|
+
HumanoidBodyRig.LeftUpperArm,
|
|
6207
|
+
HumanoidBodyRig.RightUpperArm
|
|
6208
|
+
],
|
|
6209
|
+
[
|
|
6210
|
+
HumanoidBodyRig.LeftLowerArm,
|
|
6211
|
+
HumanoidBodyRig.RightLowerArm
|
|
6212
|
+
],
|
|
6213
|
+
[
|
|
6214
|
+
HumanoidBodyRig.LeftHand,
|
|
6215
|
+
HumanoidBodyRig.RightHand
|
|
6216
|
+
],
|
|
6217
|
+
[
|
|
6218
|
+
HumanoidBodyRig.LeftUpperLeg,
|
|
6219
|
+
HumanoidBodyRig.RightUpperLeg
|
|
6220
|
+
],
|
|
6221
|
+
[
|
|
6222
|
+
HumanoidBodyRig.LeftLowerLeg,
|
|
6223
|
+
HumanoidBodyRig.RightLowerLeg
|
|
6224
|
+
],
|
|
6225
|
+
[
|
|
6226
|
+
HumanoidBodyRig.LeftFoot,
|
|
6227
|
+
HumanoidBodyRig.RightFoot
|
|
6228
|
+
],
|
|
6229
|
+
[
|
|
6230
|
+
HumanoidBodyRig.LeftToes,
|
|
6231
|
+
HumanoidBodyRig.RightToes
|
|
6232
|
+
]
|
|
6233
|
+
];
|
|
6234
|
+
const jointSet = new Set(skeleton.joints);
|
|
6235
|
+
const cache = new Map();
|
|
6236
|
+
let score = 0;
|
|
6237
|
+
let weight = 0;
|
|
6238
|
+
for (const [leftKey, rightKey] of pairs){
|
|
6239
|
+
const left = mapping.body[leftKey];
|
|
6240
|
+
const right = mapping.body[rightKey];
|
|
6241
|
+
if (!left || !right || !jointSet.has(left) || !jointSet.has(right)) {
|
|
6242
|
+
continue;
|
|
6243
|
+
}
|
|
6244
|
+
const dx = getSkeletonLocalBindTransform(skeleton, left, jointSet, cache).position.x - getSkeletonLocalBindTransform(skeleton, right, jointSet, cache).position.x;
|
|
6245
|
+
if (Math.abs(dx) > 1e-5) {
|
|
6246
|
+
score += dx;
|
|
6247
|
+
weight++;
|
|
6248
|
+
}
|
|
6249
|
+
}
|
|
6250
|
+
if (weight === 0 || Math.abs(score) < 1e-5) {
|
|
6251
|
+
return 0;
|
|
6252
|
+
}
|
|
6253
|
+
return score > 0 ? 1 : -1;
|
|
6254
|
+
}
|
|
6255
|
+
function getHumanoidForwardZSign(skeleton) {
|
|
6256
|
+
const mapping = skeleton.humanoidJointMapping;
|
|
6257
|
+
if (!mapping) {
|
|
6258
|
+
return 0;
|
|
6259
|
+
}
|
|
6260
|
+
const pairs = [
|
|
6261
|
+
[
|
|
6262
|
+
HumanoidBodyRig.LeftFoot,
|
|
6263
|
+
HumanoidBodyRig.LeftToes
|
|
6264
|
+
],
|
|
6265
|
+
[
|
|
6266
|
+
HumanoidBodyRig.RightFoot,
|
|
6267
|
+
HumanoidBodyRig.RightToes
|
|
6268
|
+
]
|
|
6269
|
+
];
|
|
6270
|
+
const jointSet = new Set(skeleton.joints);
|
|
6271
|
+
const cache = new Map();
|
|
6272
|
+
let score = 0;
|
|
6273
|
+
let weight = 0;
|
|
6274
|
+
for (const [footKey, toesKey] of pairs){
|
|
6275
|
+
const foot = mapping.body[footKey];
|
|
6276
|
+
const toes = mapping.body[toesKey];
|
|
6277
|
+
if (!foot || !toes || !jointSet.has(foot) || !jointSet.has(toes)) {
|
|
6278
|
+
continue;
|
|
6279
|
+
}
|
|
6280
|
+
const dz = getSkeletonLocalBindTransform(skeleton, toes, jointSet, cache).position.z - getSkeletonLocalBindTransform(skeleton, foot, jointSet, cache).position.z;
|
|
6281
|
+
if (Math.abs(dz) > 1e-5) {
|
|
6282
|
+
score += dz;
|
|
6283
|
+
weight++;
|
|
6284
|
+
}
|
|
6285
|
+
}
|
|
6286
|
+
if (weight === 0 || Math.abs(score) < 1e-5) {
|
|
6287
|
+
return 0;
|
|
6288
|
+
}
|
|
6289
|
+
return score > 0 ? 1 : -1;
|
|
6290
|
+
}
|
|
6291
|
+
function getHumanoidSignFromSkeletons(skeletons, getSign) {
|
|
6292
|
+
let score = 0;
|
|
6293
|
+
for (const skeleton of skeletons){
|
|
6294
|
+
score += getSign(skeleton);
|
|
6295
|
+
}
|
|
6296
|
+
return score > 0 ? 1 : score < 0 ? -1 : 0;
|
|
6297
|
+
}
|
|
6298
|
+
function getHumanoidRotationCorrection(srcSkeleton, dstSkeleton, srcSignSkeletons = [
|
|
6299
|
+
srcSkeleton
|
|
6300
|
+
], dstSignSkeletons = [
|
|
6301
|
+
dstSkeleton
|
|
6302
|
+
]) {
|
|
6303
|
+
const srcLateralXSign = getHumanoidLateralXSign(srcSkeleton) || getHumanoidSignFromSkeletons(srcSignSkeletons, getHumanoidLateralXSign);
|
|
6304
|
+
const dstLateralXSign = getHumanoidLateralXSign(dstSkeleton) || getHumanoidSignFromSkeletons(dstSignSkeletons, getHumanoidLateralXSign);
|
|
6305
|
+
const srcForwardZSign = getHumanoidForwardZSign(srcSkeleton) || getHumanoidSignFromSkeletons(srcSignSkeletons, getHumanoidForwardZSign);
|
|
6306
|
+
const dstForwardZSign = getHumanoidForwardZSign(dstSkeleton) || getHumanoidSignFromSkeletons(dstSignSkeletons, getHumanoidForwardZSign);
|
|
6307
|
+
const axisXSign = srcLateralXSign && dstLateralXSign && srcLateralXSign !== dstLateralXSign ? -1 : 1;
|
|
6308
|
+
const axisZSign = srcForwardZSign && dstForwardZSign && srcForwardZSign !== dstForwardZSign ? -1 : 1;
|
|
6309
|
+
if (axisXSign === 1 && axisZSign === 1) {
|
|
6310
|
+
return null;
|
|
6311
|
+
}
|
|
6312
|
+
const determinant = axisXSign * axisZSign;
|
|
6313
|
+
return {
|
|
6314
|
+
x: determinant * axisXSign,
|
|
6315
|
+
y: determinant,
|
|
6316
|
+
z: determinant * axisZSign
|
|
6317
|
+
};
|
|
6318
|
+
}
|
|
6109
6319
|
function getRigBindPoseForNode(skeleton, node) {
|
|
6110
6320
|
return skeleton.getBindPoseForJoint(node) ?? (node === skeleton.rootJoint ? skeleton.rootBindPose : {
|
|
6111
6321
|
position: node.position,
|
|
@@ -6149,6 +6359,35 @@ function getHumanoidRootMotionScale(srcSkeleton, dstSkeleton) {
|
|
|
6149
6359
|
function findTranslationTrack(tracks) {
|
|
6150
6360
|
return tracks?.find((track)=>track instanceof NodeTranslationTrack) ?? null;
|
|
6151
6361
|
}
|
|
6362
|
+
function findAncestorTranslationTrack(clip, node, modelRoot) {
|
|
6363
|
+
let current = node.parent;
|
|
6364
|
+
while(current){
|
|
6365
|
+
const track = findTranslationTrack(clip.tracks.get(current));
|
|
6366
|
+
if (track) {
|
|
6367
|
+
return {
|
|
6368
|
+
node: current,
|
|
6369
|
+
track
|
|
6370
|
+
};
|
|
6371
|
+
}
|
|
6372
|
+
if (current === modelRoot) {
|
|
6373
|
+
break;
|
|
6374
|
+
}
|
|
6375
|
+
current = current.parent;
|
|
6376
|
+
}
|
|
6377
|
+
return null;
|
|
6378
|
+
}
|
|
6379
|
+
function copyMorphTargetGroupTracks(sourceClip, targetClip, target) {
|
|
6380
|
+
for (const tracks of sourceClip.tracks.values()){
|
|
6381
|
+
for (const track of tracks){
|
|
6382
|
+
if (track instanceof MorphTargetGroupTrack) {
|
|
6383
|
+
const cloned = track.clone();
|
|
6384
|
+
cloned.name = track.name;
|
|
6385
|
+
cloned.target = target.persistentId;
|
|
6386
|
+
targetClip.addTrack(target, cloned);
|
|
6387
|
+
}
|
|
6388
|
+
}
|
|
6389
|
+
}
|
|
6390
|
+
}
|
|
6152
6391
|
function applyTranslationAxisLocks(value, bindValue, locks) {
|
|
6153
6392
|
if (locks?.x) {
|
|
6154
6393
|
value.x = bindValue.x;
|
|
@@ -6174,13 +6413,25 @@ function applyTranslationTangentAxisLocks(value, locks) {
|
|
|
6174
6413
|
function retargetRotation(qSrcAnim, remap, out) {
|
|
6175
6414
|
Quaternion.multiply(remap.srcBindRotInv, qSrcAnim, out);
|
|
6176
6415
|
Quaternion.multiply(remap.dstBindRot, out, out);
|
|
6416
|
+
if (remap.rotationCorrection) {
|
|
6417
|
+
applyHumanoidRotationCorrection(out, remap.rotationCorrection, out);
|
|
6418
|
+
}
|
|
6177
6419
|
return out.inplaceNormalize();
|
|
6178
6420
|
}
|
|
6179
6421
|
function retargetRotationTangent(qSrcTangent, remap, out) {
|
|
6180
6422
|
Quaternion.multiply(remap.srcBindRotInv, qSrcTangent, out);
|
|
6181
6423
|
Quaternion.multiply(remap.dstBindRot, out, out);
|
|
6424
|
+
if (remap.rotationCorrection) {
|
|
6425
|
+
applyHumanoidRotationCorrection(out, remap.rotationCorrection, out);
|
|
6426
|
+
}
|
|
6182
6427
|
return out;
|
|
6183
6428
|
}
|
|
6429
|
+
function applyHumanoidRotationCorrection(q, correction, out) {
|
|
6430
|
+
return out.setXYZW(q.x * correction.x, q.y * correction.y, q.z * correction.z, q.w);
|
|
6431
|
+
}
|
|
6432
|
+
function applyHumanoidTranslationCorrection(value, correction, out) {
|
|
6433
|
+
return out.setXYZ(value.x * correction.x, value.y * correction.y, value.z * correction.z);
|
|
6434
|
+
}
|
|
6184
6435
|
function retargetTranslationValue(srcValue, remap, out) {
|
|
6185
6436
|
out.setXYZ(srcValue.x, srcValue.y, srcValue.z);
|
|
6186
6437
|
out.subBy(remap.srcBindPos);
|
|
@@ -6188,6 +6439,9 @@ function retargetTranslationValue(srcValue, remap, out) {
|
|
|
6188
6439
|
if (remap.translationRotation) {
|
|
6189
6440
|
remap.translationRotation.transform(out, out);
|
|
6190
6441
|
}
|
|
6442
|
+
if (remap.translationCorrection) {
|
|
6443
|
+
applyHumanoidTranslationCorrection(out, remap.translationCorrection, out);
|
|
6444
|
+
}
|
|
6191
6445
|
out.addBy(remap.dstBindPos);
|
|
6192
6446
|
applyTranslationAxisLocks(out, remap.dstBindPos, remap.translationAxisLocks);
|
|
6193
6447
|
return out;
|
|
@@ -6198,6 +6452,9 @@ function retargetTranslationTangent(srcValue, remap, out) {
|
|
|
6198
6452
|
if (remap.translationRotation) {
|
|
6199
6453
|
remap.translationRotation.transform(out, out);
|
|
6200
6454
|
}
|
|
6455
|
+
if (remap.translationCorrection) {
|
|
6456
|
+
applyHumanoidTranslationCorrection(out, remap.translationCorrection, out);
|
|
6457
|
+
}
|
|
6201
6458
|
applyTranslationTangentAxisLocks(out, remap.translationAxisLocks);
|
|
6202
6459
|
return out;
|
|
6203
6460
|
}
|
|
@@ -6297,7 +6554,7 @@ function sampleRotationTrack(track, time, fallback, out) {
|
|
|
6297
6554
|
out.set(state);
|
|
6298
6555
|
return out;
|
|
6299
6556
|
}
|
|
6300
|
-
function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRootRotation, dstRootRotation, dstClip, remaps) {
|
|
6557
|
+
function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRootRotation, dstRootRotation, dstClip, remaps, rotationCorrection) {
|
|
6301
6558
|
const rotationTracksByRemap = new Map();
|
|
6302
6559
|
const times = new Set([
|
|
6303
6560
|
0,
|
|
@@ -6334,7 +6591,10 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
6334
6591
|
const outputsByRemap = new Map();
|
|
6335
6592
|
const tmpLocalRot = new Quaternion();
|
|
6336
6593
|
const tmpWorldDelta = new Quaternion();
|
|
6594
|
+
const tmpRootDelta = new Quaternion();
|
|
6337
6595
|
const tmpParentInv = new Quaternion();
|
|
6596
|
+
const srcRootRotationInv = Quaternion.inverse(srcRootRotation);
|
|
6597
|
+
const dstRootRotationInv = Quaternion.inverse(dstRootRotation);
|
|
6338
6598
|
for (const remap of remaps){
|
|
6339
6599
|
outputsByRemap.set(remap, new Float32Array(inputs.length * 4));
|
|
6340
6600
|
}
|
|
@@ -6391,6 +6651,13 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
6391
6651
|
const srcBindWorldRot = getSrcBindWorldRot(remap.srcNode);
|
|
6392
6652
|
const srcAnimWorldRot = getSrcAnimWorldRot(remap.srcNode, time);
|
|
6393
6653
|
Quaternion.multiply(srcAnimWorldRot, Quaternion.inverse(srcBindWorldRot, tmpWorldDelta), tmpWorldDelta);
|
|
6654
|
+
if (rotationCorrection) {
|
|
6655
|
+
Quaternion.multiply(srcRootRotationInv, tmpWorldDelta, tmpRootDelta);
|
|
6656
|
+
Quaternion.multiply(tmpRootDelta, srcRootRotation, tmpRootDelta);
|
|
6657
|
+
applyHumanoidRotationCorrection(tmpRootDelta, rotationCorrection, tmpRootDelta);
|
|
6658
|
+
Quaternion.multiply(dstRootRotation, tmpRootDelta, tmpWorldDelta);
|
|
6659
|
+
Quaternion.multiply(tmpWorldDelta, dstRootRotationInv, tmpWorldDelta);
|
|
6660
|
+
}
|
|
6394
6661
|
Quaternion.multiply(tmpWorldDelta, getDstBindWorldRot(remap.dstNode), rot);
|
|
6395
6662
|
return rot;
|
|
6396
6663
|
}
|
|
@@ -7285,8 +7552,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
7285
7552
|
console.error(`copyHumanoidAnimationFrom: source skeleton does not have a humanoid joint mapping`);
|
|
7286
7553
|
return null;
|
|
7287
7554
|
}
|
|
7288
|
-
const
|
|
7289
|
-
const jointRemapBySrcNode = new Map();
|
|
7555
|
+
const jointRemapsBySrcNode = new Map();
|
|
7290
7556
|
// Find a destination skeleton that has a humanoid mapping and share at least the body rig keys
|
|
7291
7557
|
let srcJointsFiltered = [];
|
|
7292
7558
|
let dstJointsFiltered = [];
|
|
@@ -7299,38 +7565,34 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
7299
7565
|
if (!dstHumanoidMapping) {
|
|
7300
7566
|
return false;
|
|
7301
7567
|
}
|
|
7568
|
+
const srcHips = srcHumanoidMapping.body[HumanoidBodyRig.Hips];
|
|
7569
|
+
const dstHips = dstHumanoidMapping.body[HumanoidBodyRig.Hips];
|
|
7570
|
+
if (!srcHips || !dstHips || !srcSkeleton.joints.includes(srcHips) || !sk.joints.includes(dstHips)) {
|
|
7571
|
+
return false;
|
|
7572
|
+
}
|
|
7302
7573
|
// Collect matched (srcJoint, dstJoint) pairs via shared humanoid rig keys
|
|
7303
7574
|
const srcMatched = [];
|
|
7304
7575
|
const dstMatched = [];
|
|
7305
|
-
|
|
7306
|
-
|
|
7307
|
-
const srcJoint = srcHumanoidMapping.body[key];
|
|
7308
|
-
const dstJoint = dstHumanoidMapping.body[key];
|
|
7309
|
-
if (srcJoint && dstJoint) {
|
|
7576
|
+
const addMatch = (srcJoint, dstJoint)=>{
|
|
7577
|
+
if (srcJoint && dstJoint && srcSkeleton.joints.includes(srcJoint) && sk.joints.includes(dstJoint)) {
|
|
7310
7578
|
srcMatched.push(srcJoint);
|
|
7311
7579
|
dstMatched.push(dstJoint);
|
|
7312
7580
|
}
|
|
7581
|
+
};
|
|
7582
|
+
// Match body rig joints
|
|
7583
|
+
for (const key of Object.keys(srcHumanoidMapping.body)){
|
|
7584
|
+
addMatch(srcHumanoidMapping.body[key], dstHumanoidMapping.body[key]);
|
|
7313
7585
|
}
|
|
7314
7586
|
// Match left hand rig joints only when both sides define them; skip silently if either is absent
|
|
7315
7587
|
if (srcHumanoidMapping.leftHand && dstHumanoidMapping.leftHand) {
|
|
7316
7588
|
for (const key of Object.keys(srcHumanoidMapping.leftHand)){
|
|
7317
|
-
|
|
7318
|
-
const dstJoint = dstHumanoidMapping.leftHand[key];
|
|
7319
|
-
if (srcJoint && dstJoint) {
|
|
7320
|
-
srcMatched.push(srcJoint);
|
|
7321
|
-
dstMatched.push(dstJoint);
|
|
7322
|
-
}
|
|
7589
|
+
addMatch(srcHumanoidMapping.leftHand[key], dstHumanoidMapping.leftHand[key]);
|
|
7323
7590
|
}
|
|
7324
7591
|
}
|
|
7325
7592
|
// Match right hand rig joints only when both sides define them; skip silently if either is absent
|
|
7326
7593
|
if (srcHumanoidMapping.rightHand && dstHumanoidMapping.rightHand) {
|
|
7327
7594
|
for (const key of Object.keys(srcHumanoidMapping.rightHand)){
|
|
7328
|
-
|
|
7329
|
-
const dstJoint = dstHumanoidMapping.rightHand[key];
|
|
7330
|
-
if (srcJoint && dstJoint) {
|
|
7331
|
-
srcMatched.push(srcJoint);
|
|
7332
|
-
dstMatched.push(dstJoint);
|
|
7333
|
-
}
|
|
7595
|
+
addMatch(srcHumanoidMapping.rightHand[key], dstHumanoidMapping.rightHand[key]);
|
|
7334
7596
|
}
|
|
7335
7597
|
}
|
|
7336
7598
|
if (srcMatched.length === 0) {
|
|
@@ -7368,28 +7630,69 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
7368
7630
|
const srcRootRot = computeParentChainRotation(srcRootNode, sourceSet.model, srcSkeleton);
|
|
7369
7631
|
const dstRootRot = computeParentChainRotation(dstRootNode, this._model, dstSkeleton);
|
|
7370
7632
|
const srcRootTranslationTrack = findTranslationTrack(sourceClip.tracks.get(srcRootNode));
|
|
7371
|
-
const
|
|
7372
|
-
const
|
|
7373
|
-
const
|
|
7633
|
+
const srcAncestorTranslationTrackInfo = !srcRootTranslationTrack ? findAncestorTranslationTrack(sourceClip, srcRootNode, sourceSet.model) : null;
|
|
7634
|
+
const srcFallbackHipsTranslationTrack = !srcRootTranslationTrack && !srcAncestorTranslationTrackInfo && srcRootNode !== srcHipsNode ? findTranslationTrack(sourceClip.tracks.get(srcHipsNode)) : null;
|
|
7635
|
+
const srcMotionTrack = srcRootTranslationTrack ?? srcAncestorTranslationTrackInfo?.track ?? srcFallbackHipsTranslationTrack;
|
|
7636
|
+
const srcMotionNode = srcRootTranslationTrack ? srcRootNode : srcAncestorTranslationTrackInfo ? srcAncestorTranslationTrackInfo.node : srcFallbackHipsTranslationTrack ? srcHipsNode : null;
|
|
7374
7637
|
const srcMotionParentRot = srcMotionNode ? computeParentChainRotation(srcMotionNode, sourceSet.model, srcSkeleton) : srcRootRot;
|
|
7375
7638
|
const rootTranslationRotation = Quaternion.multiply(Quaternion.inverse(dstRootRot), srcMotionParentRot);
|
|
7376
7639
|
const rootTranslationScale = rootMotion === 'scaled' ? typeof options.rootMotionScale === 'number' ? options.rootMotionScale : options.rootMotionScale === 'none' ? 1 : getHumanoidRootMotionScale(srcSkeleton, dstSkeleton) : 1;
|
|
7377
7640
|
const jointRemaps = [];
|
|
7378
|
-
const
|
|
7379
|
-
|
|
7641
|
+
const jointRemapsByDstSkeleton = new Map([
|
|
7642
|
+
[
|
|
7643
|
+
dstSkeleton,
|
|
7644
|
+
jointRemaps
|
|
7645
|
+
]
|
|
7646
|
+
]);
|
|
7647
|
+
const srcSignSkeletons = sourceSet._rigs.map((ref)=>ref.get()).filter((sk)=>!!sk);
|
|
7648
|
+
const dstSignSkeletons = this._rigs.map((ref)=>ref.get()).filter((sk)=>!!sk);
|
|
7649
|
+
const humanoidRotationCorrection = getHumanoidRotationCorrection(srcSkeleton, dstSkeleton, srcSignSkeletons, dstSignSkeletons);
|
|
7650
|
+
const addJointRemap = (targetSkeleton, srcJoint, dstJoint, applyRotationCorrection = true)=>{
|
|
7651
|
+
if (!srcJoint || !dstJoint || !srcSkeleton.joints.includes(srcJoint) || !targetSkeleton.joints.includes(dstJoint)) {
|
|
7652
|
+
return;
|
|
7653
|
+
}
|
|
7654
|
+
const remap = createJointRetargetRemap(srcSkeleton, targetSkeleton, srcJoint, dstJoint, undefined, undefined, humanoidRotationCorrection ?? undefined, undefined, applyRotationCorrection ? humanoidRotationCorrection ?? undefined : undefined);
|
|
7655
|
+
let targetRemaps = jointRemapsByDstSkeleton.get(targetSkeleton);
|
|
7656
|
+
if (!targetRemaps) {
|
|
7657
|
+
targetRemaps = [];
|
|
7658
|
+
jointRemapsByDstSkeleton.set(targetSkeleton, targetRemaps);
|
|
7659
|
+
}
|
|
7660
|
+
targetRemaps.push(remap);
|
|
7661
|
+
let srcRemaps = jointRemapsBySrcNode.get(srcJoint);
|
|
7662
|
+
if (!srcRemaps) {
|
|
7663
|
+
srcRemaps = [];
|
|
7664
|
+
jointRemapsBySrcNode.set(srcJoint, srcRemaps);
|
|
7665
|
+
}
|
|
7666
|
+
srcRemaps.push(remap);
|
|
7667
|
+
};
|
|
7668
|
+
const addHumanoidMappingRemaps = (targetSkeleton)=>{
|
|
7669
|
+
const targetMapping = targetSkeleton.humanoidJointMapping;
|
|
7670
|
+
if (!targetMapping) {
|
|
7671
|
+
return;
|
|
7672
|
+
}
|
|
7673
|
+
const applyRotationCorrection = targetSkeleton === dstSkeleton;
|
|
7674
|
+
for (const key of Object.keys(srcHumanoidMapping.body)){
|
|
7675
|
+
addJointRemap(targetSkeleton, srcHumanoidMapping.body[key], targetMapping.body[key], applyRotationCorrection);
|
|
7676
|
+
}
|
|
7677
|
+
if (srcHumanoidMapping.leftHand && targetMapping.leftHand) {
|
|
7678
|
+
for (const key of Object.keys(srcHumanoidMapping.leftHand)){
|
|
7679
|
+
addJointRemap(targetSkeleton, srcHumanoidMapping.leftHand[key], targetMapping.leftHand[key], applyRotationCorrection);
|
|
7680
|
+
}
|
|
7681
|
+
}
|
|
7682
|
+
if (srcHumanoidMapping.rightHand && targetMapping.rightHand) {
|
|
7683
|
+
for (const key of Object.keys(srcHumanoidMapping.rightHand)){
|
|
7684
|
+
addJointRemap(targetSkeleton, srcHumanoidMapping.rightHand[key], targetMapping.rightHand[key], applyRotationCorrection);
|
|
7685
|
+
}
|
|
7686
|
+
}
|
|
7687
|
+
};
|
|
7380
7688
|
// Build remap for matched joint pairs
|
|
7381
7689
|
for(let fi = 0; fi < srcJointsFiltered.length; fi++){
|
|
7382
|
-
|
|
7383
|
-
|
|
7384
|
-
|
|
7385
|
-
|
|
7690
|
+
addJointRemap(dstSkeleton, srcJointsFiltered[fi], dstJointsFiltered[fi], true);
|
|
7691
|
+
}
|
|
7692
|
+
for (const targetSkeleton of dstSignSkeletons){
|
|
7693
|
+
if (targetSkeleton !== dstSkeleton) {
|
|
7694
|
+
addHumanoidMappingRemaps(targetSkeleton);
|
|
7386
7695
|
}
|
|
7387
|
-
mappedSrcNodes.add(srcJoint);
|
|
7388
|
-
mappedDstNodes.add(dstJoint);
|
|
7389
|
-
nodeMap.set(srcJoint, dstJoint);
|
|
7390
|
-
const remap = createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint);
|
|
7391
|
-
jointRemaps.push(remap);
|
|
7392
|
-
jointRemapBySrcNode.set(srcJoint, remap);
|
|
7393
7696
|
}
|
|
7394
7697
|
const dstClip = this.createAnimation(destName);
|
|
7395
7698
|
if (!dstClip) {
|
|
@@ -7398,9 +7701,37 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
7398
7701
|
dstClip.timeDuration = sourceClip.timeDuration;
|
|
7399
7702
|
dstClip.weight = sourceClip.weight;
|
|
7400
7703
|
dstClip.autoPlay = sourceClip.autoPlay;
|
|
7401
|
-
|
|
7402
|
-
|
|
7403
|
-
|
|
7704
|
+
copyMorphTargetGroupTracks(sourceClip, dstClip, this._model);
|
|
7705
|
+
for (const [targetSkeleton, targetRemaps] of jointRemapsByDstSkeleton){
|
|
7706
|
+
if (targetRemaps.length === 0) {
|
|
7707
|
+
continue;
|
|
7708
|
+
}
|
|
7709
|
+
const hasCopyableTrack = targetSkeleton === dstSkeleton || targetRemaps.some((remap)=>{
|
|
7710
|
+
const srcTracks = sourceClip.tracks.get(remap.srcNode);
|
|
7711
|
+
if (!srcTracks) {
|
|
7712
|
+
return false;
|
|
7713
|
+
}
|
|
7714
|
+
for (const srcTrack of srcTracks){
|
|
7715
|
+
if (srcTrack instanceof NodeRotationTrack || srcTrack instanceof NodeEulerRotationTrack) {
|
|
7716
|
+
return true;
|
|
7717
|
+
}
|
|
7718
|
+
if (srcTrack instanceof NodeTranslationTrack && remap.srcNode !== srcRootNode && srcTrack !== srcMotionTrack && jointTranslations === 'preserve') {
|
|
7719
|
+
return true;
|
|
7720
|
+
}
|
|
7721
|
+
if (srcTrack instanceof NodeScaleTrack) {
|
|
7722
|
+
return true;
|
|
7723
|
+
}
|
|
7724
|
+
}
|
|
7725
|
+
return false;
|
|
7726
|
+
});
|
|
7727
|
+
if (!hasCopyableTrack) {
|
|
7728
|
+
continue;
|
|
7729
|
+
}
|
|
7730
|
+
dstClip.addSkeleton(targetSkeleton.persistentId);
|
|
7731
|
+
const targetRootNode = targetSkeleton.rootJoint ?? targetSkeleton.humanoidJointMapping?.body[HumanoidBodyRig.Hips] ?? targetRemaps[0].dstNode;
|
|
7732
|
+
const targetRootRot = targetRootNode === dstRootNode ? dstRootRot : computeParentChainRotation(targetRootNode, this._model, targetSkeleton);
|
|
7733
|
+
bakeHumanoidRotationTracks(sourceClip, srcSkeleton, targetSkeleton, srcRootRot, targetRootRot, dstClip, targetRemaps, humanoidRotationCorrection);
|
|
7734
|
+
}
|
|
7404
7735
|
if (rootMotion !== 'none') {
|
|
7405
7736
|
const dstRootBindPose = getRigBindPoseForNode(dstSkeleton, dstRootNode);
|
|
7406
7737
|
let dstRootTrack = null;
|
|
@@ -7408,7 +7739,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
7408
7739
|
dstRootTrack = createConstantTranslationTrack(dstRootBindPose.position);
|
|
7409
7740
|
} else if (srcMotionTrack && srcMotionNode) {
|
|
7410
7741
|
const srcMotionBindPose = getRigBindPoseForNode(srcSkeleton, srcMotionNode);
|
|
7411
|
-
const rootRemap = createTranslationRetargetRemap(srcMotionNode, dstRootNode, srcMotionBindPose.position, dstRootBindPose.position, dstSkeleton.joints.indexOf(dstRootNode), rootTranslationScale, rootTranslationRotation, options.lockRootMotionAxes);
|
|
7742
|
+
const rootRemap = createTranslationRetargetRemap(srcMotionNode, dstRootNode, srcMotionBindPose.position, dstRootBindPose.position, dstSkeleton.joints.indexOf(dstRootNode), rootTranslationScale, rootTranslationRotation, humanoidRotationCorrection ?? undefined, options.lockRootMotionAxes, humanoidRotationCorrection ?? undefined);
|
|
7412
7743
|
dstRootTrack = retargetTranslationTrack(srcMotionTrack, rootRemap);
|
|
7413
7744
|
}
|
|
7414
7745
|
if (dstRootTrack) {
|
|
@@ -7418,34 +7749,33 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
7418
7749
|
dstClip.addTrack(dstRootNode, dstRootTrack);
|
|
7419
7750
|
}
|
|
7420
7751
|
}
|
|
7421
|
-
for (const srcNode of
|
|
7752
|
+
for (const [srcNode, srcRemaps] of jointRemapsBySrcNode){
|
|
7422
7753
|
const srcTracks = sourceClip.tracks.get(srcNode);
|
|
7423
7754
|
if (!srcTracks) {
|
|
7424
7755
|
continue;
|
|
7425
7756
|
}
|
|
7426
|
-
const
|
|
7427
|
-
|
|
7428
|
-
|
|
7429
|
-
|
|
7430
|
-
|
|
7431
|
-
|
|
7432
|
-
|
|
7433
|
-
|
|
7434
|
-
|
|
7435
|
-
|
|
7757
|
+
for (const remap of srcRemaps){
|
|
7758
|
+
const dstNode = remap.dstNode;
|
|
7759
|
+
for (const srcTrack of srcTracks){
|
|
7760
|
+
let dstTrack;
|
|
7761
|
+
if (srcTrack instanceof NodeRotationTrack || srcTrack instanceof NodeEulerRotationTrack) {
|
|
7762
|
+
continue;
|
|
7763
|
+
} else if (srcTrack instanceof NodeTranslationTrack) {
|
|
7764
|
+
if (srcNode === srcRootNode || srcTrack === srcMotionTrack || jointTranslations !== 'preserve') {
|
|
7765
|
+
continue;
|
|
7766
|
+
}
|
|
7767
|
+
dstTrack = retargetTranslationTrack(srcTrack, remap);
|
|
7768
|
+
} else if (srcTrack instanceof NodeScaleTrack) {
|
|
7769
|
+
dstTrack = new NodeScaleTrack(cloneInterpolator(srcTrack.interpolator));
|
|
7770
|
+
} else {
|
|
7771
|
+
console.warn(`copyHumanoidAnimationFrom: unsupported track type '${srcTrack.constructor.name}', skipping`);
|
|
7436
7772
|
continue;
|
|
7437
7773
|
}
|
|
7438
|
-
dstTrack =
|
|
7439
|
-
|
|
7440
|
-
dstTrack =
|
|
7441
|
-
|
|
7442
|
-
console.warn(`copyHumanoidAnimationFrom: unsupported track type '${srcTrack.constructor.name}', skipping`);
|
|
7443
|
-
continue;
|
|
7774
|
+
dstTrack.name = srcTrack.name;
|
|
7775
|
+
dstTrack.target = dstNode.persistentId;
|
|
7776
|
+
dstTrack.jointIndex = remap.dstJointIndex;
|
|
7777
|
+
dstClip.addTrack(dstNode, dstTrack);
|
|
7444
7778
|
}
|
|
7445
|
-
dstTrack.name = srcTrack.name;
|
|
7446
|
-
dstTrack.target = dstNode.persistentId;
|
|
7447
|
-
dstTrack.jointIndex = remap.dstJointIndex;
|
|
7448
|
-
dstClip.addTrack(dstNode, dstTrack);
|
|
7449
7779
|
}
|
|
7450
7780
|
}
|
|
7451
7781
|
return dstClip;
|
|
@@ -7538,6 +7868,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
|
|
|
7538
7868
|
dstClip.autoPlay = sourceClip.autoPlay;
|
|
7539
7869
|
// Register destination skeleton
|
|
7540
7870
|
dstClip.addSkeleton(dstSkeleton.persistentId);
|
|
7871
|
+
copyMorphTargetGroupTracks(sourceClip, dstClip, this._model);
|
|
7541
7872
|
for (const srcNode of srcJointsFiltered){
|
|
7542
7873
|
const srcTracks = sourceClip.tracks.get(srcNode);
|
|
7543
7874
|
if (!srcTracks) {
|
|
@@ -34266,6 +34597,16 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
|
|
|
34266
34597
|
}
|
|
34267
34598
|
}
|
|
34268
34599
|
|
|
34600
|
+
const DEFAULT_PROFILING_OPTIONS = {
|
|
34601
|
+
enabled: false,
|
|
34602
|
+
graph: true,
|
|
34603
|
+
pass: true,
|
|
34604
|
+
subpass: true,
|
|
34605
|
+
includePendingUploads: true,
|
|
34606
|
+
allowCrossFrame: false,
|
|
34607
|
+
maxPendingFrames: 3,
|
|
34608
|
+
label: 'RenderGraph'
|
|
34609
|
+
};
|
|
34269
34610
|
/**
|
|
34270
34611
|
* Executes a compiled render graph with automatic resource lifecycle management.
|
|
34271
34612
|
*
|
|
@@ -34282,6 +34623,11 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
|
|
|
34282
34623
|
* @typeParam TTexture - The concrete texture type (e.g. `Texture2D`).
|
|
34283
34624
|
* @public
|
|
34284
34625
|
*/ class RenderGraphExecutor {
|
|
34626
|
+
static _defaultProfilingOptions = false;
|
|
34627
|
+
static _latestProfileResult = null;
|
|
34628
|
+
static _latestPendingProfileFrame = null;
|
|
34629
|
+
static _latestResolvedProfileSerial = 0;
|
|
34630
|
+
static _nextProfileSerial = 0;
|
|
34285
34631
|
/** @internal */ _allocator;
|
|
34286
34632
|
/** @internal */ _backbufferWidth;
|
|
34287
34633
|
/** @internal */ _backbufferHeight;
|
|
@@ -34291,10 +34637,45 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
|
|
|
34291
34637
|
/** @internal */ _importedTextureAliases = new Map();
|
|
34292
34638
|
/** @internal */ _resolvedImportedTextures = new Map();
|
|
34293
34639
|
/** @internal */ _cleanupCallbacks = [];
|
|
34294
|
-
|
|
34640
|
+
/** @internal */ _profilingOptions;
|
|
34641
|
+
/** @internal */ _pendingProfileFrames = [];
|
|
34642
|
+
/** @internal */ _latestProfileResult = null;
|
|
34643
|
+
/** @internal */ _latestResolvedProfileSerial = 0;
|
|
34644
|
+
constructor(allocator, backbufferWidth, backbufferHeight, options){
|
|
34295
34645
|
this._allocator = allocator;
|
|
34296
34646
|
this._backbufferWidth = backbufferWidth;
|
|
34297
34647
|
this._backbufferHeight = backbufferHeight;
|
|
34648
|
+
this._profilingOptions = this._normalizeProfilingOptions(options?.profiling ?? RenderGraphExecutor._defaultProfilingOptions, options?.device);
|
|
34649
|
+
}
|
|
34650
|
+
/**
|
|
34651
|
+
* Set the default profiling options used by newly constructed render graph executors.
|
|
34652
|
+
*/ static setDefaultProfilingOptions(options) {
|
|
34653
|
+
RenderGraphExecutor._defaultProfilingOptions = options;
|
|
34654
|
+
}
|
|
34655
|
+
/**
|
|
34656
|
+
* Get the latest resolved profile result from any render graph executor.
|
|
34657
|
+
*/ static getLatestProfileResult() {
|
|
34658
|
+
return RenderGraphExecutor._latestProfileResult;
|
|
34659
|
+
}
|
|
34660
|
+
/**
|
|
34661
|
+
* Resolve the latest pending render graph profile result from any executor.
|
|
34662
|
+
*/ static resolveProfileResult() {
|
|
34663
|
+
return RenderGraphExecutor._latestPendingProfileFrame?.resolvePromise ?? Promise.resolve(RenderGraphExecutor._latestProfileResult);
|
|
34664
|
+
}
|
|
34665
|
+
/**
|
|
34666
|
+
* Enable, disable, or update timestamp profiling for this executor.
|
|
34667
|
+
*/ setProfilingOptions(options) {
|
|
34668
|
+
this._profilingOptions = this._normalizeProfilingOptions(options, this._profilingOptions.device);
|
|
34669
|
+
}
|
|
34670
|
+
/**
|
|
34671
|
+
* Get the latest resolved profile result produced by this executor.
|
|
34672
|
+
*/ getLatestProfileResult() {
|
|
34673
|
+
return this._latestProfileResult;
|
|
34674
|
+
}
|
|
34675
|
+
/**
|
|
34676
|
+
* Resolve the latest pending profile result produced by this executor.
|
|
34677
|
+
*/ resolveProfileResult() {
|
|
34678
|
+
return this._pendingProfileFrames[this._pendingProfileFrames.length - 1]?.resolvePromise ?? Promise.resolve(this._latestProfileResult);
|
|
34298
34679
|
}
|
|
34299
34680
|
/**
|
|
34300
34681
|
* Update the backbuffer dimensions used for 'backbuffer-relative' sizing.
|
|
@@ -34322,6 +34703,7 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
|
|
|
34322
34703
|
*/ execute(compiled) {
|
|
34323
34704
|
this._cleanupCallbacks.length = 0;
|
|
34324
34705
|
this._resolveImportedTextureAliases(compiled);
|
|
34706
|
+
const profileFrame = this._beginProfileFrame();
|
|
34325
34707
|
// Build per-pass allocation and release schedules
|
|
34326
34708
|
const allocateAt = new Map(); // passIndex -> transient texture resourceIds to allocate
|
|
34327
34709
|
const releaseAt = new Map(); // passIndex -> transient texture resourceIds to release
|
|
@@ -34377,15 +34759,19 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
|
|
|
34377
34759
|
// Execute the pass with exception safety for resource cleanup.
|
|
34378
34760
|
// Release errors must not hide the original pass execution error.
|
|
34379
34761
|
let passError = null;
|
|
34762
|
+
const passProfile = this._beginPassProfileScope(profileFrame, pass);
|
|
34380
34763
|
try {
|
|
34381
34764
|
if (pass.subpasses.length > 0) {
|
|
34382
34765
|
const accessScope = this._createAccessScope(pass);
|
|
34383
34766
|
const ctx = this._createContext(accessScope);
|
|
34384
34767
|
for (const subpass of pass.subpasses){
|
|
34768
|
+
const subpassProfile = this._beginSubpassProfileScope(profileFrame, passProfile, pass, subpass.name);
|
|
34385
34769
|
try {
|
|
34386
34770
|
subpass.executeFn(ctx, pass.data);
|
|
34387
34771
|
} catch (e) {
|
|
34388
34772
|
throw this._wrapSubpassError(pass.name, subpass.name, e);
|
|
34773
|
+
} finally{
|
|
34774
|
+
this._endProfileScope(profileFrame, subpassProfile);
|
|
34389
34775
|
}
|
|
34390
34776
|
}
|
|
34391
34777
|
} else if (pass.executeFn) {
|
|
@@ -34395,6 +34781,8 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
|
|
|
34395
34781
|
}
|
|
34396
34782
|
} catch (e) {
|
|
34397
34783
|
passError = e;
|
|
34784
|
+
} finally{
|
|
34785
|
+
this._endProfileScope(profileFrame, passProfile);
|
|
34398
34786
|
}
|
|
34399
34787
|
let releaseError = null;
|
|
34400
34788
|
const framebuffersToRelease = releaseFramebufferAt.get(i);
|
|
@@ -34437,6 +34825,7 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
|
|
|
34437
34825
|
} catch (e) {
|
|
34438
34826
|
executionError = e;
|
|
34439
34827
|
} finally{
|
|
34828
|
+
this._finishProfileFrame(profileFrame);
|
|
34440
34829
|
let cleanupError = null;
|
|
34441
34830
|
try {
|
|
34442
34831
|
this._runCleanupCallbacks();
|
|
@@ -34478,6 +34867,216 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
|
|
|
34478
34867
|
this._resolvedImportedTextures.clear();
|
|
34479
34868
|
}
|
|
34480
34869
|
// ─── Private ────────────────────────────────────────────────────────
|
|
34870
|
+
/** @internal */ _normalizeProfilingOptions(options, fallbackDevice) {
|
|
34871
|
+
const source = typeof options === 'object' ? options : {};
|
|
34872
|
+
const enabled = typeof options === 'boolean' ? options : source.enabled ?? true;
|
|
34873
|
+
return {
|
|
34874
|
+
enabled,
|
|
34875
|
+
graph: source.graph ?? DEFAULT_PROFILING_OPTIONS.graph,
|
|
34876
|
+
pass: source.pass ?? DEFAULT_PROFILING_OPTIONS.pass,
|
|
34877
|
+
subpass: source.subpass ?? DEFAULT_PROFILING_OPTIONS.subpass,
|
|
34878
|
+
includePendingUploads: source.includePendingUploads ?? DEFAULT_PROFILING_OPTIONS.includePendingUploads,
|
|
34879
|
+
allowCrossFrame: source.allowCrossFrame ?? DEFAULT_PROFILING_OPTIONS.allowCrossFrame,
|
|
34880
|
+
maxPendingFrames: Math.max(1, source.maxPendingFrames ?? DEFAULT_PROFILING_OPTIONS.maxPendingFrames),
|
|
34881
|
+
label: source.label ?? DEFAULT_PROFILING_OPTIONS.label,
|
|
34882
|
+
device: source.device ?? fallbackDevice
|
|
34883
|
+
};
|
|
34884
|
+
}
|
|
34885
|
+
/** @internal */ _getProfilingDevice() {
|
|
34886
|
+
if (this._profilingOptions.device) {
|
|
34887
|
+
return this._profilingOptions.device;
|
|
34888
|
+
}
|
|
34889
|
+
try {
|
|
34890
|
+
return getDevice();
|
|
34891
|
+
} catch {
|
|
34892
|
+
return null;
|
|
34893
|
+
}
|
|
34894
|
+
}
|
|
34895
|
+
/** @internal */ _beginProfileFrame() {
|
|
34896
|
+
if (!this._profilingOptions.enabled) {
|
|
34897
|
+
return null;
|
|
34898
|
+
}
|
|
34899
|
+
const device = this._getProfilingDevice();
|
|
34900
|
+
const supported = !!device?.getDeviceCaps().miscCaps.supportTimestampQuery;
|
|
34901
|
+
const rootResult = {
|
|
34902
|
+
name: this._profilingOptions.label,
|
|
34903
|
+
type: 'graph',
|
|
34904
|
+
queryId: 0,
|
|
34905
|
+
durationMs: 0,
|
|
34906
|
+
status: supported ? 'resolved' : 'unsupported',
|
|
34907
|
+
children: [],
|
|
34908
|
+
message: supported ? undefined : 'GPU timestamp queries are not supported'
|
|
34909
|
+
};
|
|
34910
|
+
const result = {
|
|
34911
|
+
frameId: device?.frameInfo.frameCounter ?? -1,
|
|
34912
|
+
status: rootResult.status,
|
|
34913
|
+
graph: rootResult,
|
|
34914
|
+
passes: rootResult.children
|
|
34915
|
+
};
|
|
34916
|
+
const root = {
|
|
34917
|
+
result: rootResult,
|
|
34918
|
+
queryId: 0,
|
|
34919
|
+
ended: false
|
|
34920
|
+
};
|
|
34921
|
+
const frame = {
|
|
34922
|
+
serial: ++RenderGraphExecutor._nextProfileSerial,
|
|
34923
|
+
device,
|
|
34924
|
+
supported,
|
|
34925
|
+
result,
|
|
34926
|
+
root,
|
|
34927
|
+
scopes: [],
|
|
34928
|
+
resolvePromise: Promise.resolve(result)
|
|
34929
|
+
};
|
|
34930
|
+
if (this._profilingOptions.graph) {
|
|
34931
|
+
this._beginTimestampScope(frame, root, this._profilingOptions.label);
|
|
34932
|
+
}
|
|
34933
|
+
return frame;
|
|
34934
|
+
}
|
|
34935
|
+
/** @internal */ _beginPassProfileScope(frame, pass) {
|
|
34936
|
+
if (!frame || !this._profilingOptions.pass && !this._profilingOptions.subpass) {
|
|
34937
|
+
return null;
|
|
34938
|
+
}
|
|
34939
|
+
return this._beginProfileScope(frame, frame.root, 'pass', pass.name, this._profilingOptions.pass);
|
|
34940
|
+
}
|
|
34941
|
+
/** @internal */ _beginSubpassProfileScope(frame, passScope, pass, subpassName) {
|
|
34942
|
+
if (!frame || !this._profilingOptions.subpass) {
|
|
34943
|
+
return null;
|
|
34944
|
+
}
|
|
34945
|
+
const parent = passScope ?? frame.root;
|
|
34946
|
+
return this._beginProfileScope(frame, parent, 'subpass', subpassName, true, `${pass.name}/${subpassName}`);
|
|
34947
|
+
}
|
|
34948
|
+
/** @internal */ _beginProfileScope(frame, parent, type, name, queryEnabled, queryLabel) {
|
|
34949
|
+
const status = frame.supported && !queryEnabled ? 'resolved' : frame.supported ? 'pending' : 'unsupported';
|
|
34950
|
+
const result = {
|
|
34951
|
+
name,
|
|
34952
|
+
type,
|
|
34953
|
+
queryId: 0,
|
|
34954
|
+
durationMs: 0,
|
|
34955
|
+
status,
|
|
34956
|
+
children: [],
|
|
34957
|
+
message: frame.supported ? undefined : 'GPU timestamp queries are not supported'
|
|
34958
|
+
};
|
|
34959
|
+
parent.result.children.push(result);
|
|
34960
|
+
const scope = {
|
|
34961
|
+
result,
|
|
34962
|
+
queryId: 0,
|
|
34963
|
+
ended: false
|
|
34964
|
+
};
|
|
34965
|
+
if (queryEnabled) {
|
|
34966
|
+
this._beginTimestampScope(frame, scope, queryLabel ?? name);
|
|
34967
|
+
}
|
|
34968
|
+
return scope;
|
|
34969
|
+
}
|
|
34970
|
+
/** @internal */ _beginTimestampScope(frame, scope, label) {
|
|
34971
|
+
if (!frame.supported || !frame.device) {
|
|
34972
|
+
scope.result.status = 'unsupported';
|
|
34973
|
+
scope.result.message = 'GPU timestamp queries are not supported';
|
|
34974
|
+
return;
|
|
34975
|
+
}
|
|
34976
|
+
const queryId = frame.device.beginTimestampQuery(label, {
|
|
34977
|
+
includePendingUploads: this._profilingOptions.includePendingUploads,
|
|
34978
|
+
allowCrossFrame: this._profilingOptions.allowCrossFrame
|
|
34979
|
+
});
|
|
34980
|
+
scope.queryId = queryId;
|
|
34981
|
+
scope.result.queryId = queryId;
|
|
34982
|
+
if (queryId > 0) {
|
|
34983
|
+
scope.result.status = 'pending';
|
|
34984
|
+
frame.scopes.push(scope);
|
|
34985
|
+
} else {
|
|
34986
|
+
scope.result.status = 'unsupported';
|
|
34987
|
+
scope.result.message = 'GPU timestamp query was not started';
|
|
34988
|
+
}
|
|
34989
|
+
}
|
|
34990
|
+
/** @internal */ _endProfileScope(frame, scope) {
|
|
34991
|
+
if (!frame || !frame.device || !scope || scope.ended) {
|
|
34992
|
+
return;
|
|
34993
|
+
}
|
|
34994
|
+
scope.ended = true;
|
|
34995
|
+
if (scope.queryId > 0) {
|
|
34996
|
+
frame.device.endTimestampQuery(scope.queryId);
|
|
34997
|
+
}
|
|
34998
|
+
}
|
|
34999
|
+
/** @internal */ _finishProfileFrame(frame) {
|
|
35000
|
+
if (!frame) {
|
|
35001
|
+
return;
|
|
35002
|
+
}
|
|
35003
|
+
this._endProfileScope(frame, frame.root);
|
|
35004
|
+
if (frame.scopes.length === 0 || !frame.device) {
|
|
35005
|
+
frame.result.status = this._aggregateProfileStatus(frame.result.graph);
|
|
35006
|
+
this._publishProfileResult(frame);
|
|
35007
|
+
return;
|
|
35008
|
+
}
|
|
35009
|
+
frame.resolvePromise = Promise.all(frame.scopes.map((scope)=>frame.device.resolveTimestampQuery(scope.queryId))).then((results)=>{
|
|
35010
|
+
for(let i = 0; i < results.length; i++){
|
|
35011
|
+
this._applyTimestampResult(frame.scopes[i], results[i]);
|
|
35012
|
+
}
|
|
35013
|
+
frame.result.status = this._aggregateProfileStatus(frame.result.graph);
|
|
35014
|
+
this._publishProfileResult(frame);
|
|
35015
|
+
return frame.result;
|
|
35016
|
+
}).catch((err)=>{
|
|
35017
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
35018
|
+
for (const scope of frame.scopes){
|
|
35019
|
+
scope.result.status = 'failed';
|
|
35020
|
+
scope.result.message = message;
|
|
35021
|
+
}
|
|
35022
|
+
frame.result.status = 'failed';
|
|
35023
|
+
this._publishProfileResult(frame);
|
|
35024
|
+
return frame.result;
|
|
35025
|
+
});
|
|
35026
|
+
this._trackPendingProfileFrame(frame);
|
|
35027
|
+
}
|
|
35028
|
+
/** @internal */ _trackPendingProfileFrame(frame) {
|
|
35029
|
+
this._pendingProfileFrames.push(frame);
|
|
35030
|
+
while(this._pendingProfileFrames.length > this._profilingOptions.maxPendingFrames){
|
|
35031
|
+
this._pendingProfileFrames.shift();
|
|
35032
|
+
}
|
|
35033
|
+
RenderGraphExecutor._latestPendingProfileFrame = frame;
|
|
35034
|
+
}
|
|
35035
|
+
/** @internal */ _publishProfileResult(frame) {
|
|
35036
|
+
this._pendingProfileFrames = this._pendingProfileFrames.filter((pending)=>pending !== frame);
|
|
35037
|
+
if (frame.serial >= this._latestResolvedProfileSerial) {
|
|
35038
|
+
this._latestResolvedProfileSerial = frame.serial;
|
|
35039
|
+
this._latestProfileResult = frame.result;
|
|
35040
|
+
}
|
|
35041
|
+
if (frame.serial >= RenderGraphExecutor._latestResolvedProfileSerial) {
|
|
35042
|
+
RenderGraphExecutor._latestResolvedProfileSerial = frame.serial;
|
|
35043
|
+
RenderGraphExecutor._latestProfileResult = frame.result;
|
|
35044
|
+
}
|
|
35045
|
+
if (RenderGraphExecutor._latestPendingProfileFrame === frame) {
|
|
35046
|
+
RenderGraphExecutor._latestPendingProfileFrame = null;
|
|
35047
|
+
}
|
|
35048
|
+
}
|
|
35049
|
+
/** @internal */ _applyTimestampResult(scope, result) {
|
|
35050
|
+
scope.result.queryId = result.id;
|
|
35051
|
+
scope.result.durationMs = result.durationMs;
|
|
35052
|
+
scope.result.status = result.status;
|
|
35053
|
+
scope.result.message = result.message;
|
|
35054
|
+
}
|
|
35055
|
+
/** @internal */ _aggregateProfileStatus(scope) {
|
|
35056
|
+
const statuses = [];
|
|
35057
|
+
const collect = (node)=>{
|
|
35058
|
+
statuses.push(node.status);
|
|
35059
|
+
for (const child of node.children){
|
|
35060
|
+
collect(child);
|
|
35061
|
+
}
|
|
35062
|
+
};
|
|
35063
|
+
collect(scope);
|
|
35064
|
+
for (const status of [
|
|
35065
|
+
'failed',
|
|
35066
|
+
'invalid',
|
|
35067
|
+
'exhausted',
|
|
35068
|
+
'pending',
|
|
35069
|
+
'auto-closed'
|
|
35070
|
+
]){
|
|
35071
|
+
if (statuses.includes(status)) {
|
|
35072
|
+
return status;
|
|
35073
|
+
}
|
|
35074
|
+
}
|
|
35075
|
+
if (statuses.includes('unsupported')) {
|
|
35076
|
+
return 'unsupported';
|
|
35077
|
+
}
|
|
35078
|
+
return 'resolved';
|
|
35079
|
+
}
|
|
34481
35080
|
/** @internal */ _resolveSize(desc) {
|
|
34482
35081
|
const mode = desc.sizeMode ?? 'backbuffer-relative';
|
|
34483
35082
|
if (mode === 'absolute') {
|
|
@@ -41257,7 +41856,7 @@ class DepthLimitAOBlurBlitter extends BilateralBlurBlitter {
|
|
|
41257
41856
|
device.clearFrameBuffer(packed ? new Vector4(0, 0, 0, 1) : new Vector4(1, 0, 0, 1), null, null);
|
|
41258
41857
|
const bindgroup = packed ? SAO._bindgroupPacked : SAO._bindgroup;
|
|
41259
41858
|
bindgroup.setValue('flip', this.needFlip(device) ? 1 : 0);
|
|
41260
|
-
bindgroup.setTexture('depthTex', sceneDepthTexture);
|
|
41859
|
+
bindgroup.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));
|
|
41261
41860
|
bindgroup.setValue('scale', this._saoScale);
|
|
41262
41861
|
bindgroup.setValue('invProj', Matrix4x4.invert(ctx.camera.getProjectionMatrix()));
|
|
41263
41862
|
bindgroup.setValue('bias', this._saoBias);
|
|
@@ -44342,6 +44941,24 @@ function getLightPassColorAttachments(ctx, colorAttachment) {
|
|
|
44342
44941
|
sss: !!sss
|
|
44343
44942
|
};
|
|
44344
44943
|
}
|
|
44944
|
+
// ─── Forward+ Graph Builder ─────────────────────────────────────────
|
|
44945
|
+
/**
|
|
44946
|
+
* Constructs a render graph representing the forward+ pipeline.
|
|
44947
|
+
*
|
|
44948
|
+
* Each step in the existing `SceneRenderer._renderScene` becomes a graph pass.
|
|
44949
|
+
* Execute callbacks delegate to the existing rendering code, sharing a mutable
|
|
44950
|
+
* `FrameState`.
|
|
44951
|
+
*
|
|
44952
|
+
* @param graph - The render graph to populate.
|
|
44953
|
+
* @param ctx - The draw context for this frame.
|
|
44954
|
+
* @param renderQueue - The culled render queue.
|
|
44955
|
+
* @param options - Pipeline feature toggles.
|
|
44956
|
+
* @returns The backbuffer handle (graph output).
|
|
44957
|
+
*
|
|
44958
|
+
* @public
|
|
44959
|
+
*/ function buildForwardPlusGraph(graph, ctx, renderQueue, options) {
|
|
44960
|
+
return buildForwardPlusGraphInternal(graph, ctx, renderQueue, options).backbuffer;
|
|
44961
|
+
}
|
|
44345
44962
|
function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
|
|
44346
44963
|
const backbuffer = graph.importTexture('backbuffer');
|
|
44347
44964
|
ctx.SSS = !!options.sss;
|
|
@@ -60559,7 +61176,7 @@ function segmentMayCollideBroadPhase(point1, point2, colRW) {
|
|
|
60559
61176
|
return pointMayCollideBroadPhase(point1, colRW);
|
|
60560
61177
|
}
|
|
60561
61178
|
const toCenter = Vector3.sub(colRW.boundsCenter, point1, _broadPhaseToCenter);
|
|
60562
|
-
const t = clamp01$
|
|
61179
|
+
const t = clamp01$2(Vector3.dot(toCenter, segmentDir) / lenSq);
|
|
60563
61180
|
const closestPoint = Vector3.scale(segmentDir, t, _broadPhaseClosestPoint);
|
|
60564
61181
|
Vector3.add(point1, closestPoint, closestPoint);
|
|
60565
61182
|
const delta = Vector3.sub(colRW.boundsCenter, closestPoint, _broadPhaseDelta);
|
|
@@ -60606,7 +61223,7 @@ function pointUpdatePass1(pointsR, pointsRW, stepDelta, stepTime_x2_half, rootSl
|
|
|
60606
61223
|
// Applying resistance to gravity would incorrectly attenuate acceleration each frame,
|
|
60607
61224
|
// causing energy errors and instability under high gravity.
|
|
60608
61225
|
Vector3.scale(moveDir, ptR.resistance, moveDir);
|
|
60609
|
-
Vector3.scale(moveDir, 1.0 - clamp01$
|
|
61226
|
+
Vector3.scale(moveDir, 1.0 - clamp01$2(ptRW.friction * ptR.frictionScale), moveDir);
|
|
60610
61227
|
// Clamp per-step velocity to a multiple of bone rest length.
|
|
60611
61228
|
// During fast root rotations the Verlet velocity can become very large,
|
|
60612
61229
|
// overwhelming the constraint solver and causing the hair to lose shape.
|
|
@@ -60750,7 +61367,7 @@ function surfaceCollision(pointsRW, collidersR, collidersRW, surfaceConstraints)
|
|
|
60750
61367
|
Vector3.sub(rwPt.positionCurrent, result.intersectionPoint, intersectToPt);
|
|
60751
61368
|
const intersectLen = intersectToPt.magnitude;
|
|
60752
61369
|
let rate = intersectLen > EPSILON$1 ? centerToPt.magnitude / intersectLen : 0;
|
|
60753
|
-
rate = clamp01$
|
|
61370
|
+
rate = clamp01$2(Math.abs(rate));
|
|
60754
61371
|
Vector3.scale(pushDir, (result.radius - pushMag) * rate, pushVec);
|
|
60755
61372
|
Vector3.add(rwPt.positionCurrent, pushVec, rwPt.positionCurrent);
|
|
60756
61373
|
}
|
|
@@ -61025,8 +61642,8 @@ function constraintUpdate(pointsR, pointsRW, constraints, collidersR, collidersR
|
|
|
61025
61642
|
const pushDist = pushout.magnitude;
|
|
61026
61643
|
if (pushDist > EPSILON$1) {
|
|
61027
61644
|
const ptDist = Vector3.sub(rwB.positionCurrent, rwA.positionCurrent, segment).magnitude * 0.5;
|
|
61028
|
-
const rateP1 = ptDist > EPSILON$1 ? clamp01$
|
|
61029
|
-
const rateP2 = ptDist > EPSILON$1 ? clamp01$
|
|
61645
|
+
const rateP1 = ptDist > EPSILON$1 ? clamp01$2(Vector3.sub(lineRes.pointOnLine, rwA.positionCurrent, pointToA).magnitude / ptDist) : 0;
|
|
61646
|
+
const rateP2 = ptDist > EPSILON$1 ? clamp01$2(Vector3.sub(lineRes.pointOnLine, rwB.positionCurrent, pointToB).magnitude / ptDist) : 0;
|
|
61030
61647
|
Vector3.scale(pushout, 1 / pushDist, pushN);
|
|
61031
61648
|
Vector3.scale(pushN, Math.max(lineRes.radius - pushDist, 0), pushVec);
|
|
61032
61649
|
if (weightA > EPSILON$1) {
|
|
@@ -61038,7 +61655,7 @@ function constraintUpdate(pointsR, pointsRW, constraints, collidersR, collidersR
|
|
|
61038
61655
|
Vector3.add(rwB.positionCurrent, scaledDisp, rwB.positionCurrent);
|
|
61039
61656
|
}
|
|
61040
61657
|
const dotUp = Vector3.dot(AXIS_Y, Vector3.normalize(pushout, pushN));
|
|
61041
|
-
friction = Math.max(friction, colR.friction * clamp01$
|
|
61658
|
+
friction = Math.max(friction, colR.friction * clamp01$2(dotUp));
|
|
61042
61659
|
}
|
|
61043
61660
|
}
|
|
61044
61661
|
}
|
|
@@ -61933,7 +62550,7 @@ function isBoneFixed(roots, index) {
|
|
|
61933
62550
|
this._config.constraintShrinkLimit = Math.max(0, config.constraintShrinkLimit);
|
|
61934
62551
|
}
|
|
61935
62552
|
if (typeof config.blendRatio === 'number') {
|
|
61936
|
-
this._config.blendRatio = clamp01$
|
|
62553
|
+
this._config.blendRatio = clamp01$2(config.blendRatio);
|
|
61937
62554
|
}
|
|
61938
62555
|
if (typeof config.stabilizationFrameRate === 'number') {
|
|
61939
62556
|
this._config.stabilizationFrameRate = config.stabilizationFrameRate;
|
|
@@ -62165,7 +62782,7 @@ function isBoneFixed(roots, index) {
|
|
|
62165
62782
|
return this._config.blendRatio;
|
|
62166
62783
|
}
|
|
62167
62784
|
set blendRatio(value) {
|
|
62168
|
-
this._config.blendRatio = clamp01$
|
|
62785
|
+
this._config.blendRatio = clamp01$2(value);
|
|
62169
62786
|
}
|
|
62170
62787
|
/**
|
|
62171
62788
|
* Pauses or resumes the physics simulation.
|
|
@@ -62415,10 +63032,10 @@ function isBoneFixed(roots, index) {
|
|
|
62415
63032
|
}
|
|
62416
63033
|
_computeBlendRatio() {
|
|
62417
63034
|
if (this._fadeState === 'in') {
|
|
62418
|
-
return 1.0 - clamp01$
|
|
63035
|
+
return 1.0 - clamp01$2(this._fadeTimer / this._fadeDuration);
|
|
62419
63036
|
}
|
|
62420
63037
|
if (this._fadeState === 'out') {
|
|
62421
|
-
return clamp01$
|
|
63038
|
+
return clamp01$2(this._fadeTimer / this._fadeDuration);
|
|
62422
63039
|
}
|
|
62423
63040
|
return this._config.blendRatio;
|
|
62424
63041
|
}
|
|
@@ -62604,8 +63221,8 @@ function isBoneFixed(roots, index) {
|
|
|
62604
63221
|
const allShrinkScale = c.allShrinkScale.evaluate(rate);
|
|
62605
63222
|
const allStretchScale = c.allStretchScale.evaluate(rate);
|
|
62606
63223
|
point.mass = c.massScale.evaluate(rate);
|
|
62607
|
-
point.resistance = clamp01$
|
|
62608
|
-
point.hardness = clamp01$
|
|
63224
|
+
point.resistance = clamp01$2(c.resistance.evaluate(rate));
|
|
63225
|
+
point.hardness = clamp01$2(c.hardness.evaluate(rate));
|
|
62609
63226
|
point.frictionScale = c.friction.evaluate(rate);
|
|
62610
63227
|
point.sliderJointLength = c.sliderJointLength.evaluate(rate);
|
|
62611
63228
|
point.structuralShrinkVertical = c.structuralShrinkVertical.evaluate(rate) * allShrinkScale * 0.5;
|
|
@@ -62728,7 +63345,7 @@ function isBoneFixed(roots, index) {
|
|
|
62728
63345
|
config.relaxation = Math.max(0, Math.trunc(config.relaxation));
|
|
62729
63346
|
config.subSteps = Math.max(1, Math.trunc(config.subSteps));
|
|
62730
63347
|
config.constraintShrinkLimit = Math.max(0, config.constraintShrinkLimit);
|
|
62731
|
-
config.blendRatio = clamp01$
|
|
63348
|
+
config.blendRatio = clamp01$2(config.blendRatio);
|
|
62732
63349
|
return config;
|
|
62733
63350
|
}
|
|
62734
63351
|
}
|
|
@@ -65231,6 +65848,74 @@ function createJointDynamicsCurveProp(name, key, label, description) {
|
|
|
65231
65848
|
}
|
|
65232
65849
|
};
|
|
65233
65850
|
}
|
|
65851
|
+
/** @internal */ function getMorphTargetGroupTrackClass() {
|
|
65852
|
+
return {
|
|
65853
|
+
ctor: MorphTargetGroupTrack,
|
|
65854
|
+
name: 'MorphTargetGroupTrack',
|
|
65855
|
+
getProps () {
|
|
65856
|
+
return defineProps([
|
|
65857
|
+
{
|
|
65858
|
+
name: 'TrackName',
|
|
65859
|
+
description: 'The track name',
|
|
65860
|
+
type: 'string',
|
|
65861
|
+
options: {
|
|
65862
|
+
label: 'Name'
|
|
65863
|
+
},
|
|
65864
|
+
get (value) {
|
|
65865
|
+
value.str[0] = this.name;
|
|
65866
|
+
},
|
|
65867
|
+
set (value) {
|
|
65868
|
+
this.name = value.str[0];
|
|
65869
|
+
}
|
|
65870
|
+
},
|
|
65871
|
+
{
|
|
65872
|
+
name: 'GroupName',
|
|
65873
|
+
description: 'Morph target group controlled by this track',
|
|
65874
|
+
type: 'string',
|
|
65875
|
+
get (value) {
|
|
65876
|
+
value.str[0] = this.groupName;
|
|
65877
|
+
},
|
|
65878
|
+
set (value) {
|
|
65879
|
+
this.groupName = value.str[0];
|
|
65880
|
+
}
|
|
65881
|
+
},
|
|
65882
|
+
{
|
|
65883
|
+
name: 'Interpolator',
|
|
65884
|
+
description: 'Scalar interpolator object for this track',
|
|
65885
|
+
type: 'object',
|
|
65886
|
+
options: {
|
|
65887
|
+
objectTypes: [
|
|
65888
|
+
Interpolator
|
|
65889
|
+
]
|
|
65890
|
+
},
|
|
65891
|
+
isHidden () {
|
|
65892
|
+
return true;
|
|
65893
|
+
},
|
|
65894
|
+
get (value) {
|
|
65895
|
+
value.object[0] = this.interpolator;
|
|
65896
|
+
},
|
|
65897
|
+
set (value) {
|
|
65898
|
+
this.interpolator = value.object[0];
|
|
65899
|
+
}
|
|
65900
|
+
},
|
|
65901
|
+
{
|
|
65902
|
+
name: 'TrackTarget',
|
|
65903
|
+
description: 'Target object this track applys to',
|
|
65904
|
+
type: 'string',
|
|
65905
|
+
isHidden () {
|
|
65906
|
+
return true;
|
|
65907
|
+
},
|
|
65908
|
+
get (value) {
|
|
65909
|
+
value.str[0] = this.target;
|
|
65910
|
+
},
|
|
65911
|
+
set (value) {
|
|
65912
|
+
this.target = value.str[0];
|
|
65913
|
+
}
|
|
65914
|
+
}
|
|
65915
|
+
]);
|
|
65916
|
+
}
|
|
65917
|
+
};
|
|
65918
|
+
}
|
|
65234
65919
|
function encodeFloat32Array(values) {
|
|
65235
65920
|
return uint8ArrayToBase64(new Uint8Array(values.buffer, values.byteOffset, values.byteLength));
|
|
65236
65921
|
}
|
|
@@ -79775,6 +80460,7 @@ const defaultValues = {
|
|
|
79775
80460
|
getFixedGeometryCacheTrackClass(),
|
|
79776
80461
|
getPCAGeometryCacheTrackClass(),
|
|
79777
80462
|
getMorphTrackClass(),
|
|
80463
|
+
getMorphTargetGroupTrackClass(),
|
|
79778
80464
|
getSceneNodeClass(this),
|
|
79779
80465
|
getGraphNodeClass(),
|
|
79780
80466
|
getMeshClass(),
|
|
@@ -91519,6 +92205,14 @@ class GPUClothWrapBinding {
|
|
|
91519
92205
|
animation.addTrack(mesh, morphTrack);
|
|
91520
92206
|
}
|
|
91521
92207
|
}
|
|
92208
|
+
} else if (track.type === 'morph-target-group') {
|
|
92209
|
+
const groupName = track.morphTargetGroupName;
|
|
92210
|
+
if (groupName) {
|
|
92211
|
+
const morphTargetGroupTrack = new MorphTargetGroupTrack(groupName, track.interpolator, true);
|
|
92212
|
+
morphTargetGroupTrack.name = groupName;
|
|
92213
|
+
morphTargetGroupTrack.target = group.persistentId;
|
|
92214
|
+
animation.addTrack(group, morphTargetGroupTrack);
|
|
92215
|
+
}
|
|
91522
92216
|
} else if (track.type === 'geometry-cache') {
|
|
91523
92217
|
const subMesh = track.node.mesh?.subMeshes[track.subMeshIndex];
|
|
91524
92218
|
const mesh = subMesh ? meshMap.get(subMesh) : null;
|
|
@@ -95220,5 +95914,5 @@ const DEFAULT_PADDING = 6;
|
|
|
95220
95914
|
}
|
|
95221
95915
|
}
|
|
95222
95916
|
|
|
95223
|
-
export { AABBTree, ABufferOIT, ATMOSPHERIC_FOG_BIT, AbsNode, AbstractPostEffect, AllConditionNode, AnimationClip, AnimationController, AnimationPlayback, AnimationSet, AnimationTimeline, AnimationTimelineRunner, AnimationTrack, AnyConditionNode, Application, ArcCosNode, ArcSinNode, ArcTan2Node, ArcTanNode, ArccosineHNode, ArcsineHNode, ArctangentHNode, AssetHierarchyNode, AssetManager, AssetScene, AssetSkeleton, AvatarOutfitInstance, AvatarWardrobe, BUILTIN_ASSET_TEST_CUBEMAP, BUILTIN_ASSET_TEXTURE_SHEEN_LUT, BaseCameraController, BaseGraphNode, BaseLight, BaseSprite, BaseTextureNode, BatchGroup, BillboardMatrixNode, BlinnMaterial, Blitter, Bloom, BoundingBox, BoxFilterBlitter, BoxFrameShape, BoxShape, CAMERA_POS_Y, CCDSolver, Camera, CameraNearFarNode, CameraPositionNode, CameraVectorNode, CapsuleShape, CeilNode, ClampNode, Clipmap, ClipmapTerrain, ClipmapTerrainMaterial, ColliderForce, ColorAdjust, CompAddNode, CompComparisonNode, CompDivNode, CompMulNode, CompSubNode, Compositor, ConstantBVec2Node, ConstantBVec3Node, ConstantBVec4Node, ConstantBooleanNode, ConstantScalarNode, ConstantTexture2DArrayNode, ConstantTexture2DNode, ConstantTextureCubeNode, ConstantVec2Node, ConstantVec3Node, ConstantVec4Node, ConstraintType, CopyBlitter, CosHNode, CosNode, CrossProductNode, CubemapSHProjector, CullVisitor, CylinderShape, DDXNode, DDYNode, Degrees2RadiansNode, DepthPass, DirectionalLight, DistanceNode, DotProductNode, DracoMeshDecoder, EPSILON$1 as EPSILON, ESM, ElapsedTimeNode, Engine, EnvConstantAmbient, EnvHemisphericAmbient, EnvLightWrapper, EnvShIBL, Environment, EnvironmentLighting, EqualNode, Exp2Node, ExpNode, FABRIKSolver, FBMWaveGenerator, FFTWaveGenerator, FPSCameraController, FWidthNode, FXAA, FaceForwardNode, FixedGeometryCacheTrack, FloorNode, FmaNode, Fog, FontAsset, FractNode, FunctionCallNode, FunctionInputNode, FunctionOutputNode, GPUClothSystem, GaussianBlurBlitter, GenericMathNode, GerstnerWaveGenerator, GraphNode, GrassInstances, GrassLayer, GrassMaterial, GrassQuadtreeNode, GrassRenderer, Grayscale, HEIGHT_FOG_BIT, Hash1Node, Hash2Node, Hash3Node, HistoryResourceManager, HumanoidBodyRig, HumanoidHandRig, IKAngleConstraint, IKChain, IKConstraint, IKModifier, IKSolver, InputManager, InstanceBindGroupAllocator, InstanceIndexNode, InvProjMatrixNode, InvSqrtNode, InvViewProjMatrixNode, JointDynamicsModifier, JointDynamicsSystem, JointDynamicsSystemController, LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_NONE, LIGHT_TYPE_POINT, LIGHT_TYPE_RECT, LIGHT_TYPE_SPOT, LambertMaterial, LengthNode, LightPass, Log2Node, LogNode, LogicallyAndNode, LogicallyOrNode, MAX_CLUSTERED_LIGHTS, MAX_GERSTNER_WAVE_COUNT, MAX_MORPH_ATTRIBUTES, MAX_MORPH_TARGETS, MAX_TERRAIN_MIPMAP_LEVELS, MORPH_ATTRIBUTE_VECTOR_COUNT, MORPH_TARGET_COLOR, MORPH_TARGET_NORMAL, MORPH_TARGET_POSITION, MORPH_TARGET_TANGENT, MORPH_TARGET_TEX0, MORPH_TARGET_TEX1, MORPH_TARGET_TEX2, MORPH_TARGET_TEX3, MORPH_WEIGHTS_VECTOR_COUNT, MSDFText, MSDFTextAtlasManager, MSDFTextSprite, MToonMaterial, MakeVectorNode, Material, MaterialBlueprintIR, MaterialVaryingFlags, MaxNode, Mesh, MeshMaterial, MinNode, MixNode, ModNode, MorphTargetTrack, MultiChainSpringSystem, NamedObject, NodeEulerRotationTrack, NodeRotationTrack, NodeScaleTrack, NodeTranslationTrack, NormalizeNode, NotEqualNode, Octree, OctreeNode, OctreeNodeChunk, OctreePlacement, OrbitCameraController, OrthoCamera, PBRBlockNode, PBRBluePrintMaterial, PBRMetallicRoughnessMaterial, PBRSpecularGlossinessMaterial, PCAGeometryCacheTrack, PCFOPT, PCFPD, PannerNode, ParticleMaterial, ParticleSystem, PerlinNoise2DNode, PerspectiveCamera, PixelNormalNode, PixelWorldPositionNode, PlaneShape, PointLight, PostEffectLayer, PowNode, Primitive, ProjectionMatrixNode, PropertyTrack, PunctualLight, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_DEPTH, RENDER_PASS_TYPE_LIGHT, RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP, Radians2DegreesNode, RaycastVisitor, RectLight, ReflectNode, RefractNode, RenderPass, RenderQueue, RenderTarget, ResolveVertexNormalNode, ResolveVertexPositionNode, ResolveVertexTangentNode, ResourceManager, RotateAboutAxisNode, RuntimeScript, SAO, SSS, SaturateNode, Scene, SceneNode, SceneRenderer, ScreenAdapter, ScreenRenderTarget, ScriptAttachment, ScriptRegistry, ScriptingSystem, SelectionNode, ShaderHelper, ShadowMapPass, ShadowMapper, ShadowRegion, Shape, SharedModel, SignNode, SimplexNoise2DNode, SinHNode, SinNode, Skeleton, SkeletonModifier, SkeletonRig, SkinBinding, SkyEnvTextureNode, SkyRenderer, SmoothStepNode, SphereShape, SpotLight, SpringChain, SpringModifier, SpringSystem, Sprite, SpriteBlockNode, SpriteBlueprintMaterial, SpriteMaterial, SqrtNode, StandardSpriteMaterial, StepNode, SubsurfaceProfile, SwizzleNode, TAA, TAA_DEBUG_ALAPH, TAA_DEBUG_CURRENT_COLOR, TAA_DEBUG_EDGE, TAA_DEBUG_HISTORY_COLOR, TAA_DEBUG_MOTION_VECTOR, TAA_DEBUG_NONE, TAA_DEBUG_STRENGTH, TAA_DEBUG_VELOCITY, TanHNode, TanNode, TetrahedronFrameShape, TetrahedronShape, TextSprite, TextureSampleGrad, TextureSampleNode, Tonemap, TorusShape, TransformNode, TwoBoneIKSolver, UnlitMaterial, VSM, VertexBinormalNode, VertexBlockNode, VertexColorNode, VertexIndexNode, VertexNormalNode, VertexOutputNode, VertexPositionNode, VertexTangentNode, VertexUVNode, ViewMatrixNode, ViewProjMatrixNode, Water, WaterShaderImpl, WeightedBlendedOIT, aerialPerspective, aerialPerspectiveLut, appInstance, applyAngleLimits, applyMaterialMixins, applyResult, applyRuntimeScriptConfig, atmosphereLUTRendered, buildConstraints, buildMSDFShape, buildSurfaceFaces, checkSurfaceCollision, collisionDetection, collisionDetectionCapsule, collisionDetectionSphere, computeMaxDepth, computeNearestPoints, copyTexture, createAPLutProgram, createCapsuleCollider, createGPUClothWrapBindingData, createGeometryCacheState, createGradientNoiseTexture, createMultiScatteringLutProgram, createPlaneCollider, createProgramFFT2H, createProgramFFT2V, createProgramH0, createProgramHk, createProgramOcean, createProgramPostFFT2, createRandomNoiseTexture, createSkyViewLutProgram, createSphereCollider, createSpringConstraint, createSpringParticle, createTransformAccess, createTransmittanceLutProgram, debugTexture, decode2HalfFromRGBA, decodeFloatFromRGBA, decodeNormalizedFloatFromRGBA, decodeRGBM, defineProps, encode2HalfToRGBA, encodeFloatToRGBA, encodeNormalizedFloatToRGBA, encodeRGBM, ensureGeometryCacheMeshBinding, extractLocalTwist, fetchNormalizedFloatForDevice, fetchSampler, gammaToLinear, generateMSDF, getAerialPerspectiveLut, getApp, getAtmosphereParamsStruct, getBatchGroupClass, getCameraClass, getDefaultAtmosphereParams, getDefaultTexture2D, getDefaultTexture2DArray, getDefaultTextureCube, getDevice, getDirectionalLightClass, getEngine, getGraphNodeClass, getInput, getMeshClass, getMultiScattering, getMultiScatteringLut, getNodeTypeComponents, getOrthoCameraClass, getParticleNodeClass, getPerspectiveCameraClass, getPointLightClass, getPunctualLightClass, getRectLightClass, getRuntimeScriptProperties, getSceneNodeClass, getSkyView, getSkyViewLut, getSpotLightClass, getTransmittanceLut, gradient, hash11, hash12, hash13, hash21, hash22, hash23, hash31, hash32, hash33, integralMultiScattering, interleavedGradientNoise, isGPUClothSupported, linearToGamma, mieAbsorption, mieCoefficient, miePhase, mixGeometryCacheBoundingBox, mixinAlbedoColor, mixinBlinnPhong, mixinFoliage, mixinLambert, mixinLight, mixinPBRBluePrint, mixinPBRCommon, mixinPBRMetallicRoughness, mixinPBRSpecularGlossness, mixinTextureProps, mixinVertexColor, multiScatteringLut, noise3D, normalizeRuntimeScriptConfig, normalizeScriptAttachmentConfig, normalizeScriptAttachments, ozoneAbsorption, panoramaToCubemap, perlinNoise2D, perlinNoise3D, prefilterCubemap, pushInCollisionDetection, pushInFromCapsule, pushInFromCollider, pushInFromSphere, pushoutFromCapsule, pushoutFromCollider, pushoutFromSphere, rayIntersectSphere, rayleighCoefficient, rayleighPhase, renderAPLut, renderAtmosphereLUTs, renderMultiScatteringLut, renderSkyViewLut, renderTransmittanceLut, resolveCapsuleCollision, resolvePlaneCollision, resolveSphereCollision, restoreGeometryCacheMeshBinding, scattering, scriptProp, setApp, setSceneMeshAssetBinding, simulate, skyBox, skyViewLut, smoothNoise3D, sortRootPointsByProximity, temporalResolve, transmittance, transmittanceLut, transmittanceLutToUV, transmittanceToSky, tryGetApp, uniformSphereSamples, updateColliderFromNode, uvToTransmittanceLut, uvToViewDir, valueNoise, viewDirToUV, whiteNoise, worleyFBM, worleyNoise };
|
|
95917
|
+
export { AABBTree, ABufferOIT, ATMOSPHERIC_FOG_BIT, AbsNode, AbstractPostEffect, AllConditionNode, AnimationClip, AnimationController, AnimationPlayback, AnimationSet, AnimationTimeline, AnimationTimelineRunner, AnimationTrack, AnyConditionNode, Application, ArcCosNode, ArcSinNode, ArcTan2Node, ArcTanNode, ArccosineHNode, ArcsineHNode, ArctangentHNode, AssetHierarchyNode, AssetManager, AssetScene, AssetSkeleton, AvatarOutfitInstance, AvatarWardrobe, BUILTIN_ASSET_TEST_CUBEMAP, BUILTIN_ASSET_TEXTURE_SHEEN_LUT, BaseCameraController, BaseGraphNode, BaseLight, BaseSprite, BaseTextureNode, BatchGroup, BillboardMatrixNode, BlinnMaterial, Blitter, Bloom, BoundingBox, BoxFilterBlitter, BoxFrameShape, BoxShape, CAMERA_POS_Y, CCDSolver, Camera, CameraNearFarNode, CameraPositionNode, CameraVectorNode, CapsuleShape, CeilNode, ClampNode, Clipmap, ClipmapTerrain, ClipmapTerrainMaterial, ColliderForce, ColorAdjust, CompAddNode, CompComparisonNode, CompDivNode, CompMulNode, CompSubNode, Compositor, ConstantBVec2Node, ConstantBVec3Node, ConstantBVec4Node, ConstantBooleanNode, ConstantScalarNode, ConstantTexture2DArrayNode, ConstantTexture2DNode, ConstantTextureCubeNode, ConstantVec2Node, ConstantVec3Node, ConstantVec4Node, ConstraintType, CopyBlitter, CosHNode, CosNode, CrossProductNode, CubemapSHProjector, CullVisitor, CylinderShape, DDXNode, DDYNode, Degrees2RadiansNode, DepthPass, DevicePoolAllocator, DirectionalLight, DistanceNode, DotProductNode, DracoMeshDecoder, EPSILON$1 as EPSILON, ESM, ElapsedTimeNode, Engine, EnvConstantAmbient, EnvHemisphericAmbient, EnvLightWrapper, EnvShIBL, Environment, EnvironmentLighting, EqualNode, Exp2Node, ExpNode, FABRIKSolver, FBMWaveGenerator, FFTWaveGenerator, FPSCameraController, FWidthNode, FXAA, FaceForwardNode, FixedGeometryCacheTrack, FloorNode, FmaNode, Fog, FontAsset, FractNode, FunctionCallNode, FunctionInputNode, FunctionOutputNode, GPUClothSystem, GaussianBlurBlitter, GenericMathNode, GerstnerWaveGenerator, GraphNode, GrassInstances, GrassLayer, GrassMaterial, GrassQuadtreeNode, GrassRenderer, Grayscale, HEIGHT_FOG_BIT, Hash1Node, Hash2Node, Hash3Node, HistoryResourceManager, HumanoidBodyRig, HumanoidHandRig, IKAngleConstraint, IKChain, IKConstraint, IKModifier, IKSolver, InputManager, InstanceBindGroupAllocator, InstanceIndexNode, InvProjMatrixNode, InvSqrtNode, InvViewProjMatrixNode, JointDynamicsModifier, JointDynamicsSystem, JointDynamicsSystemController, LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_NONE, LIGHT_TYPE_POINT, LIGHT_TYPE_RECT, LIGHT_TYPE_SPOT, LambertMaterial, LengthNode, LightPass, Log2Node, LogNode, LogicallyAndNode, LogicallyOrNode, MAX_CLUSTERED_LIGHTS, MAX_GERSTNER_WAVE_COUNT, MAX_MORPH_ATTRIBUTES, MAX_MORPH_TARGETS, MAX_TERRAIN_MIPMAP_LEVELS, MORPH_ATTRIBUTE_VECTOR_COUNT, MORPH_TARGET_COLOR, MORPH_TARGET_NORMAL, MORPH_TARGET_POSITION, MORPH_TARGET_TANGENT, MORPH_TARGET_TEX0, MORPH_TARGET_TEX1, MORPH_TARGET_TEX2, MORPH_TARGET_TEX3, MORPH_WEIGHTS_VECTOR_COUNT, MSDFText, MSDFTextAtlasManager, MSDFTextSprite, MToonMaterial, MakeVectorNode, Material, MaterialBlueprintIR, MaterialVaryingFlags, MaxNode, Mesh, MeshMaterial, MinNode, MixNode, ModNode, MorphTargetGroupTrack, MorphTargetTrack, MultiChainSpringSystem, NamedObject, NodeEulerRotationTrack, NodeRotationTrack, NodeScaleTrack, NodeTranslationTrack, NormalizeNode, NotEqualNode, Octree, OctreeNode, OctreeNodeChunk, OctreePlacement, OrbitCameraController, OrthoCamera, PBRBlockNode, PBRBluePrintMaterial, PBRMetallicRoughnessMaterial, PBRSpecularGlossinessMaterial, PCAGeometryCacheTrack, PCFOPT, PCFPD, PannerNode, ParticleMaterial, ParticleSystem, PerlinNoise2DNode, PerspectiveCamera, PixelNormalNode, PixelWorldPositionNode, PlaneShape, PointLight, PostEffectLayer, PowNode, Primitive, ProjectionMatrixNode, PropertyTrack, PunctualLight, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_DEPTH, RENDER_PASS_TYPE_LIGHT, RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP, RGHandle, RGHistoryResources, RGSubpass, Radians2DegreesNode, RaycastVisitor, RectLight, ReflectNode, RefractNode, RenderGraph, RenderGraphExecutor, RenderPass, RenderQueue, RenderTarget, ResolveVertexNormalNode, ResolveVertexPositionNode, ResolveVertexTangentNode, ResourceManager, RotateAboutAxisNode, RuntimeScript, SAO, SSS, SaturateNode, Scene, SceneNode, SceneRenderer, ScreenAdapter, ScreenRenderTarget, ScriptAttachment, ScriptRegistry, ScriptingSystem, SelectionNode, ShaderHelper, ShadowMapPass, ShadowMapper, ShadowRegion, Shape, SharedModel, SignNode, SimplexNoise2DNode, SinHNode, SinNode, Skeleton, SkeletonModifier, SkeletonRig, SkinBinding, SkyEnvTextureNode, SkyRenderer, SmoothStepNode, SphereShape, SpotLight, SpringChain, SpringModifier, SpringSystem, Sprite, SpriteBlockNode, SpriteBlueprintMaterial, SpriteMaterial, SqrtNode, StandardSpriteMaterial, StepNode, SubsurfaceProfile, SwizzleNode, TAA, TAA_DEBUG_ALAPH, TAA_DEBUG_CURRENT_COLOR, TAA_DEBUG_EDGE, TAA_DEBUG_HISTORY_COLOR, TAA_DEBUG_MOTION_VECTOR, TAA_DEBUG_NONE, TAA_DEBUG_STRENGTH, TAA_DEBUG_VELOCITY, TanHNode, TanNode, TetrahedronFrameShape, TetrahedronShape, TextSprite, TextureSampleGrad, TextureSampleNode, Tonemap, TorusShape, TransformNode, TwoBoneIKSolver, UnlitMaterial, VSM, VertexBinormalNode, VertexBlockNode, VertexColorNode, VertexIndexNode, VertexNormalNode, VertexOutputNode, VertexPositionNode, VertexTangentNode, VertexUVNode, ViewMatrixNode, ViewProjMatrixNode, Water, WaterShaderImpl, WeightedBlendedOIT, aerialPerspective, aerialPerspectiveLut, appInstance, applyAngleLimits, applyMaterialMixins, applyResult, applyRuntimeScriptConfig, atmosphereLUTRendered, buildConstraints, buildForwardPlusGraph, buildMSDFShape, buildSurfaceFaces, checkSurfaceCollision, collisionDetection, collisionDetectionCapsule, collisionDetectionSphere, computeMaxDepth, computeNearestPoints, copyTexture, createAPLutProgram, createCapsuleCollider, createGPUClothWrapBindingData, createGeometryCacheState, createGradientNoiseTexture, createMultiScatteringLutProgram, createPlaneCollider, createProgramFFT2H, createProgramFFT2V, createProgramH0, createProgramHk, createProgramOcean, createProgramPostFFT2, createRandomNoiseTexture, createSkyViewLutProgram, createSphereCollider, createSpringConstraint, createSpringParticle, createTransformAccess, createTransmittanceLutProgram, debugTexture, decode2HalfFromRGBA, decodeFloatFromRGBA, decodeNormalizedFloatFromRGBA, decodeRGBM, defineProps, encode2HalfToRGBA, encodeFloatToRGBA, encodeNormalizedFloatToRGBA, encodeRGBM, ensureGeometryCacheMeshBinding, executeForwardPlusGraph, extractLocalTwist, fetchNormalizedFloatForDevice, fetchSampler, gammaToLinear, generateMSDF, getAerialPerspectiveLut, getApp, getAtmosphereParamsStruct, getBatchGroupClass, getCameraClass, getDefaultAtmosphereParams, getDefaultTexture2D, getDefaultTexture2DArray, getDefaultTextureCube, getDevice, getDirectionalLightClass, getEngine, getGraphNodeClass, getInput, getMeshClass, getMultiScattering, getMultiScatteringLut, getNodeTypeComponents, getOrthoCameraClass, getParticleNodeClass, getPerspectiveCameraClass, getPointLightClass, getPunctualLightClass, getRectLightClass, getRuntimeScriptProperties, getSceneNodeClass, getSkyView, getSkyViewLut, getSpotLightClass, getTransmittanceLut, gradient, hash11, hash12, hash13, hash21, hash22, hash23, hash31, hash32, hash33, integralMultiScattering, interleavedGradientNoise, isGPUClothSupported, linearToGamma, mieAbsorption, mieCoefficient, miePhase, mixGeometryCacheBoundingBox, mixinAlbedoColor, mixinBlinnPhong, mixinFoliage, mixinLambert, mixinLight, mixinPBRBluePrint, mixinPBRCommon, mixinPBRMetallicRoughness, mixinPBRSpecularGlossness, mixinTextureProps, mixinVertexColor, multiScatteringLut, noise3D, normalizeRuntimeScriptConfig, normalizeScriptAttachmentConfig, normalizeScriptAttachments, ozoneAbsorption, panoramaToCubemap, perlinNoise2D, perlinNoise3D, prefilterCubemap, pushInCollisionDetection, pushInFromCapsule, pushInFromCollider, pushInFromSphere, pushoutFromCapsule, pushoutFromCollider, pushoutFromSphere, rayIntersectSphere, rayleighCoefficient, rayleighPhase, renderAPLut, renderAtmosphereLUTs, renderMultiScatteringLut, renderSkyViewLut, renderTransmittanceLut, resolveCapsuleCollision, resolvePlaneCollision, resolveSphereCollision, restoreGeometryCacheMeshBinding, scattering, scriptProp, setApp, setSceneMeshAssetBinding, simulate, skyBox, skyViewLut, smoothNoise3D, sortRootPointsByProximity, temporalResolve, transmittance, transmittanceLut, transmittanceLutToUV, transmittanceToSky, tryGetApp, uniformSphereSamples, updateColliderFromNode, uvToTransmittanceLut, uvToViewDir, valueNoise, viewDirToUV, whiteNoise, worleyFBM, worleyNoise };
|
|
95224
95918
|
//# sourceMappingURL=zephyr3d_scene.js.map
|