@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -13,16 +13,13 @@ const D_GGX_Anisotropic = /*@__PURE__*/ Fn( ( { alphaT, alphaB, dotNH, dotTH, do
13
13
 
14
14
  return RECIPROCAL_PI.mul( a2.mul( w2.pow2() ) );
15
15
 
16
- } ).setLayout( {
17
- name: 'D_GGX_Anisotropic',
18
- type: 'float',
19
- inputs: [
20
- { name: 'alphaT', type: 'float', qualifier: 'in' },
21
- { name: 'alphaB', type: 'float', qualifier: 'in' },
22
- { name: 'dotNH', type: 'float', qualifier: 'in' },
23
- { name: 'dotTH', type: 'float', qualifier: 'in' },
24
- { name: 'dotBH', type: 'float', qualifier: 'in' }
25
- ]
16
+ }, {
17
+ alphaT: 'float',
18
+ alphaB: 'float',
19
+ dotNH: 'float',
20
+ dotTH: 'float',
21
+ dotBH: 'float',
22
+ return: 'float'
26
23
  } );
27
24
 
28
25
  export default D_GGX_Anisotropic;
@@ -22,15 +22,7 @@ const LTC_Uv = /*@__PURE__*/ Fn( ( { N, V, roughness } ) => {
22
22
 
23
23
  return uv;
24
24
 
25
- } ).setLayout( {
26
- name: 'LTC_Uv',
27
- type: 'vec2',
28
- inputs: [
29
- { name: 'N', type: 'vec3' },
30
- { name: 'V', type: 'vec3' },
31
- { name: 'roughness', type: 'float' }
32
- ]
33
- } );
25
+ }, { N: 'vec3', V: 'vec3', roughness: 'float', return: 'vec2' } );
34
26
 
35
27
  const LTC_ClippedSphereFormFactor = /*@__PURE__*/ Fn( ( { f } ) => {
36
28
 
@@ -41,13 +33,7 @@ const LTC_ClippedSphereFormFactor = /*@__PURE__*/ Fn( ( { f } ) => {
41
33
 
42
34
  return max( l.mul( l ).add( f.z ).div( l.add( 1.0 ) ), 0 );
43
35
 
44
- } ).setLayout( {
45
- name: 'LTC_ClippedSphereFormFactor',
46
- type: 'float',
47
- inputs: [
48
- { name: 'f', type: 'vec3' }
49
- ]
50
- } );
36
+ }, { f: 'vec3', return: 'float' } );
51
37
 
52
38
  const LTC_EdgeVectorFormFactor = /*@__PURE__*/ Fn( ( { v1, v2 } ) => {
53
39
 
@@ -63,14 +49,7 @@ const LTC_EdgeVectorFormFactor = /*@__PURE__*/ Fn( ( { v1, v2 } ) => {
63
49
 
64
50
  return v1.cross( v2 ).mul( theta_sintheta );
65
51
 
66
- } ).setLayout( {
67
- name: 'LTC_EdgeVectorFormFactor',
68
- type: 'vec3',
69
- inputs: [
70
- { name: 'v1', type: 'vec3' },
71
- { name: 'v2', type: 'vec3' }
72
- ]
73
- } );
52
+ }, { v1: 'vec3', v2: 'vec3', return: 'vec3' } );
74
53
 
