@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
@@ -1,5 +1,5 @@
1
- import { Color } from 'three';
2
- import { attribute, cameraProjectionMatrix, dot, float, Fn, modelViewMatrix, modelViewProjection, NodeMaterial, normalize, positionGeometry, sign, uniform, varyingProperty, vec2, vec4 } from 'three/tsl';
1
+ import { Color, NodeMaterial } from 'three/webgpu';
2
+ import { attribute, cameraProjectionMatrix, dot, float, Fn, modelViewMatrix, modelViewProjection, normalize, positionGeometry, sign, uniform, varyingProperty, vec2, vec4 } from 'three/tsl';
3
3
 
4
4
  /**
5
5
  * A special line material for meshes loaded via {@link LDrawLoader}.
@@ -297,7 +297,7 @@ const woodParams = {
297
297
  teak: {
298
298
  transformationMatrix: new THREE.Matrix4().identity(),
299
299
  centerSize: 1.11, largeWarpScale: 0.32, largeGrainStretch: 0.24, smallWarpStrength: 0.059,
300
- smallWarpScale: 2, fineWarpStrength: 0.006, fineWarpScale: 32.8, ringThickness: 1/34,
300
+ smallWarpScale: 2, fineWarpStrength: 0.006, fineWarpScale: 32.8, ringThickness: 1 / 34,
301
301
  ringBias: 0.03, ringSizeVariance: 0.03, ringVarianceScale: 4.4, barkThickness: 0.3,
302
302
  splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 910, cellSize: 0.1,
303
303
  darkGrainColor: '#0c0504', lightGrainColor: '#926c50'
@@ -305,7 +305,7 @@ const woodParams = {
305
305
  walnut: {
306
306
  transformationMatrix: new THREE.Matrix4().identity(),
307
307
  centerSize: 1.07, largeWarpScale: 0.42, largeGrainStretch: 0.34, smallWarpStrength: 0.016,
308
- smallWarpScale: 10.3, fineWarpStrength: 0.028, fineWarpScale: 12.7, ringThickness: 1/32,
308
+ smallWarpScale: 10.3, fineWarpStrength: 0.028, fineWarpScale: 12.7, ringThickness: 1 / 32,
309
309
  ringBias: 0.08, ringSizeVariance: 0.03, ringVarianceScale: 5.5, barkThickness: 0.98,
310
310
  splotchScale: 1.84, splotchIntensity: 0.97, cellScale: 710, cellSize: 0.31,
311
311
  darkGrainColor: '#311e13', lightGrainColor: '#523424'
@@ -313,7 +313,7 @@ const woodParams = {
313
313
  white_oak: {
314
314
  transformationMatrix: new THREE.Matrix4().identity(),
315
315
  centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.21, smallWarpStrength: 0.034,
316
- smallWarpScale: 2.44, fineWarpStrength: 0.01, fineWarpScale: 14.3, ringThickness: 1/34,
316
+ smallWarpScale: 2.44, fineWarpStrength: 0.01, fineWarpScale: 14.3, ringThickness: 1 / 34,
317
317
  ringBias: 0.82, ringSizeVariance: 0.16, ringVarianceScale: 1.4, barkThickness: 0.7,
318
318
  splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 800, cellSize: 0.28,
319
319
  darkGrainColor: '#8b4c21', lightGrainColor: '#c57e43'
@@ -321,7 +321,7 @@ const woodParams = {
321
321
  pine: {
322
322
  transformationMatrix: new THREE.Matrix4().identity(),
323
323
  centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.18, smallWarpStrength: 0.041,
324
- smallWarpScale: 2.44, fineWarpStrength: 0.006, fineWarpScale: 23.2, ringThickness: 1/24,
324
+ smallWarpScale: 2.44, fineWarpStrength: 0.006, fineWarpScale: 23.2, ringThickness: 1 / 24,
325
325
  ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 5, barkThickness: 0.35,
326
326
  splotchScale: 0.51, splotchIntensity: 3.32, cellScale: 1480, cellSize: 0.07,
327
327
  darkGrainColor: '#c58355', lightGrainColor: '#d19d61'
@@ -329,7 +329,7 @@ const woodParams = {
329
329
  poplar: {
330
330
  transformationMatrix: new THREE.Matrix4().identity(),
331
331
  centerSize: 1.43, largeWarpScale: 0.33, largeGrainStretch: 0.18, smallWarpStrength: 0.04,
332
- smallWarpScale: 4.3, fineWarpStrength: 0.004, fineWarpScale: 33.6, ringThickness: 1/37,
332
+ smallWarpScale: 4.3, fineWarpStrength: 0.004, fineWarpScale: 33.6, ringThickness: 1 / 37,
333
333
  ringBias: 0.07, ringSizeVariance: 0.03, ringVarianceScale: 3.8, barkThickness: 0.3,
334
334
  splotchScale: 1.92, splotchIntensity: 0.71, cellScale: 830, cellSize: 0.04,
335
335
  darkGrainColor: '#716347', lightGrainColor: '#998966'
@@ -337,7 +337,7 @@ const woodParams = {
337
337
  maple: {
338
338
  transformationMatrix: new THREE.Matrix4().identity(),
339
339
  centerSize: 1.4, largeWarpScale: 0.38, largeGrainStretch: 0.25, smallWarpStrength: 0.067,
340
- smallWarpScale: 2.5, fineWarpStrength: 0.005, fineWarpScale: 33.6, ringThickness: 1/35,
340
+ smallWarpScale: 2.5, fineWarpStrength: 0.005, fineWarpScale: 33.6, ringThickness: 1 / 35,
341
341
  ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 4.6, barkThickness: 0.61,
342
342
  splotchScale: 0.46, splotchIntensity: 1.49, cellScale: 800, cellSize: 0.03,
343
343
  darkGrainColor: '#b08969', lightGrainColor: '#bc9d7d'
@@ -345,7 +345,7 @@ const woodParams = {
345
345
  red_oak: {
346
346
  transformationMatrix: new THREE.Matrix4().identity(),
347
347
  centerSize: 1.21, largeWarpScale: 0.24, largeGrainStretch: 0.25, smallWarpStrength: 0.044,
348
- smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 14.5, ringThickness: 1/34,
348
+ smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 14.5, ringThickness: 1 / 34,
349
349
  ringBias: 0.92, ringSizeVariance: 0.03, ringVarianceScale: 5.6, barkThickness: 1.01,
350
350
  splotchScale: 0.28, splotchIntensity: 3.48, cellScale: 800, cellSize: 0.25,
351
351
  darkGrainColor: '#af613b', lightGrainColor: '#e0a27a'
@@ -353,7 +353,7 @@ const woodParams = {
353
353
  cherry: {
354
354
  transformationMatrix: new THREE.Matrix4().identity(),
355
355
  centerSize: 1.33, largeWarpScale: 0.11, largeGrainStretch: 0.33, smallWarpStrength: 0.024,
356
- smallWarpScale: 2.48, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/36,
356
+ smallWarpScale: 2.48, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1 / 36,
357
357
  ringBias: 0.02, ringSizeVariance: 0.04, ringVarianceScale: 6.5, barkThickness: 0.09,
358
358
  splotchScale: 1.27, splotchIntensity: 1.24, cellScale: 1530, cellSize: 0.15,
359
359
  darkGrainColor: '#913f27', lightGrainColor: '#b45837'
@@ -361,7 +361,7 @@ const woodParams = {
361
361
  cedar: {
362
362
  transformationMatrix: new THREE.Matrix4().identity(),
363
363
  centerSize: 1.11, largeWarpScale: 0.39, largeGrainStretch: 0.12, smallWarpStrength: 0.061,
364
- smallWarpScale: 1.9, fineWarpStrength: 0.006, fineWarpScale: 4.8, ringThickness: 1/25,
364
+ smallWarpScale: 1.9, fineWarpStrength: 0.006, fineWarpScale: 4.8, ringThickness: 1 / 25,
365
365
  ringBias: 0.01, ringSizeVariance: 0.07, ringVarianceScale: 6.7, barkThickness: 0.1,
366
366
  splotchScale: 0.61, splotchIntensity: 2.54, cellScale: 630, cellSize: 0.19,
367
367
  darkGrainColor: '#9a5b49', lightGrainColor: '#ae745e'
@@ -369,7 +369,7 @@ const woodParams = {
369
369
  mahogany: {
370
370
  transformationMatrix: new THREE.Matrix4().identity(),
371
371
  centerSize: 1.25, largeWarpScale: 0.26, largeGrainStretch: 0.29, smallWarpStrength: 0.044,
372
- smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/38,
372
+ smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1 / 38,
373
373
  ringBias: 0.01, ringSizeVariance: 0.33, ringVarianceScale: 1.2, barkThickness: 0.07,
374
374
  splotchScale: 0.77, splotchIntensity: 1.39, cellScale: 1400, cellSize: 0.23,
375
375
  darkGrainColor: '#501d12', lightGrainColor: '#6d3722'
@@ -433,7 +433,7 @@ uniforms.lightGrainColor = TSL.uniform( new THREE.Color( params.lightGrainColor
433
433
  uniforms.transformationMatrix = TSL.uniform( new THREE.Matrix4().copy( params.transformationMatrix ) ).onObjectUpdate( ( { material } ) => material.transformationMatrix );
434
434
 
435
435
  const colorNode = wood(
436
- uniforms.transformationMatrix.mul( TSL.vec4(TSL.positionLocal, 1) ).xyz,
436
+ uniforms.transformationMatrix.mul( TSL.vec4( TSL.positionLocal, 1 ) ).xyz,
437
437
  uniforms.centerSize,
438
438
  uniforms.largeWarpScale,
439
439
  uniforms.largeGrainStretch,
@@ -17,8 +17,10 @@ const _point2 = new Vector3();
17
17
  const _plane = new Plane();
18
18
  const _line1 = new Line3();
19
19
  const _line2 = new Line3();
20
+ const _box = new Box3();
20
21
  const _sphere = new Sphere();
21
22
  const _capsule = new Capsule();
23
+ const _center = new Vector3();
22
24
 
23
25
  const _temp1 = new Vector3();
24
26
  const _temp2 = new Vector3();
@@ -373,6 +375,61 @@ class Octree {
373
375
 
374
376
  }
375
377
 
378
+ /**
379
+ * Computes the intersection between the given bounding box and triangle.
380
+ *
381
+ * @param {Box3} box - The bounding box to test.
382
+ * @param {Triangle} triangle - The triangle to test.
383
+ * @return {Object|false} The intersection object. If no intersection
384
+ * is detected, the method returns `false`.
385
+ */
386
+ triangleBoxIntersect( box, triangle ) {
387
+
388
+ // cheap check
389
+
390
+ if ( Math.max( triangle.a.x, triangle.b.x, triangle.c.x ) < box.min.x ||
391
+ Math.min( triangle.a.x, triangle.b.x, triangle.c.x ) > box.max.x ||
392
+ Math.max( triangle.a.y, triangle.b.y, triangle.c.y ) < box.min.y ||
393
+ Math.min( triangle.a.y, triangle.b.y, triangle.c.y ) > box.max.y ||
394
+ Math.max( triangle.a.z, triangle.b.z, triangle.c.z ) < box.min.z ||
395
+ Math.min( triangle.a.z, triangle.b.z, triangle.c.z ) > box.max.z ) {
396
+
397
+ return false;
398
+
399
+ }
400
+
401
+ // expensive check
402
+
403
+ if ( ! box.intersectsTriangle( triangle ) ) return false;
404
+
405
+ // there is an intersection, now compute collision data
406
+
407
+ triangle.getPlane( _plane );
408
+
409
+ // determine which corner of the box is "deepest" into the plane
410
+
411
+ _v1.x = ( _plane.normal.x > 0 ) ? box.min.x : box.max.x;
412
+ _v1.y = ( _plane.normal.y > 0 ) ? box.min.y : box.max.y;
413
+ _v1.z = ( _plane.normal.z > 0 ) ? box.min.z : box.max.z;
414
+
415
+ // Calculate the distance from the plane to that corner (the distance will be negative
416
+ // because of the intersection)
417
+
418
+ const distance = _plane.distanceToPoint( _v1 );
419
+
420
+ const intersection = {
421
+ depth: - distance, // Flip sign so depth is positive
422
+ normal: _plane.normal.clone(),
423
+ point: _v1.clone()
424
+ };
425
+
426
+ // project the point onto the triangle surface
427
+ intersection.point.addScaledVector( intersection.normal, distance );
428
+
429
+ return intersection;
430
+
431
+ }
432
+
376
433
  /**
377
434
  * Computes the intersection between the given sphere and triangle.
378
435
  *
@@ -455,6 +512,38 @@ class Octree {
455
512
 
456
513
  }
457
514
 
515
+ /**
516
+ * Computes the triangles that potentially intersect with the given bounding box.
517
+ *
518
+ * @param {Box3} box - The bounding box.
519
+ * @param {Array<Triangle>} triangles - The target array that holds the triangles.
520
+ */
521
+ getBoxTriangles( box, triangles ) {
522
+
523
+ for ( let i = 0; i < this.subTrees.length; i ++ ) {
524
+
525
+ const subTree = this.subTrees[ i ];
526
+
527
+ if ( ! box.intersectsBox( subTree.box ) ) continue;
528
+
529
+ if ( subTree.triangles.length > 0 ) {
530
+
531
+ for ( let j = 0; j < subTree.triangles.length; j ++ ) {
532
+
533
+ if ( triangles.indexOf( subTree.triangles[ j ] ) === - 1 ) triangles.push( subTree.triangles[ j ] );
534
+
535
+ }
536
+
537
+ } else {
538
+
539
+ subTree.getBoxTriangles( box, triangles );
540
+
541
+ }
542
+
543
+ }
544
+
545
+ }
546
+
458
547
  /**
459
548
  * Computes the triangles that potentially intersect with the given capsule.
460
549
  *
@@ -487,6 +576,47 @@ class Octree {
487
576
 
488
577
  }
489
578
 
579
+ /**
580
+ * Performs a bounding box intersection test with this Octree.
581
+ *
582
+ * @param {Box3} box - The bounding box to test.
583
+ * @return {Object|boolean} The intersection object. If no intersection
584
+ * is detected, the method returns `false`.
585
+ */
586
+ boxIntersect( box ) {
587
+
588
+ _box.copy( box );
589
+
590
+ const triangles = [];
591
+ let result, hit = false;
592
+
593
+ this.getBoxTriangles( box, triangles );
594
+
595
+ for ( let i = 0; i < triangles.length; i ++ ) {
596
+
597
+ if ( result = this.triangleBoxIntersect( _box, triangles[ i ] ) ) {
598
+
599
+ hit = true;
600
+
601
+ _box.translate( result.normal.multiplyScalar( result.depth ) );
602
+
603
+ }
604
+
605
+ }
606
+
607
+ if ( hit ) {
608
+
609
+ const collisionVector = _box.getCenter( _center ).sub( box.getCenter( _v1 ) );
610
+ const depth = collisionVector.length();
611
+
612
+ return { normal: collisionVector.normalize(), depth: depth };
613
+
614
+ }
615
+
616
+ return false;
617
+
618
+ }
619
+
490
620
  /**
491
621
  * Performs a bounding sphere intersection test with this Octree.
492
622
  *
@@ -558,7 +688,7 @@ class Octree {
558
688
 
559
689
  if ( hit ) {
560
690
 
561
- const collisionVector = _capsule.getCenter( new Vector3() ).sub( capsule.getCenter( _v1 ) );
691
+ const collisionVector = _capsule.getCenter( _center ).sub( capsule.getCenter( _v1 ) );
562
692
  const depth = collisionVector.length();
563
693
 
564
694
  return { normal: collisionVector.normalize(), depth: depth };
@@ -123,7 +123,6 @@ class Volume {
123
123
  case 'uint64' :
124
124
  case 'uint64_t' :
125
125
  throw new Error( 'Error in Volume constructor : this type is not supported in JavaScript' );
126
- break;
127
126
  case 'Float32' :
128
127
  case 'float32' :
129
128
  case 'float' :
@@ -54,7 +54,6 @@ class VolumeSlice {
54
54
 
55
55
  index = value;
56
56
  slice.geometryNeedsUpdate = true;
57
- return index;
58
57
 
59
58
  }
60
59
  } );
@@ -215,7 +215,7 @@ class LensflareMesh extends Mesh {
215
215
 
216
216
  renderer.getViewport( viewport );
217
217
 
218
- viewport.multiplyScalar( window.devicePixelRatio );
218
+ viewport.multiplyScalar( renderer.getPixelRatio() ).floor();
219
219
 
220
220
  const renderTarget = renderer.getRenderTarget();
221
221
  const type = ( renderTarget !== null ) ? renderTarget.texture.type : UnsignedByteType;
@@ -72,7 +72,13 @@ Sky.SkyShader = {
72
72
  'mieCoefficient': { value: 0.005 },
73
73
  'mieDirectionalG': { value: 0.8 },
74
74
  'sunPosition': { value: new Vector3() },
75
- 'up': { value: new Vector3( 0, 1, 0 ) }
75
+ 'up': { value: new Vector3( 0, 1, 0 ) },
76
+ 'cloudScale': { value: 0.0002 },
77
+ 'cloudSpeed': { value: 0.0001 },
78
+ 'cloudCoverage': { value: 0.4 },
79
+ 'cloudDensity': { value: 0.4 },
80
+ 'cloudElevation': { value: 0.5 },
81
+ 'time': { value: 0.0 }
76
82
  },
77
83
 
78
84
  vertexShader: /* glsl */`
@@ -150,13 +156,45 @@ Sky.SkyShader = {
150
156
  fragmentShader: /* glsl */`
