@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,3 +1,4 @@
1
+ import { error } from '../../utils.js';
1
2
  import Node from '../core/Node.js';
2
3
  import { nodeProxy } from '../tsl/TSLCore.js';
3
4
 
@@ -35,15 +36,23 @@ class BarrierNode extends Node {
35
36
  generate( builder ) {
36
37
 
37
38
  const { scope } = this;
38
- const { renderer } = builder;
39
+ const { renderer, shaderStage } = builder;
40
+
41
+ const barrierMethod = `${scope}Barrier`;
42
+
43
+ if ( shaderStage !== 'compute' ) {
44
+
45
+ error( `TSL: "${barrierMethod}" is not supported in the ${shaderStage} stage and can only be executed in compute.` );
46
+
47
+ }
39
48
 
40
49
  if ( renderer.backend.isWebGLBackend === true ) {
41
50
 
42
- builder.addFlowCode( `\t// ${scope}Barrier \n` );
51
+ builder.addFlowCode( `\t// ${barrierMethod}() \n` );
43
52
 
44
53
  } else {
45
54
 
46
- builder.addLineFlowCode( `${scope}Barrier()`, this );
55
+ builder.addLineFlowCode( `${barrierMethod}()`, this );
47
56
 
48
57
  }
49
58
 
@@ -61,7 +70,7 @@ export default BarrierNode;
61
70
  * @param {string} scope - The scope defines the behavior of the node..
62
71
  * @returns {BarrierNode}
63
72
  */
64
- const barrier = nodeProxy( BarrierNode );
73
+ const barrier = /*@__PURE__*/ nodeProxy( BarrierNode );
65
74
 
66
75
  /**
67
76
  * TSL function for creating a workgroup barrier. All compute shader
@@ -110,7 +110,7 @@ class ComputeBuiltinNode extends Node {
110
110
 
111
111
  } else {
112
112
 
113
- warn( `ComputeBuiltinNode: Compute built-in value ${builtinName} can not be accessed in the ${builder.shaderStage} stage` );
113
+ warn( `TSL: Compute built-in value "${builtinName}" can not be accessed in the ${builder.shaderStage} stage` );
114
114
  return builder.generateConst( nodeType );
115
115
 
116
116
  }
@@ -84,15 +84,6 @@ class ComputeNode extends Node {
84
84
  */
85
85
  this.name = '';
86
86
 
87
- /**
88
- * The `updateBeforeType` is set to `NodeUpdateType.OBJECT` since {@link ComputeNode#updateBefore}
89
- * is executed once per object by default.
90
- *
91
- * @type {string}
92
- * @default 'object'
93
- */
94
- this.updateBeforeType = NodeUpdateType.OBJECT;
95
-
96
87
  /**
97
88
  * A callback executed when the compute node finishes initialization.
98
89
  *
@@ -108,14 +99,14 @@ class ComputeNode extends Node {
108
99
  */
109
100
  this.countNode = null;
110
101
 
111
- }
112
-
113
- /**
114
- * Executes the `dispose` event for this node.
115
- */
116
- dispose() {
117
-
118
- this.dispatchEvent( { type: 'dispose' } );
102
+ /**
103
+ * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node computes
104
+ * once per frame.
105
+ *
106
+ * @type {string}
107
+ * @default 'frame'
108
+ */
109
+ this.updateBeforeType = NodeUpdateType.FRAME;
119
110
 
120
111
  }
121
112
 
@@ -162,6 +153,18 @@ class ComputeNode extends Node {
162
153
 
163
154
  }
164
155
 
156
+ /**
157
+ * Returns the update type of {@link Node#updateBefore}.
158
+ *
159
+ * @param {NodeFrame} [frame] - The current node frame.
160
+ * @return {NodeUpdateType} The update type.
161
+ */
162
+ getUpdateBeforeType( frame ) {
163
+
164
+ return frame.compute !== this ? this.updateBeforeType : NodeUpdateType.NONE;
165
+
166
+ }
167
+
165
168
  /**
166
169
  * The method execute the compute for this node.
167
170
  *
@@ -1,3 +1,4 @@
1
+ import { error } from '../../utils.js';
1
2
  import TempNode from '../core/TempNode.js';
2
3
  import { nodeProxyIntent } from '../tsl/TSLCore.js';
3
4
 
@@ -99,6 +100,12 @@ class SubgroupFunctionNode extends TempNode {
99
100
 
100
101
  const method = this.method;
101
102
 
103
+ if ( builder.shaderStage === 'vertex' ) {
104
+
105
+ error( `TSL: "${this.method}" is not supported in the vertex shader stage.` );
106
+
107
+ }
108
+
102
109
  const type = this.getNodeType( builder );
103
110
  const inputType = this.getInputType( builder );
104
111
 
@@ -162,42 +169,162 @@ class SubgroupFunctionNode extends TempNode {
162
169
 
163
170
  }
164
171
 
165
- }
172
+ // 0 inputs
173
+ static get SUBGROUP_ELECT() {
166
174
 
167
- // 0 inputs
168
- SubgroupFunctionNode.SUBGROUP_ELECT = 'subgroupElect';
169
-
170
- // 1 input
171
- SubgroupFunctionNode.SUBGROUP_BALLOT = 'subgroupBallot';
172
- SubgroupFunctionNode.SUBGROUP_ADD = 'subgroupAdd';
173
- SubgroupFunctionNode.SUBGROUP_INCLUSIVE_ADD = 'subgroupInclusiveAdd';
174
- SubgroupFunctionNode.SUBGROUP_EXCLUSIVE_AND = 'subgroupExclusiveAdd';
175
- SubgroupFunctionNode.SUBGROUP_MUL = 'subgroupMul';
176
- SubgroupFunctionNode.SUBGROUP_INCLUSIVE_MUL = 'subgroupInclusiveMul';
177
- SubgroupFunctionNode.SUBGROUP_EXCLUSIVE_MUL = 'subgroupExclusiveMul';
178
- SubgroupFunctionNode.SUBGROUP_AND = 'subgroupAnd';
179
- SubgroupFunctionNode.SUBGROUP_OR = 'subgroupOr';
180
- SubgroupFunctionNode.SUBGROUP_XOR = 'subgroupXor';
181
- SubgroupFunctionNode.SUBGROUP_MIN = 'subgroupMin';
182
- SubgroupFunctionNode.SUBGROUP_MAX = 'subgroupMax';
183
- SubgroupFunctionNode.SUBGROUP_ALL = 'subgroupAll';
184
- SubgroupFunctionNode.SUBGROUP_ANY = 'subgroupAny';
185
- SubgroupFunctionNode.SUBGROUP_BROADCAST_FIRST = 'subgroupBroadcastFirst';
186
- SubgroupFunctionNode.QUAD_SWAP_X = 'quadSwapX';
187
- SubgroupFunctionNode.QUAD_SWAP_Y = 'quadSwapY';
188
- SubgroupFunctionNode.QUAD_SWAP_DIAGONAL = 'quadSwapDiagonal';
189
-
190
- // 2 inputs
191
- SubgroupFunctionNode.SUBGROUP_BROADCAST = 'subgroupBroadcast';
192
- SubgroupFunctionNode.SUBGROUP_SHUFFLE = 'subgroupShuffle';
193
- SubgroupFunctionNode.SUBGROUP_SHUFFLE_XOR = 'subgroupShuffleXor';
194
- SubgroupFunctionNode.SUBGROUP_SHUFFLE_UP = 'subgroupShuffleUp';
195
- SubgroupFunctionNode.SUBGROUP_SHUFFLE_DOWN = 'subgroupShuffleDown';
196
- SubgroupFunctionNode.QUAD_BROADCAST = 'quadBroadcast';
175
+ return 'subgroupElect';
197
176
 
198
- export default SubgroupFunctionNode;
177
+ }
178
+
179
+ // 1 input
180
+ static get SUBGROUP_BALLOT() {
181
+
182
+ return 'subgroupBallot';
183
+
184
+ }
185
+
186
+ static get SUBGROUP_ADD() {
187
+
188
+ return 'subgroupAdd';
189
+
190
+ }
191
+
192
+ static get SUBGROUP_INCLUSIVE_ADD() {
193
+
194
+ return 'subgroupInclusiveAdd';
195
+
196
+ }
197
+
198
+ static get SUBGROUP_EXCLUSIVE_ADD() {
199
+
200
+ return 'subgroupExclusiveAdd';
201
+
202
+ }
203
+
204
+ static get SUBGROUP_MUL() {
205
+
206
+ return 'subgroupMul';
207
+
208
+ }
209
+
210
+ static get SUBGROUP_INCLUSIVE_MUL() {
211
+
212
+ return 'subgroupInclusiveMul';
213
+
214
+ }
215
+
216
+ static get SUBGROUP_EXCLUSIVE_MUL() {
217
+
218
+ return 'subgroupExclusiveMul';
219
+
220
+ }
221
+
222
+ static get SUBGROUP_AND() {
223
+
224
+ return 'subgroupAnd';
225
+
226
+ }
227
+
228
+ static get SUBGROUP_OR() {
229
+
230
+ return 'subgroupOr';
231
+
232
+ }
233
+
234
+ static get SUBGROUP_XOR() {
235
+
236
+ return 'subgroupXor';
237
+
238
+ }
239
+
240
+ static get SUBGROUP_MIN() {
241
+
242
+ return 'subgroupMin';
243
+
244
+ }
245
+
246
+ static get SUBGROUP_MAX() {
247
+
248
+ return 'subgroupMax';
199
249
 
250
+ }
251
+
252
+ static get SUBGROUP_ALL() {
253
+
254
+ return 'subgroupAll';
255
+
256
+ }
257
+
258
+ static get SUBGROUP_ANY() {
259
+
260
+ return 'subgroupAny';
261
+
262
+ }
263
+
264
+ static get SUBGROUP_BROADCAST_FIRST() {
265
+
266
+ return 'subgroupBroadcastFirst';
267
+
268
+ }
269
+
270
+ static get QUAD_SWAP_X() {
200
271
 
272
+ return 'quadSwapX';
273
+
274
+ }
275
+
276
+ static get QUAD_SWAP_Y() {
277
+
278
+ return 'quadSwapY';
279
+
280
+ }
281
+
282
+ static get QUAD_SWAP_DIAGONAL() {
283
+
284
+ return 'quadSwapDiagonal';
285
+
286
+ }
287
+
288
+ // 2 inputs
289
+ static get SUBGROUP_BROADCAST() {
290
+
291
+ return 'subgroupBroadcast';
292
+
293
+ }
294
+
295
+ static get SUBGROUP_SHUFFLE() {
296
+
297
+ return 'subgroupShuffle';
298
+
299
+ }
300
+
301
+ static get SUBGROUP_SHUFFLE_XOR() {
302
+
303
+ return 'subgroupShuffleXor';
304
+
305
+ }
306
+
307
+ static get SUBGROUP_SHUFFLE_UP() {
308
+
309
+ return 'subgroupShuffleUp';
310
+
311
+ }
312
+
313
+ static get SUBGROUP_SHUFFLE_DOWN() {
314
+
315
+ return 'subgroupShuffleDown';
316
+
317
+ }
318
+
319
+ static get QUAD_BROADCAST() {
320
+
321
+ return 'quadBroadcast';
322
+
323
+ }
324
+
325
+ }
326
+
327
+ export default SubgroupFunctionNode;
201
328
 
202
329
  /**
203
330
  * Returns true if this invocation has the lowest subgroup_invocation_id
@@ -248,7 +375,7 @@ export const subgroupInclusiveAdd = /*@__PURE__*/ nodeProxyIntent( SubgroupFunct
248
375
  * @param {number} e - The value provided to the exclusive scan by the current invocation.
249
376
  * @return {number} The accumulated result of the exclusive scan operation.
250
377
  */
251
- export const subgroupExclusiveAdd = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_EXCLUSIVE_AND ).setParameterLength( 1 );
378
+ export const subgroupExclusiveAdd = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_EXCLUSIVE_ADD ).setParameterLength( 1 );
252
379
 
