@plastic-software/three 0.179.0 → 0.181.1

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 (430) hide show
  1. package/build/three.cjs +1108 -591
  2. package/build/three.core.js +616 -345
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +488 -250
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +37 -6
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +6576 -2152
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +6575 -2151
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  13. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  14. package/examples/jsm/Addons.js +1 -1
  15. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  16. package/examples/jsm/controls/ArcballControls.js +8 -8
  17. package/examples/jsm/controls/DragControls.js +7 -57
  18. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  19. package/examples/jsm/controls/FlyControls.js +1 -1
  20. package/examples/jsm/controls/OrbitControls.js +2 -2
  21. package/examples/jsm/controls/PointerLockControls.js +2 -10
  22. package/examples/jsm/controls/TrackballControls.js +1 -1
  23. package/examples/jsm/controls/TransformControls.js +1 -1
  24. package/examples/jsm/effects/AsciiEffect.js +8 -8
  25. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  26. package/examples/jsm/exporters/EXRExporter.js +1 -1
  27. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  28. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  29. package/examples/jsm/exporters/PLYExporter.js +1 -1
  30. package/examples/jsm/exporters/USDZExporter.js +9 -2
  31. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  34. package/examples/jsm/geometries/TextGeometry.js +3 -2
  35. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  36. package/examples/jsm/helpers/ViewHelper.js +43 -5
  37. package/examples/jsm/inspector/Inspector.js +427 -0
  38. package/examples/jsm/inspector/RendererInspector.js +415 -0
  39. package/examples/jsm/inspector/tabs/Console.js +204 -0
  40. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  41. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  42. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  43. package/examples/jsm/inspector/ui/Graph.js +95 -0
  44. package/examples/jsm/inspector/ui/Item.js +170 -0
  45. package/examples/jsm/inspector/ui/List.js +75 -0
  46. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  47. package/examples/jsm/inspector/ui/Style.js +654 -0
  48. package/examples/jsm/inspector/ui/Tab.js +46 -0
  49. package/examples/jsm/inspector/ui/Values.js +423 -0
  50. package/examples/jsm/inspector/ui/utils.js +56 -0
  51. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  52. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  53. package/examples/jsm/interactive/SelectionBox.js +30 -0
  54. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  55. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  56. package/examples/jsm/lines/Line2.js +3 -3
  57. package/examples/jsm/lines/LineGeometry.js +1 -1
  58. package/examples/jsm/lines/LineSegments2.js +2 -2
  59. package/examples/jsm/lines/Wireframe.js +2 -2
  60. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  61. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  62. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  63. package/examples/jsm/loaders/3MFLoader.js +1 -1
  64. package/examples/jsm/loaders/ColladaLoader.js +3 -3
  65. package/examples/jsm/loaders/DDSLoader.js +1 -1
  66. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  67. package/examples/jsm/loaders/EXRLoader.js +5 -5
  68. package/examples/jsm/loaders/FBXLoader.js +2 -2
  69. package/examples/jsm/loaders/FontLoader.js +23 -5
  70. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  71. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  72. package/examples/jsm/loaders/HDRLoader.js +486 -0
  73. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  74. package/examples/jsm/loaders/KTXLoader.js +2 -2
  75. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  76. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  77. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  78. package/examples/jsm/loaders/LWOLoader.js +2 -2
  79. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  80. package/examples/jsm/loaders/OBJLoader.js +1 -1
  81. package/examples/jsm/loaders/PDBLoader.js +1 -1
  82. package/examples/jsm/loaders/RGBELoader.js +7 -473
  83. package/examples/jsm/loaders/SVGLoader.js +2 -2
  84. package/examples/jsm/loaders/TTFLoader.js +4 -4
  85. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  86. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  87. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  88. package/examples/jsm/math/ColorSpaces.js +19 -1
  89. package/examples/jsm/math/ConvexHull.js +3 -3
  90. package/examples/jsm/math/ImprovedNoise.js +1 -1
  91. package/examples/jsm/math/Lut.js +2 -2
  92. package/examples/jsm/math/SimplexNoise.js +1 -1
  93. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  94. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  95. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  96. package/examples/jsm/misc/TubePainter.js +383 -40
  97. package/examples/jsm/misc/Volume.js +1 -1
  98. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  99. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  100. package/examples/jsm/objects/Sky.js +1 -1
  101. package/examples/jsm/objects/SkyMesh.js +1 -1
  102. package/examples/jsm/objects/Water.js +3 -3
  103. package/examples/jsm/objects/WaterMesh.js +6 -6
  104. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  105. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  106. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  107. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  108. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  109. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  110. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  111. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  112. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  113. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  114. package/examples/jsm/shaders/BokehShader.js +1 -1
  115. package/examples/jsm/shaders/BokehShader2.js +1 -1
  116. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  117. package/examples/jsm/shaders/FocusShader.js +1 -1
  118. package/examples/jsm/shaders/GTAOShader.js +2 -2
  119. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  120. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  122. package/examples/jsm/shaders/SSRShader.js +1 -1
  123. package/examples/jsm/shaders/SepiaShader.js +1 -1
  124. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  125. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  126. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
  127. package/examples/jsm/shaders/VignetteShader.js +1 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
  129. package/examples/jsm/transpiler/TSLEncoder.js +9 -10
  130. package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
  131. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  132. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  133. package/examples/jsm/tsl/display/BloomNode.js +7 -3
  134. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
  135. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  136. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  137. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  138. package/examples/jsm/tsl/display/GaussianBlurNode.js +49 -35
  139. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  140. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  141. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  142. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  143. package/examples/jsm/tsl/display/TRAANode.js +124 -7
  144. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  145. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  146. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  147. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  148. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  149. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  150. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  151. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  152. package/package.json +5 -10
  153. package/src/Three.Core.js +4 -2
  154. package/src/Three.TSL.js +36 -5
  155. package/src/Three.WebGPU.Nodes.js +2 -0
  156. package/src/Three.WebGPU.js +2 -0
  157. package/src/animation/AnimationClip.js +20 -4
  158. package/src/animation/AnimationMixer.js +3 -3
  159. package/src/animation/AnimationObjectGroup.js +2 -1
  160. package/src/animation/KeyframeTrack.js +7 -6
  161. package/src/animation/PropertyBinding.js +12 -11
  162. package/src/audio/Audio.js +10 -9
  163. package/src/audio/PositionalAudio.js +1 -1
  164. package/src/cameras/OrthographicCamera.js +1 -1
  165. package/src/cameras/PerspectiveCamera.js +1 -1
  166. package/src/cameras/StereoCamera.js +2 -2
  167. package/src/constants.js +11 -3
  168. package/src/core/BufferGeometry.js +10 -10
  169. package/src/core/EventDispatcher.js +1 -1
  170. package/src/core/InterleavedBuffer.js +1 -1
  171. package/src/core/InterleavedBufferAttribute.js +3 -2
  172. package/src/core/Object3D.js +3 -2
  173. package/src/core/Raycaster.js +2 -1
  174. package/src/core/RenderTarget.js +10 -1
  175. package/src/extras/Controls.js +5 -4
  176. package/src/extras/DataUtils.js +2 -1
  177. package/src/extras/Earcut.js +6 -0
  178. package/src/extras/ImageUtils.js +2 -2
  179. package/src/extras/PMREMGenerator.js +268 -55
  180. package/src/extras/TextureUtils.js +2 -1
  181. package/src/extras/core/Curve.js +2 -1
  182. package/src/extras/core/Interpolations.js +7 -1
  183. package/src/extras/core/ShapePath.js +4 -4
  184. package/src/extras/lib/earcut.js +8 -8
  185. package/src/geometries/BoxGeometry.js +1 -0
  186. package/src/geometries/CapsuleGeometry.js +1 -0
  187. package/src/geometries/CircleGeometry.js +1 -0
  188. package/src/geometries/ConeGeometry.js +1 -0
  189. package/src/geometries/CylinderGeometry.js +1 -0
  190. package/src/geometries/DodecahedronGeometry.js +1 -0
  191. package/src/geometries/ExtrudeGeometry.js +8 -6
  192. package/src/geometries/IcosahedronGeometry.js +1 -0
  193. package/src/geometries/LatheGeometry.js +1 -0
  194. package/src/geometries/OctahedronGeometry.js +1 -0
  195. package/src/geometries/PlaneGeometry.js +1 -0
  196. package/src/geometries/RingGeometry.js +1 -0
  197. package/src/geometries/ShapeGeometry.js +1 -0
  198. package/src/geometries/SphereGeometry.js +1 -0
  199. package/src/geometries/TetrahedronGeometry.js +1 -0
  200. package/src/geometries/TorusGeometry.js +1 -0
  201. package/src/geometries/TorusKnotGeometry.js +1 -0
  202. package/src/geometries/TubeGeometry.js +1 -0
  203. package/src/helpers/CameraHelper.js +1 -1
  204. package/src/lights/webgpu/ProjectorLight.js +1 -1
  205. package/src/loaders/AnimationLoader.js +2 -1
  206. package/src/loaders/AudioLoader.js +2 -1
  207. package/src/loaders/BufferGeometryLoader.js +2 -2
  208. package/src/loaders/Cache.js +2 -2
  209. package/src/loaders/DataTextureLoader.js +1 -1
  210. package/src/loaders/FileLoader.js +3 -2
  211. package/src/loaders/ImageBitmapLoader.js +5 -4
  212. package/src/loaders/ImageLoader.js +1 -1
  213. package/src/loaders/Loader.js +3 -3
  214. package/src/loaders/LoadingManager.js +25 -3
  215. package/src/loaders/MaterialLoader.js +3 -2
  216. package/src/loaders/ObjectLoader.js +13 -13
  217. package/src/loaders/TextureLoader.js +1 -1
  218. package/src/loaders/nodes/NodeLoader.js +3 -2
  219. package/src/materials/Material.js +16 -3
  220. package/src/materials/MeshBasicMaterial.js +1 -0
  221. package/src/materials/MeshDepthMaterial.js +1 -0
  222. package/src/materials/MeshDistanceMaterial.js +1 -1
  223. package/src/materials/MeshLambertMaterial.js +2 -1
  224. package/src/materials/MeshMatcapMaterial.js +22 -0
  225. package/src/materials/MeshNormalMaterial.js +1 -0
  226. package/src/materials/MeshPhongMaterial.js +2 -1
  227. package/src/materials/MeshPhysicalMaterial.js +2 -1
  228. package/src/materials/MeshStandardMaterial.js +8 -7
  229. package/src/materials/MeshToonMaterial.js +1 -0
  230. package/src/materials/PointsMaterial.js +1 -1
  231. package/src/materials/ShaderMaterial.js +2 -2
  232. package/src/materials/nodes/Line2NodeMaterial.js +2 -2
  233. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  234. package/src/materials/nodes/NodeMaterial.js +62 -22
  235. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  236. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  237. package/src/materials/nodes/manager/NodeMaterialObserver.js +3 -2
  238. package/src/math/Color.js +6 -5
  239. package/src/math/ColorManagement.js +9 -3
  240. package/src/math/Cylindrical.js +1 -1
  241. package/src/math/Euler.js +2 -1
  242. package/src/math/MathUtils.js +13 -11
  243. package/src/math/Matrix2.js +1 -1
  244. package/src/math/Matrix3.js +2 -2
  245. package/src/math/Matrix4.js +7 -7
  246. package/src/math/Plane.js +1 -1
  247. package/src/math/Quaternion.js +68 -66
  248. package/src/math/Spherical.js +1 -1
  249. package/src/nodes/Nodes.js +4 -1
  250. package/src/nodes/TSL.js +4 -1
  251. package/src/nodes/accessors/BufferNode.js +1 -1
  252. package/src/nodes/accessors/Camera.js +133 -7
  253. package/src/nodes/accessors/ClippingNode.js +6 -5
  254. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  255. package/src/nodes/accessors/InstanceNode.js +25 -5
  256. package/src/nodes/accessors/Lights.js +10 -0
  257. package/src/nodes/accessors/Normal.js +5 -4
  258. package/src/nodes/accessors/Object3DNode.js +1 -1
  259. package/src/nodes/accessors/Position.js +18 -2
  260. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  261. package/src/nodes/accessors/ReferenceNode.js +3 -2
  262. package/src/nodes/accessors/SceneNode.js +2 -1
  263. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  264. package/src/nodes/accessors/StorageTextureNode.js +22 -0
  265. package/src/nodes/accessors/Texture3DNode.js +14 -1
  266. package/src/nodes/accessors/TextureNode.js +130 -44
  267. package/src/nodes/code/FunctionCallNode.js +24 -4
  268. package/src/nodes/code/FunctionNode.js +23 -0
  269. package/src/nodes/core/ArrayNode.js +1 -0
  270. package/src/nodes/core/AssignNode.js +4 -3
  271. package/src/nodes/core/AttributeNode.js +2 -1
  272. package/src/nodes/core/ContextNode.js +29 -10
  273. package/src/nodes/core/IndexNode.js +2 -2
  274. package/src/nodes/core/InputNode.js +2 -1
  275. package/src/nodes/core/InspectorNode.js +128 -0
  276. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
  277. package/src/nodes/core/Node.js +152 -31
  278. package/src/nodes/core/NodeBuilder.js +183 -35
  279. package/src/nodes/core/NodeFrame.js +21 -21
  280. package/src/nodes/core/NodeFunction.js +2 -1
  281. package/src/nodes/core/NodeParser.js +2 -1
  282. package/src/nodes/core/NodeUniform.js +1 -1
  283. package/src/nodes/core/NodeUtils.js +17 -91
  284. package/src/nodes/core/ParameterNode.js +31 -0
  285. package/src/nodes/core/PropertyNode.js +7 -0
  286. package/src/nodes/core/StackNode.js +43 -16
  287. package/src/nodes/core/StructNode.js +5 -5
  288. package/src/nodes/core/StructTypeNode.js +1 -0
  289. package/src/nodes/core/SubBuildNode.js +2 -2
  290. package/src/nodes/core/UniformNode.js +18 -10
  291. package/src/nodes/core/VarNode.js +70 -33
  292. package/src/nodes/core/VaryingNode.js +3 -2
  293. package/src/nodes/display/BlendModes.js +5 -4
  294. package/src/nodes/display/BumpMapNode.js +1 -1
  295. package/src/nodes/display/ColorAdjustment.js +1 -1
  296. package/src/nodes/display/FrontFacingNode.js +4 -8
  297. package/src/nodes/display/NormalMapNode.js +2 -1
  298. package/src/nodes/display/PassNode.js +52 -11
  299. package/src/nodes/display/RenderOutputNode.js +28 -2
  300. package/src/nodes/display/ScreenNode.js +44 -14
  301. package/src/nodes/display/ToneMappingNode.js +31 -4
  302. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  303. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  304. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  305. package/src/nodes/display/ViewportTextureNode.js +42 -12
  306. package/src/nodes/fog/Fog.js +3 -2
  307. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  308. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  309. package/src/nodes/functions/BasicLightingModel.js +2 -1
  310. package/src/nodes/functions/PhysicalLightingModel.js +3 -2
  311. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  312. package/src/nodes/geometry/RangeNode.js +40 -4
  313. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  314. package/src/nodes/gpgpu/ComputeNode.js +17 -5
  315. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  316. package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
  317. package/src/nodes/lighting/EnvironmentNode.js +6 -6
  318. package/src/nodes/lighting/LightsNode.js +3 -4
  319. package/src/nodes/lighting/PointShadowNode.js +6 -0
  320. package/src/nodes/lighting/ShadowFilterNode.js +2 -0
  321. package/src/nodes/lighting/ShadowNode.js +75 -8
  322. package/src/nodes/math/BitcastNode.js +156 -0
  323. package/src/nodes/math/ConditionalNode.js +24 -7
  324. package/src/nodes/math/MathNode.js +25 -19
  325. package/src/nodes/math/OperatorNode.js +7 -5
  326. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  327. package/src/nodes/shapes/Shapes.js +1 -1
  328. package/src/nodes/tsl/TSLBase.js +5 -2
  329. package/src/nodes/tsl/TSLCore.js +460 -159
  330. package/src/nodes/utils/DebugNode.js +2 -1
  331. package/src/nodes/utils/EventNode.js +36 -0
  332. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  333. package/src/nodes/utils/JoinNode.js +6 -3
  334. package/src/nodes/utils/LoopNode.js +20 -24
  335. package/src/nodes/utils/MemberNode.js +59 -7
  336. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  337. package/src/nodes/utils/RTTNode.js +13 -3
  338. package/src/nodes/utils/ReflectorNode.js +58 -7
  339. package/src/nodes/utils/SampleNode.js +12 -2
  340. package/src/nodes/utils/SplitNode.js +11 -0
  341. package/src/nodes/utils/Timer.js +0 -47
  342. package/src/objects/BatchedMesh.js +2 -2
  343. package/src/objects/LOD.js +1 -1
  344. package/src/objects/Line.js +2 -1
  345. package/src/objects/LineSegments.js +2 -1
  346. package/src/objects/Skeleton.js +3 -2
  347. package/src/objects/SkinnedMesh.js +3 -1
  348. package/src/objects/Sprite.js +4 -3
  349. package/src/renderers/WebGLRenderer.js +48 -41
  350. package/src/renderers/common/Animation.js +13 -1
  351. package/src/renderers/common/Attributes.js +1 -1
  352. package/src/renderers/common/Backend.js +108 -27
  353. package/src/renderers/common/Background.js +2 -1
  354. package/src/renderers/common/Bindings.js +58 -2
  355. package/src/renderers/common/CanvasTarget.js +341 -0
  356. package/src/renderers/common/ChainMap.js +1 -1
  357. package/src/renderers/common/DataMap.js +1 -1
  358. package/src/renderers/common/Geometries.js +26 -0
  359. package/src/renderers/common/Info.js +4 -2
  360. package/src/renderers/common/InspectorBase.js +146 -0
  361. package/src/renderers/common/Pipelines.js +1 -1
  362. package/src/renderers/common/PostProcessing.js +6 -25
  363. package/src/renderers/common/QuadMesh.js +7 -1
  364. package/src/renderers/common/RenderContext.js +2 -2
  365. package/src/renderers/common/RenderList.js +7 -3
  366. package/src/renderers/common/RenderObject.js +16 -2
  367. package/src/renderers/common/RenderObjects.js +1 -1
  368. package/src/renderers/common/Renderer.js +473 -245
  369. package/src/renderers/common/RendererUtils.js +9 -0
  370. package/src/renderers/common/SampledTexture.js +9 -1
  371. package/src/renderers/common/Sampler.js +50 -12
  372. package/src/renderers/common/StorageTexture.js +9 -1
  373. package/src/renderers/common/Textures.js +121 -45
  374. package/src/renderers/common/TimestampQueryPool.js +65 -3
  375. package/src/renderers/common/UniformsGroup.js +2 -1
  376. package/src/renderers/common/XRManager.js +42 -22
  377. package/src/renderers/common/extras/PMREMGenerator.js +160 -65
  378. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  379. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  380. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  381. package/src/renderers/common/nodes/Nodes.js +38 -16
  382. package/src/renderers/shaders/DFGLUTData.js +64 -0
  383. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  384. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  386. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  387. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  388. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  389. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  390. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  391. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
  392. package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
  393. package/src/renderers/shaders/UniformsLib.js +1 -0
  394. package/src/renderers/shaders/UniformsUtils.js +25 -4
  395. package/src/renderers/webgl/WebGLCapabilities.js +2 -1
  396. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  397. package/src/renderers/webgl/WebGLInfo.js +3 -1
  398. package/src/renderers/webgl/WebGLProgram.js +15 -14
  399. package/src/renderers/webgl/WebGLPrograms.js +2 -1
  400. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  401. package/src/renderers/webgl/WebGLState.js +15 -14
  402. package/src/renderers/webgl/WebGLTextures.js +19 -14
  403. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  404. package/src/renderers/webgl/WebGLUtils.js +3 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +199 -167
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +181 -25
  407. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  408. package/src/renderers/webgl-fallback/utils/WebGLState.js +7 -6
  409. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +169 -19
  410. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  411. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  412. package/src/renderers/webgpu/WebGPUBackend.js +153 -123
  413. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  414. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  415. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +142 -50
  416. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  417. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
  418. package/src/renderers/webgpu/utils/WebGPUConstants.js +7 -2
  419. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +53 -34
  420. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  421. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +260 -99
  422. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  423. package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
  424. package/src/renderers/webxr/WebXRManager.js +42 -26
  425. package/src/textures/ExternalTexture.js +15 -4
  426. package/src/textures/Source.js +3 -2
  427. package/src/textures/Texture.js +3 -2
  428. package/src/textures/VideoTexture.js +2 -3
  429. package/src/utils.js +67 -3
  430. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
