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