Skip to content

Commit 99347e1

Browse files
authored
TSL: Introduce uniformTexture() and uniformCubeTexture() (#31190)
1 parent e49dac5 commit 99347e1

File tree

3 files changed

+105
-7
lines changed

3 files changed

+105
-7
lines changed

src/Three.TSL.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,8 +506,10 @@ export const trunc = TSL.trunc;
506506
export const tslFn = TSL.tslFn;
507507
export const uint = TSL.uint;
508508
export const uniform = TSL.uniform;
509+
export const uniformCubeTexture = TSL.uniformCubeTexture;
509510
export const uniformArray = TSL.uniformArray;
510511
export const uniformGroup = TSL.uniformGroup;
512+
export const uniformTexture = TSL.uniformTexture;
511513
export const uniforms = TSL.uniforms;
512514
export const unpremult = TSL.unpremult;
513515
export const userData = TSL.userData;

src/nodes/accessors/CubeTextureNode.js

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import TextureNode from './TextureNode.js';
22
import { reflectVector, refractVector } from './ReflectVector.js';
3-
import { nodeProxy, vec3 } from '../tsl/TSLBase.js';
3+
import { nodeObject, nodeProxy, vec3 } from '../tsl/TSLBase.js';
44

55
import { CubeReflectionMapping, CubeRefractionMapping, WebGPUCoordinateSystem } from '../../constants.js';
66
import { materialEnvRotation } from './MaterialProperties.js';
77

8+
import { CubeTexture } from '../../textures/CubeTexture.js';
9+
10+
const EmptyTexture = /*@__PURE__*/ new CubeTexture();
11+
812
/**
913
* This type of uniform node represents a cube texture.
1014
*
@@ -138,4 +142,48 @@ export default CubeTextureNode;
138142
* @param {?Node<float>} [biasNode=null] - The bias node.
139143
* @returns {CubeTextureNode}
140144
*/
141-
export const cubeTexture = /*@__PURE__*/ nodeProxy( CubeTextureNode ).setParameterLength( 1, 4 ).setName( 'cubeTexture' );
145+
export const cubeTextureBase = /*@__PURE__*/ nodeProxy( CubeTextureNode ).setParameterLength( 1, 4 ).setName( 'cubeTexture' );
146+
147+
/**
148+
* TSL function for creating a cube texture uniform node.
149+
*
150+
* @tsl
151+
* @function
152+
* @param {?CubeTexture|CubeTextureNode} [value=EmptyTexture] - The cube texture.
153+
* @param {?Node<vec3>} [uvNode=null] - The uv node.
154+
* @param {?Node<int>} [levelNode=null] - The level node.
155+
* @param {?Node<float>} [biasNode=null] - The bias node.
156+
* @returns {CubeTextureNode}
157+
*/
158+
export const cubeTexture = ( value = EmptyTexture, uvNode = null, levelNode = null, biasNode = null ) => {
159+
160+
let textureNode;
161+
162+
if ( value && value.isCubeTextureNode === true ) {
163+
164+
textureNode = nodeObject( value.clone() );
165+
textureNode.referenceNode = value.getSelf(); // Ensure the reference is set to the original node
166+
167+
if ( uvNode !== null ) textureNode.uvNode = nodeObject( uvNode );
168+
if ( levelNode !== null ) textureNode.levelNode = nodeObject( levelNode );
169+
if ( biasNode !== null ) textureNode.biasNode = nodeObject( biasNode );
170+
171+
} else {
172+
173+
textureNode = cubeTextureBase( value, uvNode, levelNode, biasNode );
174+
175+
}
176+
177+
return textureNode;
178+
179+
};
180+
181+
/**
182+
* TSL function for creating a uniform cube texture node.
183+
*
184+
* @tsl
185+
* @function
186+
* @param {?CubeTexture} [value=EmptyTexture] - The cube texture.
187+
* @returns {CubeTextureNode}
188+
*/
189+
export const uniformCubeTexture = ( value = EmptyTexture ) => cubeTextureBase( value );

src/nodes/accessors/TextureNode.js

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import { NodeUpdateType } from '../core/constants.js';
99

1010
import { IntType, NearestFilter, UnsignedIntType } from '../../constants.js';
1111

12+
import { Texture } from '../../textures/Texture.js';
13+
14+
const EmptyTexture = /*@__PURE__*/ new Texture();
15+
1216
/**
1317
* This type of uniform node represents a 2D texture.
1418
*
@@ -25,12 +29,12 @@ class TextureNode extends UniformNode {
2529
/**
2630
* Constructs a new texture node.
2731
*
28-
* @param {Texture} value - The texture.
32+
* @param {Texture} [value=EmptyTexture] - The texture.
2933
* @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
3034
* @param {?Node<int>} [levelNode=null] - The level node.
3135
* @param {?Node<float>} [biasNode=null] - The bias node.
3236
*/
33-
constructor( value, uvNode = null, levelNode = null, biasNode = null ) {
37+
constructor( value = EmptyTexture, uvNode = null, levelNode = null, biasNode = null ) {
3438

3539
super( value );
3640

@@ -737,20 +741,64 @@ export default TextureNode;
737741
*
738742
* @tsl
739743
* @function
740-
* @param {Texture} value - The texture.
744+
* @param {?Texture} value - The texture.
741745
* @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
742746
* @param {?Node<int>} [levelNode=null] - The level node.
743747
* @param {?Node<float>} [biasNode=null] - The bias node.
744748
* @returns {TextureNode}
745749
*/
746-
export const texture = /*@__PURE__*/ nodeProxy( TextureNode ).setParameterLength( 1, 4 );
750+
const textureBase = /*@__PURE__*/ nodeProxy( TextureNode ).setParameterLength( 1, 4 ).setName( 'texture' );
751+
752+
/**
753+
* TSL function for creating a texture node or sample a texture node already existing.
754+
*
755+
* @tsl
756+
* @function
757+
* @param {?Texture|TextureNode} [value=EmptyTexture] - The texture.
758+
* @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
759+
* @param {?Node<int>} [levelNode=null] - The level node.
760+
* @param {?Node<float>} [biasNode=null] - The bias node.
761+
* @returns {TextureNode}
762+
*/
763+
export const texture = ( value = EmptyTexture, uvNode = null, levelNode = null, biasNode = null ) => {
764+
765+
let textureNode;
766+
767+
if ( value && value.isTextureNode === true ) {
768+
769+
textureNode = nodeObject( value.clone() );
770+
textureNode.referenceNode = value.getSelf(); // Ensure the reference is set to the original node
771+
772+
if ( uvNode !== null ) textureNode.uvNode = nodeObject( uvNode );
773+
if ( levelNode !== null ) textureNode.levelNode = nodeObject( levelNode );
774+
if ( biasNode !== null ) textureNode.biasNode = nodeObject( biasNode );
775+
776+
} else {
777+
778+
textureNode = textureBase( value, uvNode, levelNode, biasNode );
779+
780+
}
781+
782+
return textureNode;
783+
784+
};
785+
786+
/**
787+
* TSL function for creating a uniform texture node.
788+
*
789+
* @tsl
790+
* @function
791+
* @param {?Texture} value - The texture.
792+
* @returns {TextureNode}
793+
*/
794+
export const uniformTexture = ( value = EmptyTexture ) => texture( value );
747795

748796
/**
749797
* TSL function for creating a texture node that fetches/loads texels without interpolation.
750798
*
751799
* @tsl
752800
* @function
753-
* @param {Texture} value - The texture.
801+
* @param {?Texture|TextureNode} [value=EmptyTexture] - The texture.
754802
* @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
755803
* @param {?Node<int>} [levelNode=null] - The level node.
756804
* @param {?Node<float>} [biasNode=null] - The bias node.

0 commit comments

Comments
 (0)