@zephyr3d/editor 0.3.7 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{index-ySiLtSxz.js → index-BZ1L8ggE.js} +43 -3
- package/dist/assistant/zephyr-types-index.json +13230 -9488
- package/dist/images/icon1024.png +0 -0
- package/dist/index.html +1 -1
- package/dist/modules/zephyr3d_backend-webgl.js +2 -0
- package/dist/modules/zephyr3d_backend-webgl.js.map +1 -1
- package/dist/modules/zephyr3d_backend-webgpu.js +457 -16
- package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
- package/dist/modules/zephyr3d_device.js +27 -0
- package/dist/modules/zephyr3d_device.js.map +1 -1
- package/dist/modules/zephyr3d_loaders.js +208 -1
- package/dist/modules/zephyr3d_loaders.js.map +1 -1
- package/dist/modules/zephyr3d_scene.js +774 -80
- package/dist/modules/zephyr3d_scene.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgl/dist/capabilities_webgl.js +2 -0
- package/dist/vendor/zephyr3d/backend-webgl/dist/capabilities_webgl.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/capabilities_webgpu.js +2 -0
- package/dist/vendor/zephyr3d/backend-webgpu/dist/capabilities_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js +55 -10
- package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/computepass_webgpu.js +4 -0
- package/dist/vendor/zephyr3d/backend-webgpu/dist/computepass_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/device.js +44 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/device.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js +58 -5
- package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/timestamp_query.js +297 -0
- package/dist/vendor/zephyr3d/backend-webgpu/dist/timestamp_query.js.map +1 -0
- package/dist/vendor/zephyr3d/device/dist/base_types.js.map +1 -1
- package/dist/vendor/zephyr3d/device/dist/device.js +27 -0
- package/dist/vendor/zephyr3d/device/dist/device.js.map +1 -1
- package/dist/vendor/zephyr3d/device/dist/index.d.ts +81 -1
- package/dist/vendor/zephyr3d/loaders/dist/gltf/gltf_importer.js +208 -1
- package/dist/vendor/zephyr3d/loaders/dist/gltf/gltf_importer.js.map +1 -1
- package/dist/vendor/zephyr3d/loaders/dist/index.d.ts +8 -0
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js +334 -63
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/animation/morphtargetgrouptrack.js +66 -0
- package/dist/vendor/zephyr3d/scene/dist/animation/morphtargetgrouptrack.js.map +1 -0
- package/dist/vendor/zephyr3d/scene/dist/asset/model.js +9 -0
- package/dist/vendor/zephyr3d/scene/dist/asset/model.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/index.d.ts +260 -4
- package/dist/vendor/zephyr3d/scene/dist/index.js +7 -0
- package/dist/vendor/zephyr3d/scene/dist/index.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/posteffect/sao.js +1 -1
- package/dist/vendor/zephyr3d/scene/dist/posteffect/sao.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/executor.js +270 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js +19 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/types.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/scene.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/scene.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js +2 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js +70 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
- package/package.json +6 -6
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -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
|
|
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
|