@gnsx/three 0.185.16 → 0.186.1

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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  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/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -188,9 +188,13 @@ class TSLEncoder {
188
188
 
189
189
  }
190
190
 
191
- // handle texture lookup function calls in separate branch
191
+ if ( node.name === 'array' ) {
192
192
 
193
- if ( textureLookupFunctions.includes( node.name ) ) {
193
+ this.addImport( 'array' );
194
+
195
+ code = `array( [ ${ params.join( ', ' ) } ] )`;
196
+
197
+ } else if ( textureLookupFunctions.includes( node.name ) ) {
194
198
 
195
199
  code = `${ params[ 0 ] }.sample( ${ params[ 1 ] } )`;
196
200
 
@@ -368,12 +372,10 @@ class TSLEncoder {
368
372
 
369
373
  } else {
370
374
 
371
- console.warn( 'Unknown node type', node );
375
+ throw new Error( 'THREE.TSLEncoder: Unknown AST node type "' + node.constructor.name + '"' );
372
376
 
373
377
  }
374
378
 
375
- if ( ! code ) code = '/* unknown statement */';
376
-
377
379
  return code;
378
380
 
379
381
  }
@@ -479,6 +481,38 @@ ${ this.tab }} )`;
479
481
 
480
482
  }
481
483
 
484
+ isVariableUsed( node, varName ) {
485
+
486
+ if ( ! node ) return false;
487
+
488
+ if ( node.isAccessor && node.property === varName ) return true;
489
+
490
+ for ( const key in node ) {
491
+
492
+ if ( key === 'parent' ) continue;
493
+
494
+ const child = node[ key ];
495
+
496
+ if ( Array.isArray( child ) ) {
497
+
498
+ for ( const item of child ) {
499
+
500
+ if ( this.isVariableUsed( item, varName ) ) return true;
501
+
502
+ }
503
+
504
+ } else if ( child && child.isASTNode ) {
505
+
506
+ if ( this.isVariableUsed( child, varName ) ) return true;
507
+
508
+ }
509
+
510
+ }
511
+
512
+ return false;
513
+
514
+ }
515
+
482
516
  emitLoop( node ) {
483
517
 
484
518
  const start = this.emitExpression( node.initialization.value );
@@ -504,7 +538,7 @@ ${ this.tab }} )`;
504
538
 
