three 基础库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

129 lines
2.7 KiB

import Node from '../core/Node.js';
import Matrix4Node from '../inputs/Matrix4Node.js';
import Matrix3Node from '../inputs/Matrix3Node.js';
import Vector3Node from '../inputs/Vector3Node.js';
import { NodeUpdateType } from '../core/constants.js';
class Object3DNode extends Node {
static VIEW_MATRIX = 'viewMatrix';
static NORMAL_MATRIX = 'normalMatrix';
static WORLD_MATRIX = 'worldMatrix';
static POSITION = 'position';
static VIEW_POSITION = 'viewPosition';
constructor( scope = Object3DNode.VIEW_MATRIX, object3d = null ) {
super();
this.scope = scope;
this.object3d = object3d;
this.updateType = NodeUpdateType.Object;
this._inputNode = null;
}
getType() {
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 ) {
return 'vec3';
}
}
update( frame ) {
const object = this.object3d !== null ? this.object3d : frame.object;
const inputNode = this._inputNode;
const camera = frame.camera;
const scope = this.scope;
if ( scope === Object3DNode.VIEW_MATRIX ) {
inputNode.value = object.modelViewMatrix;
} else if ( scope === Object3DNode.NORMAL_MATRIX ) {
inputNode.value = object.normalMatrix;
} else if ( scope === Object3DNode.WORLD_MATRIX ) {
inputNode.value = object.matrixWorld;
} else if ( scope === Object3DNode.POSITION ) {
inputNode.value.setFromMatrixPosition( object.matrixWorld );
} else if ( scope === Object3DNode.VIEW_POSITION ) {
inputNode.value.setFromMatrixPosition( object.matrixWorld );
inputNode.value.applyMatrix4( camera.matrixWorldInverse );
}
}
generate( builder, output ) {
const nodeData = builder.getDataFromNode( this );
let inputNode = this._inputNode;
if ( nodeData.inputNode === undefined ) {
const scope = this.scope;
if ( scope === Object3DNode.WORLD_MATRIX || scope === Object3DNode.VIEW_MATRIX ) {
if ( inputNode === null || inputNode.isMatrix4Node !== true ) {
inputNode = new Matrix4Node( null );
}
} else if ( scope === Object3DNode.NORMAL_MATRIX ) {
if ( inputNode === null || inputNode.isMatrix3Node !== true ) {
inputNode = new Matrix3Node( null );
}
} else if ( scope === Object3DNode.POSITION || scope === Object3DNode.VIEW_POSITION ) {
if ( inputNode === null || inputNode.isVector3Node !== true ) {
inputNode = new Vector3Node();
}
}
this._inputNode = inputNode;
nodeData.inputNode = inputNode;
}
return inputNode.build( builder, output );
}
}
export default Object3DNode;