super-three 0.162.0 → 0.164.0

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 (187) hide show
  1. package/build/three.cjs +847 -1226
  2. package/build/three.module.js +846 -1225
  3. package/build/three.module.min.js +2 -2
  4. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  5. package/examples/jsm/controls/TransformControls.js +3 -3
  6. package/examples/jsm/exporters/GLTFExporter.js +66 -5
  7. package/examples/jsm/exporters/USDZExporter.js +22 -1
  8. package/examples/jsm/geometries/TextGeometry.js +10 -2
  9. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  10. package/examples/jsm/libs/draco/README.md +2 -2
  11. package/examples/jsm/libs/fflate.module.js +694 -496
  12. package/examples/jsm/lines/LineMaterial.js +0 -2
  13. package/examples/jsm/loaders/3MFLoader.js +2 -0
  14. package/examples/jsm/loaders/EXRLoader.js +351 -97
  15. package/examples/jsm/loaders/FBXLoader.js +1 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +59 -0
  17. package/examples/jsm/loaders/KTX2Loader.js +3 -10
  18. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  19. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  20. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  21. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  22. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  23. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  24. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  25. package/examples/jsm/math/Octree.js +26 -20
  26. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  27. package/examples/jsm/nodes/Nodes.js +10 -4
  28. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  29. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  30. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  31. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  32. package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
  33. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
  35. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  36. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  38. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +51 -10
  40. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  41. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  42. package/examples/jsm/nodes/core/Node.js +63 -4
  43. package/examples/jsm/nodes/core/NodeBuilder.js +26 -25
  44. package/examples/jsm/nodes/core/NodeFrame.js +10 -10
  45. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  46. package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
  47. package/examples/jsm/nodes/core/PropertyNode.js +10 -0
  48. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  49. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  50. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  51. package/examples/jsm/nodes/display/PassNode.js +17 -1
  52. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  53. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  54. package/examples/jsm/nodes/display/ViewportNode.js +4 -2
  55. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  56. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  57. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  58. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  59. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  60. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  61. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  62. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  63. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  64. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  65. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +164 -10
  66. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  67. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  68. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  69. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -70
  70. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  71. package/examples/jsm/nodes/lighting/LightsNode.js +11 -1
  72. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +10 -6
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  77. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  78. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +76 -5
  79. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  80. package/examples/jsm/nodes/materials/NodeMaterial.js +55 -43
  81. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  82. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  83. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +3 -9
  85. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  86. package/examples/jsm/objects/QuadMesh.js +7 -23
  87. package/examples/jsm/physics/JoltPhysics.js +281 -0
  88. package/examples/jsm/physics/RapierPhysics.js +4 -4
  89. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  90. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  91. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  92. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  93. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  94. package/examples/jsm/renderers/common/Animation.js +3 -0
  95. package/examples/jsm/renderers/common/Background.js +8 -8
  96. package/examples/jsm/renderers/common/ClippingContext.js +1 -1
  97. package/examples/jsm/renderers/common/Info.js +11 -19
  98. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  99. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  100. package/examples/jsm/renderers/common/RenderList.js +1 -1
  101. package/examples/jsm/renderers/common/RenderObject.js +47 -5
  102. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  103. package/examples/jsm/renderers/common/Renderer.js +153 -21
  104. package/examples/jsm/renderers/common/Textures.js +1 -1
  105. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +773 -0
  106. package/examples/jsm/renderers/common/nodes/Nodes.js +34 -63
  107. package/examples/jsm/renderers/webgl/WebGLBackend.js +146 -36
  108. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +145 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +9 -3
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
  111. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +64 -7
  113. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +6 -23
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +77 -60
  115. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -4
  116. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +29 -1
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
  119. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  120. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  121. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  122. package/examples/jsm/utils/SceneUtils.js +60 -1
  123. package/examples/jsm/utils/TextureUtils.js +1 -1
  124. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  125. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  126. package/package.json +1 -1
  127. package/src/Three.js +0 -1
  128. package/src/animation/AnimationClip.js +1 -1
  129. package/src/constants.js +3 -3
  130. package/src/core/Object3D.js +10 -7
  131. package/src/core/RenderTarget.js +8 -0
  132. package/src/extras/PMREMGenerator.js +21 -11
  133. package/src/loaders/FileLoader.js +1 -1
  134. package/src/loaders/MaterialLoader.js +1 -0
  135. package/src/loaders/ObjectLoader.js +2 -0
  136. package/src/materials/Material.js +2 -0
  137. package/src/materials/MeshPhysicalMaterial.js +20 -0
  138. package/src/materials/ShaderMaterial.js +0 -4
  139. package/src/math/Spherical.js +4 -5
  140. package/src/objects/BatchedMesh.js +27 -3
  141. package/src/objects/InstancedMesh.js +10 -0
  142. package/src/objects/Line.js +66 -43
  143. package/src/renderers/WebGLRenderer.js +130 -158
  144. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  145. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  146. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  147. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  148. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  149. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  150. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  151. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  152. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  153. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  154. package/src/renderers/shaders/ShaderChunk.js +0 -2
  155. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  156. package/src/renderers/shaders/ShaderLib.js +2 -1
  157. package/src/renderers/shaders/UniformsUtils.js +10 -1
  158. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  159. package/src/renderers/webgl/WebGLBackground.js +18 -3
  160. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  161. package/src/renderers/webgl/WebGLBufferRenderer.js +35 -21
  162. package/src/renderers/webgl/WebGLCapabilities.js +35 -13
  163. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  164. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  165. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +35 -21
  166. package/src/renderers/webgl/WebGLLights.js +6 -32
  167. package/src/renderers/webgl/WebGLMaterials.js +8 -3
  168. package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
  169. package/src/renderers/webgl/WebGLProgram.js +21 -52
  170. package/src/renderers/webgl/WebGLPrograms.js +24 -31
  171. package/src/renderers/webgl/WebGLRenderStates.js +13 -7
  172. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  173. package/src/renderers/webgl/WebGLState.js +15 -59
  174. package/src/renderers/webgl/WebGLTextures.js +138 -292
  175. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  176. package/src/renderers/webgl/WebGLUtils.js +9 -78
  177. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  178. package/src/renderers/webxr/WebXRManager.js +4 -6
  179. package/src/scenes/Scene.js +7 -1
  180. package/src/textures/Texture.js +11 -1
  181. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  182. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -320
  183. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  184. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -794
  185. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  186. package/src/renderers/WebGL1Renderer.js +0 -7
  187. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -2,7 +2,9 @@ import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { reference } from './ReferenceNode.js';
