UNPKG

@polygonjs/polygonjs

Version:

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

159 lines (158 loc) 5.96 kB
"use strict"; import { SceneEventsController } from "./SceneEventsController"; import { DragEventsController } from "./DragEventsController"; import { KeyboardEventsController } from "./KeyboardEventsController"; import { MouseEventsController } from "./MouseEventsController"; import { PointerEventsController } from "./PointerEventsController"; import { WindowEventsController } from "./WindowEventsController"; import { TouchEventsController } from "./TouchEventsController"; import { SceneConnectionTriggerDispatcher } from "./ConnectionTriggerDispatcher"; import { EventInputType } from "../../../poly/registers/nodes/types/Event"; import { JsType } from "../../../poly/registers/nodes/types/Js"; export class SceneEventsDispatcher { constructor(scene) { this.scene = scene; this._controllers = []; this.sceneEventsController = new SceneEventsController(); this.pointerEventsController = this._createController(PointerEventsController); } registerEvaluatorGenerator(evaluatorGenerator) { const controllers = this._findOrCreateControllerForEvaluator(evaluatorGenerator); if (controllers) { controllers.forEach((c) => c.registerEvaluatorGenerator(evaluatorGenerator)); } } unregisterEvaluatorGenerator(evaluatorGenerator) { const controllers = this._findOrCreateControllerForEvaluator(evaluatorGenerator); if (controllers) { controllers.forEach((c) => c.unregisterEvaluatorGenerator(evaluatorGenerator)); } } // updateControllersFromJsNodes() { // const eventDatas = this.scene.actorsManager.eventDatas(); // eventDatas.forEach((type) => { // this._findOrCreateControllerForEventInputType(type); // }); // } registerEventNode(node) { const controller = this._findOrCreateControllerForEventNode(node); if (controller) { controller.registerEventNode(node); } } unregisterEventNode(node) { const controller = this._findOrCreateControllerForEventNode(node); if (controller) { controller.unregisterEventNode(node); } } updateViewerEventListeners(node) { const controller = this._findOrCreateControllerForEventNode(node); if (controller) { controller.updateViewerEventListeners(); } } traverseControllers(callback) { for (const controller of this._controllers) { callback(controller); } } setRaycaster(raycaster) { this.pointerEventsController.setRaycaster(raycaster); } // processEvent(event_content: EventContext<Event>) { // if (!event_content.event) { // return; // } // for (let controller of this._controllers) { // if (controller.accepts_event(event_content.event)) { // controller.processEvent(event_content); // return; // } // } // } _findOrCreateControllerForEventNode(node) { return this._findOrCreateControllerForEventInputType(node.type()); } _findOrCreateControllerForEvaluator(evaluator) { const eventDatas = evaluator.eventDatas; if (!eventDatas) { return; } const controllers = /* @__PURE__ */ new Set(); eventDatas.forEach((eventData) => { const controller = this._findOrCreateControllerForJsType(eventData.jsType); if (controller) { controllers.add(controller); } }); return controllers; } _findOrCreateControllerForEventInputType(type) { switch (type) { case EventInputType.KEYBOARD: return this.keyboardEventsController; case EventInputType.MOUSE: return this.mouseEventsController; case EventInputType.DRAG: return this.dragEventsController; case EventInputType.POINTER: return this.pointerEventsController; case EventInputType.TOUCH: return this.touchEventsController; case EventInputType.WINDOW: return this.windowEventsController; } } _findOrCreateControllerForJsType(jsType) { switch (jsType) { case JsType.CURSOR: case JsType.ON_OBJECT_CLICK: case JsType.ON_OBJECT_CONTEXT_MENU: case JsType.ON_OBJECT_HOVER: case JsType.ON_OBJECT_LONG_PRESS: case JsType.ON_OBJECT_MOUSE_CLICK: case JsType.ON_OBJECT_POINTERDOWN: case JsType.ON_OBJECT_POINTERUP: case JsType.ON_POINTERDOWN: case JsType.ON_POINTERUP: case JsType.RAY_FROM_CURSOR: return this.pointerEventsController; case JsType.ON_KEY: case JsType.ON_KEYDOWN: case JsType.ON_KEYPRESS: case JsType.ON_KEYUP: return this.keyboardEventsController; } console.warn(`no event controller defined for jsType`, jsType); } get keyboardEventsController() { return this._keyboardEventsController = this._keyboardEventsController || this._createController(KeyboardEventsController); } get mouseEventsController() { return this._mouseEventsController = this._mouseEventsController || this._createController(MouseEventsController); } get dragEventsController() { return this._dragEventsController = this._dragEventsController || this._createController(DragEventsController); } // get pointerEventsController(): PointerEventsController { // return (this._pointerEventsController = // this._pointerEventsController || this._createController(PointerEventsController)); // } get windowEventsController() { return this._windowEventsController = this._windowEventsController || this._createController(WindowEventsController); } get touchEventsController() { return this._touchEventsController = this._touchEventsController || this._createController(TouchEventsController); } _createController(eventConstructor) { const controller = new eventConstructor(this); if (!this._controllers.includes(controller)) { this._controllers.push(controller); } return controller; } get connectionTriggerDispatcher() { return this._connectionTriggerDispatcher = this._connectionTriggerDispatcher || new SceneConnectionTriggerDispatcher(); } }