Skip to content

Commit 41928f7

Browse files
authored
TSL: .flip() syntax (#29208)
1 parent c562b90 commit 41928f7

File tree

2 files changed

+73
-5
lines changed

2 files changed

+73
-5
lines changed

src/nodes/shadernode/ShaderNode.js

+11-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import ConvertNode from '../utils/ConvertNode.js';
44
import JoinNode from '../utils/JoinNode.js';
55
import SplitNode from '../utils/SplitNode.js';
66
import SetNode from '../utils/SetNode.js';
7+
import FlipNode from '../utils/FlipNode.js';
78
import ConstNode from '../core/ConstNode.js';
89
import { getValueFromType, getValueType } from '../core/NodeUtils.js';
910

@@ -29,6 +30,7 @@ export function addNodeElement( name, nodeElement ) {
2930
}
3031

3132
const parseSwizzle = ( props ) => props.replace( /r|s/g, 'x' ).replace( /g|t/g, 'y' ).replace( /b|p/g, 'z' ).replace( /a|q/g, 'w' );
33+
const parseSwizzleAndSort = ( props ) => parseSwizzle( props ).split( '' ).sort().join( '' );
3234

3335
const shaderNodeHandler = {
3436

@@ -80,15 +82,19 @@ const shaderNodeHandler = {
8082

8183
} else if ( /^set[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
8284

83-
// set properties ( swizzle )
85+
// set properties ( swizzle ) and sort to xyzw sequence
8486

85-
prop = parseSwizzle( prop.slice( 3 ).toLowerCase() );
87+
prop = parseSwizzleAndSort( prop.slice( 3 ).toLowerCase() );
8688

87-
// sort to xyzw sequence
89+
return ( value ) => nodeObject( new SetNode( node, prop, value ) );
8890

89-
prop = prop.split( '' ).sort().join( '' );
91+
} else if ( /^flip[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
9092

91-
return ( value ) => nodeObject( new SetNode( node, prop, value ) );
93+
// set properties ( swizzle ) and sort to xyzw sequence
94+
95+
prop = parseSwizzleAndSort( prop.slice( 4 ).toLowerCase() );
96+
97+
return () => nodeObject( new FlipNode( nodeObject( node ), prop ) );
9298

9399
} else if ( prop === 'width' || prop === 'height' || prop === 'depth' ) {
94100

src/nodes/utils/FlipNode.js

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import TempNode from '../core/TempNode.js';
2+
import { vectorComponents } from '../core/constants.js';
3+
4+
class FlipNode extends TempNode {
5+
6+
constructor( sourceNode, components ) {
7+
8+
super();
9+
10+
this.sourceNode = sourceNode;
11+
this.components = components;
12+
13+
}
14+
15+
getNodeType( builder ) {
16+
17+
return this.sourceNode.getNodeType( builder );
18+
19+
}
20+
21+
generate( builder ) {
22+
23+
const { components, sourceNode } = this;
24+
25+
const sourceType = this.getNodeType( builder );
26+
const sourceSnippet = sourceNode.build( builder );
27+
28+
const sourceCache = builder.getVarFromNode( this );
29+
const sourceProperty = builder.getPropertyName( sourceCache );
30+
31+
builder.addLineFlowCode( sourceProperty + ' = ' + sourceSnippet );
32+
33+
const length = builder.getTypeLength( sourceType );
34+
const snippetValues = [];
35+
36+
let componentIndex = 0;
37+
38+
for ( let i = 0; i < length; i ++ ) {
39+
40+
const component = vectorComponents[ i ];
41+
42+
if ( component === components[ componentIndex ] ) {
43+
44+
snippetValues.push( '1.0 - ' + ( sourceProperty + '.' + component ) );
45+
46+
componentIndex ++;
47+
48+
} else {
49+
50+
snippetValues.push( sourceProperty + '.' + component );
51+
52+
}
53+
54+
}
55+
56+
return `${ builder.getType( sourceType ) }( ${ snippetValues.join( ', ' ) } )`;
57+
58+
}
59+
60+
}
61+
62+
export default FlipNode;

0 commit comments

Comments
 (0)