@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
@@ -8,7 +8,6 @@ import {
8
8
  NoToneMapping,
9
9
  LinearMipmapLinearFilter,
10
10
  SRGBColorSpace,
11
- LinearSRGBColorSpace,
12
11
  RGBAIntegerFormat,
13
12
  RGIntegerFormat,
14
13
  RedIntegerFormat,
@@ -52,7 +51,7 @@ import { WebGLUtils } from './webgl/WebGLUtils.js';
52
51
  import { WebXRManager } from './webxr/WebXRManager.js';
53
52
  import { WebGLMaterials } from './webgl/WebGLMaterials.js';
54
53
  import { WebGLUniformsGroups } from './webgl/WebGLUniformsGroups.js';
55
- import { createCanvasElement, probeAsync, warnOnce, error, warn, log } from '../utils.js';
54
+ import { createCanvasElement, probeAsync, error, warn, log } from '../utils.js';
56
55
  import { ColorManagement } from '../math/ColorManagement.js';
57
56
  import { getDFGLUT } from './shaders/DFGLUTData.js';
58
57
 
@@ -131,6 +130,7 @@ class WebGLRenderer {
131
130
 
132
131
  const uintClearColor = new Uint32Array( 4 );
133
132
  const intClearColor = new Int32Array( 4 );
133
+ const objectPosition = new Vector3();
134
134
 
135
135
  let currentRenderList = null;
136
136
  let currentRenderState = null;
@@ -293,6 +293,7 @@ class WebGLRenderer {
293
293
  const _this = this;
294
294
 
295
295
  let _isContextLost = false;
296
+ let _nodesHandler = null;
296
297
 
297
298
  // internal state cache
298
299
 
@@ -727,7 +728,7 @@ class WebGLRenderer {
727
728
 
728
729
  if ( _outputBufferType === UnsignedByteType ) {
729
730
 
730
- console.error( 'THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.' );
731
+ error( 'THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.' );
731
732
  return;
732
733
 
733
734
  }
@@ -738,7 +739,7 @@ class WebGLRenderer {
738
739
 
739
740
  if ( effects[ i ].isOutputPass === true ) {
740
741
 
741
- console.warn( 'THREE.WebGLRenderer: OutputPass is not needed in setEffects(). Tone mapping and color space conversion are applied automatically.' );
742
+ warn( 'THREE.WebGLRenderer: OutputPass is not needed in setEffects(). Tone mapping and color space conversion are applied automatically.' );
742
743
  break;
743
744
 
744
745
  }
@@ -998,6 +999,7 @@ class WebGLRenderer {
998
999
  if ( depth ) {
999
1000
 
1000
1001
  bits |= _gl.DEPTH_BUFFER_BIT;
1002
+ this.state.buffers.depth.setMask( true );
1001
1003
 
1002
1004
  }
1003
1005
 
@@ -1043,6 +1045,20 @@ class WebGLRenderer {
1043
1045
 
1044
1046
  };
1045
1047
 
1048
+ /**
1049
+ * Sets a compatibility node builder for rendering node materials with WebGLRenderer.
1050
+ * This enables using TSL (Three.js Shading Language) node materials to prepare
1051
+ * for migration to WebGPURenderer.
1052
+ *
1053
+ * @param {WebGLNodesHandler} nodesHandler - The node builder instance.
1054
+ */
1055
+ this.setNodesHandler = function ( nodesHandler ) {
1056
+
1057
+ nodesHandler.setRenderer( this );
1058
+ _nodesHandler = nodesHandler;
1059
+
1060
+ };
1061
+
1046
1062
  /**
1047
1063
  * Frees the GPU-related resources allocated by this instance. Call this
1048
1064
  * method whenever this instance is no longer used in your app.
@@ -1278,33 +1294,23 @@ class WebGLRenderer {
1278
1294
 
1279
1295
  if ( object.isBatchedMesh ) {
1280
1296
 
1281
- if ( object._multiDrawInstances !== null ) {
1282
-
1283
- // @deprecated, r174
1284
- warnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
1285
- renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
1286
-
1287
- } else {
1288
-
1289
- if ( ! extensions.get( 'WEBGL_multi_draw' ) ) {
1297
+ if ( ! extensions.get( 'WEBGL_multi_draw' ) ) {
1290
1298
 
1291
- const starts = object._multiDrawStarts;
1292
- const counts = object._multiDrawCounts;
1293
- const drawCount = object._multiDrawCount;
1294
- const bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;
1295
- const uniforms = properties.get( material ).currentProgram.getUniforms();
1296
- for ( let i = 0; i < drawCount; i ++ ) {
1299
+ const starts = object._multiDrawStarts;
1300
+ const counts = object._multiDrawCounts;
1301
+ const drawCount = object._multiDrawCount;
1302
+ const bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;
1303
+ const uniforms = properties.get( material ).currentProgram.getUniforms();
1304
+ for ( let i = 0; i < drawCount; i ++ ) {
1297
1305
 
1298
- uniforms.setValue( _gl, '_gl_DrawID', i );
1299
- renderer.render( starts[ i ] / bytesPerElement, counts[ i ] );
1306
+ uniforms.setValue( _gl, '_gl_DrawID', i );
1307
+ renderer.render( starts[ i ] / bytesPerElement, counts[ i ] );
1300
1308
 
1301
- }
1302
-
1303
- } else {
1309
+ }
1304
1310
 
1305
- renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
1311
+ } else {
1306
1312
 
1307
- }
1313
+ renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
1308
1314
 
1309
1315
  }
1310
1316
 
@@ -1603,6 +1609,13 @@ class WebGLRenderer {
1603
1609
 
1604
1610
  if ( _isContextLost === true ) return;
1605
1611
 
1612
+ // update node builder if available
1613
+ if ( _nodesHandler !== null ) {
1614
+
1615
+ _nodesHandler.renderStart( scene, camera );
1616
+
1617
+ }
1618
+
1606
1619
  // use internal render target for HalfFloatType color buffer (only when tone mapping is enabled)
1607
1620
 
1608
1621
  const isXRPresenting = xr.enabled === true && xr.isPresenting === true;
@@ -1631,6 +1644,7 @@ class WebGLRenderer {
1631
1644
  currentRenderState = renderStates.get( scene, renderStateStack.length );
1632
1645
  currentRenderState.init( camera );
1633
1646
 
1647
+ currentRenderState.state.textureUnits = textures.getTextureUnits();
1634
1648
  renderStateStack.push( currentRenderState );
1635
1649
 
1636
1650
  _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
@@ -1776,6 +1790,8 @@ class WebGLRenderer {
1776
1790
 
1777
1791
  currentRenderState = renderStateStack[ renderStateStack.length - 1 ];
1778
1792
 
1793
+ textures.setTextureUnits( currentRenderState.state.textureUnits );
1794
+
1779
1795
  if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );
1780
1796
 
1781
1797
  } else {
@@ -1796,6 +1812,12 @@ class WebGLRenderer {
1796
1812
 
1797
1813
  }
1798
1814
 
1815
+ if ( _nodesHandler !== null ) {
1816
+
1817
+ _nodesHandler.renderEnd();
1818
+
1819
+ }
1820
+
1799
1821
  };
1800
1822
 
1801
1823
  function projectObject( object, camera, groupOrder, sortObjects ) {
@@ -1814,6 +1836,10 @@ class WebGLRenderer {
1814
1836
 
1815
1837
  if ( object.autoUpdate === true ) object.update( camera );
1816
1838
 
1839
+ } else if ( object.isLightProbeGrid ) {
1840
+
1841
+ currentRenderState.pushLightProbeGrid( object );
1842
+
1817
1843
  } else if ( object.isLight ) {
1818
1844
 
1819
1845
  currentRenderState.pushLight( object );
@@ -2129,7 +2155,7 @@ class WebGLRenderer {
2129
2155
 
2130
2156
  const lightsStateVersion = lights.state.version;
2131
2157
 
2132
- const parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );
2158
+ const parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object, currentRenderState.state.lightProbeGridArray );
2133
2159
  const programCacheKey = programCache.getProgramCacheKey( parameters );
2134
2160
 
2135
2161
  let programs = materialProperties.programs;
@@ -2172,6 +2198,13 @@ class WebGLRenderer {
2172
2198
 
2173
2199
  parameters.uniforms = programCache.getUniforms( material );
2174
2200
 
2201
+ // Use node builder for node materials if available
2202
+ if ( _nodesHandler !== null && material.isNodeMaterial ) {
2203
+
2204
+ _nodesHandler.build( material, object, parameters );
2205
+
2206
+ }
2207
+
2175
2208
  material.onBeforeCompile( parameters, _this );
2176
2209
 
2177
2210
  program = programCache.acquireProgram( parameters, programCacheKey );
@@ -2221,6 +2254,8 @@ class WebGLRenderer {
2221
2254
 
2222
2255
  }
2223
2256
 
2257
+ materialProperties.lightProbeGrid = currentRenderState.state.lightProbeGridArray.length > 0;
2258
+
2224
2259
  materialProperties.currentProgram = program;
2225
2260
  materialProperties.uniformsList = null;
2226
2261
 
@@ -2264,6 +2299,30 @@ class WebGLRenderer {
2264
2299
 
2265
2300
  }
2266
2301
 
2302
+ function findLightProbeGrid( volumes, object ) {
2303
+
2304
+ if ( volumes.length === 0 ) return null;
2305
+
2306
+ if ( volumes.length === 1 ) {
2307
+
2308
+ return volumes[ 0 ].texture !== null ? volumes[ 0 ] : null;
2309
+
2310
+ }
2311
+
2312
+ objectPosition.setFromMatrixPosition( object.matrixWorld );
2313
+
2314
+ for ( let i = 0, l = volumes.length; i < l; i ++ ) {
2315
+
2316
+ const v = volumes[ i ];
2317
+
2318
+ if ( v.texture !== null && v.boundingBox.containsPoint( objectPosition ) ) return v;
2319
+
2320
+ }
2321
+
2322
+ return null;
2323
+
2324
+ }
2325
+
2267
2326
  function setProgram( camera, scene, geometry, material, object ) {
2268
2327
 
2269
2328
  if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...
@@ -2272,7 +2331,7 @@ class WebGLRenderer {
2272
2331
 
2273
2332
  const fog = scene.fog;
2274
2333
  const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null;
2275
- const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );
2334
+ const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : ColorManagement.workingColorSpace );
2276
2335
  const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap );
2277
2336
  const envMap = environments.get( material.envMap || environment, usePMREM );
2278
2337
  const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;
@@ -2428,6 +2487,10 @@ class WebGLRenderer {
2428
2487
 
2429
2488
  needsProgramChange = true;
2430
2489
 
2490
+ } else if ( !! materialProperties.lightProbeGrid !== ( currentRenderState.state.lightProbeGridArray.length > 0 ) ) {
2491
+
2492
+ needsProgramChange = true;
2493
+
2431
2494
  }
2432
2495
 
2433
2496
  } else {
@@ -2445,6 +2508,14 @@ class WebGLRenderer {
2445
2508
 
2446
2509
  program = getProgram( material, scene, object );
2447
2510
 
2511
+ // notify the node builder that the program has changed so uniforms and update nodes can
2512
+ // be cached and triggered.
2513
+ if ( _nodesHandler && material.isNodeMaterial ) {
2514
+
2515
+ _nodesHandler.onUpdateProgram( material, program, materialProperties );
2516
+
2517
+ }
2518
+
2448
2519
  }
2449
2520
 
2450
2521
  let refreshProgram = false;
@@ -2470,6 +2541,19 @@ class WebGLRenderer {
2470
2541
 
2471
2542
  }
2472
2543
 
2544
+ if ( materialProperties.needsLights ) {
2545
+
2546
+ const objectVolume = findLightProbeGrid( currentRenderState.state.lightProbeGridArray, object );
2547
+
2548
+ if ( materialProperties.lightProbeGrid !== objectVolume ) {
2549
+
2550
+ materialProperties.lightProbeGrid = objectVolume;
2551
+ refreshMaterial = true;
2552
+
2553
+ }
2554
+
2555
+ }
2556
+
2473
2557
  if ( refreshProgram || _currentCamera !== camera ) {
2474
2558
 
2475
2559
  // common camera uniforms
@@ -2578,7 +2662,7 @@ class WebGLRenderer {
2578
2662
  if ( object.isBatchedMesh ) {
2579
2663
 
2580
2664
  p_uniforms.setOptional( _gl, object, 'batchingTexture' );
2581
- if ( objects._matricesTexture !== null ) {
2665
+ if ( object._matricesTexture !== null ) {
2582
2666
 
2583
2667
  p_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );
2584
2668
 
@@ -2657,6 +2741,19 @@ class WebGLRenderer {
2657
2741
 
2658
2742
  materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );
2659
2743
 
2744
+ // light probe volume
2745
+
2746
+ if ( materialProperties.needsLights && materialProperties.lightProbeGrid ) {
2747
+
2748
+ const volume = materialProperties.lightProbeGrid;
2749
+
2750
+ m_uniforms.probesSH.value = volume.texture;
2751
+ m_uniforms.probesMin.value.copy( volume.boundingBox.min );
2752
+ m_uniforms.probesMax.value.copy( volume.boundingBox.max );
2753
+ m_uniforms.probesResolution.value.copy( volume.resolution );
2754
+
2755
+ }
2756
+
2660
2757
  WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );
2661
2758
 
2662
2759
  }
@@ -2682,7 +2779,7 @@ class WebGLRenderer {
2682
2779
 
2683
2780
  // UBOs
2684
2781
 
2685
- if ( material.isShaderMaterial || material.isRawShaderMaterial ) {
2782
+ if ( material.uniformsGroups !== undefined ) {
2686
2783
 
2687
2784
  const groups = material.uniformsGroups;
2688
2785
 
@@ -3258,22 +3355,24 @@ class WebGLRenderer {
3258
3355
 
3259
3356
  }
3260
3357
 
3261
- _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
3262
- _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
3263
- _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
3358
+ state.activeTexture( _gl.TEXTURE0 ); // see #33153
3359
+
3360
+ state.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
3361
+ state.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
3362
+ state.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
3264
3363
 
3265
3364
  // used for copying data from cpu
3266
- const currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
3267
- const currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
3268
- const currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
3269
- const currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
3270
- const currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
3271
-
3272
- _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
3273
- _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
3274
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );
3275
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );
3276
- _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );
3365
+ const currentUnpackRowLen = state.getParameter( _gl.UNPACK_ROW_LENGTH );
3366
+ const currentUnpackImageHeight = state.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
3367
+ const currentUnpackSkipPixels = state.getParameter( _gl.UNPACK_SKIP_PIXELS );
3368
+ const currentUnpackSkipRows = state.getParameter( _gl.UNPACK_SKIP_ROWS );
3369
+ const currentUnpackSkipImages = state.getParameter( _gl.UNPACK_SKIP_IMAGES );
3370
+
3371
+ state.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
3372
+ state.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
3373
+ state.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );
3374
+ state.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );
3375
+ state.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );
3277
3376
 
3278
3377
  // set up the src texture
3279
3378
  const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;
@@ -3399,11 +3498,11 @@ class WebGLRenderer {
3399
3498
  }
3400
3499
 
3401
3500
  // reset values
3402
- _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );
3403
- _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );
3404
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );
3405
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );
3406
- _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );
3501
+ state.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );
3502
+ state.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );
3503
+ state.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );
3504
+ state.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );
3505
+ state.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );
3407
3506
 
3408
3507
  // Generate mipmaps only when copying level 0
3409
3508
  if ( dstLevel === 0 && dstTexture.generateMipmaps ) {
@@ -10,7 +10,7 @@ class Animation {
10
10
  * Constructs a new animation loop management component.
11
11
  *
12
12
  * @param {Renderer} renderer - A reference to the main renderer.
13
- * @param {Nodes} nodes - Renderer component for managing nodes related logic.
13
+ * @param {NodeManager} nodes - Renderer component for managing nodes related logic.
14
14
  * @param {Info} info - Renderer component for managing metrics and monitoring data.
15
15
  */
16
16
  constructor( renderer, nodes, info ) {
@@ -25,7 +25,7 @@ class Animation {
25
25
  /**
26
26
  * Renderer component for managing nodes related logic.
27
27
  *
28
- * @type {Nodes}
28
+ * @type {NodeManager}
29
29
  */
30
30
  this.nodes = nodes;
31
31
 
@@ -95,7 +95,7 @@ class Animation {
95
95
  */
96
96
  stop() {
97
97
 
98
- this._context.cancelAnimationFrame( this._requestId );
98
+ if ( this._context !== null ) this._context.cancelAnimationFrame( this._requestId );
99
99
 
100
100
  this._requestId = null;
101
101
 
@@ -15,8 +15,9 @@ class Attributes extends DataMap {
15
15
  * Constructs a new attribute management component.
16
16
  *
17
17
  * @param {Backend} backend - The renderer's backend.
18
+ * @param {Info} info - Renderer component for managing metrics and monitoring data.
18
19
  */
19
- constructor( backend ) {
20
+ constructor( backend, info ) {
20
21
 
21
22
  super();
22
23
 
@@ -27,6 +28,13 @@ class Attributes extends DataMap {
27
28
  */
28
29
  this.backend = backend;
29
30
 
31
+ /**
32
+ * Renderer component for managing metrics and monitoring data.
33
+ *
34
+ * @type {Info}
35
+ */
36
+ this.info = info;
37
+
30
38
  }
31
39
 
32
40
  /**
@@ -43,6 +51,8 @@ class Attributes extends DataMap {
43
51
 
44
52
  this.backend.destroyAttribute( attribute );
45
53
 
54
+ this.info.destroyAttribute( attribute );
55
+
46
56
  }
47
57
 
48
58
  return attributeData;
@@ -65,18 +75,22 @@ class Attributes extends DataMap {
65
75
  if ( type === AttributeType.VERTEX ) {
66
76
 
67
77
  this.backend.createAttribute( attribute );
78
+ this.info.createAttribute( attribute );
68
79
 
69
80
  } else if ( type === AttributeType.INDEX ) {
70
81
 
71
82
  this.backend.createIndexAttribute( attribute );
83
+ this.info.createIndexAttribute( attribute );
72
84
 
73
85
  } else if ( type === AttributeType.STORAGE ) {
74
86
 
75
87
  this.backend.createStorageAttribute( attribute );
88
+ this.info.createStorageAttribute( attribute );
76
89
 
77
90
  } else if ( type === AttributeType.INDIRECT ) {
78
91
 
79
92
  this.backend.createIndirectStorageAttribute( attribute );
93
+ this.info.createIndirectStorageAttribute( attribute );
80
94
 
81
95
  }
82
96
 
@@ -604,14 +604,6 @@ class Backend {
604
604
  */
605
605
  hasFeature( /*name*/ ) {}
606
606
 
607
- /**
608
- * Returns the maximum anisotropy texture filtering value.
609
- *
610
- * @abstract
611
- * @return {number} The maximum anisotropy texture filtering value.
612
- */
613
- getMaxAnisotropy() {}
614
-
615
607
  /**
616
608
  * Returns the drawing buffer size.
617
609
  *
@@ -22,7 +22,7 @@ class Background extends DataMap {
22
22
  * Constructs a new background management component.
23
23
  *
24
24
  * @param {Renderer} renderer - The renderer.
25
- * @param {Nodes} nodes - Renderer component for managing nodes related logic.
25
+ * @param {NodeManager} nodes - Renderer component for managing nodes related logic.
26
26
  */
27
27
  constructor( renderer, nodes ) {
28
28
 
@@ -38,7 +38,7 @@ class Background extends DataMap {
38
38
  /**
39
39
  * Renderer component for managing nodes related logic.
40
40
  *
41
- * @type {Nodes}
41
+ * @type {NodeManager}
42
42
  */
43
43
  this.nodes = nodes;
44
44
 
@@ -16,7 +16,7 @@ class BindGroup {
16
16
  * @param {Array<Binding>} bindings - An array of bindings.
17
17
  * @param {number} index - The group index.
18
18
  */
19
- constructor( name = '', bindings = [], index = 0 ) {
19
+ constructor( name = '', bindings = [] ) {
20
20
 
21
21
  /**
22
22
  * The bind group's name.
@@ -32,13 +32,6 @@ class BindGroup {
32
32
  */
33
33
  this.bindings = bindings;
34
34
 
35
- /**
36
- * The group index.
37
- *
38
- * @type {number}
39
- */
40
- this.index = index;
41
-
42
35
  /**
43
36
  * The group's ID.
44
37
  *
@@ -13,7 +13,7 @@ class Bindings extends DataMap {
13
13
  * Constructs a new bindings management component.
14
14
  *
15
15
  * @param {Backend} backend - The renderer's backend.
16
- * @param {Nodes} nodes - Renderer component for managing nodes related logic.
16
+ * @param {NodeManager} nodes - Renderer component for managing nodes related logic.
17
17
  * @param {Textures} textures - Renderer component for managing textures.
18
18
  * @param {Attributes} attributes - Renderer component for managing attributes.
19
19
  * @param {Pipelines} pipelines - Renderer component for managing pipelines.
@@ -54,7 +54,7 @@ class Bindings extends DataMap {
54
54
  /**
55
55
  * Renderer component for managing nodes related logic.
56
56
  *
57
- * @type {Nodes}
57
+ * @type {NodeManager}
58
58
  */
59
59
  this.nodes = nodes;
60
60
 
@@ -9,7 +9,7 @@ import Pipeline from './Pipeline.js';
9
9
  class ComputePipeline extends Pipeline {
10
10
 
11
11
  /**
12
- * Constructs a new render pipeline.
12
+ * Constructs a new compute pipeline.
13
13
  *
14
14
  * @param {string} cacheKey - The pipeline's cache key.
15
15
  * @param {ProgrammableStage} computeProgram - The pipeline's compute shader.
@@ -109,7 +109,7 @@ class CubeRenderTarget extends RenderTarget {
109
109
  renderer.setMRT( currentMRT );
110
110
 
111
111
  texture.minFilter = currentMinFilter;
112
- texture.currentGenerateMipmaps = currentGenerateMipmaps;
112
+ texture.generateMipmaps = currentGenerateMipmaps;
113
113
 
114
114
  mesh.geometry.dispose();
115
115
  mesh.material.dispose();