@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
@@ -0,0 +1,271 @@
1
+ import { StorageBufferAttribute, DynamicDrawUsage } from '@gnsx/three/webgpu';
2
+ import { Fn, Loop, atomicAdd, atomicLoad, atomicStore, instanceIndex, storage, uint } from '@gnsx/three/tsl';
3
+
4
+ /**
5
+ * A reusable GPU counting sort.
6
+ *
7
+ * This computes a stable-ish permutation of the integers `[0, count)` that orders them by an
8
+ * arbitrary, user supplied `uint` key ("bin") in the range `[0, binCount)`. It is a good fit for
9
+ * approximate ordering of large element counts (hundreds of thousands to millions) where an exact
10
+ * comparison sort such as a bitonic sort (see {@link BitonicSort}) would be too slow: a counting
11
+ * sort only requires a fixed number of passes (reset, histogram, prefix sum, scatter) regardless of
12
+ * `count`, at the cost of only being accurate to the resolution of `binCount` - elements that land
13
+ * in the same bin end up in an unspecified relative order.
14
+ *
15
+ * This class does not compute the sort key itself. Instead, a TSL function is supplied via
16
+ * {@link CountingSort#setBinNode} that maps the current `instanceIndex` to a bin, and an equivalent
17
+ * plain JavaScript function can be supplied to {@link CountingSort#computeCPU} for platforms without
18
+ * compute shader support (e.g. the WebGL backend of {@link WebGPURenderer}).
19
+ *
20
+ * ```js
21
+ * const sort = new CountingSort( count, { binCount: 4096 } );
22
+ * sort.setBinNode( () => {
23
+ *
24
+ * // return a `Node<uint>` bin index for `instanceIndex`, e.g. derived from a depth value.
25
+ *
26
+ * } );
27
+ *
28
+ * sort.compute( renderer );
29
+ *
30
+ * // `sort.orderRead` now holds a storage buffer of `count` indices, ordered by bin.
31
+ * ```
32
+ *
33
+ * @three_import import { CountingSort } from 'three/addons/gpgpu/CountingSort.js';
34
+ */
35
+ class CountingSort {
36
+
37
+ /**
38
+ * Constructs a new counting sort.
39
+ *
40
+ * @param {number} count - The number of elements to sort.
41
+ * @param {Object} [options={}] - Options that modify the counting sort.
42
+ * @param {number} [options.binCount=4096] - The number of bins/buckets the sort key is quantized into. Larger values improve sort accuracy at the cost of a longer (but still single-pass) prefix sum.
43
+ * @param {number} [options.workgroupSize=256] - The workgroup size of the compute shaders executed during the sort.
44
+ */
45
+ constructor( count, { binCount = 4096, workgroupSize = 256 } = {} ) {
46
+
47
+ /**
48
+ * The number of elements to sort.
49
+ *
50
+ * @type {number}
51
+ */
52
+ this.count = count;
53
+
54
+ /**
55
+ * The number of bins/buckets the sort key is quantized into.
56
+ *
57
+ * @type {number}
58
+ */
59
+ this.binCount = binCount;
60
+
61
+ /**
62
+ * The workgroup size of the compute shaders executed during the sort.
63
+ *
64
+ * @type {number}
65
+ */
66
+ this.workgroupSize = workgroupSize;
67
+
68
+ const orderData = new Uint32Array( count );
69
+ for ( let i = 0; i < count; i ++ ) orderData[ i ] = i;
70
+
71
+ /**
72
+ * The buffer attribute holding the sorted order (a permutation of `[0, count)`). This is
73
+ * also the attribute that is kept up to date by {@link CountingSort#computeCPU}.
74
+ *
75
+ * @type {StorageBufferAttribute}
76
+ */
77
+ this.orderAttribute = new StorageBufferAttribute( orderData, 1, Uint32Array );
78
+
79
+ const binAttribute = new StorageBufferAttribute( new Uint32Array( count ), 1, Uint32Array );
80
+ const histogramAttribute = new StorageBufferAttribute( new Uint32Array( binCount ), 1, Uint32Array );
81
+ const offsetAttribute = new StorageBufferAttribute( new Uint32Array( binCount ), 1, Uint32Array );
82
+
83
+ /**
84
+ * A read-only storage node for the sorted order buffer.
85
+ *
86
+ * @type {StorageBufferNode}
87
+ */
88
+ this.orderRead = storage( this.orderAttribute, 'uint', count ).toReadOnly();
89
+
90
+ /**
91
+ * A writable storage node for the sorted order buffer.
92
+ *
93
+ * @type {StorageBufferNode}
94
+ */
95
+ this.orderWrite = storage( this.orderAttribute, 'uint', count );
96
+
97
+ /**
98
+ * A read-only storage node holding each element's bin, computed during the histogram pass.
99
+ *
100
+ * @type {StorageBufferNode}
101
+ */
102
+ this.binRead = storage( binAttribute, 'uint', count ).toReadOnly();
103
+
104
+ /**
105
+ * A writable storage node holding each element's bin.
106
+ *
107
+ * @type {StorageBufferNode}
108
+ */
109
+ this.binWrite = storage( binAttribute, 'uint', count );
110
+
111
+ /**
112
+ * An atomic storage node used to accumulate the per-bin histogram.
113
+ *
114
+ * @type {StorageBufferNode}
115
+ */
116
+ this.histogramAtomic = storage( histogramAttribute, 'uint', binCount ).toAtomic();
117
+
118
+ /**
119
+ * An atomic storage node used both for the exclusive prefix sum of the histogram and, during
120
+ * the scatter pass, as a per-bin write cursor.
121
+ *
122
+ * @type {StorageBufferNode}
123
+ */
124
+ this.offsetAtomic = storage( offsetAttribute, 'uint', binCount ).toAtomic();
125
+
126
+ this._webGLBuffersEnabled = false;
127
+
128
+ this._cpuBins = new Uint32Array( count );
129
+ this._cpuCounts = new Uint32Array( binCount );
130
+ this._cpuOffsets = new Uint32Array( binCount );
131
+
132
+ this._resetNode = null;
133
+ this._histogramNode = null;
134
+ this._prefixNode = null;
135
+ this._scatterNode = null;
136
+
137
+ }
138
+
139
+ /**
140
+ * Sets the TSL function used to compute the bin of the element currently referenced by
141
+ * `instanceIndex`, and (re)builds the compute nodes used by {@link CountingSort#compute}.
142
+ *
143
+ * @param {Function} binNode - A parameterless function returning a `Node<uint>` in `[0, binCount)`.
144
+ */
145
+ setBinNode( binNode ) {
146
+
147
+ const { binCount, workgroupSize, count } = this;
148
+
149
+ this._resetNode = Fn( () => {
150
+
151
+ atomicStore( this.histogramAtomic.element( instanceIndex ), uint( 0 ) );
152
+ atomicStore( this.offsetAtomic.element( instanceIndex ), uint( 0 ) );
153
+
154
+ } )().compute( binCount, [ workgroupSize ] ).setName( 'CountingSortReset' );
155
+
156
+ this._histogramNode = Fn( () => {
157
+
158
+ const bin = binNode().toVar( 'bin' );
159
+
160
+ this.binWrite.element( instanceIndex ).assign( bin );
161
+ atomicAdd( this.histogramAtomic.element( bin ), uint( 1 ) );
162
+
163
+ } )().compute( count, [ workgroupSize ] ).setName( 'CountingSortHistogram' );
164
+
165
+ this._prefixNode = Fn( () => {
166
+
167
+ const sum = uint( 0 ).toVar( 'sum' );
168
+
169
+ Loop( { start: 0, end: binCount, type: 'uint', name: 'bin', condition: '<' }, ( { bin } ) => {
170
+
171
+ const binCountValue = atomicLoad( this.histogramAtomic.element( bin ) ).toVar( 'count' );
172
+ atomicStore( this.offsetAtomic.element( bin ), sum );
173
+ sum.addAssign( binCountValue );
174
+
175
+ } );
176
+
177
+ } )().compute( 1 ).setName( 'CountingSortPrefix' );
178
+
179
+ this._scatterNode = Fn( () => {
180
+
181
+ const bin = this.binRead.element( instanceIndex ).toVar( 'bin' );
182
+ const targetIndex = atomicAdd( this.offsetAtomic.element( bin ), uint( 1 ) ).toVar( 'targetIndex' );
183
+
184
+ this.orderWrite.element( targetIndex ).assign( instanceIndex );
185
+
186
+ } )().compute( count, [ workgroupSize ] ).setName( 'CountingSortScatter' );
187
+
188
+ }
189
+
190
+ /**
191
+ * Executes a complete counting sort on the GPU, updating {@link CountingSort#orderRead}.
192
+ *
193
+ * @param {Renderer} renderer - The current scene's renderer.
194
+ */
195
+ compute( renderer ) {
196
+
197
+ renderer.compute( this._resetNode );
198
+ renderer.compute( this._histogramNode );
199
+ renderer.compute( this._prefixNode );
200
+ renderer.compute( this._scatterNode );
201
+
202
+ }
203
+
204
+ /**
205
+ * Executes a complete counting sort on the CPU, updating {@link CountingSort#orderAttribute}.
206
+ * Intended as a fallback for backends without compute shader support.
207
+ *
208
+ * @param {Function} binFn - A function taking an element index and returning its bin (a plain number in `[0, binCount)`).
209
+ */
210
+ computeCPU( binFn ) {
211
+
212
+ const { count, binCount } = this;
213
+ const order = this.orderAttribute.array;
214
+ const bins = this._cpuBins;
215
+ const counts = this._cpuCounts;
216
+ const offsets = this._cpuOffsets;
217
+
218
+ counts.fill( 0 );
219
+
220
+ for ( let i = 0; i < count; i ++ ) {
221
+
222
+ const bin = binFn( i );
223
+
224
+ bins[ i ] = bin;
225
+ counts[ bin ] ++;
226
+
227
+ }
228
+
229
+ let sum = 0;
230
+
231
+ for ( let i = 0; i < binCount; i ++ ) {
232
+
233
+ offsets[ i ] = sum;
234
+ sum += counts[ i ];
235
+
236
+ }
237
+
238
+ for ( let i = 0; i < count; i ++ ) {
239
+
240
+ order[ offsets[ bins[ i ] ] ++ ] = i;
241
+
242
+ }
243
+
244
+ this.orderAttribute.needsUpdate = true;
245
+
246
+ if ( this.orderAttribute.pbo !== undefined ) {
247
+
248
+ this.orderAttribute.pbo.needsUpdate = true;
249
+
250
+ }
251
+
252
+ }
253
+
254
+ /**
255
+ * Enables the WebGL-specific storage buffer path (PBO + dynamic draw usage) for the order buffer.
256
+ * Only needed when {@link CountingSort#computeCPU} is used with the WebGL backend of {@link WebGPURenderer}.
257
+ */
258
+ enableWebGLBuffers() {
259
+
260
+ if ( this._webGLBuffersEnabled === true ) return;
261
+
262
+ this.orderAttribute.setUsage( DynamicDrawUsage );
263
+ this.orderRead.setPBO( true );
264
+
265
+ this._webGLBuffersEnabled = true;
266
+
267
+ }
268
+
269
+ }
270
+
271
+ export { CountingSort };
@@ -1,173 +1,27 @@
1
1
  import {
2
- Data3DTexture,
3
- FloatType,
4
2
  InstancedBufferAttribute,
5
3
  InstancedMesh,
6
- LinearFilter,
7
4
  Matrix4,
8
- RGBAFormat,
9
- ShaderMaterial,
5
+ NodeMaterial,
10
6
  SphereGeometry,
11
7
  Vector3
12
- } from '@gnsx/three';
13
- // WITH_GENESYS
14
- import { NodeMaterial } from '@gnsx/three/webgpu';
15
- import {
16
- attribute,
17
- Fn,
18
- getLightProbeGridIrradianceAtUV,
19
- normalWorld,
20
- texture3D,
21
- uniform,
22
- vec4
23
- } from '@gnsx/three/tsl';
24
- // !WITH_GENESYS
25
-
26
- // WITH_GENESYS
27
- const _emptyTexture = /*@__PURE__*/ new Data3DTexture( new Float32Array( 1 * 1 * 28 * 4 ), 1, 1, 28 );
28
-
29
- _emptyTexture.format = RGBAFormat;
30
- _emptyTexture.type = FloatType;
31
- _emptyTexture.minFilter = LinearFilter;
32
- _emptyTexture.magFilter = LinearFilter;
33
- _emptyTexture.needsUpdate = true;
34
-
35
- function createNodeMaterial( probes ) {
36
-
37
- const probesSH = texture3D( probes.texture || _emptyTexture );
38
- const probesResolution = uniform( new Vector3( 1, 1, 1 ) );
39
- const instanceUVW = attribute( 'instanceUVW', 'vec3' );
40
-
41
- const fragmentNode = Fn( () => {
42
-
43
- const irradiance = getLightProbeGridIrradianceAtUV( {
44
- probesSH,
45
- probesResolution,
46
- gridUVW: instanceUVW,
47
- worldNormal: normalWorld
48
- } );
49
-
50
- return vec4( irradiance, 1.0 );
51
-
52
- } )();
53
-
54
- const material = new NodeMaterial();
55
- material.fragmentNode = fragmentNode;
56
-
57
- return { material, probesSH, probesResolution };
58
-
59
- }
60
- // !WITH_GENESYS
61
-
62
- function createShaderMaterial() {
63
-
64
- return new ShaderMaterial( {
65
-
66
- uniforms: {
67
-
68
- probesSH: { value: null },
69
- probesResolution: { value: new Vector3() },
70
-
71
- },
72
-
73
- vertexShader: /* glsl */`
74
-
75
- attribute vec3 instanceUVW;
76
-
77
- varying vec3 vWorldNormal;
78
- varying vec3 vUVW;
79
-
80
- void main() {
81
-
82
- vUVW = instanceUVW;
83
- vWorldNormal = normalize( mat3( modelMatrix ) * normal );
84
- gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4( position, 1.0 );
85
-
86
- }
87
-
88
- `,
89
-
90
- fragmentShader: /* glsl */`
91
-
92
- precision highp sampler3D;
93
-
94
- uniform sampler3D probesSH;
95
- uniform vec3 probesResolution;
96
-
97
- varying vec3 vWorldNormal;
98
- varying vec3 vUVW;
99
-
100
- void main() {
101
-
102
- // Atlas UV mapping — must match lightprobes_pars_fragment.glsl.js
103
- float nz = probesResolution.z;
104
- float paddedSlices = nz + 2.0;
105
- float atlasDepth = 7.0 * paddedSlices;
106
- float uvZBase = vUVW.z * nz + 1.0;
107
-
108
- vec4 s0 = texture( probesSH, vec3( vUVW.xy, ( uvZBase ) / atlasDepth ) );
109
- vec4 s1 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + paddedSlices ) / atlasDepth ) );
110
- vec4 s2 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 2.0 * paddedSlices ) / atlasDepth ) );
111
- vec4 s3 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 3.0 * paddedSlices ) / atlasDepth ) );
112
- vec4 s4 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 4.0 * paddedSlices ) / atlasDepth ) );
113
- vec4 s5 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 5.0 * paddedSlices ) / atlasDepth ) );
114
- vec4 s6 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 6.0 * paddedSlices ) / atlasDepth ) );
115
-
116
- // Unpack 9 vec3 SH L2 coefficients
117
-
118
- vec3 c0 = s0.xyz;
119
- vec3 c1 = vec3( s0.w, s1.xy );
120
- vec3 c2 = vec3( s1.zw, s2.x );
121
- vec3 c3 = s2.yzw;
122
- vec3 c4 = s3.xyz;
123
- vec3 c5 = vec3( s3.w, s4.xy );
124
- vec3 c6 = vec3( s4.zw, s5.x );
125
- vec3 c7 = s5.yzw;
126
- vec3 c8 = s6.xyz;
127
-
128
- vec3 n = normalize( vWorldNormal );
129
-
130
- float x = n.x, y = n.y, z = n.z;
131
-
132
- // band 0
133
- vec3 result = c0 * 0.886227;
134
-
135
- // band 1,
136
- result += c1 * 2.0 * 0.511664 * y;
137
- result += c2 * 2.0 * 0.511664 * z;
138
- result += c3 * 2.0 * 0.511664 * x;
139
-
140
- // band 2,
141
- result += c4 * 2.0 * 0.429043 * x * y;
142
- result += c5 * 2.0 * 0.429043 * y * z;
143
- result += c6 * ( 0.743125 * z * z - 0.247708 );
144
- result += c7 * 2.0 * 0.429043 * x * z;
145
- result += c8 * 0.429043 * ( x * x - y * y );
146
-
147
- gl_FragColor = vec4( max( result, vec3( 0.0 ) ), 1.0 );
148
-
149
- #include <tonemapping_fragment>
150
- #include <colorspace_fragment>
151
-
152
- }
153
-
154
- `
155
-
156
- } );
157
-
158
- }
8
+ } from '@gnsx/three/webgpu';
9
+ import { array, attribute, Fn, getShIrradianceAt, normalWorld, texture3D, uniform, vec3, vec4 } from '@gnsx/three/tsl';
159
10
 
