@gnsx/three 0.185.15 → 0.186.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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -42,6 +42,31 @@ export default /* glsl */`
42
42
 
43
43
  }
44
44
 
45
+ #ifdef USE_RETROREFLECTION
46
+
47
+ vec3 getIBLRetroRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {
48
+
49
+ #ifdef ENVMAP_TYPE_CUBE_UV
50
+
51
+ // The retroreflective lobe returns light toward its source, so the environment is sampled along the view direction
52
+ vec3 retroVec = normalize( mix( viewDir, normal, pow4( roughness ) ) );
53
+
54
+ retroVec = transformDirectionByInverseViewMatrix( retroVec, viewMatrix );
55
+
56
+ vec4 envMapColor = textureCubeUV( envMap, envMapRotation * retroVec, roughness );
57
+
58
+ return envMapColor.rgb * envMapIntensity;
59
+
60
+ #else
61
+
62
+ return vec3( 0.0 );
63
+
64
+ #endif
65
+
66
+ }
67
+
68
+ #endif
69
+
45
70
  #ifdef USE_ANISOTROPY
46
71
 
47
72
  vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {
@@ -63,6 +88,29 @@ export default /* glsl */`
63
88
 
64
89
  }
65
90
 
91
+ #ifdef USE_RETROREFLECTION
92
+
93
+ vec3 getIBLAnisotropyRetroRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {
94
+
95
+ #ifdef ENVMAP_TYPE_CUBE_UV
96
+
97
+ // https://google.github.io/filament/Filament.md.html#lighting/imagebasedlights/anisotropy
98
+ vec3 bentNormal = cross( bitangent, viewDir );
99
+ bentNormal = normalize( cross( bentNormal, bitangent ) );
100
+ bentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );
101
+
102
+ return getIBLRetroRadiance( viewDir, bentNormal, roughness );
103
+
104
+ #else
105
+
106
+ return vec3( 0.0 );
107
+
108
+ #endif
109
+
110
+ }
111
+
112
+ #endif
113
+
66
114
  #endif
67
115
 
68
116
  #endif
@@ -41,18 +41,41 @@ vec3 geometryClearcoatNormal = vec3( 0.0 );
41
41
 
42
42
  if ( material.iridescence > 0.0 ) {
43
43
 
44
- material.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );
45
- material.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );
44
+ vec3 iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );
45
+ vec3 iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );
46
46
 
47
- material.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );
47
+ material.iridescenceFresnel = mix( iridescenceFresnelDielectric, iridescenceFresnelMetallic, material.metalness );
48
48
 
49
49
  // Iridescence F0 approximation
50
- material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );
50
+ material.iridescenceF0Dielectric = Schlick_to_F0( iridescenceFresnelDielectric, 1.0, dotNVi );
51
+ material.iridescenceF0Metallic = Schlick_to_F0( iridescenceFresnelMetallic, 1.0, dotNVi );
51
52
 
52
53
  }
53
54
 
54
55
  #endif
55
56
 
57
+ #ifdef STANDARD
58
+
59
+ float dotNVms = saturate( dot( geometryNormal, geometryViewDir ) );
60
+
61
+ material.dfg = texture2D( dfgLUT, vec2( material.roughness, dotNVms ) ).rg;
62
+
63
+ #if ( NUM_SUN_LIGHTS > 0 || NUM_DIR_LIGHTS > 0 || NUM_POINT_LIGHTS > 0 || NUM_SPOT_LIGHTS > 0 )
64
+
65
+ // Multi-scattering energy compensation for direct lighting
66
+ // Based on "Practical Multiple Scattering Compensation for Microfacet Models"
67
+ // https://blog.selfshadow.com/publications/turquin/ms_comp_final.pdf
68
+
69
+ // Energy of the single-scattering lobe in a white furnace ( F0 = F90 = 1 )
70
+ float EssMs = material.dfg.x + material.dfg.y;
71
+
72
+ // Compensate for the energy lost to multiple scattering, tinting the added term by F0 ( equation 16 )
73
+ material.multiScatteringCompensation = 1.0 + material.specularColorBlended * ( 1.0 / EssMs - 1.0 );
74
+
75
+ #endif
76
+
77
+ #endif
78
+
56
79
  IncidentLight directLight;
