@gnsx/three 0.185.16 → 0.186.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 (418) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1309 -807
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/src/utils.js +6 -79
  411. package/build/three.core.min.js +0 -6
  412. package/build/three.module.min.js +0 -6
  413. package/build/three.tsl.min.js +0 -6
  414. package/build/three.webgpu.min.js +0 -6
  415. package/build/three.webgpu.nodes.min.js +0 -6
  416. package/examples/jsm/libs/ecsy.module.js +0 -1792
  417. package/examples/jsm/loaders/LottieLoader.js +0 -130
  418. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -1,12 +1,10 @@
1
1
  import NodeMaterial from '../../../materials/nodes/NodeMaterial.js';
2
- import { getDirection, blur, ggxConvolution } from '../../../nodes/pmrem/PMREMUtils.js';
2
+ import { sphericalGaussianBlur, ggxConvolution } from '../../../nodes/pmrem/PMREMUtils.js';
3
3
  import { equirectUV } from '../../../nodes/utils/EquirectUV.js';
4
4
  import { uniform } from '../../../nodes/core/UniformNode.js';
5
- import { uniformArray } from '../../../nodes/accessors/UniformArrayNode.js';
6
5
  import { texture } from '../../../nodes/accessors/TextureNode.js';
7
6
  import { cubeTexture } from '../../../nodes/accessors/CubeTextureNode.js';
8
- import { float, uint, vec3 } from '../../../nodes/tsl/TSLBase.js';
9
- import { uv } from '../../../nodes/accessors/UV.js';
7
+ import { float, int, uint } from '../../../nodes/tsl/TSLBase.js';
10
8
  import { attribute } from '../../../nodes/core/AttributeNode.js';
11
9
 
12
10
  import { OrthographicCamera } from '../../../cameras/OrthographicCamera.js';
@@ -30,21 +28,20 @@ import {
30
28
  BackSide,
31
29
  LinearSRGBColorSpace
32
30
  } from '../../../constants.js';
33
- import { warn, error, warnOnce } from '../../../utils.js';
31
+ import { warnOnce } from '../../../utils.js';
34
32
 
35
33
  const LOD_MIN = 4;
36
34
 
37
- // The standard deviations (radians) associated with the extra mips.
35
+ // The number of extra mips.
38
36
  // Used for scene blur in fromScene() method.
39
- const EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];
37
+ const EXTRA_LODS = 6;
40
38
 
41
- // The maximum length of the blur for loop. Smaller sigmas will use fewer
42
- // samples and exit early, but not recompile the shader.
39
+ // The number of spiral samples per blur pass.
43
40
  // Used for scene blur in fromScene() method.
44
- const MAX_SAMPLES = 20;
41
+ const BLUR_SAMPLES = 20;
45
42
 
46
43
  // GGX VNDF importance sampling configuration
47
- const GGX_SAMPLES = 512;
44
+ const GGX_SAMPLES = 256;
48
45
 
49
46
  const _flatCamera = /*@__PURE__*/ new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
50
47
  const _cubeCamera = /*@__PURE__*/ new PerspectiveCamera( 90, 1 );
@@ -54,6 +51,7 @@ let _oldActiveCubeFace = 0;
54
51
  let _oldActiveMipmapLevel = 0;
55
52
 
56
53
  const _origin = /*@__PURE__*/ new Vector3();
54
+ const _direction = /*@__PURE__*/ new Vector3();
57
55
 
58
56
  // maps blur materials to their uniforms dictionary
59
57
 
@@ -65,8 +63,7 @@ const _faceLib = [
65
63
  0, 4, 2
66
64
  ];
67
65
 
68
- const _direction = /*@__PURE__*/ getDirection( uv(), attribute( 'faceIndex' ) ).normalize();
69
- const _outputDirection = /*@__PURE__*/ vec3( _direction.x, _direction.y, _direction.z );
66
+ const _outputDirection = /*@__PURE__*/ attribute( 'outputDirection' ).normalize();
70
67
 
