@plastic-software/three 0.181.3 → 0.183.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 (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -15,7 +15,16 @@ export default /* glsl */`
15
15
 
16
16
  #if NUM_DIR_LIGHT_SHADOWS > 0
17
17
 
18
- uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];
18
+ #if defined( SHADOWMAP_TYPE_PCF )
19
+
20
+ uniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];
21
+
22
+ #else
23
+
24
+ uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];
25
+
26
+ #endif
27
+
19
28
  varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];
20
29
 
21
30
  struct DirectionalLightShadow {
@@ -32,7 +41,15 @@ export default /* glsl */`
32
41
 
33
42
  #if NUM_SPOT_LIGHT_SHADOWS > 0
34
43
 
35
- uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];
44
+ #if defined( SHADOWMAP_TYPE_PCF )
45
+
46
+ uniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];
47
+
48
+ #else
49
+
50
+ uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];
51
+
52
+ #endif
36
53
 
37
54
  struct SpotLightShadow {
38
55
  float shadowIntensity;
@@ -48,7 +65,16 @@ export default /* glsl */`
48
65
 
49
66
  #if NUM_POINT_LIGHT_SHADOWS > 0
50
67
 
51
- uniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];
68
+ #if defined( SHADOWMAP_TYPE_PCF )
69
+
70
+ uniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];
71
+
72
+ #elif defined( SHADOWMAP_TYPE_BASIC )
73
+
74
+ uniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];
75
+
76
+ #endif
77
+
52
78
  varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];
53
79
 
54
80
  struct PointLightShadow {
@@ -65,273 +91,286 @@ export default /* glsl */`
65
91
 
66
92
  #endif
67
93
 
68
- float texture2DCompare( sampler2D depths, vec2 uv, float compare ) {
94
+ #if defined( SHADOWMAP_TYPE_PCF )
69
95
 
70
- float depth = unpackRGBAToDepth( texture2D( depths, uv ) );
96
+ // Interleaved Gradient Noise for randomizing sampling patterns
97
+ float interleavedGradientNoise( vec2 position ) {
71
98
 
72
- #ifdef USE_REVERSED_DEPTH_BUFFER
99
+ return fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );
73
100
 
74
- return step( depth, compare );
101
+ }
75
102
 
76
- #else
103
+ // Vogel disk sampling for uniform circular distribution
104
+ vec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {
77
105
 
78
- return step( compare, depth );
106
+ const float goldenAngle = 2.399963229728653;
107
+ float r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );
108
+ float theta = float( sampleIndex ) * goldenAngle + phi;
109
+ return vec2( cos( theta ), sin( theta ) ) * r;
79
110
 
80
- #endif
111
+ }
81
112
 
82
- }
113
+ #endif
83
114
 