@@ -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
 
@@ -358,16 +355,25 @@ class PMREMGenerator {
358
355
 
359
356
  }
360
357
 
361
- const backgroundMaterial = new MeshBasicMaterial( {
362
- name: 'PMREM.Background',
363
- side: BackSide,
364
- depthWrite: false,
365
- depthTest: false,
366
- } );
358
+ if ( this._backgroundBox === null ) {
367
359
 
368
- 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;
369
374
 
370
375
  let useSolidColor = false;
376
+
371
377
  const background = scene.background;
372
378
 
373
379
  if ( background ) {
@@ -428,9 +434,6 @@ class PMREMGenerator {
428
434
 
429
435
  }
430
436
 
431
- backgroundBox.geometry.dispose();
432
- backgroundBox.material.dispose();
433
-
434
437
  renderer.toneMapping = toneMapping;
435
438
  renderer.autoClear = originalAutoClear;
436
439
  scene.background = background;
@@ -464,7 +467,9 @@ class PMREMGenerator {
464
467
  }
465
468
 
466
469
  const material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;
467
- const mesh = new Mesh( this._lodPlanes[ 0 ], material );
470
+
471
+ const mesh = this._lodMeshes[ 0 ];
472
+ mesh.material = material;
468
473
 
469
474
  const uniforms = material.uniforms;
470
475
 
@@ -484,19 +489,82 @@ class PMREMGenerator {
484
489
  const renderer = this._renderer;
485
490
  const autoClear = renderer.autoClear;
486
491
  renderer.autoClear = false;
487
- const n = this._lodPlanes.length;
488
492
 
493
+ const n = this._lodMeshes.length;
494
+
495
+ // Use GGX VNDF importance sampling
489
496
  for ( let i = 1; i < n; i ++ ) {
490
497
 
491
- 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
+ }
492
501
 
493
- const poleAxis = _axisDirections[ ( n - i - 1 ) % _axisDirections.length ];
502
+ renderer.autoClear = autoClear;
503
+
504
+ }
494
505
 
495
- this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );
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;
521
+
522
+ if ( this._ggxMaterial === null ) {
523
+
524
+ const width = 3 * Math.max( this._cubeSize, 16 );
525
+ const height = 4 * this._cubeSize;
526
+ this._ggxMaterial = _getGGXShader( this._lodMax, width, height );
496
527
 
497
528
  }
498
529
 
499
- 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 );
500
568
 
