@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
@@ -23,7 +23,7 @@ const hitBox = /*@__PURE__*/ Fn( ( { orig, dir } ) => {
23
23
 
24
24
  return vec2( t0, t1 );
25
25
 
26
- } );
26
+ }, { orig: 'vec3', dir: 'vec3', return: 'vec2' } );
27
27
 
28
28
  /**
29
29
  * TSL function for performing raymarching in a box-area using the specified number of steps
@@ -12,26 +12,19 @@ import { Fn, float, positionView, viewportDepthTexture, perspectiveDepthToViewZ,
12
12
  * @tsl
13
13
  * @function
14
14
  * @private
15
- * @param {Node<float>} input - The value to remap, expected in the `[0, 1]` range.
15
+ * @param {Node<float>} value - The value to remap, expected in the `[0, 1]` range.
16
16
  * @param {Node<float>} power - The contrast power. `1` is linear, higher values sharpen the transition.
17
17
  * @return {Node<float>} The remapped value.
18
18
  */
19
- const contrastCurve = /*@__PURE__*/ Fn( ( [ input, power ] ) => {
19
+ const contrastCurve = /*@__PURE__*/ Fn( ( [ value, power ] ) => {
20
20
 
21
- const aboveHalf = input.greaterThan( 0.5 ).toConst();
22
- const folded = aboveHalf.select( input.oneMinus(), input ).toConst();
21
+ const aboveHalf = value.greaterThan( 0.5 ).toConst();
22
+ const folded = aboveHalf.select( value.oneMinus(), value ).toConst();
23
23
  const output = folded.mul( 2 ).saturate().pow( power ).mul( 0.5 ).toConst();
24
24
 
25
25
  return aboveHalf.select( output.oneMinus(), output );
26
26
 
27
- } ).setLayout( {
28
- name: 'contrastCurve',
29
- type: 'float',
30
- inputs: [
31
- { name: 'input', type: 'float' },
32
- { name: 'power', type: 'float' }
33
- ]
34
- } );
27
+ }, { value: 'float', power: 'float', return: 'float' } );
35
28
 
36
29
  /**
37
30
  * Computes an opacity node for soft particles, based on the "Soft Particles" white
@@ -1,4 +1,4 @@
1
- import { Fn, If, PI, clamp, cos, cross, dot, equirectUV, float, log, max, mix, normalize, pow, reflect, sin, sqrt, struct, vec3 } from 'three/tsl';
1
+ import { EPSILON, Fn, If, PI, clamp, cos, cross, dot, equirectUV, float, log, max, mix, normalize, pow, reflect, sin, sqrt, struct, vec3 } from 'three/tsl';
2
2
 
3
3
  /**
4
4
  * Specular / microfacet BRDF helpers: VNDF sampling, GTR distribution, Smith geometry,
@@ -57,15 +57,12 @@ const SampleGGXVNDF = Fn( ( [ V, ax, ay, r1, r2 ] ) => {
57
57
  return Ne;
58
58
 
59
59
  }, {
60
- name: 'SampleGGXVNDF',
61
- type: 'vec3',
62
- inputs: [
63
- { name: 'V', type: 'vec3' },
64
- { name: 'ax', type: 'float' },
65
- { name: 'ay', type: 'float' },
66
- { name: 'r1', type: 'float' },
67
- { name: 'r2', type: 'float' },
68
- ]
60
+ V: 'vec3',
61
+ ax: 'float',
62
+ ay: 'float',
63
+ r1: 'float',
64
+ r2: 'float',
65
+ return: 'vec3'
69
66
  } );
70
67
 
71
68
  // Generalized Trowbridge-Reitz (GTR). For GGX set k=2.
@@ -79,7 +76,7 @@ export const D_GTR = Fn( ( [ roughness, NoH, k ] ) => {
79
76
  // a² / (π * base^k)
80
77
  return a2.div( PI.mul( pow( base, k ) ) ).toVar(); // float
81
78
 
82
- } );
79
+ }, { roughness: 'float', NoH: 'float', k: 'float', return: 'float' } );
83
80
 
84
81
  // Smith G1 (Heitz): expects alpha (not squared); it squares internally
85
82
  export const SmithG = Fn( ( [ NDotX, alpha ] ) => {
@@ -94,7 +91,7 @@ export const SmithG = Fn( ( [ NDotX, alpha ] ) => {
94
91
  ) )
95
92
  );
96
93
 
97
- } );
94
+ }, { NDotX: 'float', alpha: 'float', return: 'float' } );
98
95
 
99
96
  // Geometry term G = G1(N·L, α_G) * G1(N·V, α_G) (α_G is NOT squared here)
100
97
  export const GeometryTerm = Fn( ( [ NoL, NoV, alphaG ] ) => {
@@ -103,7 +100,7 @@ export const GeometryTerm = Fn( ( [ NoL, NoV, alphaG ] ) => {
103
100
  const G1l = SmithG( NoL, alphaG ).toVar();
104
101
  return G1v.mul( G1l ).toVar();
105
102
 
106
- } );
103
+ }, { NoL: 'float', NoV: 'float', alphaG: 'float', return: 'float' } );
107
104
 
108
105
  // Bounded VNDF direction PDF (reflection mapping), matching SampleGGXVNDF above.
109
106
  // p(L) = D_GTR(roughness, NoH, 2) / ( 2 * (k * N·V + t) ) (Eto & Tokuyoshi eq. 8)
@@ -117,21 +114,21 @@ const GGXVNDFPdf = Fn( ( [ NoH, NoV, roughness ] ) => {
117
114
  const s2 = s.mul( s ).toVar();
118
115
  const k = float( 1.0 ).sub( a2 ).mul( s2 ).div( s2.add( a2.mul( NoV ).mul( NoV ) ) ).toVar();
119
116
  const t = sqrt( a2.mul( sinV2 ).add( NoV.mul( NoV ) ) ).toVar();
120
- return D.div( max( float( 1e-6 ), float( 2.0 ).mul( k.mul( NoV ).add( t ) ) ) ).toVar();
117
+ return D.div( max( float( EPSILON ), float( 2.0 ).mul( k.mul( NoV ).add( t ) ) ) ).toVar();
121
118
 
122
- } );
119
+ }, { NoH: 'float', NoV: 'float', roughness: 'float', return: 'float' } );
123
120
 
124
121
  /**
125
122
  * Fresnel reflectance for the Schlick approximation.
126
123
  */
127
- export const F_Schlick = Fn( ( [ f0, theta ] ) => {
124
+ export const F_Schlick = Fn( ( [ f0, theta, f90 = float( 1 ) ] ) => {
128
125
 
129
126
  const oneMinus = float( 1.0 ).sub( theta ).toVar();
130
127
  const oneMinus2 = oneMinus.mul( oneMinus ).toVar();
131
128
  const oneMinus5 = oneMinus2.mul( oneMinus2 ).mul( oneMinus ).toVar();
132
- return f0.add( vec3( 1.0 ).sub( f0 ).mul( oneMinus5 ) ).toVar(); // vec3
129
+ return f0.add( vec3( f90 ).sub( f0 ).mul( oneMinus5 ) ).toVar(); // vec3
133
130
 
134
- } );
131
+ }, { f0: 'vec3', theta: 'float', f90: 'float', return: 'vec3' } );
135
132
 
136
133
  /**
137
134
  * Specular dominant factor for parallax-corrected ray length.
@@ -147,14 +144,7 @@ export const getSpecularDominantFactor = Fn( ( [ NoV, roughness ] ) => {
147
144
  .add( a );
148
145
  return clamp( f );
149
146
 
150
- } ).setLayout( {
151
- name: 'getSpecularDominantFactor',
152
- type: 'float',
153
- inputs: [
154
- { name: 'NoV', type: 'float' },
155
- { name: 'roughness', type: 'float' }
156
- ]
157
- } );
147
+ }, { NoV: 'float', roughness: 'float', return: 'float' } );
158
148
 
159
149
  /**
160
150
  * Everything a single GGX reflection sample produces. `reflectDir` and `sampleWeight`
@@ -167,23 +157,12 @@ const ggxReflectionStruct = struct( {
167
157
  pdf: 'float', // VNDF direction pdf (for MIS against the env CDF)
168
158
  NdotV: 'float',
169
159
  alpha: 'float', // GGX alpha (roughness²), clamped
160
+ f90: 'float',
170
161
  f0: 'vec3' // Fresnel reflectance at normal incidence
171
162
  } );
172
163
 
173
- /**
174
- * Importance-samples the GGX/VNDF specular lobe for one pixel and returns the reflected
175
- * ray direction plus the Monte-Carlo weight to apply to the gathered radiance, along with
176
- * the GGX terms the SSR env-miss MIS fallback needs.
177
- *
178
- * @param {Node<vec3>} N - View-space shading normal (normalized).
179
- * @param {Node<vec3>} V - View-space surface→camera direction (normalized).
180
- * @param {Node<float>} roughness - Perceptual roughness in `[0,1]`.
181
- * @param {Node<float>} metalness - Metalness in `[0,1]`.
182
- * @param {Node<vec3>} albedo - Surface base color; tints the metal Fresnel reflectance (`f0`).
183
- * @param {Node<vec4>} Xi - Per-pixel random numbers; only `.xy` are used.
184
- * @return {ggxReflectionStruct}
185
- */
186
- export const ggxReflectionSample = Fn( ( [ N, V, roughness, metalness, albedo, Xi ] ) => {
164
+ // Core of `ggxReflectionSample()` with explicit F0/F90.
165
+ const ggxReflectionSampleWithReflectance = Fn( ( [ N, V, roughness, f0, f90, Xi ] ) => {
187
166
 
188
167
  // GGX alpha (use r^2, clamp to avoid degenerate)
189
168
  const a = roughness.mul( roughness ).max( 0.001 ).toVar();
@@ -191,14 +170,8 @@ export const ggxReflectionSample = Fn( ( [ N, V, roughness, metalness, albedo, X
191
170
  const ay = a.toVar();
192
171
 
193
172
  // TBN from view-space normal
194
- const up = vec3( 0, 0, 1 );
195
- let T = cross( up, N ).toVar();
196
- T = T.normalize().toVar();
197
- If( T.length().lessThan( 1e-3 ), () => {
198
-
199
- T.assign( cross( vec3( 0, 1, 0 ), N ).normalize() );
200
-
201
- } );
173
+ const up = N.z.abs().lessThan( 0.999 ).select( vec3( 0, 0, 1 ), vec3( 1, 0, 0 ) );
174
+ const T = cross( up, N ).normalize().toVar();
202
175
  const B = cross( N, T ).normalize().toVar();
203
176
 
204
177
  // transform V to LOCAL frame (N = +Z)
@@ -228,10 +201,9 @@ export const ggxReflectionSample = Fn( ( [ N, V, roughness, metalness, albedo, X
228
201
  const NdotH = max( float( 0.0 ), dot( N, H ) ).toVar();
229
202
  const VdotH = max( float( 0.0 ), dot( V, H ) ).toVar();
230
203
 
231
- const f0 = mix( vec3( 0.04 ), albedo, metalness ).toVar();
232
204
  // Chromatic Fresnel reflectance: for metals f0 = albedo, so the reflection is tinted and desaturates
233
205
  // toward white at grazing angles. Kept as vec3 so colored metals reflect with the correct chroma.
234
- const fresnelWeight = F_Schlick( f0, VdotH ).toVar(); // vec3
206
+ const fresnelWeight = F_Schlick( f0, VdotH, f90 ).toVar(); // vec3
235
207
 
236
208
  // Bounded-VNDF direction pdf — still needed for the env-miss MIS path.
237
209
  const pdf = GGXVNDFPdf( NdotH, NdotV, ax ).toVar();
@@ -251,10 +223,30 @@ export const ggxReflectionSample = Fn( ( [ N, V, roughness, metalness, albedo, X
251
223
  .mul( kB.mul( NdotV ).add( tB ) )
252
224
  .div( float( 2.0 ).mul( NdotV ).max( 1e-4 ) ).toVar();
253
225
 
254
- return ggxReflectionStruct( viewReflectDir, glossyWeight, pdf, NdotV, ax, f0 );
226
+ return ggxReflectionStruct( viewReflectDir, glossyWeight, pdf, NdotV, ax, f90, f0 );
255
227
 
256
228
  } );
257
229
 
230
+ /**
231
+ * Importance-samples the GGX/VNDF specular lobe for one pixel and returns the reflected
232
+ * ray direction plus the Monte-Carlo weight to apply to the gathered radiance, along with
233
+ * the GGX terms the SSR env-miss MIS fallback needs.
234
+ *
235
+ * @tsl
236
+ * @param {Node<vec3>} N - View-space shading normal (normalized).
237
+ * @param {Node<vec3>} V - View-space surface→camera direction (normalized).
238
+ * @param {Node<float>} roughness - Perceptual roughness in `[0,1]`.
239
+ * @param {Node<float>} metalness - Metalness in `[0,1]`; only used when `f0` is omitted.
240
+ * @param {Node<vec3>} albedo - Surface base color; tints the metal F0 when `f0` is omitted.
241
+ * @param {Node<vec4>} Xi - Per-pixel random numbers; only `.xy` are used.
242
+ * @param {?Node<vec3>} [f0=null] - Normal-incidence reflectance. Defaults to `mix( 0.04, albedo, metalness )`.
243
+ * @param {Node<float>|number} [f90=1] - Grazing reflectance.
244
+ * @return {ggxReflectionStruct}
245
+ */
246
+ export const ggxReflectionSample = ( N, V, roughness, metalness, albedo, Xi, f0 = null, f90 = 1 ) =>
247
+
248
+ ggxReflectionSampleWithReflectance( N, V, roughness, f0 ?? mix( vec3( 0.04 ), albedo, metalness ), float( f90 ), Xi );
249
+
258
250
  // Equirectangular environment sampling
259
251
 
260
252
  /**
@@ -279,27 +271,19 @@ export const equirectUvToDir = Fn( ( [ uvIn ] ) => {
279
271
  cosLat.mul( sin( phi ) )
280
272
  ) );
281
273
 
282
- } ).setLayout( {
283
- name: 'equirectUvToDir',
284
- type: 'vec3',
285
- inputs: [ { name: 'uv', type: 'vec2' } ]
286
- } );
274
+ }, { uv: 'vec2', return: 'vec3' } );
287
275
 
288
276
  // Solid-angle PDF of a direction under equirectangular parameterization.
289
277
  export const equirectDirPdf = Fn( ( [ direction ] ) => {
290
278
 
291
279
  const uvDir = equirectUV( direction );
292
280
  const sinTheta = sin( uvDir.y.mul( Math.PI ) );
293
- return sinTheta.abs().lessThan( float( 1e-6 ) ).select(
281
+ return sinTheta.abs().lessThan( float( EPSILON ) ).select(
294
282
  float( 0 ),
295
283
  float( 1 ).div( float( 2 * Math.PI * Math.PI ).mul( sinTheta ) )
296
284
  );
297
285
 
298
- } ).setLayout( {
299
- name: 'equirectDirPdf',
300
- type: 'float',
301
- inputs: [ { name: 'direction', type: 'vec3' } ]
302
- } );
286
+ }, { direction: 'vec3', return: 'float' } );
303
287
 
304
288
  /**
305
289
  * MIS power heuristic with β = 2: `pdfA² / (pdfA² + pdfB²)`.
@@ -314,12 +298,5 @@ export const misPowerHeuristic = Fn( ( [ pdfA, pdfB ] ) => {
314
298
  const pdfBSq = pdfB.mul( pdfB );
315
299
  return pdfASq.div( pdfASq.add( pdfBSq ) );
316
300
 
317
- } ).setLayout( {
318
- name: 'misPowerHeuristic',
319
- type: 'float',
320
- inputs: [
321
- { name: 'pdfA', type: 'float' },
322
- { name: 'pdfB', type: 'float' }
323
- ]
324
- } );
301
+ }, { pdfA: 'float', pdfB: 'float', return: 'float' } );
325
302
 
@@ -27,15 +27,12 @@ export const clipAABB = Fn( ( [ currentColor, historyColor, minColor, maxColor ]
27
27
  historyColor
28
28
  );
29
29
 
30
- } ).setLayout( {
31
- name: 'clipAABB',
32
- type: 'vec4',
33
- inputs: [
34
- { name: 'currentColor', type: 'vec4' },
35
- { name: 'historyColor', type: 'vec4' },
36
- { name: 'minColor', type: 'vec4' },
37
- { name: 'maxColor', type: 'vec4' }
38
- ]
30
+ }, {
31
+ currentColor: 'vec4',
32
+ historyColor: 'vec4',
33
+ minColor: 'vec4',
34
+ maxColor: 'vec4',
35
+ return: 'vec4'
39
36
  } );
40
37
 
41
38
  /**
@@ -62,14 +59,6 @@ export const flickerReduction = Fn( ( [ currentColor, historyColor, currentWeigh
62
59
 
63
60
  return add( currentColor.mul( weightCurrent ), historyColor.mul( weightHistory ) ).div( max( weightCurrent.add( weightHistory ), 0.00001 ) );
64
61
 
65
- } ).setLayout( {
66
- name: 'flickerReduction',
67
- type: 'vec4',
68
- inputs: [
69
- { name: 'currentColor', type: 'vec4' },
70
- { name: 'historyColor', type: 'vec4' },
71
- { name: 'currentWeight', type: 'float' }
72
- ]
73
62
  } );
74
63
 
75
64
  /**
@@ -5,6 +5,7 @@ import {
5
5
  InstancedBufferAttribute,
6
6
  InterleavedBuffer,
7
7
  InterleavedBufferAttribute,
8
+ MathUtils,
8
9
  TriangleFanDrawMode,
9
10
  TriangleStripDrawMode,
10
11
  TrianglesDrawMode,
@@ -27,10 +28,11 @@ import {
27
28
  * custom material, and may be faster than MikkTSpace.
28
29
  *
29
30
  * Returns the original BufferGeometry. Indexed geometries will be de-indexed. Requires position, normal, and uv attributes.
31
+ * Tangents are stored like the normals: normalized Int8 or Int16 when the normals are, Float32 otherwise.
30
32
  *
31
33
  * @param {BufferGeometry} geometry - The geometry to compute tangents for.
32
34
  * @param {Object} MikkTSpace - Instance of `examples/jsm/libs/mikktspace.module.js`, or `mikktspace` npm package.
33
- * Await `MikkTSpace.ready` before use.
35
+ * The bundled JavaScript implementation is ready immediately. Await `MikkTSpace.ready` before using a WebAssembly implementation.
34
36
  * @param {boolean} [negateSign=true] - Whether to negate the sign component (.w) of each tangent.
35
37
  * Required for normal map conventions in some formats, including glTF.
36
38
  * @return {BufferGeometry} The updated geometry.
@@ -111,7 +113,28 @@ function computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {
111
113
 
112
114
  //
113
115
 
114
- _geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );
116
+ // Quantized normals get tangents of the same precision.
117
+
118
+ const normal = _geometry.attributes.normal;
119
+ const normalArray = normal.array;
120
+
121
+ if ( normal.normalized && ( normalArray instanceof Int8Array || normalArray instanceof Int16Array ) ) {
122
+
123
+ const quantized = new normalArray.constructor( tangents.length );
124
+
125
+ for ( let i = 0; i < tangents.length; i ++ ) {
126
+
127
+ quantized[ i ] = MathUtils.normalize( tangents[ i ], quantized );
128
+
129
+ }
130
+
131
+ _geometry.setAttribute( 'tangent', new BufferAttribute( quantized, 4, true ) );
132
+
133
+ } else {
134
+
135
+ _geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );
136
+
137
+ }
115
138
 
116
139
  if ( geometry !== _geometry ) {
117
140
 
@@ -143,6 +166,7 @@ function mergeGeometries( geometries, useGroups = false ) {
143
166
  const morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;
144
167
 
145
168
  const mergedGeometry = new BufferGeometry();
169
+ mergedGeometry.morphTargetsRelative = morphTargetsRelative;
146
170
 
147
171
  let offset = 0;
148
172
 
@@ -150,6 +174,7 @@ function mergeGeometries( geometries, useGroups = false ) {
150
174
 
151
175
  const geometry = geometries[ i ];
152
176
  let attributesCount = 0;
177
+ let morphAttributesCount = 0;
153
178
 
154
179
  // ensure that all geometries are indexed, or none
155
180
 
@@ -206,10 +231,28 @@ function mergeGeometries( geometries, useGroups = false ) {
206
231
 
207
232
  }
208
233
 
234
+ if ( geometry.morphAttributes[ name ].length !== geometries[ 0 ].morphAttributes[ name ].length ) {
235
+
236
+ console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have the same number of morph targets for the "' + name + '" morph attribute.' );
237
+ return null;
238
+
239
+ }
240
+
209
241
  if ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];
210
242
 
211
243
  morphAttributes[ name ].push( geometry.morphAttributes[ name ] );
212
244
 
245
+ morphAttributesCount ++;
246
+
247
+ }
248
+
249
+ // ensure geometries have the same number of morph attributes
250
+
251
+ if ( morphAttributesCount !== morphAttributesUsed.size ) {
252
+
253
+ console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of morph attributes.' );
254
+ return null;
255
+
213
256
  }
214
257
 
215
258
  if ( useGroups ) {
@@ -569,7 +612,7 @@ function deinterleaveAttribute( attribute ) {
569
612
  function deinterleaveGeometry( geometry ) {
570
613
 
571
614
  const attributes = geometry.attributes;
572
- const morphTargets = geometry.morphTargets;
615
+ const morphAttributes = geometry.morphAttributes;
573
616
  const attrMap = new Map();
574
617
 
575
618
  for ( const key in attributes ) {
@@ -589,18 +632,24 @@ function deinterleaveGeometry( geometry ) {
589
632
 
590
633
  }
591
634
 
592
- for ( const key in morphTargets ) {
635
+ for ( const key in morphAttributes ) {
593
636
 
594
- const attr = morphTargets[ key ];
595
- if ( attr.isInterleavedBufferAttribute ) {
637
+ const morphAttribute = morphAttributes[ key ];
596
638
 
597
- if ( ! attrMap.has( attr ) ) {
639
+ for ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {
598
640
 
599
- attrMap.set( attr, deinterleaveAttribute( attr ) );
641
+ const attr = morphAttribute[ i ];
642
+ if ( attr.isInterleavedBufferAttribute ) {
600
643
 
601
- }
644
+ if ( ! attrMap.has( attr ) ) {
645
+
646
+ attrMap.set( attr, deinterleaveAttribute( attr ) );
647
+
648
+ }
649
+
650
+ morphAttribute[ i ] = attrMap.get( attr );
602
651
 
603
- morphTargets[ key ] = attrMap.get( attr );
652
+ }
604
653
 
605
654
  }
606
655
 
@@ -656,39 +705,10 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
656
705
 
657
706
  // attributes and new attribute arrays
658
707
  const attributeNames = Object.keys( geometry.attributes );
659
- const tmpAttributes = {};
660
- const tmpMorphAttributes = {};
708
+ const sourceIndices = [];
709
+ const buffers = new Map();
661
710
  const newIndices = [];
662
711
  const getters = [ 'getX', 'getY', 'getZ', 'getW' ];
663
- const setters = [ 'setX', 'setY', 'setZ', 'setW' ];
664
-
665
- // Initialize the arrays, allocating space conservatively. Extra
666
- // space will be trimmed in the last step.
667
- for ( let i = 0, l = attributeNames.length; i < l; i ++ ) {
668
-
669
- const name = attributeNames[ i ];
670
- const attr = geometry.attributes[ name ];
671
-
672
- tmpAttributes[ name ] = new attr.constructor(
673
- new attr.array.constructor( attr.count * attr.itemSize ),
674
- attr.itemSize,
675
- attr.normalized
676
- );
677
-
678
- const morphAttributes = geometry.morphAttributes[ name ];
679
- if ( morphAttributes ) {
680
-
681
- if ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];
682
- morphAttributes.forEach( ( morphAttr, i ) => {
683
-
684
- const array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );
685
- tmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );
686
-
687
- } );
688
-
689
- }
690
-
691
- }
692
712
 
693
713
  // convert the error tolerance to an amount of decimal places to truncate to
694
714
  const halfTolerance = tolerance * 0.5;
@@ -724,35 +744,7 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
724
744
 
725
745
  } else {
726
746
 
727
- // copy data to the new index in the temporary attributes
728
- for ( let j = 0, l = attributeNames.length; j < l; j ++ ) {
729
-
730
- const name = attributeNames[ j ];
731
- const attribute = geometry.getAttribute( name );
732
- const morphAttributes = geometry.morphAttributes[ name ];
733
- const itemSize = attribute.itemSize;
734
- const newArray = tmpAttributes[ name ];
735
- const newMorphArrays = tmpMorphAttributes[ name ];
736
-
737
- for ( let k = 0; k < itemSize; k ++ ) {
738
-
739
- const getterFunc = getters[ k ];
740
- const setterFunc = setters[ k ];
741
- newArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );
742
-
743
- if ( morphAttributes ) {
744
-
745
- for ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {
746
-
747
- newMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );
748
-
749
- }
750
-
751
- }
752
-
753
- }
754
-
755
- }
747
+ sourceIndices.push( index );
756
748
 
757
749
  hashToIndex[ hash ] = nextIndex;
758
750
  newIndices.push( nextIndex );
@@ -766,27 +758,13 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
766
758
  const result = geometry.clone();
767
759
  for ( const name in geometry.attributes ) {
768
760
 
769
- const tmpAttribute = tmpAttributes[ name ];
770
-
771
- result.setAttribute( name, new tmpAttribute.constructor(
772
- tmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),
773
- tmpAttribute.itemSize,
774
- tmpAttribute.normalized,
775
- ) );
776
-
777
- if ( ! ( name in tmpMorphAttributes ) ) continue;
778
-
779
- for ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {
761
+ result.setAttribute( name, remapAttribute( geometry.attributes[ name ], sourceIndices, buffers ) );
780
762
 
781
- const tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];
763
+ }
782
764
 
783
- result.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(
784
- tmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),
785
- tmpMorphAttribute.itemSize,
786
- tmpMorphAttribute.normalized,
787
- );
765
+ for ( const name in geometry.morphAttributes ) {
788
766
 
789
- }
767
+ result.morphAttributes[ name ] = geometry.morphAttributes[ name ].map( attribute => remapAttribute( attribute, sourceIndices, buffers ) );
790
768
 
791
769
  }
792
770
 
@@ -1249,6 +1227,8 @@ function mergeGroups( geometry ) {
1249
1227
 
1250
1228
  const group = groups[ i ];
1251
1229
 
1230
+ if ( group.count === Infinity ) group.count = index.count - group.start;
1231
+
1252
1232
  const groupStart = group.start;
1253
1233
  const groupLength = groupStart + group.count;
1254
1234
 
@@ -1484,6 +1464,47 @@ function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */
1484
1464
 
1485
1465
  }
1486
1466
 
1467
+ /**
1468
+ * Copies attribute entries in the order specified by the source vertex indices.
1469
+ * Preserves raw values, attribute type and metadata. Reuse the same buffer map
1470
+ * across calls to preserve shared interleaved buffers for the same mapping.
1471
+ *
1472
+ * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The source attribute.
1473
+ * @param {Array<number>|TypedArray} sourceIndices - The source index for each output vertex.
1474
+ * @param {Map<InterleavedBuffer, InterleavedBuffer>} [buffers] - Shared interleaved buffer copies.
1475
+ * @return {BufferAttribute|InterleavedBufferAttribute} The remapped attribute.
1476
+ */
1477
+ function remapAttribute( attribute, sourceIndices, buffers = new Map() ) {
1478
+
1479
+ const interleaved = attribute.isInterleavedBufferAttribute;
1480
+ const source = interleaved ? attribute.data : attribute;
1481
+ const stride = interleaved ? source.stride : attribute.itemSize;
1482
+ let data = interleaved ? buffers.get( source ) : undefined;
1483
+
1484
+ if ( data === undefined ) {
1485
+
1486
+ const array = new source.array.constructor( sourceIndices.length * stride );
1487
+ for ( let i = 0; i < sourceIndices.length; i ++ ) {
1488
+
1489
+ for ( let j = 0; j < stride; j ++ ) array[ i * stride + j ] = source.array[ sourceIndices[ i ] * stride + j ];
1490
+
1491
+ }
1492
+
1493
+ data = interleaved
1494
+ ? new source.constructor( array, stride, source.meshPerAttribute )
1495
+ : new attribute.constructor( array, attribute.itemSize, attribute.normalized, attribute.meshPerAttribute );
1496
+ data.setUsage( source.usage );
1497
+ if ( interleaved ) buffers.set( source, data );
1498
+
1499
+ }
1500
+
1501
+ const result = interleaved ? new attribute.constructor( data, attribute.itemSize, attribute.offset, attribute.normalized ) : data;
1502
+ result.name = attribute.name;
1503
+ if ( ! interleaved ) result.gpuType = attribute.gpuType;
1504
+ return result;
1505
+
1506
+ }
1507
+
1487
1508
  export {
1488
1509
  computeMikkTSpaceTangents,
1489
1510
  mergeGeometries,
@@ -1494,6 +1515,7 @@ export {
1494
1515
  interleaveAttributes,
1495
1516
  estimateBytesUsed,
1496
1517
  mergeVertices,
1518
+ remapAttribute,
1497
1519
  toTrianglesDrawMode,
1498
1520
  computeMorphedAttributes,
1499
1521
  mergeGroups,