You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

83 lines
2.1 KiB

import type Viewport from '@/core/engine/Viewport'
import * as THREE from 'three'
let pmFn, otFn, lvFn
/**
* 鼠标移动时,将鼠标位置的坐标转换为设计图上的坐标,并设置到 designer.mousePos 属性中
*/
export default class MouseMoveInspect {
viewport: Viewport
canvas: HTMLCanvasElement
constructor() {
}
init(viewport: Viewport) {
this.viewport = viewport
this.canvas = this.viewport.renderer.domElement as HTMLCanvasElement
pmFn = this.mouseMove.bind(this)
otFn = this.mouseLv.bind(this)
lvFn = this.mouseLv.bind(this)
this.canvas.addEventListener('pointermove', pmFn)
this.canvas.addEventListener('pointerout', otFn)
this.canvas.addEventListener('mouseleave', lvFn)
}
dispose() {
this.canvas.removeEventListener('pointermove', pmFn)
pmFn = undefined
this.canvas.removeEventListener('pointerout', otFn)
otFn = undefined
this.canvas.removeEventListener('mouseleave', lvFn)
lvFn = undefined
}
mouseLv(event: MouseEvent) {
this.viewport.state.mouse.x = NaN
this.viewport.state.mouse.z = NaN
window['CurrentMouseInfo'] = {
x: NaN,
z: NaN,
isShiftKey: false,
isCtrlKey: false,
isAltKey: false,
isMetaKey: false
}
}
mouseMove = _.throttle(function(this: MouseMoveInspect, event: MouseEvent) {
const pointv = new THREE.Vector2()
pointv.x = event.offsetX / this.viewport.renderer.domElement.offsetWidth
pointv.y = event.offsetY / this.viewport.renderer.domElement.offsetHeight
const mouse = new THREE.Vector2()
mouse.set((pointv.x * 2) - 1, -(pointv.y * 2) + 1)
// 当前鼠标所在的点
const point = this.viewport.getClosestIntersection(event)
if (!point) {
return
}
this.viewport.state.mouse.x = point.x
this.viewport.state.mouse.z = point.z
window['CurrentMouseInfo'] = {
viewport: this.viewport,
x: point.x,
z: point.z,
isShiftKey: event.shiftKey,
isCtrlKey: event.ctrlKey,
isAltKey: event.altKey,
isMetaKey: event.metaKey,
mouse: mouse
}
}, 1)
animate(): void {
}
}