120 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import Object3DNode from './Object3DNode.js';
 | |
| import { addNodeClass } from '../core/Node.js';
 | |
| import { NodeUpdateType } from '../core/constants.js';
 | |
| //import { sharedUniformGroup } from '../core/UniformGroupNode.js';
 | |
| import { nodeImmutable } from '../shadernode/ShaderNode.js';
 | |
| 
 | |
| //const cameraGroup = sharedUniformGroup( 'camera' );
 | |
| 
 | |
| class CameraNode extends Object3DNode {
 | |
| 
 | |
| 	constructor( scope = CameraNode.POSITION ) {
 | |
| 
 | |
| 		super( scope );
 | |
| 
 | |
| 		this.updateType = NodeUpdateType.RENDER;
 | |
| 
 | |
| 		//this._uniformNode.groupNode = cameraGroup;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	getNodeType( builder ) {
 | |
| 
 | |
| 		const scope = this.scope;
 | |
| 
 | |
| 		if ( scope === CameraNode.PROJECTION_MATRIX || scope === CameraNode.PROJECTION_MATRIX_INVERSE ) {
 | |
| 
 | |
| 			return 'mat4';
 | |
| 
 | |
| 		} else if ( scope === CameraNode.NEAR || scope === CameraNode.FAR || scope === CameraNode.LOG_DEPTH ) {
 | |
| 
 | |
| 			return 'float';
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		return super.getNodeType( builder );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	update( frame ) {
 | |
| 
 | |
| 		const camera = frame.camera;
 | |
| 		const uniformNode = this._uniformNode;
 | |
| 		const scope = this.scope;
 | |
| 
 | |
| 		//cameraGroup.needsUpdate = true;
 | |
| 
 | |
| 		if ( scope === CameraNode.VIEW_MATRIX ) {
 | |
| 
 | |
| 			uniformNode.value = camera.matrixWorldInverse;
 | |
| 
 | |
| 		} else if ( scope === CameraNode.PROJECTION_MATRIX ) {
 | |
| 
 | |
| 			uniformNode.value = camera.projectionMatrix;
 | |
| 
 | |
| 		} else if ( scope === CameraNode.PROJECTION_MATRIX_INVERSE ) {
 | |
| 
 | |
| 			uniformNode.value = camera.projectionMatrixInverse;
 | |
| 
 | |
| 		} else if ( scope === CameraNode.NEAR ) {
 | |
| 
 | |
| 			uniformNode.value = camera.near;
 | |
| 
 | |
| 		} else if ( scope === CameraNode.FAR ) {
 | |
| 
 | |
| 			uniformNode.value = camera.far;
 | |
| 
 | |
| 		} else if ( scope === CameraNode.LOG_DEPTH ) {
 | |
| 
 | |
| 			uniformNode.value = 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 );
 | |
| 
 | |
| 		} else {
 | |
| 
 | |
| 			this.object3d = camera;
 | |
| 
 | |
| 			super.update( frame );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	generate( builder ) {
 | |
| 
 | |
| 		const scope = this.scope;
 | |
| 
 | |
| 		if ( scope === CameraNode.PROJECTION_MATRIX || scope === CameraNode.PROJECTION_MATRIX_INVERSE ) {
 | |
| 
 | |
| 			this._uniformNode.nodeType = 'mat4';
 | |
| 
 | |
| 		} else if ( scope === CameraNode.NEAR || scope === CameraNode.FAR || scope === CameraNode.LOG_DEPTH ) {
 | |
| 
 | |
| 			this._uniformNode.nodeType = 'float';
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		return super.generate( builder );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| CameraNode.PROJECTION_MATRIX = 'projectionMatrix';
 | |
| CameraNode.PROJECTION_MATRIX_INVERSE = 'projectionMatrixInverse';
 | |
| CameraNode.NEAR = 'near';
 | |
| CameraNode.FAR = 'far';
 | |
| CameraNode.LOG_DEPTH = 'logDepth';
 | |
| 
 | |
| export default CameraNode;
 | |
| 
 | |
| export const cameraProjectionMatrix = nodeImmutable( CameraNode, CameraNode.PROJECTION_MATRIX );
 | |
| export const cameraProjectionMatrixInverse = nodeImmutable( CameraNode, CameraNode.PROJECTION_MATRIX_INVERSE );
 | |
| export const cameraNear = nodeImmutable( CameraNode, CameraNode.NEAR );
 | |
| export const cameraFar = nodeImmutable( CameraNode, CameraNode.FAR );
 | |
| export const cameraLogDepth = nodeImmutable( CameraNode, CameraNode.LOG_DEPTH );
 | |
| export const cameraViewMatrix = nodeImmutable( CameraNode, CameraNode.VIEW_MATRIX );
 | |
| export const cameraNormalMatrix = nodeImmutable( CameraNode, CameraNode.NORMAL_MATRIX );
 | |
| export const cameraWorldMatrix = nodeImmutable( CameraNode, CameraNode.WORLD_MATRIX );
 | |
| export const cameraPosition = nodeImmutable( CameraNode, CameraNode.POSITION );
 | |
| 
 | |
| addNodeClass( 'CameraNode', CameraNode );
 |