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.
86 lines
1.3 KiB
86 lines
1.3 KiB
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;
|
|
|