151
157
  varying vec3 vWorldPosition;
152
158
  varying vec3 vSunDirection;
153
- varying float vSunfade;
154
159
  varying vec3 vBetaR;
155
160
  varying vec3 vBetaM;
156
161
  varying float vSunE;
157
162
 
158
163
  uniform float mieDirectionalG;
159
164
  uniform vec3 up;
165
+ uniform float cloudScale;
166
+ uniform float cloudSpeed;
167
+ uniform float cloudCoverage;
168
+ uniform float cloudDensity;
169
+ uniform float cloudElevation;
170
+ uniform float time;
171
+
172
+ // Cloud noise functions
173
+ float hash( vec2 p ) {
174
+ return fract( sin( dot( p, vec2( 127.1, 311.7 ) ) ) * 43758.5453123 );
175
+ }
176
+
177
+ float noise( vec2 p ) {
178
+ vec2 i = floor( p );
179
+ vec2 f = fract( p );
180
+ f = f * f * ( 3.0 - 2.0 * f );
181
+ float a = hash( i );
182
+ float b = hash( i + vec2( 1.0, 0.0 ) );
183
+ float c = hash( i + vec2( 0.0, 1.0 ) );
184
+ float d = hash( i + vec2( 1.0, 1.0 ) );
185
+ return mix( mix( a, b, f.x ), mix( c, d, f.x ), f.y );
186
+ }
187
+
188
+ float fbm( vec2 p ) {
189
+ float value = 0.0;
190
+ float amplitude = 0.5;
191
+ for ( int i = 0; i < 5; i ++ ) {
192
+ value += amplitude * noise( p );
193
+ p *= 2.0;
194
+ amplitude *= 0.5;
195
+ }
196
+ return value;
197
+ }
160
198
 
