@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
66 lines (65 loc) • 2.15 kB
JavaScript
"use strict";
import { BaseSceneEventsController } from "./_BaseEventsController";
import { ACCEPTED_KEYBOARD_EVENT_TYPES, KeyboardEventType } from "../../../../core/event/KeyboardEventType";
import { JsType } from "../../../poly/registers/nodes/types/Js";
const methodNameByEventType = {
[KeyboardEventType.keydown]: [JsType.ON_KEY, JsType.ON_KEYDOWN],
[KeyboardEventType.keypress]: [JsType.ON_KEYPRESS],
[KeyboardEventType.keyup]: [JsType.ON_KEY, JsType.ON_KEYUP]
};
export class KeyboardEventsController extends BaseSceneEventsController {
constructor(dispatcher) {
super(dispatcher);
this._requireCanvasEventListeners = true;
this._currentEvents = [];
this._lastProcessedFrame = -1;
this.timeController = this.dispatcher.scene.timeController;
this.keyboardEventsController = this.dispatcher.scene.actorsManager.keyboardEventsController;
}
type() {
return "keyboard";
}
acceptedEventTypes() {
return new Set(ACCEPTED_KEYBOARD_EVENT_TYPES.map((n) => `${n}`));
}
currentEvents() {
return this._currentEvents;
}
processEvent(eventContext) {
super.processEvent(eventContext);
const { event } = eventContext;
if (!event) {
return;
}
const eventType = event.type;
const mapForEvent = this._actorEvaluatorsByEventNames.get(eventType);
if (!mapForEvent) {
return;
}
if (this.timeController.playing()) {
const frame = this.timeController.frame();
if (frame != this._lastProcessedFrame) {
this._lastProcessedFrame = frame;
this._currentEvents.length = 0;
}
this._currentEvents.push(event);
} else {
this._currentEvents[0] = event;
}
const eventEmitter = eventContext.emitter;
if (!eventEmitter) {
return;
}
const evaluatorGenerators = mapForEvent.get(eventEmitter);
if (!evaluatorGenerators) {
return;
}
const methodNames = methodNameByEventType[eventType];
if (!methodNames) {
return;
}
for (const methodName of methodNames) {
this.keyboardEventsController.addTriggeredEvaluators(evaluatorGenerators, methodName);
}
}
}