UNPKG

mylingo3d

Version:

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

82 lines (68 loc) 2.23 kB
import { Cancellable } from "@lincode/promiselikes" import { createEffect, GetGlobalState } from "@lincode/reactivity" import { Object3D } from "three" import { timer } from "../../engine/eventLoop" import { onBeforeRender } from "../../events/onBeforeRender" import IEventLoop from "../../interface/IEventLoop" import Appendable from "./Appendable" export default abstract class EventLoopItem<T extends Object3D = Object3D> extends Appendable<T> implements IEventLoop { private _proxy?: EventLoopItem public get proxy() { return this._proxy } public set proxy(val) { //@ts-ignore this._proxy && (this._proxy.__target = undefined) this._proxy = val //@ts-ignore val && (val.__target = this) } public timer(time: number, repeat: number, cb: () => void) { return this.watch(timer(time, repeat, cb)) } public beforeRender(cb: () => void) { return this.watch(onBeforeRender(cb)) } public queueMicrotask(cb: () => void) { queueMicrotask(() => !this.done && cb()) } protected cancellable(cb?: () => void) { return this.watch(new Cancellable(cb)) } protected createEffect( cb: () => (() => void) | void, getStates: Array<GetGlobalState<any> | any> ) { return this.watch(createEffect(cb, getStates)) } private handles?: Map<string, Cancellable> protected cancelHandle( name: string, lazyHandle: undefined | false | "" | (() => Cancellable) ) { const handles = (this.handles ??= new Map<string, Cancellable>()) handles.get(name)?.cancel() if (!lazyHandle) return const handle = lazyHandle() handles.set(name, handle) return handle } public override dispose() { if (this.done) return this super.dispose() if (this.handles) for (const handle of this.handles.values()) handle.cancel() return this } private _onLoop?: () => void public get onLoop() { return this._onLoop } public set onLoop(cb) { this._onLoop = cb this.cancelHandle("onLoop", cb && (() => onBeforeRender(cb))) } }