505
539
  } else if ( node.afterthought.isOperator ) {
506
540
 
507
- if ( node.afterthought.right.isAccessor || node.afterthought.right.isNumber ) {
541
+ if ( node.afterthought.right && ( node.afterthought.right.isAccessor || node.afterthought.right.isNumber ) ) {
508
542
 
509
543
  updateParam = `, update: ${ this.emitExpression( node.afterthought.right ) }`;
510
544
 
@@ -516,7 +550,22 @@ ${ this.tab }} )`;
516
550
 
517
551
  }
518
552
 
519
- let loopStr = `Loop( { start: ${ start }, end: ${ end + nameParam + typeParam + conditionParam + updateParam } }, ( { ${ name } } ) => {\n\n`;
553
+ let loopParams;
554
+
555
+ if ( start === '0' && nameParam === '' && typeParam === '' && conditionParam === '' && updateParam === '' ) {
556
+
557
+ loopParams = end;
558
+
559
+ } else {
560
+
561
+ loopParams = `{ start: ${ start }, end: ${ end + nameParam + typeParam + conditionParam + updateParam } }`;
562
+
563
+ }
564
+
565
+ const isUsed = this.isVariableUsed( node.body, name );
566
+ const callbackParams = isUsed ? `( { ${ name } } ) =>` : '() =>';
567
+
568
+ let loopStr = `Loop( ${ loopParams }, ${ callbackParams } {\n\n`;
520
569
 
521
570
  loopStr += this.emitBody( node.body ) + '\n\n';
522
571
 
@@ -590,10 +639,10 @@ ${ this.tab }} )`;
590
639
  const { initialization, condition, afterthought } = node;
591
640
 
592
641
  if ( ( initialization && initialization.isVariableDeclaration && initialization.next === null ) &&
593
- ( condition && condition.left.isAccessor && condition.left.property === initialization.name ) &&
642
+ ( condition && condition.left && condition.left.isAccessor && condition.left.property === initialization.name ) &&
594
643
  ( afterthought && (
595
- ( afterthought.isUnary && ( initialization.name === afterthought.expression.property ) ) ||
596
- ( afterthought.isOperator && ( initialization.name === afterthought.left.property ) )
644
+ ( afterthought.isUnary && afterthought.expression && ( initialization.name === afterthought.expression.property ) ) ||
645
+ ( afterthought.isOperator && afterthought.left && ( initialization.name === afterthought.left.property ) )
597
646
  ) )
598
647
  ) {
599
648
 
@@ -632,8 +681,31 @@ ${ this.tab }} )`;
632
681
 
633
682
  }
634
683
 
684
+ emitDoWhile( node ) {
685
+
686
+ const condition = this.emitExpression( node.condition );
687
+ const body = this.emitBody( node.body );
688
+
689
+ let loopStr = `Loop( () => {\n\n${ body }\n\n${ this.tab }\tIf( ${ condition }.not(), () => {\n\n${ this.tab }\t\tBreak();\n\n${ this.tab }\t} );\n\n`;
690
+
691
+ loopStr += this.tab + '} )';
692
+
693
+ this.imports.add( 'Loop' );
694
+ this.imports.add( 'If' );
695
+ this.imports.add( 'Break' );
696
+
697
+ return loopStr;
698
+
699
+ }
700
+
635
701
  emitWhile( node ) {
636
702
 
703
+ if ( node.doWhile ) {
704
+
705
+ return this.emitDoWhile( node );
706
+
707
+ }
708
+
637
709
  const condition = this.emitExpression( node.condition );
638
710
 
639
711
  let whileStr = `Loop( ${ condition }, () => {\n\n`;
@@ -194,6 +194,23 @@ class WGSLEncoder {
194
194
 
195
195
  code += `( ${ params } )`;
196
196
 
197
+ } else if ( fnName === 'array' ) {
198
+
199
+ const params = node.params.map( p => this.emitExpression( p ) );
200
+
201
+ if ( node.params.length > 0 && node.params[ 0 ].getType() ) {
202
+
203
+ const elemType = this.getWgslType( node.params[ 0 ].getType() );
204
+ const count = node.params.length;
205
+
206
+ code = `array<${ elemType }, ${ count }>( ${ params.join( ', ' ) } )`;
207
+
208
+ } else {
209
+
210
+ code = `array( ${ params.join( ', ' ) } )`;
211
+
212
+ }
213
+
197
214
  } else if ( fnName.startsWith( 'texture' ) ) {
198
215
 
199
216
  // Handle texture functions separately due to sampler handling
@@ -335,9 +352,7 @@ class WGSLEncoder {
335
352
 
336
353
  } else {
337
354
 
338
- console.warn( 'Unknown node type in WGSL Encoder:', node );
339
-
340
- code = `/* unknown node: ${ node.constructor.name } */`;
355
+ throw new Error( 'THREE.WGSLEncoder: Unknown AST node type "' + node.constructor.name + '"' );
341
356
 
342
357
  }
343
358
 
@@ -494,6 +509,12 @@ class WGSLEncoder {
494
509
  const cond = this.emitExpression( node.condition );
495
510
  const body = this.emitBody( node.body );
496
511
 
512
+ if ( node.doWhile ) {
513
+
514
+ return `loop {\n\n${ body }\n\n${ this.tab }\tcontinuing {\n${ this.tab }\t\tbreak if ( ! ( ${ cond } ) );\n${ this.tab }\t}\n${ this.tab }}`;
515
+
516
+ }
517
+
497
518
  return `while ( ${ cond } ) {\n\n${ body }\n\n${ this.tab }}`;
498
519
 
499
520
  }
@@ -577,7 +598,15 @@ class WGSLEncoder {
577
598
 
578
599
  }
579
600
 
580
- declarations.push( `${ keyword } ${ current.name }: ${ type }${ valueStr }` );
601
+ let typeStr = `: ${ type }`;
602
+
603
+ if ( current.value && current.value.isFunctionCall && current.value.name === 'array' ) {
604
+
605
+ typeStr = '';
606
+
607
+ }
608
+
609
+ declarations.push( `${ keyword } ${ current.name }${ typeStr }${ valueStr }` );
581
610
 
582
611
  current = current.next;
583
612
 
@@ -34,7 +34,6 @@ import {
34
34
  // - Storage textures not supported
35
35
  // - Fog / environment do not automatically update - must call "dispose"
36
36
  // - instanced mesh geometry cannot be shared
37
- // - Node materials cannot be used with "compile" function
38
37
 
39
38
  // hash any object parameters that will impact the resulting shader so we can force
40
39
  // a program update
@@ -108,7 +107,7 @@ class SceneContext {
108
107
 
109
108
  const { lightsNode, environmentNode, fogNode } = this;
110
109
  const lightsHash = lightsNode.getCacheKey();
111
- const envHash = environmentNode ? environmentNode.getCacheKey : 0;
110
+ const envHash = environmentNode ? environmentNode.getCacheKey() : 0;
112
111
  const fogHash = fogNode ? fogNode.getCacheKey() : 0;
113
112
  return NodeUtils.hashArray( [ lightsHash, envHash, fogHash ] );
114
113
 
@@ -116,21 +115,7 @@ class SceneContext {
116
115
 
117
116
  update() {
118
117
 
119
- const { scene, lightsNode } = this;
120
-
121
- // update lighting
122
- const sceneLights = [];
123
- scene.traverse( object => {
124
-
125
- if ( object.isLight ) {
126
-
127
- sceneLights.push( object );
128
-
129
- }
130
-
131
- } );
132
-
133
- lightsNode.setLights( sceneLights );
118
+ const { scene } = this;
134
119
 
135
120
  // update fog
136
121
  if ( this.prevFog !== scene.fog ) {
@@ -245,6 +230,12 @@ class RendererProxy {
245
230
 
246
231
  }
247
232
 
233
+ getCanvasTarget() {
234
+
235
+ return null;
236
+
237
+ }
238
+
248
239
  hasCompatibility( name ) {
249
240
 
250
241
  if ( name === Compatibility.TEXTURE_COMPARE ) {
@@ -402,50 +393,41 @@ export class WebGLNodesHandler {
402
393
  }
403
394
 
404
395
 
405
- renderStart( scene, camera ) {
396
+ renderStart( scene, camera, targetScene = scene ) {
406
397
 
407
398
  const { nodeFrame, renderStack, renderer, sceneContexts } = this;
408
399
  nodeFrame.update();
409
400
  nodeFrame.camera = camera;
410
- nodeFrame.scene = scene;
401
+ nodeFrame.scene = targetScene;
411
402
  nodeFrame.frameId ++;
412
403
 
413
- let sceneContext = sceneContexts.get( scene );
404
+ let sceneContext = sceneContexts.get( targetScene );
414
405
  if ( ! sceneContext ) {
415
406
 
416
- sceneContext = new SceneContext( renderer, scene );
417
- sceneContexts.set( scene, sceneContext );
407
+ sceneContext = new SceneContext( renderer, targetScene );
408
+ sceneContexts.set( targetScene, sceneContext );
418
409
 
419
410
  }
420
411
 
412
+ renderer.lighting.beginRender( targetScene );
421
413
  sceneContext.update();
422
414
  renderStack.push( { sceneContext, camera } );
423
415
 
424
- // ensure all node material callbacks are initialized before
425
- // traversal and build
426
- const {
427
- customProgramCacheKeyCallback,
428
- onBeforeRenderCallback,
429
- } = this;
430
-
431
- scene.traverse( object => {
432
-
433
- if ( object.material && object.material.isNodeMaterial ) {
416
+ }
434
417
 
435
- object.material.customProgramCacheKey = customProgramCacheKeyCallback;
436
- object.material.onBeforeRender = onBeforeRenderCallback;
418
+ updateLights( lights ) {
437
419
 
438
- }
439
-
440
- } );
420
+ const frame = this.renderStack[ this.renderStack.length - 1 ];
421
+ frame.sceneContext.lightsNode.setLights( lights );
441
422
 
442
423
  }
443
424
 
444
425
  renderEnd() {
445
426
 
446
- const { nodeFrame, renderStack } = this;
427
+ const { nodeFrame, renderer, renderStack } = this;
447
428
 
448
- renderStack.pop();
429
+ const { sceneContext } = renderStack.pop();
430
+ renderer.lighting.finishRender( sceneContext.scene );
449
431
 
450
432
  const frame = renderStack[ renderStack.length - 1 ];
451
433
  if ( frame ) {
@@ -458,6 +440,14 @@ export class WebGLNodesHandler {
458
440
 
459
441
  }
460
442
 
443
+ setObject( object, material ) {
444
+
445
+ this.nodeFrame.object = object;
446
+ material.customProgramCacheKey = this.customProgramCacheKeyCallback;
447
+ material.onBeforeRender = this.onBeforeRenderCallback;
448
+
449
+ }
450
+
461
451
  build( material, object, parameters ) {
462
452
 
463
453
  const {
@@ -231,6 +231,8 @@ class AfterImageNode extends TempNode {
231
231
  */
232
232
  dispose() {
233
233
 
234
+ super.dispose();
235
+
234
236
  this._compRT.dispose();
235
237
  this._oldRT.dispose();
236
238
 
@@ -1,5 +1,5 @@
1
1
  import { Matrix3, NodeMaterial, Vector3 } from '@gnsx/three/webgpu';
2
- import { clamp, Fn, vec4, uv, uniform, max } from '@gnsx/three/tsl';
2
+ import { clamp, Fn, vec4, uv, uniform, max, context } from '@gnsx/three/tsl';
3
3
  import StereoCompositePassNode from './StereoCompositePassNode.js';
4
4
  import { frameCorners } from '../../utils/CameraUtils.js';
5
5
 
@@ -523,7 +523,8 @@ class AnaglyphPassNode extends StereoCompositePassNode {
523
523
  } );
524
524
 
525
525
  const material = this._material || ( this._material = new NodeMaterial() );
526
- material.fragmentNode = anaglyph().context( builder.getSharedContext() );
526
+ material.contextNode = context( builder.getSharedContext() );
527
+ material.fragmentNode = anaglyph();
527
528
  material.name = 'Anaglyph';
528
529
  material.needsUpdate = true;
529
530
 
@@ -1,5 +1,5 @@
1
1
  import { RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh, TempNode, NodeUpdateType } from '@gnsx/three/webgpu';
2
- import { Fn, float, uv, uniform, convertToTexture, vec2, vec4, passTexture, luminance, abs, exp, max } from '@gnsx/three/tsl';
2
+ import { Fn, float, uv, uniform, convertToTexture, vec2, vec4, passTexture, luminance, abs, exp, max, context } from '@gnsx/three/tsl';
3
3
 
4
4
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
5
 
@@ -302,7 +302,8 @@ class BilateralBlurNode extends TempNode {
302
302
  //
303
303
 
304
304
  const material = this._material || ( this._material = new NodeMaterial() );
305
- material.fragmentNode = blur().context( builder.getSharedContext() );
305
+ material.contextNode = context( builder.getSharedContext() );
306
+ material.fragmentNode = blur();
306
307
  material.name = 'Bilateral_blur';
307
308
  material.needsUpdate = true;
308
309
 
@@ -323,6 +324,8 @@ class BilateralBlurNode extends TempNode {
323
324
  */
324
325
  dispose() {
325
326
 
327
+ super.dispose();
328
+
326
329
  this._horizontalRT.dispose();
327
330
  this._verticalRT.dispose();
328
331
 
@@ -1,5 +1,5 @@
1
1
  import { HalfFloatType, RenderTarget, Vector2, Vector3, TempNode, QuadMesh, NodeMaterial, RendererUtils, NodeUpdateType } from '@gnsx/three/webgpu';
2
- import { nodeObject, Fn, float, uv, passTexture, uniform, Loop, texture, luminance, smoothstep, mix, vec4, uniformArray, add, int } from '@gnsx/three/tsl';
2
+ import { nodeObject, Fn, float, uv, passTexture, uniform, Loop, texture, luminance, smoothstep, mix, vec4, uniformArray, add, int, array, context } from '@gnsx/three/tsl';
3
3
 
4
4
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
5
  const _size = /*@__PURE__*/ new Vector2();
@@ -106,6 +106,15 @@ class BloomNode extends TempNode {
106
106
  */
107
107
  this.smoothWidth = uniform( 0.01 );
108
108
 
109
+ /**
110
+ * A per-mip tint color for the bloom, applied during the composite pass.
111
+ * Defaults to white (no tint) for each of the mips. Mutate the vectors to
112
+ * colorize the bloom (e.g. for a warm or anamorphic look).
113
+ *
114
+ * @type {Array<Vector3>}
115
+ */
116
+ this.bloomTintColors = [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ];
117
+
109
118
  /**
110
119
  * Scale factor for the internal render targets.
111
120
  *
@@ -399,10 +408,13 @@ class BloomNode extends TempNode {
399
408
  */
400
409
  setup( builder ) {
401
410
 
411
+ const sharedContext = context( builder.getSharedContext() );
412
+
402
413
  // luminosity high pass material
403
414
 
404
415
  this._highPassFilterMaterial = this._highPassFilterMaterial || new NodeMaterial();
405
- this._highPassFilterMaterial.fragmentNode = this.highPassFn( { input: this.inputNode, threshold: this.threshold, smoothWidth: this.smoothWidth } ).context( builder.getSharedContext() );
416
+ this._highPassFilterMaterial.contextNode = sharedContext;
417
+ this._highPassFilterMaterial.fragmentNode = this.highPassFn( { input: this.inputNode, threshold: this.threshold, smoothWidth: this.smoothWidth } );
406
418
  this._highPassFilterMaterial.name = 'Bloom_highPass';
407
419
  this._highPassFilterMaterial.needsUpdate = true;
408
420
 
@@ -414,29 +426,14 @@ class BloomNode extends TempNode {
414
426
 
415
427
  for ( let i = 0; i < this._nMips; i ++ ) {
416
428
 
417
- this._separableBlurMaterials.push( this._getSeparableBlurMaterial( builder, kernelSizeArray[ i ] ) );
429
+ this._separableBlurMaterials.push( this._getSeparableBlurMaterial( sharedContext, kernelSizeArray[ i ] ) );
418
430
 
419
431
  }
420
432
 
421
433
  // composite material
422
434
 
423
- const bloomFactors = uniformArray( [ 1.0, 0.8, 0.6, 0.4, 0.2 ] );
424
- const bloomTintColors = uniformArray( [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ] );
425
-
426
- const lerpBloomFactor = Fn( ( [ factor, radius ] ) => {
427
-
428
- const mirrorFactor = float( 1.2 ).sub( factor );
429
- return mix( factor, mirrorFactor, radius );
430
-
431
- } ).setLayout( {
432
- name: 'lerpBloomFactor',
433
- type: 'float',
434
- inputs: [
435
- { name: 'factor', type: 'float' },
436
- { name: 'radius', type: 'float' },
437
- ]
438
- } );
439
-
435
+ const bloomFactors = array( [ 1.0, 0.8, 0.6, 0.4, 0.2 ] );
436
+ const bloomTintColors = uniformArray( this.bloomTintColors );
440
437
 
441
438
  const compositePass = Fn( () => {
442
439
 
@@ -453,7 +450,8 @@ class BloomNode extends TempNode {
453
450
  } );
454
451
 
455
452
  this._compositeMaterial = this._compositeMaterial || new NodeMaterial();
456
- this._compositeMaterial.fragmentNode = compositePass().context( builder.getSharedContext() );
453
+ this._compositeMaterial.contextNode = sharedContext;
454
+ this._compositeMaterial.fragmentNode = compositePass();
457
455
  this._compositeMaterial.name = 'Bloom_comp';
458
456
  this._compositeMaterial.needsUpdate = true;
459
457
 
@@ -469,6 +467,8 @@ class BloomNode extends TempNode {
469
467
  */
470
468
  dispose() {
471
469
 
470
+ super.dispose();
471
+
472
472
  for ( let i = 0; i < this._renderTargetsHorizontal.length; i ++ ) {
473
473
 
474
474
  this._renderTargetsHorizontal[ i ].dispose();
@@ -498,11 +498,11 @@ class BloomNode extends TempNode {
498
498
  * Create a separable blur material for the given kernel radius.
499
499
  *
500
500
  * @private
501
- * @param {NodeBuilder} builder - The current node builder.
501
+ * @param {NodeContext} sharedContext
502
502
  * @param {number} kernelRadius - The kernel radius.
503
503
  * @return {NodeMaterial}
504
504
  */
505
- _getSeparableBlurMaterial( builder, kernelRadius ) {
505
+ _getSeparableBlurMaterial( sharedContext, kernelRadius ) {
506
506
 
507
507
  const coefficients = [];
508
508
  const sigma = kernelRadius / 3;
@@ -513,10 +513,28 @@ class BloomNode extends TempNode {
513
513
 
514
514
  }
515
515
 
516
+ // Merge adjacent taps into single bilinear fetches (linear sampling).
517
+
518
+ const centerWeight = coefficients[ 0 ];
519
+ const offsets = [];
520
+ const weights = [];
521
+
522
+ for ( let i = 1; i < kernelRadius; i += 2 ) {
523
+
524
+ const wa = coefficients[ i ];
525
+ const wb = ( i + 1 ) < kernelRadius ? coefficients[ i + 1 ] : 0;
526
+ const w = wa + wb;
527
+
528
+ offsets.push( ( i * wa + ( i + 1 ) * wb ) / w );
529
+ weights.push( w );
530
+
531
+ }
532
+
516
533
  //
517
534
 
518
535
  const colorTexture = texture( null );
519
- const gaussianCoefficients = uniformArray( coefficients );
536
+ const gaussianOffsets = array( offsets );
537
+ const gaussianWeights = array( weights );
520
538
  const invSize = uniform( new Vector2() );
521
539
  const direction = uniform( new Vector2( 0.5, 0.5 ) );
522
540
 
@@ -525,13 +543,12 @@ class BloomNode extends TempNode {
525
543
 
526
544
  const separableBlurPass = Fn( () => {
527
545
 
528
- const diffuseSum = sampleTexel( uvNode ).rgb.mul( gaussianCoefficients.element( 0 ) ).toVar();
546
+ const diffuseSum = sampleTexel( uvNode ).rgb.mul( centerWeight ).toVar();
529
547
 
530
- Loop( { start: int( 1 ), end: int( kernelRadius ), type: 'int', condition: '<' }, ( { i } ) => {
548
+ Loop( { start: int( 0 ), end: int( offsets.length ), type: 'int', condition: '<' }, ( { i } ) => {
531
549
 
532
- const x = float( i );
533
- const w = gaussianCoefficients.element( i );
534
- const uvOffset = direction.mul( invSize ).mul( x );
550
+ const w = gaussianWeights.element( i );
551
+ const uvOffset = direction.mul( invSize ).mul( gaussianOffsets.element( i ) );
535
552
  const sample1 = sampleTexel( uvNode.add( uvOffset ) ).rgb;
536
553
  const sample2 = sampleTexel( uvNode.sub( uvOffset ) ).rgb;
537
554
  diffuseSum.addAssign( add( sample1, sample2 ).mul( w ) );
@@ -543,7 +560,8 @@ class BloomNode extends TempNode {
543
560
  } );
544
561
 
545
562
  const separableBlurMaterial = new NodeMaterial();
546
- separableBlurMaterial.fragmentNode = separableBlurPass().context( builder.getSharedContext() );
563
+ separableBlurMaterial.contextNode = sharedContext;
564
+ separableBlurMaterial.fragmentNode = separableBlurPass();
547
565
  separableBlurMaterial.name = 'Bloom_separable';
548
566
  separableBlurMaterial.needsUpdate = true;
549
567
 
@@ -558,6 +576,13 @@ class BloomNode extends TempNode {
558
576
 
559
577
  }
560
578
 
579
+ const lerpBloomFactor = Fn( ( { factor, radius } ) => {
580
+
581
+ const mirrorFactor = float( 1.2 ).sub( factor );
582
+ return mix( factor, mirrorFactor, radius );
583
+
584
+ }, { factor: 'float', radius: 'float', return: 'float' } );
585
+
561
586
  /**
562
587
  * TSL function for creating a bloom effect.
563
588
  *
@@ -56,12 +56,20 @@ class DenoiseNode extends TempNode {
56
56
  */
57
57
  this.normalNode = normalNode;
58
58
 
59
+ /**
60
+ * The internal noise texture.
61
+ *
62
+ * @private
63
+ * @type {DataTexture}
64
+ */
65
+ this._noiseTexture = generateDefaultNoise();
66
+
59
67
  /**
60
68
  * The node represents the internal noise texture.
61
69
  *
62
70
  * @type {TextureNode}
63
71
  */
64
- this.noiseNode = texture( generateDefaultNoise() );
72
+ this.noiseNode = texture( this._noiseTexture );
65
73
 
66
74
  /**
67
75
  * The luma Phi value.
@@ -252,6 +260,18 @@ class DenoiseNode extends TempNode {
252
260
 
253
261
  }
254
262
 
263
+ /**
264
+ * Frees internal resources. This method should be called
265
+ * when the effect is no longer required.
266
+ */
267
+ dispose() {
268
+
269
+ super.dispose();
270
+
271
+ this._noiseTexture.dispose();
272
+
273
+ }
274
+
255
275
  }
256
276
 
257
277
  export default DenoiseNode;