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.

87 lines
1.3 KiB

2 years ago
import Object3DNode from './Object3DNode.js';
import Matrix4Node from '../inputs/Matrix4Node.js';
class CameraNode extends Object3DNode {
static PROJECTION_MATRIX = 'projectionMatrix';
constructor( scope = CameraNode.POSITION ) {
super( scope );
}
getType( builder ) {
const scope = this.scope;
if ( scope === CameraNode.PROJECTION_MATRIX ) {
return 'mat4';
}
return super.getType( builder );
}
update( frame ) {
const camera = frame.camera;
const inputNode = this._inputNode;
const scope = this.scope;
if ( scope === CameraNode.PROJECTION_MATRIX ) {
inputNode.value = camera.projectionMatrix;
} else if ( scope === CameraNode.VIEW_MATRIX ) {
inputNode.value = camera.matrixWorldInverse;
} else {
super.update( frame );
}
}
generate( builder, output ) {
const nodeData = builder.getDataFromNode( this );
let inputNode = this._inputNode;
if ( nodeData.inputNode === undefined ) {
const scope = this.scope;
if ( scope === CameraNode.PROJECTION_MATRIX ) {
if ( inputNode === null || inputNode.isMatrix4Node !== true ) {
inputNode = new Matrix4Node( null );
}
} else {
return super.generate( builder, output );
}
this._inputNode = inputNode;
nodeData.inputNode = inputNode;
}
return inputNode.build( builder, output );
}
}
export default CameraNode;