75
54
  const LTC_Evaluate = /*@__PURE__*/ Fn( ( { N, V, P, mInv, p0, p1, p2, p3 } ) => {
76
55
 
@@ -112,19 +91,16 @@ const LTC_Evaluate = /*@__PURE__*/ Fn( ( { N, V, P, mInv, p0, p1, p2, p3 } ) =>
112
91
 
113
92
  return result;
114
93
 
115
- } ).setLayout( {
116
- name: 'LTC_Evaluate',
117
- type: 'vec3',
118
- inputs: [
119
- { name: 'N', type: 'vec3' },
120
- { name: 'V', type: 'vec3' },
121
- { name: 'P', type: 'vec3' },
122
- { name: 'mInv', type: 'mat3' },
123
- { name: 'p0', type: 'vec3' },
124
- { name: 'p1', type: 'vec3' },
125
- { name: 'p2', type: 'vec3' },
126
- { name: 'p3', type: 'vec3' }
127
- ]
94
+ }, {
95
+ N: 'vec3',
96
+ V: 'vec3',
97
+ P: 'vec3',
98
+ mInv: 'mat3',
99
+ p0: 'vec3',
100
+ p1: 'vec3',
101
+ p2: 'vec3',
102
+ p3: 'vec3',
103
+ return: 'vec3'
128
104
  } );
129
105
 
130
106
  const LTC_Evaluate_Volume = /*@__PURE__*/ Fn( ( { P, p0, p1, p2, p3 } ) => {
@@ -160,16 +136,13 @@ const LTC_Evaluate_Volume = /*@__PURE__*/ Fn( ( { P, p0, p1, p2, p3 } ) => {
160
136
 
161
137
  return result;
162
138
 
163
- } ).setLayout( {
164
- name: 'LTC_Evaluate_Volume',
165
- type: 'vec3',
166
- inputs: [
167
- { name: 'P', type: 'vec3' },
168
- { name: 'p0', type: 'vec3' },
169
- { name: 'p1', type: 'vec3' },
170
- { name: 'p2', type: 'vec3' },
171
- { name: 'p3', type: 'vec3' }
172
- ]
139
+ }, {
140
+ P: 'vec3',
141
+ p0: 'vec3',
142
+ p1: 'vec3',
143
+ p2: 'vec3',
144
+ p3: 'vec3',
145
+ return: 'vec3'
173
146
  } );
174
147
 
175
148
  export { LTC_Evaluate, LTC_Evaluate_Volume, LTC_Uv };
@@ -8,14 +8,6 @@ const Schlick_to_F0 = /*@__PURE__*/ Fn( ( { f, f90, dotVH } ) => {
8
8
 
9
9
  return f.sub( vec3( f90 ).mul( x5 ) ).div( x5.oneMinus() );
10
10
 
11
- } ).setLayout( {
12
- name: 'Schlick_to_F0',
13
- type: 'vec3',
14
- inputs: [
15
- { name: 'f', type: 'vec3' },
16
- { name: 'f90', type: 'float' },
17
- { name: 'dotVH', type: 'float' }
18
- ]
19
- } );
11
+ }, { f: 'vec3', f90: 'float', dotVH: 'float', return: 'vec3' } );
20
12
 
21
13
  export default Schlick_to_F0;
@@ -13,14 +13,6 @@ const V_GGX_SmithCorrelated = /*@__PURE__*/ Fn( ( { alpha, dotNL, dotNV } ) => {
13
13
 
14
14
  return div( 0.5, gv.add( gl ).max( EPSILON ) );
15
15
 
16
- } ).setLayout( {
17
- name: 'V_GGX_SmithCorrelated',
18
- type: 'float',
19
- inputs: [
20
- { name: 'alpha', type: 'float' },
21
- { name: 'dotNL', type: 'float' },
22
- { name: 'dotNV', type: 'float' }
23
- ]
24
- } ); // validated
16
+ }, { alpha: 'float', dotNL: 'float', dotNV: 'float', return: 'float' } ); // validated
25
17
 
26
18
  export default V_GGX_SmithCorrelated;