84
- vec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {
115
+ #if defined( SHADOWMAP_TYPE_PCF )
85
116
 
86
- return unpackRGBATo2Half( texture2D( shadow, uv ) );
117
+ float getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {
87
118
 
88
- }
119
+ float shadow = 1.0;
89
120
 
90
- float VSMShadow( sampler2D shadow, vec2 uv, float compare ) {
121
+ shadowCoord.xyz /= shadowCoord.w;
122
+ shadowCoord.z += shadowBias;
91
123
 
92
- float occlusion = 1.0;
124
+ bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;
125
+ bool frustumTest = inFrustum && shadowCoord.z <= 1.0;
93
126
 
94
- vec2 distribution = texture2DDistribution( shadow, uv );
127
+ if ( frustumTest ) {
95
128
 
96
- #ifdef USE_REVERSED_DEPTH_BUFFER
129
+ // Hardware PCF with LinearFilter gives us 4-tap filtering per sample
130
+ // 5 samples using Vogel disk + IGN = effectively 20 filtered taps with better distribution
131
+ vec2 texelSize = vec2( 1.0 ) / shadowMapSize;
132
+ float radius = shadowRadius * texelSize.x;
97
133
 
98
- float hard_shadow = step( distribution.x, compare );
134
+ // Use IGN to rotate sampling pattern per pixel
135
+ float phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;
99
136
 
100
- #else
137
+ shadow = (
138
+ texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +
139
+ texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +
140
+ texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +
141
+ texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +
142
+ texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )
143
+ ) * 0.2;
101
144
 
102
- float hard_shadow = step( compare, distribution.x );
145
+ }
103
146
 
104
- #endif
147
+ return mix( 1.0, shadow, shadowIntensity );
148
+
149
+ }
150
+
151
+ #elif defined( SHADOWMAP_TYPE_VSM )
152
+
153
+ float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {
154
+
155
+ float shadow = 1.0;
156
+
157
+ shadowCoord.xyz /= shadowCoord.w;
158
+
159
+ #ifdef USE_REVERSED_DEPTH_BUFFER
160
+
161
+ shadowCoord.z -= shadowBias;
162
+
163
+ #else
164
+
165
+ shadowCoord.z += shadowBias;
166
+
167
+ #endif
168
+
169
+ bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;
170
+ bool frustumTest = inFrustum && shadowCoord.z <= 1.0;
171
+
172
+ if ( frustumTest ) {
173
+
174
+ vec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;
175
+
176
+ float mean = distribution.x;
177
+ float variance = distribution.y * distribution.y;
178
+
179
+ #ifdef USE_REVERSED_DEPTH_BUFFER
180
+
181
+ float hard_shadow = step( mean, shadowCoord.z );
105
182
 
106
- if ( hard_shadow != 1.0 ) {
183
+ #else
107
184
 
108
- float distance = compare - distribution.x;
109
- float variance = max( 0.00000, distribution.y * distribution.y );
110
- float softness_probability = variance / (variance + distance * distance ); // Chebeyshevs inequality
111
- softness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); // 0.3 reduces light bleed
112
- occlusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );
185
+ float hard_shadow = step( shadowCoord.z, mean );
186
+
187
+ #endif
188
+
189
+ // Early return if fully lit
190
+ if ( hard_shadow == 1.0 ) {
191
+
192
+ shadow = 1.0;
193
+
194
+ } else {
195
+
196
+ // Variance must be non-zero to avoid division by zero
197
+ variance = max( variance, 0.0000001 );
198
+
199
+ // Distance from mean
200
+ float d = shadowCoord.z - mean;
201
+
202
+ // Chebyshev's inequality for upper bound on probability
203
+ float p_max = variance / ( variance + d * d );
204
+
205
+ // Reduce light bleeding by remapping [amount, 1] to [0, 1]
206
+ p_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );
207
+
208
+ shadow = max( hard_shadow, p_max );
209
+
210
+ }
211
+
212
+ }
213
+
214
+ return mix( 1.0, shadow, shadowIntensity );
113
215
 
114
216
  }
115
- return occlusion;
116
217
 
117
- }
218
+ #else // SHADOWMAP_TYPE_BASIC
118
219
 