161
199
  // constants for atmospheric scattering
162
200
  const float pi = 3.141592653589793238462643383279502884197169;
@@ -223,9 +261,43 @@ Sky.SkyShader = {
223
261
 
224
262
  vec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );
225
263
 
226
- vec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );
264
+ // Clouds
265
+ if ( direction.y > 0.0 && cloudCoverage > 0.0 ) {
266
+
267
+ // Project to cloud plane (higher elevation = clouds appear lower/closer)
268
+ float elevation = mix( 1.0, 0.1, cloudElevation );
269
+ vec2 cloudUV = direction.xz / ( direction.y * elevation );
270
+ cloudUV *= cloudScale;
271
+ cloudUV += time * cloudSpeed;
272
+
273
+ // Multi-octave noise for fluffy clouds
274
+ float cloudNoise = fbm( cloudUV * 1000.0 );
275
+ cloudNoise += 0.5 * fbm( cloudUV * 2000.0 + 3.7 );
276
+ cloudNoise = cloudNoise * 0.5 + 0.5;
277
+
278
+ // Apply coverage threshold
279
+ float cloudMask = smoothstep( 1.0 - cloudCoverage, 1.0 - cloudCoverage + 0.3, cloudNoise );
280
+
281
+ // Fade clouds near horizon (adjusted by elevation)
282
+ float horizonFade = smoothstep( 0.0, 0.1 + 0.2 * cloudElevation, direction.y );
283
+ cloudMask *= horizonFade;
284
+
285
+ // Cloud lighting based on sun position
286
+ float sunInfluence = dot( direction, vSunDirection ) * 0.5 + 0.5;
287
+ float daylight = max( 0.0, vSunDirection.y * 2.0 );
288
+
289
+ // Base cloud color affected by atmosphere
290
+ vec3 atmosphereColor = Lin * 0.04;
291
+ vec3 cloudColor = mix( vec3( 0.3 ), vec3( 1.0 ), daylight );
292
+ cloudColor = mix( cloudColor, atmosphereColor + vec3( 1.0 ), sunInfluence * 0.5 );
293
+ cloudColor *= vSunE * 0.00002;
294
+
295
+ // Blend clouds with sky
296
+ texColor = mix( texColor, cloudColor, cloudMask * cloudDensity );
297
+
298
+ }
227
299
 
