super-three 0.181.0 → 0.184.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -1,24 +1,23 @@
1
1
  import BRDF_Lambert from './BSDF/BRDF_Lambert.js';
2
2
  import BRDF_GGX from './BSDF/BRDF_GGX.js';
3
3
  import BRDF_GGX_Multiscatter from './BSDF/BRDF_GGX_Multiscatter.js';
4
- import DFGApprox from './BSDF/DFGApprox.js';
4
+ import DFGLUT from './BSDF/DFGLUT.js';
5
5
  import EnvironmentBRDF from './BSDF/EnvironmentBRDF.js';
6
6
  import F_Schlick from './BSDF/F_Schlick.js';
7
7
  import Schlick_to_F0 from './BSDF/Schlick_to_F0.js';
8
8
  import BRDF_Sheen from './BSDF/BRDF_Sheen.js';
9
9
  import { LTC_Evaluate, LTC_Uv } from './BSDF/LTC.js';
10
10
  import LightingModel from '../core/LightingModel.js';
11
- import { diffuseColor, specularColor, specularF90, roughness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion } from '../core/PropertyNode.js';
11
+ import { diffuseColor, diffuseContribution, specularColor, specularColorBlended, specularF90, roughness, metalness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion } from '../core/PropertyNode.js';
12
12
  import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
13
13
  import { positionViewDirection, positionView, positionWorld } from '../accessors/Position.js';
14
14
  import { Fn, float, vec2, vec3, vec4, mat3, If } from '../tsl/TSLBase.js';
15
- import { select } from '../math/ConditionalNode.js';
16
15
  import { mix, normalize, refract, length, clamp, log2, log, exp, smoothstep } from '../math/MathNode.js';
17
16
  import { div } from '../math/OperatorNode.js';
18
17
  import { cameraPosition, cameraProjectionMatrix, cameraViewMatrix } from '../accessors/Camera.js';
19
18
  import { modelWorldMatrix } from '../accessors/ModelNode.js';
20
19
  import { screenSize } from '../display/ScreenNode.js';
21
- import { viewportMipTexture } from '../display/ViewportTextureNode.js';
20
+ import { viewportMipTexture, viewportOpaqueMipTexture } from '../display/ViewportTextureNode.js';
22
21
  import { textureBicubicLevel } from '../accessors/TextureBicubic.js';
23
22
  import { Loop } from '../utils/LoopNode.js';
24
23
  import { BackSide } from '../../constants.js';
@@ -70,7 +69,7 @@ const applyIorToRoughness = /*@__PURE__*/ Fn( ( [ roughness, ior ] ) => {
70
69
  } );
71
70
 
72
71
  const viewportBackSideTexture = /*@__PURE__*/ viewportMipTexture();
73
- const viewportFrontSideTexture = /*@__PURE__*/ viewportMipTexture();
72
+ const viewportFrontSideTexture = /*@__PURE__*/ viewportOpaqueMipTexture();
74
73
 
