From f890208885acdb7939aa4df01ac417fbe387b009 Mon Sep 17 00:00:00 2001 From: tengge1 <930372551@qq.com> Date: Sat, 16 Mar 2019 10:14:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=8A=E7=90=83=E5=85=89=E5=B8=AE=E5=8A=A9?= =?UTF-8?q?=E5=99=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ShadowEditor.Web/src/helper/Helpers.js | 2 + .../helper/light/HemisphereLightHelpers.js | 76 +++++++++++++++++++ .../light/VolumeHemisphereLightHelper.js | 42 ++++++++++ 3 files changed, 120 insertions(+) create mode 100644 ShadowEditor.Web/src/helper/light/VolumeHemisphereLightHelper.js diff --git a/ShadowEditor.Web/src/helper/Helpers.js b/ShadowEditor.Web/src/helper/Helpers.js index 31c6909b..177eb6bd 100644 --- a/ShadowEditor.Web/src/helper/Helpers.js +++ b/ShadowEditor.Web/src/helper/Helpers.js @@ -4,6 +4,7 @@ import GridHelper from './GridHelper'; import CameraHelper from './CameraHelper'; import PointLightHelpers from './light/PointLightHelpers'; import DirectionalLightHelpers from './light/DirectionalLightHelpers'; +import HemisphereLightHelpers from './light/HemisphereLightHelpers'; import ViewHelper from './ViewHelper'; import SelectHelper from './SelectHelper'; @@ -21,6 +22,7 @@ function Helpers(app) { new CameraHelper(app), new PointLightHelpers(app), new DirectionalLightHelpers(app), + new HemisphereLightHelpers(app), new SelectHelper(app), new ViewHelper(app), diff --git a/ShadowEditor.Web/src/helper/light/HemisphereLightHelpers.js b/ShadowEditor.Web/src/helper/light/HemisphereLightHelpers.js index e69de29b..d4a963fe 100644 --- a/ShadowEditor.Web/src/helper/light/HemisphereLightHelpers.js +++ b/ShadowEditor.Web/src/helper/light/HemisphereLightHelpers.js @@ -0,0 +1,76 @@ +import BaseHelper from '../BaseHelper'; +import VolumeHemisphereLightHelper from './VolumeHemisphereLightHelper'; + +/** + * 半球光帮助器 + * @param {*} app + */ +function HemisphereLightHelpers(app) { + BaseHelper.call(this, app); + + this.helpers = []; +} + +HemisphereLightHelpers.prototype = Object.create(BaseHelper.prototype); +HemisphereLightHelpers.prototype.constructor = HemisphereLightHelpers; + +HemisphereLightHelpers.prototype.start = function () { + this.app.on(`objectAdded.${this.id}`, this.onObjectAdded.bind(this)); + this.app.on(`objectRemoved.${this.id}`, this.onObjectRemoved.bind(this)); + this.app.on(`objectChanged.${this.id}`, this.onObjectChanged.bind(this)); +}; + +HemisphereLightHelpers.prototype.stop = function () { + this.app.on(`objectAdded.${this.id}`, null); + this.app.on(`objectRemoved.${this.id}`, null); + this.app.on(`objectChanged.${this.id}`, null); +}; + +HemisphereLightHelpers.prototype.onObjectAdded = function (object) { + if (!object.isHemisphereLight) { + return; + } + + var helper = new VolumeHemisphereLightHelper(object, 1); + + this.helpers.push(helper); + + this.app.editor.sceneHelpers.add(helper); +}; + +HemisphereLightHelpers.prototype.onObjectRemoved = function (object) { + if (!object.isHemisphereLight) { + return; + } + + var index = this.helpers.findIndex(n => { + return n.light === object; + }); + + if (index === -1) { + return; + } + + this.app.editor.sceneHelpers.remove(this.helpers[index]); + this.helpers[index].dispose(); + + this.helpers.splice(index, 1); +}; + +HemisphereLightHelpers.prototype.onObjectChanged = function (object) { + if (!object.isHemisphereLight) { + return; + } + + var index = this.helpers.findIndex(n => { + return n.light === object; + }); + + if (index === -1) { + return; + } + + this.helpers[index].update(); +}; + +export default HemisphereLightHelpers; \ No newline at end of file diff --git a/ShadowEditor.Web/src/helper/light/VolumeHemisphereLightHelper.js b/ShadowEditor.Web/src/helper/light/VolumeHemisphereLightHelper.js new file mode 100644 index 00000000..3c6c3bba --- /dev/null +++ b/ShadowEditor.Web/src/helper/light/VolumeHemisphereLightHelper.js @@ -0,0 +1,42 @@ +/** + * 具有一定体积的半球光帮助器 + * @param {*} light + * @param {*} size + * @param {*} color + */ +function VolumeHemisphereLightHelper(light, size, color) { + THREE.HemisphereLightHelper.call(this, light, size, color); + + var geometry = new THREE.SphereBufferGeometry(2, 4, 2); + var material = new THREE.MeshBasicMaterial({ + color: 0xff0000, + visible: false + }); + + this.picker = new THREE.Mesh(geometry, material); + this.picker.name = 'picker'; + this.add(this.picker); +} + +VolumeHemisphereLightHelper.prototype = Object.create(THREE.HemisphereLightHelper.prototype); +VolumeHemisphereLightHelper.prototype.constructor = VolumeHemisphereLightHelper; + +VolumeHemisphereLightHelper.prototype.raycast = function (raycaster, intersects) { + var intersect = raycaster.intersectObject(this.picker)[0]; + if (intersect) { + intersect.object = this.light; + intersects.push(intersect); + } +}; + +VolumeHemisphereLightHelper.prototype.dispose = function () { + this.remove(this.picker); + + this.picker.geometry.dispose(); + this.picker.material.dispose(); + delete this.picker; + + THREE.HemisphereLightHelper.prototype.dispose.call(this); +}; + +export default VolumeHemisphereLightHelper; \ No newline at end of file