228
- gl_FragColor = vec4( retColor, 1.0 );
300
+ gl_FragColor = vec4( texColor, 1.0 );
229
301
 
230
302
  #include <tonemapping_fragment>
231
303
  #include <colorspace_fragment>
@@ -6,14 +6,14 @@ import {
6
6
  NodeMaterial
7
7
  } from 'three/webgpu';
8
8
 
9
- import { Fn, float, vec3, acos, add, mul, clamp, cos, dot, exp, max, mix, modelViewProjection, normalize, positionWorld, pow, smoothstep, sub, varyingProperty, vec4, uniform, cameraPosition } from 'three/tsl';
9
+ import { Fn, float, vec2, vec3, acos, add, mul, clamp, cos, dot, exp, max, mix, modelViewProjection, normalize, positionWorld, pow, smoothstep, sub, varyingProperty, vec4, uniform, cameraPosition, fract, floor, sin, time, Loop, If } from 'three/tsl';
10
10
 
11
11
  /**
12
12
  * Represents a skydome for scene backgrounds. Based on [A Practical Analytic Model for Daylight](https://www.researchgate.net/publication/220720443_A_Practical_Analytic_Model_for_Daylight)
13
13
  * aka The Preetham Model, the de facto standard for analytical skydomes.
14
14
  *
15
- * Note that this class can only be used with {@link WebGLRenderer}.
16
- * When using {@link WebGPURenderer}, use {@link SkyMesh}.
15
+ * Note that this class can only be used with {@link WebGPURenderer}.
16
+ * When using {@link WebGLRenderer}, use {@link Sky}.
17
17
  *
18
18
  * More references:
19
19
  *
@@ -82,6 +82,51 @@ class SkyMesh extends Mesh {
82
82
  */
