@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
@@ -9,6 +9,12 @@ const VRM_GRAVITY_ACCELERATION_SCALE = 3;
9
9
  const VRM_GRAVITY_POWER_TO_ACCELERATION = 9.8 * VRM_GRAVITY_ACCELERATION_SCALE;
10
10
  const VRM_STIFFNESS_TO_FRAME_HARDNESS = 0.05;
11
11
  const VRM_DRAGFORCE_SCALE = 0.5;
12
+ const VRMA_LOOK_AT_EXPRESSION_NAMES = new Set([
13
+ 'lookUp',
14
+ 'lookDown',
15
+ 'lookLeft',
16
+ 'lookRight'
17
+ ]);
12
18
  /**
13
19
  * The GLTF/GLB model loader
14
20
  * @public
@@ -787,8 +793,47 @@ const VRM_DRAGFORCE_SCALE = 0.5;
787
793
  model.addSkeleton(skeleton);
788
794
  }
789
795
  }
796
+ this._loadVRMHumanoidSkeletonMappings(gltf, model);
790
797
  this._loadVRMAHumanoidSkeleton(gltf, model);
791
798
  }
799
+ _loadVRMHumanoidSkeletonMappings(gltf, model) {
800
+ const mapping = this._getVRMC1HumanoidMapping(gltf) ?? this._getVRMC0HumanoidMapping(gltf);
801
+ if (!mapping) {
802
+ return;
803
+ }
804
+ for (const skeleton of model.skeletons){
805
+ const skeletonMapping = this._filterHumanoidMappingToSkeleton(mapping, skeleton);
806
+ if (skeletonMapping) {
807
+ this._setAssetSkeletonHumanoidMapping(skeleton, skeletonMapping);
808
+ }
809
+ }
810
+ }
811
+ _getVRMC1HumanoidMapping(gltf) {
812
+ const humanBones = gltf.extensions?.VRMC_vrm?.humanoid?.humanBones;
813
+ if (!humanBones || typeof humanBones !== 'object') {
814
+ return null;
815
+ }
816
+ return this._getVRMAHumanoidMapping(gltf, humanBones);
817
+ }
818
+ _getVRMC0HumanoidMapping(gltf) {
819
+ const humanBones = gltf.extensions?.VRM?.humanoid?.humanBones;
820
+ if (!Array.isArray(humanBones)) {
821
+ return null;
822
+ }
823
+ const byName = {};
824
+ for (const value of humanBones){
825
+ if (!value || typeof value !== 'object') {
826
+ continue;
827
+ }
828
+ const boneInfo = value;
829
+ if (typeof boneInfo.bone === 'string') {
830
+ byName[boneInfo.bone] = {
831
+ node: boneInfo.node
832
+ };
833
+ }
834
+ }
835
+ return this._getVRMC0HumanoidMappingFromBones(gltf, byName);
836
+ }
792
837
  /** @internal */ _loadVRMAHumanoidSkeleton(gltf, model) {
793
838
  const ext = gltf.extensions?.VRMC_vrm_animation;
794
839
  const humanBones = ext?.humanoid?.humanBones;
@@ -916,6 +961,115 @@ const VRM_DRAGFORCE_SCALE = 0.5;
916
961
  }
917
962
  return result;
918
963
  }
