UNPKG

lingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

102 lines 3.74 kB
import { onBeforeRender } from "../../events/onBeforeRender"; import { onAfterRender } from "../../events/onAfterRender"; import { onRender } from "../../events/onRender"; import { onLoop } from "../../events/onLoop"; import { assertExhaustive } from "@lincode/utils"; import { createEffectSystem } from "./createEffectSystem"; const mapTicker = (ticker) => { switch (ticker) { case "beforeRender": return onBeforeRender; case "afterRender": return onAfterRender; case "render": return onRender; case "loop": return onLoop; default: assertExhaustive(ticker); } }; const isQueueMicrotastk = (ticker) => ticker === queueMicrotask; const mapSetupTicker = (ticker) => { if (Array.isArray(ticker)) return (cb) => ticker[0]().then(cb); if (isQueueMicrotastk(ticker)) return ticker; return mapTicker(ticker); }; const placeholderFn = () => { }; export default (name, { data, effect, cleanup, update, updateTicker = "beforeRender", effectTicker = queueMicrotask, beforeTick, afterTick, sort }, userland) => { const queued = new Map(); const [addEffectSystem, deleteEffectSystem] = effect ? createEffectSystem(effect, cleanup, mapSetupTicker(effectTicker)) : [placeholderFn, placeholderFn]; const executeUpdate = update && (beforeTick || afterTick ? sort ? () => { beforeTick?.(queued); for (const target of [...queued.keys()].sort(sort)) update(target, queued.get(target)); afterTick?.(queued); } : () => { beforeTick?.(queued); for (const [target, data] of queued) update(target, data); afterTick?.(queued); } : sort ? () => { for (const target of [...queued.keys()].sort(sort)) update(target, queued.get(target)); } : () => { for (const [target, data] of queued) update(target, data); }); let handle; const onUpdate = update && mapTicker(updateTicker); const startUpdateLoop = update && (() => (handle = onUpdate(executeUpdate))); const executeDelete = (item) => { deleteEffectSystem(item); const deleted = queued.delete(item); deleted && "$deleteSystemSet" in item && item.$deleteSystemSet.delete(deleteSystem); return deleted; }; const deleteSystem = update ? (item) => executeDelete(item) && queued.size === 0 && handle?.cancel() : executeDelete; const executeSetup = (item, initData) => { const _data = initData ?? queued.get(item) ?? (typeof data === "function" ? data(item) : data ? { ...data } : undefined); addEffectSystem(item, _data); return _data; }; const executeAdd = (item, initData) => { const added = !queued.has(item); queued.set(item, executeSetup(item, initData)); added && "$deleteSystemSet" in item && item.$deleteSystemSet.add(deleteSystem); return added; }; const addSystem = update ? (item, initData) => executeAdd(item, initData) && queued.size === 1 && startUpdateLoop() : executeAdd; return { add: addSystem, delete: deleteSystem }; }; //# sourceMappingURL=createInternalSystem.js.map