@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
@@ -1,8 +1,8 @@
1
- import { Box3, Vector3, Vector4, Matrix4, Layers, Storage3DTexture, StorageBufferAttribute, StorageTexture3DNode, CubeTextureNode, RendererUtils, HalfFloatType, UnsignedByteType, RGBAFormat, LinearFilter, LinearMipmapLinearFilter, ClampToEdgeWrapping, MathUtils } from 'three/webgpu';
2
- import { Fn, If, Loop, nodeObject, uniform, uniformArray, storage, instanceIndex, textureStore, texture3D, texture, float, int, uint, vec2, vec3, vec4, ivec3, uvec3, max, min, abs, dot, cross, normalize, floor, sign, select, countOneBits, atomicOr, smoothstep, hash, fract, sqrt, cos, sin, length, PI, getDistanceAttenuation, viewZToPerspectiveDepth, viewZToReversedPerspectiveDepth } from 'three/tsl';
1
+ import { Box3, Vector3, Vector4, Matrix4, Layers, Storage3DTexture, StorageBufferAttribute, StorageTexture3DNode, RendererUtils, HalfFloatType, UnsignedByteType, RGBAFormat, LinearFilter, LinearMipmapLinearFilter, ClampToEdgeWrapping, MathUtils } from 'three/webgpu';
2
+ import { Fn, If, Loop, uniform, uniformArray, storage, instanceIndex, textureStore, texture3D, texture, cubeTexture, float, int, uint, vec2, vec3, vec4, ivec3, uvec3, max, min, abs, dot, cross, normalize, floor, sign, select, countOneBits, atomicOr, smoothstep, hash, length, PI, getDistanceAttenuation, viewZToPerspectiveDepth, viewZToReversedPerspectiveDepth } from 'three/tsl';
3
3
 
4
- import { collectSceneTriangles, computeSceneBounds, TRIANGLE_STRIDE } from './VXGISceneCollector.js';
5
- import { createConeTracer } from './VXGIConeTracer.js';
4
+ import { collectSceneTriangles, computeSceneBounds, computeSolidVoxels, TRIANGLE_STRIDE } from './VXGISceneCollector.js';
5
+ import { createConeTracer, gather } from './VXGIConeTracer.js';
6
6
 
7
7
  const _box = /*@__PURE__*/ new Box3();
8
8
  const _size = /*@__PURE__*/ new Vector3();
@@ -44,28 +44,6 @@ class MipStorageTexture3DNode extends StorageTexture3DNode {
44
44
 
45
45
  }
46
46
 
47
- /**
48
- * Cube texture node without the material's environment rotation, which requires a material and
49
- * scene context that compute passes lack. Used for point light shadow maps.
50
- *
51
- * @private
52
- */
53
- class PlainCubeTextureNode extends CubeTextureNode {
54
-
55
- setupUV( builder, uvNode ) {
56
-
57
- if ( this.value.isDepthTexture === true ) {
58
-
59
- return vec3( uvNode.x, uvNode.y.negate(), uvNode.z );
60
-
61
- }
62
-
63
- return vec3( uvNode.x.negate(), uvNode.yz );
64
-
65
- }
66
-
67
- }
68
-
69
47
  /**
70
48
  * Holds the voxel representation of a scene for {@link VXGINode}: an anisotropic opacity
71
49
  * mip chain, a direct radiance volume and a radiance volume with cached bounces.
@@ -76,6 +54,8 @@ class PlainCubeTextureNode extends CubeTextureNode {
76
54
  * along the axis, averaging across it), radiance is stored opacity-premultiplied and indirect bounces
77
55
  * are cached in the volume via cone tracing. Only direct lights are injected.
78
56
  * Voxelization uses conservative rasterization along the dominant triangle axis in a compute shader.
57
+ * The interiors of closed meshes are filled, so cones starting inside an object (e.g. near contact
58
+ * points) are blocked.
79
59
  *
80
60
  * Direct light is injected per voxel instead of splatting photons from a light-view map as in the
81
61
  * paper: the shadow maps rendered by the renderer are the light-view maps, and every occupied voxel
@@ -91,6 +71,8 @@ class PlainCubeTextureNode extends CubeTextureNode {
91
71
  * - {@link https://research.nvidia.com/publication/2011-09_interactive-indirect-illumination-using-voxel-cone-tracing}:
92
72
  * Crassin et al., Interactive Indirect Illumination Using Voxel Cone Tracing, Pacific Graphics 2011.
93
73
  * - {@link https://developer.nvidia.com/content/basics-gpu-voxelization}: Basics of GPU voxelization.
74
+ * - {@link https://doi.org/10.1145/1882261.1866201}: Schwarz and Seidel, Fast Parallel Surface and Solid
75
+ * Voxelization on GPUs, ACM Transactions on Graphics 2010.
94
76
  *
95
77
  * Note: This class can only be used with `WebGPURenderer` and a WebGPU backend.
96
78
  *
@@ -326,6 +308,7 @@ class VXGIVolume {
326
308
 
327
309
  this._occupancyAttribute = null;
328
310
  this._triangleIdAttribute = null;
311
+ this._solidAttribute = null;
329
312
  this._triangleAttribute = null;
330
313
  this._trianglesNode = null;
331
314
  this._triangleCount = 0;
@@ -453,7 +436,7 @@ class VXGIVolume {
453
436
  this.voxelSizeNode.value = voxelSize;
454
437
  this.maxLevelNode.value = levels - 1;
455
438
 
456
- if ( gridSize.equals( this._gridSize ) === false || levels !== this._levels || this._directional !== this.directionalRadiance ) {
439
+ if ( this._allocated === false || gridSize.equals( this._gridSize ) === false || levels !== this._levels || this._directional !== this.directionalRadiance ) {
457
440
 
458
441
  this._allocateGrid( gridSize, levels );
459
442
 
@@ -475,12 +458,21 @@ class VXGIVolume {
475
458
 
476
459
  this._triangleCount = count;
477
460
  this._triangleCountNode.value = count;
461
+
462
+ if ( this._triangleAttribute !== null ) this._triangleAttribute.dispose();
463
+
478
464
  this._triangleAttribute = new StorageBufferAttribute( count > 0 ? data : new Float32Array( TRIANGLE_STRIDE ), 4 );
479
465
  this._trianglesNode = storage( this._triangleAttribute, 'vec4', this._triangleAttribute.count ).toReadOnly();
480
466
 
467
+ const solid = this._solidAttribute.array;
468
+
469
+ solid.fill( 0 );
470
+ computeSolidVoxels( scene, { boundsMin: this.boundsMinNode.value, voxelSize, gridSize, layers: this.layers, exclude: this._exclude }, new Uint8Array( solid.buffer ) );
471
+ this._solidAttribute.needsUpdate = true;
472
+
481
473
  // kernels depend on the triangle buffer and grid
482
474
 
483
- this._kernels = null;
475
+ this._disposeKernels();
484
476
  const kernels = this._getKernels();
485
477
 
486
478
  renderer.compute( kernels.clear );
@@ -540,6 +532,7 @@ class VXGIVolume {
540
532
 
541
533
  this._occupancyAttribute = new StorageBufferAttribute( this._voxelCount, 1, Uint32Array );
542
534
  this._triangleIdAttribute = new StorageBufferAttribute( this._voxelCount, 1, Uint32Array );
535
+ this._solidAttribute = new StorageBufferAttribute( Math.ceil( this._voxelCount / 4 ), 1, Uint32Array );
543
536
 
544
537
  }
545
538
 
@@ -561,6 +554,8 @@ class VXGIVolume {
561
554
 
562
555
  _disposeGrid() {
563
556
 
557
+ this._disposeKernels();
558
+
564
559
  this.opacityTexture.dispose();
565
560
  this.radianceTexture.dispose();
566
561
  this.directionalTexture.dispose();
@@ -585,9 +580,27 @@ class VXGIVolume {
585
580
 
586
581
  }
587
582
 
588
- this._occupancyAttribute = null;
589
- this._triangleIdAttribute = null;
590
- this._kernels = null;
583
+ if ( this._occupancyAttribute !== null ) {
584
+
585
+ this._occupancyAttribute.dispose();
586
+ this._triangleIdAttribute.dispose();
587
+ this._solidAttribute.dispose();
588
+
589
+ this._occupancyAttribute = null;
590
+ this._triangleIdAttribute = null;
591
+ this._solidAttribute = null;
592
+
593
+ }
594
+
595
+ if ( this._triangleAttribute !== null ) {
596
+
597
+ this._triangleAttribute.dispose();
598
+
599
+ this._triangleAttribute = null;
600
+ this._trianglesNode = null;
601
+
602
+ }
603
+
591
604
  this._allocated = false;
592
605
 
593
606
  }
@@ -702,6 +715,8 @@ class VXGIVolume {
702
715
 
703
716
  if ( kernels.inject[ index ] === null || kernels.injectKey[ index ] !== this._lightsKey ) {
704
717
 
718
+ if ( kernels.inject[ index ] !== null ) kernels.inject[ index ].dispose();
719
+
705
720
  kernels.inject[ index ] = this._createInjectKernel( renderer, index );
706
721
  kernels.injectKey[ index ] = this._lightsKey;
707
722
 
@@ -777,6 +792,22 @@ class VXGIVolume {
777
792
 
778
793
  }
779
794
 
795
+ _disposeKernels() {
796
+
797
+ if ( this._kernels === null ) return;
798
+
799
+ const { clear, voxelize, resolve, opacityMips, radianceMips, inject, bounce } = this._kernels;
800
+
801
+ for ( const kernel of [ clear, voxelize, resolve, ...opacityMips, ...radianceMips.flat(), ...inject, ...bounce ] ) {
802
+
803
+ if ( kernel !== null ) kernel.dispose();
804
+
805
+ }
806
+
807
+ this._kernels = null;
808
+
809
+ }
810
+
780
811
  _getLevelSize( level ) {
781
812
 
782
813
  return [ this._gridSize.x >> level, this._gridSize.y >> level, this._gridSize.z >> level ];
@@ -926,6 +957,7 @@ class VXGIVolume {
926
957
  _createResolveKernel() {
927
958
 
928
959
  const occupancy = storage( this._occupancyAttribute, 'uint', this._voxelCount ).toReadOnly();
960
+ const solid = storage( this._solidAttribute, 'uint', this._solidAttribute.count ).toReadOnly();
929
961
  const opacityTexture = this.opacityTexture;
930
962
  const voxelCount = this._voxelCountNode;
931
963
  const size = this._getLevelSize( 0 );
@@ -935,7 +967,8 @@ class VXGIVolume {
935
967
  If( instanceIndex.lessThan( voxelCount ), () => {
936
968
 
937
969
  const coords = this._coords( instanceIndex, size ).toConst();
938
- const bits = occupancy.element( instanceIndex ).toConst();
970
+ const solidBits = solid.element( instanceIndex.shiftRight( uint( 2 ) ) ).shiftRight( instanceIndex.bitAnd( uint( 3 ) ).mul( uint( 8 ) ) ).bitAnd( uint( 0xFF ) );
971
+ const bits = occupancy.element( instanceIndex ).bitOr( solidBits ).toConst();
939
972
 
940
973
  // per-axis coverage from the 2x2x2 sub-voxel occupancy
941
974
 
@@ -1280,7 +1313,7 @@ class VXGIVolume {
1280
1313
 
1281
1314
  If( viewZ.greaterThanEqual( near ).and( viewZ.lessThanEqual( far ) ), () => {
1282
1315
 
1283
- const depth = nodeObject( new PlainCubeTextureNode( shadowTexture, normalize( lightToVoxel ) ) ).r; // depth cubes need an integer level, which the compute path emits by default
1316
+ const depth = cubeTexture( shadowTexture, normalize( lightToVoxel ) ).r; // depth cubes need an integer level, which the compute path emits by default
1284
1317
 
1285
1318
  if ( reversedDepth ) {
1286
1319
 
@@ -1383,35 +1416,12 @@ class VXGIVolume {
1383
1416
 
1384
1417
  const direct = texture3D( directTexture, vec3( coords ).add( 0.5 ).div( vec3( size[ 0 ], size[ 1 ], size[ 2 ] ) ), float( 0 ) ).toConst();
1385
1418
 
1386
- // tangent frame
1387
-
1388
- const up = select( abs( normal.y ).lessThan( 0.99 ), vec3( 0, 1, 0 ), vec3( 1, 0, 0 ) );
1389
- const tangent = normalize( cross( normal, up ) ).toConst();
1390
- const bitangent = cross( normal, tangent ).toConst();
1391
-
1392
1419
  const rotation = hash( instanceIndex ).toConst();
1393
- const gathered = vec3( 0 ).toVar();
1420
+ const origin = position.add( normal.mul( voxelSize.mul( 1.5 ) ) ).toConst();
1394
1421
 
1395
- Loop( { start: 0, end: BOUNCE_CONE_COUNT, type: 'int', condition: '<', name: 'c' }, ( { c } ) => {
1396
-
1397
- // cosine-weighted directions, rotated per voxel
1398
-
1399
- const u1 = float( c ).add( 0.5 ).div( BOUNCE_CONE_COUNT ).toConst();
1400
- const u2 = fract( float( c ).mul( 0.618034 ).add( rotation ) ).toConst();
1401
- const sinTheta = sqrt( u1 ).toConst();
1402
- const cosTheta = sqrt( u1.oneMinus() ).toConst();
1403
- const phi = u2.mul( PI.mul( 2 ) ).toConst();
1404
-
1405
- const direction = normalize( tangent.mul( cos( phi ).mul( sinTheta ) ).add( bitangent.mul( sin( phi ).mul( sinTheta ) ) ).add( normal.mul( cosTheta ) ) ).toConst();
1406
- const origin = position.add( normal.mul( voxelSize.mul( 1.5 ) ) ).toConst();
1407
-
1408
- const cone = trace( origin, direction, tanHalfAngle, traceDistance );
1409
-
1410
- gathered.addAssign( cone.color );
1411
-
1412
- } );
1422
+ const { color } = gather( trace, origin, normal, BOUNCE_CONE_COUNT, tanHalfAngle, traceDistance, rotation, 0.5 );
1413
1423
 
1414
- const bounce = albedo.mul( gathered.div( BOUNCE_CONE_COUNT ) );
1424
+ const bounce = albedo.mul( color );
1415
1425
 
1416
1426
  result.assign( vec4( direct.rgb.add( bounce.mul( direct.a ) ), direct.a ) );
1417
1427
 
@@ -3,9 +3,14 @@ import { SunLightShadow } from './SunLightShadow.js';
3
3
 
4
4
  /**
5
5
  * A sun-like light that gets emitted in a specific direction, with rays that
6
- * are all parallel, and casts cascaded shadow maps via {@link SunLightShadow},
6
+ * are all parallel, and casts Cascaded Shadow Maps (CSM) via {@link SunLightShadow},
7
7
  * suited for lighting large scenes.
8
8
  *
9
+ * Please be aware that `SunLight` is not a good fit for small, bounded scenes like
10
+ * dioramas, single rooms or model-viewers. Small scenes don't benefit from
11
+ * CSM because most content will be located in the last shadow cascade with the
12
+ * lowest shadow map resolution.
13
+ *
9
14
  * Unlike {@link DirectionalLight}, the light has no target: like
10
15
  * {@link HemisphereLight}, its direction is defined by its position. The
11
16
  * light shines from its position towards the origin and points straight
@@ -18,10 +23,10 @@ import { SunLightShadow } from './SunLightShadow.js';
18
23
  * scene.add( sun );
19
24
  * ```
20
25
  *
21
- * When used with `WebGPURenderer`, the light must be registered with the
22
- * renderer's node library first:
26
+ * When used with `WebGPURenderer`, the light must be assigned its node
27
+ * implementation first:
23
28
  * ```js
24
- * renderer.library.addLight( SunLightNode, SunLight );
29
+ * SunLight.registerNode( SunLightNode );
25
30
  * ```
26
31
  *
27
32
  * @augments Light
@@ -3,10 +3,10 @@ import { cameraViewMatrix, lightPosition } from 'three/tsl';
3
3
  import { sunShadow } from './SunShadowNode.js';
4
4
 
5
5
  /**
6
- * Module for representing sun lights as nodes. Register it with the
7
- * renderer's node library to use {@link SunLight} with `WebGPURenderer`:
6
+ * Module for representing sun lights as nodes. Register it with {@link SunLight}
7
+ * to use the light with `WebGPURenderer`:
8
8
  * ```js
9
- * renderer.library.addLight( SunLightNode, SunLight );
9
+ * SunLight.registerNode( SunLightNode );
10
10
  * ```
11
11
  *
12
12
  * @augments AnalyticLightNode
@@ -179,7 +179,7 @@ ShaderLib[ 'line' ] = {
179
179
  #ifdef WORLD_UNITS
180
180
 
181
181
  vec3 worldDir = normalize( end.xyz - start.xyz );
182
- vec3 tmpFwd = normalize( mix( start.xyz, end.xyz, 0.5 ) );
182
+ vec3 tmpFwd = perspective ? normalize( mix( start.xyz, end.xyz, 0.5 ) ) : vec3( 0.0, 0.0, - 1.0 );
183
183
  vec3 worldUp = normalize( cross( worldDir, tmpFwd ) );
184
184
  vec3 worldFwd = cross( worldDir, worldUp );
185
185
  worldPos = position.y < 0.5 ? start: end;
@@ -213,7 +213,9 @@ ShaderLib[ 'line' ] = {
213
213
  // shift the depth of the projected points so the line
214
214
  // segments overlap neatly
215
215
  vec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;
216
- clip.z = clipPose.z * clip.w;
216
+
217
+ // only shift the depth of vertices in front of the camera (#35137)
218
+ if ( clip.w > 0.0 ) clip.z = clipPose.z * clip.w;
217
219
 
218
220
  #else
219
221
 
@@ -349,15 +351,29 @@ ShaderLib[ 'line' ] = {
349
351
 
350
352
  #ifdef WORLD_UNITS
351
353
 
352
- // Find the closest points on the view ray and the line segment
353
- vec3 rayEnd = normalize( worldPos.xyz ) * 1e5;
354
- vec3 lineDir = worldEnd - worldStart;
355
- vec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );
354
+ float len;
355
+
356
+ if ( isOrthographic ) {
357
+
358
+ // View rays are parallel to the z axis so the distance reduces to camera-space XY
359
+ vec2 lineDir = worldEnd.xy - worldStart.xy;
360
+ float t = clamp( dot( worldPos.xy - worldStart.xy, lineDir ) / dot( lineDir, lineDir ), 0.0, 1.0 );
361
+ len = length( worldStart.xy + lineDir * t - worldPos.xy );
362
+
363
+ } else {
364
+
365
+ // Find the closest points on the view ray and the line segment
366
+ vec3 rayEnd = normalize( worldPos.xyz ) * 1e5;
367
+ vec3 lineDir = worldEnd - worldStart;
368
+ vec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );
369
+
370
+ vec3 p1 = worldStart + lineDir * params.x;
371
+ vec3 p2 = rayEnd * params.y;
372
+ vec3 delta = p1 - p2;
373
+ len = length( delta );
374
+
375
+ }
356
376
 
357
- vec3 p1 = worldStart + lineDir * params.x;
358
- vec3 p2 = rayEnd * params.y;
359
- vec3 delta = p1 - p2;
360
- float len = length( delta );
361
377
  float norm = len / linewidth;
362
378
 
363
379
  #ifndef USE_DASH
@@ -147,10 +147,13 @@ class Rhino3dmLoader extends Loader {
147
147
  load( url, onLoad, onProgress, onError ) {
148
148
 
149
149
  const loader = new FileLoader( this.manager );
150
+ loader.setPriority( this.priority );
151
+ loader.setCache( this.cache );
150
152
 
151
153
  loader.setPath( this.path );
152
154
  loader.setResponseType( 'arraybuffer' );
153
155
  loader.setRequestHeader( this.requestHeader );
156
+ loader.setWithCredentials( this.withCredentials );
154
157
 
155
158
  this.url = url;
156
159
 
@@ -378,6 +381,8 @@ class Rhino3dmLoader extends Loader {
378
381
  }
379
382
 
380
383
  const textureLoader = new TextureLoader();
384
+ textureLoader.setPriority( this.priority );
385
+ textureLoader.setCache( this.cache );
381
386
 
382
387
  for ( let i = 0; i < material.textures.length; i ++ ) {
383
388
 
@@ -532,7 +537,7 @@ class Rhino3dmLoader extends Loader {
532
537
 
533
538
  if ( renderEnvironment ) {
534
539
 
535
- new EXRLoader().load( renderEnvironment.image, function ( texture ) {
540
+ new EXRLoader().setPriority( this.priority ).setCache( this.cache ).load( renderEnvironment.image, function ( texture ) {
536
541
 
537
542
  texture.mapping = EquirectangularReflectionMapping;
538
543
  mat.envMap = texture;
@@ -967,6 +972,8 @@ class Rhino3dmLoader extends Loader {
967
972
 
968
973
  // Load rhino3dm wrapper.
969
974
  const jsLoader = new FileLoader( this.manager );
975
+ jsLoader.setPriority( this.priority );
976
+ jsLoader.setCache( this.cache );
970
977
  jsLoader.setPath( this.libraryPath );
971
978
  const jsContent = new Promise( ( resolve, reject ) => {
972
979
 
@@ -976,6 +983,8 @@ class Rhino3dmLoader extends Loader {
976
983
 
977
984
  // Load rhino3dm WASM binary.
978
985
  const binaryLoader = new FileLoader( this.manager );
986
+ binaryLoader.setPriority( this.priority );
987
+ binaryLoader.setCache( this.cache );
979
988
  binaryLoader.setPath( this.libraryPath );
980
989
  binaryLoader.setResponseType( 'arraybuffer' );
981
990
  const binaryContent = new Promise( ( resolve, reject ) => {
@@ -92,6 +92,8 @@ class ThreeMFLoader extends Loader {
92
92
 
93
93
  const scope = this;
94
94
  const loader = new FileLoader( scope.manager );
95
+ loader.setPriority( scope.priority );
96
+ loader.setCache( scope.cache );
95
97
  loader.setPath( scope.path );
96
98
  loader.setResponseType( 'arraybuffer' );
97
99
  loader.setRequestHeader( scope.requestHeader );
@@ -132,6 +134,8 @@ class ThreeMFLoader extends Loader {
132
134
 
133
135
  const scope = this;
134
136
  const textureLoader = new TextureLoader( this.manager );
137
+ textureLoader.setPriority( this.priority );
138
+ textureLoader.setCache( this.cache );
135
139
 
136
140
  function loadDocument( data ) {
137
141
 
@@ -181,7 +185,7 @@ class ThreeMFLoader extends Loader {
181
185
 
182
186
  rootModelFile = file;
183
187
 
184
- } else if ( file.match( /^3D\/.*\/.*\.model$/ ) ) {
188
+ } else if ( file.match( /^3D\/.*\/[^\/]*\.model$/ ) ) {
185
189
 
186
190
  modelPartNames.push( file ); // sub models
187
191
 
@@ -53,6 +53,8 @@ class AMFLoader extends Loader {
53
53
  const scope = this;
54
54
 
55
55
  const loader = new FileLoader( scope.manager );
56
+ loader.setPriority( scope.priority );
57
+ loader.setCache( scope.cache );
56
58
  loader.setPath( scope.path );
57
59
  loader.setResponseType( 'arraybuffer' );
58
60
  loader.setRequestHeader( scope.requestHeader );
@@ -76,6 +76,8 @@ class BVHLoader extends Loader {
76
76
  const scope = this;
77
77
 
78
78
  const loader = new FileLoader( scope.manager );
79
+ loader.setPriority( scope.priority );
80
+ loader.setCache( scope.cache );
79
81
  loader.setPath( scope.path );
80
82
  loader.setRequestHeader( scope.requestHeader );
81
83
  loader.setWithCredentials( scope.withCredentials );
@@ -47,6 +47,8 @@ class ColladaLoader extends Loader {
47
47
  const path = ( scope.path === '' ) ? LoaderUtils.extractUrlBase( url ) : scope.path;
48
48
 
49
49
  const loader = new FileLoader( scope.manager );
50
+ loader.setPriority( scope.priority );
51
+ loader.setCache( scope.cache );
50
52
  loader.setPath( scope.path );
51
53
  loader.setRequestHeader( scope.requestHeader );
52
54
  loader.setWithCredentials( scope.withCredentials );
@@ -106,6 +108,8 @@ class ColladaLoader extends Loader {
106
108
 
107
109
  // Setup texture loaders
108
110
  const textureLoader = new TextureLoader( this.manager );
111
+ textureLoader.setPriority( this.priority );
112
+ textureLoader.setCache( this.cache );
109
113
  textureLoader.setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );
110
114
 
111
115
  let tgaLoader;
@@ -113,7 +117,11 @@ class ColladaLoader extends Loader {
113
117
  if ( TGALoader ) {
114
118
 
115
119
  tgaLoader = new TGALoader( this.manager );
120
+ tgaLoader.setPriority( this.priority );
121
+ tgaLoader.setCache( this.cache );
116
122
  tgaLoader.setPath( this.resourcePath || path );
123
+ tgaLoader.setRequestHeader( this.requestHeader );
124
+ tgaLoader.setWithCredentials( this.withCredentials );
117
125
 
118
126
  }
119
127
 
@@ -359,7 +359,7 @@ class DDSLoader extends CompressedTextureLoader {
359
359
 
360
360
  } else {
361
361
 
362
- dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes;
362
+ dataLength = Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * blockBytes;
363
363
  byteArray = new Uint8Array( buffer, dataOffset, dataLength );
364
364
 
365
365
  }
@@ -163,6 +163,8 @@ class DRACOLoader extends Loader {
163
163
  load( url, onLoad, onProgress, onError ) {
164
164
 
165
165
  const loader = new FileLoader( this.manager );
166
+ loader.setPriority( this.priority );
167
+ loader.setCache( this.cache );
166
168
 
167
169
  loader.setPath( this.path );
168
170
  loader.setResponseType( 'arraybuffer' );
@@ -358,6 +360,8 @@ class DRACOLoader extends Loader {
358
360
  _loadLibrary( url, responseType ) {
359
361
 
360
362
  const loader = new FileLoader( this.manager );
363
+ loader.setPriority( this.priority );
364
+ loader.setCache( this.cache );
361
365
  loader.setResponseType( responseType );
362
366
  loader.setWithCredentials( this.withCredentials );
363
367
 
@@ -725,7 +729,7 @@ function DRACOWorker() {
725
729
 
726
730
  let dstOffset = 0;
727
731
 
728
- for ( let i = 0, il = srcArray.length; i < il; i ++ ) {
732
+ for ( let i = 0; i < count; i ++ ) {
729
733
 
730
734
  for ( let j = 0; j < itemSize; j ++ ) {
731
735