@needle-tools/three 0.153.1 → 0.154.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/build/three.cjs +1260 -1517
  2. package/build/three.js +1267 -1524
  3. package/build/three.min.js +7 -8
  4. package/build/three.module.js +859 -1097
  5. package/build/three.module.min.js +6 -7
  6. package/examples/jsm/controls/ArcballControls.js +2 -1
  7. package/examples/jsm/controls/FlyControls.js +25 -9
  8. package/examples/jsm/controls/OrbitControls.js +7 -1
  9. package/examples/jsm/csm/CSM.js +1 -1
  10. package/examples/jsm/effects/AnaglyphEffect.js +1 -1
  11. package/examples/jsm/effects/OutlineEffect.js +1 -1
  12. package/examples/jsm/effects/ParallaxBarrierEffect.js +1 -1
  13. package/examples/jsm/environments/RoomEnvironment.js +6 -2
  14. package/examples/jsm/lines/LineMaterial.js +1 -1
  15. package/examples/jsm/loaders/3DMLoader.js +1 -1
  16. package/examples/jsm/loaders/3MFLoader.js +5 -1
  17. package/examples/jsm/loaders/AMFLoader.js +5 -1
  18. package/examples/jsm/loaders/ColladaLoader.js +4 -1
  19. package/examples/jsm/loaders/FBXLoader.js +9 -2
  20. package/examples/jsm/loaders/LDrawLoader.js +4 -7
  21. package/examples/jsm/loaders/PLYLoader.js +16 -6
  22. package/examples/jsm/loaders/VRMLLoader.js +16 -4
  23. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -2
  24. package/examples/jsm/math/MeshSurfaceSampler.js +76 -35
  25. package/examples/jsm/nodes/Nodes.js +20 -15
  26. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +21 -8
  27. package/examples/jsm/nodes/accessors/CameraNode.js +25 -4
  28. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +7 -1
  29. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -4
  30. package/examples/jsm/nodes/accessors/MaterialNode.js +55 -47
  31. package/examples/jsm/nodes/accessors/ModelNode.js +3 -1
  32. package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
  33. package/examples/jsm/nodes/accessors/NormalNode.js +3 -2
  34. package/examples/jsm/nodes/accessors/Object3DNode.js +10 -2
  35. package/examples/jsm/nodes/accessors/SceneNode.js +46 -0
  36. package/examples/jsm/nodes/accessors/SkinningNode.js +43 -62
  37. package/examples/jsm/nodes/accessors/TangentNode.js +2 -2
  38. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +68 -6
  40. package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
  41. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  42. package/examples/jsm/nodes/code/CodeNode.js +3 -0
  43. package/examples/jsm/nodes/code/FunctionNode.js +25 -4
  44. package/examples/jsm/nodes/core/BypassNode.js +2 -2
  45. package/examples/jsm/nodes/core/ContextNode.js +2 -0
  46. package/examples/jsm/nodes/core/IndexNode.js +66 -0
  47. package/examples/jsm/nodes/core/LightingModel.js +2 -1
  48. package/examples/jsm/nodes/core/Node.js +12 -15
  49. package/examples/jsm/nodes/core/NodeBuilder.js +24 -5
  50. package/examples/jsm/nodes/core/PropertyNode.js +4 -0
  51. package/examples/jsm/nodes/core/StackNode.js +1 -1
  52. package/examples/jsm/nodes/core/UniformNode.js +1 -1
  53. package/examples/jsm/nodes/core/VarNode.js +1 -3
  54. package/examples/jsm/nodes/display/BlendModeNode.js +9 -9
  55. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +7 -7
  56. package/examples/jsm/nodes/display/ColorSpaceNode.js +50 -49
  57. package/examples/jsm/nodes/display/NormalMapNode.js +3 -3
  58. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -8
  59. package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
  60. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
  61. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -5
  62. package/examples/jsm/nodes/display/ViewportTextureNode.js +23 -15
  63. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +5 -5
  64. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -8
  65. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  66. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
  67. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +4 -4
  68. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +2 -2
  69. package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
  70. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +2 -4
  71. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  72. package/examples/jsm/nodes/functions/PhongLightingModel.js +7 -7
  73. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +129 -18
  74. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +2 -2
  75. package/examples/jsm/nodes/functions/material/getRoughness.js +3 -3
  76. package/examples/jsm/nodes/geometry/RangeNode.js +1 -1
  77. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -2
  78. package/examples/jsm/nodes/lighting/EnvironmentNode.js +91 -62
  79. package/examples/jsm/nodes/lighting/LightUtils.js +2 -2
  80. package/examples/jsm/nodes/lighting/LightingContextNode.js +17 -15
  81. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  82. package/examples/jsm/nodes/lighting/SpotLightNode.js +3 -3
  83. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -15
  84. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -15
  85. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -10
  86. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -9
  87. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +41 -0
  88. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +1 -14
  89. package/examples/jsm/nodes/materials/NodeMaterial.js +79 -28
  90. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -9
  91. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  92. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +3 -3
  93. package/examples/jsm/nodes/materialx/lib/mx_noise.js +14 -14
  94. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +4 -4
  95. package/examples/jsm/nodes/math/MathNode.js +6 -0
  96. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  97. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  98. package/examples/jsm/nodes/shadernode/ShaderNode.js +24 -4
  99. package/examples/jsm/nodes/utils/LoopNode.js +1 -1
  100. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +1 -1
  101. package/examples/jsm/objects/GroundProjectedSkybox.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +1 -1
  103. package/examples/jsm/objects/Refractor.js +1 -1
  104. package/examples/jsm/objects/Sky.js +1 -1
  105. package/examples/jsm/objects/Water.js +1 -1
  106. package/examples/jsm/objects/Water2.js +1 -1
  107. package/examples/jsm/offscreen/scene.js +1 -0
  108. package/examples/jsm/postprocessing/EffectComposer.js +2 -0
  109. package/examples/jsm/postprocessing/OutlinePass.js +1 -3
  110. package/examples/jsm/postprocessing/SSAARenderPass.js +3 -12
  111. package/examples/jsm/postprocessing/SavePass.js +3 -1
  112. package/examples/jsm/postprocessing/TAARenderPass.js +14 -2
  113. package/examples/jsm/postprocessing/TexturePass.js +2 -1
  114. package/examples/jsm/postprocessing/UnrealBloomPass.js +9 -10
  115. package/examples/jsm/renderers/common/Backend.js +2 -0
  116. package/examples/jsm/renderers/common/Background.js +7 -6
  117. package/examples/jsm/renderers/common/Pipelines.js +26 -14
  118. package/examples/jsm/renderers/common/RenderObject.js +18 -0
  119. package/examples/jsm/renderers/common/RenderObjects.js +29 -29
  120. package/examples/jsm/renderers/common/Renderer.js +48 -6
  121. package/examples/jsm/renderers/common/nodes/Nodes.js +1 -1
  122. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
  123. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +23 -19
  124. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +123 -41
  125. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +29 -9
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -0
  127. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +8 -13
  128. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +85 -3
  129. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +5 -1
  130. package/examples/jsm/shaders/BlendShader.js +1 -2
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/CopyShader.js +2 -2
  133. package/examples/jsm/shaders/ToonShader.js +4 -4
  134. package/examples/jsm/shaders/WaterRefractionShader.js +1 -1
  135. package/examples/jsm/webxr/OculusHandPointerModel.js +34 -13
  136. package/package.json +2 -1
  137. package/src/Three.Legacy.js +0 -228
  138. package/src/animation/PropertyBinding.js +1 -1
  139. package/src/constants.js +1 -1
  140. package/src/core/BufferAttribute.js +0 -24
  141. package/src/core/BufferGeometry.js +0 -7
  142. package/src/loaders/Loader.js +2 -0
  143. package/src/loaders/MaterialLoader.js +1 -0
  144. package/src/materials/Material.js +3 -0
  145. package/src/objects/Skeleton.js +0 -2
  146. package/src/renderers/WebGLRenderer.js +9 -21
  147. package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
  148. package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
  149. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +6 -0
  150. package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -0
  151. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +9 -1
  152. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +1 -1
  153. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +1 -1
  154. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +1 -1
  155. package/src/renderers/shaders/ShaderChunk.js +10 -6
  156. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  157. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -1
  158. package/src/renderers/shaders/ShaderLib/cube.glsl.js +1 -1
  159. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  160. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  161. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -1
  162. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -2
  163. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +4 -2
  164. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +4 -2
  165. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +4 -2
  166. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +4 -2
  167. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -2
  168. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +4 -2
  169. package/src/renderers/shaders/ShaderLib/points.glsl.js +4 -2
  170. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  171. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +4 -2
  172. package/src/renderers/webgl/WebGLObjects.js +23 -3
  173. package/src/renderers/webgl/WebGLProgram.js +24 -5
  174. package/src/renderers/webgl/WebGLPrograms.js +3 -0
  175. package/src/renderers/webxr/WebXRManager.js +11 -33
  176. package/src/scenes/Scene.js +0 -14
  177. package/examples/jsm/nodes/core/InstanceIndexNode.js +0 -45
  178. /package/src/renderers/shaders/ShaderChunk/{encodings_fragment.glsl.js → colorspace_fragment.glsl.js} +0 -0
  179. /package/src/renderers/shaders/ShaderChunk/{encodings_pars_fragment.glsl.js → colorspace_pars_fragment.glsl.js} +0 -0
  180. /package/src/renderers/shaders/ShaderChunk/{output_fragment.glsl.js → opaque_fragment.glsl.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
- import { ShaderNode, nodeProxy } from '../shadernode/ShaderNode.js';
3
+ import { nodeProxy } from '../shadernode/ShaderNode.js';
4
4
  import { attribute } from '../core/AttributeNode.js';
5
5
  import { uniform } from '../core/UniformNode.js';
6
6
  import { add } from '../math/OperatorNode.js';
@@ -9,91 +9,72 @@ import { normalLocal } from './NormalNode.js';
9
9
  import { positionLocal } from './PositionNode.js';
10
10
  import { tangentLocal } from './TangentNode.js';
11
11
 
12
- const Skinning = new ShaderNode( ( inputs, {}, builder ) => {
12
+ class SkinningNode extends Node {
13
13
 
14
- const { index, weight, bindMatrix, bindMatrixInverse, boneMatrices } = inputs;
14
+ constructor( skinnedMesh ) {
15
15
 
16
- const boneMatX = boneMatrices.element( index.x );
17
- const boneMatY = boneMatrices.element( index.y );
18
- const boneMatZ = boneMatrices.element( index.z );
19
- const boneMatW = boneMatrices.element( index.w );
16
+ super( 'void' );
20
17
 
21
- // POSITION
18
+ this.skinnedMesh = skinnedMesh;
22
19
 
23
- const skinVertex = bindMatrix.mul( positionLocal );
20
+ this.updateType = NodeUpdateType.OBJECT;
24
21
 
25
- const skinned = add(
26
- boneMatX.mul( weight.x ).mul( skinVertex ),
27
- boneMatY.mul( weight.y ).mul( skinVertex ),
28
- boneMatZ.mul( weight.z ).mul( skinVertex ),
29
- boneMatW.mul( weight.w ).mul( skinVertex )
30
- );
22
+ //
31
23
 
32
- const skinPosition = bindMatrixInverse.mul( skinned ).xyz;
24
+ this.skinIndexNode = attribute( 'skinIndex', 'uvec4' );
25
+ this.skinWeightNode = attribute( 'skinWeight', 'vec4' );
33
26
 
34
- // NORMAL
27
+ this.bindMatrixNode = uniform( skinnedMesh.bindMatrix, 'mat4' );
28
+ this.bindMatrixInverseNode = uniform( skinnedMesh.bindMatrixInverse, 'mat4' );
29
+ this.boneMatricesNode = buffer( skinnedMesh.skeleton.boneMatrices, 'mat4', skinnedMesh.skeleton.bones.length );
35
30
 
36
- let skinMatrix = add(
37
- weight.x.mul( boneMatX ),
38
- weight.y.mul( boneMatY ),
39
- weight.z.mul( boneMatZ ),
40
- weight.w.mul( boneMatW )
41
- );
31
+ }
42
32
 
43
- skinMatrix = bindMatrixInverse.mul( skinMatrix ).mul( bindMatrix );
33
+ construct( builder ) {
44
34
 
45
- const skinNormal = skinMatrix.transformDirection( normalLocal ).xyz;
35
+ const { skinIndexNode, skinWeightNode, bindMatrixNode, bindMatrixInverseNode, boneMatricesNode } = this;
46
36
 
47
- // ASSIGNS
37
+ const boneMatX = boneMatricesNode.element( skinIndexNode.x );
38
+ const boneMatY = boneMatricesNode.element( skinIndexNode.y );
39
+ const boneMatZ = boneMatricesNode.element( skinIndexNode.z );
40
+ const boneMatW = boneMatricesNode.element( skinIndexNode.w );
48
41
 
49
- positionLocal.assign( skinPosition ).build( builder ); // @TODO: For some reason this doesn't work as stack.assign( positionLocal, skinPosition )?
50
- normalLocal.assign( skinNormal ).build( builder );
42
+ // POSITION
51
43
 
52
- if ( builder.hasGeometryAttribute( 'tangent' ) ) {
44
+ const skinVertex = bindMatrixNode.mul( positionLocal );
53
45
 
54
- tangentLocal.assign( skinNormal ).build( builder );
46
+ const skinned = add(
47
+ boneMatX.mul( skinWeightNode.x ).mul( skinVertex ),
48
+ boneMatY.mul( skinWeightNode.y ).mul( skinVertex ),
49
+ boneMatZ.mul( skinWeightNode.z ).mul( skinVertex ),
50
+ boneMatW.mul( skinWeightNode.w ).mul( skinVertex )
51
+ );
55
52
 
56
- }
53
+ const skinPosition = bindMatrixInverseNode.mul( skinned ).xyz;
57
54
 
58
- } );
55
+ // NORMAL
59
56
 
60
- class SkinningNode extends Node {
57
+ let skinMatrix = add(
58
+ skinWeightNode.x.mul( boneMatX ),
59
+ skinWeightNode.y.mul( boneMatY ),
60
+ skinWeightNode.z.mul( boneMatZ ),
61
+ skinWeightNode.w.mul( boneMatW )
62
+ );
61
63
 
62
- constructor( skinnedMesh ) {
64
+ skinMatrix = bindMatrixInverseNode.mul( skinMatrix ).mul( bindMatrixNode );
63
65
 
64
- super( 'void' );
66
+ const skinNormal = skinMatrix.transformDirection( normalLocal ).xyz;
65
67
 
66
- this.skinnedMesh = skinnedMesh;
68
+ // ASSIGNS
67
69
 
68
- this.updateType = NodeUpdateType.OBJECT;
70
+ builder.stack.assign( positionLocal, skinPosition );
71
+ builder.stack.assign( normalLocal, skinNormal );
69
72
 
70
- //
73
+ if ( builder.hasGeometryAttribute( 'tangent' ) ) {
71
74
 
72
- this.skinIndexNode = attribute( 'skinIndex', 'uvec4' );
73
- this.skinWeightNode = attribute( 'skinWeight', 'vec4' );
74
-
75
- this.bindMatrixNode = uniform( skinnedMesh.bindMatrix, 'mat4' );
76
- this.bindMatrixInverseNode = uniform( skinnedMesh.bindMatrixInverse, 'mat4' );
77
- this.boneMatricesNode = buffer( skinnedMesh.skeleton.boneMatrices, 'mat4', skinnedMesh.skeleton.bones.length );
78
-
79
- }
75
+ builder.stack.assign( tangentLocal, skinNormal );
80
76
 
81
- generate( builder ) {
82
-
83
- /*return new ShaderNode( ( {}, stack, builder ) => Skinning.call( {
84
- index: this.skinIndexNode,
85
- weight: this.skinWeightNode,
86
- bindMatrix: this.bindMatrixNode,
87
- bindMatrixInverse: this.bindMatrixInverseNode,
88
- boneMatrices: this.boneMatricesNode
89
- }, stack, builder ) ).build( builder );*/
90
- Skinning.call( {
91
- index: this.skinIndexNode,
92
- weight: this.skinWeightNode,
93
- bindMatrix: this.bindMatrixNode,
94
- bindMatrixInverse: this.bindMatrixInverseNode,
95
- boneMatrices: this.boneMatricesNode
96
- }, {}, builder );
77
+ }
97
78
 
98
79
  }
99
80
 
@@ -1,6 +1,6 @@
1
1
  import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { attribute } from '../core/AttributeNode.js';
3
- import { label } from '../core/VarNode.js';
3
+ import { temp } from '../core/VarNode.js';
4
4
  import { varying } from '../core/VaryingNode.js';
5
5
  import { normalize } from '../math/MathNode.js';
6
6
  import { cameraViewMatrix } from './CameraNode.js';
@@ -97,7 +97,7 @@ export const tangentGeometry = nodeImmutable( TangentNode, TangentNode.GEOMETRY
97
97
  export const tangentLocal = nodeImmutable( TangentNode, TangentNode.LOCAL );
98
98
  export const tangentView = nodeImmutable( TangentNode, TangentNode.VIEW );
99
99
  export const tangentWorld = nodeImmutable( TangentNode, TangentNode.WORLD );
100
- export const transformedTangentView = label( tangentView, 'TransformedTangentView' );
100
+ export const transformedTangentView = temp( tangentView, 'TransformedTangentView' );
101
101
  export const transformedTangentWorld = normalize( transformedTangentView.transformDirection( cameraViewMatrix ) );
102
102
 
103
103
  addNodeClass( TangentNode );
@@ -0,0 +1,94 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { addNodeClass } from '../core/Node.js';
3
+ import { add, mul, div } from '../math/OperatorNode.js';
4
+ import { floor, ceil, fract, pow } from '../math/MathNode.js';
5
+ import { nodeProxy, addNodeElement, float, vec2, vec4, int } from '../shadernode/ShaderNode.js';
6
+
7
+ // Mipped Bicubic Texture Filtering by N8
8
+ // https://www.shadertoy.com/view/Dl2SDW
9
+
10
+ const bC = 1.0 / 6.0;
11
+
12
+ const w0 = ( a ) => mul( bC, mul( a, mul( a, a.negate().add( 3.0 ) ).sub( 3.0 ) ).add( 1.0 ) );
13
+
14
+ const w1 = ( a ) => mul( bC, mul( a, mul( a, mul( 3.0, a ).sub( 6.0 ) ) ).add( 4.0 ) );
15
+
16
+ const w2 = ( a ) => mul( bC, mul( a, mul( a, mul( - 3.0, a ).add( 3.0 ) ).add( 3.0 ) ).add( 1.0 ) );
17
+
18
+ const w3 = ( a ) => mul( bC, pow( a, 3 ) );
19
+
20
+ const g0 = ( a ) => w0( a ).add( w1( a ) );
21
+
22
+ const g1 = ( a ) => w2( a ).add( w3( a ) );
23
+
24
+ // h0 and h1 are the two offset functions
25
+ const h0 = ( a ) => add( - 1.0, w1( a ).div( w0( a ).add( w1( a ) ) ) );
26
+
27
+ const h1 = ( a ) => add( 1.0, w3( a ).div( w2( a ).add( w3( a ) ) ) );
28
+
29
+ const bicubic = ( textureNode, texelSize, lod ) => {
30
+
31
+ const uv = textureNode.uvNode;
32
+ const uvScaled = mul( uv, texelSize.zw ).add( 0.5 );
33
+
34
+ const iuv = floor( uvScaled );
35
+ const fuv = fract( uvScaled );
36
+
37
+ const g0x = g0( fuv.x );
38
+ const g1x = g1( fuv.x );
39
+ const h0x = h0( fuv.x );
40
+ const h1x = h1( fuv.x );
41
+ const h0y = h0( fuv.y );
42
+ const h1y = h1( fuv.y );
43
+
44
+ const p0 = vec2( iuv.x.add( h0x ), iuv.y.add( h0y ) ).sub( 0.5 ).mul( texelSize.xy );
45
+ const p1 = vec2( iuv.x.add( h1x ), iuv.y.add( h0y ) ).sub( 0.5 ).mul( texelSize.xy );
46
+ const p2 = vec2( iuv.x.add( h0x ), iuv.y.add( h1y ) ).sub( 0.5 ).mul( texelSize.xy );
47
+ const p3 = vec2( iuv.x.add( h1x ), iuv.y.add( h1y ) ).sub( 0.5 ).mul( texelSize.xy );
48
+
49
+ const a = g0( fuv.y ).mul( add( g0x.mul( textureNode.uv( p0 ).level( lod ) ), g1x.mul( textureNode.uv( p1 ).level( lod ) ) ) );
50
+ const b = g1( fuv.y ).mul( add( g0x.mul( textureNode.uv( p2 ).level( lod ) ), g1x.mul( textureNode.uv( p3 ).level( lod ) ) ) );
51
+
52
+ return a.add( b );
53
+
54
+ };
55
+
56
+ const textureBicubicMethod = ( textureNode, lodNode ) => {
57
+
58
+ const fLodSize = vec2( textureNode.size( int( lodNode ) ) );
59
+ const cLodSize = vec2( textureNode.size( int( lodNode.add( 1.0 ) ) ) );
60
+ const fLodSizeInv = div( 1.0, fLodSize );
61
+ const cLodSizeInv = div( 1.0, cLodSize );
62
+ const fSample = bicubic( textureNode, vec4( fLodSizeInv, fLodSize ), floor( lodNode ) );
63
+ const cSample = bicubic( textureNode, vec4( cLodSizeInv, cLodSize ), ceil( lodNode ) );
64
+
65
+ return fract( lodNode ).mix( fSample, cSample );
66
+
67
+ };
68
+
69
+ class TextureBicubicNode extends TempNode {
70
+
71
+ constructor( textureNode, blurNode = float( 3 ) ) {
72
+
73
+ super( 'vec4' );
74
+
75
+ this.textureNode = textureNode;
76
+ this.blurNode = blurNode;
77
+
78
+ }
79
+
80
+ construct() {
81
+
82
+ return textureBicubicMethod( this.textureNode, this.blurNode );
83
+
84
+ }
85
+
86
+ }
87
+
88
+ export default TextureBicubicNode;
89
+
90
+ export const textureBicubic = nodeProxy( TextureBicubicNode );
91
+
92
+ addNodeElement( 'bicubic', textureBicubic );
93
+
94
+ addNodeClass( TextureBicubicNode );
@@ -1,9 +1,12 @@
1
- import UniformNode from '../core/UniformNode.js';
1
+ import UniformNode, { uniform } from '../core/UniformNode.js';
2
2
  import { uv } from './UVNode.js';
3
+ import { textureSize } from './TextureSizeNode.js';
4
+ import { colorSpaceToLinear } from '../display/ColorSpaceNode.js';
5
+ import { context } from '../core/ContextNode.js';
6
+ import { expression } from '../code/ExpressionNode.js';
3
7
  import { addNodeClass } from '../core/Node.js';
4
- import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
5
-
6
- let defaultUV;
8
+ import { addNodeElement, nodeProxy, vec3 } from '../shadernode/ShaderNode.js';
9
+ import { NodeUpdateType } from '../core/constants.js';
7
10
 
8
11
  class TextureNode extends UniformNode {
9
12
 
@@ -16,6 +19,8 @@ class TextureNode extends UniformNode {
16
19
  this.uvNode = uvNode;
17
20
  this.levelNode = levelNode;
18
21
 
22
+ this.updateType = NodeUpdateType.FRAME;
23
+
19
24
  }
20
25
 
21
26
  getUniformHash( /*builder*/ ) {
@@ -40,7 +45,9 @@ class TextureNode extends UniformNode {
40
45
 
41
46
  getDefaultUV() {
42
47
 
43
- return defaultUV || ( defaultUV = uv() );
48
+ const texture = this.value;
49
+
50
+ return uniform( texture.matrix ).mul( vec3( uv( texture.channel ), 1 ) );
44
51
 
45
52
  }
46
53
 
@@ -134,12 +141,46 @@ class TextureNode extends UniformNode {
134
141
 
135
142
  }
136
143
 
137
- return builder.format( propertyName, nodeType, output );
144
+ let snippet = propertyName;
145
+
146
+ if ( builder.needsColorSpaceToLinear( this.value ) ) {
147
+
148
+ snippet = colorSpaceToLinear( expression( snippet, nodeType ), this.value.colorSpace ).construct( builder ).build( builder, nodeType );
149
+
150
+ }
151
+
152
+ return builder.format( snippet, nodeType, output );
138
153
 
139
154
  }
140
155
 
141
156
  }
142
157
 
158
+ uv( uvNode ) {
159
+
160
+ const textureNode = this.clone();
161
+ textureNode.uvNode = uvNode;
162
+
163
+ return textureNode;
164
+
165
+ }
166
+
167
+ level( levelNode ) {
168
+
169
+ const textureNode = this.clone();
170
+ textureNode.levelNode = levelNode;
171
+
172
+ return context( textureNode, {
173
+ getMIPLevelAlgorithmNode: ( textureNode, levelNode ) => levelNode
174
+ } );
175
+
176
+ }
177
+
178
+ size( levelNode ) {
179
+
180
+ return textureSize( this, levelNode );
181
+
182
+ }
183
+
143
184
  serialize( data ) {
144
185
 
145
186
  super.serialize( data );
@@ -156,13 +197,34 @@ class TextureNode extends UniformNode {
156
197
 
157
198
  }
158
199
 
200
+ update() {
201
+
202
+ const texture = this.value;
203
+
204
+ if ( texture.matrixAutoUpdate === true ) {
205
+
206
+ texture.updateMatrix();
207
+
208
+ }
209
+
210
+ }
211
+
212
+ clone() {
213
+
214
+ return new this.constructor( this.value, this.uvNode, this.levelNode );
215
+
216
+ }
217
+
159
218
  }
160
219
 
161
220
  export default TextureNode;
162
221
 
163
222
  export const texture = nodeProxy( TextureNode );
223
+ //export const textureLevel = ( value, uv, level ) => texture( value, uv ).level( level );
224
+
164
225
  export const sampler = ( aTexture ) => ( aTexture.isNode === true ? aTexture : texture( aTexture ) ).convert( 'sampler' );
165
226
 
166
227
  addNodeElement( 'texture', texture );
228
+ //addNodeElement( 'textureLevel', textureLevel );
167
229
 
168
230
  addNodeClass( TextureNode );
@@ -0,0 +1,35 @@
1
+ import Node from '../core/Node.js';
2
+ import { addNodeClass } from '../core/Node.js';
3
+ import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
4
+
5
+ class TextureSizeNode extends Node {
6
+
7
+ constructor( textureNode, levelNode = null ) {
8
+
9
+ super( 'uvec2' );
10
+
11
+ this.isTextureSizeNode = true;
12
+
13
+ this.textureNode = textureNode;
14
+ this.levelNode = levelNode;
15
+
16
+ }
17
+
18
+ generate( builder, output ) {
19
+
20
+ const textureProperty = this.textureNode.build( builder, 'property' );
21
+ const levelNode = this.levelNode.build( builder, 'int' );
22
+
23
+ return builder.format( `textureDimensions( ${textureProperty}, ${levelNode} )`, this.getNodeType( builder ), output );
24
+
25
+ }
26
+
27
+ }
28
+
29
+ export default TextureSizeNode;
30
+
31
+ export const textureSize = nodeProxy( TextureSizeNode );
32
+
33
+ addNodeElement( 'textureSize', textureSize );
34
+
35
+ addNodeClass( TextureSizeNode );
@@ -18,7 +18,7 @@ class UVNode extends AttributeNode {
18
18
 
19
19
  const index = this.index;
20
20
 
21
- return 'uv' + ( index > 0 ? index + 1 : '' );
21
+ return 'uv' + ( index > 0 ? index : '' );
22
22
 
23
23
  }
24
24
 
@@ -70,6 +70,9 @@ class CodeNode extends Node {
70
70
  export default CodeNode;
71
71
 
72
72
  export const code = nodeProxy( CodeNode );
73
+
73
74
  export const js = ( src, includes ) => code( src, includes, 'js' );
75
+ export const wgsl = ( src, includes ) => code( src, includes, 'wgsl' );
76
+ export const glsl = ( src, includes ) => code( src, includes, 'glsl' );
74
77
 
75
78
  addNodeClass( CodeNode );
@@ -4,9 +4,9 @@ import { nodeObject } from '../shadernode/ShaderNode.js';
4
4
 
5
5
  class FunctionNode extends CodeNode {
6
6
 
7
- constructor( code = '', includes = [] ) {
7
+ constructor( code = '', includes = [], language = '' ) {
8
8
 
9
- super( code, includes );
9
+ super( code, includes, language );
10
10
 
11
11
  this.keywords = {};
12
12
 
@@ -99,8 +99,29 @@ class FunctionNode extends CodeNode {
99
99
 
100
100
  export default FunctionNode;
101
101
 
102
- export const func = ( code, includes ) => nodeObject( new FunctionNode( code, includes ) );
102
+ const nativeFn = ( code, includes, language = '' ) => {
103
103
 
104
- export const fn = ( code, includes ) => func( code, includes ).call;
104
+ let functionNode = null;
105
+
106
+ return ( ...params ) => {
107
+
108
+ if ( functionNode === null ) functionNode = nodeObject( new FunctionNode( code, includes, language ) );
109
+
110
+ return functionNode.call( ...params );
111
+
112
+ };
113
+
114
+ };
115
+
116
+ export const glslFn = ( code, includes ) => nativeFn( code, includes, 'glsl' );
117
+ export const wgslFn = ( code, includes ) => nativeFn( code, includes, 'wgsl' );
118
+
119
+ export const func = ( code, includes ) => { // @deprecated, r154
120
+
121
+ console.warn( 'TSL: func() is deprecated. Use nativeFn(), wgslFn() or glslFn() instead.' );
122
+
123
+ return nodeObject( new FunctionNode( code, includes ) );
124
+
125
+ };
105
126
 
106
127
  addNodeClass( FunctionNode );
@@ -20,7 +20,7 @@ class BypassNode extends Node {
20
20
 
21
21
  }
22
22
 
23
- generate( builder, output ) {
23
+ generate( builder ) {
24
24
 
25
25
  const snippet = this.callNode.build( builder, 'void' );
26
26
 
@@ -30,7 +30,7 @@ class BypassNode extends Node {
30
30
 
31
31
  }
32
32
 
33
- return this.outputNode.build( builder, output );
33
+ return this.outputNode.build( builder );
34
34
 
35
35
  }
36
36
 
@@ -53,7 +53,9 @@ class ContextNode extends Node {
53
53
  export default ContextNode;
54
54
 
55
55
  export const context = nodeProxy( ContextNode );
56
+ export const label = ( node, name ) => context( node, { label: name } );
56
57
 
57
58
  addNodeElement( 'context', context );
59
+ addNodeElement( 'label', label );
58
60
 
59
61
  addNodeClass( ContextNode );
@@ -0,0 +1,66 @@
1
+ import Node, { addNodeClass } from './Node.js';
2
+ import { varying } from './VaryingNode.js';
3
+ import { nodeImmutable } from '../shadernode/ShaderNode.js';
4
+
5
+ class IndexNode extends Node {
6
+
7
+ constructor( scope ) {
8
+
9
+ super( 'uint' );
10
+
11
+ this.scope = scope;
12
+
13
+ this.isInstanceIndexNode = true;
14
+
15
+ }
16
+
17
+ generate( builder ) {
18
+
19
+ const nodeType = this.getNodeType( builder );
20
+ const scope = this.scope;
21
+
22
+ let propertyName;
23
+
24
+ if ( scope === IndexNode.VERTEX ) {
25
+
26
+ propertyName = builder.getVertexIndex();
27
+
28
+ } else if ( scope === IndexNode.INSTANCE ) {
29
+
30
+ propertyName = builder.getInstanceIndex();
31
+
32
+ } else {
33
+
34
+ throw new Error( 'THREE.IndexNode: Unknown scope: ' + scope );
35
+
36
+ }
37
+
38
+ let output;
39
+
40
+ if ( builder.shaderStage === 'vertex' || builder.shaderStage === 'compute' ) {
41
+
42
+ output = propertyName;
43
+
44
+ } else {
45
+
46
+ const nodeVarying = varying( this );
47
+
48
+ output = nodeVarying.build( builder, nodeType );
49
+
50
+ }
51
+
52
+ return output;
53
+
54
+ }
55
+
56
+ }
57
+
58
+ IndexNode.VERTEX = 'vertex';
59
+ IndexNode.INSTANCE = 'instance';
60
+
61
+ export default IndexNode;
62
+
63
+ export const vertexIndex = nodeImmutable( IndexNode, IndexNode.VERTEX );
64
+ export const instanceIndex = nodeImmutable( IndexNode, IndexNode.INSTANCE );
65
+
66
+ addNodeClass( IndexNode );
@@ -1,7 +1,8 @@
1
1
  class LightingModel {
2
2
 
3
- constructor( direct = null, indirectDiffuse = null, indirectSpecular = null, ambientOcclusion = null ) {
3
+ constructor( init = null, direct = null, indirectDiffuse = null, indirectSpecular = null, ambientOcclusion = null ) {
4
4
 
5
+ this.init = init;
5
6
  this.direct = direct;
6
7
  this.indirectDiffuse = indirectDiffuse;
7
8
  this.indirectSpecular = indirectSpecular;
@@ -41,23 +41,12 @@ class Node {
41
41
 
42
42
  for ( const { property, index, childNode } of getNodeChildren( this ) ) {
43
43
 
44
- if ( index !== undefined ) {
45
-
46
- yield { childNode, replaceNode( node ) {
47
-
48
- self[ property ][ index ] = node;
49
-
50
- } };
51
-
52
- } else {
53
-
54
- yield { childNode, replaceNode( node ) {
44
+ yield { childNode, replaceNode( node ) {
55
45
 
56
- self[ property ] = node;
46
+ if ( index === undefined ) self[ property ] = node;
47
+ else self[ property ][ index ] = node;
57
48
 
58
- } };
59
-
60
- }
49
+ } };
61
50
 
62
51
  }
63
52
 
@@ -206,9 +195,17 @@ class Node {
206
195
 
207
196
  if ( properties.initialized !== true || builder.context.tempRead === false ) {
208
197
 
198
+ const stackNodesBeforeConstruct = builder.stack.nodes.length;
199
+
209
200
  properties.initialized = true;
210
201
  properties.outputNode = this.construct( builder );
211
202
 
203
+ if ( properties.outputNode !== null && builder.stack.nodes.length !== stackNodesBeforeConstruct ) {
204
+
205
+ properties.outputNode = builder.stack;
206
+
207
+ }
208
+
212
209
  for ( const childNode of Object.values( properties ) ) {
213
210
 
214
211
  if ( childNode && childNode.isNode === true ) {