Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/scripts/camera.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export * from '../../src/cameras/OrthographicCameraAuto';
export * from '../../src/cameras/PerspectiveCameraAuto';
export * from '../../src/camera/OrthographicCameraAuto';
export * from '../../src/camera/PerspectiveCameraAuto';
2 changes: 1 addition & 1 deletion docs/scripts/events.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export * from '../../src/events/CursorManager';
export * from '../../src/events/Default';
export * from '../../src/events/InteractionDefault';
export * from '../../src/events/DragAndDropManager';
export * from '../../src/events/Events';
export * from '../../src/events/EventsDispatcher';
Expand Down
1 change: 1 addition & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export default [
'@typescript-eslint/no-dynamic-delete': 'off',
'@typescript-eslint/no-invalid-void-type': 'off',
'@typescript-eslint/no-this-alias': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/explicit-function-return-type': [
'error', {
allowExpressions: true
Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
</head>

<body>
<script type="module" src="example.ts"></script>
<script type="module" src="./examples/example.ts"></script>
</body>

</html>
File renamed without changes.
110 changes: 0 additions & 110 deletions src/binding/Binding.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export class OrthographicCameraAuto extends OrthographicCamera {
* @param near Camera frustum near plane. Default `0.1`.
* @param far Camera frustum far plane. Default `2000`.
*/
constructor(size = 2, fixedWidth = true, near?: number, far?: number) {
constructor(size = 2, fixedWidth = true, near = 0.1, far = 2000) {
super(-1, 1, 1, -1, near, far);
this._size = size;
this._fixedWidth = fixedWidth;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export class PerspectiveCameraAuto extends PerspectiveCamera {
* @param near Camera frustum near plane distance. Default `0.1`.
* @param far Camera frustum far plane distance. Default `2000`.
*/
constructor(fov?: number, near?: number, far?: number) {
constructor(fov = 50, near = 0.1, far = 2000) {
super(fov, undefined, near, far);

this.on('viewportresize', (e) => {
Expand Down
44 changes: 22 additions & 22 deletions src/events/CursorManager.ts
Original file line number Diff line number Diff line change
@@ -1,52 +1,52 @@
import { Object3D } from 'three';
import { InstancedMesh2 } from '../instancedMesh/InstancedMesh2.js';

// TODO: add BatchedMesh and InstancedMesh support
// TODO: add default cusor config

/** Valid cursor values based on the CSS cursor property. */
export type CursorsKeys = 'auto' | 'default' | 'none' | 'context-menu' | 'help' | 'pointer' | 'progress' | 'wait' |
'cell' | 'crosshair' | 'text' | 'vertical-text' | 'alias' | 'copy' | 'move' | 'no-drop' | 'not-allowed' | 'grab' | 'grabbing' |
'all-scroll' | 'col-resize' | 'row-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' |
'ne-resize' | 'nw-resize' | 'se-resize' | 'sw-resize' | 'ew-resize' | 'ns-resize' | 'nesw-resize' | 'nwse-resize' | 'zoom-in' | 'zoom-out';

const cursorSet = new Set([
/** Represents a cursor, either by a CSS cursor key or a URL. */
export type Cursor = CursorsKeys | String;

const cursorSet = new Set<Cursor>([
'auto', 'default', 'none', 'context-menu', 'help', 'pointer', 'progress', 'wait',
'cell', 'crosshair', 'text', 'vertical-text', 'alias', 'copy', 'move', 'no-drop', 'not-allowed', 'grab', 'grabbing',
'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize',
'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out'
]);

/** Represents a cursor, either by a CSS cursor key or a URL. */
export type Cursor = CursorsKeys | String;

/** @internal */
export class CursorHandler {
public enabled = true;
private _cursor: Cursor;
private _domElement: HTMLCanvasElement;
protected readonly _domElement: HTMLCanvasElement;
protected _currentCursor: Cursor | null = null;

constructor(domElement: HTMLCanvasElement) {
this._domElement = domElement;
}

public update(objDragged: Object3D, objHovered: Object3D, objDropTarget: Object3D): void {
if (!this.enabled || !objHovered) return;
const cursor = this.getCursor(objDragged, objHovered, objDropTarget);
if (cursor !== this._cursor) {
this._cursor = cursor;
if (cursorSet.has(cursor as string)) {
this._domElement.style.cursor = cursor as string;
} else {
this._domElement.style.cursor = `url(${cursor}), default`;
}
public update(dragged: Object3D, hovered: Object3D, dropTarget: Object3D): void {
if (!this.enabled || !hovered) return;

const cursor = this.getCursor(dragged, hovered, dropTarget);

if (cursor !== this._currentCursor) {
this._currentCursor = cursor;
const cursorStyle = cursorSet.has(cursor) ? cursor as string : `url(${cursor}), default`;
this._domElement.style.cursor = cursorStyle;
}
}

private getCursor(objDragged: Object3D, objHovered: Object3D, objDropTarget: Object3D): Cursor {
if (objDropTarget) return objDropTarget.cursorDrop ?? 'alias';
if (objDropTarget) return objDropTarget.cursorDrop ?? 'copy';
if (objDragged) return objDragged.cursorDrag ?? 'grabbing';
if (objHovered.cursor) return objHovered.cursor;
if ((objHovered as InstancedMesh2).isInstancedMesh2) {
if (!(objHovered as InstancedMesh2).__enabledStateHovered) return 'default';
} else if (!objHovered.enabledState) return 'default';
return objHovered.draggable ? 'grab' : 'pointer';
if (!objHovered.enabledState) return 'default';
if (objHovered.draggable) return 'grab';
return objHovered.isInteractable ? 'pointer' : 'default';
}
}
11 changes: 0 additions & 11 deletions src/events/Default.ts

This file was deleted.

14 changes: 7 additions & 7 deletions src/events/DragAndDropManager.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Plane, Matrix4, Vector3, Raycaster, Camera, Object3D } from 'three';
import { DragEventExt, InteractionEvents, IntersectionExt } from './Events.js';
import { EzDragEvent, EzInteractionEvents, EzIntersection } from './Events.js';
import { InstancedMesh2 } from '../instancedMesh/InstancedMesh2.js';
import { InstancedMeshEntity } from '../instancedMesh/InstancedMeshEntity.js';

Expand All @@ -20,7 +20,7 @@ export class DragAndDropManager {
private _dataTransfer: { [x: string]: any };
private _lastDropTarget: Object3D;
private _raycaster: Raycaster;
private _startIntersection: IntersectionExt;
private _startIntersection: EzIntersection;

public get target(): Object3D { return this._target; }
public get findDropTarget(): boolean { return this._target.findDropTarget; }
Expand All @@ -38,7 +38,7 @@ export class DragAndDropManager {
return false;
}

public performDrag(event: PointerEvent, camera: Camera, dropTargetIntersection: IntersectionExt): void {
public performDrag(event: PointerEvent, camera: Camera, dropTargetIntersection: EzIntersection): void {
if (!event.isPrimary) return;

this._plane.setFromNormalAndCoplanarPoint(camera.getWorldDirection(this._plane.normal), this._worldPosition.setFromMatrixPosition(this._targetMatrixWorld));
Expand All @@ -62,7 +62,7 @@ export class DragAndDropManager {
this.dropTargetEvent(event, dropTargetIntersection);
}

public initDrag(event: PointerEvent, target: Object3D, instanceId: number, intersection: IntersectionExt): void {
public initDrag(event: PointerEvent, target: Object3D, instanceId: number, intersection: EzIntersection): void {
if (this.isDragButton(event) && target?.draggable) {
if (instanceId >= 0) {
if ((target as InstancedMesh2).isInstancedMesh2 && (target as InstancedMesh2).__enabledStateHovered) {
Expand Down Expand Up @@ -146,15 +146,15 @@ export class DragAndDropManager {
this._lastDropTarget = undefined;
}

private trigger(type: keyof InteractionEvents, event: PointerEvent, target: Object3D, cancelable: boolean, position?: Vector3, relatedTarget?: Object3D, intersection?: IntersectionExt): DragEventExt {
private trigger(type: keyof EzInteractionEvents, event: PointerEvent, target: Object3D, cancelable: boolean, position?: Vector3, relatedTarget?: Object3D, intersection?: EzIntersection): EzDragEvent {
if (target) {
const dragEvent = new DragEventExt(event, cancelable, this._dataTransfer, position, relatedTarget, intersection);
const dragEvent = new EzDragEvent(event, cancelable, this._dataTransfer, position, relatedTarget, intersection);
target.__eventsDispatcher.dispatchDOMAncestor(type, dragEvent);
return dragEvent;
}
}

public dropTargetEvent(event: PointerEvent, dropTargetIntersection: IntersectionExt): void {
public dropTargetEvent(event: PointerEvent, dropTargetIntersection: EzIntersection): void {
if (this.findDropTarget) {
const dropTarget = dropTargetIntersection?.object;
const lastDropTarget = this._lastDropTarget;
Expand Down
Loading
Loading