@plastic-software/three 0.179.0 → 0.181.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/build/three.cjs +1108 -591
  2. package/build/three.core.js +616 -345
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +488 -250
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +37 -6
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +6576 -2152
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +6575 -2151
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  13. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  14. package/examples/jsm/Addons.js +1 -1
  15. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  16. package/examples/jsm/controls/ArcballControls.js +8 -8
  17. package/examples/jsm/controls/DragControls.js +7 -57
  18. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  19. package/examples/jsm/controls/FlyControls.js +1 -1
  20. package/examples/jsm/controls/OrbitControls.js +2 -2
  21. package/examples/jsm/controls/PointerLockControls.js +2 -10
  22. package/examples/jsm/controls/TrackballControls.js +1 -1
  23. package/examples/jsm/controls/TransformControls.js +1 -1
  24. package/examples/jsm/effects/AsciiEffect.js +8 -8
  25. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  26. package/examples/jsm/exporters/EXRExporter.js +1 -1
  27. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  28. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  29. package/examples/jsm/exporters/PLYExporter.js +1 -1
  30. package/examples/jsm/exporters/USDZExporter.js +9 -2
  31. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  34. package/examples/jsm/geometries/TextGeometry.js +3 -2
  35. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  36. package/examples/jsm/helpers/ViewHelper.js +43 -5
  37. package/examples/jsm/inspector/Inspector.js +427 -0
  38. package/examples/jsm/inspector/RendererInspector.js +415 -0
  39. package/examples/jsm/inspector/tabs/Console.js +204 -0
  40. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  41. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  42. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  43. package/examples/jsm/inspector/ui/Graph.js +95 -0
  44. package/examples/jsm/inspector/ui/Item.js +170 -0
  45. package/examples/jsm/inspector/ui/List.js +75 -0
  46. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  47. package/examples/jsm/inspector/ui/Style.js +654 -0
  48. package/examples/jsm/inspector/ui/Tab.js +46 -0
  49. package/examples/jsm/inspector/ui/Values.js +423 -0
  50. package/examples/jsm/inspector/ui/utils.js +56 -0
  51. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  52. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  53. package/examples/jsm/interactive/SelectionBox.js +30 -0
  54. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  55. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  56. package/examples/jsm/lines/Line2.js +3 -3
  57. package/examples/jsm/lines/LineGeometry.js +1 -1
  58. package/examples/jsm/lines/LineSegments2.js +2 -2
  59. package/examples/jsm/lines/Wireframe.js +2 -2
  60. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  61. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  62. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  63. package/examples/jsm/loaders/3MFLoader.js +1 -1
  64. package/examples/jsm/loaders/ColladaLoader.js +3 -3
  65. package/examples/jsm/loaders/DDSLoader.js +1 -1
  66. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  67. package/examples/jsm/loaders/EXRLoader.js +5 -5
  68. package/examples/jsm/loaders/FBXLoader.js +2 -2
  69. package/examples/jsm/loaders/FontLoader.js +23 -5
  70. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  71. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  72. package/examples/jsm/loaders/HDRLoader.js +486 -0
  73. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  74. package/examples/jsm/loaders/KTXLoader.js +2 -2
  75. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  76. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  77. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  78. package/examples/jsm/loaders/LWOLoader.js +2 -2
  79. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  80. package/examples/jsm/loaders/OBJLoader.js +1 -1
  81. package/examples/jsm/loaders/PDBLoader.js +1 -1
  82. package/examples/jsm/loaders/RGBELoader.js +7 -473
  83. package/examples/jsm/loaders/SVGLoader.js +2 -2
  84. package/examples/jsm/loaders/TTFLoader.js +4 -4
  85. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  86. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  87. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  88. package/examples/jsm/math/ColorSpaces.js +19 -1
  89. package/examples/jsm/math/ConvexHull.js +3 -3
  90. package/examples/jsm/math/ImprovedNoise.js +1 -1
  91. package/examples/jsm/math/Lut.js +2 -2
  92. package/examples/jsm/math/SimplexNoise.js +1 -1
  93. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  94. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  95. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  96. package/examples/jsm/misc/TubePainter.js +383 -40
  97. package/examples/jsm/misc/Volume.js +1 -1
  98. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  99. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  100. package/examples/jsm/objects/Sky.js +1 -1
  101. package/examples/jsm/objects/SkyMesh.js +1 -1
  102. package/examples/jsm/objects/Water.js +3 -3
  103. package/examples/jsm/objects/WaterMesh.js +6 -6
  104. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  105. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  106. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  107. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  108. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  109. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  110. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  111. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  112. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  113. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  114. package/examples/jsm/shaders/BokehShader.js +1 -1
  115. package/examples/jsm/shaders/BokehShader2.js +1 -1
  116. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  117. package/examples/jsm/shaders/FocusShader.js +1 -1
  118. package/examples/jsm/shaders/GTAOShader.js +2 -2
  119. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  120. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  122. package/examples/jsm/shaders/SSRShader.js +1 -1
  123. package/examples/jsm/shaders/SepiaShader.js +1 -1
  124. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  125. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  126. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
  127. package/examples/jsm/shaders/VignetteShader.js +1 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
  129. package/examples/jsm/transpiler/TSLEncoder.js +9 -10
  130. package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
  131. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  132. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  133. package/examples/jsm/tsl/display/BloomNode.js +7 -3
  134. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
  135. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  136. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  137. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  138. package/examples/jsm/tsl/display/GaussianBlurNode.js +49 -35
  139. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  140. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  141. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  142. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  143. package/examples/jsm/tsl/display/TRAANode.js +124 -7
  144. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  145. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  146. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  147. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  148. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  149. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  150. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  151. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  152. package/package.json +5 -10
  153. package/src/Three.Core.js +4 -2
  154. package/src/Three.TSL.js +36 -5
  155. package/src/Three.WebGPU.Nodes.js +2 -0
  156. package/src/Three.WebGPU.js +2 -0
  157. package/src/animation/AnimationClip.js +20 -4
  158. package/src/animation/AnimationMixer.js +3 -3
  159. package/src/animation/AnimationObjectGroup.js +2 -1
  160. package/src/animation/KeyframeTrack.js +7 -6
  161. package/src/animation/PropertyBinding.js +12 -11
  162. package/src/audio/Audio.js +10 -9
  163. package/src/audio/PositionalAudio.js +1 -1
  164. package/src/cameras/OrthographicCamera.js +1 -1
  165. package/src/cameras/PerspectiveCamera.js +1 -1
  166. package/src/cameras/StereoCamera.js +2 -2
  167. package/src/constants.js +11 -3
  168. package/src/core/BufferGeometry.js +10 -10
  169. package/src/core/EventDispatcher.js +1 -1
  170. package/src/core/InterleavedBuffer.js +1 -1
  171. package/src/core/InterleavedBufferAttribute.js +3 -2
  172. package/src/core/Object3D.js +3 -2
  173. package/src/core/Raycaster.js +2 -1
  174. package/src/core/RenderTarget.js +10 -1
  175. package/src/extras/Controls.js +5 -4
  176. package/src/extras/DataUtils.js +2 -1
  177. package/src/extras/Earcut.js +6 -0
  178. package/src/extras/ImageUtils.js +2 -2
  179. package/src/extras/PMREMGenerator.js +268 -55
  180. package/src/extras/TextureUtils.js +2 -1
  181. package/src/extras/core/Curve.js +2 -1
  182. package/src/extras/core/Interpolations.js +7 -1
  183. package/src/extras/core/ShapePath.js +4 -4
  184. package/src/extras/lib/earcut.js +8 -8
  185. package/src/geometries/BoxGeometry.js +1 -0
  186. package/src/geometries/CapsuleGeometry.js +1 -0
  187. package/src/geometries/CircleGeometry.js +1 -0
  188. package/src/geometries/ConeGeometry.js +1 -0
  189. package/src/geometries/CylinderGeometry.js +1 -0
  190. package/src/geometries/DodecahedronGeometry.js +1 -0
  191. package/src/geometries/ExtrudeGeometry.js +8 -6
  192. package/src/geometries/IcosahedronGeometry.js +1 -0
  193. package/src/geometries/LatheGeometry.js +1 -0
  194. package/src/geometries/OctahedronGeometry.js +1 -0
  195. package/src/geometries/PlaneGeometry.js +1 -0
  196. package/src/geometries/RingGeometry.js +1 -0
  197. package/src/geometries/ShapeGeometry.js +1 -0
  198. package/src/geometries/SphereGeometry.js +1 -0
  199. package/src/geometries/TetrahedronGeometry.js +1 -0
  200. package/src/geometries/TorusGeometry.js +1 -0
  201. package/src/geometries/TorusKnotGeometry.js +1 -0
  202. package/src/geometries/TubeGeometry.js +1 -0
  203. package/src/helpers/CameraHelper.js +1 -1
  204. package/src/lights/webgpu/ProjectorLight.js +1 -1
  205. package/src/loaders/AnimationLoader.js +2 -1
  206. package/src/loaders/AudioLoader.js +2 -1
  207. package/src/loaders/BufferGeometryLoader.js +2 -2
  208. package/src/loaders/Cache.js +2 -2
  209. package/src/loaders/DataTextureLoader.js +1 -1
  210. package/src/loaders/FileLoader.js +3 -2
  211. package/src/loaders/ImageBitmapLoader.js +5 -4
  212. package/src/loaders/ImageLoader.js +1 -1
  213. package/src/loaders/Loader.js +3 -3
  214. package/src/loaders/LoadingManager.js +25 -3
  215. package/src/loaders/MaterialLoader.js +3 -2
  216. package/src/loaders/ObjectLoader.js +13 -13
  217. package/src/loaders/TextureLoader.js +1 -1
  218. package/src/loaders/nodes/NodeLoader.js +3 -2
  219. package/src/materials/Material.js +16 -3
  220. package/src/materials/MeshBasicMaterial.js +1 -0
  221. package/src/materials/MeshDepthMaterial.js +1 -0
  222. package/src/materials/MeshDistanceMaterial.js +1 -1
  223. package/src/materials/MeshLambertMaterial.js +2 -1
  224. package/src/materials/MeshMatcapMaterial.js +22 -0
  225. package/src/materials/MeshNormalMaterial.js +1 -0
  226. package/src/materials/MeshPhongMaterial.js +2 -1
  227. package/src/materials/MeshPhysicalMaterial.js +2 -1
  228. package/src/materials/MeshStandardMaterial.js +8 -7
  229. package/src/materials/MeshToonMaterial.js +1 -0
  230. package/src/materials/PointsMaterial.js +1 -1
  231. package/src/materials/ShaderMaterial.js +2 -2
  232. package/src/materials/nodes/Line2NodeMaterial.js +2 -2
  233. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  234. package/src/materials/nodes/NodeMaterial.js +62 -22
  235. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  236. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  237. package/src/materials/nodes/manager/NodeMaterialObserver.js +3 -2
  238. package/src/math/Color.js +6 -5
  239. package/src/math/ColorManagement.js +9 -3
  240. package/src/math/Cylindrical.js +1 -1
  241. package/src/math/Euler.js +2 -1
  242. package/src/math/MathUtils.js +13 -11
  243. package/src/math/Matrix2.js +1 -1
  244. package/src/math/Matrix3.js +2 -2
  245. package/src/math/Matrix4.js +7 -7
  246. package/src/math/Plane.js +1 -1
  247. package/src/math/Quaternion.js +68 -66
  248. package/src/math/Spherical.js +1 -1
  249. package/src/nodes/Nodes.js +4 -1
  250. package/src/nodes/TSL.js +4 -1
  251. package/src/nodes/accessors/BufferNode.js +1 -1
  252. package/src/nodes/accessors/Camera.js +133 -7
  253. package/src/nodes/accessors/ClippingNode.js +6 -5
  254. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  255. package/src/nodes/accessors/InstanceNode.js +25 -5
  256. package/src/nodes/accessors/Lights.js +10 -0
  257. package/src/nodes/accessors/Normal.js +5 -4
  258. package/src/nodes/accessors/Object3DNode.js +1 -1
  259. package/src/nodes/accessors/Position.js +18 -2
  260. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  261. package/src/nodes/accessors/ReferenceNode.js +3 -2
  262. package/src/nodes/accessors/SceneNode.js +2 -1
  263. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  264. package/src/nodes/accessors/StorageTextureNode.js +22 -0
  265. package/src/nodes/accessors/Texture3DNode.js +14 -1
  266. package/src/nodes/accessors/TextureNode.js +130 -44
  267. package/src/nodes/code/FunctionCallNode.js +24 -4
  268. package/src/nodes/code/FunctionNode.js +23 -0
  269. package/src/nodes/core/ArrayNode.js +1 -0
  270. package/src/nodes/core/AssignNode.js +4 -3
  271. package/src/nodes/core/AttributeNode.js +2 -1
  272. package/src/nodes/core/ContextNode.js +29 -10
  273. package/src/nodes/core/IndexNode.js +2 -2
  274. package/src/nodes/core/InputNode.js +2 -1
  275. package/src/nodes/core/InspectorNode.js +128 -0
  276. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
  277. package/src/nodes/core/Node.js +152 -31
  278. package/src/nodes/core/NodeBuilder.js +183 -35
  279. package/src/nodes/core/NodeFrame.js +21 -21
  280. package/src/nodes/core/NodeFunction.js +2 -1
  281. package/src/nodes/core/NodeParser.js +2 -1
  282. package/src/nodes/core/NodeUniform.js +1 -1
  283. package/src/nodes/core/NodeUtils.js +17 -91
  284. package/src/nodes/core/ParameterNode.js +31 -0
  285. package/src/nodes/core/PropertyNode.js +7 -0
  286. package/src/nodes/core/StackNode.js +43 -16
  287. package/src/nodes/core/StructNode.js +5 -5
  288. package/src/nodes/core/StructTypeNode.js +1 -0
  289. package/src/nodes/core/SubBuildNode.js +2 -2
  290. package/src/nodes/core/UniformNode.js +18 -10
  291. package/src/nodes/core/VarNode.js +70 -33
  292. package/src/nodes/core/VaryingNode.js +3 -2
  293. package/src/nodes/display/BlendModes.js +5 -4
  294. package/src/nodes/display/BumpMapNode.js +1 -1
  295. package/src/nodes/display/ColorAdjustment.js +1 -1
  296. package/src/nodes/display/FrontFacingNode.js +4 -8
  297. package/src/nodes/display/NormalMapNode.js +2 -1
  298. package/src/nodes/display/PassNode.js +52 -11
  299. package/src/nodes/display/RenderOutputNode.js +28 -2
  300. package/src/nodes/display/ScreenNode.js +44 -14
  301. package/src/nodes/display/ToneMappingNode.js +31 -4
  302. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  303. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  304. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  305. package/src/nodes/display/ViewportTextureNode.js +42 -12
  306. package/src/nodes/fog/Fog.js +3 -2
  307. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  308. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  309. package/src/nodes/functions/BasicLightingModel.js +2 -1
  310. package/src/nodes/functions/PhysicalLightingModel.js +3 -2
  311. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  312. package/src/nodes/geometry/RangeNode.js +40 -4
  313. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  314. package/src/nodes/gpgpu/ComputeNode.js +17 -5
  315. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  316. package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
  317. package/src/nodes/lighting/EnvironmentNode.js +6 -6
  318. package/src/nodes/lighting/LightsNode.js +3 -4
  319. package/src/nodes/lighting/PointShadowNode.js +6 -0
  320. package/src/nodes/lighting/ShadowFilterNode.js +2 -0
  321. package/src/nodes/lighting/ShadowNode.js +75 -8
  322. package/src/nodes/math/BitcastNode.js +156 -0
  323. package/src/nodes/math/ConditionalNode.js +24 -7
  324. package/src/nodes/math/MathNode.js +25 -19
  325. package/src/nodes/math/OperatorNode.js +7 -5
  326. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  327. package/src/nodes/shapes/Shapes.js +1 -1
  328. package/src/nodes/tsl/TSLBase.js +5 -2
  329. package/src/nodes/tsl/TSLCore.js +460 -159
  330. package/src/nodes/utils/DebugNode.js +2 -1
  331. package/src/nodes/utils/EventNode.js +36 -0
  332. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  333. package/src/nodes/utils/JoinNode.js +6 -3
  334. package/src/nodes/utils/LoopNode.js +20 -24
  335. package/src/nodes/utils/MemberNode.js +59 -7
  336. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  337. package/src/nodes/utils/RTTNode.js +13 -3
  338. package/src/nodes/utils/ReflectorNode.js +58 -7
  339. package/src/nodes/utils/SampleNode.js +12 -2
  340. package/src/nodes/utils/SplitNode.js +11 -0
  341. package/src/nodes/utils/Timer.js +0 -47
  342. package/src/objects/BatchedMesh.js +2 -2
  343. package/src/objects/LOD.js +1 -1
  344. package/src/objects/Line.js +2 -1
  345. package/src/objects/LineSegments.js +2 -1
  346. package/src/objects/Skeleton.js +3 -2
  347. package/src/objects/SkinnedMesh.js +3 -1
  348. package/src/objects/Sprite.js +4 -3
  349. package/src/renderers/WebGLRenderer.js +48 -41
  350. package/src/renderers/common/Animation.js +13 -1
  351. package/src/renderers/common/Attributes.js +1 -1
  352. package/src/renderers/common/Backend.js +108 -27
  353. package/src/renderers/common/Background.js +2 -1
  354. package/src/renderers/common/Bindings.js +58 -2
  355. package/src/renderers/common/CanvasTarget.js +341 -0
  356. package/src/renderers/common/ChainMap.js +1 -1
  357. package/src/renderers/common/DataMap.js +1 -1
  358. package/src/renderers/common/Geometries.js +26 -0
  359. package/src/renderers/common/Info.js +4 -2
  360. package/src/renderers/common/InspectorBase.js +146 -0
  361. package/src/renderers/common/Pipelines.js +1 -1
  362. package/src/renderers/common/PostProcessing.js +6 -25
  363. package/src/renderers/common/QuadMesh.js +7 -1
  364. package/src/renderers/common/RenderContext.js +2 -2
  365. package/src/renderers/common/RenderList.js +7 -3
  366. package/src/renderers/common/RenderObject.js +16 -2
  367. package/src/renderers/common/RenderObjects.js +1 -1
  368. package/src/renderers/common/Renderer.js +473 -245
  369. package/src/renderers/common/RendererUtils.js +9 -0
  370. package/src/renderers/common/SampledTexture.js +9 -1
  371. package/src/renderers/common/Sampler.js +50 -12
  372. package/src/renderers/common/StorageTexture.js +9 -1
  373. package/src/renderers/common/Textures.js +121 -45
  374. package/src/renderers/common/TimestampQueryPool.js +65 -3
  375. package/src/renderers/common/UniformsGroup.js +2 -1
  376. package/src/renderers/common/XRManager.js +42 -22
  377. package/src/renderers/common/extras/PMREMGenerator.js +160 -65
  378. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  379. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  380. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  381. package/src/renderers/common/nodes/Nodes.js +38 -16
  382. package/src/renderers/shaders/DFGLUTData.js +64 -0
  383. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  384. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  386. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  387. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  388. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  389. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  390. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  391. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
  392. package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
  393. package/src/renderers/shaders/UniformsLib.js +1 -0
  394. package/src/renderers/shaders/UniformsUtils.js +25 -4
  395. package/src/renderers/webgl/WebGLCapabilities.js +2 -1
  396. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  397. package/src/renderers/webgl/WebGLInfo.js +3 -1
  398. package/src/renderers/webgl/WebGLProgram.js +15 -14
  399. package/src/renderers/webgl/WebGLPrograms.js +2 -1
  400. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  401. package/src/renderers/webgl/WebGLState.js +15 -14
  402. package/src/renderers/webgl/WebGLTextures.js +19 -14
  403. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  404. package/src/renderers/webgl/WebGLUtils.js +3 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +199 -167
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +181 -25
  407. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  408. package/src/renderers/webgl-fallback/utils/WebGLState.js +7 -6
  409. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +169 -19
  410. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  411. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  412. package/src/renderers/webgpu/WebGPUBackend.js +153 -123
  413. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  414. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  415. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +142 -50
  416. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  417. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
  418. package/src/renderers/webgpu/utils/WebGPUConstants.js +7 -2
  419. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +53 -34
  420. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  421. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +260 -99
  422. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  423. package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
  424. package/src/renderers/webxr/WebXRManager.js +42 -26
  425. package/src/textures/ExternalTexture.js +15 -4
  426. package/src/textures/Source.js +3 -2
  427. package/src/textures/Texture.js +3 -2
  428. package/src/textures/VideoTexture.js +2 -3
  429. package/src/utils.js +67 -3
  430. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