83
83
  this.upUniform = uniform( new Vector3( 0, 1, 0 ) );
84
84
 
85
+ /**
86
+ * The cloud scale uniform.
87
+ *
88
+ * @type {UniformNode<float>}
89
+ */
90
+ this.cloudScale = uniform( 0.0002 );
91
+
92
+ /**
93
+ * The cloud speed uniform.
94
+ *
95
+ * @type {UniformNode<float>}
96
+ */
97
+ this.cloudSpeed = uniform( 0.0001 );
98
+
99
+ /**
100
+ * The cloud coverage uniform.
101
+ *
102
+ * @type {UniformNode<float>}
103
+ */
104
+ this.cloudCoverage = uniform( 0.4 );
105
+
106
+ /**
107
+ * The cloud density uniform.
108
+ *
109
+ * @type {UniformNode<float>}
110
+ */
111
+ this.cloudDensity = uniform( 0.4 );
112
+
113
+ /**
114
+ * The cloud elevation uniform.
115
+ *
116
+ * @type {UniformNode<float>}
117
+ */
118
+ this.cloudElevation = uniform( 0.5 );
119
+
120
+ /**
121
+ * This flag can be used for type testing.
122
+ *
123
+ * @type {boolean}
124
+ * @readonly
125
+ * @default true
126
+ * @deprecated Use isSkyMesh instead.
127
+ */
128
+ this.isSky = true; // @deprecated, r182
129
+
85
130
  /**
86
131
  * This flag can be used for type testing.
87
132
  *
@@ -89,13 +134,12 @@ class SkyMesh extends Mesh {
89
134
  * @readonly
90
135
  * @default true
91
136
  */