57
80
 
58
81
  #if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )
@@ -129,6 +152,32 @@ IncidentLight directLight;
129
152
 
130
153
  #endif
131
154
 
155
+ #if ( NUM_SUN_LIGHTS > 0 ) && defined( RE_Direct )
156
+
157
+ SunLight sunLight;
158
+ #if defined( USE_SHADOWMAP ) && NUM_SUN_LIGHT_SHADOWS > 0
159
+ SunLightShadow sunLightShadow;
160
+ #endif
161
+
162
+ #pragma unroll_loop_start
163
+ for ( int i = 0; i < NUM_SUN_LIGHTS; i ++ ) {
164
+
165
+ sunLight = sunLights[ i ];
166
+
167
+ getSunLightInfo( sunLight, directLight );
168
+
169
+ #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SUN_LIGHT_SHADOWS )
170
+ sunLightShadow = sunLightShadows[ i ];
171
+ directLight.color *= ( directLight.visible && receiveShadow ) ? getSunShadow( sunShadowMap[ i ], sunLightShadow, UNROLLED_LOOP_INDEX ) : 1.0;
172
+ #endif
173
+
174
+ RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
175
+
176
+ }
177
+ #pragma unroll_loop_end
178
+
179
+ #endif
180
+
132
181
  #if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )
133
182
 
134
183
  DirectionalLight directionalLight;
