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
|
|
|
}
|
|
|
|
}
|