@plastic-software/three 0.183.3 → 0.184.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 (280) hide show
  1. package/build/three.cjs +783 -290
  2. package/build/three.core.js +372 -110
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +436 -184
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +7 -1
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +2979 -1281
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +2942 -1281
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +11 -0
  13. package/examples/jsm/animation/CCDIKSolver.js +5 -1
  14. package/examples/jsm/controls/ArcballControls.js +4 -1
  15. package/examples/jsm/controls/DragControls.js +2 -2
  16. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  17. package/examples/jsm/controls/FlyControls.js +4 -0
  18. package/examples/jsm/controls/OrbitControls.js +2 -2
  19. package/examples/jsm/controls/TrackballControls.js +2 -2
  20. package/examples/jsm/controls/TransformControls.js +34 -2
  21. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  22. package/examples/jsm/exporters/GLTFExporter.js +21 -5
  23. package/examples/jsm/geometries/TextGeometry.js +18 -0
  24. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  25. package/examples/jsm/inspector/Extension.js +13 -0
  26. package/examples/jsm/inspector/Inspector.js +169 -114
  27. package/examples/jsm/inspector/RendererInspector.js +2 -2
  28. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  29. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  30. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  31. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  32. package/examples/jsm/inspector/tabs/Parameters.js +34 -2
  33. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  34. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  35. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  36. package/examples/jsm/inspector/tabs/Viewer.js +105 -3
  37. package/examples/jsm/inspector/ui/Graph.js +2 -2
  38. package/examples/jsm/inspector/ui/List.js +1 -1
  39. package/examples/jsm/inspector/ui/Profiler.js +273 -176
  40. package/examples/jsm/inspector/ui/Style.js +64 -10
  41. package/examples/jsm/inspector/ui/Tab.js +39 -7
  42. package/examples/jsm/inspector/ui/Values.js +39 -2
  43. package/examples/jsm/inspector/ui/utils.js +13 -0
  44. package/examples/jsm/interaction/InteractionManager.js +226 -0
  45. package/examples/jsm/libs/meshopt_decoder.module.js +8 -8
  46. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  47. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  48. package/examples/jsm/lines/LineMaterial.js +1 -1
  49. package/examples/jsm/loaders/EXRLoader.js +682 -43
  50. package/examples/jsm/loaders/FBXLoader.js +233 -33
  51. package/examples/jsm/loaders/GLTFLoader.js +24 -7
  52. package/examples/jsm/loaders/HDRLoader.js +1 -1
  53. package/examples/jsm/loaders/KTX2Loader.js +8 -2
  54. package/examples/jsm/loaders/LDrawLoader.js +39 -47
  55. package/examples/jsm/loaders/SVGLoader.js +1 -1
  56. package/examples/jsm/loaders/VTKLoader.js +5 -1
  57. package/examples/jsm/loaders/collada/ColladaComposer.js +101 -7
  58. package/examples/jsm/loaders/collada/ColladaParser.js +19 -4
  59. package/examples/jsm/loaders/usd/USDAParser.js +6 -0
  60. package/examples/jsm/loaders/usd/USDCParser.js +26 -0
  61. package/examples/jsm/loaders/usd/USDComposer.js +656 -103
  62. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  63. package/examples/jsm/misc/RollerCoaster.js +42 -4
  64. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  65. package/examples/jsm/objects/Reflector.js +73 -25
  66. package/examples/jsm/objects/Sky.js +14 -2
  67. package/examples/jsm/objects/SkyMesh.js +23 -6
  68. package/examples/jsm/renderers/Projector.js +18 -38
  69. package/examples/jsm/renderers/SVGRenderer.js +6 -25
  70. package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
  71. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  72. package/examples/jsm/tsl/display/AfterImageNode.js +10 -0
  73. package/examples/jsm/tsl/display/AnamorphicNode.js +11 -0
  74. package/examples/jsm/tsl/display/BilateralBlurNode.js +10 -0
  75. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  76. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  77. package/examples/jsm/tsl/display/GTAONode.js +2 -1
  78. package/examples/jsm/tsl/display/GaussianBlurNode.js +10 -0
  79. package/examples/jsm/tsl/display/GodraysNode.js +2 -11
  80. package/examples/jsm/tsl/display/OutlineNode.js +66 -16
  81. package/examples/jsm/tsl/display/SSGINode.js +0 -4
  82. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  83. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  84. package/examples/jsm/tsl/display/TRAANode.js +48 -7
  85. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  86. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  87. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  88. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  89. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  90. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  91. package/examples/jsm/tsl/math/Bayer.js +13 -2
  92. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  93. package/examples/jsm/utils/ColorUtils.js +76 -0
  94. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  95. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  96. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  97. package/package.json +4 -4
  98. package/src/Three.Core.js +1 -0
  99. package/src/Three.TSL.js +6 -0
  100. package/src/Three.WebGPU.Nodes.js +3 -0
  101. package/src/Three.WebGPU.js +6 -0
  102. package/src/animation/AnimationAction.js +11 -1
  103. package/src/audio/AudioContext.js +2 -2
  104. package/src/constants.js +1 -1
  105. package/src/core/BufferAttribute.js +13 -1
  106. package/src/core/Clock.js +1 -1
  107. package/src/core/Object3D.js +1 -5
  108. package/src/core/RenderTarget.js +1 -0
  109. package/src/extras/PMREMGenerator.js +1 -1
  110. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  111. package/src/loaders/AudioLoader.js +11 -1
  112. package/src/loaders/DataTextureLoader.js +6 -4
  113. package/src/loaders/FileLoader.js +1 -2
  114. package/src/loaders/ImageBitmapLoader.js +4 -6
  115. package/src/loaders/MaterialLoader.js +1 -1
  116. package/src/loaders/ObjectLoader.js +25 -4
  117. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  118. package/src/materials/MeshToonMaterial.js +1 -1
  119. package/src/materials/nodes/Line2NodeMaterial.js +27 -0
  120. package/src/materials/nodes/NodeMaterial.js +0 -27
  121. package/src/materials/nodes/manager/NodeMaterialObserver.js +188 -89
  122. package/src/math/Line3.js +3 -0
  123. package/src/math/Matrix2.js +13 -9
  124. package/src/math/Matrix3.js +13 -9
  125. package/src/math/Matrix4.js +13 -9
  126. package/src/math/Plane.js +4 -3
  127. package/src/math/Triangle.js +1 -1
  128. package/src/math/Vector2.js +11 -7
  129. package/src/math/Vector3.js +12 -8
  130. package/src/math/Vector4.js +13 -9
  131. package/src/nodes/Nodes.js +0 -1
  132. package/src/nodes/TSL.js +1 -1
  133. package/src/nodes/accessors/BufferAttributeNode.js +9 -3
  134. package/src/nodes/accessors/CubeTextureNode.js +7 -1
  135. package/src/nodes/accessors/MaterialProperties.js +2 -5
  136. package/src/nodes/accessors/Object3DNode.js +1 -1
  137. package/src/nodes/accessors/ReferenceBaseNode.js +2 -2
  138. package/src/nodes/accessors/ReferenceNode.js +4 -4
  139. package/src/nodes/accessors/SceneProperties.js +2 -8
  140. package/src/nodes/accessors/StorageBufferNode.js +10 -4
  141. package/src/nodes/accessors/StorageTextureNode.js +4 -9
  142. package/src/nodes/accessors/TextureNode.js +10 -2
  143. package/src/nodes/accessors/UniformArrayNode.js +2 -2
  144. package/src/nodes/code/FunctionCallNode.js +1 -1
  145. package/src/nodes/code/FunctionNode.js +1 -1
  146. package/src/nodes/core/ArrayNode.js +1 -1
  147. package/src/nodes/core/AssignNode.js +1 -1
  148. package/src/nodes/core/AttributeNode.js +1 -1
  149. package/src/nodes/core/BypassNode.js +1 -1
  150. package/src/nodes/core/ContextNode.js +1 -1
  151. package/src/nodes/core/IndexNode.js +2 -1
  152. package/src/nodes/core/InputNode.js +1 -1
  153. package/src/nodes/core/InspectorNode.js +1 -1
  154. package/src/nodes/core/IsolateNode.js +1 -1
  155. package/src/nodes/core/Node.js +83 -12
  156. package/src/nodes/core/NodeBuilder.js +117 -16
  157. package/src/nodes/core/NodeUtils.js +1 -1
  158. package/src/nodes/core/OutputStructNode.js +1 -1
  159. package/src/nodes/core/ParameterNode.js +1 -1
  160. package/src/nodes/core/StackNode.js +1 -1
  161. package/src/nodes/core/StructNode.js +1 -1
  162. package/src/nodes/core/StructTypeNode.js +1 -1
  163. package/src/nodes/core/SubBuildNode.js +1 -1
  164. package/src/nodes/core/UniformGroupNode.js +36 -6
  165. package/src/nodes/core/VarNode.js +1 -1
  166. package/src/nodes/core/VaryingNode.js +1 -1
  167. package/src/nodes/display/NormalMapNode.js +2 -2
  168. package/src/nodes/display/PassNode.js +27 -7
  169. package/src/nodes/display/RenderOutputNode.js +4 -4
  170. package/src/nodes/display/ScreenNode.js +1 -1
  171. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  172. package/src/nodes/display/ViewportTextureNode.js +18 -7
  173. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  174. package/src/nodes/geometry/RangeNode.js +1 -1
  175. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  176. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  177. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  178. package/src/nodes/gpgpu/ComputeNode.js +69 -44
  179. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  180. package/src/nodes/lighting/LightsNode.js +6 -27
  181. package/src/nodes/lighting/ShadowNode.js +24 -2
  182. package/src/nodes/math/BitcastNode.js +1 -1
  183. package/src/nodes/math/ConditionalNode.js +1 -1
  184. package/src/nodes/math/MathNode.js +73 -1
  185. package/src/nodes/math/OperatorNode.js +1 -1
  186. package/src/nodes/math/PackFloatNode.js +1 -1
  187. package/src/nodes/math/UnpackFloatNode.js +1 -1
  188. package/src/nodes/tsl/TSLBase.js +1 -1
  189. package/src/nodes/tsl/TSLCore.js +21 -3
  190. package/src/nodes/utils/ArrayElementNode.js +1 -1
  191. package/src/nodes/utils/ConvertNode.js +1 -1
  192. package/src/nodes/utils/DebugNode.js +1 -1
  193. package/src/nodes/utils/EventNode.js +30 -0
  194. package/src/nodes/utils/FlipNode.js +1 -1
  195. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  196. package/src/nodes/utils/JoinNode.js +1 -1
  197. package/src/nodes/utils/MemberNode.js +1 -1
  198. package/src/nodes/utils/Remap.js +48 -0
  199. package/src/nodes/utils/RotateNode.js +1 -1
  200. package/src/nodes/utils/SetNode.js +1 -1
  201. package/src/nodes/utils/SplitNode.js +1 -1
  202. package/src/objects/BatchedMesh.js +17 -2
  203. package/src/objects/InstancedMesh.js +19 -3
  204. package/src/objects/SkinnedMesh.js +26 -9
  205. package/src/renderers/WebGLRenderer.js +148 -49
  206. package/src/renderers/common/Animation.js +3 -3
  207. package/src/renderers/common/Attributes.js +15 -1
  208. package/src/renderers/common/Backend.js +0 -8
  209. package/src/renderers/common/Background.js +2 -2
  210. package/src/renderers/common/BindGroup.js +1 -8
  211. package/src/renderers/common/Bindings.js +2 -2
  212. package/src/renderers/common/ComputePipeline.js +1 -1
  213. package/src/renderers/common/CubeRenderTarget.js +1 -1
  214. package/src/renderers/common/Info.js +333 -4
  215. package/src/renderers/common/InspectorBase.js +6 -1
  216. package/src/renderers/common/Pipelines.js +36 -3
  217. package/src/renderers/common/ReadbackBuffer.js +78 -0
  218. package/src/renderers/common/RenderBundle.js +3 -1
  219. package/src/renderers/common/RenderBundles.js +5 -2
  220. package/src/renderers/common/RenderObject.js +2 -2
  221. package/src/renderers/common/RenderObjects.js +3 -3
  222. package/src/renderers/common/RenderPipeline.js +35 -6
  223. package/src/renderers/common/Renderer.js +232 -53
  224. package/src/renderers/common/Textures.js +72 -3
  225. package/src/renderers/common/UniformsGroup.js +1 -1
  226. package/src/renderers/common/XRManager.js +34 -27
  227. package/src/renderers/common/extras/PMREMGenerator.js +23 -15
  228. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  229. package/src/renderers/common/nodes/NodeManager.js +230 -99
  230. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +20 -0
  231. package/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js +9 -1
  232. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  233. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  234. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  235. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +8 -0
  236. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  237. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -3
  238. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  239. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  240. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  241. package/src/renderers/shaders/ShaderChunk.js +2 -0
  242. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  243. package/src/renderers/shaders/ShaderLib.js +0 -1
  244. package/src/renderers/shaders/UniformsLib.js +7 -2
  245. package/src/renderers/shaders/UniformsUtils.js +27 -5
  246. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  247. package/src/renderers/webgl/WebGLBackground.js +13 -13
  248. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  249. package/src/renderers/webgl/WebGLCapabilities.js +6 -0
  250. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  251. package/src/renderers/webgl/WebGLMaterials.js +12 -13
  252. package/src/renderers/webgl/WebGLOutput.js +4 -1
  253. package/src/renderers/webgl/WebGLProgram.js +5 -0
  254. package/src/renderers/webgl/WebGLPrograms.js +24 -3
  255. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  256. package/src/renderers/webgl/WebGLState.js +43 -0
  257. package/src/renderers/webgl/WebGLTextures.js +129 -26
  258. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  259. package/src/renderers/webgl-fallback/WebGLBackend.js +106 -65
  260. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  261. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +29 -51
  262. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  263. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  264. package/src/renderers/webgl-fallback/utils/WebGLState.js +42 -1
  265. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +63 -50
  266. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +1 -1
  267. package/src/renderers/webgpu/WebGPUBackend.js +160 -146
  268. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +55 -33
  269. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +103 -17
  270. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  271. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  272. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -0
  273. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +91 -17
  274. package/src/renderers/webgpu/utils/WebGPUUtils.js +18 -2
  275. package/src/renderers/webxr/WebXRController.js +12 -0
  276. package/src/textures/HTMLTexture.js +74 -0
  277. package/src/textures/Source.js +1 -1
  278. package/src/textures/Texture.js +13 -2
  279. package/src/utils.js +23 -1
  280. package/src/nodes/utils/RemapNode.js +0 -125