160
11
  /**
161
- * Visualizes an {@link LightProbeGrid} by rendering a sphere at each
162
- * probe position, shaded with the probe's L2 spherical harmonics.
12
+ * Visualizes a {@link LightProbeGrid} by rendering a sphere at each probe
13
+ * position, shaded with the probe's L2 spherical harmonics. Uses a single
14
+ * `InstancedMesh` draw call for all probes.
163
15
  *
164
- * Uses a single `InstancedMesh` draw call for all probes.
16
+ * This helper can only be used with {@link WebGPURenderer}.
17
+ * When using {@link WebGLRenderer}, import from `LightProbeGridHelperWebGL.js`.
165
18
  *
166
19
  * ```js
167
20
  * const helper = new LightProbeGridHelper( probes );
168
21
  * scene.add( helper );
169
22
  * ```
170
23
  *
24
+ * @private
171
25
  * @augments InstancedMesh
172
26
  * @three_import import { LightProbeGridHelper } from 'three/addons/helpers/LightProbeGridHelper.js';
173
27
  */
@@ -178,18 +32,16 @@ class LightProbeGridHelper extends InstancedMesh {
178
32
  *
179
33
  * @param {LightProbeGrid} probes - The probe grid to visualize.
180
34
  * @param {number} [sphereSize=0.12] - The radius of each probe sphere.
181
- * @param {Object} [options] - The helper options.
182
- * @param {boolean} [options.webgpu=false] - Whether to use a WebGPU-compatible node material.
183
35
  */
184
- constructor( probes, sphereSize = 0.12, options = {} ) {
36
+ constructor( probes, sphereSize = 0.12 ) {
185
37
 
186
38
  const geometry = new SphereGeometry( sphereSize, 16, 16 );
187
- const materialState = options.webgpu === true ? createNodeMaterial( probes ) : { material: createShaderMaterial() };
39
+ const material = new NodeMaterial();
188
40
 
189
41
  const res = probes.resolution;
190
42
  const count = res.x * res.y * res.z;
191
43
 
192
- super( geometry, materialState.material, count );
44
+ super( geometry, material, count );
193
45
 
194
46
  /**
195
47
  * The probe grid to visualize.
@@ -200,18 +52,49 @@ class LightProbeGridHelper extends InstancedMesh {
200
52
 
201
53
  this.type = 'LightProbeGridHelper';
202
54
 
203
- // WITH_GENESYS
204
- this._probesSH = materialState.probesSH || null;
205
- this._probesResolution = materialState.probesResolution || null;
206
- // !WITH_GENESYS
55
+ // Atlas and resolution are swappable uniforms, so the shading node builds once.
56
+
57
+ this._atlas = texture3D( probes.texture );
58
+ this._resolution = uniform( new Vector3() );
59
+
60
+ const nz = this._resolution.z;
61
+ const paddedSlices = nz.add( 2.0 );
62
+ const atlasDepth = paddedSlices.mul( 7.0 );
63
+
64
+ material.fragmentNode = Fn( () => {
65
+
66
+ const uvw = attribute( 'instanceUVW', 'vec3' );
67
+ const uvZBase = uvw.z.mul( nz ).add( 1.0 );
68
+
69
+ const slice = ( t ) => this._atlas.sample( vec3( uvw.xy, uvZBase.add( paddedSlices.mul( t ) ).div( atlasDepth ) ) );
70
+
71
+ const s0 = slice( 0 ), s1 = slice( 1 ), s2 = slice( 2 ), s3 = slice( 3 );
72
+ const s4 = slice( 4 ), s5 = slice( 5 ), s6 = slice( 6 );
73
+
74
+ const sh = array( [
75
+ s0.xyz,
76
+ vec3( s0.w, s1.xy ),
77
+ vec3( s1.zw, s2.x ),
78
+ s2.yzw,
79
+ s3.xyz,
80
+ vec3( s3.w, s4.xy ),
81
+ vec3( s4.zw, s5.x ),
82
+ s5.yzw,
83
+ s6.xyz
84
+ ] );
85
+
86
+ return vec4( getShIrradianceAt( normalWorld, sh ).max( vec3( 0.0 ) ), 1.0 );
87
+
88
+ } )();
207
89
 
208
90
  this.update();
209
91
 
210
92
  }
211
93
 
212
94
  /**
213
- * Rebuilds instance matrices and UVW attributes from the current probe grid.
214
- * Call this after changing `probes` or after re-baking.
95
+ * Rebuilds instance matrices and UVW attributes from the current probe grid,
96
+ * and rebinds the shading node to its atlas. Call this after changing
97
+ * `probes` or after re-baking.
215
98
  */
216
99
  update() {
217
100
 
@@ -219,17 +102,17 @@ class LightProbeGridHelper extends InstancedMesh {
219
102
  const res = probes.resolution;
220
103
  const count = res.x * res.y * res.z;
221
104
 
105
+ // Resize instance matrix buffer if needed.
106
+
222
107
  if ( this.instanceMatrix.count !== count ) {
223
108
 
224
- // WITH_GENESYS
225
- this.instanceMatrix.dispose();
226
- // !WITH_GENESYS
227
109
  this.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );
228
110
 
229
111
  }
230
112
 
231
113
  this.count = count;
232
114
 
115
+ const uvwArray = new Float32Array( count * 3 );
233
116
  const matrix = new Matrix4();
234
117
  const probePos = new Vector3();
235
118
 
@@ -241,6 +124,11 @@ class LightProbeGridHelper extends InstancedMesh {
241
124
 
242
125
  for ( let ix = 0; ix < res.x; ix ++ ) {
243
126
 
127
+ // Remap to texel centers (must match LightProbeGridNode).
128
+ uvwArray[ i * 3 ] = ( ix + 0.5 ) / res.x;
129
+ uvwArray[ i * 3 + 1 ] = ( iy + 0.5 ) / res.y;
130
+ uvwArray[ i * 3 + 2 ] = ( iz + 0.5 ) / res.z;
131
+
244
132
  probes.getProbePosition( ix, iy, iz, probePos );
245
133
  matrix.makeTranslation( probePos.x, probePos.y, probePos.z );
246
134
  this.setMatrixAt( i, matrix );
@@ -255,65 +143,10 @@ class LightProbeGridHelper extends InstancedMesh {
255
143
 
256
144
  this.instanceMatrix.needsUpdate = true;
257
145
 
258
- let instanceUVW = this.geometry.getAttribute( 'instanceUVW' );
259
-
260
- if ( instanceUVW === undefined || instanceUVW.count !== count ) {
261
-
262
- // WITH_GENESYS
263
- if ( instanceUVW !== undefined ) {
264
-
265
- instanceUVW.dispose();
266
-
267
- }
268
- // !WITH_GENESYS
269
-
270
- const uvwArray = new Float32Array( count * 3 );
271
-
272
- i = 0;
273
-
274
- for ( let iz = 0; iz < res.z; iz ++ ) {
275
-
276
- for ( let iy = 0; iy < res.y; iy ++ ) {
277
-
278
- for ( let ix = 0; ix < res.x; ix ++ ) {
279
-
280
- // Remap to texel centers (must match lightprobes_pars_fragment.glsl.js)
281
- uvwArray[ i * 3 ] = ( ix + 0.5 ) / res.x;
282
- uvwArray[ i * 3 + 1 ] = ( iy + 0.5 ) / res.y;
283
- uvwArray[ i * 3 + 2 ] = ( iz + 0.5 ) / res.z;
146
+ this.geometry.setAttribute( 'instanceUVW', new InstancedBufferAttribute( uvwArray, 3 ) );
284
147
 
285
- i ++;
286
-
287
- }
288
-
289
- }
290
-
291
- }
292
-
293
- instanceUVW = new InstancedBufferAttribute( uvwArray, 3 );
294
- this.geometry.setAttribute( 'instanceUVW', instanceUVW );
295
-
296
- }
297
-
298
- // Update texture uniforms
299
-
300
- // WITH_GENESYS
301
- if ( this._probesSH !== null && this._probesResolution !== null ) {
302
-
303
- this._probesSH.value = probes.texture || _emptyTexture;
304
- this._probesResolution.value.copy( probes.resolution );
305
-
306
- } else {
307
-
308
- // !WITH_GENESYS
309
-
310
- this.material.uniforms.probesSH.value = probes.texture;
311
- this.material.uniforms.probesResolution.value.copy( probes.resolution );
312
-
313
- // WITH_GENESYS
314
-
315
- }
316
- // !WITH_GENESYS
148
+ this._atlas.value = probes.texture;
149
+ this._resolution.value.copy( res );
317
150
 
318
151
  }
319
152
 
@@ -323,18 +156,6 @@ class LightProbeGridHelper extends InstancedMesh {
323
156
  */
324
157
  dispose() {
325
158
 
326
- // WITH_GENESYS
327
- this.instanceMatrix.dispose();
328
-
329
- const instanceUVW = this.geometry.getAttribute( 'instanceUVW' );
330
-
331
- if ( instanceUVW !== undefined ) {
332
-
333
- instanceUVW.dispose();
334
-
335
- }
336
- // !WITH_GENESYS
337
-
338
159
  this.geometry.dispose();
339
160
  this.material.dispose();
340
161