@@ -3,6 +3,7 @@ import ArrayElementNode from '../utils/ArrayElementNode.js';
33import ConvertNode from '../utils/ConvertNode.js' ;
44import JoinNode from '../utils/JoinNode.js' ;
55import SplitNode from '../utils/SplitNode.js' ;
6+ import SetNode from '../utils/SetNode.js' ;
67import ConstNode from '../core/ConstNode.js' ;
78import { getValueFromType , getValueType } from '../core/NodeUtils.js' ;
89
@@ -17,6 +18,8 @@ export function addNodeElement( name, nodeElement ) {
1718
1819}
1920
21+ const parseSwizzle = ( props ) => props . replace ( / r | s / g, 'x' ) . replace ( / g | t / g, 'y' ) . replace ( / b | p / g, 'z' ) . replace ( / a | q / g, 'w' ) ;
22+
2023const shaderNodeHandler = {
2124
2225 construct ( NodeClosure , params ) {
@@ -51,19 +54,31 @@ const shaderNodeHandler = {
5154
5255 // accessing properties ( swizzle )
5356
54- prop = prop
55- . replace ( / r | s / g, 'x' )
56- . replace ( / g | t / g, 'y' )
57- . replace ( / b | p / g, 'z' )
58- . replace ( / a | q / g, 'w' ) ;
57+ prop = parseSwizzle ( prop ) ;
5958
6059 return nodeObject ( new SplitNode ( node , prop ) ) ;
6160
62- } else if ( prop === 'width' || prop === 'height' ) {
61+ } else if ( / ^ s e t [ X Y Z W R G B A S T P Q ] { 1 , 4 } $ / . test ( prop ) === true ) {
62+
63+ // set properties ( swizzle )
64+
65+ prop = parseSwizzle ( prop . slice ( 3 ) . toLowerCase ( ) ) ;
66+
67+ // sort to xyzw sequence
68+
69+ prop = prop . split ( '' ) . sort ( ) . join ( '' ) ;
70+
71+ return ( value ) => nodeObject ( new SetNode ( node , prop , value ) ) ;
72+
73+ } else if ( prop === 'width' || prop === 'height' || prop === 'depth' ) {
6374
6475 // accessing property
6576
66- return nodeObject ( new SplitNode ( node , prop === 'width' ? 'x' : 'y' ) ) ;
77+ if ( prop === 'width' ) prop = 'x' ;
78+ else if ( prop === 'height' ) prop = 'y' ;
79+ else if ( prop === 'depth' ) prop = 'z' ;
80+
81+ return nodeObject ( new SplitNode ( node , prop ) ) ;
6782
6883 } else if ( / ^ \d + $ / . test ( prop ) === true ) {
6984
0 commit comments