@@ -26,14 +26,32 @@ export default /* glsl */`
26
26
 
27
27
  #ifdef USE_ANISOTROPY
28
28
 
29
- radiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );
29
+ vec3 iblRadiance = getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );
30
30
 
31
31
  #else
32
32
 
33
- radiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );
33
+ vec3 iblRadiance = getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );
34
34
 
35
35
  #endif
36
36
 
37
+ #ifdef USE_RETROREFLECTION
38
+
39
+ #ifdef USE_ANISOTROPY
40
+
41
+ vec3 retroIBLRadiance = getIBLAnisotropyRetroRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );
42
+
43
+ #else
44
+
45
+ vec3 retroIBLRadiance = getIBLRetroRadiance( geometryViewDir, geometryNormal, material.roughness );
46
+
47
+ #endif
48
+
49
+ iblRadiance = mix( iblRadiance, retroIBLRadiance, saturate( material.retroreflectivity ) );
50
+
51
+ #endif
52
+
53
+ radiance += iblRadiance;
54
+
37
55
  #ifdef USE_CLEARCOAT
38
56
 
39
57
  clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );
@@ -76,6 +76,26 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi
76
76
 
77
77
  }
78
78
 
79
+ #if NUM_SUN_LIGHTS > 0
80
+
81
+ struct SunLight {
82
+ vec3 direction;
83
+ vec3 color;
84
+ };
85
+
86
+ uniform SunLight sunLights[ NUM_SUN_LIGHTS ];
87
+
88
+ void getSunLightInfo( const in SunLight sunLight, out IncidentLight light ) {
89
+
90
+ light.color = sunLight.color;
91
+ light.direction = sunLight.direction;
92
+ light.visible = true;
93
+
94
+ }
95
+
96
+ #endif
97
+
98
+
79
99
  #if NUM_DIR_LIGHTS > 0
80
100
 
81
101
  struct DirectionalLight {
@@ -85,6 +85,12 @@ material.roughness = min( material.roughness, 1.0 );
85
85
 
86
86
  #endif
87
87
 
88
+ #ifdef USE_RETROREFLECTION
89
+
90
+ material.retroreflectivity = retroreflectivity;
91
+
92
+ #endif
93
+
88
94
  #ifdef USE_IRIDESCENCE
89
95
 
90
96
  material.iridescence = iridescence;
@@ -13,6 +13,12 @@ struct PhysicalMaterial {
13
13
  float metalness;
14
14
  float specularF90;
15
15
  float dispersion;
16
+ vec2 dfg;
17
+ vec3 multiScatteringCompensation;
18
+
19
+ #ifdef USE_RETROREFLECTION
20
+ float retroreflectivity;
21
+ #endif
16
22
 
17
23
  #ifdef USE_CLEARCOAT
18
24
  float clearcoat;
@@ -26,9 +32,8 @@ struct PhysicalMaterial {
26
32
  float iridescenceIOR;
27
33
  float iridescenceThickness;
28
34
  vec3 iridescenceFresnel;
29
- vec3 iridescenceF0;
30
- vec3 iridescenceFresnelDielectric;
31
- vec3 iridescenceFresnelMetallic;
35
+ vec3 iridescenceF0Dielectric;
36
+ vec3 iridescenceF0Metallic;
32
37
  #endif
33
38
 
34
39
  #ifdef USE_SHEEN
@@ -387,14 +392,11 @@ vec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3
387
392
  // Approximates multiscattering in order to preserve energy.
388
393
  // http://www.jcgt.org/published/0008/01/03/
389
394
  #ifdef USE_IRIDESCENCE
390
- void computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {
395
+ void computeMultiscatteringIridescence( const in vec2 fab, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, inout vec3 singleScatter, inout vec3 multiScatter ) {
391
396
  #else
392
- void computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {
397
+ void computeMultiscattering( const in vec2 fab, const in vec3 specularColor, const in float specularF90, inout vec3 singleScatter, inout vec3 multiScatter ) {
393
398
  #endif
394
399
 
395
- float dotNV = saturate( dot( normal, viewDir ) );
396
- vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;
397
-
398
400
  #ifdef USE_IRIDESCENCE
399
401
 
400
402
  vec3 Fr = mix( specularColor, iridescenceF0, iridescence );
@@ -418,48 +420,6 @@ void computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const
418
420
 
419
421
  }
420
422
 
421
- // GGX BRDF with multi-scattering energy compensation for direct lighting
422
- // Based on "Practical Multiple Scattering Compensation for Microfacet Models"
423
- // https://blog.selfshadow.com/publications/turquin/ms_comp_final.pdf
424
- vec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {
425
-
426
- // Single-scattering BRDF (standard GGX)
427
- vec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );
428
-
429
- // Multi-scattering compensation
430
- float dotNL = saturate( dot( normal, lightDir ) );
431
- float dotNV = saturate( dot( normal, viewDir ) );
432
-
433
- // Precomputed DFG values for view and light directions
434
- vec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;
435
- vec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;
436
-
437
- // Single-scattering energy for view and light
438
- vec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;
439
- vec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;
440
-
441
- float Ess_V = dfgV.x + dfgV.y;
442
- float Ess_L = dfgL.x + dfgL.y;
443
-
444
- // Energy lost to multiple scattering
445
- float Ems_V = 1.0 - Ess_V;
446
- float Ems_L = 1.0 - Ess_L;
447
-
448
- // Average Fresnel reflectance
449
- vec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619; // 1/21
450
-
451
- // Multiple scattering contribution
452
- vec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );
453
-
454
- // Energy compensation factor
455
- float compensationFactor = Ems_V * Ems_L;
456
-
457
- vec3 multiScatter = Fms * compensationFactor;
458
-
459
- return singleScatter + multiScatter;
460
-
461
- }
462
-
463
423
  #if NUM_RECT_AREA_LIGHTS > 0
464
424
 
465
425
  void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {
@@ -553,19 +513,63 @@ void RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geome
553
513
 
554
514
  #endif
555
515
 
556
- reflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );
516
+ vec3 specularBRDF = BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );
517
+
518
+ #ifdef USE_RETROREFLECTION
557
519
 
558
- reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );
520
+ // Minimal Retroreflective Microfacet Model:
521
+ // https://jcgt.org/published/0015/01/04/
522
+ vec3 retroViewDir = reflect( - geometryViewDir, geometryNormal );
523
+ vec3 retroSpecularBRDF = BRDF_GGX( directLight.direction, retroViewDir, geometryNormal, material );
524
+
525
+ specularBRDF = mix( specularBRDF, retroSpecularBRDF, saturate( material.retroreflectivity ) );
526
+
527
+ #endif
528
+
529
+ reflectedLight.directSpecular += irradiance * specularBRDF * material.multiScatteringCompensation;
530
+
531
+ // Light reflected by the specular interface is not available to the diffuse layer ( glTF fresnel_mix )
532
+ vec3 halfDir = normalize( directLight.direction + geometryViewDir );
533
+ float dotVH = saturate( dot( geometryViewDir, halfDir ) );
534
+ vec3 F = F_Schlick( material.specularColor, material.specularF90, dotVH );
535
+
536
+ #ifdef USE_RETROREFLECTION
537
+
538
+ vec3 retroHalfDir = normalize( directLight.direction + retroViewDir );
539
+ float dotRetroVH = saturate( dot( retroViewDir, retroHalfDir ) );
540
+ vec3 retroF = F_Schlick( material.specularColor, material.specularF90, dotRetroVH );
541
+
542
+ F = mix( F, retroF, saturate( material.retroreflectivity ) );
543
+
544
+ #endif
545
+
546
+ reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution ) * ( 1.0 - F );
559
547
  }
560
548
 
561
549
  void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {
562
550
 
563
- vec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );
551
+ // Energy reflected by the specular lobe is not available to the diffuse layer
552
+ vec3 singleScattering = vec3( 0.0 );
553
+ vec3 multiScattering = vec3( 0.0 );
554
+
555
+ #ifdef USE_IRIDESCENCE
556
+
557
+ computeMultiscatteringIridescence( material.dfg, material.specularColor, material.specularF90, material.iridescence, material.iridescenceF0Dielectric, singleScattering, multiScattering );
558
+
559
+ #else
560
+
561
+ computeMultiscattering( material.dfg, material.specularColor, material.specularF90, singleScattering, multiScattering );
562
+
563
+ #endif
564
+
565
+ vec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution ) * ( 1.0 - singleScattering - multiScattering );
564
566
 
565
567
  #ifdef USE_SHEEN
566
568
 
567
569
  float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );
568
570
 
571
+ sheenSpecularIndirect += irradiance * material.sheenColor * sheenAlbedo * RECIPROCAL_PI;
572
+
569
573
  float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;
570
574
 
571
575
  diffuse *= sheenEnergyComp;
@@ -601,13 +605,13 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia
601
605
 
602
606
  #ifdef USE_IRIDESCENCE
603
607
 
604
- computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );
605
- computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );
608
+ computeMultiscatteringIridescence( material.dfg, material.specularColor, material.specularF90, material.iridescence, material.iridescenceF0Dielectric, singleScatteringDielectric, multiScatteringDielectric );
609
+ computeMultiscatteringIridescence( material.dfg, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceF0Metallic, singleScatteringMetallic, multiScatteringMetallic );
606
610
 
607
611
  #else
608
612
 
609
- computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );
610
- computeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );
613
+ computeMultiscattering( material.dfg, material.specularColor, material.specularF90, singleScatteringDielectric, multiScatteringDielectric );
614
+ computeMultiscattering( material.dfg, material.diffuseColor, material.specularF90, singleScatteringMetallic, multiScatteringMetallic );
611
615
 
612
616
  #endif
613
617
 
@@ -13,6 +13,39 @@ export default /* glsl */`
13
13
 
