UNPKG

tikki

Version:

Minimalistic game/animation loop orchestrator

2 lines (1 loc) 2.9 kB
import{Emitter as m,EmitterDedupe as p}from"eventti";var _=p,o=class{constructor(e={}){let{phases:t=[],dedupe:r,getId:s}=e;this._phases=t,this._emitter=new m({getId:s,dedupe:r}),this._queue=[],this.tick=this.tick.bind(this),this._getListeners=this._emitter._getListeners.bind(this._emitter)}get phases(){return this._phases}set phases(e){this._phases=e}get dedupe(){return this._emitter.dedupe}set dedupe(e){this._emitter.dedupe=e}get getId(){return this._emitter.getId}set getId(e){this._emitter.getId=e}tick(...e){this._assertEmptyQueue(),this._fillQueue(),this._processQueue(...e)}on(e,t,r){return this._emitter.on(e,t,r)}once(e,t,r){return this._emitter.once(e,t,r)}off(e,t){return this._emitter.off(e,t)}count(e){return this._emitter.listenerCount(e)}_assertEmptyQueue(){if(this._queue.length)throw new Error("Ticker: Can't tick before the previous tick has finished!")}_fillQueue(){let e=this._queue,t=this._phases,r=this._getListeners,s=0,a=t.length,n;for(;s<a;s++)n=r(t[s]),n&&e.push(n);return e}_processQueue(...e){let t=this._queue,r=t.length;if(!r)return;let s=0,a=0,n,c;for(;s<r;s++)for(n=t[s],a=0,c=n.length;a<c;a++)n[a](...e);t.length=0}};function u(i=60){if(typeof requestAnimationFrame=="function"&&typeof cancelAnimationFrame=="function")return e=>{let t=requestAnimationFrame(e);return()=>cancelAnimationFrame(t)};{let e=1e3/i,t=typeof performance>"u"?()=>Date.now():()=>performance.now();return r=>{let s=setTimeout(()=>r(t()),e);return()=>clearTimeout(s)}}}var l=class extends o{constructor(e={}){let{paused:t=!1,onDemand:r=!1,requestFrame:s=u(),...a}=e;super(a),this._paused=t,this._onDemand=r,this._requestFrame=s,this._cancelFrame=null,this._empty=!0,!t&&!r&&this._request()}get phases(){return this._phases}set phases(e){this._phases=e,e.length?(this._empty=!1,this._request()):this._empty=!0}get paused(){return this._paused}set paused(e){this._paused=e,e?this._cancel():this._request()}get onDemand(){return this._onDemand}set onDemand(e){this._onDemand=e,e||this._request()}get requestFrame(){return this._requestFrame}set requestFrame(e){this._requestFrame!==e&&(this._requestFrame=e,this._cancelFrame&&(this._cancel(),this._request()))}tick(...e){if(this._assertEmptyQueue(),this._cancelFrame=null,this._onDemand||this._request(),!this._empty){if(!this._fillQueue().length){this._empty=!0;return}this._onDemand&&this._request(),this._processQueue(...e)}}on(e,t,r){let s=super.on(e,t,r);return this._empty=!1,this._request(),s}once(e,t,r){let s=super.once(e,t,r);return this._empty=!1,this._request(),s}_request(){this._paused||this._cancelFrame||(this._cancelFrame=this._requestFrame(this.tick))}_cancel(){this._cancelFrame&&(this._cancelFrame(),this._cancelFrame=null)}};function I(i){return e=>{let t=i.requestAnimationFrame(e);return()=>i.cancelAnimationFrame(t)}}export{l as AutoTicker,o as Ticker,_ as TickerDedupe,u as createRequestFrame,I as createXrRequestFrame};