92
- this.isSky = true;
137
+ this.isSkyMesh = true;
93
138
 
94
139
  // Varyings
95
140
 
96
141
  const vSunDirection = varyingProperty( 'vec3' );
97
142
  const vSunE = varyingProperty( 'float' );
98
- const vSunfade = varyingProperty( 'float' );
99
143
  const vBetaR = varyingProperty( 'vec3' );
100
144
  const vBetaM = varyingProperty( 'vec3' );
101
145
 
@@ -136,10 +180,9 @@ class SkyMesh extends Mesh {
136
180
  const sunIntensity = EE.mul( max( 0.0, float( 1.0 ).sub( pow( e, cutoffAngle.sub( acos( zenithAngleCos ) ).div( steepness ).negate() ) ) ) );
137
181
  vSunE.assign( sunIntensity );
138
182
 
139
- // varying sun fade
183
+ // sun fade
140
184
 
141
185
  const sunfade = float( 1.0 ).sub( clamp( float( 1.0 ).sub( exp( this.sunPosition.y.div( 450000.0 ) ) ), 0, 1 ) );
142
- vSunfade.assign( sunfade );
143
186
 
144
187
  // varying vBetaR
145
188
 
@@ -222,11 +265,85 @@ class SkyMesh extends Mesh {
222
265
  const sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos.add( 0.00002 ), cosTheta );
223
266
  L0.addAssign( vSunE.mul( 19000.0 ).mul( Fex ).mul( sundisk ) );
224
267
 
225
- const texColor = add( Lin, L0 ).mul( 0.04 ).add( vec3( 0.0, 0.0003, 0.00075 ) );
268
+ const texColor = add( Lin, L0 ).mul( 0.04 ).add( vec3( 0.0, 0.0003, 0.00075 ) ).toVar();
269
+
270
+ // Cloud noise functions
271
+ const hash = Fn( ( [ p ] ) => {
272
+
273
+ return fract( sin( dot( p, vec2( 127.1, 311.7 ) ) ).mul( 43758.5453123 ) );
274
+
275
+ } );
276
+
277
+ const noise = Fn( ( [ p_immutable ] ) => {
278
+
279
+ const p = vec2( p_immutable ).toVar();
280
+ const i = floor( p );
281
+ const f = fract( p );
282
+ const ff = f.mul( f ).mul( sub( 3.0, f.mul( 2.0 ) ) );
283
+
284
+ const a = hash( i );
285
+ const b = hash( add( i, vec2( 1.0, 0.0 ) ) );
286
+ const c = hash( add( i, vec2( 0.0, 1.0 ) ) );
287
+ const d = hash( add( i, vec2( 1.0, 1.0 ) ) );
288
+
289
+ return mix( mix( a, b, ff.x ), mix( c, d, ff.x ), ff.y );
290
+
291
+ } );
292
+
293
+ const fbm = Fn( ( [ p_immutable ] ) => {
294
+
295
+ const p = vec2( p_immutable ).toVar();
296
+ const value = float( 0.0 ).toVar();
297
+ const amplitude = float( 0.5 ).toVar();
298
+
299
+ Loop( 5, () => {
300
+
301
+ value.addAssign( amplitude.mul( noise( p ) ) );
302
+ p.mulAssign( 2.0 );
303
+ amplitude.mulAssign( 0.5 );
304
+
305
+ } );
306
+
307
+ return value;
308
+
309
+ } );
310
+
311
+ // Clouds
312
+ If( direction.y.greaterThan( 0.0 ).and( this.cloudCoverage.greaterThan( 0.0 ) ), () => {
313
+
314
+ // Project to cloud plane (higher elevation = clouds appear lower/closer)
315
+ const elevation = mix( 1.0, 0.1, this.cloudElevation );
316
+ const cloudUV = direction.xz.div( direction.y.mul( elevation ) ).toVar();
317
+ cloudUV.mulAssign( this.cloudScale );
318
+ cloudUV.addAssign( time.mul( this.cloudSpeed ) );
319
+
320
+ // Multi-octave noise for fluffy clouds
321
+ const cloudNoise = fbm( cloudUV.mul( 1000.0 ) ).add( fbm( cloudUV.mul( 2000.0 ).add( 3.7 ) ).mul( 0.5 ) ).toVar();
322
+ cloudNoise.assign( cloudNoise.mul( 0.5 ).add( 0.5 ) );
323
+
324
+ // Apply coverage threshold
325
+ const cloudMask = smoothstep( sub( 1.0, this.cloudCoverage ), sub( 1.0, this.cloudCoverage ).add( 0.3 ), cloudNoise ).toVar();
326
+
327
+ // Fade clouds near horizon (adjusted by elevation)
328
+ const horizonFade = smoothstep( 0.0, add( 0.1, mul( 0.2, this.cloudElevation ) ), direction.y );
329
+ cloudMask.mulAssign( horizonFade );
330
+
331
+ // Cloud lighting based on sun position
332
+ const sunInfluence = dot( direction, vSunDirection ).mul( 0.5 ).add( 0.5 );
333
+ const daylight = max( 0.0, vSunDirection.y.mul( 2.0 ) );
334
+
335
+ // Base cloud color affected by atmosphere
336
+ const atmosphereColor = Lin.mul( 0.04 );
337
+ const cloudColor = mix( vec3( 0.3 ), vec3( 1.0 ), daylight ).toVar();
338
+ cloudColor.assign( mix( cloudColor, atmosphereColor.add( vec3( 1.0 ) ), sunInfluence.mul( 0.5 ) ) );
339
+ cloudColor.mulAssign( vSunE.mul( 0.00002 ) );
340
+
341
+ // Blend clouds with sky
342
+ texColor.assign( mix( texColor, cloudColor, cloudMask.mul( this.cloudDensity ) ) );
226
343
 
227
- const retColor = pow( texColor, vec3( float( 1.0 ).div( float( 1.2 ).add( vSunfade.mul( 1.2 ) ) ) ) );
344
+ } );
228
345
 
229
- return vec4( retColor, 1.0 );
346
+ return vec4( texColor, 1.0 );
230
347
 
231
348
  } )();
