@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
|
@@ -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
|
|
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
|