119
- float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {
220
+ float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {
120
221
 
121
- float shadow = 1.0;
222
+ float shadow = 1.0;
122
223
 
123
- shadowCoord.xyz /= shadowCoord.w;
124
- shadowCoord.z += shadowBias;
224
+ shadowCoord.xyz /= shadowCoord.w;
125
225
 
126
- bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;
127
- bool frustumTest = inFrustum && shadowCoord.z <= 1.0;
226
+ #ifdef USE_REVERSED_DEPTH_BUFFER
128
227
 
129
- if ( frustumTest ) {
228
+ shadowCoord.z -= shadowBias;
130
229
 
131
- #if defined( SHADOWMAP_TYPE_PCF )
230
+ #else
132
231
 
133
- vec2 texelSize = vec2( 1.0 ) / shadowMapSize;
232
+ shadowCoord.z += shadowBias;
134
233
 
135
- float dx0 = - texelSize.x * shadowRadius;
136
- float dy0 = - texelSize.y * shadowRadius;
137
- float dx1 = + texelSize.x * shadowRadius;
138
- float dy1 = + texelSize.y * shadowRadius;
139
- float dx2 = dx0 / 2.0;
140
- float dy2 = dy0 / 2.0;
141
- float dx3 = dx1 / 2.0;
142
- float dy3 = dy1 / 2.0;
234
+ #endif
143
235
 
144
- shadow = (
145
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +
146
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +
147
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +
148
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +
149
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +
150
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +
151
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +
152
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +
153
- texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +
154
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +
155
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +
156
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +
157
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +
158
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +
159
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +
160
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +
161
- texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )
162
- ) * ( 1.0 / 17.0 );
163
-
164
- #elif defined( SHADOWMAP_TYPE_PCF_SOFT )
165
-
166
- vec2 texelSize = vec2( 1.0 ) / shadowMapSize;
167
- float dx = texelSize.x;
168
- float dy = texelSize.y;
169
-
170
- vec2 uv = shadowCoord.xy;
171
- vec2 f = fract( uv * shadowMapSize + 0.5 );
172
- uv -= f * texelSize;
236
+ bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;
237
+ bool frustumTest = inFrustum && shadowCoord.z <= 1.0;
173
238
 
174
- shadow = (
175
- texture2DCompare( shadowMap, uv, shadowCoord.z ) +
176
- texture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +
177
- texture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +
178
- texture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +
179
- mix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),
180
- texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),
181
- f.x ) +
182
- mix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),
183
- texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),
184
- f.x ) +
185
- mix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),
186
- texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),
187
- f.y ) +
188
- mix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),
189
- texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),
190
- f.y ) +
191
- mix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),
192
- texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),
193
- f.x ),
194
- mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),
195
- texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),
196
- f.x ),
197
- f.y )
198
- ) * ( 1.0 / 9.0 );
199
-
200
- #elif defined( SHADOWMAP_TYPE_VSM )
201
-
202
- shadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );
203
-
204
- #else // no percentage-closer filtering:
205
-
206
- shadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );
239
+ if ( frustumTest ) {
207
240
 
208
- #endif
241
+ float depth = texture2D( shadowMap, shadowCoord.xy ).r;
242
+
243
+ #ifdef USE_REVERSED_DEPTH_BUFFER
244
+
245
+ shadow = step( depth, shadowCoord.z );
246
+
247
+ #else
248
+
249
+ shadow = step( shadowCoord.z, depth );
250
+
251
+ #endif
252
+
253
+ }
254
+
255
+ return mix( 1.0, shadow, shadowIntensity );
209
256
 
210
257
  }
211
258
 
212
- return mix( 1.0, shadow, shadowIntensity );
259
+ #endif
213
260
 
214
- }
261
+ #if NUM_POINT_LIGHT_SHADOWS > 0
215
262
 
216
- // cubeToUV() maps a 3D direction vector suitable for cube texture mapping to a 2D
217
- // vector suitable for 2D texture mapping. This code uses the following layout for the
218
- // 2D texture:
219
- //
220
- // xzXZ
221
- // y Y
222
- //
223
- // Y - Positive y direction
224
- // y - Negative y direction
225
- // X - Positive x direction
226
- // x - Negative x direction
227
- // Z - Positive z direction
228
- // z - Negative z direction
229
- //
230
- // Source and test bed:
231
- // https://gist.github.com/tschw/da10c43c467ce8afd0c4
263
+ #if defined( SHADOWMAP_TYPE_PCF )
232
264
 