75
74
  const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ], { material } ) => {
76
75
 
@@ -313,29 +312,19 @@ const evalIridescence = /*@__PURE__*/ Fn( ( { outsideIOR, eta2, cosTheta1, thinF
313
312
  //
314
313
 
315
314
  // This is a curve-fit approximation to the "Charlie sheen" BRDF integrated over the hemisphere from
316
- // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found
317
- // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing
315
+ // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF".
318
316
  const IBLSheenBRDF = /*@__PURE__*/ Fn( ( { normal, viewDir, roughness } ) => {
319
317
 
320
318
  const dotNV = normal.dot( viewDir ).saturate();
319
+ const r2 = roughness.mul( roughness );
320
+ const rInv = roughness.add( 0.1 ).reciprocal();
321
321
 
322
- const r2 = roughness.pow2();
322
+ const a = float( - 1.9362 ).add( roughness.mul( 1.0678 ) ).add( r2.mul( 0.4573 ) ).sub( rInv.mul( 0.8469 ) );
323
+ const b = float( - 0.6014 ).add( roughness.mul( 0.5538 ) ).sub( r2.mul( 0.4670 ) ).sub( rInv.mul( 0.1255 ) );
323
324
 
324
- const a = select(
325
- roughness.lessThan( 0.25 ),
326
- float( - 339.2 ).mul( r2 ).add( float( 161.4 ).mul( roughness ) ).sub( 25.9 ),
327
- float( - 8.48 ).mul( r2 ).add( float( 14.3 ).mul( roughness ) ).sub( 9.95 )
328
- );
329
-
330
- const b = select(
331
- roughness.lessThan( 0.25 ),
332
- float( 44.0 ).mul( r2 ).sub( float( 23.7 ).mul( roughness ) ).add( 3.26 ),
333
- float( 1.97 ).mul( r2 ).sub( float( 3.27 ).mul( roughness ) ).add( 0.72 )
334
- );
335
-
336
- const DG = select( roughness.lessThan( 0.25 ), 0.0, float( 0.1 ).mul( roughness ).sub( 0.025 ) ).add( a.mul( dotNV ).add( b ).exp() );
325
+ const DG = a.mul( dotNV ).add( b ).exp();
337
326
 
338
- return DG.mul( 1.0 / Math.PI ).saturate();
327
+ return DG.saturate();
339
328
 
340
329
  } );
341
330
 
@@ -468,6 +457,22 @@ class PhysicalLightingModel extends LightingModel {
468
457
  */
469
458
  this.iridescenceF0 = null;
470
459
 
460
+ /**
461
+ * The iridescence F0 dielectric.
462
+ *
463
+ * @type {?Node}
464
+ * @default null
465
+ */
466
+ this.iridescenceF0Dielectric = null;
467
+
468
+ /**
469
+ * The iridescence F0 metallic.
470
+ *
471
+ * @type {?Node}
472
+ * @default null
473
+ */
474
+ this.iridescenceF0Metallic = null;
475
+
471
476
  }
472
477
 
473
478
  /**
@@ -497,7 +502,7 @@ class PhysicalLightingModel extends LightingModel {
497
502
 
498
503
  const dotNVi = normalView.dot( positionViewDirection ).clamp();
499
504
 
500
- this.iridescenceFresnel = evalIridescence( {
505
+ const iridescenceFresnelDielectric = evalIridescence( {
501
506
  outsideIOR: float( 1.0 ),
502
507
  eta2: iridescenceIOR,
503
508
  cosTheta1: dotNVi,
@@ -505,7 +510,20 @@ class PhysicalLightingModel extends LightingModel {
505
510
  baseF0: specularColor
506
511
  } );
507
512
 
508
- this.iridescenceF0 = Schlick_to_F0( { f: this.iridescenceFresnel, f90: 1.0, dotVH: dotNVi } );
513
+ const iridescenceFresnelMetallic = evalIridescence( {
514
+ outsideIOR: float( 1.0 ),
515
+ eta2: iridescenceIOR,
516
+ cosTheta1: dotNVi,
517
+ thinFilmThickness: iridescenceThickness,
518
+ baseF0: diffuseColor.rgb
519
+ } );
520
+
521
+ this.iridescenceFresnel = mix( iridescenceFresnelDielectric, iridescenceFresnelMetallic, metalness );
522
+
523
+ this.iridescenceF0Dielectric = Schlick_to_F0( { f: iridescenceFresnelDielectric, f90: 1.0, dotVH: dotNVi } );
524
+ this.iridescenceF0Metallic = Schlick_to_F0( { f: iridescenceFresnelMetallic, f90: 1.0, dotVH: dotNVi } );
525
+
526
+ this.iridescenceF0 = mix( this.iridescenceF0Dielectric, this.iridescenceF0Metallic, metalness );
509
527
 
510
528
  }
511
529
 
@@ -521,8 +539,8 @@ class PhysicalLightingModel extends LightingModel {
521
539
  n,
522
540
  v,
523
541
  roughness,
524
- diffuseColor,
525
- specularColor,
542
+ diffuseContribution,
543
+ specularColorBlended,
526
544
  specularF90, // specularF90
527
545
  position, // positionWorld
528
546
  modelWorldMatrix, // modelMatrix
@@ -549,13 +567,13 @@ class PhysicalLightingModel extends LightingModel {
549
567
  // Approximates multi-scattering in order to preserve energy.
550
568
  // http://www.jcgt.org/published/0008/01/03/
551
569
 
552
- computeMultiscattering( singleScatter, multiScatter, specularF90 ) {
570
+ computeMultiscattering( singleScatter, multiScatter, specularF90, f0, iridescenceF0 = null ) {
553
571
 
554
572
  const dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
555
573
 
556
- const fab = DFGApprox( { roughness, dotNV } );
574
+ const fab = DFGLUT( { roughness, dotNV } );
557
575
 
558
- const Fr = this.iridescenceF0 ? iridescence.mix( specularColor, this.iridescenceF0 ) : specularColor;
576
+ const Fr = iridescenceF0 ? iridescence.mix( f0, iridescenceF0 ) : f0;
559
577
 
560
578
  const FssEss = Fr.mul( fab.x ).add( specularF90.mul( fab.y ) );
561
579
 
@@ -579,12 +597,19 @@ class PhysicalLightingModel extends LightingModel {
579
597
  direct( { lightDirection, lightColor, reflectedLight }, /* builder */ ) {
580
598
 
581
599
  const dotNL = normalView.dot( lightDirection ).clamp();
582
- const irradiance = dotNL.mul( lightColor );
600
+ const irradiance = dotNL.mul( lightColor ).toVar();
583
601
 
584
602
  if ( this.sheen === true ) {
585
603
 
586
604
  this.sheenSpecularDirect.addAssign( irradiance.mul( BRDF_Sheen( { lightDirection } ) ) );
587
605
 
606
+ const sheenAlbedoV = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );
607
+ const sheenAlbedoL = IBLSheenBRDF( { normal: normalView, viewDir: lightDirection, roughness: sheenRoughness } );
608
+
609
+ const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedoV.max( sheenAlbedoL ) ).oneMinus();
610
+
611
+ irradiance.mulAssign( sheenEnergyComp );
612
+
588
613
  }
589
614
 
590
615
  if ( this.clearcoat === true ) {
@@ -596,9 +621,9 @@ class PhysicalLightingModel extends LightingModel {
596
621
 
597
622
  }
598
623
 
599
- reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseColor.rgb } ) ) );
624
+ reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ) );
600
625
 
