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.

88 lines
1.4 KiB

2 years ago
import Node from '../core/Node.js';
class OperatorNode extends Node {
constructor( op, a, b ) {
super();
this.op = op;
this.a = a;
this.b = b;
}
getType( builder ) {
const typeA = this.a.getType( builder );
const typeB = this.b.getType( builder );
if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) {
// matrix x vector
return typeB;
} else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) {
// vector x matrix
return typeA;
} else if ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) {
// anytype x anytype: use the greater length vector
return typeB;
}
return typeA;
}
getVectorFromMatrix( type ) {
return 'vec' + type.substr( 3 );
}
generate( builder, output ) {
let typeA = this.a.getType( builder );
let typeB = this.b.getType( builder );
let type = this.getType( builder );
if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) {
// matrix x vector
type = typeB = this.getVectorFromMatrix( typeA );
} else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) {
// vector x matrix
type = typeB = this.getVectorFromMatrix( typeB );
} else {
// anytype x anytype
typeA = typeB = type;
}
const a = this.a.build( builder, typeA );
const b = this.b.build( builder, typeB );
return builder.format( `( ${a} ${this.op} ${b} )`, type, output );
}
}
export default OperatorNode;