233
- vec2 cubeToUV( vec3 v, float texelSizeY ) {
265
+ float getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {
234
266
 
235
- // Number of texels to avoid at the edge of each square
267
+ float shadow = 1.0;
236
268
 
237
- vec3 absV = abs( v );
269
+ // for point lights, the uniform @vShadowCoord is re-purposed to hold
270
+ // the vector from the light to the world-space position of the fragment.
271
+ vec3 lightToPosition = shadowCoord.xyz;
238
272
 
239
- // Intersect unit cube
273
+ // Direction from light to fragment
274
+ vec3 bd3D = normalize( lightToPosition );
240
275
 
241
- float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );
242
- absV *= scaleToCube;
276
+ // For cube shadow maps, depth is stored as distance along each face's view axis, not radial distance
277
+ // The view-space depth is the maximum component of the direction vector (which face is sampled)
278
+ vec3 absVec = abs( lightToPosition );
279
+ float viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );
243
280
 
244
- // Apply scale to avoid seams
281
+ if ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {
245
282
 
246
- // two texels less per square (one texel will do for NEAREST)
247
- v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );
283
+ // viewZ to perspective depth
248
284
 
249
- // Unwrap
285
+ #ifdef USE_REVERSED_DEPTH_BUFFER
250
286
 
251
- // space: -1 ... 1 range for each square
252
- //
253
- // #X## dim := ( 4 , 2 )
254
- // # # center := ( 1 , 1 )
287
+ float dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );
288
+ dp -= shadowBias;
255
289
 
256
- vec2 planar = v.xy;
290
+ #else
257
291
 
258
- float almostATexel = 1.5 * texelSizeY;
259
- float almostOne = 1.0 - almostATexel;
292
+ float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );
293
+ dp += shadowBias;
260
294
 
261
- if ( absV.z >= almostOne ) {
295
+ #endif
262
296
 
263
- if ( v.z > 0.0 )
264
- planar.x = 4.0 - v.x;
297
+ // Hardware PCF with LinearFilter gives us 4-tap filtering per sample
298
+ // Use Vogel disk + IGN sampling for better quality
299
+ float texelSize = shadowRadius / shadowMapSize.x;
265
300
 
266
- } else if ( absV.x >= almostOne ) {
301
+ // Build a tangent-space coordinate system for applying offsets
302
+ vec3 absDir = abs( bd3D );
303
+ vec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );
304
+ tangent = normalize( cross( bd3D, tangent ) );
305
+ vec3 bitangent = cross( bd3D, tangent );
267
306
 
268
- float signX = sign( v.x );
269
- planar.x = v.z * signX + 2.0 * signX;
307
+ // Use IGN to rotate sampling pattern per pixel
308
+ float phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;
270
309
 
271
- } else if ( absV.y >= almostOne ) {
310
+ vec2 sample0 = vogelDiskSample( 0, 5, phi );
311
+ vec2 sample1 = vogelDiskSample( 1, 5, phi );
312
+ vec2 sample2 = vogelDiskSample( 2, 5, phi );
313
+ vec2 sample3 = vogelDiskSample( 3, 5, phi );
314
+ vec2 sample4 = vogelDiskSample( 4, 5, phi );
272
315
 
273
- float signY = sign( v.y );
274
- planar.x = v.x + 2.0 * signY + 2.0;
275
- planar.y = v.z * signY - 2.0;
316
+ shadow = (
317
+ texture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +
318
+ texture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +
319
+ texture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +
320
+ texture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +
321
+ texture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )
322
+ ) * 0.2;
276
323
 
277
324
  }
278
325
 
279
- // Transform to UV space
280
-
281
- // scale := 0.5 / dim
282
- // translate := ( center + 0.5 ) / dim
283
- return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );
326
+ return mix( 1.0, shadow, shadowIntensity );
284
327
 
285
328
  }
286
329
 