601
- reflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_GGX_Multiscatter( { lightDirection, f0: specularColor, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } ) ) );
626
+ reflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_GGX_Multiscatter( { lightDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } ) ) );
602
627
 
603
628
  }
604
629
 
@@ -633,11 +658,33 @@ class PhysicalLightingModel extends LightingModel {
633
658
 
634
659
  // LTC Fresnel Approximation by Stephen Hill
635
660
  // http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf
636
- const fresnel = specularColor.mul( t2.x ).add( specularColor.oneMinus().mul( t2.y ) ).toVar();
661
+ const fresnel = specularColorBlended.mul( t2.x ).add( specularF90.sub( specularColorBlended ).mul( t2.y ) ).toVar();
637
662
 
638
663
  reflectedLight.directSpecular.addAssign( lightColor.mul( fresnel ).mul( LTC_Evaluate( { N, V, P, mInv, p0, p1, p2, p3 } ) ) );
639
664
 
640
- reflectedLight.directDiffuse.addAssign( lightColor.mul( diffuseColor ).mul( LTC_Evaluate( { N, V, P, mInv: mat3( 1, 0, 0, 0, 1, 0, 0, 0, 1 ), p0, p1, p2, p3 } ) ) );
665
+ reflectedLight.directDiffuse.addAssign( lightColor.mul( diffuseContribution ).mul( LTC_Evaluate( { N, V, P, mInv: mat3( 1, 0, 0, 0, 1, 0, 0, 0, 1 ), p0, p1, p2, p3 } ) ) );
666
+
667
+ if ( this.clearcoat === true ) {
668
+
669
+ const Ncc = clearcoatNormalView;
670
+
671
+ const uvClearcoat = LTC_Uv( { N: Ncc, V, roughness: clearcoatRoughness } );
672
+
673
+ const t1Clearcoat = ltc_1.sample( uvClearcoat );
674
+ const t2Clearcoat = ltc_2.sample( uvClearcoat );
675
+
676
+ const mInvClearcoat = mat3(
677
+ vec3( t1Clearcoat.x, 0, t1Clearcoat.y ),
678
+ vec3( 0, 1, 0 ),
679
+ vec3( t1Clearcoat.z, 0, t1Clearcoat.w )
680
+ );
681
+
682
+ // LTC Fresnel Approximation for clearcoat
683
+ const fresnelClearcoat = clearcoatF0.mul( t2Clearcoat.x ).add( clearcoatF90.sub( clearcoatF0 ).mul( t2Clearcoat.y ) );
684
+
685
+ this.clearcoatSpecularDirect.addAssign( lightColor.mul( fresnelClearcoat ).mul( LTC_Evaluate( { N: Ncc, V, P, mInv: mInvClearcoat, p0, p1, p2, p3 } ) ) );
686
+
687
+ }
641
688
 
642
689
  }
