material-editor/src/common/MaterialMouseControl.ts

86 lines
2.3 KiB
TypeScript
Raw Normal View History

2025-04-10 16:37:20 +08:00
import { Vector3 } from 'three';
import type { Viewer } from './Viewer';
/**
* .
*/
export class MaterialEditorCamerControl
{
private Viewer: Viewer;
//State.
private _MouseIsDown: boolean = false;
private _StartPoint: Vector3 = new Vector3();
private _EndPoint = new Vector3();
private pointId: number;
constructor(view: Viewer)
{
this.Viewer = view;
this.initMouseControl();
}
initMouseControl()
{
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);
}
onMouseDown = (event: MouseEvent) =>
{
this.requestPointerLock();
this._MouseIsDown = true;
this._StartPoint.set(event.offsetX, event.offsetY, 0);
};
onMouseUp = (event: MouseEvent) =>
{
this._MouseIsDown = false;
this.exitPointerLock();
};
onMouseMove = (event: MouseEvent) =>
{
event.preventDefault();
if (this._MouseIsDown)
{
this._EndPoint.set(event.offsetX, event.offsetY, 0);
let changeVec: Vector3 = new Vector3();
changeVec.subVectors(this._EndPoint, this._StartPoint);
this._StartPoint.copy(this._EndPoint);
this.Viewer.Rotate(changeVec);
}
};
onMouseWheel = (event: WheelEvent) =>
{
if (event.deltaY < 0)
{
this.Viewer.Zoom(0.6);
}
else if (event.deltaY > 0)
{
this.Viewer.Zoom(1.4);
}
};
requestPointerLock()
{
if (this.Viewer.Renderer.domElement.setPointerCapture)
this.Viewer.Renderer.domElement.setPointerCapture(this.pointId);
}
exitPointerLock()
{
if (this.Viewer.Renderer.domElement.releasePointerCapture && this.pointId !== undefined)
{
try
{
this.Viewer.Renderer.domElement.releasePointerCapture(this.pointId);
}
catch (error) { }
}
}
}