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