287
- float getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {
330
+ #elif defined( SHADOWMAP_TYPE_BASIC )
331
+
332
+ float getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {
288
333
 
289
334
  float shadow = 1.0;
290
335
 
291
336
  // for point lights, the uniform @vShadowCoord is re-purposed to hold
292
337
  // the vector from the light to the world-space position of the fragment.
293
338
  vec3 lightToPosition = shadowCoord.xyz;
294
-
295
- float lightToPositionLength = length( lightToPosition );
296
-
297
- if ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {
298
339
 
299
- // dp = normalized distance from light to fragment position
300
- float dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); // need to clamp?
301
- dp += shadowBias;
340
+ // For cube shadow maps, depth is stored as distance along each face's view axis, not radial distance
341
+ // The view-space depth is the maximum component of the direction vector (which face is sampled)
342
+ vec3 absVec = abs( lightToPosition );
343
+ float viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );
302
344
 
303
- // bd3D = base direction 3D
304
- vec3 bd3D = normalize( lightToPosition );
345
+ if ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {
305
346
 
306
- vec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );
347
+ // viewZ to perspective depth
307
348
 
308
- #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )
349
+ float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );
350
+ dp += shadowBias;
309
351
 
310
- vec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;
352
+ // Direction from light to fragment
353
+ vec3 bd3D = normalize( lightToPosition );
311
354
 
312
- shadow = (
313
- texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +
314
- texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +
315
- texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +
316
- texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +
317
- texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +
318
- texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +
319
- texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +
320
- texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +
321
- texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )
322
- ) * ( 1.0 / 9.0 );
355
+ float depth = textureCube( shadowMap, bd3D ).r;
323
356
 
324
- #else // no percentage-closer filtering
357
+ #ifdef USE_REVERSED_DEPTH_BUFFER
325
358
 
326
- shadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );
359
+ depth = 1.0 - depth;
327
360
 
328
361
  #endif
329
362
 
363
+ shadow = step( dp, depth );
364
+
330
365
  }
331
366
 
332
367
  return mix( 1.0, shadow, shadowIntensity );
333
368
 
334
369
  }
335
370
 
371
+ #endif
372
+
373
+ #endif
374
+
336
375
  #endif
337
376
  `;
@@ -35,7 +35,7 @@ float getShadowMask() {
35
35
 
36
36
  #endif
37
37
 
38
- #if NUM_POINT_LIGHT_SHADOWS > 0
38
+ #if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )
39
39
 
40
40
  PointLightShadow pointLight;
41
41
 
@@ -24,7 +24,7 @@ export default /* glsl */`
24
24
  vec3 n = inverseTransformDirection( normal, viewMatrix );
25
25
 
26
26
  vec4 transmitted = getIBLVolumeRefraction(
27
- n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
27
+ n, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90,
28
28
  pos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,
29
29
  material.attenuationColor, material.attenuationDistance );
30
30
 
@@ -111,7 +111,7 @@ import * as background from './ShaderLib/background.glsl.js';
111
111
  import * as backgroundCube from './ShaderLib/backgroundCube.glsl.js';
112
112
  import * as cube from './ShaderLib/cube.glsl.js';
113
113
  import * as depth from './ShaderLib/depth.glsl.js';
114
- import * as distanceRGBA from './ShaderLib/distanceRGBA.glsl.js';
114
+ import * as distance from './ShaderLib/distance.glsl.js';
115
115
  import * as equirect from './ShaderLib/equirect.glsl.js';
116
116
  import * as linedashed from './ShaderLib/linedashed.glsl.js';
117
117
  import * as meshbasic from './ShaderLib/meshbasic.glsl.js';
