@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
207 lines (206 loc) • 8.9 kB
JavaScript
"use strict";
import { ActorManualTriggersController } from "./actors/ManualTriggersController";
import { ActorKeyboardEventsController } from "./actors/ActorsKeyboardEventsController";
import { JsType } from "../../poly/registers/nodes/types/Js";
import { EVALUATOR_METHOD_NAMES } from "../../nodes/js/code/assemblers/actor/ActorEvaluator";
import { AssemblerControllerNode } from "../../nodes/js/code/Controller";
import { hierarchyTraverse } from "../../../core/geometry/util/HierarchyTraverse";
import { Poly } from "../../Poly";
import { RayObjectIntersectionsHoverController } from "./actors/rayObjectIntersection/RayObjectIntersectionsHoverController";
import { RayObjectIntersectionsPointerdownController } from "./actors/rayObjectIntersection/RayObjectIntersectionsPointerdownController";
import { RayObjectIntersectionsPointerupController } from "./actors/rayObjectIntersection/RayObjectIntersectionsPointerupController";
import { RayObjectIntersectionsClickController } from "./actors/rayObjectIntersection/RayObjectIntersectionsClickController";
import { RayObjectIntersectionsMouseClickController } from "./actors/rayObjectIntersection/RayObjectIntersectionsMouseClickController";
import { RayObjectIntersectionsContextmenuController } from "./actors/rayObjectIntersection/RayObjectIntersectionsContextmenuController";
import { RayObjectIntersectionsLongPressController } from "./actors/rayObjectIntersection/RayObjectIntersectionsLongPressController";
import { RayObjectIntersectionsSwipeController } from "./actors/rayObjectIntersection/RayObjectIntersectionsSwipeController";
import { PointerdownController } from "./actors/rayObjectIntersection/PointerdownController";
import { PointerupController } from "./actors/rayObjectIntersection/PointerupController";
import { RayObjectIntersectionsDoubleClickController } from "./actors/rayObjectIntersection/RayObjectIntersectionsDoubleClickController";
const ACTOR_BUILDER_NODE_IDS_KEY = "actorBuilderNodeIds";
var EventHandlerType = /* @__PURE__ */ ((EventHandlerType2) => {
EventHandlerType2["instant"] = "instant";
EventHandlerType2["onTick"] = "onTick";
return EventHandlerType2;
})(EventHandlerType || {});
const EVENT_MAP_LOGIC = {
[JsType.ON_KEY]: "onTick" /* onTick */,
[JsType.ON_KEYDOWN]: "onTick" /* onTick */,
[JsType.ON_KEYPRESS]: "onTick" /* onTick */,
[JsType.ON_KEYUP]: "onTick" /* onTick */,
// [JsType.ON_MANUAL_TRIGGER]: EventHandlerType.instant,
[JsType.ON_MAPBOX_CAMERA_MOVE]: "onTick" /* onTick */,
[JsType.ON_MAPBOX_CAMERA_MOVE_START]: "onTick" /* onTick */,
[JsType.ON_MAPBOX_CAMERA_MOVE_END]: "onTick" /* onTick */,
[JsType.ON_OBJECT_ATTRIBUTE_UPDATE]: "onTick" /* onTick */,
// ['onClick']: EventHandlerType.onTick,
["onContextMenu"]: "onTick" /* onTick */,
[JsType.ON_OBJECT_DISPATCH_EVENT]: "instant" /* instant */,
// TODO
["onPointermove"]: "onTick" /* onTick */,
// [JsType.ON_OBJECT_POINTERDOWN]: EventHandlerType.onTick,
// [JsType.ON_OBJECT_POINTERUP]: EventHandlerType.onTick,
[JsType.ON_PERFORMANCE_CHANGE]: "instant" /* instant */,
[JsType.ON_POINTERDOWN]: "onTick" /* onTick */,
[JsType.ON_POINTERUP]: "onTick" /* onTick */,
[JsType.ON_SCENE_PAUSE]: "instant" /* instant */,
[JsType.ON_SCENE_PLAY]: "instant" /* instant */,
[JsType.ON_SCENE_RESET]: "instant" /* instant */,
[JsType.ON_TICK]: "onTick" /* onTick */,
[JsType.ON_VIDEO_EVENT]: "onTick" /* onTick */,
[JsType.ON_WEBXR_CONTROLLER_EVENT]: "onTick" /* onTick */
// TODO
};
const ON_TICK_METHOD_NAMES = new Set(
EVALUATOR_METHOD_NAMES.filter((methodName) => EVENT_MAP_LOGIC[methodName] == "onTick" /* onTick */)
);
const INSTANT_METHOD_NAMES = new Set(
EVALUATOR_METHOD_NAMES.filter((methodName) => EVENT_MAP_LOGIC[methodName] == "instant" /* instant */)
);
if (0 + 0) {
console.log({ ON_TICK_METHOD_NAMES, INSTANT_METHOD_NAMES });
}
export class ActorBuilderNode extends AssemblerControllerNode {
}
export class ActorsManager {
constructor(scene) {
this.scene = scene;
this.rayObjectIntersectionClick = new RayObjectIntersectionsClickController(this);
this.rayObjectIntersectionDoubleClick = new RayObjectIntersectionsDoubleClickController(this);
this.rayObjectIntersectionMouseClick = new RayObjectIntersectionsMouseClickController(this);
this.rayObjectIntersectionContextmenu = new RayObjectIntersectionsContextmenuController(this);
this.rayObjectIntersectionHover = new RayObjectIntersectionsHoverController(this);
this.rayObjectIntersectionLongPress = new RayObjectIntersectionsLongPressController(this);
this.rayObjectIntersectionPointerdown = new RayObjectIntersectionsPointerdownController(this);
this.rayObjectIntersectionPointerup = new RayObjectIntersectionsPointerupController(this);
this.rayObjectIntersectionSwipe = new RayObjectIntersectionsSwipeController(this);
this.pointerdown = new PointerdownController(this);
this.pointerup = new PointerupController(this);
/*
*
* PRIVATE METHODS
*
*/
// tick
this._onEventTickBound = this._onEventTick.bind(this);
// reset
this._onEventSceneResetBound = this._onEventSceneReset.bind(this);
// play
this._onEventScenePlayBound = this._onEventScenePlay.bind(this);
// pause
this._onEventScenePauseBound = this._onEventScenePause.bind(this);
// performanceChange
this._onEventPerformanceChangeBound = this._onEventPerformanceChange.bind(this);
}
registerEvaluatorGenerator(evaluatorGenerator) {
this.scene.eventsDispatcher.registerEvaluatorGenerator(evaluatorGenerator);
}
unregisterEvaluatorGenerator(evaluatorGenerator) {
this.scene.eventsDispatcher.unregisterEvaluatorGenerator(evaluatorGenerator);
}
assignActorBuilder(object, node) {
let ids = this.objectActorNodeIds(object);
if (!ids) {
ids = [];
object.userData[ACTOR_BUILDER_NODE_IDS_KEY] = ids;
}
const id = node.graphNodeId();
if (!ids.includes(id)) {
ids.push(id);
}
Poly.onObjectsAddRemoveHooks.assignOnRemoveHookHandler(object, node);
}
objectActorNodeIds(object) {
return object.userData[ACTOR_BUILDER_NODE_IDS_KEY];
}
/*
*
* EVENTS
*
*/
get keyboardEventsController() {
return this._keyboardEventsController = this._keyboardEventsController || new ActorKeyboardEventsController(this);
}
get manualTriggerController() {
return this._manualTriggerController = this._manualTriggerController || new ActorManualTriggersController(this);
}
/*
*
* PUBLIC METHODS
*
*/
tick() {
var _a;
this.rayObjectIntersectionHover.process();
(_a = this._keyboardEventsController) == null ? void 0 : _a.runTriggers();
hierarchyTraverse(this.scene.threejsScene(), (object) => {
this.triggerEventNodes(object, "onPointermove");
this._onEventTickBound(object);
});
}
runOnEventSceneReset() {
this._onEventSceneResetTraverse();
}
runOnEventScenePlay() {
this._onEventScenePlayTraverse();
}
runOnEventScenePause() {
this._onEventScenePauseTraverse();
}
runOnEventPerformanceChange() {
this._onEventPerformanceChangeTraverse();
}
_onEventTick(object) {
this.triggerEventNodes(object, JsType.ON_TICK);
}
_onEventSceneReset(object) {
this.triggerEventNodes(object, JsType.ON_SCENE_RESET);
}
_onEventSceneResetTraverse() {
hierarchyTraverse(this.scene.threejsScene(), this._onEventSceneResetBound);
}
_onEventScenePlay(object) {
this.triggerEventNodes(object, JsType.ON_SCENE_PLAY);
}
_onEventScenePlayTraverse() {
hierarchyTraverse(this.scene.threejsScene(), this._onEventScenePlayBound);
}
_onEventScenePause(object) {
this.triggerEventNodes(object, JsType.ON_SCENE_PAUSE);
}
_onEventScenePauseTraverse() {
hierarchyTraverse(this.scene.threejsScene(), this._onEventScenePauseBound);
}
_onEventPerformanceChange(object) {
this.triggerEventNodes(object, JsType.ON_PERFORMANCE_CHANGE);
}
_onEventPerformanceChangeTraverse() {
hierarchyTraverse(this.scene.threejsScene(), this._onEventPerformanceChangeBound);
}
//
triggerEventNodes(object, methodName) {
const nodeIds = this.objectActorNodeIds(object);
if (!nodeIds) {
return;
}
for (const nodeId of nodeIds) {
if (object.parent == null) {
return;
}
const node = this.scene.graph.nodeFromId(nodeId);
if (node) {
this.triggerEventNode(node, object, methodName);
}
}
}
triggerEventNode(node, object, methodName) {
const evaluatorGenerator = node.compilationController.evaluatorGenerator();
this._triggerEvaluatorGenerator(evaluatorGenerator, object, methodName);
}
_triggerEvaluatorGenerator(evaluatorGenerator, object, methodName) {
const evaluator = evaluatorGenerator.findOrCreateEvaluator(object);
if (evaluator[methodName]) {
evaluator[methodName]();
}
}
}