232
349
 
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  Color,
3
3
  FrontSide,
4
+ HalfFloatType,
4
5
  Matrix4,
5
6
  Mesh,
6
7
  PerspectiveCamera,
@@ -84,7 +85,7 @@ class Water extends Mesh {
84
85
 
85
86
  const mirrorCamera = new PerspectiveCamera();
86
87
 
87
- const renderTarget = new WebGLRenderTarget( textureWidth, textureHeight );
88
+ const renderTarget = new WebGLRenderTarget( textureWidth, textureHeight, { type: HalfFloatType } );
88
89
 
89
90
  const mirrorShader = {
90
91
 
@@ -196,10 +197,10 @@ class Water extends Mesh {
196
197
  vec3 reflectionSample = vec3( texture2D( mirrorSampler, mirrorCoord.xy / mirrorCoord.w + distortion ) );
197
198
 
198
199
  float theta = max( dot( eyeDirection, surfaceNormal ), 0.0 );
199
- float rf0 = 0.3;
200
+ float rf0 = 0.02;
200
201
  float reflectance = rf0 + ( 1.0 - rf0 ) * pow( ( 1.0 - theta ), 5.0 );
201
202
  vec3 scatter = max( 0.0, dot( surfaceNormal, eyeDirection ) ) * waterColor;
202
- vec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ) * getShadowMask(), ( vec3( 0.1 ) + reflectionSample * 0.9 + reflectionSample * specularLight ), reflectance);
203
+ vec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ) * getShadowMask(), reflectionSample + specularLight, reflectance );
203
204
  vec3 outgoingLight = albedo;
