diff --git a/packages/sdk/lib/core/viewer/Viewer.ts b/packages/sdk/lib/core/viewer/Viewer.ts index 57e7671..023632a 100644 --- a/packages/sdk/lib/core/viewer/Viewer.ts +++ b/packages/sdk/lib/core/viewer/Viewer.ts @@ -18,7 +18,7 @@ import { TilesManage, } from "./modules"; import {ShaderMaterialManager} from "@/core/shaderMaterial/ShaderMaterialManager"; -import {deepAssign, getMousePosition, isEmptyObject, isNil,createDivContainer} from "@/utils"; +import {deepAssign, deepEqual, getMousePosition, isEmptyObject, isNil, createDivContainer} from "@/utils"; import {useDispatchSignal} from "@/hooks"; import { AddObjectCommand, @@ -184,7 +184,6 @@ export default class Viewer extends THREE.EventDispatcher { public pmremGenerator: THREE.PMREMGenerator | null = null; public pathtracer: ViewerPathTracer | undefined; public modules: ViewerModules; - public showSceneHelpers: boolean = true; public css2DRenderer: CSS2DRenderer = new CSS2DRenderer(); public css3DRenderer: CSS3DRenderer = new CSS3DRenderer(); @@ -251,20 +250,26 @@ export default class Viewer extends THREE.EventDispatcher { } /** - * 获取是否启用编辑态 + * 获取编辑态配置 */ - get enableEdit(): boolean { - return this.options.enableEdit || false; + get edit(): IViewerEdit { + return this.options.edit as IViewerEdit; } /** - * 设置编辑态是否启用 - * @param enable + * 设置编辑态配置 + * @param config */ - set enableEdit(enable: boolean) { - if (enable === this.enableEdit) return; + set edit(config: IViewerEdit) { + if(!config) return; + + if (deepEqual(config,this.options.edit)) return; + + deepAssign(this.options.edit,config); + + if (this.options.edit?.gizmo) { + if(this.modules.transformControls) return; - if (enable) { let objectPositionOnDown = new THREE.Vector3(); let objectRotationOnDown = new THREE.Euler(); let objectScaleOnDown = new THREE.Vector3(); @@ -327,6 +332,10 @@ export default class Viewer extends THREE.EventDispatcher { this.modules.transformControls = undefined; } + + // TODO 处理 this.options.edit?.helpers,以兼容只显示gizmo不显示helpers的情况 + + this.render(); } /** @@ -492,7 +501,7 @@ export default class Viewer extends THREE.EventDispatcher { tilesManage: new TilesManage(this.scene,this.camera,this.renderer), } - if (this.enableEdit) { + if (this.edit?.enabled) { let objectPositionOnDown = new THREE.Vector3(); let objectRotationOnDown = new THREE.Euler(); let objectScaleOnDown = new THREE.Vector3(); @@ -1091,7 +1100,7 @@ export default class Viewer extends THREE.EventDispatcher { // 非默认相机不渲染辅助 if (this.camera === App.viewportCamera) { - if (this.showSceneHelpers) this.renderer.render(this.sceneHelpers, this.camera); + if (this.options.edit?.enabled) this.renderer.render(this.sceneHelpers, this.camera); } // css2d 在sceneHelpers内 diff --git a/packages/sdk/lib/core/viewer/ViewerOptions.ts b/packages/sdk/lib/core/viewer/ViewerOptions.ts index d110859..a24e2f5 100644 --- a/packages/sdk/lib/core/viewer/ViewerOptions.ts +++ b/packages/sdk/lib/core/viewer/ViewerOptions.ts @@ -3,8 +3,15 @@ export const ViewerOptions = (): IViewerSetting => ({ container: undefined, // 场景背景及环境贴图 hdr: undefined, - // 是否启用编辑模式 - enableEdit: false, + // 编辑模式 + edit: { + // 是否启用 + enabled: false, + // 是否显示辅助线 + helpers: true, + // 是否现实gizmo三坐标轴 + gizmo: true + }, // 是否启用脚本,自动运行脚本 enableScript: true, // 请求相关 @@ -13,6 +20,7 @@ export const ViewerOptions = (): IViewerSetting => ({ }, // 场景内网格 grid:{ + // 是否启用 enabled: true, // 网格颜色 color: 0x999999, diff --git a/packages/sdk/lib/core/viewer/modules/Signals.ts b/packages/sdk/lib/core/viewer/modules/Signals.ts index 8714e26..6ebc851 100644 --- a/packages/sdk/lib/core/viewer/modules/Signals.ts +++ b/packages/sdk/lib/core/viewer/modules/Signals.ts @@ -49,7 +49,6 @@ export class Signals { useAddSignal("sceneResize", this.sceneResize.bind(this)); useAddSignal("showGridChanged", this.showGridChanged.bind(this)); - useAddSignal("showHelpersChanged", this.showHelpersChanged.bind(this)); useAddSignal("scriptAdded",this.scriptAdded.bind(this)); useAddSignal("scriptRemoved",this.scriptRemoved.bind(this)); @@ -454,19 +453,6 @@ export class Signals { this.render(); } - /** - * 显示场景辅助线等 - * @param showHelpers - */ - showHelpersChanged(showHelpers:boolean){ - this.viewer.showSceneHelpers = showHelpers; - if(this.viewer.modules.transformControls){ - this.viewer.modules.transformControls.enabled = showHelpers; - } - - this.render(); - } - /** * 添加脚本 */ diff --git a/packages/sdk/lib/utils/common/object.ts b/packages/sdk/lib/utils/common/object.ts index 6e078a0..9faded2 100644 --- a/packages/sdk/lib/utils/common/object.ts +++ b/packages/sdk/lib/utils/common/object.ts @@ -16,4 +16,50 @@ export function deepAssign(target, source) { } } } +} + +/** + * 深度比较两个值是否相等 + * @param {any} a + * @param {any} b + * @returns {boolean} + */ +export function deepEqual(a, b) { + // 引用相同 + if (a === b) return true; + + // 排除 null + if (a === null || b === null) return false; + + // 类型不同 + if (typeof a !== typeof b) return false; + + // 处理日期对象 + if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime(); + } + + // 处理数组 + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) return false; + for (let i = 0; i < a.length; i++) { + if (!deepEqual(a[i], b[i])) return false; + } + return true; + } + + // 处理对象 + if (typeof a === 'object' && typeof b === 'object') { + const keysA = Object.keys(a); + const keysB = Object.keys(b); + if (keysA.length !== keysB.length) return false; + for (let key of keysA) { + if (!Object.prototype.hasOwnProperty.call(b, key)) return false; + if (!deepEqual(a[key], b[key])) return false; + } + return true; + } + + // 其他基本类型 + return false; } \ No newline at end of file diff --git a/packages/sdk/lib/utils/signals/signalRegister.ts b/packages/sdk/lib/utils/signals/signalRegister.ts index 00b39c5..ec4d389 100644 --- a/packages/sdk/lib/utils/signals/signalRegister.ts +++ b/packages/sdk/lib/utils/signals/signalRegister.ts @@ -78,7 +78,6 @@ const appSignals: SignalRegister = { scriptRemoved: new Signal(), showGridChanged: new Signal(), - showHelpersChanged: new Signal(), historyChanged: new Signal(), // 场景主相机变更 diff --git a/packages/sdk/types/setting/ViewerSetting.d.ts b/packages/sdk/types/setting/ViewerSetting.d.ts index 5e71908..3966f60 100644 --- a/packages/sdk/types/setting/ViewerSetting.d.ts +++ b/packages/sdk/types/setting/ViewerSetting.d.ts @@ -1,3 +1,9 @@ +declare interface IViewerEdit { + enabled:boolean; + helpers: boolean; + gizmo:boolean; +} + declare interface IViewerGrid { enabled:boolean; color: number | string; @@ -25,7 +31,7 @@ declare interface IViewerRequest { declare interface IViewerSetting { container?: HTMLElement; hdr?: string; - enableEdit?: boolean; + edit?: IViewerEdit; enableScript?: boolean; request?:IViewerRequest; grid:IViewerGrid;