File: //var/www/aspa/three/addons/nodes/utils/TimerNode.js
import UniformNode from '../core/UniformNode.js';
import { NodeUpdateType } from '../core/constants.js';
import { nodeObject, nodeImmutable } from '../shadernode/ShaderNode.js';
import { addNodeClass } from '../core/Node.js';
class TimerNode extends UniformNode {
	constructor( scope = TimerNode.LOCAL, scale = 1, value = 0 ) {
		super( value );
		this.scope = scope;
		this.scale = scale;
		this.updateType = NodeUpdateType.FRAME;
	}
	/*
	@TODO:
	getNodeType( builder ) {
		const scope = this.scope;
		if ( scope === TimerNode.FRAME ) {
			return 'uint';
		}
		return 'float';
	}
*/
	update( frame ) {
		const scope = this.scope;
		const scale = this.scale;
		if ( scope === TimerNode.LOCAL ) {
			this.value += frame.deltaTime * scale;
		} else if ( scope === TimerNode.DELTA ) {
			this.value = frame.deltaTime * scale;
		} else if ( scope === TimerNode.FRAME ) {
			this.value = frame.frameId;
		} else {
			// global
			this.value = frame.time * scale;
		}
	}
	serialize( data ) {
		super.serialize( data );
		data.scope = this.scope;
		data.scale = this.scale;
	}
	deserialize( data ) {
		super.deserialize( data );
		this.scope = data.scope;
		this.scale = data.scale;
	}
}
TimerNode.LOCAL = 'local';
TimerNode.GLOBAL = 'global';
TimerNode.DELTA = 'delta';
TimerNode.FRAME = 'frame';
export default TimerNode;
// @TODO: add support to use node in timeScale
export const timerLocal = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.LOCAL, timeScale, value ) );
export const timerGlobal = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.GLOBAL, timeScale, value ) );
export const timerDelta = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.DELTA, timeScale, value ) );
export const frameId = nodeImmutable( TimerNode, TimerNode.FRAME ).uint();
addNodeClass( 'TimerNode', TimerNode );