71
68
  /**
72
69
  * This class generates a Prefiltered, Mipmapped Radiance Environment Map
@@ -99,7 +96,6 @@ class PMREMGenerator {
99
96
  this._lodMax = 0;
100
97
  this._cubeSize = 0;
101
98
  this._sizeLods = [];
102
- this._sigmas = [];
103
99
  this._lodMeshes = [];
104
100
 
105
101
  this._blurMaterial = null;
@@ -129,7 +125,7 @@ class PMREMGenerator {
129
125
  * @param {number} [far=100] - The far plane distance.
130
126
  * @param {Object} [options={}] - The configuration options.
131
127
  * @param {number} [options.size=256] - The texture size of the PMREM.
132
- * @param {Vector3} [options.renderTarget=origin] - The position of the internal cube camera that renders the scene.
128
+ * @param {Vector3} [options.position=origin] - The position of the internal cube camera that renders the scene.
133
129
  * @param {?RenderTarget} [options.renderTarget=null] - The render target to use.
134
130
  * @return {RenderTarget} The resulting PMREM.
135
131
  * @see {@link PMREMGenerator#fromScene}
@@ -433,7 +429,7 @@ class PMREMGenerator {
433
429
  this._pingPongRenderTarget = _createRenderTarget( renderTarget.width, renderTarget.height );
434
430
 
435
431
  const { _lodMax } = this;
436
- ( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );
432
+ ( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods } = _createPlanes( _lodMax ) );
437
433
 
438
434
  this._blurMaterial = _getBlurShader( _lodMax, renderTarget.width, renderTarget.height );
439
435
  this._ggxMaterial = _getGGXShader( _lodMax, renderTarget.width, renderTarget.height );
@@ -638,7 +634,7 @@ class PMREMGenerator {
638
634
  const incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );
639
635
 
640
636
  // Apply blur strength mapping for better quality across the roughness range
641
- const blurStrength = 0.0 + targetRoughness * 1.25;
637
+ const blurStrength = targetRoughness * 1.25;
642
638
  const adjustedRoughness = incrementalRoughness * blurStrength;
643
639
 
644
640
  // Calculate viewport position based on output LOD level
@@ -670,11 +666,9 @@ class PMREMGenerator {
670
666
  }
671
667
 
672
668
  /**
673
- * This is a two-pass Gaussian blur for a cubemap. Normally this is done
674
- * vertically and horizontally, but this breaks down on a cube. Here we apply
675
- * the blur latitudinally (around the poles), and then longitudinally (towards
676
- * the poles) to approximate the orthogonally-separable blur. It is least
677
- * accurate at the poles, but still does a decent job.
669
+ * This is a two-pass Gaussian blur for a cubemap. Each pass importance-samples
670
+ * the Gaussian along a spiral kernel (Golden Angle), which distributes samples
671
+ * isotropically on the sphere (no pole artifacts).
678
672
  *
679
673
  * Used for initial scene blur in fromScene() method when sigma > 0.
680
674
  *
@@ -683,110 +677,39 @@ class PMREMGenerator {
683
677
  * @param {number} lodIn - The input level-of-detail.
684
678
  * @param {number} lodOut - The output level-of-detail.
685
679
  * @param {number} sigma - The blur radius in radians.
686
- * @param {Vector3} [poleAxis] - The pole axis.
687
680
  */