253
380
  /**
254
381
  * A reduction that multiplies e among all active invocations and returns that result.
@@ -335,18 +462,20 @@ export const subgroupMax = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode,
335
462
  *
336
463
  * @tsl
337
464
  * @method
465
+ * @param {boolean} e - The predicate provided by the current invocation.
338
466
  * @return {bool} The result of the computation.
339
467
  */
340
- export const subgroupAll = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_ALL ).setParameterLength( 0 );
468
+ export const subgroupAll = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_ALL ).setParameterLength( 1 );
341
469
 
342
470
  /**
343
471
  * Returns true if e is true for any active invocation in the subgroup
344
472
  *
345
473
  * @tsl
346
474
  * @method
475
+ * @param {boolean} e - The predicate provided by the current invocation.
347
476
  * @return {bool} The result of the computation.
348
477
  */
349
- export const subgroupAny = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_ANY ).setParameterLength( 0 );
478
+ export const subgroupAny = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_ANY ).setParameterLength( 1 );
350
479
 
351
480
  /**
352
481
  * Broadcasts e from the active invocation with the lowest subgroup_invocation_id in the subgroup to all other active invocations.
@@ -354,10 +483,9 @@ export const subgroupAny = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode,
354
483
  * @tsl
355
484
  * @method
356
485
  * @param {number} e - The value to broadcast from the lowest subgroup invocation.
357
- * @param {number} id - The subgroup invocation to broadcast from.
358
486
  * @return {number} The broadcast value.
359
487
  */
