@plastic-software/three 0.181.3 → 0.183.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 (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -1,7 +1,8 @@
1
1
  import ShadowBaseNode, { shadowPositionWorld } from './ShadowBaseNode.js';
2
- import { float, vec2, vec3, int, Fn, nodeObject } from '../tsl/TSLBase.js';
2
+ import { float, vec2, vec3, int, Fn } from '../tsl/TSLBase.js';
3
3
  import { reference } from '../accessors/ReferenceNode.js';
4
4
  import { texture, textureLoad } from '../accessors/TextureNode.js';
5
+ import { cubeTexture } from '../accessors/CubeTextureNode.js';
5
6
  import { normalWorld } from '../accessors/Normal.js';
6
7
  import { mix, sqrt } from '../math/MathNode.js';
7
8
  import { add } from '../math/OperatorNode.js';
@@ -10,15 +11,14 @@ import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
10
11
  import QuadMesh from '../../renderers/common/QuadMesh.js';
11
12
  import { Loop } from '../utils/LoopNode.js';
12
13
  import { screenCoordinate } from '../display/ScreenNode.js';
13
- import { HalfFloatType, LessCompare, RGFormat, VSMShadowMap, WebGPUCoordinateSystem } from '../../constants.js';
14
+ import { Compatibility, GreaterEqualCompare, HalfFloatType, LessEqualCompare, LinearFilter, NearestFilter, PCFShadowMap, PCFSoftShadowMap, RGFormat, VSMShadowMap } from '../../constants.js';
14
15
  import { renderGroup } from '../core/UniformGroupNode.js';
15
16
  import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js';
16
17
  import { lightShadowMatrix } from '../accessors/Lights.js';
17
18
  import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../renderers/common/RendererUtils.js';
18
19
  import { getDataFromObject } from '../core/NodeUtils.js';
19
- import { getShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
20
+ import { getShadowMaterial, disposeShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
20
21
  import ChainMap from '../../renderers/common/ChainMap.js';
21
- import { warn } from '../../utils.js';
22
22
  import { textureSize } from '../accessors/TextureSizeNode.js';
23
23
  import { uv } from '../accessors/UV.js';
24
24
 
@@ -36,16 +36,7 @@ const _shadowRenderObjectKeys = [];
36
36
  * @param {LightShadow} shadow - The light shadow object containing shadow properties.
37
37
  * @param {number} shadowType - The type of shadow map (e.g., BasicShadowMap).
38
38
  * @param {boolean} useVelocity - Whether to use velocity data for rendering.
39
- * @return {Function} A function that renders shadow objects.
40
- *
41
- * The returned function has the following parameters:
42
- * @param {Object3D} object - The 3D object to render.
43
- * @param {Scene} scene - The scene containing the object.
44
- * @param {Camera} _camera - The camera used for rendering.
45
- * @param {BufferGeometry} geometry - The geometry of the object.
46
- * @param {Material} material - The material of the object.
47
- * @param {Group} group - The group the object belongs to.
48
- * @param {...any} params - Additional parameters for rendering.
39
+ * @return {shadowRenderObjectFunction} A function that renders shadow objects.
49
40
  */
50
41
  export const getShadowRenderObjectFunction = ( renderer, shadow, shadowType, useVelocity ) => {
51
42
 
@@ -93,6 +84,7 @@ export const getShadowRenderObjectFunction = ( renderer, shadow, shadowType, use
93
84
  /**
94
85
  * Represents the shader code for the first VSM render pass.
95
86
  *
87
+ * @private
96
88
  * @method
97
89
  * @param {Object} inputs - The input parameter object.
98
90
  * @param {Node<float>} inputs.samples - The number of samples
@@ -131,7 +123,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass,
131
123
  mean.divAssign( samples );
132
124
  squaredMean.divAssign( samples );
133
125
 
134
- const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ) );
126
+ const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ).max( 0 ) );
135
127
  return vec2( mean, std_dev );
136
128
 
137
129
  } );
@@ -139,6 +131,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass,
139
131
  /**
140
132
  * Represents the shader code for the second VSM render pass.
141
133
  *
134
+ * @private
142
135
  * @method
143
136
  * @param {Object} inputs - The input parameter object.
144
137
  * @param {Node<float>} inputs.samples - The number of samples
@@ -175,7 +168,7 @@ const VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPas
175
168
  mean.divAssign( samples );
176
169
  squaredMean.divAssign( samples );
177
170
 
178
- const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ) );
171
+ const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ).max( 0 ) );
179
172
  return vec2( mean, std_dev );
180
173
 
181
174
  } );
@@ -348,7 +341,7 @@ class ShadowNode extends ShadowBaseNode {
348
341
  const { shadow } = this;
349
342
  const { renderer } = builder;
350
343
 
351
- const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );
344
+ const bias = shadow.biasNode || reference( 'bias', 'float', shadow ).setGroup( renderGroup );
352
345
 
353
346
  let shadowCoord = shadowPosition;
354
347
  let coordZ;
@@ -359,12 +352,6 @@ class ShadowNode extends ShadowBaseNode {
359
352
 
360
353
  coordZ = shadowCoord.z;
361
354
 
362
- if ( renderer.coordinateSystem === WebGPUCoordinateSystem ) {
363
-
364
- coordZ = coordZ.mul( 2 ).sub( 1 ); // WebGPU: Conversion [ 0, 1 ] to [ - 1, 1 ]
365
-
366
- }
367
-
368
355
  } else {
369
356
 
370
357
  const w = shadowCoord.w;
@@ -383,7 +370,7 @@ class ShadowNode extends ShadowBaseNode {
383
370
  shadowCoord = vec3(
384
371
  shadowCoord.x,
385
372
  shadowCoord.y.oneMinus(), // follow webgpu standards
386
- coordZ.add( bias )
373
+ renderer.reversedDepthBuffer ? coordZ.sub( bias ) : coordZ.add( bias )
387
374
  );
388
375
 
389
376
  return shadowCoord;
@@ -407,7 +394,7 @@ class ShadowNode extends ShadowBaseNode {
407
394
 
408
395
  const depthTexture = new DepthTexture( shadow.mapSize.width, shadow.mapSize.height );
409
396
  depthTexture.name = 'ShadowDepthTexture';
410
- depthTexture.compareFunction = LessCompare;
397
+ depthTexture.compareFunction = builder.renderer.reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare;
411
398
 
412
399
  const shadowMap = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height );
413
400
  shadowMap.texture.name = 'ShadowMap';
@@ -430,9 +417,22 @@ class ShadowNode extends ShadowBaseNode {
430
417
 
431
418
  const { light, shadow } = this;
432
419
 
420
+ const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder );
421
+
433
422
  const shadowMapType = renderer.shadowMap.type;
423
+ const hasTextureCompare = renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE );
434
424
 
435
- const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder );
425
+ if ( ( shadowMapType === PCFShadowMap || shadowMapType === PCFSoftShadowMap ) && hasTextureCompare ) {
426
+
427
+ depthTexture.minFilter = LinearFilter;
428
+ depthTexture.magFilter = LinearFilter;
429
+
430
+ } else {
431
+
432
+ depthTexture.minFilter = NearestFilter;
433
+ depthTexture.magFilter = NearestFilter;
434
+
435
+ }
436
436
 
437
437
  shadow.camera.coordinateSystem = camera.coordinateSystem;
438
438
  shadow.camera.updateProjectionMatrix();
@@ -523,15 +523,42 @@ class ShadowNode extends ShadowBaseNode {
523
523
 
524
524
  const shadowNode = this.setupShadowFilter( builder, { filterFn, shadowTexture: shadowMap.texture, depthTexture: shadowDepthTexture, shadowCoord, shadow, depthLayer: this.depthLayer } );
525
525
 
526
- let shadowColor = texture( shadowMap.texture, shadowCoord );
526
+ let shadowColor;
527
+
528
+ if ( renderer.shadowMap.transmitted === true ) {
529
+
530
+ if ( shadowMap.texture.isCubeTexture ) {
531
+
532
+ // For cube shadow maps (point lights), use cubeTexture with vec3 coordinates
533
+ shadowColor = cubeTexture( shadowMap.texture, shadowCoord.xyz );
534
+
535
+ } else {
536
+
537
+ shadowColor = texture( shadowMap.texture, shadowCoord );
527
538
 
528
- if ( depthTexture.isArrayTexture ) {
539
+ if ( depthTexture.isArrayTexture ) {
529
540
 
530
- shadowColor = shadowColor.depth( this.depthLayer );
541
+ shadowColor = shadowColor.depth( this.depthLayer );
542
+
543
+ }
544
+
545
+ }
531
546
 
532
547
  }
533
548
 
534
- const shadowOutput = mix( 1, shadowNode.rgb.mix( shadowColor, 1 ), shadowIntensity.mul( shadowColor.a ) ).toVar();
549
+ //
550
+
551
+ let shadowOutput;
552
+
553
+ if ( shadowColor ) {
554
+
555
+ shadowOutput = mix( 1, shadowNode.rgb.mix( shadowColor, 1 ), shadowIntensity.mul( shadowColor.a ) ).toVar();
556
+
557
+ } else {
558
+
559
+ shadowOutput = mix( 1, shadowNode, shadowIntensity ).toVar();
560
+
561
+ }
535
562
 
536
563
  this.shadowMap = shadowMap;
537
564
  this.shadow.map = shadowMap;
@@ -540,13 +567,33 @@ class ShadowNode extends ShadowBaseNode {
540
567
 
541
568
  const inspectName = `${ this.light.type } Shadow [ ${ this.light.name || 'ID: ' + this.light.id } ]`;
542
569
 
543
- return shadowOutput.toInspector( `${ inspectName } / Color`, () => {
570
+ if ( shadowColor ) {
571
+
572
+ shadowOutput.toInspector( `${ inspectName } / Color`, () => {
573
+
574
+ if ( this.shadowMap.texture.isCubeTexture ) {
575
+
576
+ return cubeTexture( this.shadowMap.texture );
577
+
578
+ }
579
+
580
+ return texture( this.shadowMap.texture );
581
+
582
+ } );
583
+
584
+ }
585
+
586
+ return shadowOutput.toInspector( `${ inspectName } / Depth`, () => {
587
+
588
+ // TODO: Use linear depth
589
+
590
+ if ( this.shadowMap.texture.isCubeTexture ) {
544
591
 
545
- return texture( this.shadowMap.texture );
592
+ return cubeTexture( this.shadowMap.texture ).r.oneMinus();
546
593
 
547
- } ).toInspector( `${ inspectName } / Depth`, () => {
594
+ }
548
595
 
549
- return textureLoad( this.shadowMap.depthTexture, uv().mul( textureSize( texture( this.shadowMap.depthTexture ) ) ) ).x.oneMinus();
596
+ return textureLoad( this.shadowMap.depthTexture, uv().mul( textureSize( texture( this.shadowMap.depthTexture ) ) ) ).r.oneMinus();
550
597
 
551
598
  } );
552
599
 
@@ -585,12 +632,6 @@ class ShadowNode extends ShadowBaseNode {
585
632
 
586
633
  }
587
634
 
588
- if ( builder.material.shadowNode ) { // @deprecated, r171
589
-
590
- warn( 'NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.' );
591
-
592
- }
593
-
594
635
  if ( builder.material.receivedShadowNode ) {
595
636
 
596
637
  node = builder.material.receivedShadowNode( node );
@@ -729,6 +770,8 @@ class ShadowNode extends ShadowBaseNode {
729
770
 
730
771
  this._currentShadowType = null;
731
772
 
773
+ disposeShadowMaterial( this.light );
774
+
732
775
  if ( this.shadowMap ) {
733
776
 
734
777
  this.shadowMap.dispose();
@@ -799,6 +842,19 @@ class ShadowNode extends ShadowBaseNode {
799
842
 
800
843
  export default ShadowNode;
801
844
 
845
+ /**
846
+ * Shadow Render Object Function.
847
+ *
848
+ * @function shadowRenderObjectFunction
849
+ * @param {Object3D} object - The 3D object to render.
850
+ * @param {Scene} scene - The scene containing the object.
851
+ * @param {Camera} _camera - The camera used for rendering.
852
+ * @param {BufferGeometry} geometry - The geometry of the object.
853
+ * @param {Material} material - The material of the object.
854
+ * @param {Group} group - The group the object belongs to.
855
+ * @param {...any} params - Additional parameters for rendering.
856
+ */
857
+
802
858
  /**
803
859
  * TSL function for creating an instance of `ShadowNode`.
804
860
  *
@@ -808,4 +864,4 @@ export default ShadowNode;
808
864
  * @param {?LightShadow} [shadow] - The light shadow.
809
865
  * @return {ShadowNode} The created shadow node.
810
866
  */
811
- export const shadow = ( light, shadow ) => nodeObject( new ShadowNode( light, shadow ) );
867
+ export const shadow = ( light, shadow ) => new ShadowNode( light, shadow );
@@ -0,0 +1,433 @@
1
+ import { float, Fn, If, nodeProxyIntent, uint, int, uvec2, uvec3, uvec4, ivec2, ivec3, ivec4 } from '../tsl/TSLCore.js';
2
+ import { bitcast, floatBitsToUint } from './BitcastNode.js';
3
+ import MathNode, { negate } from './MathNode.js';
4
+
5
+ const registeredBitcountFunctions = {};
6
+
7
+ /**
8
+ * This node represents an operation that counts the bits of a piece of shader data.
9
+ *
10
+ * @augments MathNode
11
+ */
12
+ class BitcountNode extends MathNode {
13
+
14
+ static get type() {
15
+
16
+ return 'BitcountNode';
17
+
18
+ }
19
+
20
+ /**
21
+ * Constructs a new math node.
22
+ *
23
+ * @param {'countTrailingZeros'|'countLeadingZeros'|'countOneBits'} method - The method name.
24
+ * @param {Node} aNode - The first input.
25
+ */
26
+ constructor( method, aNode ) {
27
+
28
+ super( method, aNode );
29
+
30
+ /**
31
+ * This flag can be used for type testing.
32
+ *
33
+ * @type {boolean}
34
+ * @readonly
35
+ * @default true
36
+ */
37
+ this.isBitcountNode = true;
38
+
39
+ }
40
+
41
+ /**
42
+ * Casts the input value of the function to an integer if necessary.
43
+ *
44
+ * @private
45
+ * @param {Node<uint>|Node<int>} inputNode - The input value.
46
+ * @param {Node<uint>} outputNode - The output value.
47
+ * @param {string} elementType - The type of the input value.
48
+ */
49
+ _resolveElementType( inputNode, outputNode, elementType ) {
50
+
51
+ if ( elementType === 'int' ) {
52
+
53
+ outputNode.assign( bitcast( inputNode, 'uint' ) );
54
+
55
+ } else {
56
+
57
+ outputNode.assign( inputNode );
58
+
59
+ }
60
+
61
+ }
62
+
63
+ _returnDataNode( inputType ) {
64
+
65
+ switch ( inputType ) {
66
+
67
+ case 'uint': {
68
+
69
+ return uint;
70
+
71
+ }
72
+
73
+ case 'int': {
74
+
75
+ return int;
76
+
77
+ }
78
+
79
+ case 'uvec2': {
80
+
81
+ return uvec2;
82
+
83
+ }
84
+
85
+ case 'uvec3': {
86
+
87
+ return uvec3;
88
+
89
+ }
90
+
91
+ case 'uvec4': {
92
+
93
+ return uvec4;
94
+
95
+ }
96
+
97
+ case 'ivec2': {
98
+
99
+ return ivec2;
100
+
101
+ }
102
+
103
+ case 'ivec3': {
104
+
105
+ return ivec3;
106
+
107
+ }
108
+
109
+ case 'ivec4': {
110
+
111
+ return ivec4;
112
+
113
+ }
114
+
115
+ }
116
+
117
+ }
118
+
119
+ /**
120
+ * Creates and registers a reusable GLSL function that emulates the behavior of countTrailingZeros.
121
+ *
122
+ * @private
123
+ * @param {string} method - The name of the function to create.
124
+ * @param {string} elementType - The type of the input value.
125
+ * @returns {Function} - The generated function
126
+ */
127
+ _createTrailingZerosBaseLayout( method, elementType ) {
128
+
129
+ const outputConvertNode = this._returnDataNode( elementType );
130
+
131
+ const fnDef = Fn( ( [ value ] ) => {
132
+
133
+ const v = uint( 0.0 );
134
+
135
+ this._resolveElementType( value, v, elementType );
136
+
137
+ const f = float( v.bitAnd( negate( v ) ) );
138
+ const uintBits = floatBitsToUint( f );
139
+
140
+ const numTrailingZeros = ( uintBits.shiftRight( 23 ) ).sub( 127 );
141
+
142
+ return outputConvertNode( numTrailingZeros );
143
+
144
+ } ).setLayout( {
145
+ name: method,
146
+ type: elementType,
147
+ inputs: [
148
+ { name: 'value', type: elementType }
149
+ ]
150
+ } );
151
+
152
+ return fnDef;
153
+
154
+ }
155
+
156
+ /**
157
+ * Creates and registers a reusable GLSL function that emulates the behavior of countLeadingZeros.
158
+ *
159
+ * @private
160
+ * @param {string} method - The name of the function to create.
161
+ * @param {string} elementType - The type of the input value.
162
+ * @returns {Function} - The generated function
163
+ */
164
+ _createLeadingZerosBaseLayout( method, elementType ) {
165
+
166
+ const outputConvertNode = this._returnDataNode( elementType );
167
+
168
+ const fnDef = Fn( ( [ value ] ) => {
169
+
170
+ If( value.equal( uint( 0 ) ), () => {
171
+
172
+ return uint( 32 );
173
+
174
+ } );
175
+
176
+ const v = uint( 0 );
177
+ const n = uint( 0 );
178
+ this._resolveElementType( value, v, elementType );
179
+
180
+ If( v.shiftRight( 16 ).equal( 0 ), () => {
181
+
182
+ n.addAssign( 16 );
183
+ v.shiftLeftAssign( 16 );
184
+
185
+ } );
186
+
187
+ If( v.shiftRight( 24 ).equal( 0 ), () => {
188
+
189
+ n.addAssign( 8 );
190
+ v.shiftLeftAssign( 8 );
191
+
192
+ } );
193
+
194
+ If( v.shiftRight( 28 ).equal( 0 ), () => {
195
+
196
+ n.addAssign( 4 );
197
+ v.shiftLeftAssign( 4 );
198
+
199
+ } );
200
+
201
+ If( v.shiftRight( 30 ).equal( 0 ), () => {
202
+
203
+ n.addAssign( 2 );
204
+ v.shiftLeftAssign( 2 );
205
+
206
+ } );
207
+
208
+ If( v.shiftRight( 31 ).equal( 0 ), () => {
209
+
210
+ n.addAssign( 1 );
211
+
212
+ } );
213
+
214
+ return outputConvertNode( n );
215
+
216
+ } ).setLayout( {
217
+ name: method,
218
+ type: elementType,
219
+ inputs: [
220
+ { name: 'value', type: elementType }
221
+ ]
222
+ } );
223
+
224
+ return fnDef;
225
+
226
+ }
227
+
228
+ /**
229
+ * Creates and registers a reusable GLSL function that emulates the behavior of countOneBits.
230
+ *
231
+ * @private
232
+ * @param {string} method - The name of the function to create.
233
+ * @param {string} elementType - The type of the input value.
234
+ * @returns {Function} - The generated function
235
+ */
236
+ _createOneBitsBaseLayout( method, elementType ) {
237
+
238
+ const outputConvertNode = this._returnDataNode( elementType );
239
+
240
+ const fnDef = Fn( ( [ value ] ) => {
241
+
242
+ const v = uint( 0.0 );
243
+
244
+ this._resolveElementType( value, v, elementType );
245
+
246
+ v.assign( v.sub( v.shiftRight( uint( 1 ) ).bitAnd( uint( 0x55555555 ) ) ) );
247
+ v.assign( v.bitAnd( uint( 0x33333333 ) ).add( v.shiftRight( uint( 2 ) ).bitAnd( uint( 0x33333333 ) ) ) );
248
+
249
+ const numBits = v.add( v.shiftRight( uint( 4 ) ) ).bitAnd( uint( 0xF0F0F0F ) ).mul( uint( 0x1010101 ) ).shiftRight( uint( 24 ) );
250
+
251
+ return outputConvertNode( numBits );
252
+
253
+ } ).setLayout( {
254
+ name: method,
255
+ type: elementType,
256
+ inputs: [
257
+ { name: 'value', type: elementType }
258
+ ]
259
+ } );
260
+
261
+ return fnDef;
262
+
263
+ }
264
+
265
+ /**
266
+ * Creates and registers a reusable GLSL function that emulates the behavior of the specified bitcount function.
267
+ * including considerations for component-wise bitcounts on vector type inputs.
268
+ *
269
+ * @private
270
+ * @param {string} method - The name of the function to create.
271
+ * @param {string} inputType - The type of the input value.
272
+ * @param {number} typeLength - The vec length of the input value.
273
+ * @param {Function} baseFn - The base function that operates on an individual component of the vector.
274
+ * @returns {Function} - The alias function for the specified bitcount method.
275
+ */
276
+ _createMainLayout( method, inputType, typeLength, baseFn ) {
277
+
278
+ const outputConvertNode = this._returnDataNode( inputType );
279
+
280
+ const fnDef = Fn( ( [ value ] ) => {
281
+
282
+ if ( typeLength === 1 ) {
283
+
284
+ return outputConvertNode( baseFn( value ) );
285
+
286
+ } else {
287
+
288
+ const vec = outputConvertNode( 0 );
289
+
290
+ const components = [ 'x', 'y', 'z', 'w' ];
291
+ for ( let i = 0; i < typeLength; i ++ ) {
292
+
293
+ const component = components[ i ];
294
+
295
+ vec[ component ].assign( baseFn( value[ component ] ) );
296
+
297
+ }
298
+
299
+ return vec;
300
+
301
+ }
302
+
303
+ } ).setLayout( {
304
+ name: method,
305
+ type: inputType,
306
+ inputs: [
307
+ { name: 'value', type: inputType }
308
+ ]
309
+ } );
310
+
311
+ return fnDef;
312
+
313
+ }
314
+
315
+ setup( builder ) {
316
+
317
+ const { method, aNode } = this;
318
+
319
+ const { renderer } = builder;
320
+
321
+ if ( renderer.backend.isWebGPUBackend ) {
322
+
323
+ // use built-in WGSL functions for WebGPU
324
+
325
+ return super.setup( builder );
326
+
327
+ }
328
+
329
+ const inputType = this.getInputType( builder );
330
+ const elementType = builder.getElementType( inputType );
331
+
332
+ const typeLength = builder.getTypeLength( inputType );
333
+
334
+ const baseMethod = `${method}_base_${elementType}`;
335
+ const newMethod = `${method}_${inputType}`;
336
+
337
+ let baseFn = registeredBitcountFunctions[ baseMethod ];
338
+
339
+ if ( baseFn === undefined ) {
340
+
341
+ switch ( method ) {
342
+
343
+ case BitcountNode.COUNT_LEADING_ZEROS: {
344
+
345
+ baseFn = this._createLeadingZerosBaseLayout( baseMethod, elementType );
346
+ break;
347
+
348
+ }
349
+
350
+ case BitcountNode.COUNT_TRAILING_ZEROS: {
351
+
352
+ baseFn = this._createTrailingZerosBaseLayout( baseMethod, elementType );
353
+ break;
354
+
355
+ }
356
+
357
+ case BitcountNode.COUNT_ONE_BITS: {
358
+
359
+ baseFn = this._createOneBitsBaseLayout( baseMethod, elementType );
360
+ break;
361
+
362
+ }
363
+
364
+ }
365
+
366
+ registeredBitcountFunctions[ baseMethod ] = baseFn;
367
+
368
+ }
369
+
370
+ let fn = registeredBitcountFunctions[ newMethod ];
371
+
372
+ if ( fn === undefined ) {
373
+
374
+ fn = this._createMainLayout( newMethod, inputType, typeLength, baseFn );
375
+ registeredBitcountFunctions[ newMethod ] = fn;
376
+
377
+ }
378
+
379
+ const output = Fn( () => {
380
+
381
+ return fn(
382
+ aNode,
383
+ );
384
+
385
+ } );
386
+
387
+ return output();
388
+
389
+ }
390
+
391
+ }
392
+
393
+ export default BitcountNode;
394
+
395
+ BitcountNode.COUNT_TRAILING_ZEROS = 'countTrailingZeros';
396
+ BitcountNode.COUNT_LEADING_ZEROS = 'countLeadingZeros';
397
+ BitcountNode.COUNT_ONE_BITS = 'countOneBits';
398
+
399
+ /**
400
+ * Finds the number of consecutive 0 bits from the least significant bit of the input value,
401
+ * which is also the index of the least significant bit of the input value.
402
+ *
403
+ * Can only be used with {@link WebGPURenderer} and a WebGPU backend.
404
+ *
405
+ * @tsl
406
+ * @function
407
+ * @param {Node | number} x - The input value.
408
+ * @returns {Node}
409
+ */
410
+ export const countTrailingZeros = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_TRAILING_ZEROS ).setParameterLength( 1 );
411
+
412
+ /**
413
+ * Finds the number of consecutive 0 bits starting from the most significant bit of the input value.
414
+ *
415
+ * Can only be used with {@link WebGPURenderer} and a WebGPU backend.
416
+ *
417
+ * @tsl
418
+ * @function
419
+ * @param {Node | number} x - The input value.
420
+ * @returns {Node}
421
+ */
422
+ export const countLeadingZeros = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_LEADING_ZEROS ).setParameterLength( 1 );
423
+
424
+ /**
425
+ * Finds the number of '1' bits set in the input value
426
+ *
427
+ * Can only be used with {@link WebGPURenderer} and a WebGPU backend.
428
+ *
429
+ * @tsl
430
+ * @function
431
+ * @returns {Node}
432
+ */
433
+ export const countOneBits = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_ONE_BITS ).setParameterLength( 1 );