688
- _blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {
681
+ _blur( cubeUVRenderTarget, lodIn, lodOut, sigma ) {
689
682
 
690
683
  const pingPongRenderTarget = this._pingPongRenderTarget;
691
684
 
692
- this._halfBlur(
693
- cubeUVRenderTarget,
694
- pingPongRenderTarget,
695
- lodIn,
696
- lodOut,
697
- sigma,
698
- 'latitudinal',
699
- poleAxis );
700
-
701
- this._halfBlur(
702
- pingPongRenderTarget,
703
- cubeUVRenderTarget,
704
- lodOut,
705
- lodOut,
706
- sigma,
707
- 'longitudinal',
708
- poleAxis );
685
+ // Two passes of sigma / sqrt( 2 ) compose to a blur of sigma while squaring
686
+ // the effective sample count. Sigmas beyond PI are visually indistinguishable
687
+ // from a uniform blur, so clamp to keep the shader math finite.
688
+ const blurSigma = Math.min( sigma, Math.PI ) / Math.SQRT2;
689
+
690
+ this._blurPass( cubeUVRenderTarget, pingPongRenderTarget, lodIn, lodOut, blurSigma );
691
+ this._blurPass( pingPongRenderTarget, cubeUVRenderTarget, lodOut, lodOut, blurSigma );
709
692
 
710
693
  }
711
694
 
712
- _halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {
695
+ _blurPass( targetIn, targetOut, lodIn, lodOut, sigmaRadians ) {
713
696
 
714
697
  const renderer = this._renderer;
715
698
  const blurMaterial = this._blurMaterial;
716
699
 
717
- if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {
718
-
719
- error( 'blur direction must be either latitudinal or longitudinal!' );
720
-
721
- }
722
-
723
- // Number of standard deviations at which to cut off the discrete approximation.
724
- const STANDARD_DEVIATIONS = 3;
725
-
726
700
  const blurMesh = this._lodMeshes[ lodOut ];
727
701
  blurMesh.material = blurMaterial;
728
702
 
729
703
  const blurUniforms = _uniformsMap.get( blurMaterial );
730
704
 
731
- const pixels = this._sizeLods[ lodIn ] - 1;
732
- const radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );
733
- const sigmaPixels = sigmaRadians / radiansPerPixel;
734
- const samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;
735
-
736
- if ( samples > MAX_SAMPLES ) {
737
-
738
- warn( `sigmaRadians, ${
739
- sigmaRadians}, is too large and will clip, as it requested ${
740
- samples} samples when the maximum is set to ${MAX_SAMPLES}` );
741
-
742
- }
743
-
744
- const weights = [];
745
- let sum = 0;
746
-
747
- for ( let i = 0; i < MAX_SAMPLES; ++ i ) {
748
-
749
- const x = i / sigmaPixels;
750
- const weight = Math.exp( - x * x / 2 );
751
- weights.push( weight );
752
-
753
- if ( i === 0 ) {
754
-
755
- sum += weight;
756
-
757
- } else if ( i < samples ) {
758
-
759
- sum += 2 * weight;
760
-
761
- }
762
-
763
- }
764
-
765
- for ( let i = 0; i < weights.length; i ++ ) {
766
-
767
- weights[ i ] = weights[ i ] / sum;
768
-
769
- }
770
-
771
705
  targetIn.texture.frame = ( targetIn.texture.frame || 0 ) + 1;
772
706
 
773
707
  blurUniforms.envMap.value = targetIn.texture;
774
- blurUniforms.samples.value = samples;
775
- blurUniforms.weights.array = weights;
776
- blurUniforms.latitudinal.value = direction === 'latitudinal' ? 1 : 0;
777
-
778
- if ( poleAxis ) {
779
-
780
- blurUniforms.poleAxis.value = poleAxis;
781
-
782
- }
783
-
784
- const { _lodMax } = this;
785
- blurUniforms.dTheta.value = radiansPerPixel;
786
- blurUniforms.mipInt.value = _lodMax - lodIn;
708
+ blurUniforms.sigma.value = sigmaRadians;
709
+ blurUniforms.mipInt.value = this._lodMax - lodIn;
787
710
 
788
711
  const outputSize = this._sizeLods[ lodOut ];
789
- const x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );
712
+ const x = 3 * outputSize * ( lodOut > this._lodMax - LOD_MIN ? lodOut - this._lodMax + LOD_MIN : 0 );
790
713
  const y = 4 * ( this._cubeSize - outputSize );
791
714
 
792
715
  this._setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );
@@ -817,31 +740,18 @@ class PMREMGenerator {
817
740
  function _createPlanes( lodMax ) {
818
741
 
819
742
  const sizeLods = [];
820
- const sigmas = [];
821
743
  const lodMeshes = [];
822
744
 
823
745
  let lod = lodMax;
824
746
 
825
- const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;
747
+ const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LODS;
826
748
 
827
749
  for ( let i = 0; i < totalLods; i ++ ) {
828
750
 
829
751
  const sizeLod = Math.pow( 2, lod );
830
752
  sizeLods.push( sizeLod );
831
- let sigma = 1.0 / sizeLod;
832
-
833
- if ( i > lodMax - LOD_MIN ) {
834
-
835
- sigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];
836
-
837
- } else if ( i === 0 ) {
838
-
839
- sigma = 0;
840
-
841
- }
842
-
843
- sigmas.push( sigma );
844
753
 
754
+ // UVs overshoot the face by one texel to bake the CubeUV border into the directions.
845
755
  const texelSize = 1.0 / ( sizeLod - 2 );
846
756
  const min = - texelSize;
847
757
  const max = 1 + texelSize;
@@ -850,12 +760,9 @@ function _createPlanes( lodMax ) {
850
760
  const cubeFaces = 6;
851
761
  const vertices = 6;
852
762
  const positionSize = 3;
853
- const uvSize = 2;
854
- const faceIndexSize = 1;
855
763
 
856
764
  const position = new Float32Array( positionSize * vertices * cubeFaces );
857
- const uv = new Float32Array( uvSize * vertices * cubeFaces );
858
- const faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );
765
+ const outputDirection = new Float32Array( positionSize * vertices * cubeFaces );
859
766
 
860
767
  for ( let face = 0; face < cubeFaces; face ++ ) {
861
768
 
@@ -872,16 +779,48 @@ function _createPlanes( lodMax ) {
872
779
 
873
780
  const faceIdx = _faceLib[ face ];
874
781
  position.set( coordinates, positionSize * vertices * faceIdx );
875
- uv.set( uv1, uvSize * vertices * faceIdx );
876
- const fill = [ faceIdx, faceIdx, faceIdx, faceIdx, faceIdx, faceIdx ];
877
- faceIndex.set( fill, faceIndexSize * vertices * faceIdx );
782
+
783
+ for ( let vertex = 0; vertex < vertices; vertex ++ ) {
784
+
785
+ const u = uv1[ vertex * 2 ] * 2 - 1;
786
+ const v = uv1[ vertex * 2 + 1 ] * 2 - 1;
787
+
788
+ // RH coordinate system; PMREM face-indexing convention
789
+ if ( faceIdx === 0 ) {
790
+
791
+ _direction.set( 1, v, u ); // pos x
792
+
793
+ } else if ( faceIdx === 1 ) {
794
+
795
+ _direction.set( - u, 1, - v ); // pos y
796
+
797
+ } else if ( faceIdx === 2 ) {
798
+
799
+ _direction.set( - u, v, 1 ); // pos z
800
+
801
+ } else if ( faceIdx === 3 ) {
802
+
803
+ _direction.set( - 1, v, - u ); // neg x
804
+
805
+ } else if ( faceIdx === 4 ) {
806
+
807
+ _direction.set( - u, - 1, v ); // neg y
808
+
809
+ } else {
810
+
811
+ _direction.set( u, v, - 1 ); // neg z
812
+
813
+ }
814
+
815
+ _direction.toArray( outputDirection, ( faceIdx * vertices + vertex ) * positionSize );
816
+
817
+ }
878
818
 
879
819
  }
880
820
 
881
821
  const planes = new BufferGeometry();
882
822
  planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );
883
- planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );
884
- planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );
823
+ planes.setAttribute( 'outputDirection', new BufferAttribute( outputDirection, positionSize ) );
885
824
  lodMeshes.push( new Mesh( planes, null ) );
886
825
 
887
826
  if ( lod > LOD_MIN ) {
@@ -892,7 +831,7 @@ function _createPlanes( lodMax ) {
892
831
 
893
832
  }
894
833
 
895
- return { lodMeshes, sizeLods, sigmas };
834
+ return { lodMeshes, sizeLods };
896
835
 
897
836
  }
898
837
 
