From eea835700f4fa2f2235daef78aac9b3c8d687bed Mon Sep 17 00:00:00 2001
From: liteng <930372551@qq.com>
Date: Thu, 21 Jun 2018 07:56:15 +0800
Subject: [PATCH] =?UTF-8?q?=E5=9C=BA=E6=99=AF=E8=8F=9C=E5=8D=95=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/event/EventDispatcher.js | 11 +++
src/event/menu/MenuEvent.js | 22 +++++
src/event/menu/scene/LoadSceneEvent.js | 33 +++++++
src/event/menu/scene/NewSceneEvent.js | 33 +++++++
src/event/menu/scene/PublishSceneEvent.js | 101 ++++++++++++++++++++++
src/event/menu/scene/SaveSceneEvent.js | 31 +++++++
src/utils/MathUtils.js | 23 +++++
7 files changed, 254 insertions(+)
create mode 100644 src/event/menu/MenuEvent.js
create mode 100644 src/event/menu/scene/LoadSceneEvent.js
create mode 100644 src/event/menu/scene/NewSceneEvent.js
create mode 100644 src/event/menu/scene/PublishSceneEvent.js
create mode 100644 src/event/menu/scene/SaveSceneEvent.js
create mode 100644 src/utils/MathUtils.js
diff --git a/src/event/EventDispatcher.js b/src/event/EventDispatcher.js
index c8e0b904..7bb9878d 100644
--- a/src/event/EventDispatcher.js
+++ b/src/event/EventDispatcher.js
@@ -33,6 +33,11 @@ import ClearEvent from './editor/ClearEvent';
import LoadEvent from './editor/LoadEvent';
import SaveEvent from './editor/SaveEvent';
+import NewSceneEvent from './menu/scene/NewSceneEvent';
+import LoadSceneEvent from './menu/scene/LoadSceneEvent';
+import SaveSceneEvent from './menu/scene/SaveSceneEvent';
+import PublishSceneEvent from './menu/scene/PublishSceneEvent';
+
/**
* 事件执行器
*/
@@ -73,6 +78,12 @@ function EventDispatcher(app) {
new ClearEvent(this.app),
new LoadEvent(this.app),
new SaveEvent(this.app),
+
+ // menubar中的事件
+ new NewSceneEvent(this.app),
+ new LoadSceneEvent(this.app),
+ new SaveSceneEvent(this.app),
+ new PublishSceneEvent(this.app),
];
}
diff --git a/src/event/menu/MenuEvent.js b/src/event/menu/MenuEvent.js
new file mode 100644
index 00000000..9951b060
--- /dev/null
+++ b/src/event/menu/MenuEvent.js
@@ -0,0 +1,22 @@
+import BaseEvent from '../BaseEvent';
+
+/**
+ * 菜单事件
+ * @param {*} app
+ */
+function MenuEvent(app) {
+ BaseEvent.call(this, app);
+}
+
+MenuEvent.prototype = Object.create(BaseEvent.prototype);
+MenuEvent.prototype.constructor = MenuEvent;
+
+MenuEvent.prototype.start = function () {
+
+};
+
+MenuEvent.prototype.stop = function () {
+
+};
+
+export default MenuEvent;
\ No newline at end of file
diff --git a/src/event/menu/scene/LoadSceneEvent.js b/src/event/menu/scene/LoadSceneEvent.js
new file mode 100644
index 00000000..57406988
--- /dev/null
+++ b/src/event/menu/scene/LoadSceneEvent.js
@@ -0,0 +1,33 @@
+import MenuEvent from '../MenuEvent';
+
+/**
+ * 载入场景
+ * @param {*} app
+ */
+function LoadSceneEvent(app) {
+ MenuEvent.call(this, app);
+}
+
+LoadSceneEvent.prototype = Object.create(MenuEvent.prototype);
+LoadSceneEvent.prototype.constructor = LoadSceneEvent;
+
+LoadSceneEvent.prototype.start = function () {
+ var _this = this;
+ this.app.on('mLoadScene.' + this.id, function () {
+ _this.onLoadScene();
+ });
+};
+
+LoadSceneEvent.prototype.stop = function () {
+ this.app.on('mLoadScene.' + this.id, null);
+};
+
+LoadSceneEvent.prototype.onLoadScene = function () {
+ var editor = this.app.editor;
+
+ if (confirm('所有未保存数据将丢失,确定吗?')) {
+ editor.load();
+ }
+};
+
+export default LoadSceneEvent;
\ No newline at end of file
diff --git a/src/event/menu/scene/NewSceneEvent.js b/src/event/menu/scene/NewSceneEvent.js
new file mode 100644
index 00000000..6ca35c22
--- /dev/null
+++ b/src/event/menu/scene/NewSceneEvent.js
@@ -0,0 +1,33 @@
+import MenuEvent from '../MenuEvent';
+
+/**
+ * 新建场景
+ * @param {*} app
+ */
+function NewSceneEvent(app) {
+ MenuEvent.call(this, app);
+}
+
+NewSceneEvent.prototype = Object.create(MenuEvent.prototype);
+NewSceneEvent.prototype.constructor = NewSceneEvent;
+
+NewSceneEvent.prototype.start = function () {
+ var _this = this;
+ this.app.on('mNewScene.' + this.id, function () {
+ _this.onNewScene();
+ });
+};
+
+NewSceneEvent.prototype.stop = function () {
+ this.app.on('mNewScene.' + this.id, null);
+};
+
+NewSceneEvent.prototype.onNewScene = function () {
+ var editor = this.app.editor;
+
+ if (confirm('所有未保存数据将丢失,确定吗?')) {
+ editor.clear();
+ }
+};
+
+export default NewSceneEvent;
\ No newline at end of file
diff --git a/src/event/menu/scene/PublishSceneEvent.js b/src/event/menu/scene/PublishSceneEvent.js
new file mode 100644
index 00000000..f95cae20
--- /dev/null
+++ b/src/event/menu/scene/PublishSceneEvent.js
@@ -0,0 +1,101 @@
+import MenuEvent from '../MenuEvent';
+import MathUtils from '../../../utils/MathUtils';
+
+/**
+ * 发布场景
+ * @param {*} app
+ */
+function PublishSceneEvent(app) {
+ MenuEvent.call(this, app);
+}
+
+PublishSceneEvent.prototype = Object.create(MenuEvent.prototype);
+PublishSceneEvent.prototype.constructor = PublishSceneEvent;
+
+PublishSceneEvent.prototype.start = function () {
+ var _this = this;
+ this.app.on('mPublishScene.' + this.id, function () {
+ _this.onPublishScene();
+ });
+
+ this.link = document.createElement('a');
+ this.link.style.display = 'none';
+ document.body.appendChild(this.link); // Firefox workaround, see #6594
+};
+
+PublishSceneEvent.prototype.stop = function () {
+ this.app.on('mPublishScene.' + this.id, null);
+};
+
+PublishSceneEvent.prototype.onPublishScene = function () {
+ var editor = this.app.editor;
+
+ var zip = new JSZip();
+ //
+
+ var output = editor.toJSON();
+ output.metadata.type = 'App';
+ delete output.history;
+
+ var vr = output.project.vr;
+
+ output = JSON.stringify(output, MathUtils.parseNumber, '\t');
+ output = output.replace(/[\n\t]+([\d\.e\-\[\]]+)/g, '$1');
+
+ zip.file('app.json', output);
+
+ //
+
+ var _this = this;
+ var manager = new THREE.LoadingManager(function () {
+ _this.save(zip.generate({ type: 'blob' }), 'download.zip');
+ });
+
+ var loader = new THREE.FileLoader(manager);
+ loader.load('third_party/app/index.html', function (content) {
+ var includes = [];
+
+ if (vr) {
+ includes.push('');
+ includes.push('');
+ includes.push('');
+ }
+
+ content = content.replace('', includes.join('\n\t\t'));
+ zip.file('index.html', content);
+ });
+ loader.load('third_party/app.js', function (content) {
+ zip.file('js/app.js', content);
+ });
+ loader.load('node_modules/three/build/three.min.js', function (content) {
+ zip.file('js/three.min.js', content);
+ });
+
+ if (vr) {
+ loader.load('third_party/controls/VRControls.js', function (content) {
+ zip.file('js/VRControls.js', content);
+ });
+
+ loader.load('third_party/effects/VREffect.js', function (content) {
+ zip.file('js/VREffect.js', content);
+ });
+
+ loader.load('third_party/vr/WebVR.js', function (content) {
+ zip.file('js/WebVR.js', content);
+ });
+ }
+};
+
+PublishSceneEvent.prototype.save = function (blob, filename) {
+ this.link.href = URL.createObjectURL(blob);
+ this.link.download = filename || 'data.json';
+ this.link.click();
+
+ // URL.revokeObjectURL( url ); breaks Firefox...
+};
+
+PublishSceneEvent.prototype.saveString = function (text, filename) {
+ this.save(new Blob([text], { type: 'text/plain' }), filename);
+};
+
+export default PublishSceneEvent;
\ No newline at end of file
diff --git a/src/event/menu/scene/SaveSceneEvent.js b/src/event/menu/scene/SaveSceneEvent.js
new file mode 100644
index 00000000..4e3fe8c1
--- /dev/null
+++ b/src/event/menu/scene/SaveSceneEvent.js
@@ -0,0 +1,31 @@
+import MenuEvent from '../MenuEvent';
+
+/**
+ * 保存场景
+ * @param {*} app
+ */
+function SaveSceneEvent(app) {
+ MenuEvent.call(this, app);
+}
+
+SaveSceneEvent.prototype = Object.create(MenuEvent.prototype);
+SaveSceneEvent.prototype.constructor = SaveSceneEvent;
+
+SaveSceneEvent.prototype.start = function () {
+ var _this = this;
+ this.app.on('mSaveScene.' + this.id, function () {
+ _this.onSaveScene();
+ });
+};
+
+SaveSceneEvent.prototype.stop = function () {
+ this.app.on('mSaveScene.' + this.id, null);
+};
+
+SaveSceneEvent.prototype.onSaveScene = function () {
+ var editor = this.app.editor;
+
+ editor.save();
+};
+
+export default SaveSceneEvent;
\ No newline at end of file
diff --git a/src/utils/MathUtils.js b/src/utils/MathUtils.js
new file mode 100644
index 00000000..60108680
--- /dev/null
+++ b/src/utils/MathUtils.js
@@ -0,0 +1,23 @@
+/**
+ * 精度
+ */
+var NUMBER_PRECISION = 6;
+
+/**
+ * 打包数字
+ * @param {*} key
+ * @param {*} value
+ */
+function parseNumber(key, value) {
+ return typeof value === 'number' ? parseFloat(value.toFixed(NUMBER_PRECISION)) : value;
+}
+
+/**
+ * 数学工具
+ */
+const MathUtils = {
+ NUMBER_PRECISION: NUMBER_PRECISION,
+ parseNumber: parseNumber
+};
+
+export default MathUtils;
\ No newline at end of file