14
14
  #ifdef USE_SHADOWMAP
15
15
 
16
+ #if NUM_SUN_LIGHT_SHADOWS > 0
17
+
18
+ // must match the cascade count in SunLightShadow
19
+
20
+ #define SUN_LIGHT_CASCADES 2
21
+
22
+ #if defined( SHADOWMAP_TYPE_PCF )
23
+
24
+ uniform sampler2DShadow sunShadowMap[ NUM_SUN_LIGHT_SHADOWS ];
25
+
26
+ #else
27
+
28
+ uniform sampler2D sunShadowMap[ NUM_SUN_LIGHT_SHADOWS ];
29
+
30
+ #endif
31
+
32
+ uniform mat4 sunShadowMatrix[ NUM_SUN_LIGHT_SHADOWS * SUN_LIGHT_CASCADES ];
33
+ uniform vec4 sunShadowCascade[ NUM_SUN_LIGHT_SHADOWS * SUN_LIGHT_CASCADES ];
34
+ varying vec4 vSunShadowWorldPosition;
35
+ varying vec3 vSunShadowWorldNormal;
36
+
37
+ struct SunLightShadow {
38
+ float shadowIntensity;
39
+ float shadowBias;
40
+ float shadowNormalBias;
41
+ float shadowRadius;
42
+ vec2 shadowMapSize;
43
+ };
44
+
45
+ uniform SunLightShadow sunLightShadows[ NUM_SUN_LIGHT_SHADOWS ];
46
+
47
+ #endif
48
+
16
49
  #if NUM_DIR_LIGHT_SHADOWS > 0
