修复模型复制多个后,保存场景后载入场景,只显示第一个的bug。

This commit is contained in:
tengge1 2019-11-18 20:40:54 +08:00
parent 541139ff96
commit 52aa5acf8a
4 changed files with 44 additions and 26 deletions

View File

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

View File

@ -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));
}

View File

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

View 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;