@@ -243,8 +243,8 @@ export const ShaderChunk = {
243
243
  cube_frag: cube.fragment,
244
244
  depth_vert: depth.vertex,
245
245
  depth_frag: depth.fragment,
246
- distanceRGBA_vert: distanceRGBA.vertex,
247
- distanceRGBA_frag: distanceRGBA.fragment,
246
+ distance_vert: distance.vertex,
247
+ distance_frag: distance.fragment,
248
248
  equirect_vert: equirect.vertex,
249
249
  equirect_frag: equirect.fragment,
250
250
  linedashed_vert: linedashed.vertex,
@@ -99,14 +99,17 @@ void main() {
99
99
 
100
100
  #elif DEPTH_PACKING == 3201
101
101
 
102
+ // TODO Deprecate
102
103
  gl_FragColor = packDepthToRGBA( fragCoordZ );
103
104
 
104
105
  #elif DEPTH_PACKING == 3202
105
106
 
107
+ // TODO Deprecate
106
108
  gl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );
107
109
 
108
110
  #elif DEPTH_PACKING == 3203
109
111
 
112
+ // TODO Deprecate
110
113
  gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );
111
114
 
112
115
  #endif
@@ -50,7 +50,6 @@ uniform float farDistance;
50
50
  varying vec3 vWorldPosition;
51
51
 
52
52
  #include <common>
53
- #include <packing>
54
53
  #include <uv_pars_fragment>
55
54
  #include <map_pars_fragment>
56
55
  #include <alphamap_pars_fragment>
@@ -72,7 +71,7 @@ void main () {
72
71
  dist = ( dist - nearDistance ) / ( farDistance - nearDistance );
73
72
  dist = saturate( dist ); // clamp to [ 0, 1 ]
74
73
 
75
- gl_FragColor = packDepthToRGBA( dist );
74
+ gl_FragColor = vec4( dist, 0.0, 0.0, 1.0 );
76
75
 
77
76
  }
78
77
  `;
@@ -58,7 +58,6 @@ uniform vec3 emissive;
58
58
  uniform float opacity;
59
59
 
60
60
  #include <common>
61
- #include <packing>
62
61
  #include <dithering_pars_fragment>
63
62
  #include <color_pars_fragment>
64
63
  #include <uv_pars_fragment>
@@ -69,8 +68,10 @@ uniform float opacity;
69
68
  #include <aomap_pars_fragment>
70
69
  #include <lightmap_pars_fragment>
71
70
  #include <emissivemap_pars_fragment>
71
+ #include <cube_uv_reflection_fragment>
72
72
  #include <envmap_common_pars_fragment>
73
73
  #include <envmap_pars_fragment>
74
+ #include <envmap_physical_pars_fragment>
74
75
  #include <fog_pars_fragment>
75
76
  #include <bsdfs>
76
77
  #include <lights_pars_begin>
@@ -58,7 +58,6 @@ uniform float opacity;
58
58
 
59
59
  #endif
60
60
 
61
- #include <packing>
62
61
  #include <uv_pars_fragment>
63
62
  #include <normal_pars_fragment>
64
63
  #include <bumpmap_pars_fragment>
@@ -75,7 +74,7 @@ void main() {
75
74
  #include <normal_fragment_begin>
76
75
  #include <normal_fragment_maps>
77
76
 
78
- gl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );
77
+ gl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a );
79
78
 
80
79
  #ifdef OPAQUE
81
80
 
@@ -60,7 +60,6 @@ uniform float shininess;
60
60
  uniform float opacity;
61
61
 
62
62
  #include <common>
63
- #include <packing>
64
63
  #include <dithering_pars_fragment>
65
64
  #include <color_pars_fragment>
66
65
  #include <uv_pars_fragment>
@@ -71,8 +70,10 @@ uniform float opacity;
71
70
  #include <aomap_pars_fragment>
72
71
  #include <lightmap_pars_fragment>
73
72
  #include <emissivemap_pars_fragment>
73
+ #include <cube_uv_reflection_fragment>
74
74
  #include <envmap_common_pars_fragment>
75
75
  #include <envmap_pars_fragment>
76
+ #include <envmap_physical_pars_fragment>
76
77
  #include <fog_pars_fragment>
77
78
  #include <bsdfs>
78
79
  #include <lights_pars_begin>