501
569
  }
502
570
 
@@ -507,6 +575,8 @@ class PMREMGenerator {
507
575
  * the poles) to approximate the orthogonally-separable blur. It is least
508
576
  * accurate at the poles, but still does a decent job.
509
577
  *
578
+ * Used for initial scene blur in fromScene() method when sigma > 0.
579
+ *
510
580
  * @private
511
581
  * @param {WebGLRenderTarget} cubeUVRenderTarget
512
582
  * @param {number} lodIn
@@ -545,7 +615,7 @@ class PMREMGenerator {
545
615
 
546
616
  if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {
547
617
 
548
- console.error(
618
+ error(
549
619
  'blur direction must be either latitudinal or longitudinal!' );
550
620
 
551
621
  }
@@ -553,7 +623,9 @@ class PMREMGenerator {
553
623
  // Number of standard deviations at which to cut off the discrete approximation.
554
624
  const STANDARD_DEVIATIONS = 3;
555
625
 
556
- const blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );
626
+ const blurMesh = this._lodMeshes[ lodOut ];
627
+ blurMesh.material = blurMaterial;
628
+
557
629
  const blurUniforms = blurMaterial.uniforms;
558
630
 
559
631
  const pixels = this._sizeLods[ lodIn ] - 1;
@@ -563,7 +635,7 @@ class PMREMGenerator {
563
635
 
564
636
  if ( samples > MAX_SAMPLES ) {
565
637
 
566
- console.warn( `sigmaRadians, ${
638
+ warn( `sigmaRadians, ${
567
639
  sigmaRadians}, is too large and will clip, as it requested ${
568
640
  samples} samples when the maximum is set to ${MAX_SAMPLES}` );
569
641
 
@@ -627,9 +699,9 @@ class PMREMGenerator {
627
699
 
628
700
  function _createPlanes( lodMax ) {
629
701
 
630
- const lodPlanes = [];
631
702
  const sizeLods = [];
632
703
  const sigmas = [];
704
+ const lodMeshes = [];
633
705
 
634
706
  let lod = lodMax;
635
707
 
@@ -691,7 +763,7 @@ function _createPlanes( lodMax ) {
691
763
  planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );
692
764
  planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );
693
765
  planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );
694
- lodPlanes.push( planes );
766
+ lodMeshes.push( new Mesh( planes, null ) );
695
767
 
696
768
  if ( lod > LOD_MIN ) {
697
769
 
@@ -701,7 +773,7 @@ function _createPlanes( lodMax ) {
701
773
 
702
774
  }
703
775
 
704
- return { lodPlanes, sizeLods, sigmas };
776
+ return { lodMeshes, sizeLods, sigmas };
705
777
 
706
778
  }
707
779
 
@@ -722,6 +794,147 @@ function _setViewport( target, x, y, width, height ) {
722
794
 
723
795
  }
724
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
+
725
938
  function _getBlurShader( lodMax, width, height ) {
726
939
 
727
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
  }
@@ -2,6 +2,7 @@ import { clamp } from '../../math/MathUtils.js';
2
2
  import { Vector2 } from '../../math/Vector2.js';
3
3
  import { Vector3 } from '../../math/Vector3.js';
4
4
  import { Matrix4 } from '../../math/Matrix4.js';
5
+ import { warn } from '../../utils.js';
5
6
 
6
7
  /**
7
8
  * An abstract base class for creating an analytic curve object that contains methods
@@ -66,7 +67,7 @@ class Curve {
66
67
  */
67
68
  getPoint( /* t, optionalTarget */ ) {
68
69
 
69
- console.warn( 'THREE.Curve: .getPoint() not implemented.' );
70
+ warn( 'Curve: .getPoint() not implemented.' );
70
71
 
71
72
  }
72
73
 
@@ -1,4 +1,10 @@
1
- // Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve
1
+ /**
2
+ * Interpolations contains spline and Bézier functions internally used by concrete curve classes.
3
+ *
4
+ * Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve
5
+ *
6
+ * @module Interpolations
7
+ */
2
8
 
3
9
  /**
4
10
  * Computes a point on a Catmull-Rom spline.
@@ -236,7 +236,7 @@ class ShapePath {
236
236
  let holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );
237
237
  holesFirst = isCCW ? ! holesFirst : holesFirst;
238
238
 
239
- // console.log("Holes first", holesFirst);
239
+ // log("Holes first", holesFirst);
240
240
 
241
241
  const betterShapeHoles = [];
242
242
  const newShapes = [];
@@ -264,13 +264,13 @@ class ShapePath {
264
264
  if ( holesFirst ) mainIdx ++;
265
265
  newShapeHoles[ mainIdx ] = [];
266
266
 
267
- //console.log('cw', i);
267
+ //log('cw', i);
268
268
 
269
269
  } else {
270
270
 
271
271
  newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );
272
272
 
273
- //console.log('ccw', i);
273
+ //log('ccw', i);
274
274
 
275
275
  }
276
276
 
@@ -355,7 +355,7 @@ class ShapePath {
355
355
 
356
356
  }
357
357
 
358
- //console.log("shape", shapes);
358
+ //log("shape", shapes);
359
359
 
360
360
  return shapes;
361
361
 
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable */
2
- // copy of mapbox/earcut version 3.0.1
3
- // https://github.com/mapbox/earcut/tree/v3.0.1
2
+ // copy of mapbox/earcut version 3.0.2
3
+ // https://github.com/mapbox/earcut/tree/v3.0.2
4
4
 
5
5
  export default function earcut(data, holeIndices, dim = 2) {
6
6
 
@@ -17,10 +17,10 @@ export default function earcut(data, holeIndices, dim = 2) {
17
17
 
18
18
  // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
19
19
  if (data.length > 80 * dim) {
20
- minX = Infinity;
21
- minY = Infinity;
22
- let maxX = -Infinity;
23
- let maxY = -Infinity;
20
+ minX = data[0];
21
+ minY = data[1];
22
+ let maxX = minX;
23
+ let maxY = minY;
24
24
 
25
25
  for (let i = dim; i < outerLen; i += dim) {
26
26
  const x = data[i];
@@ -296,7 +296,7 @@ function compareXYSlope(a, b) {
296
296
  return result;
297
297
  }
298
298
 
299
- // find a bridge between vertices that connects hole with an outer ring and and link it
299
+ // find a bridge between vertices that connects hole with an outer ring and link it
300
300
  function eliminateHole(hole, outerNode) {
301
301
  const bridge = findHoleBridge(hole, outerNode);
302
302
  if (!bridge) {
@@ -487,7 +487,7 @@ function pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {
487
487
 
488
488
  // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
489
489
  function isValidDiagonal(a, b) {
490
- return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges
490
+ return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges
491
491
  (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
492
492
  (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
493
493
  equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
@@ -15,6 +15,7 @@ import { Vector3 } from '../math/Vector3.js';
15
15
  * ```
16
16
  *
17
17
  * @augments BufferGeometry
18
+ * @demo scenes/geometry-browser.html#BoxGeometry
18
19
  */
19
20
  class BoxGeometry extends BufferGeometry {
20
21
 
@@ -13,6 +13,7 @@ import { Vector3 } from '../math/Vector3.js';
13
13
  * ```
14
14
  *
15
15
  * @augments BufferGeometry
16
+ * @demo scenes/geometry-browser.html#CapsuleGeometry
16
17
  */
17
18
  class CapsuleGeometry extends BufferGeometry {
18
19
 
@@ -19,6 +19,7 @@ import { Vector2 } from '../math/Vector2.js';
19
19
  * ```
20
20
  *
21
21
  * @augments BufferGeometry
22
+ * @demo scenes/geometry-browser.html#CircleGeometry
22
23
  */
23
24
  class CircleGeometry extends BufferGeometry {
24
25
 
@@ -11,6 +11,7 @@ import { CylinderGeometry } from './CylinderGeometry.js';
11
11
  * ```
12
12
  *
13
13
  * @augments CylinderGeometry
14
+ * @demo scenes/geometry-browser.html#ConeGeometry
14
15
  */
15
16
  class ConeGeometry extends CylinderGeometry {
16
17
 
@@ -14,6 +14,7 @@ import { Vector2 } from '../math/Vector2.js';
14
14
  * ```
15
15
  *
16
16
  * @augments BufferGeometry
17
+ * @demo scenes/geometry-browser.html#CylinderGeometry
17
18
  */
18
19
  class CylinderGeometry extends BufferGeometry {
19
20
 
@@ -11,6 +11,7 @@ import { PolyhedronGeometry } from './PolyhedronGeometry.js';
11
11
  * ```
12
12
  *
13
13
  * @augments PolyhedronGeometry
14
+ * @demo scenes/geometry-browser.html#DodecahedronGeometry
14
15
  */
15
16
  class DodecahedronGeometry extends PolyhedronGeometry {
16
17