@@ -9,6 +9,10 @@ import { NodeUpdateType } from '../core/constants.js';
9
9
10
10
import { IntType , NearestFilter , UnsignedIntType } from '../../constants.js' ;
11
11
12
+ import { Texture } from '../../textures/Texture.js' ;
13
+
14
+ const EmptyTexture = /*@__PURE__ */ new Texture ( ) ;
15
+
12
16
/**
13
17
* This type of uniform node represents a 2D texture.
14
18
*
@@ -25,12 +29,12 @@ class TextureNode extends UniformNode {
25
29
/**
26
30
* Constructs a new texture node.
27
31
*
28
- * @param {Texture } value - The texture.
32
+ * @param {Texture } [ value=EmptyTexture] - The texture.
29
33
* @param {?Node<vec2|vec3> } [uvNode=null] - The uv node.
30
34
* @param {?Node<int> } [levelNode=null] - The level node.
31
35
* @param {?Node<float> } [biasNode=null] - The bias node.
32
36
*/
33
- constructor ( value , uvNode = null , levelNode = null , biasNode = null ) {
37
+ constructor ( value = EmptyTexture , uvNode = null , levelNode = null , biasNode = null ) {
34
38
35
39
super ( value ) ;
36
40
@@ -737,20 +741,64 @@ export default TextureNode;
737
741
*
738
742
* @tsl
739
743
* @function
740
- * @param {Texture } value - The texture.
744
+ * @param {? Texture } value - The texture.
741
745
* @param {?Node<vec2|vec3> } [uvNode=null] - The uv node.
742
746
* @param {?Node<int> } [levelNode=null] - The level node.
743
747
* @param {?Node<float> } [biasNode=null] - The bias node.
744
748
* @returns {TextureNode }
745
749
*/
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 ) ;
747
795
748
796
/**
749
797
* TSL function for creating a texture node that fetches/loads texels without interpolation.
750
798
*
751
799
* @tsl
752
800
* @function
753
- * @param {Texture } value - The texture.
801
+ * @param {? Texture|TextureNode } [ value=EmptyTexture] - The texture.
754
802
* @param {?Node<vec2|vec3> } [uvNode=null] - The uv node.
755
803
* @param {?Node<int> } [levelNode=null] - The level node.
756
804
* @param {?Node<float> } [biasNode=null] - The bias node.
0 commit comments