360
- export const subgroupBroadcastFirst = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_BROADCAST_FIRST ).setParameterLength( 2 );
488
+ export const subgroupBroadcastFirst = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_BROADCAST_FIRST ).setParameterLength( 1 );
361
489
 
362
490
  /**
363
491
  * Swaps e between invocations in the quad in the X direction.
@@ -1,6 +1,6 @@
1
1
  import ArrayElementNode from '../utils/ArrayElementNode.js';
2
2
  import Node from '../core/Node.js';
3
- import { warn } from '../../utils.js';
3
+ import { error, warn } from '../../utils.js';
4
4
  import StackTrace from '../core/StackTrace.js';
5
5
 
6
6
  /**
@@ -69,9 +69,9 @@ class WorkgroupInfoElementNode extends ArrayElementNode {
69
69
  class WorkgroupInfoNode extends Node {
70
70
 
71
71
  /**
72
- * Constructs a new buffer scoped to type scope.
72
+ * Constructs a new workgroup info node.
73
73
  *
74
- * @param {string} scope - TODO.
74
+ * @param {string} scope - The address space the buffer is scoped to. Currently only `'Workgroup'` is used.
75
75
  * @param {string} bufferType - The data type of a 'workgroup' scoped buffer element.
76
76
  * @param {number} [bufferCount=0] - The number of elements in the buffer.
77
77
  */