@@ -30,7 +30,7 @@ import { Vector2 } from '../../math/Vector2.js';
30
30
  import { Vector3 } from '../../math/Vector3.js';
31
31
  import { Vector4 } from '../../math/Vector4.js';
32
32
  import { Float16BufferAttribute } from '../../core/BufferAttribute.js';
33
- import { warn, error } from '../../utils.js';
33
+ import { warn, error, yieldToMain } from '../../utils.js';
34
34
 
35
35
  let _id = 0;
36
36
 
@@ -621,7 +621,7 @@ class NodeBuilder {
621
621
 
622
622
  if ( bindGroup === undefined ) {
623
623
 
624
- bindGroup = new BindGroup( groupName, bindings, this.bindingsIndexes[ groupName ].group );
624
+ bindGroup = new BindGroup( groupName, bindings );
625
625
 
626
626
  bindingGroupsCache.set( cacheKey, bindGroup );
627
627
 
@@ -629,7 +629,7 @@ class NodeBuilder {
629
629
 
630
630
  } else {
631
631
 
632
- bindGroup = new BindGroup( groupName, bindings, this.bindingsIndexes[ groupName ].group );
632
+ bindGroup = new BindGroup( groupName, bindings );
633
633
 
634
634
  }
635
635
 
@@ -736,8 +736,6 @@ class NodeBuilder {
736
736
  const bindingGroup = bindingsGroups[ i ];
737
737
  this.bindingsIndexes[ bindingGroup.name ].group = i;
738
738
 
739
- bindingGroup.index = i;
740
-
741
739
  }
742
740
 
743
741
  }
@@ -866,7 +864,7 @@ class NodeBuilder {
866
864
  */
867
865
  getUniformBufferLimit() {
868
866
 
869
- return 16384;
867
+ return this.renderer.backend.capabilities.getUniformBufferLimit();
870
868
 
871
869
  }
872
870
 
@@ -2674,11 +2672,12 @@ class NodeBuilder {
2674
2672
  * Returns the variable definitions as a shader string for the given shader stage.
2675
2673
  *
2676
2674
  * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.
2675
+ * @param {boolean} [global=false] - Whether the variables are global.
2677
2676
  * @return {string} The variable code section.
2678
2677
  */
2679
- getVars( shaderStage ) {
2678
+ getVars( shaderStage, global = false ) {
2680
2679
 
2681
- let snippet = '';
2680
+ const snippets = [];
2682
2681
 
2683
2682
  const vars = this.vars[ shaderStage ];
2684
2683
 
@@ -2686,13 +2685,13 @@ class NodeBuilder {
2686
2685
 
2687
2686
  for ( const variable of vars ) {
2688
2687
 
2689
- snippet += `${ this.getVar( variable.type, variable.name ) }; `;
2688
+ snippets.push( `${ this.getVar( variable.type, variable.name, variable.count ) };` );
2690
2689
 
2691
2690
  }
2692
2691
 
2693
2692
  }
2694
2693
 
2695
- return snippet;
2694
+ return snippets.join( global ? '\n' : '\n\t' );
2696
2695
 
2697
2696
  }
2698
2697
 
@@ -2941,13 +2940,41 @@ class NodeBuilder {
2941
2940
  }
2942
2941
 
2943
2942
  /**
2944
- * Central build method which controls the build for the given object.
2945
- *
2946
- * @return {NodeBuilder} A reference to this node builder.
2943
+ * Prebuild the node builder.
2947
2944
  */
2948
- build() {
2945
+ prebuild() {
2946
+
2947
+ const { object, renderer, material } = this;
2948
+
2949
+ // < renderer.contextNode >
2950
+
2951
+ if ( renderer.contextNode.isContextNode === true ) {
2952
+
2953
+ this.context = { ...this.context, ...renderer.contextNode.getFlowContextData() };
2954
+
2955
+ } else {
2956
+
2957
+ error( 'NodeBuilder: "renderer.contextNode" must be an instance of `context()`.' );
2958
+
2959
+ }
2960
+
2961
+ // < material.contextNode >
2962
+
2963
+ if ( material && material.contextNode ) {
2949
2964
 
2950
- const { object, material, renderer } = this;
2965
+ if ( material.contextNode.isContextNode === true ) {
2966
+
2967
+ this.context = { ...this.context, ...material.contextNode.getFlowContextData() };
2968
+
2969
+ } else {
2970
+
2971
+ error( 'NodeBuilder: "material.contextNode" must be an instance of `context()`.' );
2972
+
2973
+ }
2974
+
2975
+ }
2976
+
2977
+ // < nodeMaterial >
2951
2978
 
2952
2979
  if ( material !== null ) {
2953
2980
 
@@ -2955,7 +2982,7 @@ class NodeBuilder {
2955
2982
 
2956
2983
  if ( nodeMaterial === null ) {
2957
2984
 
2958
- error( `NodeMaterial: Material "${ material.type }" is not compatible.` );
2985
+ error( `NodeBuilder: Material "${ material.type }" is not compatible.` );
2959
2986
 
2960
2987
  nodeMaterial = new NodeMaterial();
2961
2988
 
@@ -2969,6 +2996,17 @@ class NodeBuilder {
2969
2996
 
2970
2997
  }
2971
2998
 
2999
+ }
3000
+
3001
+ /**
3002
+ * Central build method which controls the build for the given object.
3003
+ *
3004
+ * @return {NodeBuilder} A reference to this node builder.
3005
+ */
3006
+ build() {
3007
+
3008
+ this.prebuild();
3009
+
2972
3010
  // setup() -> stage 1: create possible new nodes and/or return an output reference node
2973
3011
  // analyze() -> stage 2: analyze nodes to possible optimization and validation
2974
3012
  // generate() -> stage 3: generate shader
@@ -3019,6 +3057,69 @@ class NodeBuilder {
3019
3057
 
3020
3058
  }
3021
3059
 
3060
+ /**
3061
+ * Async version of build() that yields to main thread between shader stages.
3062
+ * Use this in compileAsync() to prevent blocking the main thread.
3063
+ *
3064
+ * @return {Promise<NodeBuilder>} A promise that resolves to this node builder.
3065
+ */
3066
+ async buildAsync() {
3067
+
3068
+ this.prebuild();
3069
+
3070
+ // setup() -> stage 1: create possible new nodes and/or return an output reference node
3071
+ // analyze() -> stage 2: analyze nodes to possible optimization and validation
3072
+ // generate() -> stage 3: generate shader
3073
+
3074
+ for ( const buildStage of defaultBuildStages ) {
3075
+
3076
+ this.setBuildStage( buildStage );
3077
+
3078
+ if ( this.context.position && this.context.position.isNode ) {
3079
+
3080
+ this.flowNodeFromShaderStage( 'vertex', this.context.position );
3081
+
3082
+ }
3083
+
3084
+ for ( const shaderStage of shaderStages ) {
3085
+
3086
+ this.setShaderStage( shaderStage );
3087
+
3088
+ const flowNodes = this.flowNodes[ shaderStage ];
3089
+
3090
+ for ( const node of flowNodes ) {
3091
+
3092
+ if ( buildStage === 'generate' ) {
3093
+
3094
+ this.flowNode( node );
3095
+
3096
+ } else {
3097
+
3098
+ node.build( this );
3099
+
3100
+ }
3101
+
3102
+ }
3103
+
3104
+ // Yield to main thread after each shader stage to prevent blocking
3105
+ await yieldToMain();
3106
+
3107
+ }
3108
+
3109
+ }
3110
+
3111
+ this.setBuildStage( null );
3112
+ this.setShaderStage( null );
3113
+
3114
+ // stage 4: build code for a specific output
3115
+
3116
+ this.buildCode();
3117
+ this.buildUpdateNodes();
3118
+
3119
+ return this;
3120
+
3121
+ }
3122
+
3022
3123
  /**
3023
3124
  * Returns shared data object for the given node.
3024
3125
  *
@@ -18,7 +18,7 @@ function cyrb53( value, seed = 0 ) {
18
18
 
19
19
  let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
20
20
 
21
- if ( value instanceof Array ) {
21
+ if ( Array.isArray( value ) ) {
22
22
 
23
23
  for ( let i = 0, val; i < value.length; i ++ ) {
24
24
 
@@ -42,7 +42,7 @@ class OutputStructNode extends Node {
42
42
 
43
43
  }
44
44
 
45
- getNodeType( /*builder*/ ) {
45
+ generateNodeType( /*builder*/ ) {
46
46
 
47
47
  return 'OutputType';
48
48
 
@@ -68,7 +68,7 @@ class ParameterNode extends PropertyNode {
68
68
 
69
69
  getHash() {
70
70
 
71
- return this.uuid;
71
+ return String( this.id );
72
72
 
73
73
  }
74
74
 
@@ -95,7 +95,7 @@ class StackNode extends Node {
95
95
 
96
96
  }
97
97
 
98
- getNodeType( builder ) {
98
+ generateNodeType( builder ) {
99
99
 
100
100
  return this.hasOutput( builder ) ? this.outputNode.getNodeType( builder ) : 'void';
101
101
 
@@ -40,7 +40,7 @@ class StructNode extends Node {
40
40
 
41
41
  }
42
42
 
43
- getNodeType( builder ) {
43
+ generateNodeType( builder ) {
44
44
 
45
45
  return this.structTypeNode.getNodeType( builder );
46
46
 
@@ -122,7 +122,7 @@ class StructTypeNode extends Node {
122
122
 
123
123
  }
124
124
 
125
- getNodeType( builder ) {
125
+ generateNodeType( builder ) {
126
126
 
127
127
  const structType = builder.getStructTypeFromNode( this, this.membersLayout, this.name );
128
128
 
@@ -46,7 +46,7 @@ class SubBuildNode extends Node {
46
46
 
47
47
  }
48
48
 
49
- getNodeType( builder ) {
49
+ generateNodeType( builder ) {
50
50
 
51
51
  if ( this.nodeType !== null ) return this.nodeType;
52
52
 
@@ -1,4 +1,5 @@
1
1
  import Node from './Node.js';
2
+ import { NodeUpdateType } from './constants.js';
2
3
 
3
4
  /**
4
5
  * This node can be used to group single instances of {@link UniformNode}
@@ -27,8 +28,9 @@ class UniformGroupNode extends Node {
27
28
  * @param {string} name - The name of the uniform group node.
28
29
  * @param {boolean} [shared=false] - Whether this uniform group node is shared or not.
29
30
  * @param {number} [order=1] - Influences the internal sorting.
31
+ * @param {string|null} [updateType=null] - The update type of the uniform group node.
30
32
  */
31
- constructor( name, shared = false, order = 1 ) {
33
+ constructor( name, shared = false, order = 1, updateType = null ) {
32
34
 
33
35
  super( 'string' );
34
36
 
@@ -56,6 +58,14 @@ class UniformGroupNode extends Node {
56
58
  */
57
59
  this.order = order;
58
60
 
61
+ /**
62
+ * The update type of the uniform group node.
63
+ *
64
+ * @type {string|null}
65
+ * @default null
66
+ */
67
+ this.updateType = updateType;
68
+
59
69
  /**
60
70
  * This flag can be used for type testing.
61
71
  *
@@ -67,6 +77,21 @@ class UniformGroupNode extends Node {
67
77
 
68
78
  }
69
79
 
80
+ /**
81
+ * Marks the uniform group node as needing an update.
82
+ * This will trigger the necessary updates in the rendering process.
83
+ */
84
+ update() {
85
+
86
+ this.needsUpdate = true;
87
+
88
+ }
89
+
90
+ /**
91
+ * Serializes the uniform group node to a JSON object.
92
+ *
93
+ * @param {Object} data - The object to store the serialized data.
94
+ */
70
95
  serialize( data ) {
71
96
 
72
97
  super.serialize( data );
@@ -77,6 +102,11 @@ class UniformGroupNode extends Node {
77
102
 
78
103
  }
79
104
 
105
+ /**
106
+ * Deserializes the uniform group node from a JSON object.
107
+ *
108
+ * @param {Object} data - The object containing the serialized data.
109
+ */
80
110
  deserialize( data ) {
81
111
 
82
112
  super.deserialize( data );
@@ -99,7 +129,7 @@ export default UniformGroupNode;
99
129
  * @param {string} name - The name of the uniform group node.
100
130
  * @returns {UniformGroupNode}
101
131
  */
102
- export const uniformGroup = ( name ) => new UniformGroupNode( name );
132
+ export const uniformGroup = ( name, order = 1, updateType = null ) => new UniformGroupNode( name, false, order, updateType );
103
133
 
104
134
  /**
105
135
  * TSL function for creating a shared uniform group node with the given name and order.
@@ -110,7 +140,7 @@ export const uniformGroup = ( name ) => new UniformGroupNode( name );
110
140
  * @param {number} [order=0] - Influences the internal sorting.
111
141
  * @returns {UniformGroupNode}
112
142
  */
113
- export const sharedUniformGroup = ( name, order = 0 ) => new UniformGroupNode( name, true, order );
143
+ export const sharedUniformGroup = ( name, order = 0, updateType = null ) => new UniformGroupNode( name, true, order, updateType );
114
144
 
115
145
  /**
116
146
  * TSL object that represents a shared uniform group node which is updated once per frame.
@@ -118,7 +148,7 @@ export const sharedUniformGroup = ( name, order = 0 ) => new UniformGroupNode( n
118
148
  * @tsl
119
149
  * @type {UniformGroupNode}
120
150
  */
121
- export const frameGroup = /*@__PURE__*/ sharedUniformGroup( 'frame' );
151
+ export const frameGroup = /*@__PURE__*/ sharedUniformGroup( 'frame', 0, NodeUpdateType.FRAME );
122
152
 
123
153
  /**
124
154
  * TSL object that represents a shared uniform group node which is updated once per render.
@@ -126,7 +156,7 @@ export const frameGroup = /*@__PURE__*/ sharedUniformGroup( 'frame' );
126
156
  * @tsl
127
157
  * @type {UniformGroupNode}
128
158
  */
129
- export const renderGroup = /*@__PURE__*/ sharedUniformGroup( 'render' );
159
+ export const renderGroup = /*@__PURE__*/ sharedUniformGroup( 'render', 0, NodeUpdateType.RENDER );
130
160
 
131
161
  /**
132
162
  * TSL object that represents a uniform group node which is updated once per object.
@@ -134,4 +164,4 @@ export const renderGroup = /*@__PURE__*/ sharedUniformGroup( 'render' );
134
164
  * @tsl
135
165
  * @type {UniformGroupNode}
136
166
  */
137
- export const objectGroup = /*@__PURE__*/ uniformGroup( 'object' );
167
+ export const objectGroup = /*@__PURE__*/ uniformGroup( 'object', 1, NodeUpdateType.OBJECT );
@@ -151,7 +151,7 @@ class VarNode extends Node {
151
151
 
152
152
  }
153
153
 
154
- getNodeType( builder ) {
154
+ generateNodeType( builder ) {
155
155
 
156
156
  return this.node.getNodeType( builder );
157
157
 
@@ -104,7 +104,7 @@ class VaryingNode extends Node {
104
104
 
105
105
  }
106
106
 
107
- getNodeType( builder ) {
107
+ generateNodeType( builder ) {
108
108
 
109
109
  // VaryingNode is auto type
110
110
 
@@ -87,7 +87,7 @@ class NormalMapNode extends TempNode {
87
87
 
88
88
  } else if ( unpackNormalMode !== NoNormalPacking ) {
89
89
 
90
- console.error( `THREE.NodeMaterial: Unexpected unpack normal mode: ${ unpackNormalMode }` );
90
+ error( `THREE.NodeMaterial: Unexpected unpack normal mode: ${ unpackNormalMode }` );
91
91
 
92
92
  }
93
93
 
@@ -95,7 +95,7 @@ class NormalMapNode extends TempNode {
95
95
 
96
96
  if ( unpackNormalMode !== NoNormalPacking ) {
97
97
 
98
- console.error( `THREE.NodeMaterial: Normal map type '${ normalMapType }' is not compatible with unpack normal mode '${ unpackNormalMode }'` );
98
+ error( `THREE.NodeMaterial: Normal map type '${ normalMapType }' is not compatible with unpack normal mode '${ unpackNormalMode }'` );
99
99
 
100
100
  }
101
101
 
@@ -5,7 +5,7 @@ import { context } from '../tsl/TSLBase.js';
5
5
  import { uniform } from '../core/UniformNode.js';
6
6
  import { viewZToOrthographicDepth, perspectiveDepthToViewZ } from './ViewportDepthNode.js';
7
7
 
8
- import { HalfFloatType/*, FloatType*/ } from '../../constants.js';
8
+ import { HalfFloatType, FloatType } from '../../constants.js';
9
9
  import { Vector2 } from '../../math/Vector2.js';
10
10
  import { Vector4 } from '../../math/Vector4.js';
11
11
  import { DepthTexture } from '../../textures/DepthTexture.js';
@@ -757,6 +757,12 @@ class PassNode extends TempNode {
757
757
 
758
758
  this.renderTarget.texture.type = renderer.getOutputBufferType();
759
759
 
760
+ if ( renderer.reversedDepthBuffer === true ) {
761
+
762
+ this.renderTarget.depthTexture.type = FloatType;
763
+
764
+ }
765
+
760
766
  return this.scope === PassNode.COLOR ? this.getTextureNode() : this.getLinearDepthNode();
761
767
 
762
768
  }
@@ -880,8 +886,26 @@ class PassNode extends TempNode {
880
886
 
881
887
  this.renderTarget.setSize( effectiveWidth, effectiveHeight );
882
888
 
883
- if ( this._scissor !== null ) this.renderTarget.scissor.copy( this._scissor );
884
- if ( this._viewport !== null ) this.renderTarget.viewport.copy( this._viewport );
889
+ // scissor
890
+
891
+ if ( this._scissor !== null ) {
892
+
893
+ this.renderTarget.scissor.copy( this._scissor ).multiplyScalar( this._pixelRatio * this._resolutionScale ).floor();
894
+ this.renderTarget.scissorTest = true;
895
+
896
+ } else {
897
+
898
+ this.renderTarget.scissorTest = false;
899
+
900
+ }
901
+
902
+ // viewport
903
+
904
+ if ( this._viewport !== null ) {
905
+
906
+ this.renderTarget.viewport.copy( this._viewport ).multiplyScalar( this._pixelRatio * this._resolutionScale ).floor();
907
+
908
+ }
885
909
 
886
910
  }
887
911
 
@@ -916,8 +940,6 @@ class PassNode extends TempNode {
916
940
 
917
941
  }
918
942
 
919
- this._scissor.multiplyScalar( this._pixelRatio * this._resolutionScale ).floor();
920
-
921
943
  }
922
944
 
923
945
  }
@@ -952,8 +974,6 @@ class PassNode extends TempNode {
952
974
 
953
975
  }
954
976
 
955
- this._viewport.multiplyScalar( this._pixelRatio * this._resolutionScale ).floor();
956
-
957
977
  }
958
978
 
959
979
  }
@@ -5,9 +5,9 @@ import { NoColorSpace, NoToneMapping } from '../../constants.js';
5
5
  import { ColorManagement } from '../../math/ColorManagement.js';
6
6
 
7
7
  /**
8
- * Normally, tone mapping and color conversion happens automatically
9
- * before outputting pixel too the default (screen) framebuffer. In certain
10
- * post processing setups this happens to late because certain effects
8
+ * Normally, tone mapping and color conversion happens automatically just
9
+ * before outputting a pixel to the default (screen) framebuffer. In certain
10
+ * post processing setups this is too late because some effects such as FXAA
11
11
  * require e.g. sRGB input. For such scenarios, `RenderOutputNode` can be used
12
12
  * to apply tone mapping and color space conversion at an arbitrary point
13
13
  * in the effect chain.
@@ -136,7 +136,7 @@ class RenderOutputNode extends TempNode {
136
136
  export default RenderOutputNode;
137
137
 
138
138
  /**
139
- * TSL function for creating a posterize node.
139
+ * TSL function for creating a render output node.
140
140
  *
141
141
  * @tsl
142
142
  * @function
@@ -72,7 +72,7 @@ class ScreenNode extends Node {
72
72
  *
73
73
  * @return {('float'|'vec2'|'vec4')} The node type.
74
74
  */
75
- getNodeType() {
75
+ generateNodeType() {
76
76
 
77
77
  if ( this.scope === ScreenNode.DPR ) return 'float';
78
78
  if ( this.scope === ScreenNode.VIEWPORT ) return 'vec4';
@@ -26,28 +26,23 @@ class ViewportDepthTextureNode extends ViewportTextureNode {
26
26
  *
27
27
  * @param {Node} [uvNode=screenUV] - The uv node.
28
28
  * @param {?Node} [levelNode=null] - The level node.
29
+ * @param {?DepthTexture} [depthTexture=null] - A depth texture. If not provided, uses a shared depth texture.
29
30
  */
30
- constructor( uvNode = screenUV, levelNode = null ) {
31
+ constructor( uvNode = screenUV, levelNode = null, depthTexture = null ) {
31
32
 
32
- if ( _sharedDepthbuffer === null ) {
33
+ if ( depthTexture === null ) {
33
34
 
34
- _sharedDepthbuffer = new DepthTexture();
35
+ if ( _sharedDepthbuffer === null ) {
35
36
 
36
- }
37
+ _sharedDepthbuffer = new DepthTexture();
37
38
 
38
- super( uvNode, levelNode, _sharedDepthbuffer );
39
+ }
39
40
 
40
- }
41
+ depthTexture = _sharedDepthbuffer;
41
42
 
42
- /**
43
- * Overwritten so the method always returns the unique shared
44
- * depth texture.
45
- *
46
- * @return {DepthTexture} The shared depth texture.
47
- */
48
- getTextureForReference() {
43
+ }
49
44
 
50
- return _sharedDepthbuffer;
45
+ super( uvNode, levelNode, depthTexture );
51
46
 
52
47
  }
53
48
 
@@ -62,6 +57,7 @@ export default ViewportDepthTextureNode;
62
57
  * @function
63
58
  * @param {?Node} [uvNode=screenUV] - The uv node.
64
59
  * @param {?Node} [levelNode=null] - The level node.
60
+ * @param {?DepthTexture} [depthTexture=null] - A depth texture. If not provided, a depth texture is created automatically.
65
61
  * @returns {ViewportDepthTextureNode}
66
62
  */
67
- export const viewportDepthTexture = /*@__PURE__*/ nodeProxy( ViewportDepthTextureNode ).setParameterLength( 0, 2 );
63
+ export const viewportDepthTexture = /*@__PURE__*/ nodeProxy( ViewportDepthTextureNode ).setParameterLength( 0, 3 );
@@ -99,12 +99,12 @@ class ViewportTextureNode extends TextureNode {
99
99
  }
100
100
 
101
101
  /**
102
- * This methods returns a texture for the given render target reference.
102
+ * This methods returns a texture for the given render target or canvas target reference.
103
103
  *
104
104
  * To avoid rendering errors, `ViewportTextureNode` must use unique framebuffer textures
105
105
  * for different render contexts.
106
106
  *
107
- * @param {?RenderTarget} [reference=null] - The render target reference.
107
+ * @param {?(RenderTarget|CanvasTarget)} [reference=null] - The render target or canvas target reference.
108
108
  * @return {Texture} The framebuffer texture.
109
109
  */
110
110
  getTextureForReference( reference = null ) {
@@ -144,9 +144,13 @@ class ViewportTextureNode extends TextureNode {
144
144
 
145
145
  updateReference( frame ) {
146
146
 
147
- const renderTarget = frame.renderer.getRenderTarget();
147
+ const renderer = frame.renderer;
148
+ const renderTarget = renderer.getRenderTarget();
149
+ const canvasTarget = renderer.getCanvasTarget();
148
150
 
149
- this.value = this.getTextureForReference( renderTarget );
151
+ const reference = renderTarget ? renderTarget : canvasTarget;
152
+
153
+ this.value = this.getTextureForReference( reference );
150
154
 
151
155
  return this.value;
152
156
 
@@ -156,20 +160,27 @@ class ViewportTextureNode extends TextureNode {
156
160
 
157
161
  const renderer = frame.renderer;
158
162
  const renderTarget = renderer.getRenderTarget();
163
+ const canvasTarget = renderer.getCanvasTarget();
159
164
 
160
- if ( renderTarget === null ) {
165
+ const reference = renderTarget ? renderTarget : canvasTarget;
166
+
167
+ if ( reference === null ) {
161
168
 
162
169
  renderer.getDrawingBufferSize( _size );
163
170
 
171
+ } else if ( reference.getDrawingBufferSize ) {
172
+
173
+ reference.getDrawingBufferSize( _size );
174
+
164
175
  } else {
165
176
 
166
- _size.set( renderTarget.width, renderTarget.height );
177
+ _size.set( reference.width, reference.height );
167
178
 
168
179
  }
169
180
 
170
181
  //
171
182
 
172
- const framebufferTexture = this.getTextureForReference( renderTarget );
183
+ const framebufferTexture = this.getTextureForReference( reference );
173
184
 
174
185
  if ( framebufferTexture.image.width !== _size.width || framebufferTexture.image.height !== _size.height ) {
175
186
 
@@ -1,4 +1,5 @@
1
1
  import { div } from '../../math/OperatorNode.js';
2
+ import { EPSILON } from '../../math/MathNode.js';
2
3
  import { Fn, vec3 } from '../../tsl/TSLBase.js';
3
4
 
4
5
  // https://google.github.io/filament/Filament.md.html#materialsystem/anisotropicmodel/anisotropicspecularbrdf
@@ -7,9 +8,8 @@ const V_GGX_SmithCorrelated_Anisotropic = /*@__PURE__*/ Fn( ( { alphaT, alphaB,
7
8
 
8
9
  const gv = dotNL.mul( vec3( alphaT.mul( dotTV ), alphaB.mul( dotBV ), dotNV ).length() );
9
10
  const gl = dotNV.mul( vec3( alphaT.mul( dotTL ), alphaB.mul( dotBL ), dotNL ).length() );
10
- const v = div( 0.5, gv.add( gl ) );
11
11
 
12
- return v;
12
+ return div( 0.5, gv.add( gl ).max( EPSILON ) );
13
13
 
14
14
  } ).setLayout( {
15
15
  name: 'V_GGX_SmithCorrelated_Anisotropic',
@@ -84,7 +84,7 @@ class RangeNode extends Node {
84
84
  * @param {NodeBuilder} builder - The current node builder.
85
85
  * @return {string} The node type.
86
86
  */
87
- getNodeType( builder ) {
87
+ generateNodeType( builder ) {
88
88
 
89
89
  return builder.object.count > 1 ? builder.getTypeFromLength( this.getVectorLength( builder ) ) : 'float';
90
90
 
@@ -82,7 +82,7 @@ class AtomicFunctionNode extends Node {
82
82
  * @param {NodeBuilder} builder - The current node builder.
83
83
  * @return {string} The node type.
84
84
  */
85
- getNodeType( builder ) {
85
+ generateNodeType( builder ) {
86
86
 
87
87
  return this.getInputType( builder );
88
88