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 ); |