@@ -11,19 +11,16 @@ const V_GGX_SmithCorrelated_Anisotropic = /*@__PURE__*/ Fn( ( { alphaT, alphaB,
11
11
 
12
12
  return div( 0.5, gv.add( gl ).max( EPSILON ) );
13
13
 
14
- } ).setLayout( {
15
- name: 'V_GGX_SmithCorrelated_Anisotropic',
16
- type: 'float',
17
- inputs: [
18
- { name: 'alphaT', type: 'float', qualifier: 'in' },
19
- { name: 'alphaB', type: 'float', qualifier: 'in' },
20
- { name: 'dotTV', type: 'float', qualifier: 'in' },
21
- { name: 'dotBV', type: 'float', qualifier: 'in' },
22
- { name: 'dotTL', type: 'float', qualifier: 'in' },
23
- { name: 'dotBL', type: 'float', qualifier: 'in' },
24
- { name: 'dotNV', type: 'float', qualifier: 'in' },
25
- { name: 'dotNL', type: 'float', qualifier: 'in' }
26
- ]
14
+ }, {
15
+ alphaT: 'float',
16
+ alphaB: 'float',
17
+ dotTV: 'float',
18
+ dotBV: 'float',
19
+ dotTL: 'float',
20
+ dotBL: 'float',
21
+ dotNV: 'float',
22
+ dotNL: 'float',
23
+ return: 'float'
27
24
  } );
28
25
 
29
26
  export default V_GGX_SmithCorrelated_Anisotropic;
@@ -1,4 +1,5 @@
1
1
  import BRDF_Lambert from './BSDF/BRDF_Lambert.js';
2
+ import BRDF_EON, { EON_DirectionalAlbedo } from './BSDF/BRDF_EON.js';
2
3
  import BRDF_GGX from './BSDF/BRDF_GGX.js';
3
4
  import DFGLUT from './BSDF/DFGLUT.js';
4
5
  import EnvironmentBRDF from './BSDF/EnvironmentBRDF.js';
@@ -7,7 +8,7 @@ import Schlick_to_F0 from './BSDF/Schlick_to_F0.js';
7
8
  import BRDF_Sheen from './BSDF/BRDF_Sheen.js';
8
9
  import { LTC_Evaluate, LTC_Uv } from './BSDF/LTC.js';
9
10
  import LightingModel from '../core/LightingModel.js';
10
- import { diffuseColor, diffuseContribution, specularColor, specularColorBlended, specularF90, roughness, metalness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion, retroreflectivity } from '../core/PropertyNode.js';
11
+ import { diffuseColor, diffuseContribution, diffuseRoughness, specularColor, specularColorBlended, specularF90, roughness, metalness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion, retroreflectivity } from '../core/PropertyNode.js';
11
12
  import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
12
13
  import { positionViewDirection, positionView, positionWorld } from '../accessors/Position.js';
13
14
  import { Fn, float, vec2, vec3, vec4, mat3, If } from '../tsl/TSLBase.js';
@@ -40,16 +41,13 @@ const getVolumeTransmissionRay = /*@__PURE__*/ Fn( ( [ n, v, thickness, ior, mod
40
41
  // The thickness is specified in local space.
41
42
  return normalize( refractionVector ).mul( thickness.mul( modelScale ) );
42
43
 
43
- } ).setLayout( {
44
- name: 'getVolumeTransmissionRay',
45
- type: 'vec3',
46
- inputs: [
47
- { name: 'n', type: 'vec3' },
48
- { name: 'v', type: 'vec3' },
49
- { name: 'thickness', type: 'float' },
50
- { name: 'ior', type: 'float' },
51
- { name: 'modelMatrix', type: 'mat4' }
52
- ]
44
+ }, {
45
+ n: 'vec3',
46
+ v: 'vec3',
47
+ thickness: 'float',
48
+ ior: 'float',
49
+ modelMatrix: 'mat4',
50
+ return: 'vec3'
53
51
  } );
54
52
 
55
53
  const applyIorToRoughness = /*@__PURE__*/ Fn( ( [ roughness, ior ] ) => {
@@ -58,14 +56,7 @@ const applyIorToRoughness = /*@__PURE__*/ Fn( ( [ roughness, ior ] ) => {
58
56
  // an IOR of 1.5 results in the default amount of microfacet refraction.
59
57
  return roughness.mul( clamp( ior.mul( 2.0 ).sub( 2.0 ), 0.0, 1.0 ) );
60
58
 
61
- } ).setLayout( {
62
- name: 'applyIorToRoughness',
63
- type: 'float',
64
- inputs: [
65
- { name: 'roughness', type: 'float' },
66
- { name: 'ior', type: 'float' }
67
- ]
68
- } );
59
+ }, { roughness: 'float', ior: 'float', return: 'float' } );
69
60
 
70
61
  const viewportBackSideTexture = /*@__PURE__*/ viewportMipTexture();
71
62
  const viewportFrontSideTexture = /*@__PURE__*/ viewportOpaqueMipTexture();
@@ -98,15 +89,7 @@ const volumeAttenuation = /*@__PURE__*/ Fn( ( [ transmissionDistance, attenuatio
98
89
  // Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all.
99
90
  return vec3( 1.0 );
100
91
 
101
- } ).setLayout( {
102
- name: 'volumeAttenuation',
103
- type: 'vec3',
104
- inputs: [
105
- { name: 'transmissionDistance', type: 'float' },
106
- { name: 'attenuationColor', type: 'vec3' },
107
- { name: 'attenuationDistance', type: 'float' }
108
- ]
109
- } );
92
+ }, { transmissionDistance: 'float', attenuationColor: 'vec3', attenuationDistance: 'float', return: 'vec3' } );
110
93
 
111
94
  const getIBLVolumeRefraction = /*@__PURE__*/ Fn( ( [ n, v, roughness, diffuseColor, specularColor, specularF90, position, modelMatrix, viewMatrix, projMatrix, ior, thickness, attenuationColor, attenuationDistance, dispersion ] ) => {
112
95
 
@@ -294,16 +277,13 @@ const evalIridescence = /*@__PURE__*/ Fn( ( { outsideIOR, eta2, cosTheta1, thinF
294
277
  // Since out of gamut colors might be produced, negative color values are clamped to 0.
295
278
  return I.max( vec3( 0.0 ) );
296
279
 
297
- } ).setLayout( {
298
- name: 'evalIridescence',
299
- type: 'vec3',
300
- inputs: [
301
- { name: 'outsideIOR', type: 'float' },
302
- { name: 'eta2', type: 'float' },
303
- { name: 'cosTheta1', type: 'float' },
304
- { name: 'thinFilmThickness', type: 'float' },
305
- { name: 'baseF0', type: 'vec3' }
306
- ]
280
+ }, {
281
+ outsideIOR: 'float',
282
+ eta2: 'float',
283
+ cosTheta1: 'float',
284
+ thinFilmThickness: 'float',
285
+ baseF0: 'vec3',
286
+ return: 'vec3'
307
287
  } );
308
288
 
309
289
  //
@@ -325,7 +305,7 @@ const IBLSheenBRDF = /*@__PURE__*/ Fn( ( { normal, viewDir, roughness } ) => {
325
305
 
326
306
  return DG.saturate();
327
307
 
328
- } );
308
+ }, { normal: 'vec3', viewDir: 'vec3', roughness: 'float', return: 'float' } );
329
309
 
330
310
  const clearcoatF0 = vec3( 0.04 );
331
311
  const clearcoatF90 = float( 1 );
@@ -348,8 +328,9 @@ class PhysicalLightingModel extends LightingModel {
348
328
  * @param {boolean} [transmission=false] - Whether transmission is supported or not.
349
329
  * @param {boolean} [dispersion=false] - Whether dispersion is supported or not.
350
330
  * @param {boolean} [retroreflection=false] - Whether retroreflection is supported or not.
331
+ * @param {boolean} [diffuseRoughness=false] - Whether EON rough diffuse reflection is supported or not.
351
332
  */
352
- constructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false, retroreflection = false ) {
333
+ constructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false, retroreflection = false, diffuseRoughness = false ) {
353
334
 
354
335
  super();
355
336
 
@@ -409,6 +390,14 @@ class PhysicalLightingModel extends LightingModel {
409
390
  */
410
391
  this.retroreflection = retroreflection;
411
392
 
393
+ /**
394
+ * Whether EON rough diffuse reflection is supported or not.
395
+ *
396
+ * @type {boolean}
397
+ * @default false
398
+ */
399
+ this.diffuseRoughness = diffuseRoughness;
400
+
412
401
  /**
413
402
  * The clear coat radiance.
414
403
  *
@@ -481,6 +470,14 @@ class PhysicalLightingModel extends LightingModel {
481
470
  */
482
471
  this.dfg = null;
483
472
 
473
+ /**
474
+ * The EON directional albedo, shared by the indirect lighting paths.
475
+ *
476
+ * @type {?Node}
477
+ * @default null
478
+ */
479
+ this.eonDirectionalAlbedo = null;
480
+
484
481
  /**
485
482
  * The multi-scattering energy compensation for direct lighting.
486
483
  *
@@ -489,6 +486,22 @@ class PhysicalLightingModel extends LightingModel {
489
486
  */
490
487
  this.multiScatteringCompensation = null;
491
488
 
489
+ /**
490
+ * The dielectric single-scattering term, shared by the indirect lighting paths.
491
+ *
492
+ * @type {?Node}
493
+ * @default null
494
+ */
495
+ this.singleScatteringDielectric = null;
496
+
497
+ /**
498
+ * The dielectric multi-scattering term, shared by the indirect lighting paths.
499
+ *
500
+ * @type {?Node}
501
+ * @default null
502
+ */
503
+ this.multiScatteringDielectric = null;
504
+
492
505
  }
493
506
 
494
507
  /**
@@ -588,6 +601,17 @@ class PhysicalLightingModel extends LightingModel {
588
601
  // Compensate for the energy lost to multiple scattering, tinting the added term by F0 ( equation 16 )
589
602
  this.multiScatteringCompensation = specularColorBlended.mul( Ess.reciprocal().sub( 1.0 ) ).add( 1.0 ).toConst( 'multiScatteringCompensation' );
590
603
 
604
+ this.singleScatteringDielectric = vec3().toVar( 'singleScatteringDielectric' );
605
+ this.multiScatteringDielectric = vec3().toVar( 'multiScatteringDielectric' );
606
+
607
+ this.computeMultiscattering( this.singleScatteringDielectric, this.multiScatteringDielectric, specularF90, specularColor, this.iridescenceF0Dielectric );
608
+
609
+ if ( this.diffuseRoughness === true ) {
610
+
611
+ this.eonDirectionalAlbedo = EON_DirectionalAlbedo( { diffuseColor: diffuseColor.rgb, roughness: diffuseRoughness, dotNV: dotNV } );
612
+
613
+ }
614
+
591
615
  super.start( builder );
592
616
 
593
617
  }
@@ -653,7 +677,7 @@ class PhysicalLightingModel extends LightingModel {
653
677
  const dotVH = positionViewDirection.dot( halfDir ).clamp();
654
678
  let F = F_Schlick( { f0: specularColor, f90: specularF90, dotVH } );
655
679
 
656
- let specularBRDF = BRDF_GGX( { lightDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } );
680
+ let specularBRDF = BRDF_GGX( { lightDirection, f0: specularColorBlended, f90: specularF90, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } );
657
681
 
658
682
  if ( this.retroreflection === true ) {
659
683
 
@@ -663,14 +687,18 @@ class PhysicalLightingModel extends LightingModel {
663
687
  const retroHalfDir = lightDirection.add( retroViewDirection ).normalize();
664
688
  const dotRetroVH = retroViewDirection.dot( retroHalfDir ).clamp();
665
689
  const retroF = F_Schlick( { f0: specularColor, f90: specularF90, dotVH: dotRetroVH } );
666
- const retroSpecularBRDF = BRDF_GGX( { lightDirection, viewDirection: retroViewDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } );
690
+ const retroSpecularBRDF = BRDF_GGX( { lightDirection, viewDirection: retroViewDirection, f0: specularColorBlended, f90: specularF90, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } );
667
691
 
668
692
  F = mix( F, retroF, retroreflectivity.clamp() );
669
693
  specularBRDF = mix( specularBRDF, retroSpecularBRDF, retroreflectivity.clamp() );
670
694
 
671
695
  }
672
696
 
673
- reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).mul( F.oneMinus() ) );
697
+ const diffuseBRDF = this.diffuseRoughness
698
+ ? BRDF_EON( { lightDirection, diffuseColor: diffuseColor.rgb, roughness: diffuseRoughness } ).mul( metalness.oneMinus() )
699
+ : BRDF_Lambert( { diffuseColor: diffuseContribution } );
700
+
701
+ reflectedLight.directDiffuse.addAssign( irradiance.mul( diffuseBRDF ).mul( F.oneMinus() ) );
674
702
 
675
703
  reflectedLight.directSpecular.addAssign( irradiance.mul( specularBRDF ).mul( this.multiScatteringCompensation ) );
676
704
 
@@ -760,12 +788,14 @@ class PhysicalLightingModel extends LightingModel {
760
788
  const { irradiance, reflectedLight } = builder.context;
761
789
 
762
790
  // Energy reflected by the specular lobe is not available to the diffuse layer
763
- const singleScattering = vec3().toVar();
764
- const multiScattering = vec3().toVar();
791
+ const singleScattering = this.singleScatteringDielectric;
792
+ const multiScattering = this.multiScatteringDielectric;
765
793
 
766
- this.computeMultiscattering( singleScattering, multiScattering, specularF90, specularColor, this.iridescenceF0Dielectric );
794
+ const diffuseBRDF = this.diffuseRoughness
795
+ ? this.eonDirectionalAlbedo.mul( metalness.oneMinus(), 1 / Math.PI )
796
+ : BRDF_Lambert( { diffuseColor: diffuseContribution } );
767
797
 
768
- const diffuse = irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).mul( singleScattering.add( multiScattering ).oneMinus() ).toVar();
798
+ const diffuse = irradiance.mul( diffuseBRDF ).mul( singleScattering.add( multiScattering ).oneMinus() ).toVar();
769
799
 
770
800
  if ( this.sheen === true ) {
771
801
 
@@ -824,12 +854,11 @@ class PhysicalLightingModel extends LightingModel {
824
854
  // Both indirect specular and indirect diffuse light accumulate here
825
855
  // Compute multiscattering separately for dielectric and metallic, then mix
826
856
 
827
- const singleScatteringDielectric = vec3().toVar( 'singleScatteringDielectric' );
828
- const multiScatteringDielectric = vec3().toVar( 'multiScatteringDielectric' );
857
+ const singleScatteringDielectric = this.singleScatteringDielectric;
858
+ const multiScatteringDielectric = this.multiScatteringDielectric;
829
859
  const singleScatteringMetallic = vec3().toVar( 'singleScatteringMetallic' );
830
860
  const multiScatteringMetallic = vec3().toVar( 'multiScatteringMetallic' );
831
861
 
832
- this.computeMultiscattering( singleScatteringDielectric, multiScatteringDielectric, specularF90, specularColor, this.iridescenceF0Dielectric );
833
862
  this.computeMultiscattering( singleScatteringMetallic, multiScatteringMetallic, specularF90, diffuseColor.rgb, this.iridescenceF0Metallic );
834
863
 
835
864
  // Mix based on metalness
@@ -839,7 +868,11 @@ class PhysicalLightingModel extends LightingModel {
839
868
  // Diffuse energy conservation uses dielectric path
840
869
  const totalScatteringDielectric = singleScatteringDielectric.add( multiScatteringDielectric );
841
870
 
842
- const diffuse = diffuseContribution.mul( totalScatteringDielectric.oneMinus() );
871
+ const diffuseAlbedo = this.diffuseRoughness
872
+ ? this.eonDirectionalAlbedo.mul( metalness.oneMinus() )
873
+ : diffuseContribution;
874
+
875
+ const diffuse = diffuseAlbedo.mul( totalScatteringDielectric.oneMinus() );
843
876
 
844
877
  const cosineWeightedIrradiance = iblIrradiance.mul( 1 / Math.PI );
845
878
 
@@ -9,7 +9,7 @@ import { modelRadius } from '../accessors/ModelNode.js';
9
9
  import { LTC_Evaluate_Volume } from './BSDF/LTC.js';
10
10
 
11
11
  const scatteringDensity = property( 'vec3' );
12
- const linearDepthRay = property( 'vec3' );
12
+ const linearDepthRay = property( 'float' ); // always assigned a scalar (see `start()`) - not a per-channel value
13
13
  const outgoingRayLight = property( 'vec3' );
14
14
 
15
15
  /**
@@ -8,13 +8,13 @@ const hash2D = /*@__PURE__*/ Fn( ( [ value ] ) => {
8
8
 
9
9
  return fract( mul( 1.0e4, sin( mul( 17.0, value.x ).add( mul( 0.1, value.y ) ) ) ).mul( add( 0.1, abs( sin( mul( 13.0, value.y ).add( value.x ) ) ) ) ) );
10
10
 
11
- } );
11
+ }, { value: 'vec2', return: 'float' } );
12
12
 
13
13
  const hash3D = /*@__PURE__*/ Fn( ( [ value ] ) => {
14
14
 
15
15
  return hash2D( vec2( hash2D( value.xy ), value.z ) );
16
16
 
17
- } );
17
+ }, { value: 'vec3', return: 'float' } );
18
18
 