17
50
 
18
51
  #if defined( SHADOWMAP_TYPE_PCF )
@@ -258,6 +291,55 @@ export default /* glsl */`
258
291
 
259
292
  #endif
260
293
 
294
+ #if NUM_SUN_LIGHT_SHADOWS > 0
295
+
296
+ float getSunShadow(
297
+ #if defined( SHADOWMAP_TYPE_PCF )
298
+ sampler2DShadow shadowMap,
299
+ #else
300
+ sampler2D shadowMap,
301
+ #endif
302
+ SunLightShadow sunLightShadow,
303
+ int shadowIndex
304
+ ) {
305
+
306
+ vec4 shadowWorldPosition = vec4( vSunShadowWorldPosition.xyz + vSunShadowWorldNormal * sunLightShadow.shadowNormalBias, 1.0 );
307
+ float viewDepth = vSunShadowWorldPosition.w;
308
+ int cascadeOffset = shadowIndex * SUN_LIGHT_CASCADES;
309
+
310
+ float shadow = 1.0;
311
+
312
+ // walk the cascades back to front so each fade band can blend with the shadow behind it
313
+
314
+ for ( int i = SUN_LIGHT_CASCADES - 1; i >= 0; i -- ) {
315
+
316
+ // ( begin, end, fade start ) view depths of the cascade
317
+
318
+ vec4 cascade = sunShadowCascade[ cascadeOffset + i ];
319
+
320
+ if ( viewDepth >= cascade.x && viewDepth < cascade.y ) {
321
+
322
+ float cascadeShadow = getShadow(
323
+ shadowMap,
324
+ sunLightShadow.shadowMapSize,
325
+ sunLightShadow.shadowIntensity,
326
+ sunLightShadow.shadowBias,
327
+ sunLightShadow.shadowRadius,
328
+ sunShadowMatrix[ cascadeOffset + i ] * shadowWorldPosition
329
+ );
330
+
331
+ shadow = mix( cascadeShadow, shadow, smoothstep( cascade.z, cascade.y, viewDepth ) );
332
+
333
+ }
334
+
335
+ }
336
+
337
+ return shadow;
338
+
339
+ }
340
+
341
+ #endif
342
+
261
343
  #if NUM_POINT_LIGHT_SHADOWS > 0
262
344
 
263
345
  #if defined( SHADOWMAP_TYPE_PCF )
@@ -9,6 +9,15 @@ export default /* glsl */`
9
9
 
10
10
  #ifdef USE_SHADOWMAP
11
11
 
12
+ #if NUM_SUN_LIGHT_SHADOWS > 0
13
+
14
+ // cascade selection and shadow coordinates are computed per fragment
15
+
16
+ varying vec4 vSunShadowWorldPosition;
17
+ varying vec3 vSunShadowWorldNormal;
18
+
19
+ #endif
20
+
12
21
  #if NUM_DIR_LIGHT_SHADOWS > 0
13
22
 
14
23
  uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];
