three
Version:
JavaScript 3D library
91 lines (48 loc) • 1.39 kB
JavaScript
import Node from '../core/Node.js';
class MathNode extends Node {
static NORMALIZE = 'normalize';
static INVERSE_TRANSFORM_DIRETION = 'inverseTransformDirection';
constructor( method, a, b = null ) {
super();
this.method = method;
this.a = a;
this.b = b;
}
getType( builder ) {
const method = this.method;
if ( method === MathNode.INVERSE_TRANSFORM_DIRETION ) {
return 'vec3';
} else {
const typeA = this.a.getType( builder );
if ( this.b !== null ) {
if ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) {
// anytype x anytype: use the greater length vector
return typeB;
}
}
return typeA;
}
}
generate( builder, output ) {
const method = this.method;
const type = this.getType( builder );
let a = null, b = null;
if ( method === MathNode.INVERSE_TRANSFORM_DIRETION ) {
a = this.a.build( builder, 'vec3' );
b = this.b.build( builder, 'mat4' );
// add in FunctionNode later
return `normalize( ( vec4( ${a}, 0.0 ) * ${b} ).xyz )`;
} else {
a = this.a.build( builder, type );
if ( this.b !== null ) {
b = this.b.build( builder, type );
}
}
if ( b !== null ) {
return builder.format( `${method}( ${a}, ${b} )`, type, output );
} else {
return builder.format( `${method}( ${a} )`, type, output );
}
}
}
export default MathNode;