@@ -1,7 +1,7 @@
1
1
  import ShadowBaseNode, { shadowPositionWorld } from './ShadowBaseNode.js';
2
2
  import { float, vec2, vec3, int, Fn, nodeObject } from '../tsl/TSLBase.js';
3
3
  import { reference } from '../accessors/ReferenceNode.js';
4
- import { texture } from '../accessors/TextureNode.js';
4
+ import { texture, textureLoad } from '../accessors/TextureNode.js';
5
5
  import { normalWorld } from '../accessors/Normal.js';
6
6
  import { mix, sqrt } from '../math/MathNode.js';
7
7
  import { add } from '../math/OperatorNode.js';
@@ -18,6 +18,9 @@ import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../
18
18
  import { getDataFromObject } from '../core/NodeUtils.js';
19
19
  import { getShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
20
20
  import ChainMap from '../../renderers/common/ChainMap.js';
21
+ import { warn } from '../../utils.js';
22
+ import { textureSize } from '../accessors/TextureSizeNode.js';
23
+ import { uv } from '../accessors/UV.js';
21
24
 
22
25
  //
23
26
 
@@ -27,6 +30,8 @@ const _shadowRenderObjectKeys = [];
27
30
  /**
28
31
  * Creates a function to render shadow objects in a scene.
29
32
  *
33
+ * @tsl
34
+ * @function
30
35
  * @param {Renderer} renderer - The renderer.
31
36
  * @param {LightShadow} shadow - The light shadow object containing shadow properties.
32
37
  * @param {number} shadowType - The type of shadow map (e.g., BasicShadowMap).
@@ -268,6 +273,22 @@ class ShadowNode extends ShadowBaseNode {
268
273
  */
269
274
  this._node = null;
270
275
 
276
+ /**
277
+ * The current shadow map type of this shadow node.
278
+ *
279
+ * @type {?number}
280
+ * @private
281
+ * @default null
282
+ */
283
+ this._currentShadowType = null;
284
+
285
+ /**
286
+ * A Weak Map holding the current frame ID per camera. Used
287
+ * to control the update of shadow maps.
288
+ *
289
+ * @type {WeakMap<Camera,number>}
290
+ * @private
291
+ */
271
292
  this._cameraFrameId = new WeakMap();
272
293
 
273
294
  /**
@@ -405,7 +426,7 @@ class ShadowNode extends ShadowBaseNode {
405
426
  */
406
427
  setupShadow( builder ) {
407
428
 
408
- const { renderer } = builder;
429
+ const { renderer, camera } = builder;
409
430
 
410
431
  const { light, shadow } = this;
411
432
 
@@ -413,6 +434,7 @@ class ShadowNode extends ShadowBaseNode {
413
434
 
414
435
  const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder );
415
436
 
437
+ shadow.camera.coordinateSystem = camera.coordinateSystem;
416
438
  shadow.camera.updateProjectionMatrix();
417
439
 
418
440
  // VSM
@@ -514,7 +536,19 @@ class ShadowNode extends ShadowBaseNode {
514
536
  this.shadowMap = shadowMap;
515
537
  this.shadow.map = shadowMap;
516
538
 
517
- return shadowOutput;
539
+ // Shadow Output + Inspector
540
+
541
+ const inspectName = `${ this.light.type } Shadow [ ${ this.light.name || 'ID: ' + this.light.id } ]`;
542
+
543
+ return shadowOutput.toInspector( `${ inspectName } / Color`, () => {
544
+
545
+ return texture( this.shadowMap.texture );
546
+
547
+ } ).toInspector( `${ inspectName } / Depth`, () => {
548
+
549
+ return textureLoad( this.shadowMap.depthTexture, uv().mul( textureSize( texture( this.shadowMap.depthTexture ) ) ) ).x.oneMinus();
550
+
551
+ } );
518
552
 
519
553
  }
520
554
 
@@ -531,6 +565,15 @@ class ShadowNode extends ShadowBaseNode {
531
565
 
532
566
  return Fn( () => {
533
567
 
568
+ const currentShadowType = builder.renderer.shadowMap.type;
569
+
570
+ if ( this._currentShadowType !== currentShadowType ) {
571
+
572
+ this._reset();
573
+ this._node = null;
574
+
575
+ }
576
+
534
577
  let node = this._node;
535
578
 
536
579
  this.setupShadowPosition( builder );
@@ -538,12 +581,13 @@ class ShadowNode extends ShadowBaseNode {
538
581
  if ( node === null ) {
539
582
 
540
583
  this._node = node = this.setupShadow( builder );
584
+ this._currentShadowType = currentShadowType;
541
585
 
542
586
  }
543
587
 
544
588
  if ( builder.material.shadowNode ) { // @deprecated, r171
545
589
 
546
- console.warn( 'THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.' );
590
+ warn( 'NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.' );
547
591
 
548
592
  }
549
593
 
@@ -576,8 +620,14 @@ class ShadowNode extends ShadowBaseNode {
576
620
 
577
621
  shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height, shadowMap.depth );
578
622
 
623
+ const currentSceneName = scene.name;
624
+
625
+ scene.name = `Shadow Map [ ${ light.name || 'ID: ' + light.id } ]`;
626
+
579
627
  renderer.render( scene, shadow.camera );
580
628
 
629
+ scene.name = currentSceneName;
630
+
581
631
  }
582
632
 
583
633
  /**
@@ -664,8 +714,27 @@ class ShadowNode extends ShadowBaseNode {
664
714
  */
665
715
  dispose() {
666
716
 
667
- this.shadowMap.dispose();
668
- this.shadowMap = null;
717
+ this._reset();
718
+
719
+ super.dispose();
720
+
721
+ }
722
+
723
+ /**
724
+ * Resets the resouce state of this shadow node.
725
+ *
726
+ * @private
727
+ */
728
+ _reset() {
729
+
730
+ this._currentShadowType = null;
731
+
732
+ if ( this.shadowMap ) {
733
+
734
+ this.shadowMap.dispose();
735
+ this.shadowMap = null;
736
+
737
+ }
669
738
 
670
739
  if ( this.vsmShadowMapVertical !== null ) {
671
740
 
@@ -687,8 +756,6 @@ class ShadowNode extends ShadowBaseNode {
687
756
 
688
757
  }
689
758
 
690
- super.dispose();
691
-
692
759
  }
693
760
 
694
761
  /**
@@ -0,0 +1,156 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { nodeProxyIntent } from '../tsl/TSLCore.js';
3
+ /**
4
+ * This node represents an operation that reinterprets the bit representation of a value
5
+ * in one type as a value in another type.
6
+ *
7
+ * @augments TempNode
8
+ */
9
+ class BitcastNode extends TempNode {
10
+
11
+ static get type() {
12
+
13
+ return 'BitcastNode';
14
+
15
+ }
16
+
17
+ /**
18
+ * Constructs a new bitcast node.
19
+ *
20
+ * @param {Node} valueNode - The value to convert.
21
+ * @param {string} conversionType - The type to convert to.
22
+ * @param {?string} [inputType = null] - The expected input data type of the bitcast operation.
23
+ */
24
+ constructor( valueNode, conversionType, inputType = null ) {
25
+
26
+ super();
27
+
28
+ /**
29
+ * The data to bitcast to a new type.
30
+ *
31
+ * @type {Node}
32
+ */
33
+ this.valueNode = valueNode;
34
+
35
+ /**
36
+ * The type the value will be converted to.
37
+ *
38
+ * @type {string}
39
+ */
40
+ this.conversionType = conversionType;
41
+
42
+
43
+ /**
44
+ * The expected input data type of the bitcast operation.
45
+ *
46
+ *
47
+ * @type {string}
48
+ * @default null
49
+ */
50
+ this.inputType = inputType;
51
+
52
+ /**
53
+ * This flag can be used for type testing.
54
+ *
55
+ * @type {boolean}
56
+ * @readonly
57
+ * @default true
58
+ */
59
+ this.isBitcastNode = true;
60
+
61
+ }
62
+
63
+ getNodeType( builder ) {
64
+
65
+ // GLSL aliasing
66
+ if ( this.inputType !== null ) {
67
+
68
+ const valueType = this.valueNode.getNodeType( builder );
69
+ const valueLength = builder.getTypeLength( valueType );
70
+
71
+ return builder.getTypeFromLength( valueLength, this.conversionType );
72
+
73
+ }
74
+
75
+ return this.conversionType;
76
+
77
+ }
78
+
79
+
80
+ generate( builder ) {
81
+
82
+ const type = this.getNodeType( builder );
83
+ let inputType = '';
84
+
85
+ if ( this.inputType !== null ) {
86
+
87
+ const valueType = this.valueNode.getNodeType( builder );
88
+ const valueTypeLength = builder.getTypeLength( valueType );
89
+
90
+ inputType = valueTypeLength === 1 ? this.inputType : builder.changeComponentType( valueType, this.inputType );
91
+
92
+ } else {
93
+
94
+ inputType = this.valueNode.getNodeType( builder );
95
+
96
+ }
97
+
98
+ return `${ builder.getBitcastMethod( type, inputType ) }( ${ this.valueNode.build( builder, inputType ) } )`;
99
+
100
+
101
+ }
102
+
103
+ }
104
+
105
+ export default BitcastNode;
106
+
107
+ /**
108
+ * Reinterpret the bit representation of a value in one type as a value in another type.
109
+ *
110
+ * @tsl
111
+ * @function
112
+ * @param {Node | number} x - The parameter.
113
+ * @param {string} y - The new type.
114
+ * @returns {Node}
115
+ */
116
+ export const bitcast = /*@__PURE__*/ nodeProxyIntent( BitcastNode ).setParameterLength( 2 );
117
+
118
+ /**
119
+ * Bitcasts a float or a vector of floats to a corresponding integer type with the same element size.
120
+ *
121
+ * @tsl
122
+ * @function
123
+ * @param {Node<float>} value - The float or vector of floats to bitcast.
124
+ * @returns {BitcastNode}
125
+ */
126
+ export const floatBitsToInt = ( value ) => new BitcastNode( value, 'int', 'float' );
127
+
128
+ /**
129
+ * Bitcasts a float or a vector of floats to a corresponding unsigned integer type with the same element size.
130
+ *
131
+ * @tsl
132
+ * @function
133
+ * @param {Node<float>} value - The float or vector of floats to bitcast.
134
+ * @returns {BitcastNode}
135
+ */
136
+ export const floatBitsToUint = ( value ) => new BitcastNode( value, 'uint', 'float' );
137
+
138
+ /**
139
+ * Bitcasts an integer or a vector of integers to a corresponding float type with the same element size.
140
+ *
141
+ * @tsl
142
+ * @function
143
+ * @param {Node<int>} value - The integer or vector of integers to bitcast.
144
+ * @returns {BitcastNode}
145
+ */
146
+ export const intBitsToFloat = ( value ) => new BitcastNode( value, 'float', 'int' );
147
+
148
+ /**
149
+ * Bitcast an unsigned integer or a vector of unsigned integers to a corresponding float type with the same element size.
150
+ *
151
+ * @tsl
152
+ * @function
153
+ * @param {Node<uint>} value - The unsigned integer or vector of unsigned integers to bitcast.
154
+ * @returns {BitcastNode}
155
+ */
156
+ export const uintBitsToFloat = ( value ) => new BitcastNode( value, 'float', 'uint' );
@@ -1,6 +1,7 @@
1
1
  import Node from '../core/Node.js';
2
2
  import { property } from '../core/PropertyNode.js';
3
3
  import { addMethodChaining, nodeProxy } from '../tsl/TSLCore.js';
4
+ import { warn } from '../../utils.js';
4
5
 
5
6
  /**
6
7
  * Represents a logical `if/else` statement. Can be used as an alternative
@@ -99,9 +100,9 @@ class ConditionalNode extends Node {
99
100
 
100
101
  setup( builder ) {
101
102
 
102
- const condNode = this.condNode.cache();
103
- const ifNode = this.ifNode.cache();
104
- const elseNode = this.elseNode ? this.elseNode.cache() : null;
103
+ const condNode = this.condNode;
104
+ const ifNode = this.ifNode.isolate();
105
+ const elseNode = this.elseNode ? this.elseNode.isolate() : null;
105
106
 
106
107
  //
107
108
 
@@ -112,10 +113,12 @@ class ConditionalNode extends Node {
112
113
 
113
114
  //
114
115
 
116
+ const isUniformFlow = builder.context.uniformFlow;
117
+
115
118
  const properties = builder.getNodeProperties( this );
116
119
  properties.condNode = condNode;
117
- properties.ifNode = ifNode.context( { nodeBlock: ifNode } );
118
- properties.elseNode = elseNode ? elseNode.context( { nodeBlock: elseNode } ) : null;
120
+ properties.ifNode = isUniformFlow ? ifNode : ifNode.context( { nodeBlock: ifNode } );
121
+ properties.elseNode = elseNode ? ( isUniformFlow ? elseNode : elseNode.context( { nodeBlock: elseNode } ) ) : null;
119
122
 
120
123
  }
121
124
 
@@ -140,6 +143,20 @@ class ConditionalNode extends Node {
140
143
  nodeData.nodeProperty = nodeProperty;
141
144
 
142
145
  const nodeSnippet = condNode.build( builder, 'bool' );
146
+ const isUniformFlow = builder.context.uniformFlow;
147
+
148
+ if ( isUniformFlow && elseNode !== null ) {
149
+
150
+ const ifSnippet = ifNode.build( builder, type );
151
+ const elseSnippet = elseNode.build( builder, type );
152
+
153
+ const mathSnippet = builder.getTernary( nodeSnippet, ifSnippet, elseSnippet );
154
+
155
+ // TODO: If node property already exists return something else
156
+
157
+ return builder.format( mathSnippet, type, output );
158
+
159
+ }
143
160
 
144
161
  builder.addFlowCode( `\n${ builder.tab }if ( ${ nodeSnippet } ) {\n\n` ).addFlowTab();
145
162
 
@@ -157,7 +174,7 @@ class ConditionalNode extends Node {
157
174
 
158
175
  if ( functionNode === null ) {
159
176
 
160
- console.warn( 'THREE.TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.' );
177
+ warn( 'TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.' );
161
178
 
162
179
  ifSnippet = '// ' + ifSnippet;
163
180
 
@@ -187,7 +204,7 @@ class ConditionalNode extends Node {
187
204
 
188
205
  if ( functionNode === null ) {
189
206
 
190
- console.warn( 'THREE.TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.' );
207
+ warn( 'TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.' );
191
208
 
192
209
  elseSnippet = '// ' + elseSnippet;
193
210
 
@@ -2,6 +2,7 @@ import TempNode from '../core/TempNode.js';
2
2
  import { sub, mul, div, mod, equal } from './OperatorNode.js';
3
3
  import { addMethodChaining, nodeObject, nodeProxyIntent, float, vec2, vec3, vec4, Fn } from '../tsl/TSLCore.js';
4
4
  import { WebGLCoordinateSystem, WebGPUCoordinateSystem } from '../../constants.js';
5
+ import { warn } from '../../utils.js';
5
6
 
6
7
  /**
7
8
  * This node represents a variety of mathematical methods available in shaders.
@@ -290,7 +291,7 @@ class MathNode extends TempNode {
290
291
 
291
292
  if ( builder.shaderStage !== 'fragment' && ( method === MathNode.DFDX || method === MathNode.DFDY ) ) {
292
293
 
293
- console.warn( `THREE.TSL: '${ method }' is not supported in the ${ builder.shaderStage } stage.` );
294
+ warn( `TSL: '${ method }' is not supported in the ${ builder.shaderStage } stage.` );
294
295
 
295
296
  method = '/*' + method + '*/';
296
297
 
@@ -366,7 +367,6 @@ MathNode.INVERSE = 'inverse';
366
367
 
367
368
  // 2 inputs
368
369
 
369
- MathNode.BITCAST = 'bitcast';
370
370
  MathNode.EQUALS = 'equals';
371
371
  MathNode.MIN = 'min';
372
372
  MathNode.MAX = 'max';
@@ -415,13 +415,30 @@ export const INFINITY = /*@__PURE__*/ float( 1e6 );
415
415
  */
416
416
  export const PI = /*@__PURE__*/ float( Math.PI );
417
417
 
418
+ /**
419
+ * Represents PI * 2. Please use the non-deprecated version `TWO_PI`.
420
+ *
421
+ * @tsl
422
+ * @deprecated
423
+ * @type {Node<float>}
424
+ */
425
+ export const PI2 = /*@__PURE__*/ float( Math.PI * 2 ); // @deprecated r181
426
+
418
427
  /**
419
428
  * Represents PI * 2.
420
429
  *
421
430
  * @tsl
422
431
  * @type {Node<float>}
423
432
  */
424
- export const PI2 = /*@__PURE__*/ float( Math.PI * 2 );
433
+ export const TWO_PI = /*@__PURE__*/ float( Math.PI * 2 );
434
+
435
+ /**
436
+ * Represents PI / 2.
437
+ *
438
+ * @tsl
439
+ * @type {Node<float>}
440
+ */
441
+ export const HALF_PI = /*@__PURE__*/ float( Math.PI * 0.5 );
425
442
 
426
443
  /**
427
444
  * Returns `true` if all components of `x` are `true`.
@@ -767,17 +784,6 @@ export const inverse = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.INVERSE
767
784
 
768
785
  // 2 inputs
769
786
 
770
- /**
771
- * Reinterpret the bit representation of a value in one type as a value in another type.
772
- *
773
- * @tsl
774
- * @function
775
- * @param {Node | number} x - The parameter.
776
- * @param {string} y - The new type.
777
- * @returns {Node}
778
- */
779
- export const bitcast = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.BITCAST ).setParameterLength( 2 );
780
-
781
787
  /**
782
788
  * Returns `true` if `x` equals `y`.
783
789
  *
@@ -790,7 +796,7 @@ export const bitcast = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.BITCAST
790
796
  */
791
797
  export const equals = ( x, y ) => { // @deprecated, r172
792
798
 
793
- console.warn( 'THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"' );
799
+ warn( 'TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"' );
794
800
  return equal( x, y );
795
801
 
796
802
  };
@@ -900,7 +906,7 @@ export const pow = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW ).setPa
900
906
  * @param {Node | number} x - The first parameter.
901
907
  * @returns {Node}
902
908
  */
903
- export const pow2 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW, 2 ).setParameterLength( 1 );
909
+ export const pow2 = ( x ) => mul( x, x );
904
910
 
905
911
  /**
906
912
  * Returns the cube of the parameter.
@@ -910,7 +916,7 @@ export const pow2 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW, 2 ).s
910
916
  * @param {Node | number} x - The first parameter.
911
917
  * @returns {Node}
912
918
  */
913
- export const pow3 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW, 3 ).setParameterLength( 1 );
919
+ export const pow3 = ( x ) => mul( x, x, x );
914
920
 
915
921
  /**
916
922
  * Returns the fourth power of the parameter.
@@ -920,7 +926,7 @@ export const pow3 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW, 3 ).s
920
926
  * @param {Node | number} x - The first parameter.
921
927
  * @returns {Node}
922
928
  */
923
- export const pow4 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW, 4 ).setParameterLength( 1 );
929
+ export const pow4 = ( x ) => mul( x, x, x, x );
924
930
 
925
931
  /**
926
932
  * Transforms the direction of a vector by a matrix and then normalizes the result.
@@ -1088,7 +1094,7 @@ export const stepElement = ( x, edge ) => step( edge, x );
1088
1094
  */
1089
1095
  export const atan2 = ( y, x ) => { // @deprecated, r172
1090
1096
 
1091
- console.warn( 'THREE.TSL: "atan2" is overloaded. Use "atan" instead.' );
1097
+ warn( 'TSL: "atan2" is overloaded. Use "atan" instead.' );
1092
1098
  return atan( y, x );
1093
1099
 
1094
1100
  };
@@ -1,6 +1,7 @@
1
1
  import { WebGLCoordinateSystem } from '../../constants.js';
2
2
  import TempNode from '../core/TempNode.js';
3
3
  import { addMethodChaining, Fn, int, nodeProxyIntent } from '../tsl/TSLCore.js';
4
+ import { warn } from '../../utils.js';
4
5
 
5
6
  const _vectorOperators = {
6
7
  '==': 'equal',
@@ -103,9 +104,10 @@ class OperatorNode extends TempNode {
103
104
  * and the input node types.
104
105
  *
105
106
  * @param {NodeBuilder} builder - The current node builder.
107
+ * @param {?string} [output=null] - The output type.
106
108
  * @return {string} The node type.
107
109
  */
108
- getNodeType( builder ) {
110
+ getNodeType( builder, output = null ) {
109
111
 
110
112
  const op = this.op;
111
113
 
@@ -117,7 +119,7 @@ class OperatorNode extends TempNode {
117
119
 
118
120
  if ( typeA === 'void' || typeB === 'void' ) {
119
121
 
120
- return 'void';
122
+ return output || 'void';
121
123
 
122
124
  } else if ( op === '%' ) {
123
125
 
@@ -193,7 +195,7 @@ class OperatorNode extends TempNode {
193
195
 
194
196
  const { aNode, bNode } = this;
195
197
 
196
- const type = this.getNodeType( builder );
198
+ const type = this.getNodeType( builder, output );
197
199
 
198
200
  let typeA = null;
199
201
  let typeB = null;
@@ -595,7 +597,7 @@ export const bitAnd = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '&' ).setPara
595
597
  * @param {Node} b - The second input.
596
598
  * @returns {OperatorNode}
597
599
  */
598
- export const bitNot = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '~' ).setParameterLength( 2 ).setName( 'bitNot' );
600
+ export const bitNot = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '~' ).setParameterLength( 1 ).setName( 'bitNot' );
599
601
 
600
602
  /**
601
603
  * Performs bitwise OR on two nodes.
@@ -741,7 +743,7 @@ addMethodChaining( 'decrement', decrement );
741
743
  */
742
744
  export const modInt = ( a, b ) => { // @deprecated, r175
743
745
 
744
- console.warn( 'THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.' );
746
+ warn( 'TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.' );
745
747
  return mod( int( a ), int( b ) );
746
748
 
747
749
  };
@@ -1,5 +1,5 @@
1
- import { Fn, int, float, vec2, vec3, vec4, If } from '../tsl/TSLBase.js';
2
- import { cos, sin, abs, max, exp2, log2, clamp, fract, mix, floor, normalize, cross } from '../math/MathNode.js';
1
+ import { Fn, int, uint, float, vec2, vec3, vec4, If } from '../tsl/TSLBase.js';
2
+ import { cos, sin, abs, max, exp2, log2, clamp, fract, mix, floor, normalize, cross, dot, sqrt } from '../math/MathNode.js';
3
3
  import { mul } from '../math/OperatorNode.js';
4
4
  import { select } from '../math/ConditionalNode.js';
5
5
  import { Loop, Break } from '../utils/LoopNode.js';
@@ -286,3 +286,118 @@ export const blur = /*@__PURE__*/ Fn( ( { n, latitudinal, poleAxis, outputDirect
286
286
  return vec4( gl_FragColor, 1 );
287
287
 
288
288
  } );
289
+
290
+ // GGX VNDF importance sampling functions
291
+
292
+ // Van der Corput radical inverse for generating quasi-random sequences
293
+ const radicalInverse_VdC = /*@__PURE__*/ Fn( ( [ bits_immutable ] ) => {
294
+
295
+ const bits = uint( bits_immutable ).toVar();
296
+ bits.assign( bits.shiftLeft( uint( 16 ) ).bitOr( bits.shiftRight( uint( 16 ) ) ) );
297
+ bits.assign( bits.bitAnd( uint( 0x55555555 ) ).shiftLeft( uint( 1 ) ).bitOr( bits.bitAnd( uint( 0xAAAAAAAA ) ).shiftRight( uint( 1 ) ) ) );
298
+ bits.assign( bits.bitAnd( uint( 0x33333333 ) ).shiftLeft( uint( 2 ) ).bitOr( bits.bitAnd( uint( 0xCCCCCCCC ) ).shiftRight( uint( 2 ) ) ) );
299
+ bits.assign( bits.bitAnd( uint( 0x0F0F0F0F ) ).shiftLeft( uint( 4 ) ).bitOr( bits.bitAnd( uint( 0xF0F0F0F0 ) ).shiftRight( uint( 4 ) ) ) );
300
+ bits.assign( bits.bitAnd( uint( 0x00FF00FF ) ).shiftLeft( uint( 8 ) ).bitOr( bits.bitAnd( uint( 0xFF00FF00 ) ).shiftRight( uint( 8 ) ) ) );
301
+ return float( bits ).mul( 2.3283064365386963e-10 ); // / 0x100000000
302
+
303
+ } );
304
+
305
+ // Hammersley sequence for quasi-Monte Carlo sampling
306
+ const hammersley = /*@__PURE__*/ Fn( ( [ i, N ] ) => {
307
+
308
+ return vec2( float( i ).div( float( N ) ), radicalInverse_VdC( i ) );
309
+
310
+ } );
311
+
312
+ // GGX VNDF importance sampling (Eric Heitz 2018)
313
+ // "Sampling the GGX Distribution of Visible Normals"
314
+ // https://jcgt.org/published/0007/04/01/
315
+ const importanceSampleGGX_VNDF = /*@__PURE__*/ Fn( ( [ Xi, V_immutable, roughness_immutable ] ) => {
316
+
317
+ const V = vec3( V_immutable ).toVar();
318
+ const roughness = float( roughness_immutable );
319
+ const alpha = roughness.mul( roughness ).toVar();
320
+
321
+ // Section 3.2: Transform view direction to hemisphere configuration
322
+ const Vh = normalize( vec3( alpha.mul( V.x ), alpha.mul( V.y ), V.z ) ).toVar();
323
+
324
+ // Section 4.1: Orthonormal basis
325
+ const lensq = Vh.x.mul( Vh.x ).add( Vh.y.mul( Vh.y ) );
326
+ const T1 = select( lensq.greaterThan( 0.0 ), vec3( Vh.y.negate(), Vh.x, 0.0 ).div( sqrt( lensq ) ), vec3( 1.0, 0.0, 0.0 ) ).toVar();
327
+ const T2 = cross( Vh, T1 ).toVar();
328
+
329
+ // Section 4.2: Parameterization of projected area
330
+ const r = sqrt( Xi.x );
331
+ const phi = mul( 2.0, 3.14159265359 ).mul( Xi.y );
332
+ const t1 = r.mul( cos( phi ) ).toVar();
333
+ const t2 = r.mul( sin( phi ) ).toVar();
334
+ const s = mul( 0.5, Vh.z.add( 1.0 ) );
335
+ t2.assign( s.oneMinus().mul( sqrt( t1.mul( t1 ).oneMinus() ) ).add( s.mul( t2 ) ) );
336
+
337
+ // Section 4.3: Reprojection onto hemisphere
338
+ const Nh = T1.mul( t1 ).add( T2.mul( t2 ) ).add( Vh.mul( sqrt( max( 0.0, t1.mul( t1 ).add( t2.mul( t2 ) ).oneMinus() ) ) ) );
339
+
340
+ // Section 3.4: Transform back to ellipsoid configuration
341
+ return normalize( vec3( alpha.mul( Nh.x ), alpha.mul( Nh.y ), max( 0.0, Nh.z ) ) );
342
+
343
+ } );
344
+
345
+ // GGX convolution using VNDF importance sampling
346
+ export const ggxConvolution = /*@__PURE__*/ Fn( ( { roughness, mipInt, envMap, N_immutable, GGX_SAMPLES, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {
347
+
348
+ const N = vec3( N_immutable ).toVar();
349
+
350
+ const prefilteredColor = vec3( 0.0 ).toVar();
351
+ const totalWeight = float( 0.0 ).toVar();
352
+
353
+ // For very low roughness, just sample the environment directly
354
+ If( roughness.lessThan( 0.001 ), () => {
355
+
356
+ prefilteredColor.assign( bilinearCubeUV( envMap, N, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ) );
357
+
358
+ } ).Else( () => {
359
+
360
+ // Tangent space basis for VNDF sampling
361
+ const up = select( abs( N.z ).lessThan( 0.999 ), vec3( 0.0, 0.0, 1.0 ), vec3( 1.0, 0.0, 0.0 ) );
362
+ const tangent = normalize( cross( up, N ) ).toVar();
363
+ const bitangent = cross( N, tangent ).toVar();
364
+
365
+ Loop( { start: uint( 0 ), end: GGX_SAMPLES }, ( { i } ) => {
366
+
367
+ const Xi = hammersley( i, GGX_SAMPLES );
368
+
369
+ // For PMREM, V = N, so in tangent space V is always (0, 0, 1)
370
+ const H_tangent = importanceSampleGGX_VNDF( Xi, vec3( 0.0, 0.0, 1.0 ), roughness );
371
+
372
+ // Transform H back to world space
373
+ const H = normalize( tangent.mul( H_tangent.x ).add( bitangent.mul( H_tangent.y ) ).add( N.mul( H_tangent.z ) ) );
374
+ const L = normalize( H.mul( dot( N, H ).mul( 2.0 ) ).sub( N ) );
375
+
376
+ const NdotL = max( dot( N, L ), 0.0 );
377
+
378
+ If( NdotL.greaterThan( 0.0 ), () => {
379
+
380
+ // Sample environment at fixed mip level
381
+ // VNDF importance sampling handles the distribution filtering
382
+ const sampleColor = bilinearCubeUV( envMap, L, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP );
383
+
384
+ // Weight by NdotL for the split-sum approximation
385
+ // VNDF PDF naturally accounts for the visible microfacet distribution
386
+ prefilteredColor.addAssign( sampleColor.mul( NdotL ) );
387
+ totalWeight.addAssign( NdotL );
388
+
389
+ } );
390
+
391
+ } );
392
+
393
+ If( totalWeight.greaterThan( 0.0 ), () => {
394
+
395
+ prefilteredColor.assign( prefilteredColor.div( totalWeight ) );
396
+
397
+ } );
398
+
399
+ } );
400
+
401
+ return vec4( prefilteredColor, 1.0 );
402
+
403
+ } );