151 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import Node, { addNodeClass } from '../core/Node.js';
 | |
| import { NodeUpdateType } from '../core/constants.js';
 | |
| import UniformNode from '../core/UniformNode.js';
 | |
| import { nodeProxy } from '../shadernode/ShaderNode.js';
 | |
| 
 | |
| import { Vector3 } from 'three';
 | |
| 
 | |
| class Object3DNode extends Node {
 | |
| 
 | |
| 	constructor( scope = Object3DNode.VIEW_MATRIX, object3d = null ) {
 | |
| 
 | |
| 		super();
 | |
| 
 | |
| 		this.scope = scope;
 | |
| 		this.object3d = object3d;
 | |
| 
 | |
| 		this.updateType = NodeUpdateType.OBJECT;
 | |
| 
 | |
| 		this._uniformNode = new UniformNode( null );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	getNodeType() {
 | |
| 
 | |
| 		const scope = this.scope;
 | |
| 
 | |
| 		if ( scope === Object3DNode.WORLD_MATRIX || scope === Object3DNode.VIEW_MATRIX ) {
 | |
| 
 | |
| 			return 'mat4';
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.NORMAL_MATRIX ) {
 | |
| 
 | |
| 			return 'mat3';
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.POSITION || scope === Object3DNode.VIEW_POSITION || scope === Object3DNode.DIRECTION || scope === Object3DNode.SCALE ) {
 | |
| 
 | |
| 			return 'vec3';
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	update( frame ) {
 | |
| 
 | |
| 		const object = this.object3d;
 | |
| 		const uniformNode = this._uniformNode;
 | |
| 		const scope = this.scope;
 | |
| 
 | |
| 		if ( scope === Object3DNode.VIEW_MATRIX ) {
 | |
| 
 | |
| 			uniformNode.value = object.modelViewMatrix;
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.NORMAL_MATRIX ) {
 | |
| 
 | |
| 			uniformNode.value = object.normalMatrix;
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.WORLD_MATRIX ) {
 | |
| 
 | |
| 			uniformNode.value = object.matrixWorld;
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.POSITION ) {
 | |
| 
 | |
| 			uniformNode.value = uniformNode.value || new Vector3();
 | |
| 
 | |
| 			uniformNode.value.setFromMatrixPosition( object.matrixWorld );
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.SCALE ) {
 | |
| 
 | |
| 			uniformNode.value = uniformNode.value || new Vector3();
 | |
| 
 | |
| 			uniformNode.value.setFromMatrixScale( object.matrixWorld );
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.DIRECTION ) {
 | |
| 
 | |
| 			uniformNode.value = uniformNode.value || new Vector3();
 | |
| 
 | |
| 			object.getWorldDirection( uniformNode.value );
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.VIEW_POSITION ) {
 | |
| 
 | |
| 			const camera = frame.camera;
 | |
| 
 | |
| 			uniformNode.value = uniformNode.value || new Vector3();
 | |
| 			uniformNode.value.setFromMatrixPosition( object.matrixWorld );
 | |
| 
 | |
| 			uniformNode.value.applyMatrix4( camera.matrixWorldInverse );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	generate( builder ) {
 | |
| 
 | |
| 		const scope = this.scope;
 | |
| 
 | |
| 		if ( scope === Object3DNode.WORLD_MATRIX || scope === Object3DNode.VIEW_MATRIX ) {
 | |
| 
 | |
| 			this._uniformNode.nodeType = 'mat4';
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.NORMAL_MATRIX ) {
 | |
| 
 | |
| 			this._uniformNode.nodeType = 'mat3';
 | |
| 
 | |
| 		} else if ( scope === Object3DNode.POSITION || scope === Object3DNode.VIEW_POSITION || scope === Object3DNode.DIRECTION || scope === Object3DNode.SCALE ) {
 | |
| 
 | |
| 			this._uniformNode.nodeType = 'vec3';
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		return this._uniformNode.build( builder );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	serialize( data ) {
 | |
| 
 | |
| 		super.serialize( data );
 | |
| 
 | |
| 		data.scope = this.scope;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	deserialize( data ) {
 | |
| 
 | |
| 		super.deserialize( data );
 | |
| 
 | |
| 		this.scope = data.scope;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| Object3DNode.VIEW_MATRIX = 'viewMatrix';
 | |
| Object3DNode.NORMAL_MATRIX = 'normalMatrix';
 | |
| Object3DNode.WORLD_MATRIX = 'worldMatrix';
 | |
| Object3DNode.POSITION = 'position';
 | |
| Object3DNode.SCALE = 'scale';
 | |
| Object3DNode.VIEW_POSITION = 'viewPosition';
 | |
| Object3DNode.DIRECTION = 'direction';
 | |
| 
 | |
| export default Object3DNode;
 | |
| 
 | |
| export const objectDirection = nodeProxy( Object3DNode, Object3DNode.DIRECTION );
 | |
| export const objectViewMatrix = nodeProxy( Object3DNode, Object3DNode.VIEW_MATRIX );
 | |
| export const objectNormalMatrix = nodeProxy( Object3DNode, Object3DNode.NORMAL_MATRIX );
 | |
| export const objectWorldMatrix = nodeProxy( Object3DNode, Object3DNode.WORLD_MATRIX );
 | |
| export const objectPosition = nodeProxy( Object3DNode, Object3DNode.POSITION );
 | |
| export const objectScale = nodeProxy( Object3DNode, Object3DNode.SCALE );
 | |
| export const objectViewPosition = nodeProxy( Object3DNode, Object3DNode.VIEW_POSITION );
 | |
| 
 | |
| addNodeClass( 'Object3DNode', Object3DNode );
 |