@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -122,11 +122,13 @@ class NodeBuilderState {
122
122
  * on the existing bind groups of this state. Shared groups are
123
123
  * not cloned.
124
124
  *
125
+ * @param {Bindings} bindings - Renderer component for managing bindings.
126
+ * @param {RenderContext} renderContext - The render context.
125
127
  * @return {Array<BindGroup>} A array of bind groups.
126
128
  */
127
- createBindings() {
129
+ createBindings( bindings, renderContext ) {
128
130
 
129
- const bindings = [];
131
+ const bindGroups = [];
130
132
 
131
133
  for ( const instanceGroup of this.bindings ) {
132
134
 
@@ -135,7 +137,7 @@ class NodeBuilderState {
135
137
  if ( shared !== true ) {
136
138
 
137
139
  const bindingsGroup = new BindGroup( instanceGroup.name, [] );
138
- bindings.push( bindingsGroup );
140
+ bindGroups.push( bindingsGroup );
139
141
 
140
142
  for ( const instanceBinding of instanceGroup.bindings ) {
141
143
 
@@ -145,13 +147,13 @@ class NodeBuilderState {
145
147
 
146
148
  } else {
147
149
 
148
- bindings.push( instanceGroup );
150
+ bindGroups.push( bindings.getSharedBindGroup( instanceGroup, renderContext ) );
149
151
 
150
152
  }
151
153
 
152
154
  }
153
155
 
154
- return bindings;
156
+ return bindGroups;
155
157
 
156
158
  }
157
159
 
@@ -1,4 +1,4 @@
1
- import { warn } from '../../../utils.js';
1
+ import { warn, warnOnce } from '../../../utils.js';
2
2
 
3
3
  /**
4
4
  * The purpose of a node library is to assign node implementations
@@ -15,13 +15,6 @@ class NodeLibrary {
15
15
  */
16
16
  constructor() {
17
17
 
18
- /**
19
- * A weak map that maps lights to light nodes.
20
- *
21
- * @type {WeakMap<Light.constructor,AnalyticLightNode.constructor>}
22
- */
23
- this.lightNodes = new WeakMap();
24
-
25
18
  /**
26
19
  * A map that maps materials to node materials.
27
20
  *
@@ -124,24 +117,30 @@ class NodeLibrary {
124
117
  /**
125
118
  * Returns a light node class definition for a light class definition.
126
119
  *
127
- * @param {Light.constructor} light - The light class definition.
120
+ * @deprecated since r187. Use `Light.registerNode()` to assign light node classes instead.
121
+ * @param {Light.constructor} lightClass - The light class definition.
128
122
  * @return {?AnalyticLightNode.constructor} The light node class definition. Returns `null` if no light node is found.
129
123
  */
130
- getLightNodeClass( light ) {
124
+ getLightNodeClass( lightClass ) {
125
+
126
+ warnOnce( 'NodeLibrary: "getLightNodeClass()" has been deprecated. Use "Light.registerNode()" to assign light node classes instead.' ); // @deprecated r187
131
127
 
132
- return this.lightNodes.get( light ) || null;
128
+ return lightClass.prototype._lightNode || null;
133
129
 
134
130
  }
135
131
 
136
132
  /**
137
133
  * Adds a light node class definition for a given light class definition.
138
134
  *
135
+ * @deprecated since r187. Use `Light.registerNode()` instead.
139
136
  * @param {AnalyticLightNode.constructor} lightNodeClass - The light node class definition.
140
137
  * @param {Light.constructor} lightClass - The light class definition.
141
138
  */
142
139
  addLight( lightNodeClass, lightClass ) {
143
140
 
144
- this.addClass( lightNodeClass, lightClass, this.lightNodes );
141
+ warnOnce( 'NodeLibrary: "addLight()" has been deprecated. Use "Light.registerNode()" instead.' ); // @deprecated r187
142
+
143
+ lightClass.registerNode( lightNodeClass );
145
144
 
146
145
  }
147
146
 
@@ -168,29 +167,6 @@ class NodeLibrary {
168
167
 
169
168
  }
170
169
 
171
- /**
172
- * Adds a node class definition for the given class definition to the provided type library.
173
- *
174
- * @param {Node.constructor} nodeClass - The node class definition.
175
- * @param {Node.constructor} baseClass - The class definition.
176
- * @param {WeakMap<Node.constructor, Node.constructor>} library - The type library.
177
- */
178
- addClass( nodeClass, baseClass, library ) {
179
-
180
- if ( library.has( baseClass ) ) {
181
-
182
- warn( `Redefinition of node ${ baseClass.name }` );
183
- return;
184
-
185
- }
186
-
187
- if ( typeof nodeClass !== 'function' ) throw new Error( `THREE.NodeLibrary: Node class ${ nodeClass.name } is not a class.` );
188
- if ( typeof baseClass !== 'function' ) throw new Error( `THREE.NodeLibrary: Base class ${ baseClass.name } is not a class.` );
189
-
190
- library.set( baseClass, nodeClass );
191
-
192
- }
193
-
194
170
  }
195
171
 
196
172
  export default NodeLibrary;
@@ -7,9 +7,9 @@ import { NodeFrame, NodeUpdateType, StackTrace } from '../../../nodes/Nodes.js';
7
7
  import { renderGroup, cubeTexture, texture, fog, rangeFogFactor, densityFogFactor, reference, pmremTexture, screenUV, uniform } from '../../../nodes/TSL.js';
8
8
  import { builtin } from '../../../nodes/accessors/BuiltinNode.js';
9
9
 
10
- import { CubeUVReflectionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
10
+ import { EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
11
11
  import { hashArray } from '../../../nodes/core/NodeUtils.js';
12
- import { error } from '../../../utils.js';
12
+ import { error, yieldToMain } from '../../../utils.js';
13
13
 
14
14
  const _chainKeys = [];
15
15
  const _cacheKeyValues = [];
@@ -188,14 +188,36 @@ class NodeManager extends DataMap {
188
188
 
189
189
  }
190
190
 
191
+ /**
192
+ * Logs an error thrown while building a node material.
193
+ *
194
+ * @private
195
+ * @param {Error} e - The build error.
196
+ */
197
+ _reportBuildError( e ) {
198
+
199
+ let stackTrace = e.stackTrace;
200
+
201
+ if ( ! stackTrace && e.stack ) {
202
+
203
+ // Capture stack trace for JavaScript errors
204
+
205
+ stackTrace = new StackTrace( e.stack );
206
+
207
+ }
208
+
209
+ error( 'TSL: ' + e, stackTrace );
210
+
211
+ }
212
+
191
213
  /**
192
214
  * Returns a node builder state for the given render object.
193
215
  *
194
216
  * @param {RenderObject} renderObject - The render object.
195
- * @param {boolean} [useAsync=false] - Whether to use async build with yielding.
217
+ * @param {?Function} [yieldFn=null] - If set, the build is async and yields to the main thread via this function.
196
218
  * @return {NodeBuilderState|Promise<NodeBuilderState>} The node builder state (or Promise if async).
197
219
  */
198
- getForRender( renderObject, useAsync = false ) {
220
+ getForRender( renderObject, yieldFn = null ) {
199
221
 
200
222
  const renderObjectData = this.get( renderObject );
201
223
 
@@ -217,9 +239,9 @@ class NodeManager extends DataMap {
217
239
 
218
240
  try {
219
241
 
220
- if ( useAsync ) {
242
+ if ( yieldFn !== null ) {
221
243
 
222
- await nodeBuilder.buildAsync();
244
+ await nodeBuilder.buildAsync( yieldFn );
223
245
 
224
246
  } else {
225
247
 
@@ -231,9 +253,9 @@ class NodeManager extends DataMap {
231
253
 
232
254
  nodeBuilder = this._createNodeBuilder( renderObject, new NodeMaterial() );
233
255
 
234
- if ( useAsync ) {
256
+ if ( yieldFn !== null ) {
235
257
 
236
- await nodeBuilder.buildAsync();
258
+ await nodeBuilder.buildAsync( yieldFn );
237
259
 
238
260
  } else {
239
261
 
@@ -241,7 +263,7 @@ class NodeManager extends DataMap {
241
263
 
242
264
  }
243
265
 
244
- error( 'TSL: ' + e );
266
+ this._reportBuildError( e );
245
267
 
246
268
  }
247
269
 
@@ -249,12 +271,12 @@ class NodeManager extends DataMap {
249
271
 
250
272
  };
251
273
 
252
- if ( useAsync ) {
274
+ if ( yieldFn !== null ) {
253
275
 
254
276
  return buildNodeBuilder().then( ( nodeBuilder ) => {
255
277
 
256
278
  nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
257
- nodeBuilderCache.set( cacheKey, nodeBuilderState );
279
+ if ( nodeBuilder.objectSpecific === false ) nodeBuilderCache.set( cacheKey, nodeBuilderState );
258
280
  nodeBuilderState.usedTimes ++;
259
281
  renderObjectData.nodeBuilderState = nodeBuilderState;
260
282
 
@@ -276,23 +298,13 @@ class NodeManager extends DataMap {
276
298
  nodeBuilder = this._createNodeBuilder( renderObject, new NodeMaterial() );
277
299
  nodeBuilder.build();
278
300
 
279
- let stackTrace = e.stackTrace;
280
-
281
- if ( ! stackTrace && e.stack ) {
282
-
283
- // Capture stack trace for JavaScript errors
284
-
285
- stackTrace = new StackTrace( e.stack );
286
-
287
- }
288
-
289
- error( 'TSL: ' + e, stackTrace );
301
+ this._reportBuildError( e );
290
302
 
291
303
  }
292
304
 
293
305
  nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
294
306
 
295
- nodeBuilderCache.set( cacheKey, nodeBuilderState );
307
+ if ( nodeBuilder.objectSpecific === false ) nodeBuilderCache.set( cacheKey, nodeBuilderState );
296
308
 
297
309
  }
298
310
 
@@ -313,11 +325,12 @@ class NodeManager extends DataMap {
313
325
  * Use this in compileAsync() to prevent blocking the main thread.
314
326
  *
315
327
  * @param {RenderObject} renderObject - The render object.
328
+ * @param {Function} [yieldFn=yieldToMain] - The function used to yield to the main thread.
316
329
  * @return {Promise<NodeBuilderState>} A promise that resolves to the node builder state.
317
330
  */
318
- getForRenderAsync( renderObject ) {
331
+ getForRenderAsync( renderObject, yieldFn = yieldToMain ) {
319
332
 
320
- const result = this.getForRender( renderObject, true );
333
+ const result = this.getForRender( renderObject, yieldFn );
321
334
 
322
335
  // Ensure we always return a Promise (cache hit returns nodeBuilderState directly)
323
336
  if ( result.then ) {
@@ -451,9 +464,10 @@ class NodeManager extends DataMap {
451
464
  *
452
465
  * @param {Node} computeNode - The compute node.
453
466
  * @param {boolean} [useAsync=false] - Whether to use async build with yielding.
467
+ * @param {Function} [yieldFn=yieldToMain] - The function used to yield to the main thread in an async build.
454
468
  * @return {NodeBuilderState|Promise<NodeBuilderState>} The node builder state (or Promise if async).
455
469
  */
456
- getForCompute( computeNode, useAsync = false ) {
470
+ getForCompute( computeNode, useAsync = false, yieldFn = yieldToMain ) {
457
471
 
458
472
  const computeData = this.get( computeNode );
459
473
 
@@ -470,7 +484,7 @@ class NodeManager extends DataMap {
470
484
 
471
485
  if ( useAsync ) {
472
486
 
473
- return nodeBuilder.buildAsync().then( () => {
487
+ return nodeBuilder.buildAsync( yieldFn ).then( () => {
474
488
 
475
489
  nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
476
490
 
@@ -501,11 +515,12 @@ class NodeManager extends DataMap {
501
515
  * Use this in compileComputeAsync() to prevent blocking the main thread.
502
516
  *
503
517
  * @param {Node} computeNode - The compute node.
518
+ * @param {Function} [yieldFn=yieldToMain] - The function used to yield to the main thread.
504
519
  * @return {Promise<NodeBuilderState>} A promise that resolves to the node builder state.
505
520
  */
506
- getForComputeAsync( computeNode ) {
521
+ getForComputeAsync( computeNode, yieldFn = yieldToMain ) {
507
522
 
508
- const result = this.getForCompute( computeNode, true );
523
+ const result = this.getForCompute( computeNode, true, yieldFn );
509
524
 
510
525
  if ( result.then ) {
511
526
 
@@ -624,6 +639,40 @@ class NodeManager extends DataMap {
624
639
 
625
640
  }
626
641
 
642
+ /**
643
+ * Returns the custom program cache key of the given material. Since
644
+ * computing the key traverses the material's node graph, the result
645
+ * is cached per material version if possible.
646
+ *
647
+ * @param {Material} material - The material.
648
+ * @param {Scene} scene - The scene.
649
+ * @return {string} The custom program cache key.
650
+ */
651
+ getCustomProgramCacheKey( material, scene ) {
652
+
653
+ if ( material === scene.overrideMaterial ) {
654
+
655
+ // override materials can't be cached since they dynamically change node properties
656
+
657
+ return material.customProgramCacheKey();
658
+
659
+ } else {
660
+
661
+ const materialData = this.get( material );
662
+
663
+ if ( materialData.cacheKeyVersion !== material.version ) {
664
+
665
+ materialData.cacheKeyVersion = material.version;
666
+ materialData.cacheKey = material.customProgramCacheKey();
667
+
668
+ }
669
+
670
+ return materialData.cacheKey;
671
+
672
+ }
673
+
674
+ }
675
+
627
676
  /**
628
677
  * Returns a cache key for the given scene and lights node.
629
678
  * This key is used by `RenderObject` as a part of the dynamic
@@ -710,9 +759,9 @@ class NodeManager extends DataMap {
710
759
 
711
760
  const backgroundNode = this.getCacheNode( 'background', background, () => {
712
761
 
713
- if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping || background.mapping === CubeUVReflectionMapping ) ) {
762
+ if ( background.isCubeTexture === true || background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
714
763
 
715
- if ( scene.backgroundBlurriness > 0 || background.mapping === CubeUVReflectionMapping ) {
764
+ if ( scene.backgroundBlurriness > 0 || background.isPMREMTexture === true ) {
716
765
 
717
766
  return pmremTexture( background );
718
767
 
@@ -67,6 +67,20 @@ class NodeSampledTexture extends SampledTexture {
67
67
 
68
68
  }
69
69
 
70
+ /**
71
+ * Clones the binding.
72
+ *
73
+ * @return {NodeSampledTexture} The cloned binding.
74
+ */
75
+ clone() {
76
+
77
+ const binding = super.clone();
78
+ binding.texture = this.textureNode.value; // copy current node value to avoid stale references
79
+
80
+ return binding;
81
+
82
+ }
83
+
70
84
  }
71
85
 
72
86
  /**
@@ -57,6 +57,20 @@ class NodeSampler extends Sampler {
57
57
 
58
58
  }
59
59
 
60
+ /**
61
+ * Clones the binding.
62
+ *
63
+ * @return {NodeSampler} The cloned binding.
64
+ */
65
+ clone() {
66
+
67
+ const binding = super.clone();
68
+ binding.texture = this.textureNode.value; // copy current node value to avoid stale references
69
+
70
+ return binding;
71
+
72
+ }
73
+
60
74
  }
61
75
 
62
76
  export default NodeSampler;
@@ -22,7 +22,7 @@ class NodeStorageBuffer extends StorageBuffer {
22
22
 
23
23
  const label = nodeUniform && nodeUniform.name ? nodeUniform.name : _id ++;
24
24
 
25
- super( 'StorageBuffer_' + label, nodeUniform ? nodeUniform.value : null );
25
+ super( 'StorageBuffer_' + label );
26
26
 
27
27
  /**
28
28
  * The node uniform.
@@ -1,5 +1,4 @@
1
1
  import UniformBuffer from '../UniformBuffer.js';
2
- import { getFloatLength } from '../BufferUtils.js';
3
2
 
4
3
  let _id = 0;
5
4
 
@@ -22,7 +21,7 @@ class NodeUniformBuffer extends UniformBuffer {
22
21
 
23
22
  const label = nodeUniform && nodeUniform.name ? nodeUniform.name : _id ++;
24
23
 
25
- super( 'UniformBuffer_' + label, nodeUniform ? nodeUniform.value : null );
24
+ super( 'UniformBuffer_' + label );
26
25
 
27
26
  /**
28
27
  * The uniform buffer node.
@@ -92,18 +91,6 @@ class NodeUniformBuffer extends UniformBuffer {
92
91
 
93
92
  }
94
93
 
95
- /**
96
- * The buffer's byte length.
97
- *
98
- * @type {number}
99
- * @readonly
100
- */
101
- get byteLength() {
102
-
103
- return getFloatLength( this.buffer.byteLength );
104
-
105
- }
106
-
107
94
  /**
108
95
  * The uniform buffer.
109
96
  *
@@ -3,11 +3,20 @@ export default /* glsl */`
3
3
 
4
4
  uniform float envMapIntensity;
5
5
  uniform mat3 envMapRotation;
6
+ uniform samplerCube envMap;
7
+
8
+ #ifdef ENVMAP_TYPE_PMREM
9
+
10
+ // Invert PMREMGenerator.lodToRoughness(). Matches Filament's perceptualRoughnessToLod().
11
+ // https://github.com/google/filament/blob/main/shaders/src/surface_light_indirect.fs
12
+ float roughnessToMip( const in float roughness ) {
13
+
14
+ float r = clamp( roughness, 0.0, 1.0 );
15
+
16
+ return ENVMAP_MAX_LOD * r * ( 2.0 - r );
17
+
18
+ }
6
19
 
7
- #ifdef ENVMAP_TYPE_CUBE
8
- uniform samplerCube envMap;
9
- #else
10
- uniform sampler2D envMap;
11
20
  #endif
12
21
 
13
22
  #endif
@@ -3,11 +3,11 @@ export default /* glsl */`
3
3
 
4
4
  vec3 getIBLIrradiance( const in vec3 normal ) {
5
5
 
6
- #ifdef ENVMAP_TYPE_CUBE_UV
6
+ #ifdef ENVMAP_TYPE_PMREM
7
7
 
8
8
  vec3 worldNormal = transformNormalByInverseViewMatrix( normal, viewMatrix );
9
9
 
10
- vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );
10
+ vec4 envMapColor = textureLod( envMap, envMapRotation * worldNormal, ENVMAP_MAX_LOD );
11
11
 
12
12
  return PI * envMapColor.rgb * envMapIntensity;
13
13
 
@@ -21,7 +21,7 @@ export default /* glsl */`
21
21
 
22
22
  vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {
23
23
 
24
- #ifdef ENVMAP_TYPE_CUBE_UV
24
+ #ifdef ENVMAP_TYPE_PMREM
25
25
 
26
26
  vec3 reflectVec = reflect( - viewDir, normal );
27
27
 
@@ -30,7 +30,7 @@ export default /* glsl */`
30
30
 
31
31
  reflectVec = transformDirectionByInverseViewMatrix( reflectVec, viewMatrix );
32
32
 
33
- vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );
33
+ vec4 envMapColor = textureLod( envMap, envMapRotation * reflectVec, roughnessToMip( roughness ) );
34
34
 
35
35
  return envMapColor.rgb * envMapIntensity;
36
36
 
@@ -46,14 +46,14 @@ export default /* glsl */`
46
46
 
47
47
  vec3 getIBLRetroRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {
48
48
 
49
- #ifdef ENVMAP_TYPE_CUBE_UV
49
+ #ifdef ENVMAP_TYPE_PMREM
50
50
 
51
51
  // The retroreflective lobe returns light toward its source, so the environment is sampled along the view direction
52
52
  vec3 retroVec = normalize( mix( viewDir, normal, pow4( roughness ) ) );
53
53
 
54
54
  retroVec = transformDirectionByInverseViewMatrix( retroVec, viewMatrix );
55
55
 
56
- vec4 envMapColor = textureCubeUV( envMap, envMapRotation * retroVec, roughness );
56
+ vec4 envMapColor = textureLod( envMap, envMapRotation * retroVec, roughnessToMip( roughness ) );
57
57
 
58
58
  return envMapColor.rgb * envMapIntensity;
59
59
 
@@ -71,7 +71,7 @@ export default /* glsl */`
71
71
 
72
72
  vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {
73
73
 
74
- #ifdef ENVMAP_TYPE_CUBE_UV
74
+ #ifdef ENVMAP_TYPE_PMREM
75
75
 
76
76
  // https://google.github.io/filament/Filament.md.html#lighting/imagebasedlights/anisotropy
77
77
  vec3 bentNormal = cross( bitangent, viewDir );
@@ -92,7 +92,7 @@ export default /* glsl */`
92
92
 
93
93
  vec3 getIBLAnisotropyRetroRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {
94
94
 
95
- #ifdef ENVMAP_TYPE_CUBE_UV
95
+ #ifdef ENVMAP_TYPE_PMREM
96
96
 
97
97
  // https://google.github.io/filament/Filament.md.html#lighting/imagebasedlights/anisotropy
98
98
  vec3 bentNormal = cross( bitangent, viewDir );
@@ -1,30 +1,42 @@
1
1
  export default /* glsl */`
2
- #ifdef USE_LIGHT_PROBES_GRID
2
+ #if NUM_LIGHT_PROBE_GRIDS > 0
3
3
 
4
4
  // Single atlas 3D texture that stores all 7 SH sub-volumes stacked along Z.
5
5
  // Atlas depth = 7 * ( nz + 2 ) where nz = probesResolution.z.
6
6
  // Each sub-volume occupies ( nz + 2 ) slices: 1 padding + nz data + 1 padding.
7
7
  // Padding is a copy of the first / last data slice and prevents color bleeding
8
8
  // when the hardware linear filter reads across a sub-volume boundary.
9
- uniform highp sampler3D probesSH;
9
+ uniform highp sampler3D probesSH[ NUM_LIGHT_PROBE_GRIDS ];
10
10
 
11
- uniform vec3 probesMin;
12
- uniform vec3 probesMax;
13
- uniform vec3 probesResolution;
11
+ uniform vec3 probesMin[ NUM_LIGHT_PROBE_GRIDS ];
12
+ uniform vec3 probesMax[ NUM_LIGHT_PROBE_GRIDS ];
13
+ uniform vec3 probesResolution[ NUM_LIGHT_PROBE_GRIDS ];
14
14
 
15
- vec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) {
15
+ bool isInsideLightProbeGrid( vec3 worldPos, vec3 worldNormal, vec3 probesMin, vec3 probesMax, vec3 probesResolution ) {
16
+
17
+ vec3 spacing = ( probesMax - probesMin ) / probesResolution;
18
+ vec3 samplePos = worldPos + worldNormal * spacing * 0.5;
19
+
20
+ // Grow the bounds by 1% of a cell, so fragments on the bounds aren't left out by
21
+ // precision errors or samples outside of the triangle.
22
+
23
+ vec3 margin = spacing * 0.01;
24
+ return all( greaterThanEqual( samplePos, probesMin - margin ) ) && all( lessThanEqual( samplePos, probesMax + margin ) );
25
+
26
+ }
27
+
28
+ vec3 getLightProbeGridIrradiance( highp sampler3D probesSH, vec3 probesMin, vec3 probesMax, vec3 probesResolution, vec3 worldPos, vec3 worldNormal ) {
16
29
 
17
30
  vec3 res = probesResolution;
18
31
  vec3 gridRange = probesMax - probesMin;
19
- vec3 resMinusOne = res - 1.0;
20
- vec3 probeSpacing = gridRange / resMinusOne;
32
+ vec3 probeSpacing = gridRange / res;
21
33
 
22
34
  // Offset sample position along normal by half a probe spacing
23
35
  vec3 samplePos = worldPos + worldNormal * probeSpacing * 0.5;
24
- vec3 uvw = clamp( ( samplePos - probesMin ) / gridRange, 0.0, 1.0 );
25
36
 
26
- // Remap to texel centers of the probe grid (XY and Z)
27
- uvw = uvw * resMinusOne / res + 0.5 / res;
37
+ // The bounds hold one cell per probe, so they map directly to the probe grid.
38
+ // Clamp to the texel centers of the outermost probes (XY and Z).
39
+ vec3 uvw = clamp( ( samplePos - probesMin ) / gridRange, 0.5 / res, 1.0 - 0.5 / res );
28
40
 
29
41
  // Atlas UV mapping along Z:
30
42
  // paddedSlices = nz + 2 (1 padding texel at each end of every sub-volume)
@@ -243,11 +243,30 @@ IncidentLight directLight;
243
243
 
244
244
  #endif
245
245
 
246
- #ifdef USE_LIGHT_PROBES_GRID
246
+ #if NUM_LIGHT_PROBE_GRIDS > 0
247
247
 
248
248
  vec3 probeWorldPos = ( ( vec4( geometryPosition, 1.0 ) - viewMatrix[ 3 ] ) * viewMatrix ).xyz;
249
249
  vec3 probeWorldNormal = transformNormalByInverseViewMatrix( geometryNormal, viewMatrix );
250
- irradiance += getLightProbeGridIrradiance( probeWorldPos, probeWorldNormal );
250
+
251
+ // Sample the last grid whose cells contain the fragment.
252
+
253
+ int probeGrid = - 1;
254
+
255
+ #pragma unroll_loop_start
256
+ for ( int i = 0; i < NUM_LIGHT_PROBE_GRIDS; i ++ ) {
257
+
258
+ if ( isInsideLightProbeGrid( probeWorldPos, probeWorldNormal, probesMin[ i ], probesMax[ i ], probesResolution[ i ] ) ) probeGrid = UNROLLED_LOOP_INDEX;
259
+
260
+ }
261
+ #pragma unroll_loop_end
262
+
263
+ #pragma unroll_loop_start
264
+ for ( int i = 0; i < NUM_LIGHT_PROBE_GRIDS; i ++ ) {
265
+
266
+ if ( probeGrid == UNROLLED_LOOP_INDEX ) irradiance += getLightProbeGridIrradiance( probesSH[ i ], probesMin[ i ], probesMax[ i ], probesResolution[ i ], probeWorldPos, probeWorldNormal );
267
+
268
+ }
269
+ #pragma unroll_loop_end
251
270
 
252
271
  #endif
253
272
 
@@ -10,7 +10,7 @@ export default /* glsl */`
10
10
 
11
11
  #endif
12
12
 
13
- #if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV )
13
+ #if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_PMREM )
14
14
 
15
15
  #if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG )
16
16
 
@@ -7,10 +7,26 @@ material.metalness = metalnessFactor;
7
7
  vec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );
8
8
  float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );
9
9
 
10
- material.roughness = max( roughnessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.
10
+ // Minimum roughness, so even a perfect mirror samples a prefiltered level of the environment map.
11
+ // Matches Filament's desktop MIN_PERCEPTUAL_ROUGHNESS: https://github.com/google/filament/blob/main/shaders/src/surface_material.fs
12
+ material.roughness = max( roughnessFactor, 0.045 );
11
13
  material.roughness += geometryRoughness;
12
14
  material.roughness = min( material.roughness, 1.0 );
13
15
 
16
+ #ifdef USE_DIFFUSE_ROUGHNESS
17
+
18
+ float diffuseRoughnessFactor = diffuseRoughness;
19
+
20
+ #ifdef USE_DIFFUSE_ROUGHNESSMAP
21
+
22
+ diffuseRoughnessFactor *= texture2D( diffuseRoughnessMap, vDiffuseRoughnessMapUv ).r;
23
+
24
+ #endif
25
+
26
+ material.diffuseRoughness = saturate( diffuseRoughnessFactor );
27
+
28
+ #endif
29
+
14
30
  #ifdef IOR
15
31
 
16
32
  material.ior = ior;
@@ -73,7 +89,7 @@ material.roughness = min( material.roughness, 1.0 );
73
89
  #endif
74
90
 
75
91
  material.clearcoat = saturate( material.clearcoat ); // Burley clearcoat model
76
- material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );
92
+ material.clearcoatRoughness = max( material.clearcoatRoughness, 0.045 );
77
93
  material.clearcoatRoughness += geometryRoughness;
78
94
  material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );
79
95