Skip to content

Commit 45505ed

Browse files
authored
TSL: SetNode (mrdoob#26785)
* Add SetNode * Use viewProj.setZ() * cleanup
1 parent aa7bec9 commit 45505ed

File tree

5 files changed

+90
-11
lines changed

5 files changed

+90
-11
lines changed

examples/jsm/nodes/Nodes.js

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export { default as OscNode, oscSine, oscSquare, oscTriangle, oscSawtooth } from
5454
export { default as PackingNode, directionToColor, colorToDirection } from './utils/PackingNode.js';
5555
export { default as RemapNode, remap, remapClamp } from './utils/RemapNode.js';
5656
export { default as RotateUVNode, rotateUV } from './utils/RotateUVNode.js';
57+
export { default as SetNode } from './utils/SetNode.js';
5758
export { default as SpecularMIPLevelNode, specularMIPLevel } from './utils/SpecularMIPLevelNode.js';
5859
export { default as SplitNode } from './utils/SplitNode.js';
5960
export { default as SpriteSheetUVNode, spritesheetUV } from './utils/SpriteSheetUVNode.js';

examples/jsm/nodes/accessors/ModelViewProjectionNode.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import Node, { addNodeClass } from '../core/Node.js';
1+
import { addNodeClass } from '../core/Node.js';
2+
import TempNode from '../core/TempNode.js';
23
import { cameraProjectionMatrix } from './CameraNode.js';
34
import { modelViewMatrix } from './ModelNode.js';
45
import { positionLocal } from './PositionNode.js';
56
import { nodeProxy } from '../shadernode/ShaderNode.js';
67

7-
class ModelViewProjectionNode extends Node {
8+
class ModelViewProjectionNode extends TempNode {
89

910
constructor( positionNode = positionLocal ) {
1011

examples/jsm/nodes/shadernode/ShaderNode.js

+22-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import ArrayElementNode from '../utils/ArrayElementNode.js';
33
import ConvertNode from '../utils/ConvertNode.js';
44
import JoinNode from '../utils/JoinNode.js';
55
import SplitNode from '../utils/SplitNode.js';
6+
import SetNode from '../utils/SetNode.js';
67
import ConstNode from '../core/ConstNode.js';
78
import { 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+
2023
const 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 ( /^set[XYZWRGBASTPQ]{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

examples/jsm/nodes/utils/SetNode.js

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

examples/jsm/renderers/common/Background.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import DataMap from './DataMap.js';
22
import { Color, Mesh, SphereGeometry, BackSide } from 'three';
3-
import { vec4, context, normalWorld, backgroundBlurriness, backgroundIntensity, NodeMaterial, modelViewProjection } from '../../nodes/Nodes.js';
3+
import { context, normalWorld, backgroundBlurriness, backgroundIntensity, NodeMaterial, modelViewProjection } from '../../nodes/Nodes.js';
44

55
let _clearAlpha;
66
const _clearColor = new Color();
@@ -60,7 +60,7 @@ class Background extends DataMap {
6060
} ).mul( backgroundIntensity );
6161

6262
let viewProj = modelViewProjection();
63-
viewProj = vec4( viewProj.x, viewProj.y, viewProj.w, viewProj.w );
63+
viewProj = viewProj.setZ( viewProj.w );
6464

6565
const nodeMaterial = new NodeMaterial();
6666
nodeMaterial.outputNode = this.backgroundMeshNode;

0 commit comments

Comments
 (0)