diff --git a/README.md b/README.md index 3722ea2f..4e40a1ce 100644 --- a/README.md +++ b/README.md @@ -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更新 diff --git a/ShadowEditor.Web/src/editor/menu/EditMenu.jsx b/ShadowEditor.Web/src/editor/menu/EditMenu.jsx index f29f2b42..3ebd20be 100644 --- a/ShadowEditor.Web/src/editor/menu/EditMenu.jsx +++ b/ShadowEditor.Web/src/editor/menu/EditMenu.jsx @@ -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)); } diff --git a/ShadowEditor.Web/src/loader/ModelLoader.js b/ShadowEditor.Web/src/loader/ModelLoader.js index 1101ae85..8fb80a7e 100644 --- a/ShadowEditor.Web/src/loader/ModelLoader.js +++ b/ShadowEditor.Web/src/loader/ModelLoader.js @@ -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; \ No newline at end of file diff --git a/ShadowEditor.Web/src/utils/MeshUtils.js b/ShadowEditor.Web/src/utils/MeshUtils.js new file mode 100644 index 00000000..9352fa86 --- /dev/null +++ b/ShadowEditor.Web/src/utils/MeshUtils.js @@ -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; \ No newline at end of file