@@ -9,6 +9,10 @@ import { NodeUpdateType } from '../core/constants.js';
99
1010import { 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