Skip to content

Commit 2319f15

Browse files
WebGPURenderer: OperatorNode Add unary operator support (mrdoob#27641)
* add unary operator support * remove -- and ++
1 parent 2a5129e commit 2319f15

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

examples/jsm/nodes/Nodes.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export { NodeUtils };
4141
// math
4242
export { default as MathNode, PI, PI2, EPSILON, INFINITY, radians, degrees, exp, exp2, log, log2, sqrt, inverseSqrt, floor, ceil, normalize, fract, sin, cos, tan, asin, acos, atan, abs, sign, length, lengthSq, negate, oneMinus, dFdx, dFdy, round, reciprocal, trunc, fwidth, bitcast, atan2, min, max, mod, step, reflect, distance, difference, dot, cross, pow, pow2, pow3, pow4, transformDirection, mix, clamp, saturate, refract, smoothstep, faceForward, cbrt } from './math/MathNode.js';
4343

44-
export { default as OperatorNode, add, sub, mul, div, remainder, equal, lessThan, greaterThan, lessThanEqual, greaterThanEqual, and, or, xor, bitAnd, bitOr, bitXor, shiftLeft, shiftRight } from './math/OperatorNode.js';
44+
export { default as OperatorNode, add, sub, mul, div, remainder, equal, lessThan, greaterThan, lessThanEqual, greaterThanEqual, and, or, not, xor, bitAnd, bitNot, bitOr, bitXor, shiftLeft, shiftRight } from './math/OperatorNode.js';
4545
export { default as CondNode, cond } from './math/CondNode.js';
4646
export { default as HashNode, hash } from './math/HashNode.js';
4747

examples/jsm/nodes/math/OperatorNode.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class OperatorNode extends TempNode {
3737
const bNode = this.bNode;
3838

3939
const typeA = aNode.getNodeType( builder );
40-
const typeB = bNode.getNodeType( builder );
40+
const typeB = typeof bNode !== 'undefined' ? bNode.getNodeType( builder ) : null;
4141

4242
if ( typeA === 'void' || typeB === 'void' ) {
4343

@@ -47,11 +47,11 @@ class OperatorNode extends TempNode {
4747

4848
return typeA;
4949

50-
} else if ( op === '&' || op === '|' || op === '^' || op === '>>' || op === '<<' ) {
50+
} else if ( op === '~' || op === '&' || op === '|' || op === '^' || op === '>>' || op === '<<' ) {
5151

5252
return builder.getIntegerType( typeA );
5353

54-
} else if ( op === '==' || op === '&&' || op === '||' || op === '^^' ) {
54+
} else if ( op === '!' || op === '==' || op === '&&' || op === '||' || op === '^^' ) {
5555

5656
return 'bool';
5757

@@ -108,7 +108,7 @@ class OperatorNode extends TempNode {
108108
if ( type !== 'void' ) {
109109

110110
typeA = aNode.getNodeType( builder );
111-
typeB = bNode.getNodeType( builder );
111+
typeB = typeof bNode !== 'undefined' ? bNode.getNodeType( builder ) : null;
112112

113113
if ( op === '<' || op === '>' || op === '<=' || op === '>=' || op === '==' ) {
114114

@@ -154,7 +154,7 @@ class OperatorNode extends TempNode {
154154
}
155155

156156
const a = aNode.build( builder, typeA );
157-
const b = bNode.build( builder, typeB );
157+
const b = typeof bNode !== 'undefined' ? bNode.build( builder, typeB ) : null;
158158

159159
const outputLength = builder.getTypeLength( output );
160160
const fnOpSnippet = builder.getFunctionOperator( op );
@@ -177,6 +177,10 @@ class OperatorNode extends TempNode {
177177

178178
return builder.format( `${ builder.getMethod( 'greaterThanEqual' ) }( ${ a }, ${ b } )`, type, output );
179179

180+
} else if ( op === '!' || op === '~' ) {
181+
182+
return builder.format( `(${op}${a})`, typeA, output );
183+
180184
} else if ( fnOpSnippet ) {
181185

182186
return builder.format( `${ fnOpSnippet }( ${ a }, ${ b } )`, type, output );
@@ -236,8 +240,10 @@ export const lessThanEqual = nodeProxy( OperatorNode, '<=' );
236240
export const greaterThanEqual = nodeProxy( OperatorNode, '>=' );
237241
export const and = nodeProxy( OperatorNode, '&&' );
238242
export const or = nodeProxy( OperatorNode, '||' );
243+
export const not = nodeProxy( OperatorNode, '!' );
239244
export const xor = nodeProxy( OperatorNode, '^^' );
240245
export const bitAnd = nodeProxy( OperatorNode, '&' );
246+
export const bitNot = nodeProxy( OperatorNode, '~' );
241247
export const bitOr = nodeProxy( OperatorNode, '|' );
242248
export const bitXor = nodeProxy( OperatorNode, '^' );
243249
export const shiftLeft = nodeProxy( OperatorNode, '<<' );
@@ -256,8 +262,10 @@ addNodeElement( 'lessThanEqual', lessThanEqual );
256262
addNodeElement( 'greaterThanEqual', greaterThanEqual );
257263
addNodeElement( 'and', and );
258264
addNodeElement( 'or', or );
265+
addNodeElement( 'not', not );
259266
addNodeElement( 'xor', xor );
260267
addNodeElement( 'bitAnd', bitAnd );
268+
addNodeElement( 'bitNot', bitNot );
261269
addNodeElement( 'bitOr', bitOr );
262270
addNodeElement( 'bitXor', bitXor );
263271
addNodeElement( 'shiftLeft', shiftLeft );

0 commit comments

Comments
 (0)