19
19
  const getAlphaHashThreshold = /*@__PURE__*/ Fn( ( [ position ] ) => {
20
20
 
@@ -57,12 +57,6 @@ const getAlphaHashThreshold = /*@__PURE__*/ Fn( ( [ position ] ) => {
57
57
  // Avoids ατ == 0. Could also do ατ =1-ατ
58
58
  return clamp( threshold, 1.0e-6, 1.0 );
59
59
 
60
- } ).setLayout( {
61
- name: 'getAlphaHashThreshold',
62
- type: 'float',
63
- inputs: [
64
- { name: 'position', type: 'vec3' }
65
- ]
66
- } );
60
+ }, { position: 'vec3', return: 'float' } );
67
61
 
68
62
  export default getAlphaHashThreshold;
@@ -1,5 +1,5 @@
1
1
  import { positionWorld } from '../../accessors/Position.js';
2
- import { float, Fn, min, normalize, vec3 } from '../../tsl/TSLBase.js';
2
+ import { Fn, min, normalize, EPSILON } from '../../tsl/TSLBase.js';
3
3
 
4
4
  /**
5
5
  * This computes a parallax corrected normal which is used for box-projected cube mapping (BPCEM).
@@ -20,17 +20,16 @@ import { float, Fn, min, normalize, vec3 } from '../../tsl/TSLBase.js';
20
20
  */
