@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
@@ -359,6 +359,12 @@ const VRM_GRAVITY_ACCELERATION_SCALE = 3;
359
359
  const VRM_GRAVITY_POWER_TO_ACCELERATION = 9.8 * VRM_GRAVITY_ACCELERATION_SCALE;
360
360
  const VRM_STIFFNESS_TO_FRAME_HARDNESS = 0.05;
361
361
  const VRM_DRAGFORCE_SCALE = 0.5;
362
+ const VRMA_LOOK_AT_EXPRESSION_NAMES = new Set([
363
+ 'lookUp',
364
+ 'lookDown',
365
+ 'lookLeft',
366
+ 'lookRight'
367
+ ]);
362
368
  /**
363
369
  * The GLTF/GLB model loader
364
370
  * @public
@@ -1137,8 +1143,47 @@ const VRM_DRAGFORCE_SCALE = 0.5;
1137
1143
  model.addSkeleton(skeleton);
1138
1144
  }
1139
1145
  }
1146
+ this._loadVRMHumanoidSkeletonMappings(gltf, model);
1140
1147
  this._loadVRMAHumanoidSkeleton(gltf, model);
1141
1148
  }
1149
+ _loadVRMHumanoidSkeletonMappings(gltf, model) {
1150
+ const mapping = this._getVRMC1HumanoidMapping(gltf) ?? this._getVRMC0HumanoidMapping(gltf);
1151
+ if (!mapping) {
1152
+ return;
1153
+ }
1154
+ for (const skeleton of model.skeletons){
1155
+ const skeletonMapping = this._filterHumanoidMappingToSkeleton(mapping, skeleton);
1156
+ if (skeletonMapping) {
1157
+ this._setAssetSkeletonHumanoidMapping(skeleton, skeletonMapping);
1158
+ }
1159
+ }
1160
+ }
1161
+ _getVRMC1HumanoidMapping(gltf) {
1162
+ const humanBones = gltf.extensions?.VRMC_vrm?.humanoid?.humanBones;
1163
+ if (!humanBones || typeof humanBones !== 'object') {
1164
+ return null;
1165
+ }
1166
+ return this._getVRMAHumanoidMapping(gltf, humanBones);
1167
+ }
1168
+ _getVRMC0HumanoidMapping(gltf) {
1169
+ const humanBones = gltf.extensions?.VRM?.humanoid?.humanBones;
1170
+ if (!Array.isArray(humanBones)) {
1171
+ return null;
1172
+ }
1173
+ const byName = {};
1174
+ for (const value of humanBones){
1175
+ if (!value || typeof value !== 'object') {
1176
+ continue;
1177
+ }
1178
+ const boneInfo = value;
1179
+ if (typeof boneInfo.bone === 'string') {
1180
+ byName[boneInfo.bone] = {
1181
+ node: boneInfo.node
1182
+ };
1183
+ }
1184
+ }
1185
+ return this._getVRMC0HumanoidMappingFromBones(gltf, byName);
1186
+ }
1142
1187
  /** @internal */ _loadVRMAHumanoidSkeleton(gltf, model) {
1143
1188
  const ext = gltf.extensions?.VRMC_vrm_animation;
1144
1189
  const humanBones = ext?.humanoid?.humanBones;
@@ -1266,6 +1311,115 @@ const VRM_DRAGFORCE_SCALE = 0.5;
1266
1311
  }
1267
1312
  return result;
1268
1313
  }