643
690
 
@@ -663,7 +710,19 @@ class PhysicalLightingModel extends LightingModel {
663
710
 
664
711
  const { irradiance, reflectedLight } = builder.context;
665
712
 
666
- reflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor } ) ) );
713
+ const diffuse = irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).toVar();
714
+
715
+ if ( this.sheen === true ) {
716
+
717
+ const sheenAlbedo = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );
718
+
719
+ const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedo ).oneMinus();
720
+
721
+ diffuse.mulAssign( sheenEnergyComp );
722
+
723
+ }
724
+
725
+ reflectedLight.indirectDiffuse.addAssign( diffuse );
667
726
 
668
727
  }
669
728
 
@@ -705,21 +764,44 @@ class PhysicalLightingModel extends LightingModel {
705
764
  }
706
765
 
707
766
  // Both indirect specular and indirect diffuse light accumulate here
767
+ // Compute multiscattering separately for dielectric and metallic, then mix
768
+
769
+ const singleScatteringDielectric = vec3().toVar( 'singleScatteringDielectric' );
770
+ const multiScatteringDielectric = vec3().toVar( 'multiScatteringDielectric' );
771
+ const singleScatteringMetallic = vec3().toVar( 'singleScatteringMetallic' );
772
+ const multiScatteringMetallic = vec3().toVar( 'multiScatteringMetallic' );
773
+
774
+ this.computeMultiscattering( singleScatteringDielectric, multiScatteringDielectric, specularF90, specularColor, this.iridescenceF0Dielectric );
775
+ this.computeMultiscattering( singleScatteringMetallic, multiScatteringMetallic, specularF90, diffuseColor.rgb, this.iridescenceF0Metallic );
776
+
777
+ // Mix based on metalness
778
+ const singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, metalness );
779
+ const multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, metalness );
780
+
781
+ // Diffuse energy conservation uses dielectric path
782
+ const totalScatteringDielectric = singleScatteringDielectric.add( multiScatteringDielectric );
783
+
784
+ const diffuse = diffuseContribution.mul( totalScatteringDielectric.oneMinus() );
708
785
 
709
- const singleScattering = vec3().toVar( 'singleScattering' );
710
- const multiScattering = vec3().toVar( 'multiScattering' );
711
786
  const cosineWeightedIrradiance = iblIrradiance.mul( 1 / Math.PI );
712
787
 
713
- this.computeMultiscattering( singleScattering, multiScattering, specularF90 );
788
+ const indirectSpecular = radiance.mul( singleScattering ).add( multiScattering.mul( cosineWeightedIrradiance ) ).toVar();
789
+ const indirectDiffuse = diffuse.mul( cosineWeightedIrradiance ).toVar();
790
+
791
+ if ( this.sheen === true ) {
714
792
 
715
- const totalScattering = singleScattering.add( multiScattering );
793
+ const sheenAlbedo = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );
716
794
 
