mirror of
https://github.com/tengge1/ShadowEditor.git
synced 2026-01-25 15:08:11 +00:00
修复模型复制多个后,保存场景后载入场景,只显示第一个的bug。
This commit is contained in:
parent
541139ff96
commit
52aa5acf8a
@ -12,6 +12,7 @@ Supported Languages: 中文 / [繁體中文](README-tw.md) / [English](README-en
|
||||
## v0.3.8即将更新
|
||||
|
||||
1. 新增快捷键`Ctrl+Z`撤销、`Ctrl+Y`重做、`Ctrl+C`复制、`Delete`删除。
|
||||
2. 修复模型复制多个后,保存场景后载入场景,只显示第一个的bug。
|
||||
|
||||
## v0.3.7更新
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import { MenuItem, MenuItemSeparator } from '../../third_party';
|
||||
import AddObjectCommand from '../../command/AddObjectCommand';
|
||||
import RemoveObjectCommand from '../../command/RemoveObjectCommand';
|
||||
import MeshUtils from '../../utils/MeshUtils';
|
||||
|
||||
/**
|
||||
* 编辑菜单
|
||||
@ -117,6 +118,13 @@ class EditMenu extends React.Component {
|
||||
}
|
||||
|
||||
object = object.clone();
|
||||
|
||||
// bug: 服务端模型克隆后,userData._children不正确,导致保存后无法正常显示。
|
||||
if (object.userData.Server && Array.isArray(object.userData._children)) {
|
||||
object.userData._children = [];
|
||||
MeshUtils.traverseUUID(object.children, object.userData._children); // 修复模型object.userData._children数组
|
||||
}
|
||||
|
||||
editor.execute(new AddObjectCommand(object));
|
||||
}
|
||||
|
||||
|
||||
@ -31,6 +31,7 @@ import SEA3DLoader from './SEA3DLoader';
|
||||
import VRMLoader from './VRMLoader';
|
||||
import VRMLLoader from './VRMLLoader';
|
||||
import XLoader from './XLoader';
|
||||
import MeshUtils from '../utils/MeshUtils';
|
||||
|
||||
const Loaders = {
|
||||
'_3ds': _3DSLoader,
|
||||
@ -66,7 +67,7 @@ const Loaders = {
|
||||
'sea3d': SEA3DLoader,
|
||||
'vrm': VRMLoader,
|
||||
'vrml': VRMLLoader,
|
||||
'x': XLoader,
|
||||
'x': XLoader
|
||||
};
|
||||
|
||||
/**
|
||||
@ -97,7 +98,7 @@ ModelLoader.prototype.load = function (url, options = {}, environment = {}) {
|
||||
resolve(null);
|
||||
return;
|
||||
}
|
||||
(new loader(app)).load(url, options, environment).then(obj => {
|
||||
new loader(app).load(url, options, environment).then(obj => {
|
||||
if (!obj || !obj.userData) {
|
||||
resolve(null);
|
||||
return;
|
||||
@ -112,7 +113,7 @@ ModelLoader.prototype.load = function (url, options = {}, environment = {}) {
|
||||
// 由于每次加载模型,uuid会变,所以要记录原始模型的uuid,而且只能记录一次。
|
||||
if (obj.children && !obj.userData._children) {
|
||||
obj.userData._children = []; // 原始模型的uuid层次
|
||||
this.serializeChildren(obj.children, obj.userData._children);
|
||||
MeshUtils.traverseUUID(obj.children, obj.userData._children); // 记录最原始的模型,每个组件的uuid。
|
||||
}
|
||||
|
||||
obj.userData.physics = obj.userData.physics || {
|
||||
@ -123,7 +124,7 @@ ModelLoader.prototype.load = function (url, options = {}, environment = {}) {
|
||||
inertia: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
z: 0,
|
||||
z: 0
|
||||
}
|
||||
};
|
||||
resolve(obj);
|
||||
@ -131,26 +132,4 @@ ModelLoader.prototype.load = function (url, options = {}, environment = {}) {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 记录最原始的模型,每个组件的uuid。
|
||||
* @param {Array} children 每个子元素
|
||||
* @param {Array} list 数组
|
||||
*/
|
||||
ModelLoader.prototype.serializeChildren = function (children, list) {
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
let child = children[i];
|
||||
|
||||
let list1 = [];
|
||||
|
||||
if (child.children && child.children.length > 0) {
|
||||
this.serializeChildren(child.children, list1);
|
||||
}
|
||||
|
||||
list.push({
|
||||
uuid: child.uuid,
|
||||
children: list1,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export default ModelLoader;
|
||||
30
ShadowEditor.Web/src/utils/MeshUtils.js
Normal file
30
ShadowEditor.Web/src/utils/MeshUtils.js
Normal file
@ -0,0 +1,30 @@
|
||||
|
||||
|
||||
/**
|
||||
* 模型工具类
|
||||
*/
|
||||
const MeshUtils = {
|
||||
/**
|
||||
* 遍历模型子元素,得到uuid列表
|
||||
* @param {THREE.Object3D} children 模型的children数组
|
||||
* @param {Array} list uuid数组
|
||||
*/
|
||||
traverseUUID(children, list) {
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
let child = children[i];
|
||||
|
||||
let list1 = [];
|
||||
|
||||
if (child.children && child.children.length > 0) {
|
||||
this.traverseUUID(child.children, list1);
|
||||
}
|
||||
|
||||
list.push({
|
||||
uuid: child.uuid,
|
||||
children: list1
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default MeshUtils;
|
||||
Loading…
x
Reference in New Issue
Block a user