1314
+ _getVRMC0HumanoidMappingFromBones(gltf, humanBones) {
1315
+ const body = {};
1316
+ const leftHand = {};
1317
+ const rightHand = {};
1318
+ const setBody = (vrmName, rig)=>{
1319
+ const node = this._getVRMAHumanBoneNode(gltf, humanBones, vrmName);
1320
+ if (node) {
1321
+ body[rig] = node;
1322
+ }
1323
+ };
1324
+ const setHand = (side, vrmName, rig)=>{
1325
+ const node = this._getVRMAHumanBoneNode(gltf, humanBones, vrmName);
1326
+ if (node) {
1327
+ (side === 'left' ? leftHand : rightHand)[rig] = node;
1328
+ }
1329
+ };
1330
+ setBody('hips', HumanoidBodyRig.Hips);
1331
+ setBody('spine', HumanoidBodyRig.Spine);
1332
+ setBody('chest', HumanoidBodyRig.Chest);
1333
+ setBody('upperChest', HumanoidBodyRig.UpperChest);
1334
+ setBody('neck', HumanoidBodyRig.Neck);
1335
+ setBody('head', HumanoidBodyRig.Head);
1336
+ setBody('leftShoulder', HumanoidBodyRig.LeftShoulder);
1337
+ setBody('leftUpperArm', HumanoidBodyRig.LeftUpperArm);
1338
+ setBody('leftLowerArm', HumanoidBodyRig.LeftLowerArm);
1339
+ setBody('leftHand', HumanoidBodyRig.LeftHand);
1340
+ setBody('rightShoulder', HumanoidBodyRig.RightShoulder);
1341
+ setBody('rightUpperArm', HumanoidBodyRig.RightUpperArm);
1342
+ setBody('rightLowerArm', HumanoidBodyRig.RightLowerArm);
1343
+ setBody('rightHand', HumanoidBodyRig.RightHand);
1344
+ setBody('leftUpperLeg', HumanoidBodyRig.LeftUpperLeg);
1345
+ setBody('leftLowerLeg', HumanoidBodyRig.LeftLowerLeg);
1346
+ setBody('leftFoot', HumanoidBodyRig.LeftFoot);
1347
+ setBody('leftToes', HumanoidBodyRig.LeftToes);
1348
+ setBody('rightUpperLeg', HumanoidBodyRig.RightUpperLeg);
1349
+ setBody('rightLowerLeg', HumanoidBodyRig.RightLowerLeg);
1350
+ setBody('rightFoot', HumanoidBodyRig.RightFoot);
1351
+ setBody('rightToes', HumanoidBodyRig.RightToes);
1352
+ setHand('left', 'leftThumbProximal', HumanoidHandRig.ThumbProximal);
1353
+ setHand('left', 'leftThumbIntermediate', HumanoidHandRig.ThumbIntermediate);
1354
+ setHand('left', 'leftThumbDistal', HumanoidHandRig.ThumbDistal);
1355
+ setHand('left', 'leftIndexProximal', HumanoidHandRig.IndexProximal);
1356
+ setHand('left', 'leftIndexIntermediate', HumanoidHandRig.IndexIntermediate);
1357
+ setHand('left', 'leftIndexDistal', HumanoidHandRig.IndexDistal);
1358
+ setHand('left', 'leftMiddleProximal', HumanoidHandRig.MiddleProximal);
1359
+ setHand('left', 'leftMiddleIntermediate', HumanoidHandRig.MiddleIntermediate);
1360
+ setHand('left', 'leftMiddleDistal', HumanoidHandRig.MiddleDistal);
1361
+ setHand('left', 'leftRingProximal', HumanoidHandRig.RingProximal);
1362
+ setHand('left', 'leftRingIntermediate', HumanoidHandRig.RingIntermediate);
1363
+ setHand('left', 'leftRingDistal', HumanoidHandRig.RingDistal);
1364
+ setHand('left', 'leftLittleProximal', HumanoidHandRig.PinkyProximal);
1365
+ setHand('left', 'leftLittleIntermediate', HumanoidHandRig.PinkyIntermediate);
1366
+ setHand('left', 'leftLittleDistal', HumanoidHandRig.PinkyDistal);
1367
+ setHand('right', 'rightThumbProximal', HumanoidHandRig.ThumbProximal);
1368
+ setHand('right', 'rightThumbIntermediate', HumanoidHandRig.ThumbIntermediate);
1369
+ setHand('right', 'rightThumbDistal', HumanoidHandRig.ThumbDistal);
1370
+ setHand('right', 'rightIndexProximal', HumanoidHandRig.IndexProximal);
1371
+ setHand('right', 'rightIndexIntermediate', HumanoidHandRig.IndexIntermediate);
1372
+ setHand('right', 'rightIndexDistal', HumanoidHandRig.IndexDistal);
1373
+ setHand('right', 'rightMiddleProximal', HumanoidHandRig.MiddleProximal);
1374
+ setHand('right', 'rightMiddleIntermediate', HumanoidHandRig.MiddleIntermediate);
1375
+ setHand('right', 'rightMiddleDistal', HumanoidHandRig.MiddleDistal);
1376
+ setHand('right', 'rightRingProximal', HumanoidHandRig.RingProximal);
1377
+ setHand('right', 'rightRingIntermediate', HumanoidHandRig.RingIntermediate);
1378
+ setHand('right', 'rightRingDistal', HumanoidHandRig.RingDistal);
1379
+ setHand('right', 'rightLittleProximal', HumanoidHandRig.PinkyProximal);
1380
+ setHand('right', 'rightLittleIntermediate', HumanoidHandRig.PinkyIntermediate);
1381
+ setHand('right', 'rightLittleDistal', HumanoidHandRig.PinkyDistal);
1382
+ if (!body[HumanoidBodyRig.Hips]) {
1383
+ return null;
1384
+ }
1385
+ const result = {
1386
+ body: body
1387
+ };
1388
+ if (Object.keys(leftHand).length > 0) {
1389
+ result.leftHand = leftHand;
1390
+ }
1391
+ if (Object.keys(rightHand).length > 0) {
1392
+ result.rightHand = rightHand;
1393
+ }
1394
+ return result;
1395
+ }
1396
+ _filterHumanoidMappingToSkeleton(mapping, skeleton) {
1397
+ const joints = new Set(skeleton.joints);
1398
+ const filter = (source)=>{
1399
+ if (!source) {
1400
+ return undefined;
1401
+ }
1402
+ const result = {};
1403
+ for (const key of Object.keys(source)){
1404
+ const node = source[key];
1405
+ if (node && joints.has(node)) {
1406
+ result[key] = node;
1407
+ }
1408
+ }
1409
+ return Object.keys(result).length > 0 ? result : undefined;
1410
+ };
1411
+ const body = filter(mapping.body);
1412
+ const leftHand = filter(mapping.leftHand);
1413
+ const rightHand = filter(mapping.rightHand);
1414
+ if (!body && !leftHand && !rightHand) {
1415
+ return null;
1416
+ }
1417
+ return {
1418
+ body: body ?? {},
1419
+ leftHand,
1420
+ rightHand
1421
+ };
1422
+ }
1269
1423
  _getVRMAHumanBoneNode(gltf, humanBones, boneName) {
1270
1424
  const nodeIndex = humanBones[boneName]?.node;
1271
1425
  return this._getNode(gltf, nodeIndex);
@@ -1287,6 +1441,52 @@ const VRM_DRAGFORCE_SCALE = 0.5;
1287
1441
  addMappedNodes(mapping.rightHand);
1288
1442
  return nodes;
1289
1443
  }