@@ -931,27 +870,16 @@ function _getMaterial( type ) {
931
870
 
932
871
  function _getBlurShader( lodMax, width, height ) {
933
872
 
934
- const weights = uniformArray( new Array( MAX_SAMPLES ).fill( 0 ) );
935
- const poleAxis = uniform( new Vector3( 0, 1, 0 ) );
936
- const dTheta = uniform( 0 );
937
- const n = float( MAX_SAMPLES );
938
- const latitudinal = uniform( 0 ); // false, bool
939
- const samples = uniform( 1 ); // int
940
873
  const envMap = texture();
874
+ const sigma = uniform( 0 );
941
875
  const mipInt = uniform( 0 ); // int
942
876
  const CUBEUV_TEXEL_WIDTH = float( 1 / width );
943
877
  const CUBEUV_TEXEL_HEIGHT = float( 1 / height );
944
878
  const CUBEUV_MAX_MIP = float( lodMax );
945
879
 
946
880
  const materialUniforms = {
947
- n,
948
- latitudinal,
949
- weights,
950
- poleAxis,
951
- outputDirection: _outputDirection,
952
- dTheta,
953
- samples,
954
881
  envMap,
882
+ sigma,
955
883
  mipInt,
956
884
  CUBEUV_TEXEL_WIDTH,
957
885
  CUBEUV_TEXEL_HEIGHT,
@@ -959,7 +887,11 @@ function _getBlurShader( lodMax, width, height ) {
959
887
  };
960
888
 
961
889
  const material = _getMaterial( 'blur' );
962
- material.fragmentNode = blur( { ...materialUniforms, latitudinal: latitudinal.equal( 1 ) } );
890
+ material.fragmentNode = sphericalGaussianBlur( {
891
+ ...materialUniforms,
892
+ outputDirection: _outputDirection,
893
+ SAMPLES: int( BLUR_SAMPLES )
894
+ } );
963
895
 
964
896
  _uniformsMap.set( material, materialUniforms );
965
897
 
@@ -165,6 +165,10 @@ class NodeManager extends DataMap {
165
165
  _createNodeBuilder( renderObject, material ) {
166
166
 
167
167
  const nodeBuilder = this.backend.createNodeBuilder( renderObject.object, this.renderer );
168
+ const onNodeBuilderCreated = this.renderer.debug.onNodeBuilderCreated;
169
+
170
+ if ( onNodeBuilderCreated !== null ) onNodeBuilderCreated( nodeBuilder, renderObject );
171
+
168
172
  nodeBuilder.scene = renderObject.scene;
169
173
  nodeBuilder.material = material;
170
174
  nodeBuilder.camera = renderObject.camera;
@@ -446,9 +450,10 @@ class NodeManager extends DataMap {
446
450
  * Returns a node builder state for the given compute node.
447
451
  *
448
452
  * @param {Node} computeNode - The compute node.
449
- * @return {NodeBuilderState} The node builder state.
453
+ * @param {boolean} [useAsync=false] - Whether to use async build with yielding.
454
+ * @return {NodeBuilderState|Promise<NodeBuilderState>} The node builder state (or Promise if async).
450
455
  */
451
- getForCompute( computeNode ) {
456
+ getForCompute( computeNode, useAsync = false ) {
452
457
 
453
458
  const computeData = this.get( computeNode );
454
459
 
@@ -456,7 +461,28 @@ class NodeManager extends DataMap {
456
461
 
457
462
  if ( nodeBuilderState === undefined || computeData.version !== computeNode.version ) {
458
463
 
459
- const nodeBuilder = this.backend.createNodeBuilder( computeNode, this.renderer );
464
+ const nodeBuilder = this.backend.createNodeBuilder( null, this.renderer );
465
+ nodeBuilder.compute = computeNode;
466
+
467
+ const onNodeBuilderCreated = this.renderer.debug.onNodeBuilderCreated;
468
+
469
+ if ( onNodeBuilderCreated !== null ) onNodeBuilderCreated( nodeBuilder, computeNode );
470
+
471
+ if ( useAsync ) {
472
+
473
+ return nodeBuilder.buildAsync().then( () => {
474
+
475
+ nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
476
+
477
+ computeData.nodeBuilderState = nodeBuilderState;
478
+ computeData.version = computeNode.version;
479
+
480
+ return nodeBuilderState;
481
+
482
+ } );
483
+
484
+ }
485
+
460
486
  nodeBuilder.build();
461
487
 
462
488
  nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
@@ -470,6 +496,27 @@ class NodeManager extends DataMap {
470
496
 
471
497
  }
472
498
 
499
+ /**
500
+ * Async version of getForCompute() that yields to main thread during build.
501
+ * Use this in compileComputeAsync() to prevent blocking the main thread.
502
+ *
503
+ * @param {Node} computeNode - The compute node.
504
+ * @return {Promise<NodeBuilderState>} A promise that resolves to the node builder state.
505
+ */
506
+ getForComputeAsync( computeNode ) {
507
+
508
+ const result = this.getForCompute( computeNode, true );
509
+
510
+ if ( result.then ) {
511
+
512
+ return result;
513
+
514
+ }
515
+
516
+ return Promise.resolve( result );
517
+
518
+ }
519
+
473
520
  /**
474
521
  * Creates a node builder state for the given node builder.
475
522
  *
@@ -756,6 +803,27 @@ class NodeManager extends DataMap {
756
803
 
757
804
  if ( node === undefined || forceUpdate ) {
758
805
 
806
+ if ( node === undefined && object.isTexture === true ) {
807
+
808
+ const onTextureDispose = () => {
809
+
810
+ object.removeEventListener( 'dispose', onTextureDispose );
811
+
812
+ const node = nodeCache.get( object );
813
+
814
+ if ( node !== undefined ) {
815
+
816
+ nodeCache.delete( object );
817
+ node.dispose();
818
+
819
+ }
820
+
821
+ };
822
+
823
+ object.addEventListener( 'dispose', onTextureDispose );
824
+
825
+ }
826
+
759
827
  node = callback();
760
828
  nodeCache.set( object, node );
761
829
 
@@ -866,7 +934,18 @@ class NodeManager extends DataMap {
866
934
 
867
935
  }
868
936
 
869
- getNodeFrame( renderer = this.renderer, scene = null, object = null, camera = null, material = null ) {
937
+ /**
938
+ * Returns a node frame configured with the given parameters.
939
+ *
940
+ * @param {Renderer} [renderer=this.renderer] - The renderer.
941
+ * @param {?Scene} [scene=null] - The scene.
942
+ * @param {?Object3D} [object=null] - The object.
943
+ * @param {?Camera} [camera=null] - The camera.
944
+ * @param {?Material} [material=null] - The material.
945
+ * @param {?Node} [compute=null] - The compute node.
946
+ * @return {NodeFrame} The node frame.
947
+ */
948
+ getNodeFrame( renderer = this.renderer, scene = null, object = null, camera = null, material = null, compute = null ) {
870
949
 
871
950
  const nodeFrame = this.nodeFrame;
872
951
  nodeFrame.renderer = renderer;
@@ -874,17 +953,36 @@ class NodeManager extends DataMap {
874
953
  nodeFrame.object = object;
875
954
  nodeFrame.camera = camera;
876
955
  nodeFrame.material = material;
956
+ nodeFrame.compute = compute;
877
957
 
878
958
  return nodeFrame;
879
959
 
880
960
  }
881
961
 
962
+ /**
963
+ * Returns a node frame configured for the given render object.
964
+ *
965
+ * @param {RenderObject} renderObject - The render object.
966
+ * @return {NodeFrame} The node frame.
967
+ */
882
968
  getNodeFrameForRender( renderObject ) {
883
969
 
884
970
  return this.getNodeFrame( renderObject.renderer, renderObject.scene, renderObject.object, renderObject.camera, renderObject.material );
885
971
 
886
972
  }
887
973
 
974
+ /**
975
+ * Returns a node frame configured for the given compute node.
976
+ *
977
+ * @param {Node} computeNode - The compute node.
978
+ * @return {NodeFrame} The node frame.
979
+ */
980
+ getNodeFrameForCompute( computeNode ) {
981
+
982
+ return this.getNodeFrame( this.renderer, null, null, null, null, computeNode );
983
+
984
+ }
985
+
888
986
  /**
889
987
  * Returns the current output cache key.
890
988
  *
@@ -985,6 +1083,46 @@ class NodeManager extends DataMap {
985
1083
 
986
1084
  }
987
1085
 
1086
+ /**
1087
+ * Triggers the call of `updateBefore()` methods
1088
+ * for all nodes of the given compute node.
1089
+ *
1090
+ * @param {Node} computeNode - The compute node.
1091
+ */
1092
+ updateBeforeForCompute( computeNode ) {
1093
+
1094
+ const nodeBuilder = this.getForCompute( computeNode );
1095
+
1096
+ for ( const node of nodeBuilder.updateBeforeNodes ) {
1097
+
1098
+ // update frame state for each node
1099
+
1100
+ this.getNodeFrameForCompute( computeNode ).updateBeforeNode( node );
1101
+
1102
+ }
1103
+
1104
+ }
1105
+
1106
+ /**
1107
+ * Triggers the call of `updateAfter()` methods
1108
+ * for all nodes of the given compute node.
1109
+ *
1110
+ * @param {Node} computeNode - The compute node.
1111
+ */
1112
+ updateAfterForCompute( computeNode ) {
1113
+
1114
+ const nodeBuilder = this.getForCompute( computeNode );
1115
+
1116
+ for ( const node of nodeBuilder.updateAfterNodes ) {
1117
+
1118
+ // update frame state for each node
1119
+
1120
+ this.getNodeFrameForCompute( computeNode ).updateAfterNode( node );
1121
+
1122
+ }
1123
+
1124
+ }
1125
+
988
1126
  /**
989
1127
  * Triggers the call of `update()` methods
990
1128
  * for all nodes of the given compute node.
@@ -1024,10 +1162,10 @@ class NodeManager extends DataMap {
1024
1162
  }
1025
1163
 
1026
1164
  /**
1027
- * Returns `true` if the given render object requires a refresh.
1165
+ * Returns the refresh type of the given render object.
1028
1166
  *
1029
1167
  * @param {RenderObject} renderObject - The render object.
1030
- * @return {boolean} Whether the given render object requires a refresh or not.
1168
+ * @return {number} The refresh type, see `RenderObjectRefreshType`.
1031
1169
  */
1032
1170
  needsRefresh( renderObject ) {
1033
1171
 
@@ -20,7 +20,9 @@ class NodeStorageBuffer extends StorageBuffer {
20
20
  */
21
21
  constructor( nodeUniform, groupNode ) {
22
22
 
23
- super( 'StorageBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
23
+ const label = nodeUniform && nodeUniform.name ? nodeUniform.name : _id ++;
24
+
25
+ super( 'StorageBuffer_' + label, nodeUniform ? nodeUniform.value : null );
24
26
 
25
27
  /**
26
28
  * The node uniform.
@@ -20,7 +20,9 @@ class NodeUniformBuffer extends UniformBuffer {
20
20
  */
21
21
  constructor( nodeUniform, groupNode ) {
22
22
 
23
- super( 'UniformBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
23
+ const label = nodeUniform && nodeUniform.name ? nodeUniform.name : _id ++;
24
+
25
+ super( 'UniformBuffer_' + label, nodeUniform ? nodeUniform.value : null );
24
26
 
25
27
  /**
26
28
  * The uniform buffer node.
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Precomputed DFG LUT for Image-Based Lighting
2
+ * Precomputed DFG LUT for physically based specular lighting, used by both
3
+ * image-based lighting and direct-light multi-scattering energy compensation
3
4
  * Resolution: 16x16
4
5
  * Samples: 4096 per texel
5
6
  * Format: RG16F (2 half floats per texel: scale, bias)
@@ -10,7 +10,8 @@ vec3 transformedNormal = objectNormal;
10
10
  #ifdef USE_BATCHING
11
11
 
12
12
  // this is in lieu of a per-instance normal-matrix
13
- // shear transforms in the instance matrix are not supported
13
+ // non-uniform scaling in the instance matrix is supported
14
+ // shear transforms are not supported
14
15
 
15
16
  mat3 bm = mat3( batchingMatrix );
16
17
  transformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );
@@ -27,7 +28,8 @@ vec3 transformedNormal = objectNormal;
27
28
  #ifdef USE_INSTANCING
28
29
 
29
30
  // this is in lieu of a per-instance normal-matrix
30
- // shear transforms in the instance matrix are not supported
31
+ // non-uniform scaling in the instance matrix is supported
32
+ // shear transforms are not supported
31
33
 
32
34
  mat3 im = mat3( instanceMatrix );
33
35
  transformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );