super-three 0.177.0 → 0.181.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +1994 -749
  3. package/build/three.core.js +1358 -506
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +631 -247
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +113 -33
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +9571 -3424
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +9397 -3426
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  14. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  15. package/examples/jsm/Addons.js +2 -3
  16. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  17. package/examples/jsm/capabilities/WebGL.js +0 -27
  18. package/examples/jsm/capabilities/WebGPU.js +1 -1
  19. package/examples/jsm/controls/ArcballControls.js +9 -9
  20. package/examples/jsm/controls/DragControls.js +7 -57
  21. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  22. package/examples/jsm/controls/FlyControls.js +1 -1
  23. package/examples/jsm/controls/OrbitControls.js +2 -2
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +1 -1
  26. package/examples/jsm/controls/TransformControls.js +62 -15
  27. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  28. package/examples/jsm/effects/AsciiEffect.js +8 -8
  29. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  30. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  31. package/examples/jsm/exporters/EXRExporter.js +1 -1
  32. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  33. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  34. package/examples/jsm/exporters/PLYExporter.js +1 -1
  35. package/examples/jsm/exporters/USDZExporter.js +683 -299
  36. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  37. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  38. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  39. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  40. package/examples/jsm/geometries/TextGeometry.js +3 -2
  41. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  42. package/examples/jsm/helpers/ViewHelper.js +43 -5
  43. package/examples/jsm/inspector/Inspector.js +427 -0
  44. package/examples/jsm/inspector/RendererInspector.js +415 -0
  45. package/examples/jsm/inspector/tabs/Console.js +204 -0
  46. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  47. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  48. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  49. package/examples/jsm/inspector/ui/Graph.js +95 -0
  50. package/examples/jsm/inspector/ui/Item.js +170 -0
  51. package/examples/jsm/inspector/ui/List.js +75 -0
  52. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  53. package/examples/jsm/inspector/ui/Style.js +654 -0
  54. package/examples/jsm/inspector/ui/Tab.js +46 -0
  55. package/examples/jsm/inspector/ui/Values.js +423 -0
  56. package/examples/jsm/inspector/ui/utils.js +56 -0
  57. package/examples/jsm/interactive/HTMLMesh.js +11 -13
  58. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  59. package/examples/jsm/interactive/SelectionBox.js +30 -0
  60. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  61. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  62. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  63. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  64. package/examples/jsm/lines/Line2.js +3 -3
  65. package/examples/jsm/lines/LineGeometry.js +1 -1
  66. package/examples/jsm/lines/LineSegments2.js +2 -2
  67. package/examples/jsm/lines/Wireframe.js +2 -2
  68. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  69. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  70. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  71. package/examples/jsm/loaders/3MFLoader.js +1 -1
  72. package/examples/jsm/loaders/ColladaLoader.js +4 -4
  73. package/examples/jsm/loaders/DDSLoader.js +1 -1
  74. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  75. package/examples/jsm/loaders/EXRLoader.js +210 -22
  76. package/examples/jsm/loaders/FBXLoader.js +4 -4
  77. package/examples/jsm/loaders/FontLoader.js +23 -5
  78. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  79. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  80. package/examples/jsm/loaders/HDRLoader.js +486 -0
  81. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  82. package/examples/jsm/loaders/KTXLoader.js +2 -2
  83. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  84. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  85. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  86. package/examples/jsm/loaders/LWOLoader.js +2 -2
  87. package/examples/jsm/loaders/MaterialXLoader.js +233 -34
  88. package/examples/jsm/loaders/OBJLoader.js +1 -1
  89. package/examples/jsm/loaders/PDBLoader.js +1 -1
  90. package/examples/jsm/loaders/RGBELoader.js +7 -473
  91. package/examples/jsm/loaders/SVGLoader.js +2 -2
  92. package/examples/jsm/loaders/TTFLoader.js +13 -1
  93. package/examples/jsm/loaders/USDLoader.js +219 -0
  94. package/examples/jsm/loaders/USDZLoader.js +4 -892
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  96. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  97. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  98. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  99. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  100. package/examples/jsm/math/ColorSpaces.js +19 -1
  101. package/examples/jsm/math/ConvexHull.js +3 -3
  102. package/examples/jsm/math/ImprovedNoise.js +1 -1
  103. package/examples/jsm/math/Lut.js +2 -2
  104. package/examples/jsm/math/SimplexNoise.js +1 -1
  105. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  106. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  107. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  108. package/examples/jsm/misc/TubePainter.js +383 -40
  109. package/examples/jsm/misc/Volume.js +1 -1
  110. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  111. package/examples/jsm/objects/LensflareMesh.js +3 -3
  112. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  113. package/examples/jsm/objects/Sky.js +1 -1
  114. package/examples/jsm/objects/SkyMesh.js +3 -3
  115. package/examples/jsm/objects/Water.js +3 -3
  116. package/examples/jsm/objects/WaterMesh.js +6 -6
  117. package/examples/jsm/physics/RapierPhysics.js +95 -16
  118. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  119. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  120. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  121. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  122. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  123. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  124. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  125. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  126. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  127. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  128. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  129. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  130. package/examples/jsm/shaders/BokehShader.js +1 -1
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  133. package/examples/jsm/shaders/FocusShader.js +1 -1
  134. package/examples/jsm/shaders/GTAOShader.js +2 -2
  135. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  136. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  137. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  138. package/examples/jsm/shaders/SSRShader.js +1 -1
  139. package/examples/jsm/shaders/SepiaShader.js +1 -1
  140. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  141. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  142. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  143. package/examples/jsm/shaders/VignetteShader.js +1 -1
  144. package/examples/jsm/transpiler/AST.js +381 -30
  145. package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
  146. package/examples/jsm/transpiler/Linker.js +327 -0
  147. package/examples/jsm/transpiler/TSLEncoder.js +196 -92
  148. package/examples/jsm/transpiler/Transpiler.js +17 -1
  149. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  150. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  151. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  152. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  153. package/examples/jsm/tsl/display/BloomNode.js +11 -6
  154. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  155. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  156. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  157. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  158. package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
  159. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  160. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  161. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  162. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  163. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  164. package/examples/jsm/tsl/display/TRAANode.js +578 -0
  165. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  166. package/examples/jsm/tsl/display/hashBlur.js +18 -20
  167. package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
  168. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  169. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  170. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  171. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  172. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  173. package/package.json +5 -10
  174. package/src/Three.Core.js +5 -2
  175. package/src/Three.TSL.js +112 -32
  176. package/src/Three.WebGPU.Nodes.js +2 -0
  177. package/src/Three.WebGPU.js +4 -0
  178. package/src/animation/AnimationClip.js +20 -4
  179. package/src/animation/AnimationMixer.js +3 -3
  180. package/src/animation/AnimationObjectGroup.js +2 -1
  181. package/src/animation/KeyframeTrack.js +8 -7
  182. package/src/animation/PropertyBinding.js +12 -11
  183. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  184. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  185. package/src/audio/Audio.js +10 -9
  186. package/src/audio/PositionalAudio.js +1 -1
  187. package/src/cameras/Camera.js +14 -0
  188. package/src/cameras/OrthographicCamera.js +2 -2
  189. package/src/cameras/PerspectiveCamera.js +2 -2
  190. package/src/cameras/StereoCamera.js +2 -2
  191. package/src/constants.js +13 -5
  192. package/src/core/BufferAttribute.js +3 -3
  193. package/src/core/BufferGeometry.js +10 -10
  194. package/src/core/Clock.js +2 -8
  195. package/src/core/EventDispatcher.js +1 -1
  196. package/src/core/GLBufferAttribute.js +13 -1
  197. package/src/core/InterleavedBuffer.js +1 -1
  198. package/src/core/InterleavedBufferAttribute.js +3 -2
  199. package/src/core/Object3D.js +4 -3
  200. package/src/core/Raycaster.js +2 -1
  201. package/src/core/RenderTarget.js +10 -1
  202. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  203. package/src/extras/Controls.js +5 -4
  204. package/src/extras/DataUtils.js +2 -1
  205. package/src/extras/Earcut.js +6 -0
  206. package/src/extras/ImageUtils.js +2 -2
  207. package/src/extras/PMREMGenerator.js +279 -55
  208. package/src/extras/TextureUtils.js +2 -1
  209. package/src/extras/core/Curve.js +2 -1
  210. package/src/extras/core/Interpolations.js +7 -1
  211. package/src/extras/core/Path.js +22 -22
  212. package/src/extras/core/ShapePath.js +4 -4
  213. package/src/extras/lib/earcut.js +8 -8
  214. package/src/geometries/BoxGeometry.js +1 -0
  215. package/src/geometries/CapsuleGeometry.js +1 -0
  216. package/src/geometries/CircleGeometry.js +1 -0
  217. package/src/geometries/ConeGeometry.js +1 -0
  218. package/src/geometries/CylinderGeometry.js +1 -0
  219. package/src/geometries/DodecahedronGeometry.js +1 -0
  220. package/src/geometries/ExtrudeGeometry.js +8 -6
  221. package/src/geometries/IcosahedronGeometry.js +1 -0
  222. package/src/geometries/LatheGeometry.js +1 -0
  223. package/src/geometries/OctahedronGeometry.js +1 -0
  224. package/src/geometries/PlaneGeometry.js +1 -0
  225. package/src/geometries/RingGeometry.js +1 -0
  226. package/src/geometries/ShapeGeometry.js +1 -0
  227. package/src/geometries/SphereGeometry.js +1 -0
  228. package/src/geometries/TetrahedronGeometry.js +1 -0
  229. package/src/geometries/TorusGeometry.js +1 -0
  230. package/src/geometries/TorusKnotGeometry.js +1 -0
  231. package/src/geometries/TubeGeometry.js +1 -0
  232. package/src/helpers/CameraHelper.js +42 -12
  233. package/src/helpers/SkeletonHelper.js +35 -6
  234. package/src/lights/LightShadow.js +21 -8
  235. package/src/lights/PointLightShadow.js +1 -1
  236. package/src/lights/webgpu/ProjectorLight.js +1 -1
  237. package/src/loaders/AnimationLoader.js +2 -1
  238. package/src/loaders/AudioLoader.js +2 -1
  239. package/src/loaders/BufferGeometryLoader.js +2 -2
  240. package/src/loaders/Cache.js +2 -2
  241. package/src/loaders/DataTextureLoader.js +1 -1
  242. package/src/loaders/FileLoader.js +29 -5
  243. package/src/loaders/ImageBitmapLoader.js +32 -8
  244. package/src/loaders/ImageLoader.js +56 -9
  245. package/src/loaders/Loader.js +17 -3
  246. package/src/loaders/LoadingManager.js +45 -0
  247. package/src/loaders/MaterialLoader.js +3 -2
  248. package/src/loaders/ObjectLoader.js +13 -13
  249. package/src/loaders/TextureLoader.js +1 -1
  250. package/src/loaders/nodes/NodeLoader.js +3 -2
  251. package/src/materials/Material.js +16 -3
  252. package/src/materials/MeshBasicMaterial.js +2 -1
  253. package/src/materials/MeshDepthMaterial.js +1 -0
  254. package/src/materials/MeshDistanceMaterial.js +1 -1
  255. package/src/materials/MeshLambertMaterial.js +2 -1
  256. package/src/materials/MeshMatcapMaterial.js +22 -0
  257. package/src/materials/MeshNormalMaterial.js +1 -0
  258. package/src/materials/MeshPhongMaterial.js +2 -1
  259. package/src/materials/MeshPhysicalMaterial.js +2 -1
  260. package/src/materials/MeshStandardMaterial.js +8 -7
  261. package/src/materials/MeshToonMaterial.js +1 -0
  262. package/src/materials/PointsMaterial.js +1 -1
  263. package/src/materials/ShaderMaterial.js +2 -2
  264. package/src/materials/nodes/Line2NodeMaterial.js +2 -10
  265. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  266. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  267. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  268. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  269. package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
  270. package/src/materials/nodes/NodeMaterial.js +90 -27
  271. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  272. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  273. package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
  274. package/src/math/Color.js +6 -5
  275. package/src/math/ColorManagement.js +9 -3
  276. package/src/math/Cylindrical.js +1 -1
  277. package/src/math/Euler.js +2 -1
  278. package/src/math/Frustum.js +25 -9
  279. package/src/math/FrustumArray.js +10 -5
  280. package/src/math/Line3.js +129 -2
  281. package/src/math/MathUtils.js +13 -11
  282. package/src/math/Matrix2.js +1 -1
  283. package/src/math/Matrix3.js +2 -2
  284. package/src/math/Matrix4.js +55 -34
  285. package/src/math/Plane.js +1 -1
  286. package/src/math/Quaternion.js +69 -67
  287. package/src/math/Spherical.js +3 -3
  288. package/src/nodes/Nodes.js +6 -4
  289. package/src/nodes/TSL.js +9 -4
  290. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  291. package/src/nodes/accessors/Bitangent.js +31 -25
  292. package/src/nodes/accessors/BufferNode.js +1 -1
  293. package/src/nodes/accessors/Camera.js +142 -16
  294. package/src/nodes/accessors/ClippingNode.js +6 -5
  295. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  296. package/src/nodes/accessors/InstanceNode.js +25 -5
  297. package/src/nodes/accessors/Lights.js +10 -0
  298. package/src/nodes/accessors/Normal.js +97 -30
  299. package/src/nodes/accessors/Object3DNode.js +2 -2
  300. package/src/nodes/accessors/Position.js +25 -9
  301. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  302. package/src/nodes/accessors/ReferenceNode.js +20 -4
  303. package/src/nodes/accessors/ReflectVector.js +3 -3
  304. package/src/nodes/accessors/SceneNode.js +3 -2
  305. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  306. package/src/nodes/accessors/StorageTextureNode.js +23 -1
  307. package/src/nodes/accessors/Tangent.js +25 -17
  308. package/src/nodes/accessors/TangentUtils.js +46 -0
  309. package/src/nodes/accessors/Texture3DNode.js +14 -1
  310. package/src/nodes/accessors/TextureBicubic.js +21 -3
  311. package/src/nodes/accessors/TextureNode.js +142 -44
  312. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  313. package/src/nodes/code/FunctionCallNode.js +24 -4
  314. package/src/nodes/code/FunctionNode.js +23 -0
  315. package/src/nodes/core/ArrayNode.js +13 -0
  316. package/src/nodes/core/AssignNode.js +6 -2
  317. package/src/nodes/core/AttributeNode.js +2 -1
  318. package/src/nodes/core/ContextNode.js +48 -10
  319. package/src/nodes/core/IndexNode.js +2 -2
  320. package/src/nodes/core/InputNode.js +2 -1
  321. package/src/nodes/core/InspectorNode.js +128 -0
  322. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
  323. package/src/nodes/core/Node.js +167 -34
  324. package/src/nodes/core/NodeBuilder.js +404 -120
  325. package/src/nodes/core/NodeFrame.js +21 -21
  326. package/src/nodes/core/NodeFunction.js +2 -1
  327. package/src/nodes/core/NodeParser.js +2 -1
  328. package/src/nodes/core/NodeUniform.js +1 -1
  329. package/src/nodes/core/NodeUtils.js +17 -88
  330. package/src/nodes/core/ParameterNode.js +31 -0
  331. package/src/nodes/core/PropertyNode.js +7 -0
  332. package/src/nodes/core/StackNode.js +77 -30
  333. package/src/nodes/core/StructNode.js +5 -5
  334. package/src/nodes/core/StructTypeNode.js +1 -0
  335. package/src/nodes/core/SubBuildNode.js +89 -0
  336. package/src/nodes/core/UniformNode.js +80 -14
  337. package/src/nodes/core/VarNode.js +142 -16
  338. package/src/nodes/core/VaryingNode.js +9 -6
  339. package/src/nodes/display/BlendModes.js +7 -6
  340. package/src/nodes/display/BumpMapNode.js +1 -1
  341. package/src/nodes/display/ColorAdjustment.js +1 -1
  342. package/src/nodes/display/FrontFacingNode.js +35 -7
  343. package/src/nodes/display/NormalMapNode.js +20 -50
  344. package/src/nodes/display/PassNode.js +206 -17
  345. package/src/nodes/display/RenderOutputNode.js +28 -2
  346. package/src/nodes/display/ScreenNode.js +44 -40
  347. package/src/nodes/display/ToneMappingNode.js +31 -4
  348. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  349. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  350. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  351. package/src/nodes/display/ViewportTextureNode.js +94 -4
  352. package/src/nodes/fog/Fog.js +3 -2
  353. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  354. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  355. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  356. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  357. package/src/nodes/functions/BasicLightingModel.js +2 -1
  358. package/src/nodes/functions/PhongLightingModel.js +3 -3
  359. package/src/nodes/functions/PhysicalLightingModel.js +19 -18
  360. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  361. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  362. package/src/nodes/geometry/RangeNode.js +40 -4
  363. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  364. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  365. package/src/nodes/gpgpu/ComputeNode.js +81 -25
  366. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  367. package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
  368. package/src/nodes/lighting/EnvironmentNode.js +11 -11
  369. package/src/nodes/lighting/LightsNode.js +7 -8
  370. package/src/nodes/lighting/PointShadowNode.js +6 -0
  371. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  372. package/src/nodes/lighting/ShadowFilterNode.js +3 -1
  373. package/src/nodes/lighting/ShadowNode.js +77 -10
  374. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  375. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  376. package/src/nodes/math/BitcastNode.js +156 -0
  377. package/src/nodes/math/ConditionalNode.js +25 -27
  378. package/src/nodes/math/MathNode.js +106 -65
  379. package/src/nodes/math/OperatorNode.js +28 -43
  380. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  381. package/src/nodes/shapes/Shapes.js +1 -1
  382. package/src/nodes/tsl/TSLBase.js +6 -2
  383. package/src/nodes/tsl/TSLCore.js +546 -186
  384. package/src/nodes/utils/DebugNode.js +3 -2
  385. package/src/nodes/utils/EquirectUV.js +27 -0
  386. package/src/nodes/utils/EventNode.js +119 -0
  387. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  388. package/src/nodes/utils/JoinNode.js +6 -3
  389. package/src/nodes/utils/LoopNode.js +20 -41
  390. package/src/nodes/utils/MatcapUV.js +22 -0
  391. package/src/nodes/utils/MemberNode.js +59 -7
  392. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  393. package/src/nodes/utils/RTTNode.js +33 -6
  394. package/src/nodes/utils/ReflectorNode.js +68 -10
  395. package/src/nodes/utils/SampleNode.js +91 -0
  396. package/src/nodes/utils/SplitNode.js +11 -0
  397. package/src/nodes/utils/Timer.js +0 -47
  398. package/src/nodes/utils/TriplanarTextures.js +65 -0
  399. package/src/objects/BatchedMesh.js +6 -4
  400. package/src/objects/LOD.js +1 -1
  401. package/src/objects/Line.js +2 -1
  402. package/src/objects/LineSegments.js +2 -1
  403. package/src/objects/Skeleton.js +3 -2
  404. package/src/objects/SkinnedMesh.js +3 -1
  405. package/src/objects/Sprite.js +4 -3
  406. package/src/renderers/WebGLRenderer.js +77 -66
  407. package/src/renderers/common/Animation.js +13 -1
  408. package/src/renderers/common/Attributes.js +1 -1
  409. package/src/renderers/common/Backend.js +108 -27
  410. package/src/renderers/common/Background.js +4 -3
  411. package/src/renderers/common/Bindings.js +76 -19
  412. package/src/renderers/common/CanvasTarget.js +341 -0
  413. package/src/renderers/common/ChainMap.js +1 -1
  414. package/src/renderers/common/Color4.js +2 -2
  415. package/src/renderers/common/CubeRenderTarget.js +1 -1
  416. package/src/renderers/common/DataMap.js +1 -1
  417. package/src/renderers/common/Geometries.js +26 -0
  418. package/src/renderers/common/Info.js +4 -2
  419. package/src/renderers/common/InspectorBase.js +146 -0
  420. package/src/renderers/common/Pipelines.js +1 -1
  421. package/src/renderers/common/PostProcessing.js +61 -25
  422. package/src/renderers/common/QuadMesh.js +7 -1
  423. package/src/renderers/common/RenderContext.js +2 -2
  424. package/src/renderers/common/RenderList.js +7 -3
  425. package/src/renderers/common/RenderObject.js +84 -5
  426. package/src/renderers/common/RenderObjects.js +1 -1
  427. package/src/renderers/common/Renderer.js +486 -255
  428. package/src/renderers/common/RendererUtils.js +9 -0
  429. package/src/renderers/common/SampledTexture.js +8 -68
  430. package/src/renderers/common/Sampler.js +117 -0
  431. package/src/renderers/common/Storage3DTexture.js +100 -0
  432. package/src/renderers/common/StorageArrayTexture.js +84 -0
  433. package/src/renderers/common/StorageTexture.js +27 -0
  434. package/src/renderers/common/Textures.js +138 -46
  435. package/src/renderers/common/TimestampQueryPool.js +65 -3
  436. package/src/renderers/common/UniformsGroup.js +2 -1
  437. package/src/renderers/common/XRManager.js +63 -24
  438. package/src/renderers/common/XRRenderTarget.js +21 -4
  439. package/src/renderers/common/extras/PMREMGenerator.js +161 -66
  440. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  441. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  442. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  443. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  444. package/src/renderers/common/nodes/Nodes.js +38 -16
  445. package/src/renderers/shaders/DFGLUTData.js +64 -0
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  447. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  450. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  451. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  454. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  455. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  456. package/src/renderers/shaders/UniformsLib.js +1 -0
  457. package/src/renderers/shaders/UniformsUtils.js +25 -4
  458. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  459. package/src/renderers/webgl/WebGLCapabilities.js +4 -3
  460. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  461. package/src/renderers/webgl/WebGLInfo.js +3 -1
  462. package/src/renderers/webgl/WebGLProgram.js +25 -18
  463. package/src/renderers/webgl/WebGLPrograms.js +9 -6
  464. package/src/renderers/webgl/WebGLShadowMap.js +13 -2
  465. package/src/renderers/webgl/WebGLState.js +17 -16
  466. package/src/renderers/webgl/WebGLTextures.js +38 -21
  467. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  468. package/src/renderers/webgl/WebGLUtils.js +3 -2
  469. package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
  470. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
  471. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  472. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  473. package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
  474. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
  475. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  476. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  477. package/src/renderers/webgpu/WebGPUBackend.js +205 -128
  478. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  479. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  480. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
  481. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
  482. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
  483. package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
  484. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
  485. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  486. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
  487. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  488. package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
  489. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  490. package/src/renderers/webxr/WebXRManager.js +89 -13
  491. package/src/textures/ExternalTexture.js +56 -0
  492. package/src/textures/FramebufferTexture.js +2 -2
  493. package/src/textures/Source.js +14 -3
  494. package/src/textures/Texture.js +3 -2
  495. package/src/textures/VideoTexture.js +29 -2
  496. package/src/utils.js +67 -3
  497. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  498. package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
  499. package/src/nodes/utils/EquirectUVNode.js +0 -65
  500. package/src/nodes/utils/MatcapUVNode.js +0 -49
  501. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -11,8 +11,6 @@