964
+ _getVRMC0HumanoidMappingFromBones(gltf, humanBones) {
965
+ const body = {};
966
+ const leftHand = {};
967
+ const rightHand = {};
968
+ const setBody = (vrmName, rig)=>{
969
+ const node = this._getVRMAHumanBoneNode(gltf, humanBones, vrmName);
970
+ if (node) {
971
+ body[rig] = node;
972
+ }
973
+ };
974
+ const setHand = (side, vrmName, rig)=>{
975
+ const node = this._getVRMAHumanBoneNode(gltf, humanBones, vrmName);
976
+ if (node) {
977
+ (side === 'left' ? leftHand : rightHand)[rig] = node;
978
+ }
979
+ };
980
+ setBody('hips', HumanoidBodyRig.Hips);
981
+ setBody('spine', HumanoidBodyRig.Spine);
982
+ setBody('chest', HumanoidBodyRig.Chest);
983
+ setBody('upperChest', HumanoidBodyRig.UpperChest);
984
+ setBody('neck', HumanoidBodyRig.Neck);
985
+ setBody('head', HumanoidBodyRig.Head);
986
+ setBody('leftShoulder', HumanoidBodyRig.LeftShoulder);
987
+ setBody('leftUpperArm', HumanoidBodyRig.LeftUpperArm);
988
+ setBody('leftLowerArm', HumanoidBodyRig.LeftLowerArm);
989
+ setBody('leftHand', HumanoidBodyRig.LeftHand);
990
+ setBody('rightShoulder', HumanoidBodyRig.RightShoulder);
991
+ setBody('rightUpperArm', HumanoidBodyRig.RightUpperArm);
992
+ setBody('rightLowerArm', HumanoidBodyRig.RightLowerArm);
993
+ setBody('rightHand', HumanoidBodyRig.RightHand);
994
+ setBody('leftUpperLeg', HumanoidBodyRig.LeftUpperLeg);
995
+ setBody('leftLowerLeg', HumanoidBodyRig.LeftLowerLeg);
996
+ setBody('leftFoot', HumanoidBodyRig.LeftFoot);
997
+ setBody('leftToes', HumanoidBodyRig.LeftToes);
998
+ setBody('rightUpperLeg', HumanoidBodyRig.RightUpperLeg);
999
+ setBody('rightLowerLeg', HumanoidBodyRig.RightLowerLeg);
1000
+ setBody('rightFoot', HumanoidBodyRig.RightFoot);
1001
+ setBody('rightToes', HumanoidBodyRig.RightToes);
1002
+ setHand('left', 'leftThumbProximal', HumanoidHandRig.ThumbProximal);
1003
+ setHand('left', 'leftThumbIntermediate', HumanoidHandRig.ThumbIntermediate);
1004
+ setHand('left', 'leftThumbDistal', HumanoidHandRig.ThumbDistal);
1005
+ setHand('left', 'leftIndexProximal', HumanoidHandRig.IndexProximal);
1006
+ setHand('left', 'leftIndexIntermediate', HumanoidHandRig.IndexIntermediate);
1007
+ setHand('left', 'leftIndexDistal', HumanoidHandRig.IndexDistal);
1008
+ setHand('left', 'leftMiddleProximal', HumanoidHandRig.MiddleProximal);
1009
+ setHand('left', 'leftMiddleIntermediate', HumanoidHandRig.MiddleIntermediate);
1010
+ setHand('left', 'leftMiddleDistal', HumanoidHandRig.MiddleDistal);
1011
+ setHand('left', 'leftRingProximal', HumanoidHandRig.RingProximal);
1012
+ setHand('left', 'leftRingIntermediate', HumanoidHandRig.RingIntermediate);
1013
+ setHand('left', 'leftRingDistal', HumanoidHandRig.RingDistal);
1014
+ setHand('left', 'leftLittleProximal', HumanoidHandRig.PinkyProximal);
1015
+ setHand('left', 'leftLittleIntermediate', HumanoidHandRig.PinkyIntermediate);
1016
+ setHand('left', 'leftLittleDistal', HumanoidHandRig.PinkyDistal);
1017
+ setHand('right', 'rightThumbProximal', HumanoidHandRig.ThumbProximal);
1018
+ setHand('right', 'rightThumbIntermediate', HumanoidHandRig.ThumbIntermediate);
1019
+ setHand('right', 'rightThumbDistal', HumanoidHandRig.ThumbDistal);
1020
+ setHand('right', 'rightIndexProximal', HumanoidHandRig.IndexProximal);
1021
+ setHand('right', 'rightIndexIntermediate', HumanoidHandRig.IndexIntermediate);
1022
+ setHand('right', 'rightIndexDistal', HumanoidHandRig.IndexDistal);
1023
+ setHand('right', 'rightMiddleProximal', HumanoidHandRig.MiddleProximal);
1024
+ setHand('right', 'rightMiddleIntermediate', HumanoidHandRig.MiddleIntermediate);
1025
+ setHand('right', 'rightMiddleDistal', HumanoidHandRig.MiddleDistal);
1026
+ setHand('right', 'rightRingProximal', HumanoidHandRig.RingProximal);
1027
+ setHand('right', 'rightRingIntermediate', HumanoidHandRig.RingIntermediate);
1028
+ setHand('right', 'rightRingDistal', HumanoidHandRig.RingDistal);
1029
+ setHand('right', 'rightLittleProximal', HumanoidHandRig.PinkyProximal);
1030
+ setHand('right', 'rightLittleIntermediate', HumanoidHandRig.PinkyIntermediate);
1031
+ setHand('right', 'rightLittleDistal', HumanoidHandRig.PinkyDistal);
1032
+ if (!body[HumanoidBodyRig.Hips]) {
1033
+ return null;
1034
+ }
1035
+ const result = {
1036
+ body: body
1037
+ };
1038
+ if (Object.keys(leftHand).length > 0) {
1039
+ result.leftHand = leftHand;
1040
+ }
1041
+ if (Object.keys(rightHand).length > 0) {
1042
+ result.rightHand = rightHand;
1043
+ }
1044
+ return result;
1045
+ }
1046
+ _filterHumanoidMappingToSkeleton(mapping, skeleton) {
1047
+ const joints = new Set(skeleton.joints);
1048
+ const filter = (source)=>{
1049
+ if (!source) {
1050
+ return undefined;
1051
+ }
1052
+ const result = {};
1053
+ for (const key of Object.keys(source)){
1054
+ const node = source[key];
1055
+ if (node && joints.has(node)) {
1056
+ result[key] = node;
1057
+ }
1058
+ }
1059
+ return Object.keys(result).length > 0 ? result : undefined;
1060
+ };
1061
+ const body = filter(mapping.body);
1062
+ const leftHand = filter(mapping.leftHand);
1063
+ const rightHand = filter(mapping.rightHand);
1064
+ if (!body && !leftHand && !rightHand) {
1065
+ return null;
1066
+ }
1067
+ return {
1068
+ body: body ?? {},
1069
+ leftHand,
1070
+ rightHand
1071
+ };
1072
+ }
919
1073
  _getVRMAHumanBoneNode(gltf, humanBones, boneName) {
920
1074
  const nodeIndex = humanBones[boneName]?.node;
921
1075
  return this._getNode(gltf, nodeIndex);
@@ -937,6 +1091,52 @@ const VRM_DRAGFORCE_SCALE = 0.5;
937
1091
  addMappedNodes(mapping.rightHand);
938
1092
  return nodes;
939
1093
  }
