123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- import Node from '../core/Node.js';
- class MathNode extends Node {
- static NORMALIZE = 'normalize';
- static NEGATE = 'negate';
- static LENGTH = 'length';
- constructor( method, a, b = null ) {
- super();
- this.method = method;
- this.a = a;
- this.b = b;
- }
- getInputType( builder ) {
- const typeA = this.a.getType( builder );
- if ( this.b !== null ) {
- const typeB = this.b.getType( builder );
- if ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) {
- // anytype x anytype: use the greater length vector
- return typeB;
- }
- }
- return typeA;
- }
- getType( builder ) {
- const method = this.method;
- if ( method === MathNode.LENGTH ) {
- return 'float';
- } else if (
- method === MathNode.TRANSFORM_DIRETION ||
- method === MathNode.INVERSE_TRANSFORM_DIRETION
- ) {
- return 'vec3';
- } else {
- return this.getInputType( builder );
- }
- }
- generate( builder, output ) {
- const method = this.method;
- const type = this.getInputType( builder );
- const a = this.a.build( builder, type );
- let b = null;
- if ( this.b !== null ) {
- b = this.b.build( builder, type );
- }
- if ( b !== null ) {
- return builder.format( `${method}( ${a}, ${b} )`, type, output );
- } else {
- if ( method === MathNode.NEGATE ) {
- return builder.format( `( -${a} )`, type, output );
- } else {
- return builder.format( `${method}( ${a} )`, type, output );
- }
- }
- }
- }
- export default MathNode;
|