+
+
+
+
+
+
+
+
+
+
diff --git a/src/extensions/core/load3d.ts b/src/extensions/core/load3d.ts
index 4110ae357..c091b1bea 100644
--- a/src/extensions/core/load3d.ts
+++ b/src/extensions/core/load3d.ts
@@ -280,7 +280,7 @@ app.registerExtension({
const [oldWidth, oldHeight] = node.size
- node.setSize([Math.max(oldWidth, 300), Math.max(oldHeight, 700)])
+ node.setSize([Math.max(oldWidth, 400), Math.max(oldHeight, 700)])
await nextTick()
@@ -414,7 +414,7 @@ app.registerExtension({
const [oldWidth, oldHeight] = node.size
- node.setSize([Math.max(oldWidth, 300), Math.max(oldHeight, 550)])
+ node.setSize([Math.max(oldWidth, 400), Math.max(oldHeight, 550)])
await nextTick()
diff --git a/src/extensions/core/load3d/Load3d.ts b/src/extensions/core/load3d/Load3d.ts
index 53fb6fd42..ffa560dc6 100644
--- a/src/extensions/core/load3d/Load3d.ts
+++ b/src/extensions/core/load3d/Load3d.ts
@@ -7,7 +7,9 @@ import { GLTF, GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader'
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader'
import { STLLoader } from 'three/examples/jsm/loaders/STLLoader'
+import { App, createApp } from 'vue'
+import Load3DControls from '@/components/load3d/Load3DControls.vue'
import { useToastStore } from '@/stores/toastStore'
class Load3d {
@@ -44,7 +46,9 @@ class Load3d {
cameraSwitcherContainer: HTMLDivElement = {} as HTMLDivElement
gridSwitcherContainer: HTMLDivElement = {} as HTMLDivElement
node: LGraphNode = {} as LGraphNode
- bgColorInput: HTMLInputElement = {} as HTMLInputElement
+
+ protected controlsApp: App | null = null
+ protected controlsContainer: HTMLDivElement
constructor(container: Element | HTMLElement) {
this.scene = new THREE.Scene()
@@ -124,17 +128,39 @@ class Load3d {
this.createViewHelper(container)
- this.createGridSwitcher(container)
-
- this.createCameraSwitcher(container)
+ this.controlsContainer = document.createElement('div')
+ this.controlsContainer.style.position = 'absolute'
+ this.controlsContainer.style.top = '0'
+ this.controlsContainer.style.left = '0'
+ this.controlsContainer.style.width = '100%'
+ this.controlsContainer.style.height = '100%'
+ this.controlsContainer.style.pointerEvents = 'none'
+ this.controlsContainer.style.zIndex = '1'
+ container.appendChild(this.controlsContainer)
- this.createColorPicker(container)
+ this.mountControls()
this.handleResize()
this.startAnimation()
}
+ protected mountControls() {
+ const controlsMount = document.createElement('div')
+ controlsMount.style.pointerEvents = 'auto'
+ this.controlsContainer.appendChild(controlsMount)
+
+ this.controlsApp = createApp(Load3DControls, {
+ backgroundColor: '#282828',
+ showGrid: true,
+ onToggleCamera: () => this.toggleCamera(),
+ onToggleGrid: (show: boolean) => this.toggleGrid(show),
+ onUpdateBackgroundColor: (color: string) => this.setBackgroundColor(color)
+ })
+
+ this.controlsApp.mount(controlsMount)
+ }
+
setNode(node: LGraphNode) {
this.node = node
}
@@ -184,145 +210,6 @@ class Load3d {
this.viewHelper.center = this.controls.target
}
- createGridSwitcher(container: Element | HTMLElement) {
- this.gridSwitcherContainer = document.createElement('div')
- this.gridSwitcherContainer.style.position = 'absolute'
- this.gridSwitcherContainer.style.top = '28px' // 修改这里,让按钮在相机按钮下方
- this.gridSwitcherContainer.style.left = '3px' // 与相机按钮左对齐
- this.gridSwitcherContainer.style.width = '20px'
- this.gridSwitcherContainer.style.height = '20px'
- this.gridSwitcherContainer.style.cursor = 'pointer'
- this.gridSwitcherContainer.style.alignItems = 'center'
- this.gridSwitcherContainer.style.justifyContent = 'center'
- this.gridSwitcherContainer.style.transition = 'background-color 0.2s'
-
- const gridIcon = document.createElement('div')
- gridIcon.innerHTML = `
-