21
21
  const getParallaxCorrectNormal = /*@__PURE__*/ Fn( ( [ normal, cubeSize, cubePos ] ) => {
22
22
 
23
- const nDir = normalize( normal ).toVar();
24
- const rbmax = cubeSize.mul( 0.5 ).add( cubePos ).sub( positionWorld ).div( nDir ).toVar();
25
- const rbmin = cubeSize.mul( - 0.5 ).add( cubePos ).sub( positionWorld ).div( nDir ).toVar();
26
- const rbminmax = vec3().toVar();
27
- rbminmax.x = nDir.x.greaterThan( float( 0 ) ).select( rbmax.x, rbmin.x );
28
- rbminmax.y = nDir.y.greaterThan( float( 0 ) ).select( rbmax.y, rbmin.y );
29
- rbminmax.z = nDir.z.greaterThan( float( 0 ) ).select( rbmax.z, rbmin.z );
23
+ const nDir = normalize( normal ).toConst();
24
+ const positive = nDir.greaterThanEqual( 0 );
30
25
 
31
- const correction = min( rbminmax.x, rbminmax.y, rbminmax.z ).toVar();
32
- const boxIntersection = positionWorld.add( nDir.mul( correction ) ).toVar();
33
- return boxIntersection.sub( cubePos );
26
+ // keep axis-aligned directions away from zero so the distances stay finite
27
+ const safeDir = positive.select( nDir.max( EPSILON ), nDir.min( EPSILON.negate() ) );
28
+ const extent = cubeSize.mul( 0.5 ).toConst();
29
+ const distances = positive.select( extent, extent.negate() ).add( cubePos ).sub( positionWorld ).div( safeDir ).toConst();
30
+
31
+ const correction = min( distances.x, distances.y, distances.z ).toConst();
32
+ return positionWorld.add( nDir.mul( correction ) ).sub( cubePos );
34
33
 
35
34
  } );
36
35
 
@@ -7,7 +7,9 @@ const getRoughness = /*@__PURE__*/ Fn( ( inputs ) => {
7
7
 
8
8
  const geometryRoughness = getGeometryRoughness();
9
9
 
10
- let roughnessFactor = roughness.max( 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.
10
+ // Minimum roughness, so even a perfect mirror samples a prefiltered level of the environment map.
11
+ // Matches Filament's desktop MIN_PERCEPTUAL_ROUGHNESS: https://github.com/google/filament/blob/main/shaders/src/surface_material.fs
12
+ let roughnessFactor = roughness.max( 0.045 );
11
13
  roughnessFactor = roughnessFactor.add( geometryRoughness );
12
14
  roughnessFactor = roughnessFactor.min( 1.0 );
13
15