@@ -1,6 +1,6 @@
1
1
  export default /* glsl */`
2
2
 
3
- #if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )
3
+ #if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SUN_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )
4
4
 
5
5
  #ifdef HAS_NORMAL
6
6
 
@@ -20,6 +20,13 @@ export default /* glsl */`
20
20
 
21
21
  #if defined( USE_SHADOWMAP )
22
22
 
23
+ #if NUM_SUN_LIGHT_SHADOWS > 0
24
+
25
+ vSunShadowWorldPosition = vec4( worldPosition.xyz, - mvPosition.z );
26
+ vSunShadowWorldNormal = shadowWorldNormal;
27
+
28
+ #endif
29
+
23
30
  #if NUM_DIR_LIGHT_SHADOWS > 0
24
31
 
25
32
  #pragma unroll_loop_start
@@ -5,6 +5,21 @@ float getShadowMask() {
5
5
 
6
6
  #ifdef USE_SHADOWMAP
7
7
 
8
+ #if NUM_SUN_LIGHT_SHADOWS > 0
9
+
10
+ SunLightShadow sunLight;
11
+
12
+ #pragma unroll_loop_start
13
+ for ( int i = 0; i < NUM_SUN_LIGHT_SHADOWS; i ++ ) {
14
+
15
+ sunLight = sunLightShadows[ i ];
16
+ shadow *= receiveShadow ? getSunShadow( sunShadowMap[ i ], sunLight, UNROLLED_LOOP_INDEX ) : 1.0;
17
+
18
+ }
19
+ #pragma unroll_loop_end
20
+
21
+ #endif
22
+
8
23
  #if NUM_DIR_LIGHT_SHADOWS > 0
9
24
 
10
25
  DirectionalLightShadow directionalLight;
@@ -99,6 +99,10 @@ uniform float opacity;
99
99
  uniform float dispersion;
100
100
  #endif
101
101
 
102
+ #ifdef USE_RETROREFLECTION
103
+ uniform float retroreflectivity;
104
+ #endif
105
+
102
106
  #ifdef USE_IRIDESCENCE
103
107
  uniform float iridescence;
104
108
  uniform float iridescenceIOR;
@@ -316,6 +316,7 @@ ShaderLib.physical = {
316
316
  clearcoatRoughnessMap: { value: null },
317
317
  clearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },
318
318
  dispersion: { value: 0 },
319
+ retroreflectivity: { value: 0 },
319
320
  iridescence: { value: 0 },
320
321
  iridescenceMap: { value: null },
321
322
  iridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },
@@ -122,6 +122,22 @@ const UniformsLib = {
122
122
 
123
123
  lightProbe: { value: [] },
124
124
 
125
+ sunLights: { value: [], properties: {
126
+ direction: {},
127
+ color: {}
128
+ } },
129
+
130
+ sunLightShadows: { value: [], properties: {
131
+ shadowIntensity: 1,
132
+ shadowBias: {},
133
+ shadowNormalBias: {},
134
+ shadowRadius: {},
135
+ shadowMapSize: {}
136
+ } },
137
+
138
+ sunShadowMatrix: { value: [] },
139
+ sunShadowCascade: { value: [] },
140
+
125
141
  directionalLights: { value: [], properties: {
126
142
  direction: {},
127
143
  color: {}
@@ -7,10 +7,10 @@ function WebGLAnimation() {
7
7
 
8
8
  function onAnimationFrame( time, frame ) {
9
9
 
10
- animationLoop( time, frame );
11
-
12
10
  requestId = context.requestAnimationFrame( onAnimationFrame );
13
11
 
12
+ animationLoop( time, frame );
13
+
14
14
  }
15
15
 
16
16
  return {
@@ -41,8 +41,8 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) {
41
41
 
42
42
  const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );
43
43
 
44
- if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)
45
- textureType !== FloatType && ! halfFloatSupportedByExt ) {
44
+ if ( textureType !== UnsignedByteType && textureType !== FloatType && ! halfFloatSupportedByExt &&
45
+ utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) ) { // Edge and Chrome Mac < 52 (#9513)
46
46
 
47
47
  return false;
48
48