UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

111 lines (110 loc) 4.12 kB
"use strict"; import { BaseSceneEventsController } from "./_BaseEventsController"; import { Vector2 } from "three"; import { MouseEventType } from "../../../../core/event/MouseEventType"; import { ACCEPTED_POINTER_EVENT_TYPES, PointerEventType } from "../../../../core/event/PointerEventType"; import { TouchEventType } from "../../../../core/event/TouchEventType"; import { ref } from "../../../../core/reactivity/CoreReactivity"; import { createRaycaster } from "../../../../core/RaycastHelper"; import { CursorHelper } from "../../../../core/event/CursorHelper"; export class PointerEventsController extends BaseSceneEventsController { constructor(dispatcher) { super(dispatcher); this._requireCanvasEventListeners = true; this._cursorHelper = new CursorHelper(); // init to a large value so we don't get a fake intersect // if there was no interaction this._cursor0 = ref(new Vector2(-1e3, -1e3)); // protected _camera: Camera | undefined; this._raycaster0 = ref(createRaycaster()); } type() { return "pointer"; } acceptedEventTypes() { return /* @__PURE__ */ new Set([...ACCEPTED_POINTER_EVENT_TYPES]); } setRaycaster(raycaster) { this._raycaster0.value = raycaster; } processEvent(eventContext) { this._cursorHelper.setCursorForCPU(eventContext, this._cursor0.value); super.processEvent(eventContext); const { viewer, event } = eventContext; if (!(event && viewer)) { console.log("either event or viewer missing"); return; } viewer.raycastersController.setCursor0(this._cursor0.value); viewer.raycastersController.updateRaycasters(); const eventType = event.type; if (eventType == PointerEventType.pointermove || eventType == TouchEventType.touchmove) { return; } const mapForEvent = this._actorEvaluatorsByEventNames.get(eventType); if (!mapForEvent) { return; } const eventEmitter = eventContext.emitter; if (!eventEmitter) { return; } const evaluatorGenerators = mapForEvent.get(eventEmitter); if (!evaluatorGenerators) { return; } if (eventContext.event) { const actorsManager = this.dispatcher.scene.actorsManager; switch (eventType) { case MouseEventType.mousedown: { actorsManager.rayObjectIntersectionMouseClick.onMousedown(eventContext.event); return; } case MouseEventType.dblclick: { actorsManager.rayObjectIntersectionDoubleClick.onDoubleClick(eventContext.event); } case PointerEventType.pointerdown: { actorsManager.rayObjectIntersectionClick.onPointerdown(eventContext.event); actorsManager.rayObjectIntersectionLongPress.onPointerdown(eventContext.event); actorsManager.rayObjectIntersectionPointerdown.onPointerdown(eventContext.event); actorsManager.pointerdown.onPointerdown(eventContext.event); actorsManager.rayObjectIntersectionSwipe.onPointerdown(eventContext.event); return; } case PointerEventType.pointerup: { actorsManager.rayObjectIntersectionPointerup.onPointerup(eventContext.event); actorsManager.pointerup.onPointerup(eventContext.event); return; } case PointerEventType.contextmenu: { actorsManager.rayObjectIntersectionContextmenu.onContextmenu(eventContext.event); return; } case TouchEventType.touchend: { actorsManager.rayObjectIntersectionPointerup.onPointerup(eventContext.event); actorsManager.pointerup.onPointerup(eventContext.event); return; } } } } raycaster() { return this._raycaster0; } cursor() { return this._cursor0; } // camera() { // return this._camera; // } updateRaycast(options) { const pointsParam = this._raycaster0.value.params.Points; if (pointsParam) { pointsParam.threshold = options.pointsThreshold; } const lineParam = this._raycaster0.value.params.Line; if (lineParam) { lineParam.threshold = options.lineThreshold; } } }