1444
+ _getVRMAExpressionMapping(gltf) {
1445
+ const mapping = new Map();
1446
+ const ext = gltf.extensions?.VRMC_vrm_animation;
1447
+ const expressions = ext?.expressions;
1448
+ if (!expressions || typeof expressions !== 'object') {
1449
+ return mapping;
1450
+ }
1451
+ this._addVRMAExpressionMapping(gltf, mapping, expressions.preset);
1452
+ this._addVRMAExpressionMapping(gltf, mapping, expressions.custom);
1453
+ return mapping;
1454
+ }
1455
+ _addVRMAExpressionMapping(gltf, mapping, expressionMap) {
1456
+ if (!expressionMap || typeof expressionMap !== 'object') {
1457
+ return;
1458
+ }
1459
+ for (const [name, value] of Object.entries(expressionMap)){
1460
+ if (VRMA_LOOK_AT_EXPRESSION_NAMES.has(name) || !value || typeof value !== 'object') {
1461
+ continue;
1462
+ }
1463
+ const nodeIndex = value.node;
1464
+ if (typeof nodeIndex !== 'number' || !gltf._nodes[nodeIndex] || mapping.has(nodeIndex)) {
1465
+ continue;
1466
+ }
1467
+ mapping.set(nodeIndex, name);
1468
+ }
1469
+ }
1470
+ _createVRMAExpressionInterpolator(interpolator) {
1471
+ const inputs = new Float32Array(interpolator.inputs);
1472
+ const sourceOutputs = interpolator.outputs;
1473
+ if (interpolator.mode === 'cubicspline') {
1474
+ const outputs = new Float32Array(inputs.length * 3);
1475
+ for(let i = 0; i < inputs.length; i++){
1476
+ const sourceOffset = i * 9;
1477
+ const targetOffset = i * 3;
1478
+ outputs[targetOffset + 0] = sourceOutputs[sourceOffset + 0];
1479
+ outputs[targetOffset + 1] = sourceOutputs[sourceOffset + 3];
1480
+ outputs[targetOffset + 2] = sourceOutputs[sourceOffset + 6];
1481
+ }
1482
+ return new InterpolatorScalar(interpolator.mode, inputs, outputs);
1483
+ }
1484
+ const outputs = new Float32Array(inputs.length);
1485
+ for(let i = 0; i < inputs.length; i++){
1486
+ outputs[i] = sourceOutputs[i * 3];
1487
+ }
1488
+ return new InterpolatorScalar(interpolator.mode, inputs, outputs);
1489
+ }
1290
1490
  _findCommonRoot(nodes) {
1291
1491
  let root = nodes[0] ?? null;
1292
1492
  for(let i = 1; root && i < nodes.length; i++){
@@ -1396,6 +1596,7 @@ const VRM_DRAGFORCE_SCALE = 0.5;
1396
1596
  }
1397
1597
  /** @internal */ _loadAnimation(gltf, index) {
1398
1598
  const animationInfo = this.getAnimationInfo(gltf, index);
1599
+ const vrmaExpressionMapping = this._getVRMAExpressionMapping(gltf);
1399
1600
  const animationData = {
1400
1601
  name: animationInfo.name,
1401
1602
  tracks: [],
@@ -1413,7 +1614,13 @@ const VRM_DRAGFORCE_SCALE = 0.5;
1413
1614
  if (!targetNode) {
1414
1615
  continue;
1415
1616
  }
1416
- const track = {
1617
+ const expressionName = interpolatorType === 'translation' ? vrmaExpressionMapping.get(targetNodeIndex) : undefined;
1618
+ const track = expressionName ? {
1619
+ node: targetNode,
1620
+ type: 'morph-target-group',
1621
+ interpolator: this._createVRMAExpressionInterpolator(interpolator),
1622
+ morphTargetGroupName: expressionName
1623
+ } : {
1417
1624
  node: targetNode,
1418
1625
  type: interpolatorType,
1419
1626
  interpolator