204
205
  gl_FragColor = vec4( outgoingLight, alpha );
205
206
 
@@ -1,5 +1,5 @@
1
1
  import {
2
- Clock,
2
+ Timer,
3
3
  Color,
4
4
  Matrix4,
5
5
  Mesh,
@@ -74,7 +74,7 @@ class Water extends Mesh {
74
74
  const cycle = 0.15; // a cycle of a flow map phase
75
75
  const halfCycle = cycle * 0.5;
76
76
  const textureMatrix = new Matrix4();
77
- const clock = new Clock();
77
+ const timer = new Timer();
78
78
 
79
79
  // internal components
80
80
 
@@ -180,7 +180,7 @@ class Water extends Mesh {
180
180
 
181
181
  function updateFlow() {
182
182
 
183
- const delta = clock.getDelta();
183
+ const delta = timer.getDelta();
184
184
  const config = scope.material.uniforms[ 'config' ];
185
185
 
186
186
  config.value.x += flowSpeed * delta; // flowMapOffset0
@@ -207,6 +207,8 @@ class Water extends Mesh {
207
207
 
208
208
  this.onBeforeRender = function ( renderer, scene, camera ) {
209
209
 
210
+ timer.update();
211
+
210
212
  updateTextureMatrix( camera );
211
213
  updateFlow();
212
214