@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
78 lines (77 loc) • 2.46 kB
JavaScript
;
import { ObjectNamedFunction0, ObjectNamedFunction1, ObjectNamedFunction2, ObjectNamedFunction3 } from "./_Base";
import { ref } from "../../core/reactivity/CoreReactivity";
import { ObjectEvent } from "../../core/geometry/Event";
const EVENT = { type: "" };
const lastEventByObject = /* @__PURE__ */ new Map();
function getOrCreateRef(object3D) {
return getObjectRef(object3D) || _createObjectRef(object3D);
}
function getObjectRef(object3D) {
return lastEventByObject.get(object3D);
}
function _createObjectRef(object3D) {
let _ref = lastEventByObject.get(object3D);
if (_ref) {
return _ref;
}
_ref = ref("");
lastEventByObject.set(object3D, _ref);
return _ref;
}
function setLastEventName(object3D, eventName) {
getOrCreateRef(object3D).value = eventName;
}
export function onObjectDispatchFunctionNameByEventName(eventName) {
return `onObjectDispatchEvent_${eventName}`;
}
export class objectDispatchEvent extends ObjectNamedFunction1 {
static type() {
return "objectDispatchEvent";
}
func(object3D, eventName) {
EVENT.type = eventName;
object3D.dispatchEvent(EVENT);
setLastEventName(object3D, eventName);
}
}
export class getObjectLastDispatchedEventName extends ObjectNamedFunction0 {
static type() {
return "getObjectLastDispatchedEventName";
}
func(object3D) {
return getOrCreateRef(object3D).value;
}
}
function addListeners(evaluator, object3D, eventNames, boundListener) {
for (let eventName of eventNames) {
if (boundListener) {
object3D.addEventListener(eventName, boundListener);
}
}
evaluator.onDispose(() => {
for (let eventName of eventNames) {
object3D.removeEventListener(eventName, boundListener);
}
});
}
export class objectAddEventListeners extends ObjectNamedFunction3 {
static type() {
return "objectAddEventListeners";
}
func(object3D, eventNamesList, evaluator, boundListener) {
const eventNames = eventNamesList.split(" ");
addListeners(evaluator, object3D, eventNames, boundListener);
return getOrCreateRef(object3D).value;
}
}
export class objectAddOnBeforeDeleteEventListener extends ObjectNamedFunction2 {
static type() {
return "objectAddOnBeforeDeleteEventListener";
}
func(object3D, evaluator, boundListener) {
const eventNames = [ObjectEvent.BEFORE_DELETE];
addListeners(evaluator, object3D, eventNames, boundListener);
return getOrCreateRef(object3D).value;
}
}