import { FloatNode } from '../inputs/FloatNode.js'; import { NodeLib } from '../core/NodeLib.js'; class TimerNode extends FloatNode { constructor( scale, scope, timeScale ) { super(); this.scale = scale !== undefined ? scale : 1; this.scope = scope || TimerNode.GLOBAL; this.timeScale = timeScale !== undefined ? timeScale : scale !== undefined; } getReadonly() { // never use TimerNode as readonly but aways as "uniform" return false; } getUnique() { // share TimerNode "uniform" input if is used on more time with others TimerNode return this.timeScale && ( this.scope === TimerNode.GLOBAL || this.scope === TimerNode.DELTA ); } updateFrame( frame ) { const scale = this.timeScale ? this.scale : 1; switch ( this.scope ) { case TimerNode.LOCAL: this.value += frame.delta * scale; break; case TimerNode.DELTA: this.value = frame.delta * scale; break; default: this.value = frame.time * scale; } } copy( source ) { super.copy( source ); this.scope = source.scope; this.scale = source.scale; this.timeScale = source.timeScale; return this; } toJSON( meta ) { const data = super.toJSON( meta ); data.scope = this.scope; data.scale = this.scale; data.timeScale = this.timeScale; return data; } } TimerNode.GLOBAL = 'global'; TimerNode.LOCAL = 'local'; TimerNode.DELTA = 'delta'; TimerNode.prototype.nodeType = 'Timer'; NodeLib.addKeyword( 'time', function () { return new TimerNode(); } ); export { TimerNode };