717
- const diffuse = diffuseColor.mul( totalScattering.r.max( totalScattering.g ).max( totalScattering.b ).oneMinus() );
795
+ const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedo ).oneMinus();
796
+
797
+ indirectSpecular.mulAssign( sheenEnergyComp );
798
+ indirectDiffuse.mulAssign( sheenEnergyComp );
799
+
800
+ }
718
801
 
719
- reflectedLight.indirectSpecular.addAssign( radiance.mul( singleScattering ) );
720
- reflectedLight.indirectSpecular.addAssign( multiScattering.mul( cosineWeightedIrradiance ) );
802
+ reflectedLight.indirectSpecular.addAssign( indirectSpecular );
721
803
 
722
- reflectedLight.indirectDiffuse.addAssign( diffuse.mul( cosineWeightedIrradiance ) );
804
+ reflectedLight.indirectDiffuse.addAssign( indirectDiffuse );
723
805
 
724
806
  }
725
807
 
@@ -783,8 +865,7 @@ class PhysicalLightingModel extends LightingModel {
783
865
 
784
866
  if ( this.sheen === true ) {
785
867
 
786
- const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( 0.157 ).oneMinus();
787
- const sheenLight = outgoingLight.mul( sheenEnergyComp ).add( this.sheenSpecularDirect, this.sheenSpecularIndirect );
868
+ const sheenLight = outgoingLight.add( this.sheenSpecularDirect, this.sheenSpecularIndirect.mul( 1.0 / Math.PI ) );
788
869
 
789
870
  outgoingLight.assign( sheenLight );
790
871
 
@@ -1,4 +1,5 @@
1
1
  import Node from '../core/Node.js';
2
+ import NodeError from '../core/NodeError.js';
2
3
  import { getValueType } from '../core/NodeUtils.js';
3
4
  import { buffer } from '../accessors/BufferNode.js';
4
5
  import { instancedBufferAttribute } from '../accessors/BufferAttributeNode.js';
@@ -83,7 +84,7 @@ class RangeNode extends Node {
83
84
  * @param {NodeBuilder} builder - The current node builder.
84
85
  * @return {string} The node type.
85
86
  */
86
- getNodeType( builder ) {
87
+ generateNodeType( builder ) {
87
88
 
88
89
  return builder.object.count > 1 ? builder.getTypeFromLength( this.getVectorLength( builder ) ) : 'float';
89
90
 
@@ -111,7 +112,7 @@ class RangeNode extends Node {
111
112
 
112
113
  if ( output === null ) {
113
114
 
114
- throw new Error( 'THREE.TSL: No "ConstNode" found in node graph.' );
115
+ throw new NodeError( 'THREE.TSL: No "ConstNode" found in node graph.', this.stackTrace );
115
116
 
116
117
  }
117
118
 
@@ -167,8 +168,9 @@ class RangeNode extends Node {
167
168
  }
168
169
 
169
170
  const nodeType = this.getNodeType( builder );
171
+ const uniformBufferSize = object.count * 4 * 4; // count * 4 components * 4 bytes (float)
170
172
 
171
- if ( object.count <= 4096 ) {
173
+ if ( uniformBufferSize <= builder.getUniformBufferLimit() ) {
172
174
 
173
175
  output = buffer( array, 'vec4', object.count ).element( instanceIndex ).convert( nodeType );
174
176
 
@@ -82,7 +82,7 @@ class AtomicFunctionNode extends Node {
82
82
  * @param {NodeBuilder} builder - The current node builder.
83
83
  * @return {string} The node type.
84
84
  */
85
- getNodeType( builder ) {
85
+ generateNodeType( builder ) {
86
86
 
87
87
  return this.getInputType( builder );
88
88
 
@@ -21,6 +21,15 @@ class BarrierNode extends Node {
21
21
 
22
22
  this.scope = scope;
23
23
 
24
+ this.isBarrierNode = true;
25
+
26
+ }
27
+
28
+ setup( builder ) {
29
+
30
+ builder.allowEarlyReturns = false;
31
+ builder.allowGlobalVariables = false;
32
+
24
33
  }
25
34
 
26
35
  generate( builder ) {
@@ -1,5 +1,4 @@
1
1
  import Node from '../core/Node.js';
2
- import { nodeObject } from '../tsl/TSLBase.js';
3
2
  import { warn } from '../../utils.js';
4
3
 
5
4
  /**
@@ -56,7 +55,7 @@ class ComputeBuiltinNode extends Node {
56
55
  * @param {NodeBuilder} builder - The current node builder.
57
56
  * @return {string} The node type.
58
57
  */
59
- getNodeType( /*builder*/ ) {
58
+ generateNodeType( /*builder*/ ) {
60
59
 
61
60
  return this.nodeType;
62
61
 
@@ -149,7 +148,7 @@ export default ComputeBuiltinNode;
149
148
  * @param {string} nodeType - The node type.
150
149
  * @returns {ComputeBuiltinNode}
151
150
  */
152
- const computeBuiltin = ( name, nodeType ) => nodeObject( new ComputeBuiltinNode( name, nodeType ) );
151
+ const computeBuiltin = ( name, nodeType ) => new ComputeBuiltinNode( name, nodeType );
153
152
 
154
153
  /**
155
154
  * Represents the number of workgroups dispatched by the compute shader.
@@ -1,10 +1,13 @@
1
1
  import Node from '../core/Node.js';
2
+ import { instanceIndex } from '../core/IndexNode.js';
3
+ import StackTrace from '../core/StackTrace.js';
4
+ import { uniform } from '../core/UniformNode.js';
2
5
  import { NodeUpdateType } from '../core/constants.js';
3
6
  import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js';
4
7
  import { warn, error } from '../../utils.js';
5
8
 
6
9
  /**
7
- * TODO
10
+ * Represents a compute shader node.
8
11
  *
9
12
  * @augments Node
10
13
  */
@@ -19,8 +22,8 @@ class ComputeNode extends Node {
19
22
  /**
20
23
  * Constructs a new compute node.
21
24
  *
22
- * @param {Node} computeNode - TODO
23
- * @param {Array<number>} workgroupSize - TODO.
25
+ * @param {Node} computeNode - The node that defines the compute shader logic.
26
+ * @param {Array<number>} workgroupSize - An array defining the X, Y, and Z dimensions of the workgroup for compute shader execution.
24
27
  */
25
28
  constructor( computeNode, workgroupSize ) {
26
29
 
@@ -36,15 +39,14 @@ class ComputeNode extends Node {
36
39
  this.isComputeNode = true;
37
40
 
38
41
  /**
39
- * TODO
42
+ * The node that defines the compute shader logic.
40
43
  *
41
44
  * @type {Node}
42
45
  */
43
46
  this.computeNode = computeNode;
44
47
 
45
-
46
48
  /**
47
- * TODO
49
+ * An array defining the X, Y, and Z dimensions of the workgroup for compute shader execution.
48
50
  *
49
51
  * @type {Array<number>}
50
52
  * @default [ 64 ]
@@ -52,14 +54,23 @@ class ComputeNode extends Node {
52
54
  this.workgroupSize = workgroupSize;
53
55
 
54
56
  /**
55
- * TODO
57
+ * The total number of threads (invocations) to execute. If it is a number, it will be used
58
+ * to automatically generate bounds checking against `instanceIndex`.
56
59
  *
57
60
  * @type {number|Array<number>}
58
61
  */
59
62
  this.count = null;
60
63
 
61
64
  /**
62
- * TODO
65
+ * The dispatch size for workgroups on X, Y, and Z axes.
66
+ * Used directly if `count` is not provided.
67
+ *
68
+ * @type {number|Array<number>}
69
+ */
70
+ this.dispatchSize = null;
71
+
72
+ /**
73
+ * The version of the node.
63
74
  *
64
75
  * @type {number}
65
76
  */
@@ -83,36 +94,19 @@ class ComputeNode extends Node {
83
94
  this.updateBeforeType = NodeUpdateType.OBJECT;
84
95
 
85
96
  /**
86
- * TODO
97
+ * A callback executed when the compute node finishes initialization.
87
98
  *
88
99
  * @type {?Function}
89
100
  */
90
101
  this.onInitFunction = null;
91
102
 
92
- }
93
-
94
- /**
95
- * TODO
96
- *
97
- * @param {number|Array<number>} count - Array with [ x, y, z ] values for dispatch or a single number for the count
98
- * @return {ComputeNode}
99
- */
100
- setCount( count ) {
101
-
102
- this.count = count;
103
-
104
- return this;
105
-
106
- }
107
-
108
- /**
109
- * TODO
110
- *
111
- * @return {number|Array<number>}
112
- */
113
- getCount() {
114
-
115
- return this.count;
103
+ /**
104
+ * A uniform node holding the dispatch count for bounds checking.
105
+ * Created automatically when `count` is a number.
106
+ *
107
+ * @type {?UniformNode}
108
+ */
109
+ this.countNode = null;
116
110
 
117
111
  }
118
112
 
@@ -148,16 +142,16 @@ class ComputeNode extends Node {
148
142
  */
149
143
  label( name ) {
150
144
 
151
- warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.' ); // @deprecated r179
145
+ warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.', new StackTrace() ); // @deprecated r179
152
146
 
153
147
  return this.setName( name );
154
148
 
155
149
  }
156
150
 
157
151
  /**
158
- * TODO
152
+ * Sets the callback to run during initialization.
159
153
  *
160
- * @param {Function} callback - TODO.
154
+ * @param {Function} callback - The callback function.
161
155
  * @return {ComputeNode} A reference to this node.
162
156
  */
163
157
  onInit( callback ) {
@@ -181,6 +175,12 @@ class ComputeNode extends Node {
181
175
 
182
176
  setup( builder ) {
183
177
 
178
+ if ( this.count !== null && this.countNode === null ) {
179
+
180
+ this.countNode = uniform( this.count, 'uint' ).onObjectUpdate( () => this.count );
181
+
182
+ }
183
+
184
184
  const result = this.computeNode.build( builder );
185
185
 
186
186
  if ( result ) {
@@ -210,6 +210,16 @@ class ComputeNode extends Node {
210
210
 
211
211
  }
212
212
 
213
+ if ( this.count !== null && builder.allowEarlyReturns === true ) {
214
+
215
+ const countSnippet = this.countNode.build( builder, 'uint' );
216
+ const indexSnippet = instanceIndex.build( builder, 'uint' );
217
+
218
+ builder.flow.code = `${ builder.tab }if ( ${ indexSnippet } >= ${ countSnippet } ) { return; }\n\n${ builder.flow.code }`;
219
+
220
+ }
221
+
222
+
213
223
  } else {
214
224
 
215
225
  const properties = builder.getNodeProperties( this );
@@ -234,15 +244,15 @@ export default ComputeNode;
234
244
  *
235
245
  * @tsl
236
246
  * @function
237
- * @param {Node} node - TODO
238
- * @param {Array<number>} [workgroupSize=[64]] - TODO.
239
- * @returns {AtomicFunctionNode}
247
+ * @param {Node} node - The TSL logic for the compute shader.
248
+ * @param {Array<number>} [workgroupSize=[64]] - The workgroup size.
249
+ * @returns {ComputeNode}
240
250
  */
241
251
  export const computeKernel = ( node, workgroupSize = [ 64 ] ) => {
242
252
 
243
253
  if ( workgroupSize.length === 0 || workgroupSize.length > 3 ) {
244
254
 
245
- error( 'TSL: compute() workgroupSize must have 1, 2, or 3 elements' );
255
+ error( 'TSL: compute() workgroupSize must have 1, 2, or 3 elements', new StackTrace() );
246
256
 
247
257
  }
248
258
 
@@ -252,7 +262,7 @@ export const computeKernel = ( node, workgroupSize = [ 64 ] ) => {
252
262
 
253
263
  if ( typeof val !== 'number' || val <= 0 || ! Number.isInteger( val ) ) {
254
264
 
255
- error( `TSL: compute() workgroupSize element at index [ ${ i } ] must be a positive integer` );
265
+ error( `TSL: compute() workgroupSize element at index [ ${ i } ] must be a positive integer`, new StackTrace() );
256
266
 
257
267
  }
258
268
 
@@ -264,7 +274,7 @@ export const computeKernel = ( node, workgroupSize = [ 64 ] ) => {
264
274
 
265
275
  //
266
276
 
267
- return nodeObject( new ComputeNode( nodeObject( node ), workgroupSize ) );
277
+ return new ComputeNode( nodeObject( node ), workgroupSize );
268
278
 
269
279
  };
270
280
 
@@ -273,12 +283,28 @@ export const computeKernel = ( node, workgroupSize = [ 64 ] ) => {
273
283
  *
274
284
  * @tsl
275
285
  * @function
276
- * @param {Node} node - TODO
277
- * @param {number|Array<number>} count - TODO.
278
- * @param {Array<number>} [workgroupSize=[64]] - TODO.
279
- * @returns {AtomicFunctionNode}
280
- */
281
- export const compute = ( node, count, workgroupSize ) => computeKernel( node, workgroupSize ).setCount( count );
286
+ * @param {Node} node - The TSL logic for the compute shader.
287
+ * @param {number|Array<number>} count - The compute count or dispatch size.
288
+ * @param {Array<number>} [workgroupSize=[64]] - The workgroup size.
289
+ * @returns {ComputeNode}
290
+ , */
291
+ export const compute = ( node, count, workgroupSize ) => {
292
+
293
+ const computeNode = computeKernel( node, workgroupSize );
294
+
295
+ if ( typeof count === 'number' ) {
296
+
297
+ computeNode.count = count;
298
+
299
+ } else {
300
+
301
+ computeNode.dispatchSize = count;
302
+
303
+ }
304
+
305
+ return computeNode;
306
+
307
+ };
282
308
 
283
309
  addMethodChaining( 'compute', compute );
284
310
  addMethodChaining( 'computeKernel', computeKernel );
@@ -35,7 +35,7 @@ class SubgroupFunctionNode extends TempNode {
35
35
  /**
36
36
  * The subgroup/wave intrinsic method to construct.
37
37
  *
38
- * @type {String}
38
+ * @type {string}
39
39
  */
40
40
  this.method = method;
41
41
 
@@ -75,7 +75,7 @@ class SubgroupFunctionNode extends TempNode {
75
75
 
76
76
  }
77
77
 
78
- getNodeType( builder ) {
78
+ generateNodeType( builder ) {
79
79
 
80
80
  const method = this.method;
81
81
 
@@ -1,7 +1,7 @@
1
1
  import ArrayElementNode from '../utils/ArrayElementNode.js';
2
- import { nodeObject } from '../tsl/TSLCore.js';
3
2
  import Node from '../core/Node.js';
4
3
  import { warn } from '../../utils.js';
4
+ import StackTrace from '../core/StackTrace.js';
5
5
 
6
6
  /**
7
7
  * Represents an element of a 'workgroup' scoped buffer.
@@ -150,7 +150,7 @@ class WorkgroupInfoNode extends Node {
150
150
  */
151
151
  label( name ) {
152
152
 
153
- warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.' ); // @deprecated r179
153
+ warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.', new StackTrace() ); // @deprecated r179
154
154
 
155
155
  return this.setName( name );
156
156
 
@@ -203,7 +203,7 @@ class WorkgroupInfoNode extends Node {
203
203
  */
204
204
  element( indexNode ) {
205
205
 
206
- return nodeObject( new WorkgroupInfoElementNode( this, indexNode ) );
206
+ return new WorkgroupInfoElementNode( this, indexNode );
207
207
 
208
208
  }
209
209
 
@@ -229,6 +229,6 @@ export default WorkgroupInfoNode;
229
229
  * @param {number} [count=0] - The number of elements in the buffer.
230
230
  * @returns {WorkgroupInfoNode}
231
231
  */
232
- export const workgroupArray = ( type, count ) => nodeObject( new WorkgroupInfoNode( 'Workgroup', type, count ) );
232
+ export const workgroupArray = ( type, count ) => new WorkgroupInfoNode( 'Workgroup', type, count );
233
233
 
234
234