3
3
  import { materialReference } from './MaterialReferenceNode.js';
4
4
  import { normalView } from './NormalNode.js';
5
- import { nodeImmutable, float } from '../shadernode/ShaderNode.js';
5
+ import { nodeImmutable, float, vec2, mat2 } from '../shadernode/ShaderNode.js';
6
+ import { uniform } from '../core/UniformNode.js';
7
+ import { Vector2 } from 'three';
6
8
 
7
9
  const _propertyCache = new Map();
8
10
 
@@ -89,7 +91,7 @@ class MaterialNode extends Node {
89
91
 
90
92
  if ( material.specularMap && material.specularMap.isTexture === true ) {
91
93
 
92
- node = this.getTexture( scope ).r;
94
+ node = this.getTexture( 'specular' ).r;
93
95
 
94
96
  } else {
95
97
 
@@ -97,6 +99,34 @@ class MaterialNode extends Node {
97
99
 
98
100
  }
99
101
 
102
+ } else if ( scope === MaterialNode.SPECULAR_INTENSITY ) {
103
+
104
+ const specularIntensity = this.getFloat( scope );
105
+
106
+ if ( material.specularMap ) {
107
+
108
+ node = specularIntensity.mul( this.getTexture( scope ).a );
109
+
110
+ } else {
111
+
112
+ node = specularIntensity;
113
+
114
+ }
115
+
116
+ } else if ( scope === MaterialNode.SPECULAR_COLOR ) {
117
+
118
+ const specularColorNode = this.getColor( scope );
119
+
120
+ if ( material.specularColorMap && material.specularColorMap.isTexture === true ) {
121
+
122
+ node = specularColorNode.mul( this.getTexture( scope ).rgb );
123
+
124
+ } else {
125
+
126
+ node = specularColorNode;
127
+
128
+ }
129
+
100
130
  } else if ( scope === MaterialNode.ROUGHNESS ) { // TODO: cleanup similar branches
101
131
 
102
132
  const roughnessNode = this.getFloat( scope );
@@ -225,6 +255,21 @@ class MaterialNode extends Node {
225
255
 
226
256
  node = node.clamp( 0.07, 1.0 );
227
257
 
258
+ } else if ( scope === MaterialNode.ANISOTROPY ) {
259
+
260
+ if ( material.anisotropyMap && material.anisotropyMap.isTexture === true ) {
261
+
262
+ const anisotropyPolar = this.getTexture( scope );
263
+ const anisotropyMat = mat2( materialAnisotropyVector.x, materialAnisotropyVector.y, materialAnisotropyVector.y.negate(), materialAnisotropyVector.x );
264
+
265
+ node = anisotropyMat.mul( anisotropyPolar.rg.mul( 2.0 ).sub( vec2( 1.0 ) ).normalize().mul( anisotropyPolar.b ) );
266
+
267
+ } else {
268
+
269
+ node = materialAnisotropyVector;
270
+
271
+ }
272
+
228
273
  } else if ( scope === MaterialNode.IRIDESCENCE_THICKNESS ) {
229
274
 
230
275
  const iridescenceThicknessMaximum = reference( '1', 'float', material.iridescenceThicknessRange );
@@ -241,6 +286,38 @@ class MaterialNode extends Node {
241
286
 
242
287
  }
243
288
 
289
+ } else if ( scope === MaterialNode.TRANSMISSION ) {
290
+
291
+ const transmissionNode = this.getFloat( scope );
292
+
293
+ if ( material.transmissionMap ) {
294
+
295
+ node = transmissionNode.mul( this.getTexture( scope ).r );
296
+
297
+ } else {
298
+
299
+ node = transmissionNode;
300
+
301
+ }
302
+
303
+ } else if ( scope === MaterialNode.THICKNESS ) {
304
+
305
+ const thicknessNode = this.getFloat( scope );
306
+
307
+ if ( material.thicknessMap ) {
308
+
309
+ node = thicknessNode.mul( this.getTexture( scope ).g );
310
+
311
+ } else {
312
+
313
+ node = thicknessNode;
314
+
315
+ }
316
+
317
+ } else if ( scope === MaterialNode.IOR ) {
318
+
319
+ node = this.getFloat( scope );
320
+
244
321
  } else {
245
322
 
246
323
  const outputType = this.getNodeType( builder );
@@ -259,8 +336,10 @@ MaterialNode.ALPHA_TEST = 'alphaTest';
259
336
  MaterialNode.COLOR = 'color';
260
337
  MaterialNode.OPACITY = 'opacity';
261
338
  MaterialNode.SHININESS = 'shininess';
262
- MaterialNode.SPECULAR_COLOR = 'specular';
339
+ MaterialNode.SPECULAR = 'specular';
263
340
  MaterialNode.SPECULAR_STRENGTH = 'specularStrength';
341
+ MaterialNode.SPECULAR_INTENSITY = 'specularIntensity';
342
+ MaterialNode.SPECULAR_COLOR = 'specularColor';
264
343
  MaterialNode.REFLECTIVITY = 'reflectivity';
265
344
  MaterialNode.ROUGHNESS = 'roughness';
266
345
  MaterialNode.METALNESS = 'metalness';
@@ -272,9 +351,15 @@ MaterialNode.EMISSIVE = 'emissive';
272
351
  MaterialNode.ROTATION = 'rotation';
273
352
  MaterialNode.SHEEN = 'sheen';
274
353
  MaterialNode.SHEEN_ROUGHNESS = 'sheenRoughness';
354
+ MaterialNode.ANISOTROPY = 'anisotropy';
275
355
  MaterialNode.IRIDESCENCE = 'iridescence';
276
356
  MaterialNode.IRIDESCENCE_IOR = 'iridescenceIOR';
277
357
  MaterialNode.IRIDESCENCE_THICKNESS = 'iridescenceThickness';
358
+ MaterialNode.IOR = 'ior';
359
+ MaterialNode.TRANSMISSION = 'transmission';
360
+ MaterialNode.THICKNESS = 'thickness';
361
+ MaterialNode.ATTENUATION_DISTANCE = 'attenuationDistance';
362
+ MaterialNode.ATTENUATION_COLOR = 'attenuationColor';
278
363
  MaterialNode.LINE_SCALE = 'scale';
279
364
  MaterialNode.LINE_DASH_SIZE = 'dashSize';
280
365
  MaterialNode.LINE_GAP_SIZE = 'gapSize';
@@ -289,7 +374,11 @@ export const materialColor = nodeImmutable( MaterialNode, MaterialNode.COLOR );
289
374
  export const materialShininess = nodeImmutable( MaterialNode, MaterialNode.SHININESS );
290
375
  export const materialEmissive = nodeImmutable( MaterialNode, MaterialNode.EMISSIVE );
291
376
  export const materialOpacity = nodeImmutable( MaterialNode, MaterialNode.OPACITY );
377
+ export const materialSpecular = nodeImmutable( MaterialNode, MaterialNode.SPECULAR );
378
+
379
+ export const materialSpecularIntensity = nodeImmutable( MaterialNode, MaterialNode.SPECULAR_INTENSITY );
292
380
  export const materialSpecularColor = nodeImmutable( MaterialNode, MaterialNode.SPECULAR_COLOR );
381
+
293
382
  export const materialSpecularStrength = nodeImmutable( MaterialNode, MaterialNode.SPECULAR_STRENGTH );
294
383
  export const materialReflectivity = nodeImmutable( MaterialNode, MaterialNode.REFLECTIVITY );
295
384
  export const materialRoughness = nodeImmutable( MaterialNode, MaterialNode.ROUGHNESS );
@@ -301,14 +390,29 @@ export const materialClearcoatNormal = nodeImmutable( MaterialNode, MaterialNode
301
390
  export const materialRotation = nodeImmutable( MaterialNode, MaterialNode.ROTATION );
302
391
  export const materialSheen = nodeImmutable( MaterialNode, MaterialNode.SHEEN );
303
392
  export const materialSheenRoughness = nodeImmutable( MaterialNode, MaterialNode.SHEEN_ROUGHNESS );
393
+ export const materialAnisotropy = nodeImmutable( MaterialNode, MaterialNode.ANISOTROPY );
304
394
  export const materialIridescence = nodeImmutable( MaterialNode, MaterialNode.IRIDESCENCE );
305
395
  export const materialIridescenceIOR = nodeImmutable( MaterialNode, MaterialNode.IRIDESCENCE_IOR );
306
396
  export const materialIridescenceThickness = nodeImmutable( MaterialNode, MaterialNode.IRIDESCENCE_THICKNESS );
397
+ export const materialTransmission = nodeImmutable( MaterialNode, MaterialNode.TRANSMISSION );
398
+ export const materialThickness = nodeImmutable( MaterialNode, MaterialNode.THICKNESS );
399
+ export const materialIOR = nodeImmutable( MaterialNode, MaterialNode.IOR );
400
+ export const materialAttenuationDistance = nodeImmutable( MaterialNode, MaterialNode.ATTENUATION_DISTANCE );
401
+ export const materialAttenuationColor = nodeImmutable( MaterialNode, MaterialNode.ATTENUATION_COLOR );
307
402
  export const materialLineScale = nodeImmutable( MaterialNode, MaterialNode.LINE_SCALE );
308
403
  export const materialLineDashSize = nodeImmutable( MaterialNode, MaterialNode.LINE_DASH_SIZE );
309
404
  export const materialLineGapSize = nodeImmutable( MaterialNode, MaterialNode.LINE_GAP_SIZE );
310
405
  export const materialLineWidth = nodeImmutable( MaterialNode, MaterialNode.LINE_WIDTH );
311
406
  export const materialLineDashOffset = nodeImmutable( MaterialNode, MaterialNode.LINE_DASH_OFFSET );
312
407
  export const materialPointWidth = nodeImmutable( MaterialNode, MaterialNode.POINT_WIDTH );
408
+ export const materialAnisotropyVector = uniform( new Vector2() ).onReference( function ( frame ) {
409
+
410
+ return frame.material;
411
+
412
+ } ).onRenderUpdate( function ( { material } ) {
413
+
414
+ this.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );
415
+
416
+ } );
313
417
 
314
418
  addNodeClass( 'MaterialNode', MaterialNode );
@@ -24,7 +24,7 @@ class MaterialReferenceNode extends ReferenceNode {
24
24
 
25
25
  }*/
26
26
 
27
- setReference( state ) {
27
+ updateReference( state ) {
28
28
 
29
29
  this.reference = this.material !== null ? this.material : state.material;
30
30
 
@@ -1,12 +1,12 @@
1
1
  import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
- import { nodeProxy, tslFn } from '../shadernode/ShaderNode.js';
3
+ import { float, nodeProxy, tslFn } from '../shadernode/ShaderNode.js';
4
4
  import { uniform } from '../core/UniformNode.js';
5
5
  import { reference } from './ReferenceNode.js';
6
6
  import { positionLocal } from './PositionNode.js';
7
7
  import { normalLocal } from './NormalNode.js';
8
8
  import { textureLoad } from './TextureNode.js';
9
- import { vertexIndex } from '../core/IndexNode.js';
9
+ import { instanceIndex, vertexIndex } from '../core/IndexNode.js';
10
10
  import { ivec2, int } from '../shadernode/ShaderNode.js';
11
11
  import { DataArrayTexture, Vector2, Vector4, FloatType } from 'three';
12
12
  import { loop } from '../utils/LoopNode.js';
@@ -188,7 +188,17 @@ class MorphNode extends Node {
188
188
 
189
189
  loop( morphTargetsCount, ( { i } ) => {
190
190
 
191
- const influence = reference( 'morphTargetInfluences', 'float' ).element( i );
191
+ const influence = float( 0 ).toVar();
192
+
193
+ if ( this.mesh.isInstancedMesh === true && ( this.mesh.morphTexture !== null && this.mesh.morphTexture !== undefined ) ) {
194
+
195
+ influence.assign( textureLoad( this.mesh.morphTexture, ivec2( int( i ).add( 1 ), int( instanceIndex ) ) ).r );
196
+
197
+ } else {
198
+
199
+ influence.assign( reference( 'morphTargetInfluences', 'float' ).element( i ).toVar() );
200
+
201
+ }
192
202
 
193
203
  if ( hasMorphPosition === true ) {
194
204
 
@@ -5,7 +5,7 @@ import { property } from '../core/PropertyNode.js';
5
5
  import { normalize } from '../math/MathNode.js';
6
6
  import { cameraViewMatrix } from './CameraNode.js';
7
7
  import { modelNormalMatrix } from './ModelNode.js';
8
- import { nodeImmutable } from '../shadernode/ShaderNode.js';
8
+ import { nodeImmutable, vec3 } from '../shadernode/ShaderNode.js';
9
9
 
10
10
  class NormalNode extends Node {
11
11
 
@@ -37,7 +37,17 @@ class NormalNode extends Node {
37
37
 
38
38
  if ( scope === NormalNode.GEOMETRY ) {
39
39
 
40
- outputNode = attribute( 'normal', 'vec3' );
40
+ const geometryAttribute = builder.hasGeometryAttribute( 'normal' );
41
+
42
+ if ( geometryAttribute === false ) {
43
+
44
+ outputNode = vec3( 0, 1, 0 );
45
+
46
+ } else {
47
+
48
+ outputNode = attribute( 'normal', 'vec3' );
49
+
50
+ }
41
51
 
42
52
  } else if ( scope === NormalNode.LOCAL ) {
43
53
 
@@ -110,7 +110,7 @@ class ReferenceNode extends Node {
110
110
 
111
111
  }
112
112
 
113
- setReference( state ) {
113
+ updateReference( state ) {
114
114
 
115
115
  this.reference = this.object !== null ? this.object : state.object;
116
116
 
@@ -0,0 +1,29 @@
1
+ import ReferenceNode from './ReferenceNode.js';
2
+ import { addNodeClass } from '../core/Node.js';
3
+ import { nodeObject } from '../shadernode/ShaderNode.js';
4
+
5
+ class RendererReferenceNode extends ReferenceNode {
6
+
7
+ constructor( property, inputType, renderer = null ) {
8
+
9
+ super( property, inputType, renderer );
10
+
11
+ this.renderer = renderer;
12
+
13
+ }
14
+
15
+ updateReference( state ) {
16
+
17
+ this.reference = this.renderer !== null ? this.renderer : state.renderer;
18
+
19
+ return this.reference;
20
+
21
+ }
22
+
23
+ }
24
+
25
+ export default RendererReferenceNode;
26
+
27
+ export const rendererReference = ( name, type, renderer ) => nodeObject( new RendererReferenceNode( name, type, renderer ) );
28
+
29
+ addNodeClass( 'RendererReferenceNode', RendererReferenceNode );
@@ -18,6 +18,15 @@ class StorageBufferNode extends BufferNode {
18
18
  this._attribute = null;
19
19
  this._varying = null;
20
20
 
21
+ if ( value.isStorageBufferAttribute !== true && value.isStorageInstancedBufferAttribute !== true ) {
22
+
23
+ // TOOD: Improve it, possibly adding a new property to the BufferAttribute to identify it as a storage buffer read-only attribute in Renderer
24
+
25
+ if ( value.isInstancedBufferAttribute ) value.isStorageInstancedBufferAttribute = true;
26
+ else value.isStorageBufferAttribute = true;
27
+
28
+ }
29
+
21
30
  }
22
31
 
23
32
  getInputType( /*builder*/ ) {
@@ -20,15 +20,40 @@ class TextureNode extends UniformNode {
20
20
  this.levelNode = levelNode;
21
21
  this.compareNode = null;
22
22
  this.depthNode = null;
23
+ this.gradNode = null;
23
24
 
24
25
  this.sampler = true;
25
26
  this.updateMatrix = false;
26
27
  this.updateType = NodeUpdateType.NONE;
27
28
 
29
+ this.referenceNode = null;
30
+
31
+ this._value = value;
32
+
28
33
  this.setUpdateMatrix( uvNode === null );
29
34
 
30
35
  }
31
36
 
37
+ set value( value ) {
38
+
39
+ if ( this.referenceNode ) {
40
+
41
+ this.referenceNode.value = value;
42
+
43
+ } else {
44
+
45
+ this._value = value;
46
+
47
+ }
48
+
49
+ }
50
+
51
+ get value() {
52
+
53
+ return this.referenceNode ? this.referenceNode.value : this._value;
54
+
55
+ }
56
+
32
57
  getUniformHash( /*builder*/ ) {
33
58
 
34
59
  return this.value.uuid;
@@ -55,7 +80,7 @@ class TextureNode extends UniformNode {
55
80
 
56
81
  }
57
82
 
58
- setReference( /*state*/ ) {
83
+ updateReference( /*state*/ ) {
59
84
 
60
85
  return this.value;
61
86
 
@@ -126,17 +151,12 @@ class TextureNode extends UniformNode {
126
151
 
127
152
  }
128
153
 
129
- if ( levelNode !== null && builder.context.getTextureLevelAlgorithm !== undefined ) {
130
-
131
- levelNode = builder.context.getTextureLevelAlgorithm( this, levelNode );
132
-
133
- }
134
-
135
154
  //
136
155
 
137
156
  properties.uvNode = uvNode;
138
157
  properties.levelNode = levelNode;
139
158
  properties.compareNode = this.compareNode;
159
+ properties.gradNode = this.gradNode;
140
160
  properties.depthNode = this.depthNode;
141
161
 
142
162
  }
@@ -147,7 +167,7 @@ class TextureNode extends UniformNode {
147
167
 
148
168
  }
149
169
 
150
- generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, depthSnippet, compareSnippet ) {
170
+ generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, depthSnippet, compareSnippet, gradSnippet ) {
151
171
 
152
172
  const texture = this.value;
153
173
 
@@ -157,6 +177,10 @@ class TextureNode extends UniformNode {
157
177
 
158
178
  snippet = builder.generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet );
159
179
 
180
+ } else if ( gradSnippet ) {
181
+
182
+ snippet = builder.generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet );
183
+
160
184
  } else if ( compareSnippet ) {
161
185
 
162
186
  snippet = builder.generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet );
@@ -205,18 +229,19 @@ class TextureNode extends UniformNode {
205
229
 
206
230
  if ( propertyName === undefined ) {
207
231
 
208
- const { uvNode, levelNode, compareNode, depthNode } = properties;
232
+ const { uvNode, levelNode, compareNode, depthNode, gradNode } = properties;
209
233
 
210
234
  const uvSnippet = this.generateUV( builder, uvNode );
211
235
  const levelSnippet = levelNode ? levelNode.build( builder, 'float' ) : null;
212
236
  const depthSnippet = depthNode ? depthNode.build( builder, 'int' ) : null;
213
237
  const compareSnippet = compareNode ? compareNode.build( builder, 'float' ) : null;
238
+ const gradSnippet = gradNode ? [ gradNode[ 0 ].build( builder, 'vec2' ), gradNode[ 1 ].build( builder, 'vec2' ) ] : null;
214
239
 
215
240
  const nodeVar = builder.getVarFromNode( this );
216
241
 
217
242
  propertyName = builder.getPropertyName( nodeVar );
218
243
 
219
- const snippet = this.generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, depthSnippet, compareSnippet );
244
+ const snippet = this.generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, depthSnippet, compareSnippet, gradSnippet );
220
245
 
221
246
  builder.addLineFlowCode( `${propertyName} = ${snippet}` );
222
247
 
@@ -264,6 +289,7 @@ class TextureNode extends UniformNode {
264
289
 
265
290
  const textureNode = this.clone();
266
291
  textureNode.uvNode = uvNode;
292
+ textureNode.referenceNode = this;
267
293
 
268
294
  return nodeObject( textureNode );
269
295
 
@@ -273,6 +299,7 @@ class TextureNode extends UniformNode {
273
299
 
274
300
  const textureNode = this.clone();
275
301
  textureNode.levelNode = levelNode.mul( maxMipLevel( textureNode ) );
302
+ textureNode.referenceNode = this;
276
303
 
277
304
  return nodeObject( textureNode );
278
305
 
@@ -282,6 +309,7 @@ class TextureNode extends UniformNode {
282
309
 
283
310
  const textureNode = this.clone();
284
311
  textureNode.levelNode = levelNode;
312
+ textureNode.referenceNode = this;
285
313
 
286
314
  return textureNode;
287
315
 
@@ -297,6 +325,18 @@ class TextureNode extends UniformNode {
297
325
 
298
326
  const textureNode = this.clone();
299
327
  textureNode.compareNode = nodeObject( compareNode );
328
+ textureNode.referenceNode = this;
329
+
330
+ return nodeObject( textureNode );
331
+
332
+ }
333
+
334
+ grad( gradNodeX, gradNodeY ) {
335
+
336
+ const textureNode = this.clone();
337
+ textureNode.gradNode = [ nodeObject( gradNodeX ), nodeObject( gradNodeY ) ];
338
+
339
+ textureNode.referenceNode = this;
300
340
 
301
341
  return nodeObject( textureNode );
302
342
 
@@ -306,6 +346,7 @@ class TextureNode extends UniformNode {
306
346
 
307
347
  const textureNode = this.clone();
308
348
  textureNode.depthNode = nodeObject( depthNode );
349
+ textureNode.referenceNode = this;
309
350
 
310
351
  return nodeObject( textureNode );
311
352
 
@@ -20,7 +20,7 @@ class TextureSizeNode extends Node {
20
20
  const textureProperty = this.textureNode.build( builder, 'property' );
21
21
  const levelNode = this.levelNode.build( builder, 'int' );
22
22
 
23
- return builder.format( `${builder.getMethod( 'textureDimensions' )}( ${textureProperty}, ${levelNode} )`, this.getNodeType( builder ), output );
23
+ return builder.format( `${ builder.getMethod( 'textureDimensions' ) }( ${ textureProperty }, ${ levelNode } )`, this.getNodeType( builder ), output );
24
24
 
25
25
  }
26
26
 
@@ -127,12 +127,4 @@ const nativeFn = ( code, includes = [], language = '' ) => {
127
127
  export const glslFn = ( code, includes ) => nativeFn( code, includes, 'glsl' );
128
128
  export const wgslFn = ( code, includes ) => nativeFn( code, includes, 'wgsl' );
129
129
 
130
- export const func = ( code, includes ) => { // @deprecated, r154
131
-
132
- console.warn( 'TSL: func() is deprecated. Use nativeFn(), wgslFn() or glslFn() instead.' );
133
-
134
- return nodeObject( new FunctionNode( code, includes ) );
135
-
136
- };
137
-
138
130
  addNodeClass( 'FunctionNode', FunctionNode );
@@ -20,18 +20,68 @@ class Node extends EventDispatcher {
20
20
 
21
21
  this.uuid = MathUtils.generateUUID();
22
22
 
23
+ this.version = 0;
24
+
25
+ this._cacheKey = null;
26
+ this._cacheKeyVersion = 0;
27
+
23
28
  this.isNode = true;
24
29
 
25
30
  Object.defineProperty( this, 'id', { value: _nodeId ++ } );
26
31
 
27
32
  }
28
33
 
34
+ set needsUpdate( value ) {
35
+
36
+ if ( value === true ) {
37
+
38
+ this.version ++;
39
+
40
+ }
41
+
42
+ }
43
+
29
44
  get type() {
30
45
 
31
46
  return this.constructor.type;
32
47
 
33
48
  }
34
49
 
50
+ onUpdate( callback, updateType ) {
51
+
52
+ this.updateType = updateType;
53
+ this.update = callback.bind( this.getSelf() );
54
+
55
+ return this;
56
+
57
+ }
58
+
59
+ onFrameUpdate( callback ) {
60
+
61
+ return this.onUpdate( callback, NodeUpdateType.FRAME );
62
+
63
+ }
64
+
65
+ onRenderUpdate( callback ) {
66
+
67
+ return this.onUpdate( callback, NodeUpdateType.RENDER );
68
+
69
+ }
70
+
71
+ onObjectUpdate( callback ) {
72
+
73
+ return this.onUpdate( callback, NodeUpdateType.OBJECT );
74
+
75
+ }
76
+
77
+ onReference( callback ) {
78
+
79
+ this.updateReference = callback.bind( this.getSelf() );
80
+
81
+ return this;
82
+
83
+ }
84
+
35
85
  getSelf() {
36
86
 
37
87
  // Returns non-node object.
@@ -40,7 +90,7 @@ class Node extends EventDispatcher {
40
90
 
41
91
  }
42
92
 
43
- setReference( /*state*/ ) {
93
+ updateReference( /*state*/ ) {
44
94
 
45
95
  return this;
46
96
 
@@ -80,9 +130,18 @@ class Node extends EventDispatcher {
80
130
 
81
131
  }
82
132
 
83
- getCacheKey() {
133
+ getCacheKey( force = false ) {
134
+
135
+ force = force || this.version !== this._cacheKeyVersion;
136
+
137
+ if ( force === true || this._cacheKey === null ) {
138
+
139
+ this._cacheKey = getCacheKey( this, force );
140
+ this._cacheKeyVersion = this.version;
141
+
142
+ }
84
143
 
85
- return getCacheKey( this );
144
+ return this._cacheKey;
86
145
 
87
146
  }
88
147
 
@@ -231,7 +290,7 @@ class Node extends EventDispatcher {
231
290
 
232
291
  if ( buildStage === 'setup' ) {
233
292
 
234
- this.setReference( builder );
293
+ this.updateReference( builder );
235
294
 
236
295
  const properties = builder.getNodeProperties( this );
237
296