@galacean/effects-plugin-model 2.0.0-alpha.11 → 2.0.0-alpha.13
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/alipay.js +13453 -0
- package/dist/alipay.js.map +1 -0
- package/dist/alipay.mjs +13370 -0
- package/dist/alipay.mjs.map +1 -0
- package/dist/gesture/index.d.ts +2 -2
- package/dist/gltf/json-converter.d.ts +29 -4
- package/dist/gltf/loader-ecs.d.ts +4 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1119 -336
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +2 -2
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +1118 -337
- package/dist/index.mjs.map +1 -1
- package/dist/loader.mjs +1118 -337
- package/dist/loader.mjs.map +1 -1
- package/dist/plugin/model-item.d.ts +53 -9
- package/dist/plugin/model-tree-item.d.ts +4 -8
- package/dist/runtime/animation.d.ts +18 -15
- package/dist/runtime/mesh.d.ts +12 -19
- package/package.json +11 -6
package/dist/index.mjs
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* Description: Galacean Effects player model plugin
|
|
4
4
|
* Author: Ant Group CO., Ltd.
|
|
5
5
|
* Contributors: 飂兮
|
|
6
|
-
* Version: v2.0.0-alpha.
|
|
6
|
+
* Version: v2.0.0-alpha.13
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { math, Transform, PLAYER_OPTIONS_ENV_EDITOR, spec, glContext, Texture, TextureSourceType, RenderPassAttachmentStorageType, Material, Mesh, Geometry, GLSLVersion,
|
|
9
|
+
import { math, Transform, PLAYER_OPTIONS_ENV_EDITOR, spec, glContext, Texture, TextureSourceType, RenderPassAttachmentStorageType, Material, Mesh, Geometry, GLSLVersion, addItem, removeItem, effectsClass, RendererComponent, ItemBehaviour, HitTestType, AnimationClip, RenderPass, TextureLoadAction, DestroyOptions, RenderPassDestroyAttachmentType, Player, Renderer, getDefaultTextureFactory, loadImage, generateGUID, VFXItem, AbstractPlugin, glType2VertexFormatType, Downloader, getStandardJSON, registerPlugin, logger, version as version$1 } from '@galacean/effects';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Model 插件元素类型
|
|
@@ -790,6 +790,41 @@ var ctrlMap = {
|
|
|
790
790
|
return new CTRL(binary[index], start, byteLength / CTRL.BYTES_PER_ELEMENT);
|
|
791
791
|
}
|
|
792
792
|
|
|
793
|
+
function _array_like_to_array(arr, len) {
|
|
794
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
795
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
796
|
+
return arr2;
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
800
|
+
if (!o) return;
|
|
801
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
802
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
803
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
804
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
805
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
function _create_for_of_iterator_helper_loose(o, allowArrayLike) {
|
|
809
|
+
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
|
|
810
|
+
if (it) return (it = it.call(o)).next.bind(it);
|
|
811
|
+
// Fallback for engines without symbol support
|
|
812
|
+
if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === "number") {
|
|
813
|
+
if (it) o = it;
|
|
814
|
+
var i = 0;
|
|
815
|
+
return function() {
|
|
816
|
+
if (i >= o.length) return {
|
|
817
|
+
done: true
|
|
818
|
+
};
|
|
819
|
+
return {
|
|
820
|
+
done: false,
|
|
821
|
+
value: o[i++]
|
|
822
|
+
};
|
|
823
|
+
};
|
|
824
|
+
}
|
|
825
|
+
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
826
|
+
}
|
|
827
|
+
|
|
793
828
|
var InterpolationSampler = /*#__PURE__*/ function() {
|
|
794
829
|
function InterpolationSampler(time, data, componentCount) {
|
|
795
830
|
this.time = time;
|
|
@@ -1086,7 +1121,7 @@ var TextureDataMode;
|
|
|
1086
1121
|
*/ _this.skeleton = 0;
|
|
1087
1122
|
/**
|
|
1088
1123
|
* 关节索引
|
|
1089
|
-
*/ _this.
|
|
1124
|
+
*/ _this.jointItem = [];
|
|
1090
1125
|
/**
|
|
1091
1126
|
* 逆绑定矩阵
|
|
1092
1127
|
*/ _this.inverseBindMatrices = [];
|
|
@@ -1101,27 +1136,26 @@ var TextureDataMode;
|
|
|
1101
1136
|
var _proto = PSkin.prototype;
|
|
1102
1137
|
/**
|
|
1103
1138
|
* 创建蒙皮对象
|
|
1104
|
-
* @param
|
|
1139
|
+
* @param props - 蒙皮相关数据
|
|
1105
1140
|
* @param engine - 引擎对象
|
|
1106
|
-
* @param
|
|
1107
|
-
*/ _proto.create = function create(
|
|
1108
|
-
var
|
|
1109
|
-
this.name =
|
|
1141
|
+
* @param rootBoneItem - 场景树父元素
|
|
1142
|
+
*/ _proto.create = function create(props, engine, rootBoneItem) {
|
|
1143
|
+
var _props_rootBoneName;
|
|
1144
|
+
this.name = (_props_rootBoneName = props.rootBoneName) != null ? _props_rootBoneName : "Unnamed skin";
|
|
1110
1145
|
this.type = PObjectType.skin;
|
|
1111
1146
|
//
|
|
1112
|
-
this.
|
|
1113
|
-
|
|
1114
|
-
this.
|
|
1115
|
-
this.jointList = options.joints;
|
|
1147
|
+
this.rootBoneItem = rootBoneItem;
|
|
1148
|
+
this.skeleton = -1;
|
|
1149
|
+
this.jointItem = this.getJointItems(props, rootBoneItem);
|
|
1116
1150
|
this.animationMatrices = [];
|
|
1117
1151
|
//
|
|
1118
1152
|
this.inverseBindMatrices = [];
|
|
1119
1153
|
//
|
|
1120
1154
|
this.textureDataMode = this.getTextureDataMode(this.getJointCount(), engine);
|
|
1121
|
-
var matList =
|
|
1155
|
+
var matList = props.inverseBindMatrices;
|
|
1122
1156
|
if (matList !== undefined && matList.length > 0) {
|
|
1123
|
-
if (matList.length % 16 !== 0 || matList.length !== this.
|
|
1124
|
-
throw new Error("Invalid array length, invert bind matrices " + matList.length + ", joint array " + this.
|
|
1157
|
+
if (matList.length % 16 !== 0 || matList.length !== this.jointItem.length * 16) {
|
|
1158
|
+
throw new Error("Invalid array length, invert bind matrices " + matList.length + ", joint array " + this.jointItem.length);
|
|
1125
1159
|
}
|
|
1126
1160
|
var matrixCount = matList.length / 16;
|
|
1127
1161
|
for(var i = 0; i < matrixCount; i++){
|
|
@@ -1134,26 +1168,17 @@ var TextureDataMode;
|
|
|
1134
1168
|
* 更新蒙皮矩阵
|
|
1135
1169
|
*/ _proto.updateSkinMatrices = function updateSkinMatrices() {
|
|
1136
1170
|
var _this = this;
|
|
1137
|
-
var _this_parentItem;
|
|
1138
1171
|
this.animationMatrices = [];
|
|
1139
|
-
var
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
// }
|
|
1150
|
-
if (node === undefined) {
|
|
1151
|
-
console.error("Can't find joint " + joint + " in node tree " + this.parentItem + ".");
|
|
1152
|
-
break;
|
|
1153
|
-
}
|
|
1154
|
-
var mat4 = node.transform.getWorldMatrix();
|
|
1155
|
-
this.animationMatrices.push(mat4.clone());
|
|
1156
|
-
}
|
|
1172
|
+
for(var i = 0; i < this.jointItem.length; i++){
|
|
1173
|
+
var node = this.jointItem[i];
|
|
1174
|
+
// let parent = node?.transform.parentTransform;
|
|
1175
|
+
// while(parent !== undefined){
|
|
1176
|
+
// const pos = parent.position;
|
|
1177
|
+
// parent.setPosition(pos[0], pos[1], pos[2]);
|
|
1178
|
+
// parent = parent.parentTransform;
|
|
1179
|
+
// }
|
|
1180
|
+
var mat4 = node.transform.getWorldMatrix();
|
|
1181
|
+
this.animationMatrices.push(mat4.clone());
|
|
1157
1182
|
}
|
|
1158
1183
|
if (this.animationMatrices.length === this.inverseBindMatrices.length) {
|
|
1159
1184
|
this.animationMatrices.forEach(function(mat, index) {
|
|
@@ -1188,13 +1213,13 @@ var TextureDataMode;
|
|
|
1188
1213
|
* 更新父元素
|
|
1189
1214
|
* @param parentItem - 场景树父元素
|
|
1190
1215
|
*/ _proto.updateParentItem = function updateParentItem(parentItem) {
|
|
1191
|
-
this.
|
|
1216
|
+
this.rootBoneItem = parentItem;
|
|
1192
1217
|
};
|
|
1193
1218
|
/**
|
|
1194
1219
|
* 获取关节点数
|
|
1195
1220
|
* @returns
|
|
1196
1221
|
*/ _proto.getJointCount = function getJointCount() {
|
|
1197
|
-
return this.
|
|
1222
|
+
return this.jointItem.length;
|
|
1198
1223
|
};
|
|
1199
1224
|
/**
|
|
1200
1225
|
* 是否纹理数据模式
|
|
@@ -1205,8 +1230,8 @@ var TextureDataMode;
|
|
|
1205
1230
|
/**
|
|
1206
1231
|
* 销毁
|
|
1207
1232
|
*/ _proto.dispose = function dispose() {
|
|
1208
|
-
this.
|
|
1209
|
-
this.
|
|
1233
|
+
this.rootBoneItem = undefined;
|
|
1234
|
+
this.jointItem = [];
|
|
1210
1235
|
this.inverseBindMatrices = [];
|
|
1211
1236
|
this.animationMatrices = [];
|
|
1212
1237
|
};
|
|
@@ -1228,6 +1253,38 @@ var TextureDataMode;
|
|
|
1228
1253
|
return 0;
|
|
1229
1254
|
}
|
|
1230
1255
|
};
|
|
1256
|
+
_proto.getJointItems = function getJointItems(props, rootBoneItem) {
|
|
1257
|
+
var _props_boneNames;
|
|
1258
|
+
var name2Item = this.genNodeName(rootBoneItem);
|
|
1259
|
+
var jointItems = [];
|
|
1260
|
+
(_props_boneNames = props.boneNames) == null ? void 0 : _props_boneNames.forEach(function(boneName) {
|
|
1261
|
+
var node = name2Item[boneName];
|
|
1262
|
+
if (!node) {
|
|
1263
|
+
throw new Error("Can't find node of bone name " + boneName);
|
|
1264
|
+
}
|
|
1265
|
+
jointItems.push(node);
|
|
1266
|
+
});
|
|
1267
|
+
return jointItems;
|
|
1268
|
+
};
|
|
1269
|
+
_proto.genNodeName = function genNodeName(node) {
|
|
1270
|
+
var name2Item = {};
|
|
1271
|
+
var nameList = [];
|
|
1272
|
+
name2Item[""] = node;
|
|
1273
|
+
for(var _iterator = _create_for_of_iterator_helper_loose(node.children), _step; !(_step = _iterator()).done;){
|
|
1274
|
+
var child = _step.value;
|
|
1275
|
+
this.genNodeNameDFS(child, nameList, name2Item);
|
|
1276
|
+
}
|
|
1277
|
+
return name2Item;
|
|
1278
|
+
};
|
|
1279
|
+
_proto.genNodeNameDFS = function genNodeNameDFS(node, nameList, name2Item) {
|
|
1280
|
+
nameList.push(node.name);
|
|
1281
|
+
name2Item[nameList.join("/")] = node;
|
|
1282
|
+
for(var _iterator = _create_for_of_iterator_helper_loose(node.children), _step; !(_step = _iterator()).done;){
|
|
1283
|
+
var child = _step.value;
|
|
1284
|
+
this.genNodeNameDFS(child, nameList, name2Item);
|
|
1285
|
+
}
|
|
1286
|
+
nameList.pop();
|
|
1287
|
+
};
|
|
1231
1288
|
return PSkin;
|
|
1232
1289
|
}(PObject);
|
|
1233
1290
|
/**
|
|
@@ -1245,6 +1302,10 @@ var TextureDataMode;
|
|
|
1245
1302
|
* 范围要在 `[0, 8]` 之间,否则会报错。
|
|
1246
1303
|
*/ _this.morphWeightsLength = 0;
|
|
1247
1304
|
/**
|
|
1305
|
+
* weights 数组的具体数据,来自动画控制器的每帧更新
|
|
1306
|
+
* 数组的长度必须和 morphWeightsLength 相同,否则会出错。
|
|
1307
|
+
*/ _this.morphWeightsArray = [];
|
|
1308
|
+
/**
|
|
1248
1309
|
* 是否有 Position 相关的 Morph 动画,shader 中需要知道
|
|
1249
1310
|
*/ _this.hasPositionMorph = false;
|
|
1250
1311
|
/**
|
|
@@ -1286,7 +1347,7 @@ var TextureDataMode;
|
|
|
1286
1347
|
});
|
|
1287
1348
|
if (this.morphWeightsLength > 0) {
|
|
1288
1349
|
// 有Morph动画,申请weights数据,判断各个属性是否有相关动画
|
|
1289
|
-
this.morphWeightsArray =
|
|
1350
|
+
this.morphWeightsArray = Array(this.morphWeightsLength).fill(0);
|
|
1290
1351
|
this.hasPositionMorph = positionCount == this.morphWeightsLength;
|
|
1291
1352
|
this.hasNormalMorph = normalCount == this.morphWeightsLength;
|
|
1292
1353
|
this.hasTangentMorph = tangentCount == this.morphWeightsLength;
|
|
@@ -1313,14 +1374,11 @@ var TextureDataMode;
|
|
|
1313
1374
|
}
|
|
1314
1375
|
return true;
|
|
1315
1376
|
};
|
|
1316
|
-
_proto.dispose = function dispose() {
|
|
1317
|
-
this.morphWeightsArray = undefined;
|
|
1318
|
-
};
|
|
1319
1377
|
/**
|
|
1320
1378
|
* 初始化 Morph target 的权重数组
|
|
1321
1379
|
* @param weights - glTF Mesh 的权重数组,长度必须严格一致
|
|
1322
1380
|
*/ _proto.initWeights = function initWeights(weights) {
|
|
1323
|
-
if (this.morphWeightsArray ===
|
|
1381
|
+
if (this.morphWeightsArray.length === 0) {
|
|
1324
1382
|
return;
|
|
1325
1383
|
}
|
|
1326
1384
|
var morphWeights = this.morphWeightsArray;
|
|
@@ -1330,6 +1388,16 @@ var TextureDataMode;
|
|
|
1330
1388
|
}
|
|
1331
1389
|
});
|
|
1332
1390
|
};
|
|
1391
|
+
_proto.updateWeights = function updateWeights(weights) {
|
|
1392
|
+
var _this = this;
|
|
1393
|
+
if (weights.length != this.morphWeightsArray.length) {
|
|
1394
|
+
console.error("Length of morph weights mismatch: input " + weights.length + ", internel " + this.morphWeightsArray.length);
|
|
1395
|
+
return;
|
|
1396
|
+
}
|
|
1397
|
+
weights.forEach(function(value, index) {
|
|
1398
|
+
return _this.morphWeightsArray[index] = value;
|
|
1399
|
+
});
|
|
1400
|
+
};
|
|
1333
1401
|
/**
|
|
1334
1402
|
* 当前状态是否有 Morph 动画:
|
|
1335
1403
|
* 需要判断 weights 数组长度,以及 Position、Normal 和 Tangent 是否有动画
|
|
@@ -1369,38 +1437,38 @@ var TextureDataMode;
|
|
|
1369
1437
|
/**
|
|
1370
1438
|
* Morph 动画中 Position 相关的 Attribute 名称
|
|
1371
1439
|
*/ PMorph.positionNameList = [
|
|
1372
|
-
"
|
|
1373
|
-
"
|
|
1374
|
-
"
|
|
1375
|
-
"
|
|
1376
|
-
"
|
|
1377
|
-
"
|
|
1378
|
-
"
|
|
1379
|
-
"
|
|
1440
|
+
"aTargetPosition0",
|
|
1441
|
+
"aTargetPosition1",
|
|
1442
|
+
"aTargetPosition2",
|
|
1443
|
+
"aTargetPosition3",
|
|
1444
|
+
"aTargetPosition4",
|
|
1445
|
+
"aTargetPosition5",
|
|
1446
|
+
"aTargetPosition6",
|
|
1447
|
+
"aTargetPosition7"
|
|
1380
1448
|
];
|
|
1381
1449
|
/**
|
|
1382
1450
|
* Morph 动画中 Normal 相关的 Attribute 名称
|
|
1383
1451
|
*/ PMorph.normalNameList = [
|
|
1384
|
-
"
|
|
1385
|
-
"
|
|
1386
|
-
"
|
|
1387
|
-
"
|
|
1388
|
-
"
|
|
1389
|
-
"
|
|
1390
|
-
"
|
|
1391
|
-
"
|
|
1452
|
+
"aTargetNormal0",
|
|
1453
|
+
"aTargetNormal1",
|
|
1454
|
+
"aTargetNormal2",
|
|
1455
|
+
"aTargetNormal3",
|
|
1456
|
+
"aTargetNormal4",
|
|
1457
|
+
"aTargetNormal5",
|
|
1458
|
+
"aTargetNormal6",
|
|
1459
|
+
"aTargetNormal7"
|
|
1392
1460
|
];
|
|
1393
1461
|
/**
|
|
1394
1462
|
* Morph 动画中 Tangent 相关的 Attribute 名称
|
|
1395
1463
|
*/ PMorph.tangentNameList = [
|
|
1396
|
-
"
|
|
1397
|
-
"
|
|
1398
|
-
"
|
|
1399
|
-
"
|
|
1400
|
-
"
|
|
1401
|
-
"
|
|
1402
|
-
"
|
|
1403
|
-
"
|
|
1464
|
+
"aTargetTangent0",
|
|
1465
|
+
"aTargetTangent1",
|
|
1466
|
+
"aTargetTangent2",
|
|
1467
|
+
"aTargetTangent3",
|
|
1468
|
+
"aTargetTangent4",
|
|
1469
|
+
"aTargetTangent5",
|
|
1470
|
+
"aTargetTangent6",
|
|
1471
|
+
"aTargetTangent7"
|
|
1404
1472
|
];
|
|
1405
1473
|
var PAnimInterpType;
|
|
1406
1474
|
(function(PAnimInterpType) {
|
|
@@ -2429,7 +2497,7 @@ function _assert_this_initialized(self) {
|
|
|
2429
2497
|
*/ parentIndex = -1;
|
|
2430
2498
|
_this./**
|
|
2431
2499
|
* primitive 对象数组
|
|
2432
|
-
*/
|
|
2500
|
+
*/ subMeshes = [];
|
|
2433
2501
|
_this./**
|
|
2434
2502
|
* 是否隐藏,默认是隐藏
|
|
2435
2503
|
*/ hide = true;
|
|
@@ -2457,18 +2525,22 @@ function _assert_this_initialized(self) {
|
|
|
2457
2525
|
_this.parentIndex = proxy.getParentIndex();
|
|
2458
2526
|
_this.parentItem = proxy.parentItem;
|
|
2459
2527
|
_this.parentItemId = parentId;
|
|
2528
|
+
_this.rootBoneItem = meshData.rootBone;
|
|
2460
2529
|
_this.skin = proxy.getSkinObj(engine);
|
|
2461
2530
|
_this.morph = proxy.getMorphObj();
|
|
2462
2531
|
_this.hide = proxy.isHide();
|
|
2463
2532
|
_this.priority = (owner == null ? void 0 : (_owner_item = owner.item) == null ? void 0 : _owner_item.listIndex) || 0;
|
|
2464
2533
|
//
|
|
2465
|
-
_this.
|
|
2466
|
-
proxy.
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2534
|
+
_this.subMeshes = [];
|
|
2535
|
+
var geometry = proxy.getGeometry();
|
|
2536
|
+
var _owner_materials;
|
|
2537
|
+
var materials = (_owner_materials = owner == null ? void 0 : owner.materials) != null ? _owner_materials : [];
|
|
2538
|
+
materials.forEach(function(material) {
|
|
2539
|
+
var subMesh = new PSubMesh(_this.engine);
|
|
2540
|
+
subMesh.create(geometry, material, _assert_this_initialized(_this));
|
|
2541
|
+
_this.subMeshes.push(subMesh);
|
|
2470
2542
|
});
|
|
2471
|
-
if (_this.
|
|
2543
|
+
if (_this.subMeshes.length <= 0) {
|
|
2472
2544
|
console.warn("No primitive inside mesh item " + name);
|
|
2473
2545
|
}
|
|
2474
2546
|
_this.boundingBox = _this.getItemBoundingBox(meshData.interaction);
|
|
@@ -2484,7 +2556,7 @@ function _assert_this_initialized(self) {
|
|
|
2484
2556
|
return;
|
|
2485
2557
|
}
|
|
2486
2558
|
this.isBuilt = true;
|
|
2487
|
-
this.
|
|
2559
|
+
this.subMeshes.forEach(function(prim) {
|
|
2488
2560
|
prim.build(scene.maxLightCount, {}, scene.skybox);
|
|
2489
2561
|
});
|
|
2490
2562
|
if (PGlobalState.getInstance().visBoundingBox) {
|
|
@@ -2496,6 +2568,9 @@ function _assert_this_initialized(self) {
|
|
|
2496
2568
|
*/ _proto.update = function update() {
|
|
2497
2569
|
if (this.owner !== undefined) {
|
|
2498
2570
|
this.transform.fromEffectsTransform(this.owner.transform);
|
|
2571
|
+
if (this.morph && this.morph.hasMorph() && this.owner.morphWeights.length > 0) {
|
|
2572
|
+
this.morph.updateWeights(this.owner.morphWeights);
|
|
2573
|
+
}
|
|
2499
2574
|
}
|
|
2500
2575
|
};
|
|
2501
2576
|
/**
|
|
@@ -2506,9 +2581,8 @@ function _assert_this_initialized(self) {
|
|
|
2506
2581
|
var _this_skin;
|
|
2507
2582
|
(_this_skin = this.skin) == null ? void 0 : _this_skin.updateSkinMatrices();
|
|
2508
2583
|
this.updateMaterial(scene);
|
|
2509
|
-
this.
|
|
2510
|
-
|
|
2511
|
-
renderer.drawGeometry(mesh.geometry, mesh.material);
|
|
2584
|
+
this.subMeshes.forEach(function(subMesh, index) {
|
|
2585
|
+
renderer.drawGeometry(subMesh.getEffectsGeometry(), subMesh.getEffectsMaterial(), index);
|
|
2512
2586
|
});
|
|
2513
2587
|
if (this.visBoundingBox && this.boundingBoxMesh !== undefined) {
|
|
2514
2588
|
var mesh = this.boundingBoxMesh.mesh;
|
|
@@ -2533,10 +2607,10 @@ function _assert_this_initialized(self) {
|
|
|
2533
2607
|
this.skin = undefined;
|
|
2534
2608
|
(_this_morph = this.morph) == null ? void 0 : _this_morph.dispose();
|
|
2535
2609
|
this.morph = undefined;
|
|
2536
|
-
this.
|
|
2610
|
+
this.subMeshes.forEach(function(prim) {
|
|
2537
2611
|
prim.dispose();
|
|
2538
2612
|
});
|
|
2539
|
-
this.
|
|
2613
|
+
this.subMeshes = [];
|
|
2540
2614
|
(_this_boundingBoxMesh = this.boundingBoxMesh) == null ? void 0 : _this_boundingBoxMesh.dispose();
|
|
2541
2615
|
this.boundingBoxMesh = undefined;
|
|
2542
2616
|
};
|
|
@@ -2579,7 +2653,7 @@ function _assert_this_initialized(self) {
|
|
|
2579
2653
|
var worldMatrix = this.matrix;
|
|
2580
2654
|
var normalMatrix = worldMatrix.clone().invert().transpose();
|
|
2581
2655
|
var sceneStates = scene.sceneStates;
|
|
2582
|
-
this.
|
|
2656
|
+
this.subMeshes.forEach(function(prim) {
|
|
2583
2657
|
prim.updateMaterial(worldMatrix, normalMatrix, sceneStates);
|
|
2584
2658
|
});
|
|
2585
2659
|
if (this.boundingBoxMesh !== undefined) {
|
|
@@ -2633,7 +2707,7 @@ function _assert_this_initialized(self) {
|
|
|
2633
2707
|
}
|
|
2634
2708
|
var mint;
|
|
2635
2709
|
if (PGlobalState.getInstance().isEditorEnv) {
|
|
2636
|
-
this.
|
|
2710
|
+
this.subMeshes.forEach(function(prim) {
|
|
2637
2711
|
var primt = prim.hitTesting(newOrigin, newDirection, worldMatrix, invWorldMatrix);
|
|
2638
2712
|
if (primt !== undefined) {
|
|
2639
2713
|
if (mint === undefined || mint > primt) {
|
|
@@ -2661,7 +2735,7 @@ function _assert_this_initialized(self) {
|
|
|
2661
2735
|
*/ _proto.computeBoundingBox = function computeBoundingBox(worldMatrix) {
|
|
2662
2736
|
var box = this.boundingBox.makeEmpty();
|
|
2663
2737
|
var inverseWorldMatrix = worldMatrix.clone().invert();
|
|
2664
|
-
this.
|
|
2738
|
+
this.subMeshes.forEach(function(prim) {
|
|
2665
2739
|
var subbox = prim.computeBoundingBox(inverseWorldMatrix);
|
|
2666
2740
|
box.union(subbox);
|
|
2667
2741
|
});
|
|
@@ -2718,24 +2792,14 @@ function _assert_this_initialized(self) {
|
|
|
2718
2792
|
*/ function get() {
|
|
2719
2793
|
return this.skin !== undefined;
|
|
2720
2794
|
}
|
|
2721
|
-
},
|
|
2722
|
-
{
|
|
2723
|
-
key: "mriMeshs",
|
|
2724
|
-
get: /**
|
|
2725
|
-
* 获取 GE Mesh 数组
|
|
2726
|
-
*/ function get() {
|
|
2727
|
-
return this.primitives.map(function(prim) {
|
|
2728
|
-
return prim.effectsMesh;
|
|
2729
|
-
});
|
|
2730
|
-
}
|
|
2731
2795
|
}
|
|
2732
2796
|
]);
|
|
2733
2797
|
return PMesh;
|
|
2734
2798
|
}(PEntity);
|
|
2735
2799
|
/**
|
|
2736
|
-
*
|
|
2737
|
-
*/ var
|
|
2738
|
-
function
|
|
2800
|
+
* PSubMesh 类,负责 Sub Mesh相关的功能,支持骨骼动画和 PBR 渲染
|
|
2801
|
+
*/ var PSubMesh = /*#__PURE__*/ function() {
|
|
2802
|
+
function PSubMesh(engine) {
|
|
2739
2803
|
this.engine = engine;
|
|
2740
2804
|
this./**
|
|
2741
2805
|
* 名称
|
|
@@ -2750,17 +2814,17 @@ function _assert_this_initialized(self) {
|
|
|
2750
2814
|
* 是否压缩,模式不压缩
|
|
2751
2815
|
*/ isCompressed = false;
|
|
2752
2816
|
}
|
|
2753
|
-
var _proto =
|
|
2817
|
+
var _proto = PSubMesh.prototype;
|
|
2754
2818
|
/**
|
|
2755
2819
|
* 创建 Primitive 对象
|
|
2756
2820
|
* @param data - Primitive 参数
|
|
2757
2821
|
* @param parent - 所属 Mesh 对象
|
|
2758
|
-
*/ _proto.create = function create(
|
|
2822
|
+
*/ _proto.create = function create(geometry, material, parent) {
|
|
2759
2823
|
this.parent = parent;
|
|
2760
2824
|
this.skin = parent.skin;
|
|
2761
2825
|
this.morph = parent.morph;
|
|
2762
|
-
this.setGeometry(
|
|
2763
|
-
this.setMaterial(
|
|
2826
|
+
this.setGeometry(geometry);
|
|
2827
|
+
this.setMaterial(material);
|
|
2764
2828
|
this.name = parent.name;
|
|
2765
2829
|
this.effectsPriority = parent.priority;
|
|
2766
2830
|
this.geometry.setHide(parent.hide);
|
|
@@ -2798,6 +2862,7 @@ function _assert_this_initialized(self) {
|
|
|
2798
2862
|
var primitiveMacroList = this.getMacroList(lightCount, true, skybox);
|
|
2799
2863
|
var materialMacroList = this.material.getMacroList(primitiveMacroList);
|
|
2800
2864
|
var newSemantics = uniformSemantics != null ? uniformSemantics : {};
|
|
2865
|
+
// FIXME: Semantics整体移除
|
|
2801
2866
|
newSemantics["_ViewProjectionMatrix"] = "VIEWPROJECTION";
|
|
2802
2867
|
//newSemantics["uView"] = 'VIEWINVERSE';
|
|
2803
2868
|
newSemantics["_ModelMatrix"] = "MODEL";
|
|
@@ -2806,6 +2871,7 @@ function _assert_this_initialized(self) {
|
|
|
2806
2871
|
var isWebGL2 = PGlobalState.getInstance().isWebGL2;
|
|
2807
2872
|
if (this.material.effectMaterial) {
|
|
2808
2873
|
material = this.material.effectMaterial;
|
|
2874
|
+
// FIXME: Semantics整体移除
|
|
2809
2875
|
// @ts-expect-error
|
|
2810
2876
|
material.uniformSemantics = newSemantics;
|
|
2811
2877
|
materialMacroList.forEach(function(macro) {
|
|
@@ -2825,16 +2891,6 @@ function _assert_this_initialized(self) {
|
|
|
2825
2891
|
});
|
|
2826
2892
|
this.material.setMaterialStates(material);
|
|
2827
2893
|
}
|
|
2828
|
-
var mesh = Mesh.create(this.engine, {
|
|
2829
|
-
name: this.name,
|
|
2830
|
-
material: material,
|
|
2831
|
-
geometry: this.getEffectsGeometry(),
|
|
2832
|
-
priority: this.effectsPriority
|
|
2833
|
-
});
|
|
2834
|
-
if (this.effectsMesh !== undefined) {
|
|
2835
|
-
this.effectsMesh.dispose();
|
|
2836
|
-
}
|
|
2837
|
-
this.effectsMesh = mesh;
|
|
2838
2894
|
};
|
|
2839
2895
|
_proto.getFeatureList = function getFeatureList(lightCount, pbrPass, skybox) {
|
|
2840
2896
|
var featureList = [];
|
|
@@ -3032,12 +3088,6 @@ function _assert_this_initialized(self) {
|
|
|
3032
3088
|
this.jointMatrixTexture = undefined;
|
|
3033
3089
|
(_this_jointNormalMatTexture = this.jointNormalMatTexture) == null ? void 0 : _this_jointNormalMatTexture.dispose();
|
|
3034
3090
|
this.jointNormalMatTexture = undefined;
|
|
3035
|
-
this.effectsMesh.dispose({
|
|
3036
|
-
geometries: DestroyOptions.keep,
|
|
3037
|
-
material: DestroyOptions.keep
|
|
3038
|
-
});
|
|
3039
|
-
// @ts-expect-error
|
|
3040
|
-
this.effectsMesh = undefined;
|
|
3041
3091
|
};
|
|
3042
3092
|
/**
|
|
3043
3093
|
* 更新内部 GE 材质着色器 Uniform 数据,根据场景状态
|
|
@@ -3047,7 +3097,7 @@ function _assert_this_initialized(self) {
|
|
|
3047
3097
|
*/ _proto.updateMaterial = function updateMaterial(worldMatrix, nomralMatrix, sceneStates) {
|
|
3048
3098
|
this.updateUniformsByAnimation(worldMatrix, nomralMatrix);
|
|
3049
3099
|
this.updateUniformsByScene(sceneStates);
|
|
3050
|
-
this.material.updateUniforms(this.
|
|
3100
|
+
this.material.updateUniforms(this.getEffectsMaterial());
|
|
3051
3101
|
};
|
|
3052
3102
|
/**
|
|
3053
3103
|
* 点击测试,先进行简单的包围合测试,然后再计算精准的点击测试,这个测试非常耗时不要在移动端上使用
|
|
@@ -3120,7 +3170,7 @@ function _assert_this_initialized(self) {
|
|
|
3120
3170
|
}
|
|
3121
3171
|
};
|
|
3122
3172
|
_proto.updateUniformsByAnimation = function updateUniformsByAnimation(worldMatrix, normalMatrix) {
|
|
3123
|
-
var material = this.
|
|
3173
|
+
var material = this.getEffectsMaterial();
|
|
3124
3174
|
material.setMatrix("_ModelMatrix", worldMatrix);
|
|
3125
3175
|
material.setMatrix("_NormalMatrix", normalMatrix);
|
|
3126
3176
|
//
|
|
@@ -3152,16 +3202,12 @@ function _assert_this_initialized(self) {
|
|
|
3152
3202
|
// Morph 相关的数据更新,仅需要更新 weights 数组
|
|
3153
3203
|
var morph = this.morph;
|
|
3154
3204
|
if (morph !== undefined && morph.hasMorph()) {
|
|
3155
|
-
var morphWeights = morph.morphWeightsArray;
|
|
3156
|
-
|
|
3157
|
-
morphWeights.forEach(function(val) {
|
|
3158
|
-
return morphWeightNumbers.push(val);
|
|
3159
|
-
});
|
|
3160
|
-
material.setFloats("_morphWeights", morphWeightNumbers);
|
|
3205
|
+
var morphWeights = morph.morphWeightsArray.slice();
|
|
3206
|
+
material.setFloats("_morphWeights", morphWeights);
|
|
3161
3207
|
}
|
|
3162
3208
|
};
|
|
3163
3209
|
_proto.updateUniformsByScene = function updateUniformsByScene(sceneStates) {
|
|
3164
|
-
var material = this.
|
|
3210
|
+
var material = this.getEffectsMaterial();
|
|
3165
3211
|
material.setMatrix("_ViewProjectionMatrix", sceneStates.viewProjectionMatrix);
|
|
3166
3212
|
material.setVector3("_Camera", sceneStates.cameraPosition);
|
|
3167
3213
|
//
|
|
@@ -3258,8 +3304,8 @@ function _assert_this_initialized(self) {
|
|
|
3258
3304
|
/**
|
|
3259
3305
|
* 获取 GE 材质
|
|
3260
3306
|
* @returns
|
|
3261
|
-
*/ _proto.
|
|
3262
|
-
return this.
|
|
3307
|
+
*/ _proto.getEffectsMaterial = function getEffectsMaterial() {
|
|
3308
|
+
return this.material.effectMaterial;
|
|
3263
3309
|
};
|
|
3264
3310
|
/**
|
|
3265
3311
|
* 是否无光照材质
|
|
@@ -3294,7 +3340,7 @@ function _assert_this_initialized(self) {
|
|
|
3294
3340
|
return this.boundingBox.clone().applyMatrix4(matrix);
|
|
3295
3341
|
}
|
|
3296
3342
|
};
|
|
3297
|
-
return
|
|
3343
|
+
return PSubMesh;
|
|
3298
3344
|
}();
|
|
3299
3345
|
/**
|
|
3300
3346
|
* 3D 几何类
|
|
@@ -3370,7 +3416,7 @@ function _assert_this_initialized(self) {
|
|
|
3370
3416
|
* 是否有切线属性
|
|
3371
3417
|
* @returns
|
|
3372
3418
|
*/ _proto.hasTangents = function hasTangents() {
|
|
3373
|
-
return this.hasAttribute("
|
|
3419
|
+
return this.hasAttribute("aTangent");
|
|
3374
3420
|
};
|
|
3375
3421
|
/**
|
|
3376
3422
|
* 是否有纹理坐标属性
|
|
@@ -3387,19 +3433,19 @@ function _assert_this_initialized(self) {
|
|
|
3387
3433
|
* 是否有颜色属性
|
|
3388
3434
|
* @returns
|
|
3389
3435
|
*/ _proto.hasColors = function hasColors() {
|
|
3390
|
-
return this.hasAttribute("
|
|
3436
|
+
return this.hasAttribute("aColor");
|
|
3391
3437
|
};
|
|
3392
3438
|
/**
|
|
3393
3439
|
* 是否有关节点属性
|
|
3394
3440
|
* @returns
|
|
3395
3441
|
*/ _proto.hasJoints = function hasJoints() {
|
|
3396
|
-
return this.hasAttribute("
|
|
3442
|
+
return this.hasAttribute("aJoints");
|
|
3397
3443
|
};
|
|
3398
3444
|
/**
|
|
3399
3445
|
* 是否有权重属性
|
|
3400
3446
|
* @returns
|
|
3401
3447
|
*/ _proto.hasWeights = function hasWeights() {
|
|
3402
|
-
return this.hasAttribute("
|
|
3448
|
+
return this.hasAttribute("aWeights");
|
|
3403
3449
|
};
|
|
3404
3450
|
return PGeometry;
|
|
3405
3451
|
}();
|
|
@@ -3408,34 +3454,17 @@ var EffectsMeshProxy = /*#__PURE__*/ function() {
|
|
|
3408
3454
|
this.itemData = itemData;
|
|
3409
3455
|
this.parentItem = parentItem;
|
|
3410
3456
|
this.data = itemData;
|
|
3411
|
-
|
|
3412
|
-
|
|
3413
|
-
var isSuccess = true;
|
|
3457
|
+
this.geometry = itemData.geometry;
|
|
3458
|
+
this.rootBoneItem = itemData.rootBone;
|
|
3414
3459
|
var morphObj = new PMorph();
|
|
3415
|
-
|
|
3416
|
-
|
|
3417
|
-
if (idx === 0) {
|
|
3418
|
-
morphObj.create(prim.geometry);
|
|
3419
|
-
} else {
|
|
3420
|
-
var tempMorph = new PMorph();
|
|
3421
|
-
if (!tempMorph.create(prim.geometry)) {
|
|
3422
|
-
isSuccess = false;
|
|
3423
|
-
} else {
|
|
3424
|
-
if (!morphObj.equals(tempMorph)) {
|
|
3425
|
-
isSuccess = false;
|
|
3426
|
-
console.error("Morpth target mismatch between primtives: " + JSON.stringify(morphObj) + ", " + JSON.stringify(tempMorph));
|
|
3427
|
-
}
|
|
3428
|
-
}
|
|
3429
|
-
}
|
|
3430
|
-
});
|
|
3431
|
-
if (isSuccess) {
|
|
3460
|
+
if (morphObj.create(this.geometry)) {
|
|
3461
|
+
var _itemData_morph;
|
|
3432
3462
|
// 设置初始权重数组
|
|
3433
|
-
if ((morph == null ? void 0 :
|
|
3434
|
-
|
|
3463
|
+
if ((_itemData_morph = itemData.morph) == null ? void 0 : _itemData_morph.weights) {
|
|
3464
|
+
var _itemData_morph1;
|
|
3465
|
+
morphObj.initWeights((_itemData_morph1 = itemData.morph) == null ? void 0 : _itemData_morph1.weights);
|
|
3435
3466
|
}
|
|
3436
3467
|
this.morphObj = morphObj;
|
|
3437
|
-
} else {
|
|
3438
|
-
this.morphObj = new PMorph();
|
|
3439
3468
|
}
|
|
3440
3469
|
}
|
|
3441
3470
|
var _proto = EffectsMeshProxy.prototype;
|
|
@@ -3468,27 +3497,27 @@ var EffectsMeshProxy = /*#__PURE__*/ function() {
|
|
|
3468
3497
|
_proto.getParentIndex = function getParentIndex() {
|
|
3469
3498
|
return -1;
|
|
3470
3499
|
};
|
|
3471
|
-
_proto.
|
|
3472
|
-
return this.data.
|
|
3500
|
+
_proto.getGeometry = function getGeometry() {
|
|
3501
|
+
return this.data.geometry;
|
|
3502
|
+
};
|
|
3503
|
+
_proto.getMaterials = function getMaterials() {
|
|
3504
|
+
return this.data.materials;
|
|
3473
3505
|
};
|
|
3474
|
-
_proto.
|
|
3475
|
-
return this.data.
|
|
3506
|
+
_proto.getMaterialCount = function getMaterialCount() {
|
|
3507
|
+
return this.data.materials.length;
|
|
3476
3508
|
};
|
|
3477
3509
|
_proto.hasSkin = function hasSkin() {
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
return false;
|
|
3510
|
+
var skin = this.geometry.getSkinProps();
|
|
3511
|
+
return !!(skin.rootBoneName && skin.boneNames && skin.inverseBindMatrices && this.rootBoneItem);
|
|
3481
3512
|
};
|
|
3482
3513
|
_proto.getSkinOpts = function getSkinOpts() {
|
|
3483
|
-
|
|
3484
|
-
//return this.options.skin;
|
|
3485
|
-
return;
|
|
3514
|
+
return this.geometry.getSkinProps();
|
|
3486
3515
|
};
|
|
3487
3516
|
_proto.getSkinObj = function getSkinObj(engine) {
|
|
3488
3517
|
var skin = this.getSkinOpts();
|
|
3489
|
-
if (skin
|
|
3518
|
+
if (skin.rootBoneName && skin.boneNames && skin.inverseBindMatrices && this.rootBoneItem) {
|
|
3490
3519
|
var skinObj = new PSkin();
|
|
3491
|
-
skinObj.create(skin, engine, this.
|
|
3520
|
+
skinObj.create(skin, engine, this.rootBoneItem);
|
|
3492
3521
|
return skinObj;
|
|
3493
3522
|
}
|
|
3494
3523
|
return undefined;
|
|
@@ -3878,7 +3907,7 @@ var EffectsMeshProxy = /*#__PURE__*/ function() {
|
|
|
3878
3907
|
return PSceneManager;
|
|
3879
3908
|
}();
|
|
3880
3909
|
|
|
3881
|
-
var primitiveVert = "precision highp float;\n#define FEATURES\n#include <webglCompatibility.glsl>\n#include <animation.vert.glsl>\nvsIn vec4 aPos;vsOut vec3 v_Position;\n#ifdef HAS_NORMALS\nvsIn vec4 aNormal;\n#endif\n#ifdef HAS_TANGENTS\nvsIn vec4
|
|
3910
|
+
var primitiveVert = "precision highp float;\n#define FEATURES\n#include <webglCompatibility.glsl>\n#include <animation.vert.glsl>\nvsIn vec4 aPos;vsOut vec3 v_Position;\n#ifdef HAS_NORMALS\nvsIn vec4 aNormal;\n#endif\n#ifdef HAS_TANGENTS\nvsIn vec4 aTangent;\n#endif\n#ifdef HAS_NORMALS\n#ifdef HAS_TANGENTS\nvsOut mat3 v_TBN;\n#else\nvsOut vec3 v_Normal;\n#endif\n#endif\n#ifdef HAS_UV_SET1\nvsIn vec2 aUV;\n#endif\n#ifdef HAS_UV_SET2\nvsIn vec2 aUV2;\n#endif\nvsOut vec2 v_UVCoord1;\n#ifdef HAS_UV_SET2\nvsOut vec2 v_UVCoord2;\n#endif\n#ifdef HAS_VERTEX_COLOR_VEC3\nvsIn vec3 aColor;vsOut vec3 v_Color;\n#endif\n#ifdef HAS_VERTEX_COLOR_VEC4\nvsIn vec4 aColor;vsOut vec4 v_Color;\n#endif\nuniform mat4 _ViewProjectionMatrix;uniform mat4 _ModelMatrix;uniform mat4 _NormalMatrix;\n#ifdef EDITOR_TRANSFORM\nuniform vec4 uEditorTransform;\n#endif\n#ifdef USE_SHADOW_MAPPING\nuniform mat4 _LightViewProjectionMatrix;uniform float _DeltaSceneSize;vsOut vec4 v_PositionLightSpace;vsOut vec4 v_dPositionLightSpace;\n#endif\nvec4 getPosition(){vec4 pos=vec4(aPos.xyz,1.0);\n#ifdef USE_MORPHING\npos+=getTargetPosition();\n#endif\n#ifdef USE_SKINNING\npos=getSkinningMatrix()*pos;\n#endif\nreturn pos;}\n#ifdef HAS_NORMALS\nvec4 getNormal(){vec4 normal=aNormal;\n#ifdef USE_MORPHING\nnormal+=getTargetNormal();\n#endif\n#ifdef USE_SKINNING\nnormal=getSkinningNormalMatrix()*normal;\n#endif\nreturn normalize(normal);}\n#endif\n#ifdef HAS_TANGENTS\nvec4 getTangent(){vec4 tangent=aTangent;\n#ifdef USE_MORPHING\ntangent+=getTargetTangent();\n#endif\n#ifdef USE_SKINNING\ntangent=getSkinningMatrix()*tangent;\n#endif\nreturn normalize(tangent);}\n#endif\nvoid main(){vec4 pos=_ModelMatrix*getPosition();v_Position=vec3(pos.xyz)/pos.w;\n#ifdef HAS_NORMALS\n#ifdef HAS_TANGENTS\nvec4 tangent=getTangent();vec3 normalW=normalize(vec3(_NormalMatrix*vec4(getNormal().xyz,0.0)));vec3 tangentW=normalize(vec3(_ModelMatrix*vec4(tangent.xyz,0.0)));vec3 bitangentW=cross(normalW,tangentW)*tangent.w;v_TBN=mat3(tangentW,bitangentW,normalW);\n#else\nv_Normal=normalize(vec3(_NormalMatrix*vec4(getNormal().xyz,0.0)));\n#endif\n#endif\nv_UVCoord1=vec2(0.0,0.0);\n#ifdef HAS_UV_SET1\nv_UVCoord1=aUV;\n#endif\n#ifdef HAS_UV_SET2\nv_UVCoord2=aUV2;\n#endif\n#if defined(HAS_VERTEX_COLOR_VEC3) || defined(HAS_VERTEX_COLOR_VEC4)\nv_Color=aColor;\n#endif\n#ifdef USE_SHADOW_MAPPING\nv_PositionLightSpace=_LightViewProjectionMatrix*pos;vec3 dpos=vec3(_DeltaSceneSize);v_dPositionLightSpace=_LightViewProjectionMatrix*(pos+vec4(dpos,0));\n#endif\ngl_Position=_ViewProjectionMatrix*pos;\n#ifdef EDITOR_TRANSFORM\ngl_Position=vec4(gl_Position.xy*uEditorTransform.xy+uEditorTransform.zw*gl_Position.w,gl_Position.zw);\n#endif\n}";
|
|
3882
3911
|
|
|
3883
3912
|
var metallicRoughnessFrag = "\n#define FEATURES\n#ifndef WEBGL2\n#extension GL_OES_standard_derivatives : enable\n#endif\n#if !defined(WEBGL2) && defined(USE_TEX_LOD)\n#extension GL_EXT_shader_texture_lod : enable\n#endif\n#ifdef USE_HDR\n#extension GL_OES_texture_float : enable\n#extension GL_OES_texture_float_linear : enable\n#endif\n#if !defined(WEBGL2) && defined(USE_WBOIT)\n#extension GL_EXT_draw_buffers: require\n#endif\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n#ifdef WEBGL2\n#ifdef USE_WBOIT\nlayout(location=0)out vec4 outFragColor0;layout(location=1)out vec4 outFragColor1;\n#else\nout vec4 outFragColor;\n#endif\n#else\n#ifdef USE_WBOIT\n#define outFragColor0 gl_FragData[0]\n#define outFragColor1 gl_FragData[1]\n#else\n#define outFragColor gl_FragColor\n#endif\n#endif\n#include <webglCompatibility.glsl>\n#include <extensions.frag.glsl>\n#include <tonemapping.frag.glsl>\n#include <textures.vert.glsl>\n#include <functions.frag.glsl>\n#include <shadowCommon.vert.glsl>\n#include <shadow.frag.glsl>\nstruct Light{vec3 direction;float range;vec3 color;float intensity;vec3 position;float innerConeCos;float outerConeCos;int type;vec2 padding;};const int LightType_Directional=0;const int LightType_Point=1;const int LightType_Spot=2;const int LightType_Ambient=3;\n#ifdef USE_PUNCTUAL\nuniform Light _Lights[LIGHT_COUNT];\n#endif\n#if defined(MATERIAL_SPECULARGLOSSINESS) || defined(MATERIAL_METALLICROUGHNESS)\nuniform float _MetallicFactor;uniform float _RoughnessFactor;uniform vec4 _BaseColorFactor;\n#endif\n#ifdef MATERIAL_SPECULARGLOSSINESS\nuniform vec3 _SpecularFactor;uniform vec4 _DiffuseFactor;uniform float _GlossinessFactor;\n#endif\n#ifdef ALPHAMODE_MASK\nuniform float _AlphaCutoff;\n#endif\n#ifdef ADD_FOG\nuniform vec4 _FogColor;\n#ifdef LINEAR_FOG\nuniform float _FogNear;uniform float _FogFar;\n#endif\n#ifdef EXP_FOG\nuniform float _FogDensity;\n#endif\n#endif\n#ifdef PREVIEW_BORDER\nuniform vec4 uPreviewColor;\n#endif\nuniform vec3 _Camera;uniform int _MipCount;struct MaterialInfo{float perceptualRoughness;vec3 reflectance0;float alphaRoughness;vec3 diffuseColor;vec3 reflectance90;vec3 specularColor;};\n#ifdef ADD_FOG\nvec3 getMixFogColor(vec3 baseColor){vec3 distance=_Camera-v_Position;float fogAmount=0.0;\n#ifdef LINEAR_FOG\nfogAmount=smoothstep(_FogNear,_FogFar,distance[2]);\n#endif\n#ifdef EXP_FOG\n#define LOG2 1.442695\nfogAmount=1.-exp2(-_FogDensity*_FogDensity*distance[2]*distance[2]*LOG2);fogAmount=clamp(fogAmount,0.,1.);\n#endif\nvec3 mixColor=baseColor.rgb+(vec3(_FogColor)-baseColor.rgb)*fogAmount;return mixColor;}\n#endif\n#ifdef IRRADIANCE_COEFFICIENTS\nvec3 getIrradiance(vec3 norm,SHCoefficients c){float x=norm.x;float y=norm.y;float z=norm.z;float c1=0.429043;float c2=0.511664;float c3=0.743125;float c4=0.886227;float c5=0.247708;vec3 irradiance=c1*c.l22*(x*x-y*y)+c3*c.l20*(z*z)+c4*c.l00-c5*c.l20+2.0*c1*(c.l2m2*x*y+c.l21*x*z+c.l2m1*y*z)+2.0*c2*(c.l11*x+c.l1m1*y+c.l10*z);return irradiance;}\n#endif\n#ifdef USE_IBL\nvec3 getIBLContribution(MaterialInfo materialInfo,vec3 n,vec3 v){float NdotV=clamp(dot(n,v),0.0,1.0);float lod=clamp(materialInfo.perceptualRoughness*float(_MipCount),0.0,float(_MipCount));vec3 reflection=normalize(reflect(-v,n));vec2 brdfSamplePoint=clamp(vec2(NdotV,materialInfo.perceptualRoughness),vec2(0.0,0.0),vec2(1.0,1.0));vec2 brdf=texture2D(_brdfLUT,brdfSamplePoint).rg;vec4 diffuseColor=vec4(1.0,0.0,0.0,1.0);\n#ifdef IRRADIANCE_COEFFICIENTS\nvec3 irradiance=getIrradiance(n,_shCoefficients);diffuseColor=vec4(irradiance,1.0);\n#else\ndiffuseColor=textureCube(_DiffuseEnvSampler,n);\n#endif\n#ifdef USE_TEX_LOD\nvec4 specularSample=_textureCubeLodEXT(_SpecularEnvSampler,reflection,lod);\n#else\nvec4 specularSample=textureCube(_SpecularEnvSampler,reflection,lod);\n#endif\n#ifdef USE_HDR\nvec3 diffuseLight=diffuseColor.rgb;vec3 specularLight=specularSample.rgb;\n#else\nvec3 diffuseLight=SRGBtoLINEAR(diffuseColor).rgb;vec3 specularLight=SRGBtoLINEAR(specularSample).rgb;\n#endif\nvec3 diffuse=diffuseLight*materialInfo.diffuseColor;vec3 specular=specularLight*(materialInfo.specularColor*brdf.x+brdf.y);return diffuse*_IblIntensity[0]+specular*_IblIntensity[1];}\n#endif\nvec3 diffuse(MaterialInfo materialInfo){return materialInfo.diffuseColor/M_PI;}vec3 specularReflection(MaterialInfo materialInfo,AngularInfo angularInfo){return materialInfo.reflectance0+(materialInfo.reflectance90-materialInfo.reflectance0)*pow(clamp(1.0-angularInfo.VdotH,0.0,1.0),5.0);}float visibilityOcclusion(MaterialInfo materialInfo,AngularInfo angularInfo){float NdotL=angularInfo.NdotL;float NdotV=angularInfo.NdotV;float alphaRoughnessSq=materialInfo.alphaRoughness*materialInfo.alphaRoughness;float GGXV=NdotL*sqrt(NdotV*NdotV*(1.0-alphaRoughnessSq)+alphaRoughnessSq);float GGXL=NdotV*sqrt(NdotL*NdotL*(1.0-alphaRoughnessSq)+alphaRoughnessSq);float GGX=GGXV+GGXL;if(GGX>0.0){return 0.5/GGX;}return 0.0;}float microfacetDistribution(MaterialInfo materialInfo,AngularInfo angularInfo){float alphaRoughnessSq=materialInfo.alphaRoughness*materialInfo.alphaRoughness;float f=(angularInfo.NdotH*alphaRoughnessSq-angularInfo.NdotH)*angularInfo.NdotH+1.0;return alphaRoughnessSq/(M_PI*f*f);}vec3 getPointShade(vec3 pointToLight,MaterialInfo materialInfo,vec3 normal,vec3 view){AngularInfo angularInfo=getAngularInfo(pointToLight,normal,view);if(angularInfo.NdotL>0.0||angularInfo.NdotV>0.0){vec3 F=specularReflection(materialInfo,angularInfo);float Vis=visibilityOcclusion(materialInfo,angularInfo);float D=microfacetDistribution(materialInfo,angularInfo);vec3 diffuseContrib=(1.0-F)*diffuse(materialInfo);vec3 specContrib=F*Vis*D;return angularInfo.NdotL*(diffuseContrib+specContrib);}return vec3(0.0,0.0,0.0);}float getRangeAttenuation(float range,float distance){if(range<=0.0){return 1.0;}return 1.0/(pow(5.0*distance/range,2.0)+1.0);}float getSpotAttenuation(vec3 pointToLight,vec3 spotDirection,float outerConeCos,float innerConeCos){float actualCos=dot(normalize(spotDirection),normalize(-pointToLight));if(actualCos>outerConeCos){if(actualCos<innerConeCos){return smoothstep(outerConeCos,innerConeCos,actualCos);}return 1.0;}return 0.0;}vec3 applyDirectionalLight(Light light,MaterialInfo materialInfo,vec3 normal,vec3 view,float shadow){vec3 pointToLight=-light.direction;vec3 shade=getPointShade(pointToLight,materialInfo,normal,view)*shadow;return light.intensity*light.color*shade;}vec3 applyPointLight(Light light,MaterialInfo materialInfo,vec3 normal,vec3 view){vec3 pointToLight=light.position-v_Position;float distance=length(pointToLight);float attenuation=getRangeAttenuation(light.range,distance);vec3 shade=getPointShade(pointToLight,materialInfo,normal,view);return light.color*shade*attenuation*light.intensity;}vec3 applySpotLight(Light light,MaterialInfo materialInfo,vec3 normal,vec3 view,float shadow){vec3 pointToLight=light.position-v_Position;float distance=length(pointToLight);float rangeAttenuation=getRangeAttenuation(light.range,distance);float spotAttenuation=getSpotAttenuation(pointToLight,light.direction,light.outerConeCos,light.innerConeCos);vec3 shade=getPointShade(pointToLight,materialInfo,normal,view)*shadow;return rangeAttenuation*spotAttenuation*light.intensity*light.color*shade;}vec3 applyAmbientLight(Light light,MaterialInfo materialInfo){return light.intensity*light.color*diffuse(materialInfo);}float weight(float z,float a){return clamp(pow(min(1.0,a*10.0)+0.01,3.0)*1e8*pow(1.0-z*0.9,3.0),1e-2,3e3);}void writeFragmentColor(vec4 fragColor){\n#if !defined(ALPHAMODE_OPAQUE) && defined(USE_WBOIT)\nfloat w=weight(gl_FragCoord.z,fragColor.a);fragColor.rgb*=fragColor.a;outFragColor0=vec4(fragColor.rgb*w,fragColor.a);outFragColor1=vec4(fragColor.a*w);\n#else\noutFragColor=fragColor;\n#endif\n}void main(){float perceptualRoughness=0.0;float metallic=0.0;vec4 baseColor=vec4(0.0,0.0,0.0,1.0);vec3 diffuseColor=vec3(0.0);vec3 specularColor=vec3(0.0);vec3 f0=vec3(0.04);\n#ifdef PREVIEW_BORDER\nwriteFragmentColor(uPreviewColor);return;\n#endif\n#ifdef MATERIAL_SPECULARGLOSSINESS\n#ifdef HAS_SPECULAR_GLOSSINESS_MAP\nvec4 sgSample=SRGBtoLINEAR(texture2D(_SpecularGlossinessSampler,getSpecularGlossinessUV()));perceptualRoughness=(1.0-sgSample.a*_GlossinessFactor);f0=sgSample.rgb*_SpecularFactor;\n#else\nf0=_SpecularFactor;perceptualRoughness=1.0-_GlossinessFactor;\n#endif\n#ifdef HAS_DIFFUSE_MAP\nbaseColor=SRGBtoLINEAR(texture2D(_DiffuseSampler,getDiffuseUV()))*_DiffuseFactor;\n#else\nbaseColor=SRGBtoLINEAR(_DiffuseFactor);\n#endif\nbaseColor*=getVertexColor();specularColor=f0;float oneMinusSpecularStrength=1.0-max(max(f0.r,f0.g),f0.b);diffuseColor=baseColor.rgb*oneMinusSpecularStrength;\n#ifdef DEBUG_METALLIC\nmetallic=solveMetallic(baseColor.rgb,specularColor,oneMinusSpecularStrength);\n#endif\n#endif\n#ifdef MATERIAL_METALLICROUGHNESS\n#ifdef HAS_METALLIC_ROUGHNESS_MAP\nvec4 mrSample=texture2D(_MetallicRoughnessSampler,getMetallicRoughnessUV());perceptualRoughness=mrSample.g*_RoughnessFactor;metallic=mrSample.b*_MetallicFactor;\n#else\nmetallic=_MetallicFactor;perceptualRoughness=_RoughnessFactor;\n#endif\n#ifdef HAS_BASE_COLOR_MAP\nbaseColor=SRGBtoLINEAR(texture2D(_BaseColorSampler,getBaseColorUV()))*_BaseColorFactor;\n#else\nbaseColor=SRGBtoLINEAR(_BaseColorFactor);\n#endif\nbaseColor*=getVertexColor();diffuseColor=baseColor.rgb*(vec3(1.0)-f0)*(1.0-metallic);specularColor=mix(f0,baseColor.rgb,metallic);\n#endif\n#ifdef ALPHAMODE_MASK\nif(baseColor.a<_AlphaCutoff){discard;}baseColor.a=1.0;\n#endif\n#ifdef ALPHAMODE_OPAQUE\nbaseColor.a=1.0;\n#endif\n#ifdef MATERIAL_UNLIT\n#ifndef DEBUG_OUTPUT\n#ifdef ADD_FOG\nvec3 mixColor=getMixFogColor(baseColor.rgb);vec4 fragColorUnlit=vec4(LINEARtoSRGB(mixColor)*baseColor.a,baseColor.a);\n#else\nvec4 fragColorUnlit=vec4(LINEARtoSRGB(baseColor.rgb)*baseColor.a,baseColor.a);\n#endif\nwriteFragmentColor(fragColorUnlit);\n#else\n#ifdef DEBUG_UV\noutFragColor.rgb=vec3(getDebugUVColor(getBaseColorUV(),getNormal()));\n#endif\n#ifdef DEBUG_METALLIC\noutFragColor.rgb=vec3(metallic);\n#endif\n#ifdef DEBUG_ROUGHNESS\noutFragColor.rgb=vec3(perceptualRoughness);\n#endif\n#ifdef DEBUG_NORMAL\noutFragColor.rgb=getNormal()*0.5+0.5;\n#endif\n#ifdef DEBUG_BASECOLOR\noutFragColor.rgb=LINEARtoSRGB(baseColor.rgb);\n#endif\n#ifdef DEBUG_OCCLUSION\noutFragColor.rgb=vec3(1.0);\n#endif\n#ifdef DEBUG_EMISSIVE\noutFragColor.rgb=vec3(0.0);\n#endif\n#ifdef DEBUG_ALPHA\noutFragColor.rgb=vec3(baseColor.a);\n#endif\noutFragColor.a=1.0;\n#endif\nreturn;\n#endif\nmetallic=clamp(metallic,0.0,1.0);float alphaRoughness=perceptualRoughness*perceptualRoughness;vec3 normal=getNormal();\n#ifdef USE_SPECULAR_AA\nfloat AARoughnessFactor=getAARoughnessFactor(normal);perceptualRoughness+=AARoughnessFactor;alphaRoughness+=AARoughnessFactor;\n#endif\nperceptualRoughness=clamp(perceptualRoughness,0.04,1.0);alphaRoughness=clamp(alphaRoughness,0.04,1.0);float reflectance=max(max(specularColor.r,specularColor.g),specularColor.b);vec3 specularEnvironmentR0=specularColor.rgb;vec3 specularEnvironmentR90=vec3(clamp(reflectance*50.0,0.0,1.0));MaterialInfo materialInfo=MaterialInfo(perceptualRoughness,specularEnvironmentR0,alphaRoughness,diffuseColor,specularEnvironmentR90,specularColor);vec3 color=vec3(0.0,0.0,0.0);vec3 view=normalize(_Camera-v_Position);float shadow=1.0;\n#ifdef USE_SHADOW_MAPPING\nshadow=getShadowContribution();\n#endif\n#ifdef USE_PUNCTUAL\nfor(int i=0;i<LIGHT_COUNT;++i){Light light=_Lights[i];if(light.type==LightType_Directional){color+=applyDirectionalLight(light,materialInfo,normal,view,shadow);}else if(light.type==LightType_Point){color+=applyPointLight(light,materialInfo,normal,view);}else if(light.type==LightType_Spot){color+=applySpotLight(light,materialInfo,normal,view,shadow);}else if(light.type==LightType_Ambient){color+=applyAmbientLight(light,materialInfo);}}\n#endif\n#ifdef USE_IBL\ncolor+=getIBLContribution(materialInfo,normal,view);\n#endif\nfloat ao=1.0;\n#ifdef HAS_OCCLUSION_MAP\nao=texture2D(_OcclusionSampler,getOcclusionUV()).r;color=mix(color,color*ao,_OcclusionStrength);\n#endif\nvec3 emissive=vec3(0);\n#ifndef DEBUG_OUTPUT\n#ifdef ADD_FOG\nvec4 toneMapColor=SRGBtoLINEAR(vec4(toneMap(color),baseColor.a));color=getMixFogColor(toneMapColor.rgb);vec4 fragColorOut=vec4(LINEARtoSRGB(color.rgb)*baseColor.a,baseColor.a);\n#else\ncolor=toneMap(color)*baseColor.a;\n#ifdef HAS_EMISSIVE\ncolor+=_EmissiveFactor.rgb*_EmissiveIntensity;\n#endif\n#ifdef HAS_EMISSIVE_MAP\nemissive=SRGBtoLINEAR(texture2D(_EmissiveSampler,getEmissiveUV())).rgb*_EmissiveFactor.rgb*_EmissiveIntensity;color+=emissive;\n#endif\nvec4 fragColorOut=vec4(color,baseColor.a);\n#endif\nwriteFragmentColor(fragColorOut);\n#else\n#ifdef DEBUG_UV\noutFragColor.rgb=vec3(getDebugUVColor(getBaseColorUV(),normal));\n#endif\n#ifdef DEBUG_METALLIC\noutFragColor.rgb=vec3(metallic);\n#endif\n#ifdef DEBUG_ROUGHNESS\noutFragColor.rgb=vec3(perceptualRoughness);\n#endif\n#ifdef DEBUG_NORMAL\noutFragColor.rgb=normal*0.5+0.5;\n#endif\n#ifdef DEBUG_BASECOLOR\noutFragColor.rgb=LINEARtoSRGB(baseColor.rgb);\n#endif\n#ifdef DEBUG_OCCLUSION\n#ifdef HAS_OCCLUSION_MAP\noutFragColor.rgb=vec3(mix(1.0,ao,_OcclusionStrength));\n#else\noutFragColor.rgb=vec3(1.0);\n#endif\n#endif\n#ifdef DEBUG_EMISSIVE\n#ifdef HAS_EMISSIVE\nemissive=_EmissiveFactor.rgb*_EmissiveIntensity;\n#endif\n#ifdef HAS_EMISSIVE_MAP\nemissive=SRGBtoLINEAR(texture2D(_EmissiveSampler,getEmissiveUV())).rgb*_EmissiveFactor.rgb*_EmissiveIntensity;\n#endif\noutFragColor.rgb=LINEARtoSRGB(emissive);\n#endif\n#ifdef DEBUG_F0\noutFragColor.rgb=vec3(f0);\n#endif\n#ifdef DEBUG_ALPHA\noutFragColor.rgb=vec3(baseColor.a);\n#endif\noutFragColor.a=1.0;\n#endif\n}";
|
|
3884
3913
|
|
|
@@ -3886,9 +3915,9 @@ var shadowPassFrag = "#define FEATURES\n#include <shadowCommon.vert.glsl>\n#incl
|
|
|
3886
3915
|
|
|
3887
3916
|
var skyboxVert = "precision highp float;\n#define FEATURES\n#include <webglCompatibility.glsl>\nvsIn vec3 aPos;vsOut vec3 v_CameraDir;uniform mat4 _InvViewProjectionMatrix;void main(){vec4 dir=_InvViewProjectionMatrix*vec4(aPos.xy,1,1);v_CameraDir=normalize(dir.xyz/dir.w);gl_Position=vec4(aPos.xy,0.99999,1);}";
|
|
3888
3917
|
|
|
3889
|
-
var skyboxFrag = "
|
|
3918
|
+
var skyboxFrag = "\n#define FEATURES\n#if !defined(WEBGL2) && defined(USE_TEX_LOD)\n#extension GL_EXT_shader_texture_lod : enable\n#endif\n#if !defined(WEBGL2)\n#extension GL_OES_standard_derivatives : enable\n#endif\nprecision highp float;\n#include <webglCompatibility.glsl>\n#include <extensions.frag.glsl>\n#ifdef WEBGL2\nout vec4 outFragColor;\n#else\n#define outFragColor gl_FragColor\n#endif\nuniform sampler2D _brdfLUT;uniform vec2 _IblIntensity;uniform int _MipCount;uniform samplerCube _DiffuseEnvSampler;uniform samplerCube _SpecularEnvSampler;fsIn vec3 v_CameraDir;\n#ifdef IRRADIANCE_COEFFICIENTS\nstruct SHCoefficients{vec3 l00,l1m1,l10,l11,l2m2,l2m1,l20,l21,l22;};uniform SHCoefficients _shCoefficients;vec3 getIrradiance(vec3 norm,SHCoefficients c){float x=norm.x;float y=norm.y;float z=norm.z;float c1=0.429043;float c2=0.511664;float c3=0.743125;float c4=0.886227;float c5=0.247708;vec3 irradiance=c1*c.l22*(x*x-y*y)+c3*c.l20*(z*z)+c4*c.l00-c5*c.l20+2.0*c1*(c.l2m2*x*y+c.l21*x*z+c.l2m1*y*z)+2.0*c2*(c.l11*x+c.l1m1*y+c.l10*z);return irradiance;}\n#endif\nvec3 getIBLContribution(vec3 n,vec3 v){const float metallic=0.9;const float perceptualRoughness=0.1;const vec4 baseColor=vec4(1.0);const vec3 f0=vec3(0.04);const vec3 diffuseColor=baseColor.rgb*(vec3(1.0)-f0)*(1.0-metallic);const vec3 specularColor=mix(f0,baseColor.rgb,metallic);float NdotV=clamp(dot(n,v),0.0,1.0);float lod=clamp(perceptualRoughness*float(_MipCount),0.0,float(_MipCount));vec3 reflection=normalize(reflect(-v,n));vec2 brdfSamplePoint=clamp(vec2(NdotV,perceptualRoughness),vec2(0.0,0.0),vec2(1.0,1.0));vec2 brdf=texture2D(_brdfLUT,brdfSamplePoint).rg;vec4 diffuseSample=vec4(1.0,0.0,0.0,1.0);\n#ifdef IRRADIANCE_COEFFICIENTS\nvec3 irradiance=getIrradiance(n,_shCoefficients);diffuseSample=vec4(irradiance,1.0);\n#else\ndiffuseSample=textureCube(_DiffuseEnvSampler,n);\n#endif\n#ifdef USE_TEX_LOD\nvec4 specularSample=_textureCubeLodEXT(_SpecularEnvSampler,reflection,lod);\n#else\nvec4 specularSample=textureCube(_SpecularEnvSampler,reflection,lod);\n#endif\nvec3 diffuseLight=diffuseSample.rgb;vec3 specularLight=specularSample.rgb;vec3 diffuse=diffuseLight*diffuseColor;vec3 specular=specularLight*(specularColor*brdf.x+brdf.y);return diffuse*_IblIntensity[0]+specular*_IblIntensity[1];}void main(){vec3 dir=normalize(v_CameraDir);outFragColor=vec4(getIBLContribution(dir,dir),1.0);}";
|
|
3890
3919
|
|
|
3891
|
-
var animationVertGLSL = "#ifdef HAS_TARGET_POSITION0\nvsIn vec3
|
|
3920
|
+
var animationVertGLSL = "#ifdef HAS_TARGET_POSITION0\nvsIn vec3 aTargetPosition0;\n#endif\n#ifdef HAS_TARGET_POSITION1\nvsIn vec3 aTargetPosition1;\n#endif\n#ifdef HAS_TARGET_POSITION2\nvsIn vec3 aTargetPosition2;\n#endif\n#ifdef HAS_TARGET_POSITION3\nvsIn vec3 aTargetPosition3;\n#endif\n#ifdef HAS_TARGET_POSITION4\nvsIn vec3 aTargetPosition4;\n#endif\n#ifdef HAS_TARGET_POSITION5\nvsIn vec3 aTargetPosition5;\n#endif\n#ifdef HAS_TARGET_POSITION6\nvsIn vec3 aTargetPosition6;\n#endif\n#ifdef HAS_TARGET_POSITION7\nvsIn vec3 aTargetPosition7;\n#endif\n#ifdef HAS_TARGET_NORMAL0\nvsIn vec3 aTargetNormal0;\n#endif\n#ifdef HAS_TARGET_NORMAL1\nvsIn vec3 aTargetNormal1;\n#endif\n#ifdef HAS_TARGET_NORMAL2\nvsIn vec3 aTargetNormal2;\n#endif\n#ifdef HAS_TARGET_NORMAL3\nvsIn vec3 aTargetNormal3;\n#endif\n#ifdef HAS_TARGET_NORMAL4\nvsIn vec3 aTargetNormal4;\n#endif\n#ifdef HAS_TARGET_TANGENT0\nvsIn vec3 aTargetTangent0;\n#endif\n#ifdef HAS_TARGET_TANGENT1\nvsIn vec3 aTargetTangent1;\n#endif\n#ifdef HAS_TARGET_TANGENT2\nvsIn vec3 aTargetTangent2;\n#endif\n#ifdef HAS_TARGET_TANGENT3\nvsIn vec3 aTargetTangent3;\n#endif\n#ifdef HAS_TARGET_TANGENT4\nvsIn vec3 aTargetTangent4;\n#endif\n#ifdef USE_MORPHING\nuniform float _morphWeights[WEIGHT_COUNT];\n#endif\n#ifdef HAS_JOINT_SET1\nvsIn vec4 aJoints;\n#endif\n#ifdef HAS_JOINT_SET2\nvsIn vec4 aJoint2;\n#endif\n#ifdef HAS_WEIGHT_SET1\nvsIn vec4 aWeights;\n#endif\n#ifdef HAS_WEIGHT_SET2\nvsIn vec4 aWeight2;\n#endif\n#ifdef USE_SKINNING\n#ifdef USE_SKINNING_TEXTURE\nuniform sampler2D _jointMatrixSampler;uniform sampler2D _jointNormalMatrixSampler;\n#else\nuniform mat4 _jointMatrix[JOINT_COUNT];uniform mat4 _jointNormalMatrix[JOINT_COUNT];\n#endif\n#endif\n#define ROW0_U ((0.5 + 0.0) / 4.0)\n#define ROW1_U ((0.5 + 1.0) / 4.0)\n#define ROW2_U ((0.5 + 2.0) / 4.0)\n#define ROW3_U ((0.5 + 3.0) / 4.0)\n#ifdef USE_SKINNING\nmat4 getJointMatrix(float boneNdx){\n#ifdef USE_SKINNING_TEXTURE\nfloat v=(boneNdx+0.5)/float(JOINT_COUNT);return mat4(texture2D(_jointMatrixSampler,vec2(ROW0_U,v)),texture2D(_jointMatrixSampler,vec2(ROW1_U,v)),texture2D(_jointMatrixSampler,vec2(ROW2_U,v)),texture2D(_jointMatrixSampler,vec2(ROW3_U,v)));\n#else\nreturn _jointMatrix[int(boneNdx)];\n#endif\n}mat4 getJointNormalMatrix(float boneNdx){\n#ifdef USE_SKINNING_TEXTURE\nfloat v=(boneNdx+0.5)/float(JOINT_COUNT);return mat4(texture2D(_jointNormalMatrixSampler,vec2(ROW0_U,v)),texture2D(_jointNormalMatrixSampler,vec2(ROW1_U,v)),texture2D(_jointNormalMatrixSampler,vec2(ROW2_U,v)),texture2D(_jointNormalMatrixSampler,vec2(ROW3_U,v)));\n#else\nreturn _jointNormalMatrix[int(boneNdx)];\n#endif\n}mat4 getSkinningMatrix(){mat4 skin=mat4(0);\n#if defined(HAS_WEIGHT_SET1) && defined(HAS_JOINT_SET1)\nskin+=aWeights.x*getJointMatrix(aJoints.x)+aWeights.y*getJointMatrix(aJoints.y)+aWeights.z*getJointMatrix(aJoints.z)+aWeights.w*getJointMatrix(aJoints.w);\n#endif\nreturn skin;}mat4 getSkinningNormalMatrix(){mat4 skin=mat4(0);\n#if defined(HAS_WEIGHT_SET1) && defined(HAS_JOINT_SET1)\nskin+=aWeights.x*getJointNormalMatrix(aJoints.x)+aWeights.y*getJointNormalMatrix(aJoints.y)+aWeights.z*getJointNormalMatrix(aJoints.z)+aWeights.w*getJointNormalMatrix(aJoints.w);\n#endif\nreturn skin;}\n#endif\n#ifdef USE_MORPHING\nvec4 getTargetPosition(){vec4 pos=vec4(0);\n#ifdef HAS_TARGET_POSITION0\npos.xyz+=_morphWeights[0]*aTargetPosition0;\n#endif\n#ifdef HAS_TARGET_POSITION1\npos.xyz+=_morphWeights[1]*aTargetPosition1;\n#endif\n#ifdef HAS_TARGET_POSITION2\npos.xyz+=_morphWeights[2]*aTargetPosition2;\n#endif\n#ifdef HAS_TARGET_POSITION3\npos.xyz+=_morphWeights[3]*aTargetPosition3;\n#endif\n#ifdef HAS_TARGET_POSITION4\npos.xyz+=_morphWeights[4]*aTargetPosition4;\n#endif\nreturn pos;}vec4 getTargetNormal(){vec4 normal=vec4(0);\n#ifdef HAS_TARGET_NORMAL0\nnormal.xyz+=_morphWeights[0]*aTargetNormal0;\n#endif\n#ifdef HAS_TARGET_NORMAL1\nnormal.xyz+=_morphWeights[1]*aTargetNormal1;\n#endif\n#ifdef HAS_TARGET_NORMAL2\nnormal.xyz+=_morphWeights[2]*aTargetNormal2;\n#endif\n#ifdef HAS_TARGET_NORMAL3\nnormal.xyz+=_morphWeights[3]*aTargetNormal3;\n#endif\n#ifdef HAS_TARGET_NORMAL4\nnormal.xyz+=_morphWeights[4]*aTargetNormal4;\n#endif\nreturn normal;}vec4 getTargetTangent(){vec4 tangent=vec4(0);\n#ifdef HAS_TARGET_TANGENT0\ntangent.xyz+=_morphWeights[0]*aTargetTangent0;\n#endif\n#ifdef HAS_TARGET_TANGENT1\ntangent.xyz+=_morphWeights[1]*aTargetTangent1;\n#endif\n#ifdef HAS_TARGET_TANGENT2\ntangent.xyz+=_morphWeights[2]*aTargetTangent2;\n#endif\n#ifdef HAS_TARGET_TANGENT3\ntangent.xyz+=_morphWeights[3]*aTargetTangent3;\n#endif\n#ifdef HAS_TARGET_TANGENT4\ntangent.xyz+=_morphWeights[4]*aTargetTangent4;\n#endif\nreturn tangent;}\n#endif\n";
|
|
3892
3921
|
|
|
3893
3922
|
var extensionsFragGLSL = "vec3 _dFdx(vec3 coord){\n#if defined(GL_OES_standard_derivatives) || defined(WEBGL2)\nreturn dFdx(coord);\n#endif\nreturn vec3(0.0);}vec3 _dFdy(vec3 coord){\n#if defined(GL_OES_standard_derivatives) || defined(WEBGL2)\nreturn dFdy(coord);\n#endif\nreturn vec3(0.0);}\n#ifdef USE_TEX_LOD\nvec4 _textureCubeLodEXT(samplerCube sampler,vec3 coord,float lod){\n#if defined(WEBGL2) || defined(GL_EXT_shader_texture_lod)\nreturn textureCubeLodEXT(sampler,coord,lod);\n#else\nreturn textureCube(sampler,coord,lod);\n#endif\n}\n#endif\n";
|
|
3894
3923
|
|
|
@@ -4341,6 +4370,9 @@ var ModelMeshComponent = /*#__PURE__*/ function(RendererComponent) {
|
|
|
4341
4370
|
var _this;
|
|
4342
4371
|
_this = RendererComponent.call(this, engine) || this;
|
|
4343
4372
|
/**
|
|
4373
|
+
* morph 动画权重
|
|
4374
|
+
*/ _this.morphWeights = [];
|
|
4375
|
+
/**
|
|
4344
4376
|
* 获取点击测试参数,根据元素包围盒进行相交测试,Mesh 对象会进行更加精确的点击测试
|
|
4345
4377
|
* @param force - 是否强制进行点击测试
|
|
4346
4378
|
* @returns 点击测试参数
|
|
@@ -4657,9 +4689,9 @@ var ModelCameraComponent = /*#__PURE__*/ function(ItemBehaviour) {
|
|
|
4657
4689
|
*/ _proto.start = function start() {
|
|
4658
4690
|
this.createContent();
|
|
4659
4691
|
this.item.type = VFX_ITEM_TYPE_3D;
|
|
4660
|
-
this.timeline = this.item.getComponent(TimelineComponent);
|
|
4661
4692
|
var scene = getSceneManager(this);
|
|
4662
4693
|
scene == null ? void 0 : scene.addItem(this.content);
|
|
4694
|
+
this.updateMainCamera();
|
|
4663
4695
|
};
|
|
4664
4696
|
/**
|
|
4665
4697
|
* 组件更新,更新内部对象状态
|
|
@@ -4708,19 +4740,11 @@ var ModelCameraComponent = /*#__PURE__*/ function(ItemBehaviour) {
|
|
|
4708
4740
|
* @param position - 位置
|
|
4709
4741
|
* @param rotation - 旋转
|
|
4710
4742
|
*/ _proto.setTransform = function setTransform(position, rotation) {
|
|
4711
|
-
|
|
4712
|
-
var clip = (_this_timeline = this.timeline) == null ? void 0 : (_this_timeline_findTrack = _this_timeline.findTrack("AnimationTrack")) == null ? void 0 : _this_timeline_findTrack.findClip("AnimationTimelineClip");
|
|
4713
|
-
if (position !== undefined) {
|
|
4743
|
+
if (position) {
|
|
4714
4744
|
this.transform.setPosition(position.x, position.y, position.z);
|
|
4715
|
-
if (clip) {
|
|
4716
|
-
clip.playable.originalTransform.position = position.clone();
|
|
4717
|
-
}
|
|
4718
4745
|
}
|
|
4719
|
-
if (rotation
|
|
4746
|
+
if (rotation) {
|
|
4720
4747
|
this.transform.setRotation(rotation.x, rotation.y, rotation.z);
|
|
4721
|
-
if (clip) {
|
|
4722
|
-
clip.playable.originalTransform.rotation = rotation.clone();
|
|
4723
|
-
}
|
|
4724
4748
|
}
|
|
4725
4749
|
this.updateMainCamera();
|
|
4726
4750
|
};
|
|
@@ -4729,6 +4753,155 @@ var ModelCameraComponent = /*#__PURE__*/ function(ItemBehaviour) {
|
|
|
4729
4753
|
ModelCameraComponent = __decorate([
|
|
4730
4754
|
effectsClass(spec.DataType.CameraComponent)
|
|
4731
4755
|
], ModelCameraComponent);
|
|
4756
|
+
var AnimationComponent = /*#__PURE__*/ function(ItemBehaviour) {
|
|
4757
|
+
_inherits(AnimationComponent, ItemBehaviour);
|
|
4758
|
+
function AnimationComponent(engine) {
|
|
4759
|
+
var _this;
|
|
4760
|
+
_this = ItemBehaviour.call(this, engine) || this;
|
|
4761
|
+
_this.elapsedTime = 0;
|
|
4762
|
+
_this.animation = -1;
|
|
4763
|
+
_this.clips = [];
|
|
4764
|
+
return _this;
|
|
4765
|
+
}
|
|
4766
|
+
var _proto = AnimationComponent.prototype;
|
|
4767
|
+
/**
|
|
4768
|
+
* 组件开始,需要创建内部对象和添加到场景管理器中
|
|
4769
|
+
*/ _proto.start = function start() {
|
|
4770
|
+
this.elapsedTime = 0;
|
|
4771
|
+
this.item.type = VFX_ITEM_TYPE_3D;
|
|
4772
|
+
};
|
|
4773
|
+
/**
|
|
4774
|
+
* 组件更新,更新内部对象状态
|
|
4775
|
+
* @param dt - 更新间隔
|
|
4776
|
+
*/ _proto.update = function update(dt) {
|
|
4777
|
+
this.elapsedTime += dt * 0.001;
|
|
4778
|
+
if (this.animation >= 0 && this.animation < this.clips.length) {
|
|
4779
|
+
this.clips[this.animation].sampleAnimation(this.item, this.elapsedTime);
|
|
4780
|
+
}
|
|
4781
|
+
};
|
|
4782
|
+
/**
|
|
4783
|
+
* 组件销毁
|
|
4784
|
+
*/ _proto.onDestroy = function onDestroy() {};
|
|
4785
|
+
/**
|
|
4786
|
+
* 反序列化,记录传入参数
|
|
4787
|
+
* @param data - 组件参数
|
|
4788
|
+
*/ _proto.fromData = function fromData(data) {
|
|
4789
|
+
var _this = this;
|
|
4790
|
+
ItemBehaviour.prototype.fromData.call(this, data);
|
|
4791
|
+
this.data = data;
|
|
4792
|
+
var _data_name;
|
|
4793
|
+
//
|
|
4794
|
+
this.name = (_data_name = data.name) != null ? _data_name : "<empty>";
|
|
4795
|
+
var _data_animation;
|
|
4796
|
+
this.animation = (_data_animation = data.animation) != null ? _data_animation : -1;
|
|
4797
|
+
this.clips = [];
|
|
4798
|
+
data.animationClips.forEach(function(clipData) {
|
|
4799
|
+
var clipObj = new ModelAnimationClip(_this.engine);
|
|
4800
|
+
clipObj.setFromAnimationClip(clipData);
|
|
4801
|
+
_this.clips.push(clipObj);
|
|
4802
|
+
});
|
|
4803
|
+
};
|
|
4804
|
+
return AnimationComponent;
|
|
4805
|
+
}(ItemBehaviour);
|
|
4806
|
+
AnimationComponent = __decorate([
|
|
4807
|
+
effectsClass(spec.DataType.AnimationComponent)
|
|
4808
|
+
], AnimationComponent);
|
|
4809
|
+
var ModelAnimationClip = /*#__PURE__*/ function(AnimationClip) {
|
|
4810
|
+
_inherits(ModelAnimationClip, AnimationClip);
|
|
4811
|
+
function ModelAnimationClip() {
|
|
4812
|
+
var _this;
|
|
4813
|
+
_this = AnimationClip.apply(this, arguments) || this;
|
|
4814
|
+
_this.path2Node = {};
|
|
4815
|
+
return _this;
|
|
4816
|
+
}
|
|
4817
|
+
var _proto = ModelAnimationClip.prototype;
|
|
4818
|
+
_proto.sampleAnimation = function sampleAnimation(vfxItem, time) {
|
|
4819
|
+
var duration = vfxItem.duration;
|
|
4820
|
+
var life = Math.max(0, time) % duration;
|
|
4821
|
+
for(var _iterator = _create_for_of_iterator_helper_loose(this.positionCurves), _step; !(_step = _iterator()).done;){
|
|
4822
|
+
var curve = _step.value;
|
|
4823
|
+
var maxTime = curve.keyFrames.getMaxTime();
|
|
4824
|
+
var value = curve.keyFrames.getValue(life % maxTime);
|
|
4825
|
+
var target = this.getTargetItem(vfxItem, curve.path);
|
|
4826
|
+
target == null ? void 0 : target.transform.setPosition(value.x, value.y, value.z);
|
|
4827
|
+
}
|
|
4828
|
+
for(var _iterator1 = _create_for_of_iterator_helper_loose(this.rotationCurves), _step1; !(_step1 = _iterator1()).done;){
|
|
4829
|
+
var curve1 = _step1.value;
|
|
4830
|
+
var maxTime1 = curve1.keyFrames.getMaxTime();
|
|
4831
|
+
var value1 = curve1.keyFrames.getValue(life % maxTime1);
|
|
4832
|
+
var target1 = this.getTargetItem(vfxItem, curve1.path);
|
|
4833
|
+
target1 == null ? void 0 : target1.transform.setQuaternion(value1.x, value1.y, value1.z, value1.w);
|
|
4834
|
+
}
|
|
4835
|
+
for(var _iterator2 = _create_for_of_iterator_helper_loose(this.scaleCurves), _step2; !(_step2 = _iterator2()).done;){
|
|
4836
|
+
var curve2 = _step2.value;
|
|
4837
|
+
var maxTime2 = curve2.keyFrames.getMaxTime();
|
|
4838
|
+
var value2 = curve2.keyFrames.getValue(life % maxTime2);
|
|
4839
|
+
var target2 = this.getTargetItem(vfxItem, curve2.path);
|
|
4840
|
+
target2 == null ? void 0 : target2.transform.setScale(value2.x, value2.y, value2.z);
|
|
4841
|
+
}
|
|
4842
|
+
for(var _iterator3 = _create_for_of_iterator_helper_loose(this.floatCurves), _step3; !(_step3 = _iterator3()).done;){
|
|
4843
|
+
var curve3 = _step3.value;
|
|
4844
|
+
var maxTime3 = curve3.keyFrames.getMaxTime();
|
|
4845
|
+
var value3 = curve3.keyFrames.getValue(life % maxTime3);
|
|
4846
|
+
var target3 = this.getTargetItem(vfxItem, curve3.path);
|
|
4847
|
+
if (curve3.className === "ModelMeshComponent") {
|
|
4848
|
+
var component = target3 == null ? void 0 : target3.getComponent(ModelMeshComponent);
|
|
4849
|
+
if (component) {
|
|
4850
|
+
var properties = curve3.property.split(".");
|
|
4851
|
+
setProperty(component, properties, value3);
|
|
4852
|
+
} else {
|
|
4853
|
+
console.error("Can't find mesh component");
|
|
4854
|
+
}
|
|
4855
|
+
} else {
|
|
4856
|
+
console.warn("Ignore curve: className " + curve3.className);
|
|
4857
|
+
}
|
|
4858
|
+
}
|
|
4859
|
+
};
|
|
4860
|
+
_proto.setFromAnimationClip = function setFromAnimationClip(clip) {
|
|
4861
|
+
this.positionCurves = clip.positionCurves.slice();
|
|
4862
|
+
this.rotationCurves = clip.rotationCurves.slice();
|
|
4863
|
+
this.scaleCurves = clip.scaleCurves.slice();
|
|
4864
|
+
this.floatCurves = clip.floatCurves.slice();
|
|
4865
|
+
};
|
|
4866
|
+
_proto.getTargetItem = function getTargetItem(rootItem, path) {
|
|
4867
|
+
if (this.path2Node[path]) {
|
|
4868
|
+
return this.path2Node[path];
|
|
4869
|
+
}
|
|
4870
|
+
var target = rootItem;
|
|
4871
|
+
var nameList = path.split("/");
|
|
4872
|
+
for(var _iterator = _create_for_of_iterator_helper_loose(nameList), _step; !(_step = _iterator()).done;){
|
|
4873
|
+
var name = _step.value;
|
|
4874
|
+
var findTag = false;
|
|
4875
|
+
for(var _iterator1 = _create_for_of_iterator_helper_loose(target.children), _step1; !(_step1 = _iterator1()).done;){
|
|
4876
|
+
var child = _step1.value;
|
|
4877
|
+
if (child.name === name) {
|
|
4878
|
+
target = child;
|
|
4879
|
+
findTag = true;
|
|
4880
|
+
break;
|
|
4881
|
+
}
|
|
4882
|
+
}
|
|
4883
|
+
if (!findTag) {
|
|
4884
|
+
throw new Error("Can't find path in tree " + rootItem.id + ", " + path);
|
|
4885
|
+
}
|
|
4886
|
+
}
|
|
4887
|
+
this.path2Node[path] = target;
|
|
4888
|
+
return target;
|
|
4889
|
+
};
|
|
4890
|
+
return ModelAnimationClip;
|
|
4891
|
+
}(AnimationClip);
|
|
4892
|
+
function setProperty(obj, properties, value) {
|
|
4893
|
+
var len = properties.length;
|
|
4894
|
+
var current = obj;
|
|
4895
|
+
for(var i = 0; i < len - 1; i++){
|
|
4896
|
+
var propName = properties[i];
|
|
4897
|
+
if (!(propName in current) || typeof current[propName] !== "object") {
|
|
4898
|
+
console.error("Invalid properties " + properties);
|
|
4899
|
+
return;
|
|
4900
|
+
}
|
|
4901
|
+
current = current[propName];
|
|
4902
|
+
}
|
|
4903
|
+
current[properties[len - 1]] = value;
|
|
4904
|
+
}
|
|
4732
4905
|
|
|
4733
4906
|
// 射线与带旋转的包围盒求交
|
|
4734
4907
|
// function transformDirection (m: Matrix4, direction: Vector3) {
|
|
@@ -6077,20 +6250,20 @@ var normal = new Vector3();
|
|
|
6077
6250
|
case "NORMAL":
|
|
6078
6251
|
return "aNormal";
|
|
6079
6252
|
case "TANGENT":
|
|
6080
|
-
return "
|
|
6253
|
+
return "aTangent";
|
|
6081
6254
|
case "TEXCOORD_0":
|
|
6082
6255
|
return "aUV";
|
|
6083
6256
|
case "TEXCOORD_1":
|
|
6084
6257
|
return "aUV2";
|
|
6085
6258
|
case "JOINTS_0":
|
|
6086
|
-
return "
|
|
6259
|
+
return "aJoints";
|
|
6087
6260
|
case "WEIGHTS_0":
|
|
6088
|
-
return "
|
|
6261
|
+
return "aWeights";
|
|
6089
6262
|
}
|
|
6090
|
-
if (!name.startsWith("
|
|
6091
|
-
// aPos, aNormal,
|
|
6092
|
-
// aUV, aUV2,
|
|
6093
|
-
//
|
|
6263
|
+
if (!name.startsWith("a")) {
|
|
6264
|
+
// aPos, aNormal, aTangent,
|
|
6265
|
+
// aUV, aUV2, aJoints, aWeights
|
|
6266
|
+
// aTargetXXX
|
|
6094
6267
|
console.warn("Unknown attribute name: " + name);
|
|
6095
6268
|
}
|
|
6096
6269
|
return name;
|
|
@@ -6159,7 +6332,9 @@ var normal = new Vector3();
|
|
|
6159
6332
|
canvas: canvas,
|
|
6160
6333
|
renderFramework: "webgl2",
|
|
6161
6334
|
env: PLAYER_OPTIONS_ENV_EDITOR,
|
|
6162
|
-
|
|
6335
|
+
renderOptions: {
|
|
6336
|
+
willCaptureImage: true
|
|
6337
|
+
},
|
|
6163
6338
|
manualRender: manualRender
|
|
6164
6339
|
});
|
|
6165
6340
|
};
|
|
@@ -6485,11 +6660,11 @@ var AttributeArray = /*#__PURE__*/ function() {
|
|
|
6485
6660
|
this.position = new AttributeArray();
|
|
6486
6661
|
this.position.create(positionAttrib, positionArray);
|
|
6487
6662
|
//
|
|
6488
|
-
var jointAttrib = attributes["
|
|
6489
|
-
var weightAttrib = attributes["
|
|
6663
|
+
var jointAttrib = attributes["aJoints"];
|
|
6664
|
+
var weightAttrib = attributes["aWeights"];
|
|
6490
6665
|
if (jointAttrib !== undefined && weightAttrib !== undefined) {
|
|
6491
|
-
var jointArray = geometry.getAttributeData("
|
|
6492
|
-
var weightArray = geometry.getAttributeData("
|
|
6666
|
+
var jointArray = geometry.getAttributeData("aJoints");
|
|
6667
|
+
var weightArray = geometry.getAttributeData("aWeights");
|
|
6493
6668
|
this.joint = new AttributeArray();
|
|
6494
6669
|
this.joint.create(jointAttrib, jointArray);
|
|
6495
6670
|
this.weight = new AttributeArray();
|
|
@@ -6599,11 +6774,11 @@ var AttributeArray = /*#__PURE__*/ function() {
|
|
|
6599
6774
|
this.position = new AttributeArray();
|
|
6600
6775
|
this.position.create(positionAttrib, positionArray);
|
|
6601
6776
|
//
|
|
6602
|
-
var jointAttrib = attributes["
|
|
6603
|
-
var weightAttrib = attributes["
|
|
6777
|
+
var jointAttrib = attributes["aJoints"];
|
|
6778
|
+
var weightAttrib = attributes["aWeights"];
|
|
6604
6779
|
if (jointAttrib !== undefined && weightAttrib !== undefined) {
|
|
6605
|
-
var jointArray = geometry.getAttributeData("
|
|
6606
|
-
var weightArray = geometry.getAttributeData("
|
|
6780
|
+
var jointArray = geometry.getAttributeData("aJoints");
|
|
6781
|
+
var weightArray = geometry.getAttributeData("aWeights");
|
|
6607
6782
|
this.joint = new AttributeArray();
|
|
6608
6783
|
this.joint.create(jointAttrib, jointArray);
|
|
6609
6784
|
this.weight = new AttributeArray();
|
|
@@ -7025,15 +7200,15 @@ var AttributeArray = /*#__PURE__*/ function() {
|
|
|
7025
7200
|
// }
|
|
7026
7201
|
// this.assertGeometryBuffer(v, 'aPos', maxLength);
|
|
7027
7202
|
// this.assertGeometryBuffer(v, 'aNormal', maxLength);
|
|
7028
|
-
// this.assertGeometryBuffer(v, '
|
|
7203
|
+
// this.assertGeometryBuffer(v, 'aTangent', maxLength);
|
|
7029
7204
|
// this.assertGeometryBuffer(v, 'aUV', maxLength);
|
|
7030
|
-
// this.assertGeometryBuffer(v, '
|
|
7031
|
-
// this.assertGeometryBuffer(v, '
|
|
7205
|
+
// this.assertGeometryBuffer(v, 'aJoints', maxLength);
|
|
7206
|
+
// this.assertGeometryBuffer(v, 'aWeights', maxLength);
|
|
7032
7207
|
// // 索引检查
|
|
7033
7208
|
// if(s !== undefined){
|
|
7034
7209
|
// const matLen = s.inverseBindMatrices?.length ?? 0;
|
|
7035
7210
|
// if(matLen > 0){
|
|
7036
|
-
// const jointArray = this.createAttributeArray(v, "
|
|
7211
|
+
// const jointArray = this.createAttributeArray(v, "aJoints");
|
|
7037
7212
|
// if(jointArray !== undefined){
|
|
7038
7213
|
// for(let i = 0; i < maxLength; i++){
|
|
7039
7214
|
// const data = jointArray.getData(i);
|
|
@@ -11348,7 +11523,7 @@ var GeometryProxy = /*#__PURE__*/ function() {
|
|
|
11348
11523
|
if (this.hasTangent) {
|
|
11349
11524
|
var attrib2 = this.tangentAttrib;
|
|
11350
11525
|
if (attrib2 !== undefined) {
|
|
11351
|
-
attributes["
|
|
11526
|
+
attributes["aTangent"] = this._getBufferAttrib(attrib2);
|
|
11352
11527
|
}
|
|
11353
11528
|
}
|
|
11354
11529
|
this.texCoordList.forEach(function(val) {
|
|
@@ -11359,11 +11534,11 @@ var GeometryProxy = /*#__PURE__*/ function() {
|
|
|
11359
11534
|
if (this.hasSkinAnimation) {
|
|
11360
11535
|
var jointAttrib = this.jointAttribute;
|
|
11361
11536
|
if (jointAttrib !== undefined) {
|
|
11362
|
-
attributes["
|
|
11537
|
+
attributes["aJoints"] = this._getBufferAttrib(jointAttrib);
|
|
11363
11538
|
}
|
|
11364
11539
|
var weightAttrib = this.weightAttribute;
|
|
11365
11540
|
if (weightAttrib !== undefined) {
|
|
11366
|
-
attributes["
|
|
11541
|
+
attributes["aWeights"] = this._getBufferAttrib(weightAttrib);
|
|
11367
11542
|
}
|
|
11368
11543
|
}
|
|
11369
11544
|
/**
|
|
@@ -11371,15 +11546,15 @@ var GeometryProxy = /*#__PURE__*/ function() {
|
|
|
11371
11546
|
*/ for(var i = 0; i < 8; i++){
|
|
11372
11547
|
var positionAttrib = this.getTargetPosition(i);
|
|
11373
11548
|
if (positionAttrib !== undefined) {
|
|
11374
|
-
attributes["
|
|
11549
|
+
attributes["aTargetPosition" + i] = this._getBufferAttrib(positionAttrib);
|
|
11375
11550
|
}
|
|
11376
11551
|
var normalAttrib = this.getTargetNormal(i);
|
|
11377
11552
|
if (normalAttrib !== undefined) {
|
|
11378
|
-
attributes["
|
|
11553
|
+
attributes["aTargetNormal" + i] = this._getBufferAttrib(normalAttrib);
|
|
11379
11554
|
}
|
|
11380
11555
|
var tangentAttrib = this.getTargetTangent(i);
|
|
11381
11556
|
if (tangentAttrib !== undefined) {
|
|
11382
|
-
attributes["
|
|
11557
|
+
attributes["aTargetTangent" + i] = this._getBufferAttrib(tangentAttrib);
|
|
11383
11558
|
}
|
|
11384
11559
|
}
|
|
11385
11560
|
var indexArray = this.indexArray;
|
|
@@ -11829,44 +12004,9 @@ var GLTFHelper = /*#__PURE__*/ function() {
|
|
|
11829
12004
|
return GLTFHelper;
|
|
11830
12005
|
}();
|
|
11831
12006
|
|
|
11832
|
-
function _array_like_to_array(arr, len) {
|
|
11833
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
11834
|
-
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
11835
|
-
return arr2;
|
|
11836
|
-
}
|
|
11837
|
-
|
|
11838
|
-
function _unsupported_iterable_to_array(o, minLen) {
|
|
11839
|
-
if (!o) return;
|
|
11840
|
-
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
11841
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
11842
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
11843
|
-
if (n === "Map" || n === "Set") return Array.from(n);
|
|
11844
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
11845
|
-
}
|
|
11846
|
-
|
|
11847
|
-
function _create_for_of_iterator_helper_loose(o, allowArrayLike) {
|
|
11848
|
-
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
|
|
11849
|
-
if (it) return (it = it.call(o)).next.bind(it);
|
|
11850
|
-
// Fallback for engines without symbol support
|
|
11851
|
-
if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === "number") {
|
|
11852
|
-
if (it) o = it;
|
|
11853
|
-
var i = 0;
|
|
11854
|
-
return function() {
|
|
11855
|
-
if (i >= o.length) return {
|
|
11856
|
-
done: true
|
|
11857
|
-
};
|
|
11858
|
-
return {
|
|
11859
|
-
done: false,
|
|
11860
|
-
value: o[i++]
|
|
11861
|
-
};
|
|
11862
|
-
};
|
|
11863
|
-
}
|
|
11864
|
-
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
11865
|
-
}
|
|
11866
|
-
|
|
11867
12007
|
var JSONConverter = /*#__PURE__*/ function() {
|
|
11868
12008
|
function JSONConverter(player) {
|
|
11869
|
-
this.
|
|
12009
|
+
this.treeInfo = new TreeInfo();
|
|
11870
12010
|
this.engine = player.renderer.engine;
|
|
11871
12011
|
this.renderer = player.renderer;
|
|
11872
12012
|
this.downloader = new Downloader();
|
|
@@ -11897,6 +12037,12 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
11897
12037
|
sceneJSON = _state.sent();
|
|
11898
12038
|
_state.label = 3;
|
|
11899
12039
|
case 3:
|
|
12040
|
+
// @ts-expect-error
|
|
12041
|
+
sceneJSON.textures.forEach(function(tex) {
|
|
12042
|
+
if (tex.source === undefined) {
|
|
12043
|
+
tex.source = 0;
|
|
12044
|
+
}
|
|
12045
|
+
});
|
|
11900
12046
|
oldScene = getStandardJSON(sceneJSON);
|
|
11901
12047
|
binFiles = [];
|
|
11902
12048
|
if (!oldScene.bins) return [
|
|
@@ -11929,7 +12075,7 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
11929
12075
|
case 7:
|
|
11930
12076
|
// @ts-expect-error
|
|
11931
12077
|
oldScene.bins = binFiles;
|
|
11932
|
-
newScene = {
|
|
12078
|
+
newScene = _extends({}, oldScene, {
|
|
11933
12079
|
version: "3.0",
|
|
11934
12080
|
playerVersion: {
|
|
11935
12081
|
web: "3.0",
|
|
@@ -11937,18 +12083,14 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
11937
12083
|
},
|
|
11938
12084
|
type: "ge",
|
|
11939
12085
|
compositions: [],
|
|
11940
|
-
compositionId: oldScene.compositionId,
|
|
11941
12086
|
images: [],
|
|
11942
|
-
shapes: oldScene.shapes,
|
|
11943
|
-
plugins: oldScene.plugins,
|
|
11944
12087
|
textures: [],
|
|
11945
12088
|
items: [],
|
|
11946
12089
|
components: [],
|
|
11947
12090
|
materials: [],
|
|
11948
12091
|
shaders: [],
|
|
11949
12092
|
geometries: []
|
|
11950
|
-
};
|
|
11951
|
-
_this.treeNodes = [];
|
|
12093
|
+
});
|
|
11952
12094
|
_this.setImage(newScene, oldScene);
|
|
11953
12095
|
return [
|
|
11954
12096
|
4,
|
|
@@ -11970,7 +12112,6 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
11970
12112
|
_proto.setImage = function setImage(newScene, oldScene) {
|
|
11971
12113
|
var newImages = [];
|
|
11972
12114
|
oldScene.images.forEach(function(image) {
|
|
11973
|
-
image.id = generateGUID();
|
|
11974
12115
|
newImages.push(image);
|
|
11975
12116
|
});
|
|
11976
12117
|
newScene.images = newImages;
|
|
@@ -12080,8 +12221,6 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12080
12221
|
var comp = _step.value;
|
|
12081
12222
|
if (comp.dataType === spec.DataType.SkyboxComponent) {
|
|
12082
12223
|
newComponents.push(this.createSkyboxComponent(comp, newScene));
|
|
12083
|
-
} else if (comp.dataType === spec.DataType.MeshComponent) {
|
|
12084
|
-
newComponents.push(this.createMeshComponent(comp, newScene, oldScene));
|
|
12085
12224
|
} else if (comp.dataType === spec.DataType.LightComponent) {
|
|
12086
12225
|
newComponents.push(this.createLightComponent(comp, newScene));
|
|
12087
12226
|
} else if (comp.dataType === spec.DataType.CameraComponent) {
|
|
@@ -12093,18 +12232,31 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12093
12232
|
treeComp.options.tree.animation = undefined;
|
|
12094
12233
|
treeComp.options.tree.animations = undefined;
|
|
12095
12234
|
newComponents.push(comp);
|
|
12096
|
-
} else {
|
|
12235
|
+
} else if (comp.dataType !== spec.DataType.MeshComponent) {
|
|
12097
12236
|
newComponents.push(comp);
|
|
12098
12237
|
}
|
|
12099
12238
|
}
|
|
12239
|
+
for(var _iterator1 = _create_for_of_iterator_helper_loose(oldScene.components), _step1; !(_step1 = _iterator1()).done;){
|
|
12240
|
+
var comp1 = _step1.value;
|
|
12241
|
+
if (comp1.dataType === spec.DataType.MeshComponent) {
|
|
12242
|
+
newComponents.push(this.createMeshComponent(comp1, newScene, oldScene));
|
|
12243
|
+
}
|
|
12244
|
+
}
|
|
12100
12245
|
};
|
|
12101
12246
|
_proto.setItem = function setItem(newScene, oldScene) {};
|
|
12102
12247
|
_proto.setComposition = function setComposition(newScene, oldScene) {
|
|
12103
12248
|
var _newScene_items;
|
|
12104
12249
|
newScene.items = oldScene.items;
|
|
12105
|
-
(_newScene_items = newScene.items).push.apply(_newScene_items, [].concat(this.
|
|
12250
|
+
(_newScene_items = newScene.items).push.apply(_newScene_items, [].concat(this.treeInfo.getAllTreeNodeList()));
|
|
12106
12251
|
newScene.compositionId = oldScene.compositionId;
|
|
12107
12252
|
newScene.compositions = oldScene.compositions;
|
|
12253
|
+
newScene.items.forEach(function(item) {
|
|
12254
|
+
// @ts-expect-error
|
|
12255
|
+
if (item.type === "root") {
|
|
12256
|
+
// @ts-expect-error
|
|
12257
|
+
item.type = "ECS";
|
|
12258
|
+
}
|
|
12259
|
+
});
|
|
12108
12260
|
// @ts-expect-error
|
|
12109
12261
|
newScene.compositions[0].items = newScene.items.map(function(item) {
|
|
12110
12262
|
return {
|
|
@@ -12197,28 +12349,71 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12197
12349
|
};
|
|
12198
12350
|
_proto.createMeshComponent = function createMeshComponent(component, newScene, oldScene) {
|
|
12199
12351
|
var _this = this;
|
|
12352
|
+
var _newScene_materials;
|
|
12200
12353
|
var meshOptions = component.options;
|
|
12201
|
-
var
|
|
12354
|
+
var geometryPropsList = [];
|
|
12355
|
+
var materialDatas = [];
|
|
12202
12356
|
meshOptions.primitives.forEach(function(prim) {
|
|
12203
|
-
var
|
|
12204
|
-
var
|
|
12205
|
-
|
|
12206
|
-
|
|
12207
|
-
|
|
12208
|
-
|
|
12209
|
-
|
|
12210
|
-
|
|
12211
|
-
material: {
|
|
12212
|
-
id: materialData.id
|
|
12357
|
+
var _geomProps_indices;
|
|
12358
|
+
var geomProps = deserializeGeometry(prim.geometry, oldScene.bins);
|
|
12359
|
+
var material = _this.getMaterialData(prim.material, oldScene);
|
|
12360
|
+
if (_instanceof1((_geomProps_indices = geomProps.indices) == null ? void 0 : _geomProps_indices.data, Uint8Array)) {
|
|
12361
|
+
var oldIndices = geomProps.indices.data;
|
|
12362
|
+
var newIndices = new Uint16Array(oldIndices.length);
|
|
12363
|
+
for(var i = 0; i < oldIndices.length; i++){
|
|
12364
|
+
newIndices[i] = oldIndices[i];
|
|
12213
12365
|
}
|
|
12214
|
-
|
|
12366
|
+
geomProps.indices.data = newIndices;
|
|
12367
|
+
}
|
|
12368
|
+
geometryPropsList.push(geomProps);
|
|
12369
|
+
materialDatas.push(material);
|
|
12215
12370
|
});
|
|
12371
|
+
var geometryData = getGeometryDataFromPropsList(geometryPropsList);
|
|
12372
|
+
if (!geometryData) {
|
|
12373
|
+
throw new Error("no primitives");
|
|
12374
|
+
}
|
|
12375
|
+
newScene.geometries.push(geometryData);
|
|
12376
|
+
(_newScene_materials = newScene.materials).push.apply(_newScene_materials, [].concat(materialDatas));
|
|
12216
12377
|
var meshComponent = {
|
|
12217
12378
|
id: component.id,
|
|
12218
12379
|
dataType: component.dataType,
|
|
12219
12380
|
item: component.item,
|
|
12220
|
-
|
|
12381
|
+
geometry: {
|
|
12382
|
+
id: geometryData.id
|
|
12383
|
+
},
|
|
12384
|
+
materials: materialDatas.map(function(mat) {
|
|
12385
|
+
var data = {
|
|
12386
|
+
id: mat.id
|
|
12387
|
+
};
|
|
12388
|
+
return data;
|
|
12389
|
+
})
|
|
12221
12390
|
};
|
|
12391
|
+
if (meshOptions.skin) {
|
|
12392
|
+
var parentItemId = component.item.id;
|
|
12393
|
+
for(var _iterator = _create_for_of_iterator_helper_loose(oldScene.items), _step; !(_step = _iterator()).done;){
|
|
12394
|
+
var item = _step.value;
|
|
12395
|
+
if (item.id === component.item.id) {
|
|
12396
|
+
parentItemId = item.parentId;
|
|
12397
|
+
}
|
|
12398
|
+
}
|
|
12399
|
+
if (parentItemId === component.item.id) {
|
|
12400
|
+
throw new Error("Can't item " + component.item);
|
|
12401
|
+
}
|
|
12402
|
+
var treeItem = this.treeInfo.getTreeItemByNodeId(parentItemId);
|
|
12403
|
+
var treeNodeList = this.treeInfo.getTreeNodeListByNodeId(parentItemId);
|
|
12404
|
+
if (!treeItem || !treeNodeList) {
|
|
12405
|
+
throw new Error("Can't find tree node list for " + component.item);
|
|
12406
|
+
}
|
|
12407
|
+
var rootBoneItem = this.setupBoneData(geometryData, meshOptions.skin, oldScene, treeItem, treeNodeList);
|
|
12408
|
+
meshComponent.rootBone = {
|
|
12409
|
+
id: rootBoneItem.id
|
|
12410
|
+
};
|
|
12411
|
+
}
|
|
12412
|
+
if (meshOptions.weights !== undefined) {
|
|
12413
|
+
meshComponent.morph = {
|
|
12414
|
+
weights: meshOptions.weights
|
|
12415
|
+
};
|
|
12416
|
+
}
|
|
12222
12417
|
return meshComponent;
|
|
12223
12418
|
};
|
|
12224
12419
|
_proto.createItemsFromTreeComponent = function createItemsFromTreeComponent(component, newScene, oldScene) {
|
|
@@ -12231,13 +12426,13 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12231
12426
|
});
|
|
12232
12427
|
var treeComp = component;
|
|
12233
12428
|
var treeData = treeComp.options.tree;
|
|
12234
|
-
var
|
|
12235
|
-
treeData.nodes.forEach(function(node) {
|
|
12429
|
+
var treeNodeList = [];
|
|
12430
|
+
treeData.nodes.forEach(function(node, index) {
|
|
12236
12431
|
var _node_name;
|
|
12237
12432
|
var item = {
|
|
12238
12433
|
id: generateGUID(),
|
|
12239
12434
|
parentId: treeItem.id,
|
|
12240
|
-
name: (_node_name = node.name) != null ? _node_name : "
|
|
12435
|
+
name: (_node_name = node.name) != null ? _node_name : "node" + index,
|
|
12241
12436
|
duration: treeItem.duration,
|
|
12242
12437
|
// @ts-expect-error
|
|
12243
12438
|
type: "ECS",
|
|
@@ -12252,14 +12447,14 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12252
12447
|
transform: _this.getTransformData(node.transform),
|
|
12253
12448
|
components: []
|
|
12254
12449
|
};
|
|
12255
|
-
|
|
12450
|
+
treeNodeList.push(item);
|
|
12256
12451
|
newScene.items.push(item);
|
|
12257
12452
|
});
|
|
12258
12453
|
treeData.nodes.forEach(function(node, index) {
|
|
12259
12454
|
var _node_children;
|
|
12260
|
-
var item =
|
|
12455
|
+
var item = treeNodeList[index];
|
|
12261
12456
|
(_node_children = node.children) == null ? void 0 : _node_children.forEach(function(child) {
|
|
12262
|
-
var childItem =
|
|
12457
|
+
var childItem = treeNodeList[child];
|
|
12263
12458
|
childItem.parentId = item.id;
|
|
12264
12459
|
});
|
|
12265
12460
|
});
|
|
@@ -12270,14 +12465,13 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12270
12465
|
var parentId = item.parentId.substring(0, index);
|
|
12271
12466
|
var subIndex = +item.parentId.substring(index + 1);
|
|
12272
12467
|
if (parentId === treeItem.id) {
|
|
12273
|
-
item.parentId =
|
|
12274
|
-
} else {
|
|
12275
|
-
console.error("Invalid parent id " + item.parentId);
|
|
12468
|
+
item.parentId = treeNodeList[subIndex].id;
|
|
12276
12469
|
}
|
|
12277
12470
|
}
|
|
12278
12471
|
}
|
|
12279
12472
|
});
|
|
12280
|
-
this.
|
|
12473
|
+
this.treeInfo.add(treeItem, treeNodeList);
|
|
12474
|
+
this.createAnimationComponent(treeData, treeItem, newScene, oldScene);
|
|
12281
12475
|
};
|
|
12282
12476
|
_proto.createLightComponent = function createLightComponent(component, scene) {
|
|
12283
12477
|
var lightOptions = component.options;
|
|
@@ -12303,9 +12497,185 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12303
12497
|
}
|
|
12304
12498
|
return lightComponent;
|
|
12305
12499
|
};
|
|
12306
|
-
_proto.
|
|
12307
|
-
var
|
|
12308
|
-
|
|
12500
|
+
_proto.createAnimationComponent = function createAnimationComponent(treeOptions, treeItem, newScene, oldScene) {
|
|
12501
|
+
var _this = this;
|
|
12502
|
+
var animation = treeOptions.animation, animations = treeOptions.animations;
|
|
12503
|
+
var animationComponent = {
|
|
12504
|
+
id: generateGUID(),
|
|
12505
|
+
dataType: spec.DataType.AnimationComponent,
|
|
12506
|
+
item: {
|
|
12507
|
+
id: treeItem.id
|
|
12508
|
+
},
|
|
12509
|
+
animation: animation,
|
|
12510
|
+
animationClips: []
|
|
12511
|
+
};
|
|
12512
|
+
if (animations && animations.length) {
|
|
12513
|
+
// FIXME: calcuate tree item duration
|
|
12514
|
+
var bins = oldScene.bins;
|
|
12515
|
+
animations.forEach(function(anim) {
|
|
12516
|
+
var clipData = {
|
|
12517
|
+
id: generateGUID(),
|
|
12518
|
+
name: anim.name,
|
|
12519
|
+
dataType: spec.DataType.AnimationClip,
|
|
12520
|
+
positionCurves: [],
|
|
12521
|
+
rotationCurves: [],
|
|
12522
|
+
scaleCurves: [],
|
|
12523
|
+
floatCurves: []
|
|
12524
|
+
};
|
|
12525
|
+
var totalAnimationTime = 0;
|
|
12526
|
+
anim.tracks.forEach(function(track) {
|
|
12527
|
+
var inputArray = typedArrayFromBinary(bins, track.input);
|
|
12528
|
+
totalAnimationTime = Math.max(totalAnimationTime, inputArray[inputArray.length - 1]);
|
|
12529
|
+
});
|
|
12530
|
+
anim.tracks.forEach(function(track) {
|
|
12531
|
+
var inputArray = typedArrayFromBinary(bins, track.input);
|
|
12532
|
+
var outputArray = typedArrayFromBinary(bins, track.output);
|
|
12533
|
+
if (!_instanceof1(inputArray, Float32Array)) {
|
|
12534
|
+
throw new Error("Type of inputArray should be float32, " + inputArray);
|
|
12535
|
+
}
|
|
12536
|
+
if (!_instanceof1(outputArray, Float32Array)) {
|
|
12537
|
+
throw new Error("Type of outputArray should be float32, " + outputArray);
|
|
12538
|
+
}
|
|
12539
|
+
if (track.interpolation !== "LINEAR") {
|
|
12540
|
+
throw new Error("Invalid interpolation type " + track.interpolation);
|
|
12541
|
+
}
|
|
12542
|
+
if (track.path === "rotation") {
|
|
12543
|
+
var points = [];
|
|
12544
|
+
var controlPoints = [];
|
|
12545
|
+
var lineValue = [];
|
|
12546
|
+
for(var i = 0; i < inputArray.length; i++){
|
|
12547
|
+
points.push([
|
|
12548
|
+
outputArray[i * 4],
|
|
12549
|
+
outputArray[i * 4 + 1],
|
|
12550
|
+
outputArray[i * 4 + 2],
|
|
12551
|
+
outputArray[i * 4 + 3]
|
|
12552
|
+
]);
|
|
12553
|
+
if (i > 0) {
|
|
12554
|
+
var p0 = Quaternion.fromArray(points[i - 1]);
|
|
12555
|
+
var p3 = Quaternion.fromArray(points[i]);
|
|
12556
|
+
var p1 = new Quaternion();
|
|
12557
|
+
var p2 = new Quaternion();
|
|
12558
|
+
p1.slerpQuaternions(p0, p3, 1 / 3);
|
|
12559
|
+
p2.slerpQuaternions(p0, p3, 2 / 3);
|
|
12560
|
+
controlPoints.push(p1.toArray());
|
|
12561
|
+
controlPoints.push(p2.toArray());
|
|
12562
|
+
}
|
|
12563
|
+
lineValue.push([
|
|
12564
|
+
spec.BezierKeyframeType.LINE,
|
|
12565
|
+
[
|
|
12566
|
+
inputArray[i],
|
|
12567
|
+
i
|
|
12568
|
+
]
|
|
12569
|
+
]);
|
|
12570
|
+
}
|
|
12571
|
+
var node = _this.treeInfo.getTreeNode(treeItem.id, track.node);
|
|
12572
|
+
var path = _this.treeInfo.getNodePath(node.id);
|
|
12573
|
+
var keyFrames = [
|
|
12574
|
+
spec.ValueType.BEZIER_CURVE_QUAT,
|
|
12575
|
+
[
|
|
12576
|
+
lineValue,
|
|
12577
|
+
points,
|
|
12578
|
+
controlPoints
|
|
12579
|
+
]
|
|
12580
|
+
];
|
|
12581
|
+
clipData.rotationCurves.push({
|
|
12582
|
+
path: path,
|
|
12583
|
+
keyFrames: keyFrames
|
|
12584
|
+
});
|
|
12585
|
+
} else if (track.path === "weights") {
|
|
12586
|
+
var node1 = _this.treeInfo.getTreeNode(treeItem.id, track.node);
|
|
12587
|
+
var path1 = _this.treeInfo.getNodePath(node1.id);
|
|
12588
|
+
if (node1.components.length === 0) {
|
|
12589
|
+
for(var i1 = 0; i1 < oldScene.items.length; i1++){
|
|
12590
|
+
var child = oldScene.items[i1];
|
|
12591
|
+
if (child.parentId === node1.id) {
|
|
12592
|
+
path1 += "/" + child.name;
|
|
12593
|
+
break;
|
|
12594
|
+
}
|
|
12595
|
+
}
|
|
12596
|
+
}
|
|
12597
|
+
var component = outputArray.length / inputArray.length;
|
|
12598
|
+
for(var c = 0; c < component; c++){
|
|
12599
|
+
var lineValue1 = [];
|
|
12600
|
+
for(var i2 = 0; i2 < inputArray.length; i2++){
|
|
12601
|
+
lineValue1.push([
|
|
12602
|
+
spec.BezierKeyframeType.LINE,
|
|
12603
|
+
[
|
|
12604
|
+
inputArray[i2],
|
|
12605
|
+
outputArray[i2 * component + c]
|
|
12606
|
+
]
|
|
12607
|
+
]);
|
|
12608
|
+
}
|
|
12609
|
+
var keyFrames1 = [
|
|
12610
|
+
spec.ValueType.BEZIER_CURVE,
|
|
12611
|
+
lineValue1
|
|
12612
|
+
];
|
|
12613
|
+
clipData.floatCurves.push({
|
|
12614
|
+
path: path1,
|
|
12615
|
+
className: "ModelMeshComponent",
|
|
12616
|
+
property: "morphWeights." + c,
|
|
12617
|
+
keyFrames: keyFrames1
|
|
12618
|
+
});
|
|
12619
|
+
}
|
|
12620
|
+
} else {
|
|
12621
|
+
var points1 = [];
|
|
12622
|
+
var controlPoints1 = [];
|
|
12623
|
+
var lineValue2 = [];
|
|
12624
|
+
for(var i3 = 0; i3 < inputArray.length; i3++){
|
|
12625
|
+
points1.push([
|
|
12626
|
+
outputArray[i3 * 3],
|
|
12627
|
+
outputArray[i3 * 3 + 1],
|
|
12628
|
+
outputArray[i3 * 3 + 2]
|
|
12629
|
+
]);
|
|
12630
|
+
if (i3 > 0) {
|
|
12631
|
+
var p01 = Vector3.fromArray(points1[i3 - 1]);
|
|
12632
|
+
var p31 = Vector3.fromArray(points1[i3]);
|
|
12633
|
+
var p11 = new Vector3().lerpVectors(p01, p31, 1 / 3);
|
|
12634
|
+
var p21 = new Vector3().lerpVectors(p01, p31, 2 / 3);
|
|
12635
|
+
controlPoints1.push(p11.toArray());
|
|
12636
|
+
controlPoints1.push(p21.toArray());
|
|
12637
|
+
}
|
|
12638
|
+
lineValue2.push([
|
|
12639
|
+
spec.BezierKeyframeType.LINE,
|
|
12640
|
+
[
|
|
12641
|
+
inputArray[i3],
|
|
12642
|
+
i3
|
|
12643
|
+
]
|
|
12644
|
+
]);
|
|
12645
|
+
}
|
|
12646
|
+
var node2 = _this.treeInfo.getTreeNode(treeItem.id, track.node);
|
|
12647
|
+
var path2 = _this.treeInfo.getNodePath(node2.id);
|
|
12648
|
+
var keyFrames2 = [
|
|
12649
|
+
spec.ValueType.BEZIER_CURVE_PATH,
|
|
12650
|
+
[
|
|
12651
|
+
lineValue2,
|
|
12652
|
+
points1,
|
|
12653
|
+
controlPoints1
|
|
12654
|
+
]
|
|
12655
|
+
];
|
|
12656
|
+
if (track.path === "translation") {
|
|
12657
|
+
clipData.positionCurves.push({
|
|
12658
|
+
path: path2,
|
|
12659
|
+
keyFrames: keyFrames2
|
|
12660
|
+
});
|
|
12661
|
+
} else {
|
|
12662
|
+
clipData.scaleCurves.push({
|
|
12663
|
+
path: path2,
|
|
12664
|
+
keyFrames: keyFrames2
|
|
12665
|
+
});
|
|
12666
|
+
}
|
|
12667
|
+
}
|
|
12668
|
+
});
|
|
12669
|
+
newScene.animations.push(clipData);
|
|
12670
|
+
animationComponent.animationClips.push({
|
|
12671
|
+
id: clipData.id
|
|
12672
|
+
});
|
|
12673
|
+
});
|
|
12674
|
+
}
|
|
12675
|
+
treeItem.components.push({
|
|
12676
|
+
id: animationComponent.id
|
|
12677
|
+
});
|
|
12678
|
+
newScene.components.push(animationComponent);
|
|
12309
12679
|
};
|
|
12310
12680
|
_proto.getMaterialData = function getMaterialData(material, scene) {
|
|
12311
12681
|
if (material.type === spec.MaterialType.unlit) {
|
|
@@ -12327,7 +12697,7 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12327
12697
|
shader: {
|
|
12328
12698
|
id: UnlitShaderGUID
|
|
12329
12699
|
},
|
|
12330
|
-
stringTags:
|
|
12700
|
+
stringTags: {},
|
|
12331
12701
|
macros: [],
|
|
12332
12702
|
ints: {},
|
|
12333
12703
|
floats: floats,
|
|
@@ -12335,6 +12705,7 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12335
12705
|
colors: colors,
|
|
12336
12706
|
textures: textures
|
|
12337
12707
|
};
|
|
12708
|
+
this.setupMaterial(material, newMaterial);
|
|
12338
12709
|
return newMaterial;
|
|
12339
12710
|
} else {
|
|
12340
12711
|
var floats1 = {
|
|
@@ -12383,7 +12754,7 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12383
12754
|
shader: {
|
|
12384
12755
|
id: PBRShaderGUID
|
|
12385
12756
|
},
|
|
12386
|
-
stringTags:
|
|
12757
|
+
stringTags: {},
|
|
12387
12758
|
macros: [],
|
|
12388
12759
|
ints: {},
|
|
12389
12760
|
floats: floats1,
|
|
@@ -12391,29 +12762,39 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12391
12762
|
colors: colors1,
|
|
12392
12763
|
textures: textures1
|
|
12393
12764
|
};
|
|
12765
|
+
this.setupMaterial(material, newMaterial1);
|
|
12394
12766
|
return newMaterial1;
|
|
12395
12767
|
}
|
|
12396
12768
|
};
|
|
12397
|
-
_proto.
|
|
12398
|
-
|
|
12399
|
-
|
|
12400
|
-
stringTags["ZWrite"] = String((_material_depthMask = material.depthMask) != null ? _material_depthMask : true);
|
|
12401
|
-
stringTags["ZTest"] = String(true);
|
|
12402
|
-
if (material.blending === spec.MaterialBlending.masked) {
|
|
12403
|
-
throw Error("Alpha mask not support");
|
|
12404
|
-
} else if (material.blending === spec.MaterialBlending.translucent) {
|
|
12405
|
-
stringTags["RenderType"] = RenderType.Blend;
|
|
12769
|
+
_proto.setupMaterial = function setupMaterial(oldMat, newMat) {
|
|
12770
|
+
if (oldMat.blending === spec.MaterialBlending.translucent) {
|
|
12771
|
+
newMat.stringTags["RenderType"] = spec.RenderType.Transparent;
|
|
12406
12772
|
} else {
|
|
12407
|
-
stringTags["RenderType"] = RenderType.Opaque;
|
|
12773
|
+
newMat.stringTags["RenderType"] = spec.RenderType.Opaque;
|
|
12408
12774
|
}
|
|
12409
|
-
if (
|
|
12410
|
-
|
|
12411
|
-
|
|
12412
|
-
|
|
12775
|
+
if (oldMat.blending === spec.MaterialBlending.masked) {
|
|
12776
|
+
newMat.floats["AlphaClip"] = 1;
|
|
12777
|
+
var _oldMat_alphaCutOff;
|
|
12778
|
+
newMat.floats["_Cutoff"] = (_oldMat_alphaCutOff = oldMat.alphaCutOff) != null ? _oldMat_alphaCutOff : 0;
|
|
12413
12779
|
} else {
|
|
12414
|
-
|
|
12780
|
+
newMat.floats["AlphaClip"] = 0;
|
|
12781
|
+
}
|
|
12782
|
+
switch(oldMat.side){
|
|
12783
|
+
case spec.SideMode.BACK:
|
|
12784
|
+
newMat.stringTags["RenderFace"] = spec.RenderFace.Back;
|
|
12785
|
+
break;
|
|
12786
|
+
case spec.SideMode.DOUBLE:
|
|
12787
|
+
newMat.stringTags["RenderFace"] = spec.RenderFace.Both;
|
|
12788
|
+
break;
|
|
12789
|
+
default:
|
|
12790
|
+
newMat.stringTags["RenderFace"] = spec.RenderFace.Front;
|
|
12791
|
+
}
|
|
12792
|
+
if (oldMat.type === spec.MaterialType.pbr) {
|
|
12793
|
+
newMat.floats["_SpecularAA"] = oldMat.useSpecularAA ? 1 : 0;
|
|
12415
12794
|
}
|
|
12416
|
-
|
|
12795
|
+
var _oldMat_depthMask;
|
|
12796
|
+
newMat.stringTags["ZWrite"] = String((_oldMat_depthMask = oldMat.depthMask) != null ? _oldMat_depthMask : true);
|
|
12797
|
+
newMat.stringTags["ZTest"] = String(true);
|
|
12417
12798
|
};
|
|
12418
12799
|
_proto.getTextureData = function getTextureData(scene, floats, texIndex, texTransform) {
|
|
12419
12800
|
var _scene_textures_texIndex_id;
|
|
@@ -12488,38 +12869,185 @@ var JSONConverter = /*#__PURE__*/ function() {
|
|
|
12488
12869
|
}
|
|
12489
12870
|
return result;
|
|
12490
12871
|
};
|
|
12872
|
+
_proto.setupBoneData = function setupBoneData(geom, skin, oldScene, treeItem, treeNodeList) {
|
|
12873
|
+
var bins = oldScene.bins;
|
|
12874
|
+
var joints = skin.joints, skeleton = skin.skeleton, inverseBindMatrices = skin.inverseBindMatrices;
|
|
12875
|
+
if (!inverseBindMatrices) {
|
|
12876
|
+
throw new Error("inverseBindMatrices is undefined " + skin);
|
|
12877
|
+
}
|
|
12878
|
+
var bindMatrixArray = typedArrayFromBinary(bins, inverseBindMatrices);
|
|
12879
|
+
geom.inverseBindMatrices = Array.from(bindMatrixArray);
|
|
12880
|
+
var id2Node = {};
|
|
12881
|
+
var rootBoneItem = treeItem;
|
|
12882
|
+
if (skeleton !== undefined) {
|
|
12883
|
+
rootBoneItem = treeNodeList[skeleton];
|
|
12884
|
+
} else {
|
|
12885
|
+
console.warn("Root bone is missing");
|
|
12886
|
+
}
|
|
12887
|
+
joints.forEach(function(joint) {
|
|
12888
|
+
var node = treeNodeList[joint];
|
|
12889
|
+
if (node !== rootBoneItem && node.parentId === rootBoneItem.parentId) {
|
|
12890
|
+
console.error("Find invalid node for rootBoneItem and adjust rootBoneItem");
|
|
12891
|
+
rootBoneItem = treeItem;
|
|
12892
|
+
}
|
|
12893
|
+
});
|
|
12894
|
+
treeNodeList.forEach(function(node) {
|
|
12895
|
+
id2Node[node.id] = node;
|
|
12896
|
+
});
|
|
12897
|
+
geom.rootBoneName = rootBoneItem.name;
|
|
12898
|
+
var boneNames = [];
|
|
12899
|
+
joints.forEach(function(joint) {
|
|
12900
|
+
var currentItem = treeNodeList[joint];
|
|
12901
|
+
var nodeList = [];
|
|
12902
|
+
while(currentItem && currentItem != rootBoneItem){
|
|
12903
|
+
nodeList.push(currentItem.name);
|
|
12904
|
+
if (currentItem.parentId) {
|
|
12905
|
+
currentItem = id2Node[currentItem.parentId];
|
|
12906
|
+
} else {
|
|
12907
|
+
break;
|
|
12908
|
+
}
|
|
12909
|
+
}
|
|
12910
|
+
boneNames.push(nodeList.reverse().join("/"));
|
|
12911
|
+
});
|
|
12912
|
+
geom.boneNames = boneNames;
|
|
12913
|
+
return rootBoneItem;
|
|
12914
|
+
};
|
|
12491
12915
|
return JSONConverter;
|
|
12492
12916
|
}();
|
|
12917
|
+
var TreeInfo = /*#__PURE__*/ function() {
|
|
12918
|
+
function TreeInfo() {
|
|
12919
|
+
this.tree2NodeList = {};
|
|
12920
|
+
this.nodeList2Tree = {};
|
|
12921
|
+
this.nodeId2Node = {};
|
|
12922
|
+
this.node2Path = {};
|
|
12923
|
+
}
|
|
12924
|
+
var _proto = TreeInfo.prototype;
|
|
12925
|
+
_proto.add = function add(treeItem, treeNodeList) {
|
|
12926
|
+
var _this = this;
|
|
12927
|
+
if (this.tree2NodeList[treeItem.id]) {
|
|
12928
|
+
throw new Error("Find duplicate treeItem id: " + treeItem.id);
|
|
12929
|
+
}
|
|
12930
|
+
this.tree2NodeList[treeItem.id] = treeNodeList;
|
|
12931
|
+
treeNodeList.forEach(function(node) {
|
|
12932
|
+
if (_this.nodeList2Tree[node.id]) {
|
|
12933
|
+
throw new Error("Find duplicate tree node id: " + node.id);
|
|
12934
|
+
}
|
|
12935
|
+
_this.nodeList2Tree[node.id] = treeItem;
|
|
12936
|
+
_this.nodeId2Node[node.id] = node;
|
|
12937
|
+
});
|
|
12938
|
+
treeNodeList.forEach(function(node) {
|
|
12939
|
+
_this.setNodePath(node);
|
|
12940
|
+
});
|
|
12941
|
+
};
|
|
12942
|
+
_proto.setNodePath = function setNodePath(node) {
|
|
12943
|
+
if (node.parentId) {
|
|
12944
|
+
if (this.node2Path[node.parentId]) {
|
|
12945
|
+
this.node2Path[node.id] = this.node2Path[node.parentId] + "/" + node.name;
|
|
12946
|
+
} else if (this.nodeId2Node[node.parentId]) {
|
|
12947
|
+
this.setNodePath(this.nodeId2Node[node.parentId]);
|
|
12948
|
+
this.node2Path[node.id] = this.node2Path[node.parentId] + "/" + node.name;
|
|
12949
|
+
} else {
|
|
12950
|
+
this.node2Path[node.id] = node.name;
|
|
12951
|
+
}
|
|
12952
|
+
} else {
|
|
12953
|
+
this.node2Path[node.id] = node.name;
|
|
12954
|
+
}
|
|
12955
|
+
};
|
|
12956
|
+
_proto.getTreeNodeListByTreeId = function getTreeNodeListByTreeId(id) {
|
|
12957
|
+
return this.tree2NodeList[id];
|
|
12958
|
+
};
|
|
12959
|
+
_proto.getTreeNodeListByNodeId = function getTreeNodeListByNodeId(id) {
|
|
12960
|
+
var treeItem = this.nodeList2Tree[id];
|
|
12961
|
+
if (!treeItem) {
|
|
12962
|
+
throw new Error("Invalid id " + id);
|
|
12963
|
+
}
|
|
12964
|
+
return this.getTreeNodeListByTreeId(treeItem.id);
|
|
12965
|
+
};
|
|
12966
|
+
_proto.getTreeItemByNodeId = function getTreeItemByNodeId(id) {
|
|
12967
|
+
return this.nodeList2Tree[id];
|
|
12968
|
+
};
|
|
12969
|
+
_proto.getTreeNode = function getTreeNode(treeId, nodeIndex) {
|
|
12970
|
+
var nodeList = this.getTreeNodeListByTreeId(treeId);
|
|
12971
|
+
return nodeList[nodeIndex];
|
|
12972
|
+
};
|
|
12973
|
+
_proto.getAllTreeNodeList = function getAllTreeNodeList() {
|
|
12974
|
+
var _this = this;
|
|
12975
|
+
var nodeList = [];
|
|
12976
|
+
Object.keys(this.tree2NodeList).forEach(function(key) {
|
|
12977
|
+
var _nodeList;
|
|
12978
|
+
(_nodeList = nodeList).push.apply(_nodeList, [].concat(_this.tree2NodeList[key]));
|
|
12979
|
+
});
|
|
12980
|
+
return nodeList;
|
|
12981
|
+
};
|
|
12982
|
+
_proto.getNodePath = function getNodePath(id) {
|
|
12983
|
+
return this.node2Path[id];
|
|
12984
|
+
};
|
|
12985
|
+
return TreeInfo;
|
|
12986
|
+
}();
|
|
12493
12987
|
function getGeometryDataFromOptions(geomOptions) {
|
|
12494
12988
|
var vertexCount = 0;
|
|
12989
|
+
var verticesType = spec.VertexFormatType.Float32;
|
|
12990
|
+
var verticesNormalize = false;
|
|
12991
|
+
var uvsType = spec.VertexFormatType.Float32;
|
|
12992
|
+
var uvsNormalize = false;
|
|
12993
|
+
var normalsType = spec.VertexFormatType.Float32;
|
|
12994
|
+
var normalsNormalize = false;
|
|
12495
12995
|
var _geomOptions_name;
|
|
12496
12996
|
var modelData = {
|
|
12497
|
-
vertices:
|
|
12498
|
-
uvs:
|
|
12499
|
-
normals:
|
|
12500
|
-
indices:
|
|
12997
|
+
vertices: new Float32Array(),
|
|
12998
|
+
uvs: new Float32Array(),
|
|
12999
|
+
normals: new Float32Array(),
|
|
13000
|
+
indices: new Float32Array(),
|
|
12501
13001
|
name: (_geomOptions_name = geomOptions.name) != null ? _geomOptions_name : "<empty>"
|
|
12502
13002
|
};
|
|
12503
13003
|
for(var attrib in geomOptions.attributes){
|
|
12504
13004
|
var attribData = geomOptions.attributes[attrib];
|
|
12505
|
-
if (attrib === "
|
|
13005
|
+
if (attrib === "aPosition") {
|
|
12506
13006
|
// @ts-expect-error
|
|
12507
13007
|
vertexCount = attribData.data.length / attribData.size;
|
|
12508
13008
|
// @ts-expect-error
|
|
12509
|
-
modelData.vertices =
|
|
12510
|
-
|
|
13009
|
+
modelData.vertices = attribData.data;
|
|
13010
|
+
var _attribData_normalize;
|
|
13011
|
+
verticesNormalize = (_attribData_normalize = attribData.normalize) != null ? _attribData_normalize : false;
|
|
13012
|
+
var _attribData_type;
|
|
13013
|
+
verticesType = glType2VertexFormatType((_attribData_type = attribData.type) != null ? _attribData_type : glContext.FLOAT);
|
|
13014
|
+
} else if (attrib === "aNormal") {
|
|
12511
13015
|
// @ts-expect-error
|
|
12512
|
-
modelData.normals =
|
|
12513
|
-
|
|
13016
|
+
modelData.normals = attribData.data;
|
|
13017
|
+
var _attribData_normalize1;
|
|
13018
|
+
normalsNormalize = (_attribData_normalize1 = attribData.normalize) != null ? _attribData_normalize1 : false;
|
|
13019
|
+
var _attribData_type1;
|
|
13020
|
+
normalsType = glType2VertexFormatType((_attribData_type1 = attribData.type) != null ? _attribData_type1 : glContext.FLOAT);
|
|
13021
|
+
} else if (attrib === "aUV1") {
|
|
12514
13022
|
// @ts-expect-error
|
|
12515
|
-
modelData.uvs =
|
|
13023
|
+
modelData.uvs = attribData.data;
|
|
13024
|
+
var _attribData_normalize2;
|
|
13025
|
+
uvsNormalize = (_attribData_normalize2 = attribData.normalize) != null ? _attribData_normalize2 : false;
|
|
13026
|
+
var _attribData_type2;
|
|
13027
|
+
uvsType = glType2VertexFormatType((_attribData_type2 = attribData.type) != null ? _attribData_type2 : glContext.FLOAT);
|
|
12516
13028
|
}
|
|
12517
13029
|
}
|
|
13030
|
+
var verticesOffset = getOffset(verticesType, 3, vertexCount);
|
|
13031
|
+
var uvsOffset = getOffset(uvsType, 2, vertexCount);
|
|
13032
|
+
var normalsOffset = getOffset(normalsType, 3, vertexCount);
|
|
12518
13033
|
if (geomOptions.indices) {
|
|
12519
|
-
|
|
12520
|
-
|
|
13034
|
+
modelData.indices = geomOptions.indices.data;
|
|
13035
|
+
} else if (vertexCount <= 65535) {
|
|
13036
|
+
var indices = new Uint16Array(vertexCount);
|
|
13037
|
+
for(var i = 0; i < vertexCount; i++){
|
|
13038
|
+
indices[i] = i;
|
|
13039
|
+
}
|
|
13040
|
+
modelData.indices = indices;
|
|
12521
13041
|
} else {
|
|
12522
|
-
|
|
13042
|
+
var indices1 = new Uint32Array(vertexCount);
|
|
13043
|
+
for(var i1 = 0; i1 < vertexCount; i1++){
|
|
13044
|
+
indices1[i1] = i1;
|
|
13045
|
+
}
|
|
13046
|
+
modelData.indices = indices1;
|
|
13047
|
+
}
|
|
13048
|
+
var indicesType = spec.IndexFormatType.UInt16;
|
|
13049
|
+
if (modelData.indices.BYTES_PER_ELEMENT === 4) {
|
|
13050
|
+
indicesType = spec.IndexFormatType.UInt32;
|
|
12523
13051
|
}
|
|
12524
13052
|
var geometryData = {
|
|
12525
13053
|
id: generateGUID(),
|
|
@@ -12528,47 +13056,185 @@ function getGeometryDataFromOptions(geomOptions) {
|
|
|
12528
13056
|
vertexCount: vertexCount,
|
|
12529
13057
|
channels: [
|
|
12530
13058
|
{
|
|
13059
|
+
semantic: spec.VertexBufferSemantic.Position,
|
|
12531
13060
|
offset: 0,
|
|
12532
|
-
format:
|
|
12533
|
-
dimension: 3
|
|
13061
|
+
format: verticesType,
|
|
13062
|
+
dimension: 3,
|
|
13063
|
+
normalize: verticesNormalize
|
|
12534
13064
|
},
|
|
12535
13065
|
{
|
|
12536
|
-
|
|
12537
|
-
|
|
12538
|
-
|
|
13066
|
+
semantic: spec.VertexBufferSemantic.Uv,
|
|
13067
|
+
offset: verticesOffset,
|
|
13068
|
+
format: uvsType,
|
|
13069
|
+
dimension: 2,
|
|
13070
|
+
normalize: uvsNormalize
|
|
12539
13071
|
},
|
|
12540
13072
|
{
|
|
12541
|
-
|
|
12542
|
-
|
|
12543
|
-
|
|
13073
|
+
semantic: spec.VertexBufferSemantic.Normal,
|
|
13074
|
+
offset: verticesOffset + uvsOffset,
|
|
13075
|
+
format: normalsType,
|
|
13076
|
+
dimension: 3,
|
|
13077
|
+
normalize: normalsNormalize
|
|
12544
13078
|
}
|
|
12545
13079
|
]
|
|
12546
13080
|
},
|
|
13081
|
+
subMeshes: [],
|
|
12547
13082
|
mode: spec.GeometryType.TRIANGLES,
|
|
12548
|
-
indexFormat:
|
|
12549
|
-
indexOffset:
|
|
13083
|
+
indexFormat: indicesType,
|
|
13084
|
+
indexOffset: verticesOffset + uvsOffset + normalsOffset,
|
|
12550
13085
|
buffer: encodeVertexData(modelData)
|
|
12551
13086
|
};
|
|
12552
13087
|
return geometryData;
|
|
12553
13088
|
}
|
|
13089
|
+
function getGeometryDataFromPropsList(geomPropsList) {
|
|
13090
|
+
var _loop = function(i) {
|
|
13091
|
+
var _geomPropsList__indices;
|
|
13092
|
+
var count = getDrawCount(geomPropsList[i]);
|
|
13093
|
+
var _geomPropsList_i_drawStart;
|
|
13094
|
+
var offset = totalCount + ((_geomPropsList_i_drawStart = geomPropsList[i].drawStart) != null ? _geomPropsList_i_drawStart : 0);
|
|
13095
|
+
var _geomPropsList__indices_data_BYTES_PER_ELEMENT;
|
|
13096
|
+
var scale = (_geomPropsList__indices_data_BYTES_PER_ELEMENT = (_geomPropsList__indices = geomPropsList[0].indices) == null ? void 0 : _geomPropsList__indices.data.BYTES_PER_ELEMENT) != null ? _geomPropsList__indices_data_BYTES_PER_ELEMENT : 1;
|
|
13097
|
+
subMeshes.push({
|
|
13098
|
+
offset: offset * scale,
|
|
13099
|
+
indexCount: count,
|
|
13100
|
+
vertexCount: count
|
|
13101
|
+
});
|
|
13102
|
+
if (i) {
|
|
13103
|
+
var geom0 = geomPropsList[0];
|
|
13104
|
+
var geom1 = geomPropsList[i];
|
|
13105
|
+
var isSame = true;
|
|
13106
|
+
Object.keys(geom0.attributes).forEach(function(name) {
|
|
13107
|
+
var attrib = geom0.attributes[name];
|
|
13108
|
+
// @ts-expect-error
|
|
13109
|
+
var array1 = attrib.data;
|
|
13110
|
+
// @ts-expect-error
|
|
13111
|
+
var array2 = geom1.attributes[name].data;
|
|
13112
|
+
if (array1.length !== array2.length || array1[0] !== array2[0]) {
|
|
13113
|
+
isSame = false;
|
|
13114
|
+
}
|
|
13115
|
+
});
|
|
13116
|
+
if (isSame) {
|
|
13117
|
+
if (geom0.indices && geom1.indices) {
|
|
13118
|
+
geom0.indices.data = mergeTypedArray(geom0.indices.data, geom1.indices.data);
|
|
13119
|
+
}
|
|
13120
|
+
} else {
|
|
13121
|
+
if (geom0.indices && geom1.indices) {
|
|
13122
|
+
var vertexCount = getVertexCount(geom0);
|
|
13123
|
+
geom0.indices.data = mergeTypedArray(geom0.indices.data, geom1.indices.data, vertexCount);
|
|
13124
|
+
}
|
|
13125
|
+
Object.keys(geom0.attributes).forEach(function(name) {
|
|
13126
|
+
var attrib = geom0.attributes[name];
|
|
13127
|
+
// @ts-expect-error
|
|
13128
|
+
var array1 = attrib.data;
|
|
13129
|
+
// @ts-expect-error
|
|
13130
|
+
var array2 = geom1.attributes[name].data;
|
|
13131
|
+
// @ts-expect-error
|
|
13132
|
+
attrib.data = mergeTypedArray(array1, array2);
|
|
13133
|
+
});
|
|
13134
|
+
}
|
|
13135
|
+
}
|
|
13136
|
+
totalCount = offset + count;
|
|
13137
|
+
};
|
|
13138
|
+
if (geomPropsList.length <= 0) {
|
|
13139
|
+
return;
|
|
13140
|
+
}
|
|
13141
|
+
var totalCount = 0;
|
|
13142
|
+
var subMeshes = [];
|
|
13143
|
+
for(var i = 0; i < geomPropsList.length; i++)_loop(i);
|
|
13144
|
+
return createGeometryData(geomPropsList[0], subMeshes);
|
|
13145
|
+
}
|
|
13146
|
+
function getOffset(formatType, dimension, count) {
|
|
13147
|
+
switch(formatType){
|
|
13148
|
+
case spec.VertexFormatType.Int8:
|
|
13149
|
+
case spec.VertexFormatType.UInt8:
|
|
13150
|
+
return dimension * count;
|
|
13151
|
+
case spec.VertexFormatType.Int16:
|
|
13152
|
+
case spec.VertexFormatType.UInt16:
|
|
13153
|
+
return dimension * count * 2;
|
|
13154
|
+
default:
|
|
13155
|
+
return dimension * count * 4;
|
|
13156
|
+
}
|
|
13157
|
+
}
|
|
13158
|
+
function createGeometryData(props, subMeshes) {
|
|
13159
|
+
var totalByteLength = 0;
|
|
13160
|
+
for(var attrib in props.attributes){
|
|
13161
|
+
var attribData = props.attributes[attrib];
|
|
13162
|
+
// @ts-expect-error
|
|
13163
|
+
totalByteLength += attribData.data.byteLength;
|
|
13164
|
+
}
|
|
13165
|
+
if (props.indices) {
|
|
13166
|
+
totalByteLength += props.indices.data.byteLength;
|
|
13167
|
+
}
|
|
13168
|
+
var vertexCount = 0;
|
|
13169
|
+
var bufferOffset = 0;
|
|
13170
|
+
var buffer = new Uint8Array(totalByteLength);
|
|
13171
|
+
var vertexChannels = [];
|
|
13172
|
+
for(var attrib1 in props.attributes){
|
|
13173
|
+
var attribData1 = props.attributes[attrib1];
|
|
13174
|
+
var semantic = vertexBufferSemanticMap[attrib1];
|
|
13175
|
+
if (!semantic) {
|
|
13176
|
+
throw new Error("Invalid attrib " + attrib1);
|
|
13177
|
+
}
|
|
13178
|
+
// @ts-expect-error
|
|
13179
|
+
vertexCount = attribData1.data.length / attribData1.size;
|
|
13180
|
+
var _attribData_type;
|
|
13181
|
+
var vertexChannel = {
|
|
13182
|
+
semantic: semantic,
|
|
13183
|
+
offset: bufferOffset,
|
|
13184
|
+
format: glType2VertexFormatType((_attribData_type = attribData1.type) != null ? _attribData_type : glContext.FLOAT),
|
|
13185
|
+
dimension: attribData1.size,
|
|
13186
|
+
normalize: attribData1.normalize
|
|
13187
|
+
};
|
|
13188
|
+
vertexChannels.push(vertexChannel);
|
|
13189
|
+
// @ts-expect-error
|
|
13190
|
+
var data = attribData1.data;
|
|
13191
|
+
var subBuffer = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
13192
|
+
buffer.set(subBuffer, bufferOffset);
|
|
13193
|
+
bufferOffset += subBuffer.byteLength;
|
|
13194
|
+
}
|
|
13195
|
+
var geometryData = {
|
|
13196
|
+
id: generateGUID(),
|
|
13197
|
+
dataType: spec.DataType.Geometry,
|
|
13198
|
+
vertexData: {
|
|
13199
|
+
vertexCount: vertexCount,
|
|
13200
|
+
channels: vertexChannels
|
|
13201
|
+
},
|
|
13202
|
+
subMeshes: subMeshes,
|
|
13203
|
+
mode: spec.GeometryType.TRIANGLES,
|
|
13204
|
+
indexFormat: spec.IndexFormatType.UInt16,
|
|
13205
|
+
indexOffset: -1,
|
|
13206
|
+
buffer: ""
|
|
13207
|
+
};
|
|
13208
|
+
if (props.indices) {
|
|
13209
|
+
var indices = props.indices.data;
|
|
13210
|
+
var subBuffer1 = new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength);
|
|
13211
|
+
buffer.set(subBuffer1, bufferOffset);
|
|
13212
|
+
geometryData.indexOffset = bufferOffset;
|
|
13213
|
+
if (_instanceof1(indices, Uint32Array)) {
|
|
13214
|
+
geometryData.indexFormat = spec.IndexFormatType.UInt32;
|
|
13215
|
+
}
|
|
13216
|
+
}
|
|
13217
|
+
geometryData.buffer = toBase64String(buffer);
|
|
13218
|
+
return geometryData;
|
|
13219
|
+
}
|
|
12554
13220
|
function encodeVertexData(modelData) {
|
|
12555
|
-
var vertices = new
|
|
12556
|
-
var uvs = new
|
|
12557
|
-
var normals = new
|
|
12558
|
-
var indices = new
|
|
13221
|
+
var vertices = new Uint8Array(modelData.vertices.buffer, modelData.vertices.byteOffset, modelData.vertices.byteLength);
|
|
13222
|
+
var uvs = new Uint8Array(modelData.uvs.buffer, modelData.uvs.byteOffset, modelData.uvs.byteLength);
|
|
13223
|
+
var normals = new Uint8Array(modelData.normals.buffer, modelData.normals.byteOffset, modelData.normals.byteLength);
|
|
13224
|
+
var indices = new Uint8Array(modelData.indices.buffer, modelData.indices.byteOffset, modelData.indices.byteLength);
|
|
12559
13225
|
// 计算新 ArrayBuffer 的总大小(以字节为单位)
|
|
12560
13226
|
var totalSize = vertices.byteLength + uvs.byteLength + normals.byteLength + indices.byteLength;
|
|
12561
13227
|
// 创建一个足够大的 ArrayBuffer 来存储两个数组的数据
|
|
12562
13228
|
var buffer = new ArrayBuffer(totalSize);
|
|
12563
13229
|
// 创建一个视图来按照 Float32 格式写入数据
|
|
12564
|
-
var floatView = new
|
|
13230
|
+
var floatView = new Uint8Array(buffer, 0, vertices.byteLength);
|
|
12565
13231
|
floatView.set(vertices);
|
|
12566
|
-
floatView = new
|
|
13232
|
+
floatView = new Uint8Array(buffer, vertices.byteLength, uvs.byteLength);
|
|
12567
13233
|
floatView.set(uvs);
|
|
12568
|
-
floatView = new
|
|
13234
|
+
floatView = new Uint8Array(buffer, vertices.byteLength + uvs.byteLength, normals.byteLength);
|
|
12569
13235
|
floatView.set(normals);
|
|
12570
13236
|
// 创建一个视图来按照 Uint16 格式写入数据,紧接着 Float32 数据之后
|
|
12571
|
-
var uint16View = new
|
|
13237
|
+
var uint16View = new Uint8Array(buffer, vertices.byteLength + uvs.byteLength + normals.byteLength, indices.byteLength);
|
|
12572
13238
|
uint16View.set(indices);
|
|
12573
13239
|
// 创建一个 Uint8Array 视图以便逐字节访问 ArrayBuffer 的数据
|
|
12574
13240
|
var uint8View = new Uint8Array(buffer);
|
|
@@ -12580,18 +13246,133 @@ function encodeVertexData(modelData) {
|
|
|
12580
13246
|
// 使用 btoa 函数将二进制字符串转换为 Base64 编码的字符串
|
|
12581
13247
|
return btoa(binaryString);
|
|
12582
13248
|
}
|
|
12583
|
-
function
|
|
12584
|
-
|
|
12585
|
-
|
|
12586
|
-
|
|
13249
|
+
function toBase64String(array) {
|
|
13250
|
+
// 将 Uint8Array 转换为二进制字符串
|
|
13251
|
+
var binaryString = "";
|
|
13252
|
+
for(var i = 0; i < array.length; i++){
|
|
13253
|
+
binaryString += String.fromCharCode(array[i]);
|
|
13254
|
+
}
|
|
13255
|
+
// 使用 btoa 函数将二进制字符串转换为 Base64 编码的字符串
|
|
13256
|
+
return btoa(binaryString);
|
|
13257
|
+
}
|
|
13258
|
+
function getDrawCount(geomProps) {
|
|
13259
|
+
if (geomProps.drawCount) {
|
|
13260
|
+
return geomProps.drawCount;
|
|
13261
|
+
} else if (geomProps.indices) {
|
|
13262
|
+
return geomProps.indices.data.length;
|
|
13263
|
+
} else {
|
|
13264
|
+
var drawCount = 0;
|
|
13265
|
+
// @ts-expect-error
|
|
13266
|
+
geomProps.attributes.forEach(function(attrib) {
|
|
13267
|
+
drawCount = attrib.data.length / attrib.size;
|
|
13268
|
+
});
|
|
13269
|
+
return drawCount;
|
|
13270
|
+
}
|
|
13271
|
+
}
|
|
13272
|
+
function getVertexCount(geomProps) {
|
|
13273
|
+
var vertexCount = 0;
|
|
13274
|
+
Object.keys(geomProps.attributes).forEach(function(name) {
|
|
13275
|
+
var attrib = geomProps.attributes[name];
|
|
13276
|
+
// @ts-expect-error
|
|
13277
|
+
vertexCount = attrib.data.length / attrib.size;
|
|
12587
13278
|
});
|
|
12588
|
-
return
|
|
13279
|
+
return vertexCount;
|
|
13280
|
+
}
|
|
13281
|
+
function mergeTypedArray(array1, array2, offset) {
|
|
13282
|
+
if (_instanceof1(array1, Float32Array)) {
|
|
13283
|
+
var result = new Float32Array(array1.length + array2.length);
|
|
13284
|
+
result.set(array1);
|
|
13285
|
+
result.set(array2, array1.length);
|
|
13286
|
+
return result;
|
|
13287
|
+
} else if (_instanceof1(array1, Int32Array)) {
|
|
13288
|
+
var result1 = new Int32Array(array1.length + array2.length);
|
|
13289
|
+
result1.set(array1);
|
|
13290
|
+
result1.set(array2, array1.length);
|
|
13291
|
+
return result1;
|
|
13292
|
+
} else if (_instanceof1(array1, Uint32Array)) {
|
|
13293
|
+
var result2 = new Uint32Array(array1.length + array2.length);
|
|
13294
|
+
result2.set(array1);
|
|
13295
|
+
result2.set(array2, array1.length);
|
|
13296
|
+
if (offset) {
|
|
13297
|
+
for(var i = 0; i < array2.length; i++){
|
|
13298
|
+
result2[array1.length + i] += offset;
|
|
13299
|
+
}
|
|
13300
|
+
}
|
|
13301
|
+
return result2;
|
|
13302
|
+
} else if (_instanceof1(array1, Int16Array)) {
|
|
13303
|
+
var result3 = new Int16Array(array1.length + array2.length);
|
|
13304
|
+
result3.set(array1);
|
|
13305
|
+
result3.set(array2, array1.length);
|
|
13306
|
+
return result3;
|
|
13307
|
+
} else if (_instanceof1(array1, Uint16Array)) {
|
|
13308
|
+
var result4 = new Uint16Array(array1.length + array2.length);
|
|
13309
|
+
result4.set(array1);
|
|
13310
|
+
result4.set(array2, array1.length);
|
|
13311
|
+
if (offset) {
|
|
13312
|
+
for(var i1 = 0; i1 < array2.length; i1++){
|
|
13313
|
+
result4[array1.length + i1] += offset;
|
|
13314
|
+
}
|
|
13315
|
+
}
|
|
13316
|
+
return result4;
|
|
13317
|
+
} else if (_instanceof1(array1, Int8Array)) {
|
|
13318
|
+
var result5 = new Int8Array(array1.length + array2.length);
|
|
13319
|
+
result5.set(array1);
|
|
13320
|
+
result5.set(array2, array1.length);
|
|
13321
|
+
return result5;
|
|
13322
|
+
} else {
|
|
13323
|
+
var result6 = new Uint8Array(array1.length + array2.length);
|
|
13324
|
+
result6.set(array1);
|
|
13325
|
+
result6.set(array2, array1.length);
|
|
13326
|
+
return result6;
|
|
13327
|
+
}
|
|
12589
13328
|
}
|
|
13329
|
+
var vertexBufferSemanticMap = {
|
|
13330
|
+
aPos: "POSITION",
|
|
13331
|
+
aUV: "TEXCOORD0",
|
|
13332
|
+
aUV2: "TEXCOORD1",
|
|
13333
|
+
aNormal: "NORMAL",
|
|
13334
|
+
aTangent: "TANGENT",
|
|
13335
|
+
aColor: "COLOR",
|
|
13336
|
+
aJoints: "JOINTS",
|
|
13337
|
+
aWeights: "WEIGHTS",
|
|
13338
|
+
//
|
|
13339
|
+
a_Position: "POSITION",
|
|
13340
|
+
a_UV: "TEXCOORD0",
|
|
13341
|
+
a_UV1: "TEXCOORD0",
|
|
13342
|
+
a_UV2: "TEXCOORD1",
|
|
13343
|
+
a_Normal: "NORMAL",
|
|
13344
|
+
a_Tangent: "TANGENT",
|
|
13345
|
+
a_Color: "COLOR",
|
|
13346
|
+
a_Joints: "JOINTS",
|
|
13347
|
+
a_Joint1: "JOINTS",
|
|
13348
|
+
a_Weights: "WEIGHTS",
|
|
13349
|
+
a_Weight1: "WEIGHTS",
|
|
13350
|
+
//
|
|
13351
|
+
a_Target_Position0: "POSITION_BS0",
|
|
13352
|
+
a_Target_Position1: "POSITION_BS1",
|
|
13353
|
+
a_Target_Position2: "POSITION_BS2",
|
|
13354
|
+
a_Target_Position3: "POSITION_BS3",
|
|
13355
|
+
a_Target_Position4: "POSITION_BS4",
|
|
13356
|
+
a_Target_Position5: "POSITION_BS5",
|
|
13357
|
+
a_Target_Position6: "POSITION_BS6",
|
|
13358
|
+
a_Target_Position7: "POSITION_BS7",
|
|
13359
|
+
a_Target_Normal0: "NORMAL_BS0",
|
|
13360
|
+
a_Target_Normal1: "NORMAL_BS1",
|
|
13361
|
+
a_Target_Normal2: "NORMAL_BS2",
|
|
13362
|
+
a_Target_Normal3: "NORMAL_BS3",
|
|
13363
|
+
a_Target_Tangent0: "TANGENT_BS0",
|
|
13364
|
+
a_Target_Tangent1: "TANGENT_BS1",
|
|
13365
|
+
a_Target_Tangent2: "TANGENT_BS2",
|
|
13366
|
+
a_Target_Tangent3: "TANGENT_BS3"
|
|
13367
|
+
};
|
|
12590
13368
|
|
|
12591
13369
|
registerPlugin("tree", ModelTreePlugin, VFXItem, true);
|
|
12592
13370
|
registerPlugin("model", ModelPlugin, VFXItem);
|
|
12593
|
-
var version = "2.0.0-alpha.
|
|
13371
|
+
var version = "2.0.0-alpha.13";
|
|
12594
13372
|
logger.info("plugin model version: " + version);
|
|
13373
|
+
if (version !== version$1) {
|
|
13374
|
+
console.error("注意:请统一 Model 插件与 Player 版本,不统一的版本混用会有不可预知的后果!", "\nAttention: Please ensure the Model plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!");
|
|
13375
|
+
}
|
|
12595
13376
|
|
|
12596
|
-
export { BoxMesh, CameraGestureHandlerImp, CameraGestureType, CheckerHelper, CompositionCache, CompositionHitTest, CullMode, FBOOptions, Float16ArrayWrapper, GeometryBoxProxy, HitTestingProxy, HookOGLFunc, InterpolationSampler, JSONConverter, LoaderHelper, LoaderImpl, MeshHelper, ModelCameraComponent, ModelLightComponent, ModelMeshComponent, ModelPlugin, ModelPluginComponent, ModelSkyboxComponent, ModelTreeComponent, ModelTreeItem, ModelTreePlugin, PAnimInterpType, PAnimPathType, PAnimTexture, PAnimTrack, PAnimation, PAnimationManager, PBRShaderGUID, PBlendMode, PCamera, PCameraManager, PCoordinate, PEntity, PFaceSideMode, PGeometry, PGlobalState, PLight, PLightManager, PLightType, PMaterialBase, PMaterialPBR, PMaterialSkyboxFilter, PMaterialType, PMaterialUnlit, PMesh, PMorph, PObject, PObjectType,
|
|
13377
|
+
export { AnimationComponent, BoxMesh, CameraGestureHandlerImp, CameraGestureType, CheckerHelper, CompositionCache, CompositionHitTest, CullMode, FBOOptions, Float16ArrayWrapper, GeometryBoxProxy, HitTestingProxy, HookOGLFunc, InterpolationSampler, JSONConverter, LoaderHelper, LoaderImpl, MeshHelper, ModelCameraComponent, ModelLightComponent, ModelMeshComponent, ModelPlugin, ModelPluginComponent, ModelSkyboxComponent, ModelTreeComponent, ModelTreeItem, ModelTreePlugin, PAnimInterpType, PAnimPathType, PAnimTexture, PAnimTrack, PAnimation, PAnimationManager, PBRShaderGUID, PBlendMode, PCamera, PCameraManager, PCoordinate, PEntity, PFaceSideMode, PGeometry, PGlobalState, PLight, PLightManager, PLightType, PMaterialBase, PMaterialPBR, PMaterialSkyboxFilter, PMaterialType, PMaterialUnlit, PMesh, PMorph, PObject, PObjectType, PSceneManager, PShaderManager, PShadowType, PSkin, PSkybox, PSkyboxCreator, PSkyboxType, PSubMesh, PTextureType, PTransform, PluginHelper, RayBoxTesting, RayIntersectsBoxWithRotation, RayTriangleTesting, RenderType, TextureDataMode, ToggleItemBounding, TwoStatesSet, UnlitShaderGUID, VFX_ITEM_TYPE_3D, VertexAttribBuffer, WebGLHelper, WebHelper, createAnimationSampler, createPluginMaterial, fetchPBRShaderCode, fetchUnlitShaderCode, getDefaultEffectsGLTFLoader, getDiffuseOnlyShaderCode, getGaussianBlurShaderCodeV1, getGaussianBlurShaderCodeV2, getGeometryDataFromOptions, getGeometryDataFromPropsList, getKawaseBlurShaderCode, getNormalVisShaderCode, getPBRPassShaderCode, getPMeshList, getQuadFilterShaderCode, getRendererGPUInfo, getSceneManager, getShadowPassShaderCode, getSimpleFilterShaderCode, getSkyBoxShaderCode, getTransparecyBaseShader, getTransparecyFilterShader, setDefaultEffectsGLTFLoader, version };
|
|
12597
13378
|
//# sourceMappingURL=index.mjs.map
|