material-editor/src/common/MaterialMouseControl.ts

86 lines
2.4 KiB
TypeScript
Raw Normal View History

2025-04-10 16:37:20 +08:00
import { Vector3 } from 'three';
import type { Viewer } from './Viewer';
/**
* .
*/
2025-04-14 16:37:17 +08:00
export class MaterialEditorCameraControl {
2025-04-10 16:37:20 +08:00
private Viewer: Viewer;
2025-04-14 16:37:17 +08:00
private _movement: Vector3 = new Vector3();
2025-04-10 16:37:20 +08:00
private _MouseIsDown: boolean = false;
private pointId: number;
2025-04-14 16:37:17 +08:00
private _target: Vector3 | null = null;
2025-04-10 16:37:20 +08:00
2025-04-14 16:37:17 +08:00
get Target() { return this._target; }
set Target(val: Vector3 | null) { this._target = val; }
constructor(view: Viewer, target: Vector3 | null = null) {
this.Viewer = view;
this.Target = target;
2025-04-10 16:37:20 +08:00
this.initMouseControl();
}
2025-04-14 16:37:17 +08:00
initMouseControl() {
2025-04-10 16:37:20 +08:00
let el = this.Viewer.Renderer.domElement;
el.addEventListener("pointerdown", (e) => { this.pointId = e.pointerId; }, false);
el.addEventListener("mousedown", this.onMouseDown, false);
el.addEventListener("mousemove", this.onMouseMove, false);
el.addEventListener("mouseup", this.onMouseUp, false);
el.addEventListener('wheel', this.onMouseWheel, false);
}
2025-04-14 16:37:17 +08:00
onMouseDown = (event: MouseEvent) => {
2025-04-10 16:37:20 +08:00
this.requestPointerLock();
this._MouseIsDown = true;
};
2025-04-14 16:37:17 +08:00
onMouseUp = (event: MouseEvent) => {
2025-04-10 16:37:20 +08:00
this._MouseIsDown = false;
this.exitPointerLock();
};
2025-04-14 16:37:17 +08:00
onMouseMove = (event: MouseEvent) => {
2025-04-10 16:37:20 +08:00
event.preventDefault();
2025-04-14 16:37:17 +08:00
if (this._MouseIsDown) {
2025-04-10 16:37:20 +08:00
2025-04-14 16:37:17 +08:00
this._movement.set(event.movementX, event.movementY, 0);
if (this.Target) {
this.Viewer.RotateAround(this._movement, this.Target);
}
else this.Viewer.Rotate(this._movement);
2025-04-10 16:37:20 +08:00
}
};
onMouseWheel = (event: WheelEvent) =>
{
if (event.deltaY < 0)
{
this.Viewer.Zoom(0.6);
}
else if (event.deltaY > 0)
{
this.Viewer.Zoom(1.4);
}
};
2025-04-14 16:37:17 +08:00
requestPointerLock() {
const dom = this.Viewer.Renderer.domElement;
if (dom.setPointerCapture)
dom.setPointerCapture(this.pointId);
if (dom.requestPointerLock)
dom.requestPointerLock();
2025-04-10 16:37:20 +08:00
}
2025-04-14 16:37:17 +08:00
exitPointerLock() {
const dom = this.Viewer.Renderer.domElement;
if (dom.releasePointerCapture && this.pointId !== undefined) {
try {
dom.releasePointerCapture(this.pointId);
2025-04-10 16:37:20 +08:00
}
catch (error) { }
}
2025-04-14 16:37:17 +08:00
if (document.exitPointerLock)
document.exitPointerLock();
2025-04-10 16:37:20 +08:00
}
}