@@ -94,6 +94,14 @@ class WorkgroupInfoNode extends Node {
94
94
  */
95
95
  this.bufferCount = bufferCount;
96
96
 
97
+ /**
98
+ * Whether the node is atomic or not.
99
+ *
100
+ * @type {boolean}
101
+ * @default false
102
+ */
103
+ this.isAtomic = false;
104
+
97
105
  /**
98
106
  * This flag can be used for type testing.
99
107
  *
@@ -111,7 +119,7 @@ class WorkgroupInfoNode extends Node {
111
119
  this.elementType = bufferType;
112
120
 
113
121
  /**
114
- * TODO.
122
+ * The address space the buffer is scoped to. Currently only `'Workgroup'` is used.
115
123
  *
116
124
  * @type {string}
117
125
  */
@@ -170,6 +178,31 @@ class WorkgroupInfoNode extends Node {
170
178
 
171
179
  }
172
180
 
181
+ /**
182
+ * Defines whether the node is atomic or not.
183
+ *
184
+ * @param {boolean} value - The atomic flag.
185
+ * @return {WorkgroupInfoNode} A reference to this node.
186
+ */
187
+ setAtomic( value ) {
188
+
189
+ this.isAtomic = value;
190
+
191
+ return this;
192
+
193
+ }
194
+
195
+ /**
196
+ * Convenience method for making this node atomic.
197
+ *
198
+ * @return {WorkgroupInfoNode} A reference to this node.
199
+ */
200
+ toAtomic() {
201
+
202
+ return this.setAtomic( true );
203
+
204
+ }
205
+
173
206
 
174
207
  /**
175
208
  * The data type of the array buffer.
@@ -209,9 +242,15 @@ class WorkgroupInfoNode extends Node {
209
242
 
210
243
  generate( builder ) {
211
244
 
245
+ if ( builder.shaderStage !== 'compute' ) {
246
+
247
+ error( 'TSL: "workgroupArray()" can only be executed within the compute shader stage' );
248
+
249
+ }
250
+
212
251
  const name = ( this.name !== '' ) ? this.name : `${this.scope}Array_${this.id}`;
213
252
 
214
- return builder.getScopedArray( name, this.scope.toLowerCase(), this.bufferType, this.bufferCount );
253
+ return builder.getScopedArray( name, this.scope.toLowerCase(), this.bufferType, this.bufferCount, this.isAtomic );
215
254
 
216
255
  }
217
256
 
@@ -231,4 +270,3 @@ export default WorkgroupInfoNode;
231
270
  */
232
271
  export const workgroupArray = ( type, count ) => new WorkgroupInfoNode( 'Workgroup', type, count );
233
272
 
234
-
@@ -1,6 +1,6 @@
1
1
  import LightingNode from './LightingNode.js';
2
2
  import { isolate } from '../core/IsolateNode.js';
3
- import { roughness, clearcoatRoughness } from '../core/PropertyNode.js';
3
+ import { roughness, clearcoatRoughness, retroreflectivity } from '../core/PropertyNode.js';
4
4
  import { cameraWorldMatrix } from '../accessors/Camera.js';
5
5
  import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
6
6
  import { positionViewDirection } from '../accessors/Position.js';
@@ -76,15 +76,23 @@ class EnvironmentNode extends LightingNode {
76
76
  const useAnisotropy = material.useAnisotropy === true || material.anisotropy > 0;
77
77
  const radianceNormalView = useAnisotropy ? bentNormalView : normalView;
78
78
 
79
- const radiance = envNode.context( createRadianceContext( roughness, radianceNormalView ) ).mul( materialEnvIntensity );
79
+ let radiance = isolate( envNode.context( createRadianceContext( roughness, radianceNormalView ) ).mul( materialEnvIntensity ) );
80
+
81
+ if ( material.useRetroreflection === true || material.retroreflectivity > 0 ) {
82
+
83
+ const retroRadiance = isolate( envNode.context( createRetroRadianceContext( roughness, radianceNormalView ) ).mul( materialEnvIntensity ) );
84
+
85
+ radiance = retroreflectivity.clamp().mix( radiance, retroRadiance );
86
+
87
+ }
88
+
80
89
  const irradiance = envNode.context( createIrradianceContext( normalWorld ) ).mul( Math.PI ).mul( materialEnvIntensity );
81
90
 
82
- const isolateRadiance = isolate( radiance );
83
91
  const isolateIrradiance = isolate( irradiance );
84
92
 
85
93
  //
86
94
 
87
- builder.context.radiance.addAssign( isolateRadiance );
95
+ builder.context.radiance.addAssign( radiance );
88
96
 
89
97
  builder.context.iblIrradiance.addAssign( isolateIrradiance );
90
98
 
@@ -160,6 +168,34 @@ const createRadianceContext = ( roughnessNode, normalViewNode ) => {
160
168
 
161
169
  };
162
170
 
171
+ const createRetroRadianceContext = ( roughnessNode, normalViewNode ) => {
172
+
173
+ let retroVec = null;
174
+
175
+ return {
176
+ getUV: () => {
177
+
178
+ if ( retroVec === null ) {
179
+
180
+ // The retroreflective lobe returns light toward its source, so the environment is sampled along the view direction
181
+ retroVec = pow4( roughnessNode ).mix( positionViewDirection, normalViewNode ).normalize();
182
+
183
+ retroVec = retroVec.transformDirection( cameraWorldMatrix );
184
+
185
+ }
186
+
187
+ return retroVec;
188
+
189
+ },
190
+ getTextureLevel: () => {
191
+
192
+ return roughnessNode;
193
+
194
+ }
195
+ };
196
+
197
+ };
198
+
163
199
  const createIrradianceContext = ( normalWorldNode ) => {
164
200
 
165
201
  return {
@@ -169,11 +169,11 @@ class LightsNode extends Node {
169
169
  */
170
170
  customCacheKey() {
171
171
 
172
- const lights = this._lights;
172
+ const builtinLights = this.getBuiltinLights();
173
173
 
174
- for ( let i = 0; i < lights.length; i ++ ) {
174
+ for ( let i = 0; i < builtinLights.length; i ++ ) {
175
175
 
176
- const light = lights[ i ];
176
+ const light = builtinLights[ i ];
177
177
 
178
178
  _hashData.push( light.id );
179
179
  _hashData.push( light.castShadow ? 1 : 0 );
@@ -276,7 +276,9 @@ class LightsNode extends Node {
276
276
  const previousLightNodes = nodeData.lightNodes || null;
277
277
  const materialLightings = builder.context.materialLightings;
278
278
 
279
- const lights = sortLights( [ ...materialLightings, ...this._lights ] );
279
+ const builtinLights = this.getBuiltinLights();
280
+
281
+ const lights = sortLights( [ ...materialLightings, ...builtinLights ] );
280
282
  const nodeLibrary = builder.renderer.library;
281
283
 
282
284
  for ( const light of lights ) {
@@ -553,6 +555,20 @@ class LightsNode extends Node {
553
555
 
554
556
  }
555
557
 
558
+ /**
559
+ * Returns an array of the scene's lights.
560
+ *
561
+ * The light variations are shader-dependent;
562
+ * if this array changes, the shader needs to be recreated.
563
+ *
564
+ * @return {Array<Light>} The scene's lights.
565
+ */
566
+ getBuiltinLights() {
567
+
568
+ return this._lights;
569
+
570
+ }
571
+
556
572
  /**
557
573
  * Whether the scene has lights or not.
558
574
  *