1094
+ _getVRMAExpressionMapping(gltf) {
1095
+ const mapping = new Map();
1096
+ const ext = gltf.extensions?.VRMC_vrm_animation;
1097
+ const expressions = ext?.expressions;
1098
+ if (!expressions || typeof expressions !== 'object') {
1099
+ return mapping;
1100
+ }
1101
+ this._addVRMAExpressionMapping(gltf, mapping, expressions.preset);
1102
+ this._addVRMAExpressionMapping(gltf, mapping, expressions.custom);
1103
+ return mapping;
1104
+ }
1105
+ _addVRMAExpressionMapping(gltf, mapping, expressionMap) {
1106
+ if (!expressionMap || typeof expressionMap !== 'object') {
1107
+ return;
1108
+ }
1109
+ for (const [name, value] of Object.entries(expressionMap)){
1110
+ if (VRMA_LOOK_AT_EXPRESSION_NAMES.has(name) || !value || typeof value !== 'object') {
1111
+ continue;
1112
+ }
1113
+ const nodeIndex = value.node;
1114
+ if (typeof nodeIndex !== 'number' || !gltf._nodes[nodeIndex] || mapping.has(nodeIndex)) {
1115
+ continue;
1116
+ }
1117
+ mapping.set(nodeIndex, name);
1118
+ }
1119
+ }
1120
+ _createVRMAExpressionInterpolator(interpolator) {
1121
+ const inputs = new Float32Array(interpolator.inputs);
1122
+ const sourceOutputs = interpolator.outputs;
1123
+ if (interpolator.mode === 'cubicspline') {
1124
+ const outputs = new Float32Array(inputs.length * 3);
1125
+ for(let i = 0; i < inputs.length; i++){
1126
+ const sourceOffset = i * 9;
1127
+ const targetOffset = i * 3;
1128
+ outputs[targetOffset + 0] = sourceOutputs[sourceOffset + 0];
1129
+ outputs[targetOffset + 1] = sourceOutputs[sourceOffset + 3];
1130
+ outputs[targetOffset + 2] = sourceOutputs[sourceOffset + 6];
1131
+ }
1132
+ return new InterpolatorScalar(interpolator.mode, inputs, outputs);
1133
+ }
1134
+ const outputs = new Float32Array(inputs.length);
1135
+ for(let i = 0; i < inputs.length; i++){
1136
+ outputs[i] = sourceOutputs[i * 3];
1137
+ }
1138
+ return new InterpolatorScalar(interpolator.mode, inputs, outputs);
1139
+ }
940
1140
  _findCommonRoot(nodes) {
941
1141
  let root = nodes[0] ?? null;
942
1142
  for(let i = 1; root && i < nodes.length; i++){
@@ -1046,6 +1246,7 @@ const VRM_DRAGFORCE_SCALE = 0.5;
1046
1246
  }
1047
1247
  /** @internal */ _loadAnimation(gltf, index) {
1048
1248
  const animationInfo = this.getAnimationInfo(gltf, index);
1249
+ const vrmaExpressionMapping = this._getVRMAExpressionMapping(gltf);
1049
1250
  const animationData = {
1050
1251
  name: animationInfo.name,
1051
1252
  tracks: [],
@@ -1063,7 +1264,13 @@ const VRM_DRAGFORCE_SCALE = 0.5;
1063
1264
  if (!targetNode) {
1064
1265
  continue;
1065
1266
  }
1066
- const track = {
1267
+ const expressionName = interpolatorType === 'translation' ? vrmaExpressionMapping.get(targetNodeIndex) : undefined;
1268
+ const track = expressionName ? {
1269
+ node: targetNode,
1270
+ type: 'morph-target-group',
1271
+ interpolator: this._createVRMAExpressionInterpolator(interpolator),
1272
+ morphTargetGroupName: expressionName
1273
+ } : {
1067
1274
  node: targetNode,
1068
1275
  type: interpolatorType,
1069
1276
  interpolator