11
11
  * const timer = new Timer();
12
12
  * timer.connect( document ); // use Page Visibility API
13
13
  * ```
14
- *
15
- * @three_import import { Timer } from 'three/addons/misc/Timer.js';
16
14
  */
17
15
  class Timer {
18
16
 
@@ -23,7 +21,7 @@ class Timer {
23
21
 
24
22
  this._previousTime = 0;
25
23
  this._currentTime = 0;
26
- this._startTime = now();
24
+ this._startTime = performance.now();
27
25
 
28
26
  this._delta = 0;
29
27
  this._elapsed = 0;
@@ -129,7 +127,7 @@ class Timer {
129
127
  */
130
128
  reset() {
131
129
 
132
- this._currentTime = now() - this._startTime;
130
+ this._currentTime = performance.now() - this._startTime;
133
131
 
134
132
  return this;
135
133
 
@@ -164,7 +162,7 @@ class Timer {
164
162
  } else {
165
163
 
166
164
  this._previousTime = this._currentTime;
167
- this._currentTime = ( timestamp !== undefined ? timestamp : now() ) - this._startTime;
165
+ this._currentTime = ( timestamp !== undefined ? timestamp : performance.now() ) - this._startTime;
168
166
 
169
167
  this._delta = ( this._currentTime - this._previousTime ) * this._timescale;
170
168
  this._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas
@@ -177,46 +175,10 @@ class Timer {
177
175
 
178
176
  }
179
177
 
180
- /**
181
- * A special version of a timer with a fixed time delta value.
182
- * Can be useful for testing and debugging purposes.
183
- *
184
- * @augments Timer
185
- */
186
- class FixedTimer extends Timer {
187
-
188
- /**
189
- * Constructs a new timer.
190
- *
191
- * @param {number} [fps=60] - The fixed FPS of this timer.
192
- */
193
- constructor( fps = 60 ) {
194
-
195
- super();
196
- this._delta = ( 1 / fps ) * 1000;
197
-
198
- }
199
-
200
- update() {
201
-
202
- this._elapsed += ( this._delta * this._timescale ); // _elapsed is the accumulation of all previous deltas
203
-
204
- return this;
205
-
206
- }
207
-
208
- }
209
-
210
- function now() {
211
-
212
- return performance.now();
213
-
214
- }
215
-
216
178
  function handleVisibilityChange() {
217
179
 
218
180
  if ( this._document.hidden === false ) this.reset();
219
181
 
220
182
  }
221
183
 
222
- export { Timer, FixedTimer };
184
+ export { Timer };
@@ -1,4 +1,5 @@
1
1
  import { EventDispatcher } from '../core/EventDispatcher.js';
2
+ import { warn } from '../utils.js';
2
3
 
3
4
  /**
4
5
  * Abstract base class for controls.
@@ -12,7 +13,7 @@ class Controls extends EventDispatcher {
12
13
  * Constructs a new controls instance.
13
14
  *
14
15
  * @param {Object3D} object - The object that is managed by the controls.
15
- * @param {?HTMLDOMElement} domElement - The HTML element used for event listeners.
16
+ * @param {?HTMLElement} domElement - The HTML element used for event listeners.
16
17
  */
17
18
  constructor( object, domElement = null ) {
18
19
 
@@ -28,7 +29,7 @@ class Controls extends EventDispatcher {
28
29
  /**
29
30
  * The HTML element used for event listeners.
30
31
  *
31
- * @type {?HTMLDOMElement}
32
+ * @type {?HTMLElement}
32
33
  * @default null
33
34
  */
34
35
  this.domElement = domElement;
@@ -78,13 +79,13 @@ class Controls extends EventDispatcher {
78
79
  * Connects the controls to the DOM. This method has so called "side effects" since
79
80
  * it adds the module's event listeners to the DOM.
80
81
  *
81
- * @param {HTMLDOMElement} element - The DOM element to connect to.
82
+ * @param {HTMLElement} element - The DOM element to connect to.
82
83
  */
83
84
  connect( element ) {
84
85
 
85
86
  if ( element === undefined ) {
86
87
 
87
- console.warn( 'THREE.Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185
88
+ warn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185
88
89
  return;
89
90
 
90
91
  }
@@ -1,4 +1,5 @@
1
1
  import { clamp } from '../math/MathUtils.js';
2
+ import { warn } from '../utils.js';
2
3
 
3
4
  // Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf
4
5
 
@@ -148,7 +149,7 @@ function _generateTables() {
148
149
  */
149
150
  function toHalfFloat( val ) {
150
151
 
151
- if ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' );
152
+ if ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );
152
153
 
153
154
  val = clamp( val, - 65504, 65504 );
154
155
 
@@ -1,5 +1,11 @@
1
1
  import earcut from './lib/earcut.js';
2
2
 
3
+ /**
4
+ * An implementation of the earcut polygon triangulation algorithm.
5
+ * The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).
6
+ *
7
+ * @see https://github.com/mapbox/earcut
8
+ */
3
9
  class Earcut {
4
10
 
5
11
  /**
@@ -1,4 +1,4 @@
1
- import { createElementNS } from '../utils.js';
1
+ import { createElementNS, warn } from '../utils.js';
2
2
  import { SRGBToLinear } from '../math/ColorManagement.js';
3
3
 
4
4
  let _canvas;
@@ -125,7 +125,7 @@ class ImageUtils {
125
125
 
126
126
  } else {
127
127
 
128
- console.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );
128
+ warn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );
129
129
  return image;
130
130
 
131
131
  }
@@ -22,19 +22,22 @@ import { Color } from '../math/Color.js';
22
22
  import { WebGLRenderTarget } from '../renderers/WebGLRenderTarget.js';
23
23
  import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';
24
24
  import { BoxGeometry } from '../geometries/BoxGeometry.js';
25
+ import { error, warn } from '../utils.js';
25
26
 
26
27
  const LOD_MIN = 4;
27
28
 
28
- // The standard deviations (radians) associated with the extra mips. These are
29
- // chosen to approximate a Trowbridge-Reitz distribution function times the
30
- // geometric shadowing function. These sigma values squared must match the
31
- // variance #defines in cube_uv_reflection_fragment.glsl.js.
29
+ // The standard deviations (radians) associated with the extra mips.
30
+ // Used for scene blur in fromScene() method.
32
31
  const EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];
33
32
 
34
33
  // The maximum length of the blur for loop. Smaller sigmas will use fewer
35
34
  // samples and exit early, but not recompile the shader.
35
+ // Used for scene blur in fromScene() method.
36
36
  const MAX_SAMPLES = 20;
37
37
 
38
+ // GGX VNDF importance sampling configuration
39
+ const GGX_SAMPLES = 256;
40
+
38
41
  const _flatCamera = /*@__PURE__*/ new OrthographicCamera();
39
42
  const _clearColor = /*@__PURE__*/ new Color();
40
43
  let _oldTarget = null;
@@ -42,24 +45,6 @@ let _oldActiveCubeFace = 0;
42
45
  let _oldActiveMipmapLevel = 0;
43
46
  let _oldXrEnabled = false;
44
47
 
45
- // Golden Ratio
46
- const PHI = ( 1 + Math.sqrt( 5 ) ) / 2;
47
- const INV_PHI = 1 / PHI;
48
-
49
- // Vertices of a dodecahedron (except the opposites, which represent the
50
- // same axis), used as axis directions evenly spread on a sphere.
51
- const _axisDirections = [
52
- /*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ),
53
- /*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),
54
- /*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),
55
- /*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),
56
- /*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),
57
- /*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),
58
- /*@__PURE__*/ new Vector3( - 1, 1, - 1 ),
59
- /*@__PURE__*/ new Vector3( 1, 1, - 1 ),
60
- /*@__PURE__*/ new Vector3( - 1, 1, 1 ),
61
- /*@__PURE__*/ new Vector3( 1, 1, 1 ) ];
62
-
63
48
  const _origin = /*@__PURE__*/ new Vector3();
64
49
 
65
50
  /**
@@ -73,9 +58,11 @@ const _origin = /*@__PURE__*/ new Vector3();
73
58
  * higher roughness levels. In this way we maintain resolution to smoothly
74
59
  * interpolate diffuse lighting while limiting sampling computation.
75
60
  *
76
- * Paper: Fast, Accurate Image-Based Lighting:
77
- * {@link https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view}
78
- */
61
+ * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)
62
+ * importance sampling based on "Sampling the GGX Distribution of Visible Normals"
63
+ * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF
64
+ * used in material rendering for physically-based image-based lighting.
65
+ */
79
66
  class PMREMGenerator {
80
67
 
81
68
  /**
@@ -90,15 +77,17 @@ class PMREMGenerator {
90
77
 
91
78
  this._lodMax = 0;
92
79
  this._cubeSize = 0;
93
- this._lodPlanes = [];
94
80
  this._sizeLods = [];
95
81
  this._sigmas = [];
82
+ this._lodMeshes = [];
83
+
84
+ this._backgroundBox = null;
96
85
 
97
- this._blurMaterial = null;
98
86
  this._cubemapMaterial = null;
99
87
  this._equirectMaterial = null;
100
88
 
101
- this._compileMaterial( this._blurMaterial );
89
+ this._blurMaterial = null;
90
+ this._ggxMaterial = null;
102
91
 
103
92
  }
104
93
 
@@ -223,6 +212,13 @@ class PMREMGenerator {
223
212
  if ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();
224
213
  if ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();
225
214
 
215
+ if ( this._backgroundBox !== null ) {
216
+
217
+ this._backgroundBox.geometry.dispose();
218
+ this._backgroundBox.material.dispose();
219
+
220
+ }
221
+
226
222
  }
227
223
 
228
224
  // private interface
@@ -237,12 +233,13 @@ class PMREMGenerator {
237
233
  _dispose() {
238
234
 
239
235
  if ( this._blurMaterial !== null ) this._blurMaterial.dispose();
236
+ if ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();
240
237
 
241
238
  if ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();
242
239
 
243
- for ( let i = 0; i < this._lodPlanes.length; i ++ ) {
240
+ for ( let i = 0; i < this._lodMeshes.length; i ++ ) {
244
241
 
245
- this._lodPlanes[ i ].dispose();
242
+ this._lodMeshes[ i ].geometry.dispose();
246
243
 
247
244
  }
248
245
 
@@ -314,7 +311,7 @@ class PMREMGenerator {
314
311
  this._pingPongRenderTarget = _createRenderTarget( width, height, params );
315
312
 
316
313
  const { _lodMax } = this;
317
- ( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) );
314
+ ( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );
318
315
 
319
316
  this._blurMaterial = _getBlurShader( _lodMax, width, height );
320
317
 
@@ -326,8 +323,8 @@ class PMREMGenerator {
326
323
 
327
324
  _compileMaterial( material ) {
328
325
 
329
- const tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );
330
- this._renderer.compile( tmpMesh, _flatCamera );
326
+ const mesh = new Mesh( new BufferGeometry(), material );
327
+ this._renderer.compile( mesh, _flatCamera );
331
328
 
332
329
  }
333
330
 
@@ -347,16 +344,36 @@ class PMREMGenerator {
347
344
  renderer.toneMapping = NoToneMapping;
348
345
  renderer.autoClear = false;
349
346
 
350
- const backgroundMaterial = new MeshBasicMaterial( {
351
- name: 'PMREM.Background',
352
- side: BackSide,
353
- depthWrite: false,
354
- depthTest: false,
355
- } );
347
+ // https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812
348
+ const reversedDepthBuffer = renderer.state.buffers.depth.getReversed();
349
+
350
+ if ( reversedDepthBuffer ) {
351
+
352
+ renderer.setRenderTarget( cubeUVRenderTarget );
353
+ renderer.clearDepth();
354
+ renderer.setRenderTarget( null );
355
+
356
+ }
357
+
358
+ if ( this._backgroundBox === null ) {
356
359
 
357
- const backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );
360
+ this._backgroundBox = new Mesh(
361
+ new BoxGeometry(),
362
+ new MeshBasicMaterial( {
363
+ name: 'PMREM.Background',
364
+ side: BackSide,
365
+ depthWrite: false,
366
+ depthTest: false,
367
+ } )
368
+ );
369
+
370
+ }
371
+
372
+ const backgroundBox = this._backgroundBox;
373
+ const backgroundMaterial = backgroundBox.material;
358
374
 
359
375
  let useSolidColor = false;
376
+
360
377
  const background = scene.background;
361
378
 
362
379
  if ( background ) {
@@ -417,9 +434,6 @@ class PMREMGenerator {
417
434
 
418
435
  }
419
436
 
420
- backgroundBox.geometry.dispose();
421
- backgroundBox.material.dispose();
422
-
423
437
  renderer.toneMapping = toneMapping;
424
438
  renderer.autoClear = originalAutoClear;
425
439
  scene.background = background;
@@ -453,7 +467,9 @@ class PMREMGenerator {
453
467
  }
454
468
 
455
469
  const material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;
456
- const mesh = new Mesh( this._lodPlanes[ 0 ], material );
470
+
471
+ const mesh = this._lodMeshes[ 0 ];
472
+ mesh.material = material;
457
473
 
458
474
  const uniforms = material.uniforms;
459
475
 
@@ -473,19 +489,82 @@ class PMREMGenerator {
473
489
  const renderer = this._renderer;
474
490
  const autoClear = renderer.autoClear;
475
491
  renderer.autoClear = false;
476
- const n = this._lodPlanes.length;
477
492
 
493
+ const n = this._lodMeshes.length;
494
+
495
+ // Use GGX VNDF importance sampling
478
496
  for ( let i = 1; i < n; i ++ ) {
479
497
 
480
- const sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );
498
+ this._applyGGXFilter( cubeUVRenderTarget, i - 1, i );
499
+
500
+ }
501
+
502
+ renderer.autoClear = autoClear;
503
+
504
+ }
505
+
506
+ /**
507
+ * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.
508
+ * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the
509
+ * GGX BRDF for physically-based rendering. Reads from the previous LOD level and
510
+ * applies incremental roughness filtering to avoid over-blurring.
511
+ *
512
+ * @private
513
+ * @param {WebGLRenderTarget} cubeUVRenderTarget
514
+ * @param {number} lodIn - Source LOD level to read from
515
+ * @param {number} lodOut - Target LOD level to write to
516
+ */
517
+ _applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {
518
+
519
+ const renderer = this._renderer;
520
+ const pingPongRenderTarget = this._pingPongRenderTarget;
481
521
 
482
- const poleAxis = _axisDirections[ ( n - i - 1 ) % _axisDirections.length ];
522
+ if ( this._ggxMaterial === null ) {
483
523
 
484
- this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );
524
+ const width = 3 * Math.max( this._cubeSize, 16 );
525
+ const height = 4 * this._cubeSize;
526
+ this._ggxMaterial = _getGGXShader( this._lodMax, width, height );
485
527
 
486
528
  }
487
529
 
488
- renderer.autoClear = autoClear;
530
+ const ggxMaterial = this._ggxMaterial;
531
+ const ggxMesh = this._lodMeshes[ lodOut ];
532
+ ggxMesh.material = ggxMaterial;
533
+
534
+ const ggxUniforms = ggxMaterial.uniforms;
535
+
536
+ // Calculate incremental roughness between LOD levels
537
+ const targetRoughness = lodOut / ( this._lodMeshes.length - 1 );
538
+ const sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );
539
+ const incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );
540
+
541
+ // Apply blur strength mapping for better quality across the roughness range
542
+ const blurStrength = 0.05 + targetRoughness * 0.95;
543
+ const adjustedRoughness = incrementalRoughness * blurStrength;
544
+
545
+ // Calculate viewport position based on output LOD level
546
+ const { _lodMax } = this;
547
+ const outputSize = this._sizeLods[ lodOut ];
548
+ const x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );
549
+ const y = 4 * ( this._cubeSize - outputSize );
550
+
551
+ // Read from previous LOD with incremental roughness
552
+ ggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;
553
+ ggxUniforms[ 'roughness' ].value = adjustedRoughness;
554
+ ggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD
555
+
556
+ _setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );
557
+ renderer.setRenderTarget( pingPongRenderTarget );
558
+ renderer.render( ggxMesh, _flatCamera );
559
+
560
+ // Copy from pingPong back to cubeUV (simple direct copy)
561
+ ggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;
562
+ ggxUniforms[ 'roughness' ].value = 0.0; // Direct copy
563
+ ggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote
564
+
565
+ _setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );
566
+ renderer.setRenderTarget( cubeUVRenderTarget );
567
+ renderer.render( ggxMesh, _flatCamera );
489
568
 
490
569
  }
491
570
 
@@ -496,6 +575,8 @@ class PMREMGenerator {
496
575
  * the poles) to approximate the orthogonally-separable blur. It is least
497
576
  * accurate at the poles, but still does a decent job.
498
577
  *
578
+ * Used for initial scene blur in fromScene() method when sigma > 0.
579
+ *
499
580
  * @private
500
581
  * @param {WebGLRenderTarget} cubeUVRenderTarget
501
582
  * @param {number} lodIn
@@ -534,7 +615,7 @@ class PMREMGenerator {
534
615
 
535
616
  if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {
536
617
 
537
- console.error(
618
+ error(
538
619
  'blur direction must be either latitudinal or longitudinal!' );
539
620
 
540
621
  }
@@ -542,7 +623,9 @@ class PMREMGenerator {
542
623
  // Number of standard deviations at which to cut off the discrete approximation.
543
624
  const STANDARD_DEVIATIONS = 3;
544
625
 
545
- const blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );
626
+ const blurMesh = this._lodMeshes[ lodOut ];
627
+ blurMesh.material = blurMaterial;
628
+
546
629
  const blurUniforms = blurMaterial.uniforms;
547
630
 
548
631
  const pixels = this._sizeLods[ lodIn ] - 1;
@@ -552,7 +635,7 @@ class PMREMGenerator {
552
635
 
553
636
  if ( samples > MAX_SAMPLES ) {
554
637
 
555
- console.warn( `sigmaRadians, ${
638
+ warn( `sigmaRadians, ${
556
639
  sigmaRadians}, is too large and will clip, as it requested ${
557
640
  samples} samples when the maximum is set to ${MAX_SAMPLES}` );
558
641
 
@@ -616,9 +699,9 @@ class PMREMGenerator {
616
699
 
617
700
  function _createPlanes( lodMax ) {
618
701
 
619
- const lodPlanes = [];
620
702
  const sizeLods = [];
621
703
  const sigmas = [];
704
+ const lodMeshes = [];
622
705
 
623
706
  let lod = lodMax;
624
707
 
@@ -680,7 +763,7 @@ function _createPlanes( lodMax ) {
680
763
  planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );
681
764
  planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );
682
765
  planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );
683
- lodPlanes.push( planes );
766
+ lodMeshes.push( new Mesh( planes, null ) );
684
767
 
685
768
  if ( lod > LOD_MIN ) {
686
769
 
@@ -690,7 +773,7 @@ function _createPlanes( lodMax ) {
690
773
 
691
774
  }
692
775
 
693
- return { lodPlanes, sizeLods, sigmas };
776
+ return { lodMeshes, sizeLods, sigmas };
694
777
 
695
778
  }
696
779
 
@@ -711,6 +794,147 @@ function _setViewport( target, x, y, width, height ) {
711
794
 
712
795
  }
713
796
 
797
+ function _getGGXShader( lodMax, width, height ) {
798
+
799
+ const shaderMaterial = new ShaderMaterial( {
800
+
801
+ name: 'PMREMGGXConvolution',
802
+
803
+ defines: {
804
+ 'GGX_SAMPLES': GGX_SAMPLES,
805
+ 'CUBEUV_TEXEL_WIDTH': 1.0 / width,
806
+ 'CUBEUV_TEXEL_HEIGHT': 1.0 / height,
807
+ 'CUBEUV_MAX_MIP': `${lodMax}.0`,
808
+ },
809
+
810
+ uniforms: {
811
+ 'envMap': { value: null },
812
+ 'roughness': { value: 0.0 },
813
+ 'mipInt': { value: 0 }
814
+ },
815
+
816
+ vertexShader: _getCommonVertexShader(),
817
+
818
+ fragmentShader: /* glsl */`
819
+
820
+ precision highp float;
821
+ precision highp int;
822
+
823
+ varying vec3 vOutputDirection;
824
+
825
+ uniform sampler2D envMap;
826
+ uniform float roughness;
827
+ uniform float mipInt;
828
+
829
+ #define ENVMAP_TYPE_CUBE_UV
830
+ #include <cube_uv_reflection_fragment>
831
+
832
+ #define PI 3.14159265359
833
+
834
+ // Van der Corput radical inverse
835
+ float radicalInverse_VdC(uint bits) {
836
+ bits = (bits << 16u) | (bits >> 16u);
837
+ bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
838
+ bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
839
+ bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
840
+ bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
841
+ return float(bits) * 2.3283064365386963e-10; // / 0x100000000
842
+ }
843
+
844
+ // Hammersley sequence
845
+ vec2 hammersley(uint i, uint N) {
846
+ return vec2(float(i) / float(N), radicalInverse_VdC(i));
847
+ }
848
+
849
+ // GGX VNDF importance sampling (Eric Heitz 2018)
850
+ // "Sampling the GGX Distribution of Visible Normals"
851
+ // https://jcgt.org/published/0007/04/01/
852
+ vec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {
853
+ float alpha = roughness * roughness;
854
+
855
+ // Section 3.2: Transform view direction to hemisphere configuration
856
+ vec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));
857
+
858
+ // Section 4.1: Orthonormal basis
859
+ float lensq = Vh.x * Vh.x + Vh.y * Vh.y;
860
+ vec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);
861
+ vec3 T2 = cross(Vh, T1);
862
+
863
+ // Section 4.2: Parameterization of projected area
864
+ float r = sqrt(Xi.x);
865
+ float phi = 2.0 * PI * Xi.y;
866
+ float t1 = r * cos(phi);
867
+ float t2 = r * sin(phi);
868
+ float s = 0.5 * (1.0 + Vh.z);
869
+ t2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;
870
+
871
+ // Section 4.3: Reprojection onto hemisphere
872
+ vec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;
873
+
874
+ // Section 3.4: Transform back to ellipsoid configuration
875
+ return normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));
876
+ }
877
+
878
+ void main() {
879
+ vec3 N = normalize(vOutputDirection);
880
+ vec3 V = N; // Assume view direction equals normal for pre-filtering
881
+
882
+ vec3 prefilteredColor = vec3(0.0);
883
+ float totalWeight = 0.0;
884
+
885
+ // For very low roughness, just sample the environment directly
886
+ if (roughness < 0.001) {
887
+ gl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);
888
+ return;
889
+ }
890
+
891
+ // Tangent space basis for VNDF sampling
892
+ vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
893
+ vec3 tangent = normalize(cross(up, N));
894
+ vec3 bitangent = cross(N, tangent);
895
+
896
+ for(uint i = 0u; i < uint(GGX_SAMPLES); i++) {
897
+ vec2 Xi = hammersley(i, uint(GGX_SAMPLES));
898
+
899
+ // For PMREM, V = N, so in tangent space V is always (0, 0, 1)
900
+ vec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);
901
+
902
+ // Transform H back to world space
903
+ vec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);
904
+ vec3 L = normalize(2.0 * dot(V, H) * H - V);
905
+
906
+ float NdotL = max(dot(N, L), 0.0);
907
+
908
+ if(NdotL > 0.0) {
909
+ // Sample environment at fixed mip level
910
+ // VNDF importance sampling handles the distribution filtering
911
+ vec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);
912
+
913
+ // Weight by NdotL for the split-sum approximation
914
+ // VNDF PDF naturally accounts for the visible microfacet distribution
915
+ prefilteredColor += sampleColor * NdotL;
916
+ totalWeight += NdotL;
917
+ }
918
+ }
919
+
920
+ if (totalWeight > 0.0) {
921
+ prefilteredColor = prefilteredColor / totalWeight;
922
+ }
923
+
924
+ gl_FragColor = vec4(prefilteredColor, 1.0);
925
+ }
926
+ `,
927
+
928
+ blending: NoBlending,
929
+ depthTest: false,
930
+ depthWrite: false
931
+
932
+ } );
933
+
934
+ return shaderMaterial;
935
+
936
+ }
937
+
714
938
  function _getBlurShader( lodMax, width, height ) {
715
939
 
716
940
  const weights = new Float32Array( MAX_SAMPLES );
@@ -1,4 +1,4 @@
1
- import { AlphaFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBFormat, RGBAFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, UnsignedByteType, ByteType, UnsignedShortType, ShortType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedIntType, IntType, FloatType, UnsignedInt5999Type } from '../constants.js';
1
+ import { AlphaFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBFormat, RGBAFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, UnsignedByteType, ByteType, UnsignedShortType, ShortType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedIntType, IntType, FloatType, UnsignedInt5999Type, UnsignedInt101111Type } from '../constants.js';
2
2
 
3
3
  /**
4
4
  * Scales the texture as large as possible within its surface without cropping
@@ -215,6 +215,7 @@ function getTextureTypeByteLength( type ) {
215
215
  case FloatType:
216
216
  return { byteLength: 4, components: 1 };
217
217
  case UnsignedInt5999Type:
218
+ case UnsignedInt101111Type:
218
219
  return { byteLength: 4, components: 3 };
219
220
 
220
221
  }