@gnsx/three 0.185.16 → 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 (418) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1309 -807
  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/src/utils.js +6 -79
  411. package/build/three.core.min.js +0 -6
  412. package/build/three.module.min.js +0 -6
  413. package/build/three.tsl.min.js +0 -6
  414. package/build/three.webgpu.min.js +0 -6
  415. package/build/three.webgpu.nodes.min.js +0 -6
  416. package/examples/jsm/libs/ecsy.module.js +0 -1792
  417. package/examples/jsm/loaders/LottieLoader.js +0 -130
  418. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -1,12 +1,10 @@
1
1
  import Node from '../core/Node.js';
2
- import StackTrace from '../core/StackTrace.js';
3
2
  import { NodeUpdateType } from '../core/constants.js';
3
+ import { renderGroup } from '../core/UniformGroupNode.js';
4
4
  import { uniform } from '../core/UniformNode.js';
5
- import { Fn, nodeImmutable, vec2 } from '../tsl/TSLBase.js';
6
-
5
+ import { nodeImmutable, vec2 } from '../tsl/TSLBase.js';
7
6
  import { Vector2 } from '../../math/Vector2.js';
8
7
  import { Vector4 } from '../../math/Vector4.js';
9
- import { warn } from '../../utils.js';
10
8
 
11
9
  let _screenSizeVec, _viewportVec;
12
10
 
