95 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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 );
 |