@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.
Files changed (61) hide show
  1. package/dist/assets/{index-ySiLtSxz.js → index-BZ1L8ggE.js} +43 -3
  2. package/dist/assistant/zephyr-types-index.json +13230 -9488
  3. package/dist/images/icon1024.png +0 -0
  4. package/dist/index.html +1 -1
  5. package/dist/modules/zephyr3d_backend-webgl.js +2 -0
  6. package/dist/modules/zephyr3d_backend-webgl.js.map +1 -1
  7. package/dist/modules/zephyr3d_backend-webgpu.js +457 -16
  8. package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
  9. package/dist/modules/zephyr3d_device.js +27 -0
  10. package/dist/modules/zephyr3d_device.js.map +1 -1
  11. package/dist/modules/zephyr3d_loaders.js +208 -1
  12. package/dist/modules/zephyr3d_loaders.js.map +1 -1
  13. package/dist/modules/zephyr3d_scene.js +774 -80
  14. package/dist/modules/zephyr3d_scene.js.map +1 -1
  15. package/dist/vendor/zephyr3d/backend-webgl/dist/capabilities_webgl.js +2 -0
  16. package/dist/vendor/zephyr3d/backend-webgl/dist/capabilities_webgl.js.map +1 -1
  17. package/dist/vendor/zephyr3d/backend-webgpu/dist/capabilities_webgpu.js +2 -0
  18. package/dist/vendor/zephyr3d/backend-webgpu/dist/capabilities_webgpu.js.map +1 -1
  19. package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js +55 -10
  20. package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js.map +1 -1
  21. package/dist/vendor/zephyr3d/backend-webgpu/dist/computepass_webgpu.js +4 -0
  22. package/dist/vendor/zephyr3d/backend-webgpu/dist/computepass_webgpu.js.map +1 -1
  23. package/dist/vendor/zephyr3d/backend-webgpu/dist/device.js +44 -1
  24. package/dist/vendor/zephyr3d/backend-webgpu/dist/device.js.map +1 -1
  25. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js +58 -5
  26. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js.map +1 -1
  27. package/dist/vendor/zephyr3d/backend-webgpu/dist/timestamp_query.js +297 -0
  28. package/dist/vendor/zephyr3d/backend-webgpu/dist/timestamp_query.js.map +1 -0
  29. package/dist/vendor/zephyr3d/device/dist/base_types.js.map +1 -1
  30. package/dist/vendor/zephyr3d/device/dist/device.js +27 -0
  31. package/dist/vendor/zephyr3d/device/dist/device.js.map +1 -1
  32. package/dist/vendor/zephyr3d/device/dist/index.d.ts +81 -1
  33. package/dist/vendor/zephyr3d/loaders/dist/gltf/gltf_importer.js +208 -1
  34. package/dist/vendor/zephyr3d/loaders/dist/gltf/gltf_importer.js.map +1 -1
  35. package/dist/vendor/zephyr3d/loaders/dist/index.d.ts +8 -0
  36. package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js +334 -63
  37. package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js.map +1 -1
  38. package/dist/vendor/zephyr3d/scene/dist/animation/morphtargetgrouptrack.js +66 -0
  39. package/dist/vendor/zephyr3d/scene/dist/animation/morphtargetgrouptrack.js.map +1 -0
  40. package/dist/vendor/zephyr3d/scene/dist/asset/model.js +9 -0
  41. package/dist/vendor/zephyr3d/scene/dist/asset/model.js.map +1 -1
  42. package/dist/vendor/zephyr3d/scene/dist/index.d.ts +260 -4
  43. package/dist/vendor/zephyr3d/scene/dist/index.js +7 -0
  44. package/dist/vendor/zephyr3d/scene/dist/index.js.map +1 -1
  45. package/dist/vendor/zephyr3d/scene/dist/posteffect/sao.js +1 -1
  46. package/dist/vendor/zephyr3d/scene/dist/posteffect/sao.js.map +1 -1
  47. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/executor.js +270 -1
  48. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/executor.js.map +1 -1
  49. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js +19 -1
  50. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  51. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/types.js.map +1 -1
  52. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js +1 -0
  53. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js.map +1 -1
  54. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js +2 -1
  55. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js.map +1 -1
  56. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js +70 -1
  57. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
  58. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
  59. package/package.json +6 -6
  60. package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/convex_collider.js +0 -320
  61. 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, smoothStep, InterpolatorScalar, applyPatch, guessMimeType, diff, PRNG, splitStringByGraphemes, packFloat3, isPowerOf2, clamp as clamp$1, Matrix3x3, PathUtils, textToBase64, HttpFS, MemoryFS, objectEntries, flushPendingDisposals } from '@zephyr3d/base';
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 nodeMap = new Map();
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
- // Match body rig joints
7306
- for (const key of Object.keys(srcHumanoidMapping.body)){
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
- const srcJoint = srcHumanoidMapping.leftHand[key];
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
- const srcJoint = srcHumanoidMapping.rightHand[key];
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 srcFallbackHipsTranslationTrack = !srcRootTranslationTrack && srcRootNode !== srcHipsNode ? findTranslationTrack(sourceClip.tracks.get(srcHipsNode)) : null;
7372
- const srcMotionTrack = srcRootTranslationTrack ?? srcFallbackHipsTranslationTrack;
7373
- const srcMotionNode = srcRootTranslationTrack ? srcRootNode : srcFallbackHipsTranslationTrack ? srcHipsNode : null;
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 mappedSrcNodes = new Set();
7379
- const mappedDstNodes = new Set();
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
- const srcJoint = srcJointsFiltered[fi];
7383
- const dstJoint = dstJointsFiltered[fi];
7384
- if (mappedSrcNodes.has(srcJoint) || mappedDstNodes.has(dstJoint)) {
7385
- continue;
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
- // Register destination skeleton
7402
- dstClip.addSkeleton(dstSkeleton.persistentId);
7403
- bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRootRot, dstRootRot, dstClip, jointRemaps);
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 srcJointsFiltered){
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 dstNode = nodeMap.get(srcNode);
7427
- const remap = jointRemapBySrcNode.get(srcNode);
7428
- for (const srcTrack of srcTracks){
7429
- let dstTrack;
7430
- if (srcTrack instanceof NodeRotationTrack) {
7431
- continue;
7432
- } else if (srcTrack instanceof NodeEulerRotationTrack) {
7433
- continue;
7434
- } else if (srcTrack instanceof NodeTranslationTrack) {
7435
- if (srcNode === srcRootNode || srcTrack === srcMotionTrack || jointTranslations !== 'preserve') {
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 = retargetTranslationTrack(srcTrack, remap);
7439
- } else if (srcTrack instanceof NodeScaleTrack) {
7440
- dstTrack = new NodeScaleTrack(cloneInterpolator(srcTrack.interpolator));
7441
- } else {
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
- constructor(allocator, backbufferWidth, backbufferHeight){
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$1(Vector3.dot(toCenter, segmentDir) / lenSq);
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$1(ptRW.friction * ptR.frictionScale), moveDir);
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$1(Math.abs(rate));
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$1(Vector3.sub(lineRes.pointOnLine, rwA.positionCurrent, pointToA).magnitude / ptDist) : 0;
61029
- const rateP2 = ptDist > EPSILON$1 ? clamp01$1(Vector3.sub(lineRes.pointOnLine, rwB.positionCurrent, pointToB).magnitude / ptDist) : 0;
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$1(dotUp));
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$1(config.blendRatio);
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$1(value);
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$1(this._fadeTimer / this._fadeDuration);
63035
+ return 1.0 - clamp01$2(this._fadeTimer / this._fadeDuration);
62419
63036
  }
62420
63037
  if (this._fadeState === 'out') {
62421
- return clamp01$1(this._fadeTimer / this._fadeDuration);
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$1(c.resistance.evaluate(rate));
62608
- point.hardness = clamp01$1(c.hardness.evaluate(rate));
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$1(config.blendRatio);
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