@@ -28,7 +26,7 @@ class ScreenNode extends Node {
28
26
  /**
29
27
  * Constructs a new screen node.
30
28
  *
31
- * @param {('coordinate'|'viewport'|'size'|'uv'|'dpr')} scope - The node's scope.
29
+ * @param {('coordinate'|'viewport'|'size'|'uv')} scope - The node's scope.
32
30
  */
33
31
  constructor( scope ) {
34
32
 
@@ -41,21 +39,11 @@ class ScreenNode extends Node {
41
39
  * - `ScreenNode.VIEWPORT`: The current viewport defined as a four-dimensional vector.
42
40
  * - `ScreenNode.SIZE`: The dimensions of the current bound framebuffer.
43
41
  * - `ScreenNode.UV`: Normalized coordinates.
44
- * - `ScreenNode.DPR`: Device pixel ratio.
45
42
  *
46
- * @type {('coordinate'|'viewport'|'size'|'uv'|'dpr')}
43
+ * @type {('coordinate'|'viewport'|'size'|'uv')}
47
44
  */
48
45
  this.scope = scope;
49
46
 
50
- /**
51
- * This output node.
52
- *
53
- * @private
54
- * @type {?Node}
55
- * @default null
56
- */
57
- this._output = null;
58
-
59
47
  /**
60
48
  * This flag can be used for type testing.
61
49
  *
@@ -70,37 +58,15 @@ class ScreenNode extends Node {
70
58
  /**
71
59
  * This method is overwritten since the node type depends on the selected scope.
72
60
  *
73
- * @return {('float'|'vec2'|'vec4')} The node type.
61
+ * @return {('vec2'|'vec4')} The node type.
74
62
  */
75
63
  generateNodeType() {
76
64
 
77
- if ( this.scope === ScreenNode.DPR ) return 'float';
78
65
  if ( this.scope === ScreenNode.VIEWPORT ) return 'vec4';
79
66
  else return 'vec2';
80
67
 
81
68
  }
82
69
 
83
- /**
84
- * This method is overwritten since the node's update type depends on the selected scope.
85
- *
86
- * @return {NodeUpdateType} The update type.
87
- */
88
- getUpdateType() {
89
-
90
- let updateType = NodeUpdateType.NONE;
91
-
92
- if ( this.scope === ScreenNode.SIZE || this.scope === ScreenNode.VIEWPORT || this.scope === ScreenNode.DPR ) {
93
-
94
- updateType = NodeUpdateType.RENDER;
95
-
96
- }
97
-
98
- this.updateType = updateType;
99
-
100
- return updateType;
101
-
102
- }
103
-
104
70
  /**
105
71
  * `ScreenNode` implements {@link Node#update} to retrieve viewport and size information
106
72
  * from the current renderer.
@@ -125,10 +91,6 @@ class ScreenNode extends Node {
125
91
 
126
92
  }
127
93
 
128
- } else if ( this.scope === ScreenNode.DPR ) {
129
-
130
- this._output.value = renderer.getPixelRatio();
131
-
132
94
  } else {
133
95
 
134
96
  if ( renderTarget !== null ) {
@@ -154,15 +116,11 @@ class ScreenNode extends Node {
154
116
 
155
117
  if ( scope === ScreenNode.SIZE ) {
156
118
 
157
- output = uniform( _screenSizeVec || ( _screenSizeVec = new Vector2() ) );
119
+ output = uniform( _screenSizeVec || ( _screenSizeVec = new Vector2() ) ).setGroup( renderGroup );
158
120
 
159
121
  } else if ( scope === ScreenNode.VIEWPORT ) {
160
122
 
161
- output = uniform( _viewportVec || ( _viewportVec = new Vector4() ) );
162
-
163
- } else if ( scope === ScreenNode.DPR ) {
164
-
165
- output = uniform( 1 );
123
+ output = uniform( _viewportVec || ( _viewportVec = new Vector4() ) ).setGroup( renderGroup );
166
124
 
167
125
  } else {
168
126
 
@@ -170,7 +128,19 @@ class ScreenNode extends Node {
170
128
 
171
129
  }
172
130
 
173
- this._output = output;
131
+ //
132
+
133
+ let updateType = NodeUpdateType.NONE;
134
+
135
+ if ( this.scope === ScreenNode.SIZE || this.scope === ScreenNode.VIEWPORT ) {
136
+
137
+ updateType = NodeUpdateType.RENDER;
138
+
139
+ }
140
+
141
+ this.updateType = updateType;
142
+
143
+ //
174
144
 
175
145
  return output;
176
146
 
@@ -206,7 +176,6 @@ ScreenNode.COORDINATE = 'coordinate';
206
176
  ScreenNode.VIEWPORT = 'viewport';
207
177
  ScreenNode.SIZE = 'size';
208
178
  ScreenNode.UV = 'uv';
209
- ScreenNode.DPR = 'dpr';
210
179
 
211
180
  export default ScreenNode;
212
181
 
@@ -216,9 +185,9 @@ export default ScreenNode;
216
185
  * TSL object that represents the current DPR.
217
186
  *
218
187
  * @tsl
219
- * @type {ScreenNode<float>}
188
+ * @type {UniformNode<float>}
220
189
  */
221
- export const screenDPR = /*@__PURE__*/ nodeImmutable( ScreenNode, ScreenNode.DPR );
190
+ export const screenDPR = /*@__PURE__*/ uniform( 1 ).setGroup( renderGroup ).onRenderUpdate( ( { renderer } ) => renderer.getPixelRatio() );
222
191
 
223
192
  /**
224
193
  * TSL object that represents normalized screen coordinates, unitless in `[0, 1]`.
@@ -278,15 +247,3 @@ export const viewportCoordinate = /*@__PURE__*/ screenCoordinate.sub( viewport.x
278
247
  */
279
248
  export const viewportUV = /*@__PURE__*/ viewportCoordinate.div( viewportSize );
280
249
 
281
- // Deprecated
282
-
283
- /**
284
- * @deprecated since r169. Use {@link screenSize} instead.
285
- */
286
- export const viewportResolution = /*@__PURE__*/ ( Fn( () => { // @deprecated, r169
287
-
288
- warn( 'TSL: "viewportResolution" is deprecated. Use "screenSize" instead.', new StackTrace() );
289
-
290
- return screenSize;
291
-
292
- }, 'vec2' ).once() )();
@@ -37,7 +37,7 @@ function getViewZNode( builder ) {
37
37
  * @param {Node} near - Defines the near value.
38
38
  * @param {Node} far - Defines the far value.
39
39
  */
40
- export const rangeFogFactor = Fn( ( [ near, far ], builder ) => {
40
+ export const rangeFogFactor = /*@__PURE__*/ Fn( ( [ near, far ], builder ) => {
41
41
 
42
42
  const viewZ = getViewZNode( builder );
43
43
 
@@ -54,7 +54,7 @@ export const rangeFogFactor = Fn( ( [ near, far ], builder ) => {
54
54
  * @function
55
55
  * @param {Node} density - Defines the fog density.
56
56
  */
57
- export const densityFogFactor = Fn( ( [ density ], builder ) => {
57
+ export const densityFogFactor = /*@__PURE__*/ Fn( ( [ density ], builder ) => {
58
58
 
59
59
  const viewZ = getViewZNode( builder );
60
60
 
@@ -70,7 +70,7 @@ export const densityFogFactor = Fn( ( [ density ], builder ) => {
70
70
  * @param {Node} density - Defines the fog density.
71
71
  * @param {Node} height - The height threshold in world space. Everything below this y-coordinate is affected by fog.
72
72
  */
73
- export const exponentialHeightFogFactor = Fn( ( [ density, height ], builder ) => {
73
+ export const exponentialHeightFogFactor = /*@__PURE__*/ Fn( ( [ density, height ], builder ) => {
74
74
 
75
75
  const viewZ = getViewZNode( builder );
76
76
 
@@ -90,7 +90,7 @@ export const exponentialHeightFogFactor = Fn( ( [ density, height ], builder ) =
90
90
  * @param {Node} color - Defines the color of the fog.
91
91
  * @param {Node} factor - Defines how the fog is factored in the scene.
92
92
  */
93
- export const fog = Fn( ( [ color, factor ] ) => {
93
+ export const fog = /*@__PURE__*/ Fn( ( [ color, factor ] ) => {
94
94
 
95
95
  return vec4( factor.toFloat().mix( output.rgb, color.toVec3() ), output.a );
96
96
 
@@ -9,16 +9,16 @@ import { iridescence, alphaT, anisotropyT, anisotropyB } from '../../core/Proper
9
9
  import { Fn, defined } from '../../tsl/TSLBase.js';
10
10
 
11
11
  // GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility
12
- const BRDF_GGX = /*@__PURE__*/ Fn( ( { lightDirection, f0, f90, roughness, f, normalView = NormalView, USE_IRIDESCENCE, USE_ANISOTROPY } ) => {
12
+ const BRDF_GGX = /*@__PURE__*/ Fn( ( { lightDirection, f0, f90, roughness, f, normalView = NormalView, viewDirection = positionViewDirection, USE_IRIDESCENCE, USE_ANISOTROPY } ) => {
13
13
 
14
14
  const alpha = roughness.pow2(); // UE4's roughness
15
15
 
16
- const halfDir = lightDirection.add( positionViewDirection ).normalize();
16
+ const halfDir = lightDirection.add( viewDirection ).normalize();
17
17
 
18
18
  const dotNL = normalView.dot( lightDirection ).clamp();
19
- const dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
19
+ const dotNV = normalView.dot( viewDirection ).clamp(); // @ TODO: Move to core dotNV
20
20
  const dotNH = normalView.dot( halfDir ).clamp();
21
- const dotVH = positionViewDirection.dot( halfDir ).clamp();
21
+ const dotVH = viewDirection.dot( halfDir ).clamp();
22
22
 
23
23
  let F = F_Schlick( { f0, f90, dotVH } );
24
24
  let V, D;
@@ -32,10 +32,10 @@ const BRDF_GGX = /*@__PURE__*/ Fn( ( { lightDirection, f0, f90, roughness, f, no
32
32
  if ( defined( USE_ANISOTROPY ) ) {
33
33
 
34
34
  const dotTL = anisotropyT.dot( lightDirection );
35
- const dotTV = anisotropyT.dot( positionViewDirection );
35
+ const dotTV = anisotropyT.dot( viewDirection );
36
36
  const dotTH = anisotropyT.dot( halfDir );
37
37
  const dotBL = anisotropyB.dot( lightDirection );
38
- const dotBV = anisotropyB.dot( positionViewDirection );
38
+ const dotBV = anisotropyB.dot( viewDirection );
39
39
  const dotBH = anisotropyB.dot( halfDir );
40
40
 
41
41
  V = V_GGX_SmithCorrelated_Anisotropic( { alphaT, alphaB: alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL } );
@@ -28,7 +28,7 @@ const D_Charlie = /*@__PURE__*/ Fn( ( { roughness, dotNH } ) => {
28
28
  const V_Neubelt = /*@__PURE__*/ Fn( ( { dotNV, dotNL } ) => {
29
29
 
30
30
  // Neubelt and Pettineo 2013, "Crafting a Next-gen Material Pipeline for The Order: 1886"
31
- return float( 1.0 ).div( float( 4.0 ).mul( dotNL.add( dotNV ).sub( dotNL.mul( dotNV ) ) ) );
31
+ return float( 1.0 ).div( float( 4.0 ).mul( dotNL.add( dotNV ).sub( dotNL.mul( dotNV ) ) ) ).clamp();
32
32
 
33
33
  } ).setLayout( {
34
34
  name: 'V_Neubelt',
@@ -5,7 +5,8 @@ import { DataTexture } from '../../../textures/DataTexture.js';
5
5
  import { RGFormat, HalfFloatType, LinearFilter, ClampToEdgeWrapping } from '../../../constants.js';
6
6
 
7
7
  /**
8
- * Precomputed DFG LUT for Image-Based Lighting
8
+ * Precomputed DFG LUT for physically based specular lighting, used by both
9
+ * image-based lighting and direct-light multi-scattering energy compensation
9
10
  * Resolution: 16x16
10
11
  * Samples: 4096 per texel
11
12
  * Format: RG16F (2 half floats per texel: scale, bias)
@@ -161,7 +161,7 @@ const LTC_Evaluate_Volume = /*@__PURE__*/ Fn( ( { P, p0, p1, p2, p3 } ) => {
161
161
  return result;
162
162
 
163
163
  } ).setLayout( {
164
- name: 'LTC_Evaluate',
164
+ name: 'LTC_Evaluate_Volume',
165
165
  type: 'vec3',
166
166
  inputs: [
167
167
  { name: 'P', type: 'vec3' },
@@ -59,7 +59,7 @@ class PhongLightingModel extends BasicLightingModel {
59
59
  }
60
60
 
61
61
  /**
62
- * Implements the direct lighting. The specular portion is optional an can be controlled
62
+ * Implements the direct lighting. The specular portion is optional and can be controlled
63
63
  * with the {@link PhongLightingModel#specular} flag.
64
64
  *
65
65
  * @param {Object} lightData - The light data.
@@ -1,6 +1,5 @@
1
1
  import BRDF_Lambert from './BSDF/BRDF_Lambert.js';
2
2
  import BRDF_GGX from './BSDF/BRDF_GGX.js';
3
- import BRDF_GGX_Multiscatter from './BSDF/BRDF_GGX_Multiscatter.js';
4
3
  import DFGLUT from './BSDF/DFGLUT.js';
5
4
  import EnvironmentBRDF from './BSDF/EnvironmentBRDF.js';
6
5
  import F_Schlick from './BSDF/F_Schlick.js';
@@ -8,13 +7,13 @@ import Schlick_to_F0 from './BSDF/Schlick_to_F0.js';
8
7
  import BRDF_Sheen from './BSDF/BRDF_Sheen.js';
9
8
  import { LTC_Evaluate, LTC_Uv } from './BSDF/LTC.js';
10
9
  import LightingModel from '../core/LightingModel.js';
11
- import { diffuseColor, diffuseContribution, specularColor, specularColorBlended, specularF90, roughness, metalness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion } from '../core/PropertyNode.js';
10
+ import { diffuseColor, diffuseContribution, specularColor, specularColorBlended, specularF90, roughness, metalness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion, retroreflectivity } from '../core/PropertyNode.js';
12
11
  import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
13
12
  import { positionViewDirection, positionView, positionWorld } from '../accessors/Position.js';
14
13
  import { Fn, float, vec2, vec3, vec4, mat3, If } from '../tsl/TSLBase.js';
15
14
  import { mix, normalize, refract, length, clamp, log2, log, exp, smoothstep } from '../math/MathNode.js';
16
15
  import { div } from '../math/OperatorNode.js';
17
- import { cameraPosition, cameraProjectionMatrix, cameraViewMatrix } from '../accessors/Camera.js';
16
+ import { cameraPosition, cameraProjectionMatrix, cameraViewMatrix, cameraViewport } from '../accessors/Camera.js';
18
17
  import { modelWorldMatrix } from '../accessors/ModelNode.js';
19
18
  import { screenSize } from '../display/ScreenNode.js';
20
19
  import { viewportMipTexture, viewportOpaqueMipTexture } from '../display/ViewportTextureNode.js';
@@ -75,10 +74,10 @@ const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ],
75
74
 
76
75
  const vTexture = material.side === BackSide ? viewportBackSideTexture : viewportFrontSideTexture;
77
76
 
78
- const transmissionSample = vTexture.sample( fragCoord );
77
+ const transmissionSample = vTexture.sample( fragCoord.mul( cameraViewport.zw ).add( cameraViewport.xy ).div( screenSize ) );
79
78
  //const transmissionSample = viewportMipTexture( fragCoord );
80
79
 
81
- const lod = log2( screenSize.x ).mul( applyIorToRoughness( roughness, ior ) );
80
+ const lod = log2( cameraViewport.z ).mul( applyIorToRoughness( roughness, ior ) );
82
81
 
83
82
  return textureBicubicLevel( transmissionSample, lod );
84
83
 
@@ -190,9 +189,9 @@ const getIBLVolumeRefraction = /*@__PURE__*/ Fn( ( [ n, v, roughness, diffuseCol
190
189
 
191
190
  // XYZ to linear-sRGB color space
192
191
  const XYZ_TO_REC709 = /*@__PURE__*/ mat3(
193
- 3.2404542, - 0.9692660, 0.0556434,
194
- - 1.5371385, 1.8760108, - 0.2040259,
195
- - 0.4985314, 0.0415560, 1.0572252
192
+ 3.2404542, - 1.5371385, - 0.4985314,
193
+ - 0.9692660, 1.8760108, 0.0415560,
194
+ 0.0556434, - 0.2040259, 1.0572252
196
195
  );
197
196
 
198
197
  // Assume air interface for top
@@ -348,8 +347,9 @@ class PhysicalLightingModel extends LightingModel {
348
347
  * @param {boolean} [anisotropy=false] - Whether anisotropy is supported or not.
349
348
  * @param {boolean} [transmission=false] - Whether transmission is supported or not.
350
349
  * @param {boolean} [dispersion=false] - Whether dispersion is supported or not.
350
+ * @param {boolean} [retroreflection=false] - Whether retroreflection is supported or not.
351
351
  */
352
- constructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false ) {
352
+ constructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false, retroreflection = false ) {
353
353
 
354
354
  super();
355
355
 
@@ -401,6 +401,14 @@ class PhysicalLightingModel extends LightingModel {
401
401
  */
402
402
  this.dispersion = dispersion;
403
403
 
404
+ /**
405
+ * Whether retroreflection is supported or not.
406
+ *
407
+ * @type {boolean}
408
+ * @default false
409
+ */
410
+ this.retroreflection = retroreflection;
411
+
404
412
  /**
405
413
  * The clear coat radiance.
406
414
  *
@@ -450,28 +458,36 @@ class PhysicalLightingModel extends LightingModel {
450
458
  this.iridescenceFresnel = null;
451
459
 
452
460
  /**
453
- * The iridescence F0.
461
+ * The iridescence F0 dielectric.
454
462
  *
455
463
  * @type {?Node}
456
464
  * @default null
457
465
  */
458
- this.iridescenceF0 = null;
466
+ this.iridescenceF0Dielectric = null;
459
467
 
460
468
  /**
461
- * The iridescence F0 dielectric.
469
+ * The iridescence F0 metallic.
462
470
  *
463
471
  * @type {?Node}
464
472
  * @default null
465
473
  */
466
- this.iridescenceF0Dielectric = null;
474
+ this.iridescenceF0Metallic = null;
467
475
 
468
476
  /**
469
- * The iridescence F0 metallic.
477
+ * The sampled DFG LUT value, shared by the direct and indirect lighting paths.
470
478
  *
471
479
  * @type {?Node}
472
480
  * @default null
473
481
  */
474
- this.iridescenceF0Metallic = null;
482
+ this.dfg = null;
483
+
484
+ /**
485
+ * The multi-scattering energy compensation for direct lighting.
486
+ *
487
+ * @type {?Node}
488
+ * @default null
489
+ */
490
+ this.multiScatteringCompensation = null;
475
491
 
476
492
  }
477
493
 
@@ -523,8 +539,6 @@ class PhysicalLightingModel extends LightingModel {
523
539
  this.iridescenceF0Dielectric = Schlick_to_F0( { f: iridescenceFresnelDielectric, f90: 1.0, dotVH: dotNVi } );
524
540
  this.iridescenceF0Metallic = Schlick_to_F0( { f: iridescenceFresnelMetallic, f90: 1.0, dotVH: dotNVi } );
525
541
 
526
- this.iridescenceF0 = mix( this.iridescenceF0Dielectric, this.iridescenceF0Metallic, metalness );
527
-
528
542
  }
529
543
 
530
544
  if ( this.transmission === true ) {
@@ -559,6 +573,21 @@ class PhysicalLightingModel extends LightingModel {
559
573
 
560
574
  }
561
575
 
576
+ //
577
+
578
+ const dotNV = normalView.dot( positionViewDirection ).clamp();
579
+ this.dfg = DFGLUT( { roughness, dotNV } ).toConst( 'dfg' );
580
+
581
+ // Multi-scattering energy compensation for direct lighting
582
+ // Based on "Practical Multiple Scattering Compensation for Microfacet Models"
583
+ // https://blog.selfshadow.com/publications/turquin/ms_comp_final.pdf
584
+
585
+ // Energy of the single-scattering lobe in a white furnace ( F0 = F90 = 1 )
586
+ const Ess = this.dfg.x.add( this.dfg.y );
587
+
588
+ // Compensate for the energy lost to multiple scattering, tinting the added term by F0 ( equation 16 )
589
+ this.multiScatteringCompensation = specularColorBlended.mul( Ess.reciprocal().sub( 1.0 ) ).add( 1.0 ).toConst( 'multiScatteringCompensation' );
590
+
562
591
  super.start( builder );
563
592
 
564
593
  }
@@ -569,9 +598,7 @@ class PhysicalLightingModel extends LightingModel {
569
598
 
570
599
  computeMultiscattering( singleScatter, multiScatter, specularF90, f0, iridescenceF0 = null ) {
571
600
 
572
- const dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
573
-
574
- const fab = DFGLUT( { roughness, dotNV } );
601
+ const fab = this.dfg;
575
602
 
576
603
  const Fr = iridescenceF0 ? iridescence.mix( f0, iridescenceF0 ) : f0;
577
604
 
@@ -621,9 +648,31 @@ class PhysicalLightingModel extends LightingModel {
621
648
 
622
649
  }
623
650
 
624
- reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ) );
651
+ // Light reflected by the specular interface is not available to the diffuse layer ( glTF fresnel_mix )
652
+ const halfDir = lightDirection.add( positionViewDirection ).normalize();
653
+ const dotVH = positionViewDirection.dot( halfDir ).clamp();
654
+ let F = F_Schlick( { f0: specularColor, f90: specularF90, dotVH } );
655
+
656
+ let specularBRDF = BRDF_GGX( { lightDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } );
625
657
 
626
- reflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_GGX_Multiscatter( { lightDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } ) ) );
658
+ if ( this.retroreflection === true ) {
659
+
660
+ // Minimal Retroreflective Microfacet Model:
661
+ // https://jcgt.org/published/0015/01/04/
662
+ const retroViewDirection = positionViewDirection.negate().reflect( normalView );
663
+ const retroHalfDir = lightDirection.add( retroViewDirection ).normalize();
664
+ const dotRetroVH = retroViewDirection.dot( retroHalfDir ).clamp();
665
+ const retroF = F_Schlick( { f0: specularColor, f90: specularF90, dotVH: dotRetroVH } );
666
+ const retroSpecularBRDF = BRDF_GGX( { lightDirection, viewDirection: retroViewDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } );
667
+
668
+ F = mix( F, retroF, retroreflectivity.clamp() );
669
+ specularBRDF = mix( specularBRDF, retroSpecularBRDF, retroreflectivity.clamp() );
670
+
671
+ }
672
+
673
+ reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).mul( F.oneMinus() ) );
674
+
675
+ reflectedLight.directSpecular.addAssign( irradiance.mul( specularBRDF ).mul( this.multiScatteringCompensation ) );
627
676
 
628
677
  }
629
678
 
@@ -710,12 +759,20 @@ class PhysicalLightingModel extends LightingModel {
710
759
 
711
760
  const { irradiance, reflectedLight } = builder.context;
712
761
 
713
- const diffuse = irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).toVar();
762
+ // Energy reflected by the specular lobe is not available to the diffuse layer
763
+ const singleScattering = vec3().toVar();
764
+ const multiScattering = vec3().toVar();
765
+
766
+ this.computeMultiscattering( singleScattering, multiScattering, specularF90, specularColor, this.iridescenceF0Dielectric );
767
+
768
+ const diffuse = irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).mul( singleScattering.add( multiScattering ).oneMinus() ).toVar();
714
769
 
715
770
  if ( this.sheen === true ) {
716
771
 
717
772
  const sheenAlbedo = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );
718
773
 
774
+ this.sheenSpecularIndirect.addAssign( irradiance.mul( sheen, sheenAlbedo, 1 / Math.PI ) );
775
+
719
776
  const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedo ).oneMinus();
720
777
 
721
778
  diffuse.mulAssign( sheenEnergyComp );
@@ -743,7 +800,8 @@ class PhysicalLightingModel extends LightingModel {
743
800
  normal: normalView,
744
801
  viewDir: positionViewDirection,
745
802
  roughness: sheenRoughness
746
- } )
803
+ } ),
804
+ 1 / Math.PI
747
805
  ) );
748
806
 
749
807
  }
@@ -865,7 +923,7 @@ class PhysicalLightingModel extends LightingModel {
865
923
 
866
924
  if ( this.sheen === true ) {
867
925
 
868
- const sheenLight = outgoingLight.add( this.sheenSpecularDirect, this.sheenSpecularIndirect.mul( 1.0 / Math.PI ) );
926
+ const sheenLight = outgoingLight.add( this.sheenSpecularDirect, this.sheenSpecularIndirect );
869
927
 
870
928
  outgoingLight.assign( sheenLight );
871
929
 
@@ -1,7 +1,7 @@
1
1
  import LightingModel from '../core/LightingModel.js';
2
2
  import BRDF_Lambert from './BSDF/BRDF_Lambert.js';
3
3
  import { diffuseColor } from '../core/PropertyNode.js';
4
- import { normalGeometry } from '../accessors/Normal.js';
4
+ import { normalView } from '../accessors/Normal.js';
5
5
  import { Fn, float, vec2, vec3 } from '../tsl/TSLBase.js';
6
6
  import { mix, smoothstep } from '../math/MathNode.js';
7
7
  import { materialReference } from '../accessors/MaterialReferenceNode.js';
@@ -44,7 +44,7 @@ class ToonLightingModel extends LightingModel {
44
44
  */
45
45
  direct( { lightDirection, lightColor, reflectedLight }, builder ) {
46
46
 
47
- const irradiance = getGradientIrradiance( { normal: normalGeometry, lightDirection, builder } ).mul( lightColor );
47
+ const irradiance = getGradientIrradiance( { normal: normalView, lightDirection, builder } ).mul( lightColor );
48
48
 
49
49
  reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseColor.rgb } ) ) );
50
50
 
@@ -1,5 +1,5 @@
1
1
  import { positionWorld } from '../../accessors/Position.js';
2
- import { float, Fn, min, normalize, sub, vec3 } from '../../tsl/TSLBase.js';
2
+ import { float, Fn, min, normalize, vec3 } from '../../tsl/TSLBase.js';
3
3
 
4
4
  /**
5
5
  * This computes a parallax corrected normal which is used for box-projected cube mapping (BPCEM).
@@ -21,8 +21,8 @@ import { float, Fn, min, normalize, sub, vec3 } from '../../tsl/TSLBase.js';
21
21
  const getParallaxCorrectNormal = /*@__PURE__*/ Fn( ( [ normal, cubeSize, cubePos ] ) => {
22
22
 
23
23
  const nDir = normalize( normal ).toVar();
24
- const rbmax = sub( float( 0.5 ).mul( cubeSize.sub( cubePos ) ), positionWorld ).div( nDir ).toVar();
25
- const rbmin = sub( float( - 0.5 ).mul( cubeSize.sub( cubePos ) ), positionWorld ).div( nDir ).toVar();
24
+ const rbmax = cubeSize.mul( 0.5 ).add( cubePos ).sub( positionWorld ).div( nDir ).toVar();
25
+ const rbmin = cubeSize.mul( - 0.5 ).add( cubePos ).sub( positionWorld ).div( nDir ).toVar();
26
26
  const rbminmax = vec3().toVar();
27
27
  rbminmax.x = nDir.x.greaterThan( float( 0 ) ).select( rbmax.x, rbmin.x );
28
28
  rbminmax.y = nDir.y.greaterThan( float( 0 ) ).select( rbmax.y, rbmin.y );
@@ -1,6 +1,7 @@
1
1
  import Node from '../core/Node.js';
2
2
  import { expression } from '../code/ExpressionNode.js';
3
3
  import { nodeProxy } from '../tsl/TSLCore.js';
4
+ import { error } from '../../utils.js';
4
5
 
5
6
  /**
6
7
  * `AtomicFunctionNode` represents any function that can operate on atomic variable types
@@ -90,11 +91,17 @@ class AtomicFunctionNode extends Node {
90
91
 
91
92
  generate( builder ) {
92
93
 
94
+ const method = this.method;
95
+
96
+ if ( builder.shaderStage === 'vertex' ) {
97
+
98
+ error( `TSL: "${this.method}" is not supported in the vertex stage.` );
99
+
100
+ }
101
+
93
102
  const properties = builder.getNodeProperties( this );
94
103
  const parents = properties.parents;
95
104
 
96
- const method = this.method;
97
-
98
105
  const type = this.getNodeType( builder );
99
106
  const inputType = this.getInputType( builder );
100
107
 
@@ -133,17 +140,61 @@ class AtomicFunctionNode extends Node {
133
140
 
134
141
  }
135
142
 
136
- }
143
+ static get ATOMIC_LOAD() {
144
+
145
+ return 'atomicLoad';
146
+
147
+ }
137
148
 
138
- AtomicFunctionNode.ATOMIC_LOAD = 'atomicLoad';
139
- AtomicFunctionNode.ATOMIC_STORE = 'atomicStore';
140
- AtomicFunctionNode.ATOMIC_ADD = 'atomicAdd';
141
- AtomicFunctionNode.ATOMIC_SUB = 'atomicSub';
142
- AtomicFunctionNode.ATOMIC_MAX = 'atomicMax';
143
- AtomicFunctionNode.ATOMIC_MIN = 'atomicMin';
144
- AtomicFunctionNode.ATOMIC_AND = 'atomicAnd';
145
- AtomicFunctionNode.ATOMIC_OR = 'atomicOr';
146
- AtomicFunctionNode.ATOMIC_XOR = 'atomicXor';
149
+ static get ATOMIC_STORE() {
150
+
151
+ return 'atomicStore';
152
+
153
+ }
154
+
155
+ static get ATOMIC_ADD() {
156
+
157
+ return 'atomicAdd';
158
+
159
+ }
160
+
161
+ static get ATOMIC_SUB() {
162
+
163
+ return 'atomicSub';
164
+
165
+ }
166
+
167
+ static get ATOMIC_MAX() {
168
+
169
+ return 'atomicMax';
170
+
171
+ }
172
+
173
+ static get ATOMIC_MIN() {
174
+
175
+ return 'atomicMin';
176
+
177
+ }
178
+
179
+ static get ATOMIC_AND() {
180
+
181
+ return 'atomicAnd';
182
+
183
+ }
184
+
185
+ static get ATOMIC_OR() {
186
+
187
+ return 'atomicOr';
188
+
189
+ }
190
+
191
+ static get ATOMIC_XOR() {
192
+
193
+ return 'atomicXor';
194
+
195
+ }
196
+
197
+ }
147
198
 
148
199
  export default AtomicFunctionNode;
149
200
 
@@ -157,7 +208,7 @@ export default AtomicFunctionNode;
157
208
  * @param {Node} valueNode - The value that mutates the atomic variable.
158
209
  * @returns {AtomicFunctionNode}
159
210
  */
160
- const atomicNode = nodeProxy( AtomicFunctionNode );
211
+ const atomicNode = /*@__PURE__*/ nodeProxy( AtomicFunctionNode );
161
212
 
162
213
  /**
163
214
  * TSL function for appending an atomic function call into the programmatic flow of a compute shader.