@gnsx/three 0.185.16 → 0.186.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -183,6 +183,14 @@ class WebGLRenderer {
183
183
  * @type {boolean}
184
184
  */
185
185
  checkShaderErrors: true,
186
+ /**
187
+ * Diagnostics configuration for the shader generation. Only relevant for TSL.
188
+ * @type {Object}
189
+ * @property {boolean} keywords - Whether declaration names that collide with reserved keywords of the shading language should be renamed or not.
190
+ */
191
+ diagnostics: {
192
+ keywords: false
193
+ },
186
194
  /**
187
195
  * Callback for custom error reporting.
188
196
  * @type {?Function}
@@ -370,6 +378,14 @@ class WebGLRenderer {
370
378
 
371
379
  }
372
380
 
381
+ let extensions, capabilities, state, info;
382
+ let properties, textures, environments, attributes, geometries, objects;
383
+ let programCache, materials, renderLists, renderStates, clipping, shadowMap;
384
+
385
+ let background, morphtargets, bufferRenderer, indexedBufferRenderer;
386
+
387
+ let utils, bindingStates, uniformsGroups;
388
+
373
389
  try {
374
390
 
375
391
  const contextAttributes = {
@@ -413,21 +429,19 @@ class WebGLRenderer {
413
429
 
414
430
  }
415
431
 
432
+ initGLContext();
433
+
416
434
  } catch ( e ) {
417
435
 
436
+ canvas.removeEventListener( 'webglcontextlost', onContextLost, false );
437
+ canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );
438
+ canvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );
439
+
418
440
  error( 'WebGLRenderer: ' + e.message );
419
441
  throw e;
420
442
 
421
443
  }
422
444
 
423
- let extensions, capabilities, state, info;
424
- let properties, textures, environments, attributes, geometries, objects;
425
- let programCache, materials, renderLists, renderStates, clipping, shadowMap;
426
-
427
- let background, morphtargets, bufferRenderer, indexedBufferRenderer;
428
-
429
- let utils, bindingStates, uniformsGroups;
430
-
431
445
  function initGLContext() {
432
446
 
433
447
  extensions = new WebGLExtensions( _gl );
@@ -549,8 +563,6 @@ class WebGLRenderer {
549
563
 
550
564
  }
551
565
 
552
- initGLContext();
553
-
554
566
  // initialize internal render target for non-UnsignedByteType color buffer
555
567
 
556
568
  if ( _outputBufferType !== UnsignedByteType ) {
@@ -1346,7 +1358,11 @@ class WebGLRenderer {
1346
1358
 
1347
1359
  // Compile
1348
1360
 
1349
- function prepareMaterial( material, scene, object ) {
1361
+ function prepareMaterial( material, scene, camera, object ) {
1362
+
1363
+ if ( _nodesHandler !== null && material.isNodeMaterial ) _nodesHandler.setObject( object, material );
1364
+
1365
+ if ( _clippingEnabled === true ) clipping.setState( material, camera, false );
1350
1366
 
1351
1367
  if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
1352
1368
 
@@ -1383,6 +1399,7 @@ class WebGLRenderer {
1383
1399
  this.compile = function ( scene, camera, targetScene = null ) {
1384
1400
 
1385
1401
  if ( targetScene === null ) targetScene = scene;
1402
+ if ( _nodesHandler !== null ) _nodesHandler.renderStart( scene, camera, targetScene );
1386
1403
 
1387
1404
  currentRenderState = renderStates.get( targetScene );
1388
1405
  currentRenderState.init( camera );
@@ -1428,6 +1445,16 @@ class WebGLRenderer {
1428
1445
  }
1429
1446
 
1430
1447
  currentRenderState.setupLights();
1448
+ if ( _nodesHandler !== null ) _nodesHandler.updateLights( currentRenderState.state.lightsArray );
1449
+
1450
+ _localClippingEnabled = this.localClippingEnabled;
1451
+ _clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );
1452
+
1453
+ if ( _clippingEnabled === true ) clipping.setGlobalState( this.clippingPlanes, camera );
1454
+
1455
+ // node materials reference the shadow map when they are built, so it must exist by now
1456
+
1457
+ if ( _nodesHandler !== null ) shadowMap.render( currentRenderState.state.shadowsArray, targetScene, camera );
1431
1458
 
1432
1459
  // Only initialize materials in the new scene, not the targetScene.
1433
1460
 
@@ -1451,14 +1478,14 @@ class WebGLRenderer {
1451
1478
 
1452
1479
  const material2 = material[ i ];
1453
1480
 
1454
- prepareMaterial( material2, targetScene, object );
1481
+ prepareMaterial( material2, targetScene, camera, object );
1455
1482
  materials.add( material2 );
1456
1483
 
1457
1484
  }
1458
1485
 
1459
1486
  } else {
1460
1487
 
1461
- prepareMaterial( material, targetScene, object );
1488
+ prepareMaterial( material, targetScene, camera, object );
1462
1489
  materials.add( material );
1463
1490
 
1464
1491
  }
@@ -1468,6 +1495,7 @@ class WebGLRenderer {
1468
1495
  } );
1469
1496
 
1470
1497
  currentRenderState = renderStateStack.pop();
1498
+ if ( _nodesHandler !== null ) _nodesHandler.renderEnd();
1471
1499
 
1472
1500
  return materials;
1473
1501
 
@@ -1503,9 +1531,9 @@ class WebGLRenderer {
1503
1531
  const materialProperties = properties.get( material );
1504
1532
  const program = materialProperties.currentProgram;
1505
1533
 
1506
- if ( program.isReady() ) {
1534
+ if ( program === undefined || program.isReady() ) {
1507
1535
 
1508
- // remove any programs that report they're ready to use from the list
1536
+ // stop waiting for materials that are ready to use or have been disposed
1509
1537
  materials.delete( material );
1510
1538
 
1511
1539
  }
@@ -1716,6 +1744,7 @@ class WebGLRenderer {
1716
1744
  // !WITH_GENESYS
1717
1745
 
1718
1746
  currentRenderList.finish();
1747
+ if ( _nodesHandler !== null ) _nodesHandler.updateLights( currentRenderState.state.lightsArray );
1719
1748
 
1720
1749
  if ( _this.sortObjects === true ) {
1721
1750
 
@@ -1723,7 +1752,7 @@ class WebGLRenderer {
1723
1752
  ProfilerService.begin( 'sortRenderList' );
1724
1753
  // !WITH_GENESYS
1725
1754
 
1726
- currentRenderList.sort( _opaqueSort, _transparentSort, camera.reversedDepth );
1755
+ currentRenderList.sort( _opaqueSort, _transparentSort );
1727
1756
 
1728
1757
  // WITH_GENESYS
1729
1758
  ProfilerService.end( 'sortRenderList' );
@@ -1931,7 +1960,7 @@ class WebGLRenderer {
1931
1960
 
1932
1961
  } else if ( object.isSprite ) {
1933
1962
 
1934
- if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
1963
+ if ( ! object.frustumCulled || object.intersectsFrustum( _frustum ) ) {
1935
1964
 
1936
1965
  if ( sortObjects ) {
1937
1966
 
@@ -1945,7 +1974,7 @@ class WebGLRenderer {
1945
1974
 
1946
1975
  if ( material.visible ) {
1947
1976
 
1948
- currentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );
1977
+ currentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null, camera );
1949
1978
 
1950
1979
  }
1951
1980
 
@@ -1953,7 +1982,7 @@ class WebGLRenderer {
1953
1982
 
1954
1983
  } else if ( object.isMesh || object.isLine || object.isPoints ) {
1955
1984
 
1956
- if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
1985
+ if ( ! object.frustumCulled || object.intersectsFrustum( _frustum ) ) {
1957
1986
 
1958
1987
  const geometry = objects.update( object );
1959
1988
  const material = object.material;
@@ -1989,7 +2018,7 @@ class WebGLRenderer {
1989
2018
 
1990
2019
  if ( groupMaterial && groupMaterial.visible ) {
1991
2020
 
1992
- currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );
2021
+ currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group, camera );
1993
2022
 
1994
2023
  }
1995
2024
 
@@ -1997,7 +2026,7 @@ class WebGLRenderer {
1997
2026
 
1998
2027
  } else if ( material.visible ) {
1999
2028
 
2000
- currentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );
2029
+ currentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null, camera );
2001
2030
 
2002
2031
  }
2003
2032
 
@@ -2070,6 +2099,8 @@ class WebGLRenderer {
2070
2099
  stencilBuffer: stencil,
2071
2100
  resolveDepthBuffer: false,
2072
2101
  resolveStencilBuffer: false,
2102
+ storeMultisampledDepthBuffer: false,
2103
+ storeMultisampledStencilBuffer: false,
2073
2104
  colorSpace: ColorManagement.workingColorSpace,
2074
2105
  } );
2075
2106
 
@@ -2214,6 +2245,7 @@ class WebGLRenderer {
2214
2245
 
2215
2246
  function renderObject( object, scene, camera, geometry, material, group ) {
2216
2247
 
2248
+ if ( _nodesHandler !== null && material.isNodeMaterial ) _nodesHandler.setObject( object, material );
2217
2249
  object.onBeforeRender( _this, scene, camera, geometry, material, group );
2218
2250
 
2219
2251
  object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
@@ -2334,6 +2366,8 @@ class WebGLRenderer {
2334
2366
 
2335
2367
  uniforms.ambientLightColor.value = lights.state.ambient;
2336
2368
  uniforms.lightProbe.value = lights.state.probe;
2369
+ uniforms.sunLights.value = lights.state.sun;
2370
+ uniforms.sunLightShadows.value = lights.state.sunShadow;
2337
2371
  uniforms.directionalLights.value = lights.state.directional;
2338
2372
  uniforms.directionalLightShadows.value = lights.state.directionalShadow;
2339
2373
  uniforms.spotLights.value = lights.state.spot;
@@ -2345,6 +2379,8 @@ class WebGLRenderer {
2345
2379
  uniforms.pointLightShadows.value = lights.state.pointShadow;
2346
2380
  uniforms.hemisphereLights.value = lights.state.hemi;
2347
2381
 
2382
+ uniforms.sunShadowMatrix.value = lights.state.sunShadowMatrix;
2383
+ uniforms.sunShadowCascade.value = lights.state.sunShadowCascade;
2348
2384
  uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;
2349
2385
  uniforms.spotLightMatrix.value = lights.state.spotLightMatrix;
2350
2386
  uniforms.spotLightMap.value = lights.state.spotLightMap;
@@ -2496,11 +2532,11 @@ class WebGLRenderer {
2496
2532
 
2497
2533
  needsProgramChange = true;
2498
2534
 
2499
- } else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {
2535
+ } else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object._colorsTexture === null ) {
2500
2536
 
2501
2537
  needsProgramChange = true;
2502
2538
 
2503
- } else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {
2539
+ } else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object._colorsTexture !== null ) {
2504
2540
 
2505
2541
  needsProgramChange = true;
2506
2542
 
@@ -2709,6 +2745,12 @@ class WebGLRenderer {
2709
2745
  if ( materialProperties.needsLights ) {
2710
2746
 
2711
2747
  // Set shadow map uniforms first to ensure they get the first texture units
2748
+ if ( lights.state.sunShadowMap.length > 0 ) {
2749
+
2750
+ p_uniforms.setValue( _gl, 'sunShadowMap', lights.state.sunShadowMap, textures );
2751
+
2752
+ }
2753
+
2712
2754
  if ( lights.state.directionalShadowMap.length > 0 ) {
2713
2755
 
2714
2756
  p_uniforms.setValue( _gl, 'directionalShadowMap', lights.state.directionalShadowMap, textures );
@@ -2888,6 +2930,8 @@ class WebGLRenderer {
2888
2930
  uniforms.ambientLightColor.needsUpdate = value;
2889
2931
  uniforms.lightProbe.needsUpdate = value;
2890
2932
 
2933
+ uniforms.sunLights.needsUpdate = value;
2934
+ uniforms.sunLightShadows.needsUpdate = value;
2891
2935
  uniforms.directionalLights.needsUpdate = value;
2892
2936
  uniforms.directionalLightShadows.needsUpdate = value;
2893
2937
  uniforms.pointLights.needsUpdate = value;
@@ -3147,6 +3191,23 @@ class WebGLRenderer {
3147
3191
 
3148
3192
  };
3149
3193
 
3194
+ function getReadableState( texture ) {
3195
+
3196
+ const textureProperties = properties.get( texture );
3197
+
3198
+ if ( textureProperties.__readFormat !== texture.format || textureProperties.__readType !== texture.type ) {
3199
+
3200
+ textureProperties.__readFormat = texture.format;
3201
+ textureProperties.__readType = texture.type;
3202
+ textureProperties.__formatReadable = capabilities.textureFormatReadable( texture.format );
3203
+ textureProperties.__typeReadable = capabilities.textureTypeReadable( texture.type );
3204
+
3205
+ }
3206
+
3207
+ return textureProperties;
3208
+
3209
+ }
3210
+
3150
3211
  /**
3151
3212
  * Reads the pixel data from the given render target into the given buffer.
3152
3213
  *
@@ -3190,14 +3251,16 @@ class WebGLRenderer {
3190
3251
 
3191
3252
  if ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );
3192
3253
 
3193
- if ( ! capabilities.textureFormatReadable( textureFormat ) ) {
3254
+ const readableState = getReadableState( texture );
3255
+
3256
+ if ( readableState.__formatReadable === false ) {
3194
3257
 
3195
3258
  error( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
3196
3259
  return;
3197
3260
 
3198
3261
  }
3199
3262
 
3200
- if ( ! capabilities.textureTypeReadable( textureType ) ) {
3263
+ if ( readableState.__typeReadable === false ) {
3201
3264
 
3202
3265
  error( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
3203
3266
  return;
@@ -3272,14 +3335,15 @@ class WebGLRenderer {
3272
3335
 
3273
3336
  if ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );
3274
3337
 
3338
+ const readableState = getReadableState( texture );
3275
3339
 
3276
- if ( ! capabilities.textureFormatReadable( textureFormat ) ) {
3340
+ if ( readableState.__formatReadable === false ) {
3277
3341
 
3278
3342
  throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );
3279
3343
 
3280
3344
  }
3281
3345
 
3282
- if ( ! capabilities.textureTypeReadable( textureType ) ) {
3346
+ if ( readableState.__typeReadable === false ) {
3283
3347
 
3284
3348
  throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );
3285
3349
 
@@ -3290,6 +3354,7 @@ class WebGLRenderer {
3290
3354
  _gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );
3291
3355
 
3292
3356
  _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );
3357
+ _gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, null );
3293
3358
 
3294
3359
  // reset the frame buffer to the currently set buffer before waiting
3295
3360
  const currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;
@@ -3305,6 +3370,7 @@ class WebGLRenderer {
3305
3370
  // read the data and delete the buffer
3306
3371
  _gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );
3307
3372
  _gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );
3373
+ _gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, null );
3308
3374
  _gl.deleteBuffer( glBuffer );
3309
3375
  _gl.deleteSync( sync );
3310
3376
 
@@ -72,6 +72,12 @@ class Animation {
72
72
 
73
73
  this._requestId = this._context.requestAnimationFrame( update );
74
74
 
75
+ if ( this.renderer._inspector.isRunning ) {
76
+
77
+ this.renderer._inspector.finish();
78
+
79
+ }
80
+
75
81
  if ( this.info.autoReset === true ) this.info.reset();
76
82
 
77
83
  this.nodes.nodeFrame.update();
@@ -80,9 +86,11 @@ class Animation {
80
86
 
81
87
  this.renderer._inspector.begin();
82
88
 
83
- if ( this._animationLoop !== null ) this._animationLoop( time, xrFrame );
89
+ if ( this._animationLoop !== null ) {
84
90
 
85
- this.renderer._inspector.finish();
91
+ this._animationLoop( time, xrFrame );
92
+
93
+ }
86
94
 
87
95
  };
88
96
 
@@ -95,6 +103,8 @@ class Animation {
95
103
  */
96
104
  stop() {
97
105
 
106
+ if ( this.renderer._inspector.isRunning ) this.renderer._inspector.finish();
107
+
98
108
  if ( this._context !== null ) this._context.cancelAnimationFrame( this._requestId );
99
109
 
100
110
  this._requestId = null;
@@ -211,10 +211,10 @@ class Backend {
211
211
  * @abstract
212
212
  * @param {BindGroup} bindGroup - The bind group.
213
213
  * @param {Array<BindGroup>} bindings - Array of bind groups.
214
- * @param {number} cacheIndex - The cache index.
214
+ * @param {string} cacheKey - The cache key.
215
215
  * @param {number} version - The version.
216
216
  */
217
- createBindings( /*bindGroup, bindings, cacheIndex, version*/ ) { }
217
+ createBindings( /*bindGroup, bindings, cacheKey, version*/ ) { }
218
218
 
219
219
  /**
220
220
  * Updates the given bind group definition.
@@ -222,10 +222,10 @@ class Backend {
222
222
  * @abstract
223
223
  * @param {BindGroup} bindGroup - The bind group.
224
224
  * @param {Array<BindGroup>} bindings - Array of bind groups.
225
- * @param {number} cacheIndex - The cache index.
225
+ * @param {string} cacheKey - The cache key.
226
226
  * @param {number} version - The version.
227
227
  */
228
- updateBindings( /*bindGroup, bindings, cacheIndex, version*/ ) { }
228
+ updateBindings( /*bindGroup, bindings, cacheKey, version*/ ) { }
229
229
 
230
230
  /**
231
231
  * Updates a buffer binding.
@@ -252,8 +252,9 @@ class Backend {
252
252
  * @abstract
253
253
  * @param {ComputePipeline} computePipeline - The compute pipeline.
254
254
  * @param {Array<BindGroup>} bindings - The bindings.
255
+ * @param {?Array<Promise>} [promises=null] - Optional compilation promises.
255
256
  */
256
- createComputePipeline( /*computePipeline, bindings*/ ) { }
257
+ createComputePipeline( /*computePipeline, bindings, promises*/ ) { }
257
258
 
258
259
  // cache key
259
260
 
@@ -360,7 +361,7 @@ class Backend {
360
361
  * @param {number} y - The y coordinate of the copy origin.
361
362
  * @param {number} width - The width of the copy.
362
363
  * @param {number} height - The height of the copy.
363
- * @param {number} faceIndex - The face index.
364
+ * @param {number} faceIndex - The cube face, depth slice or array layer index.
364
365
  * @return {Promise<TypedArray>} A Promise that resolves with a typed array when the copy operation has finished.
365
366
  */
366
367
  async copyTextureToBuffer( /*texture, x, y, width, height, faceIndex*/ ) {}
@@ -478,7 +479,7 @@ class Backend {
478
479
  * Updates a unique identifier for the given render context that can be used
479
480
  * to allocate resources like occlusion queries or timestamp queries.
480
481
  *
481
- * @param {RenderContext|ComputeNode} abstractRenderContext - The render context.
482
+ * @param {RenderContext|ComputeNode|Array<ComputeNode>} abstractRenderContext - The render context.
482
483
  */
483
484
  updateTimeStampUID( abstractRenderContext ) {
484
485
 
@@ -487,7 +488,15 @@ class Backend {
487
488
 
488
489
  let prefix;
489
490
 
490
- if ( abstractRenderContext.isComputeNode === true ) {
491
+ let id = abstractRenderContext.id;
492
+
493
+ if ( Array.isArray( abstractRenderContext ) ) {
494
+
495
+ id = abstractRenderContext.map( c => c.id ).join( ',' );
496
+
497
+ prefix = 'c:' + this.renderer.info.compute.frameCalls;
498
+
499
+ } else if ( abstractRenderContext.isComputeNode === true ) {
491
500
 
492
501
  prefix = 'c:' + this.renderer.info.compute.frameCalls;
493
502
 
@@ -497,7 +506,7 @@ class Backend {
497
506
 
498
507
  }
499
508
 
500
- contextData.timestampUID = prefix + ':' + abstractRenderContext.id + ':f' + frame;
509
+ contextData.timestampUID = prefix + ':' + id + ':f' + frame;
501
510
 
502
511
  }
503
512
 
@@ -729,6 +738,13 @@ class Backend {
729
738
  */
730
739
  setScissorTest( /*boolean*/ ) { }
731
740
 
741
+ /**
742
+ * Resets the backend's internal state. A no-op for backends without a state cache (e.g. WebGPU).
743
+ *
744
+ * @abstract
745
+ */
746
+ resetState() { }
747
+
732
748
  /**
733
749
  * Returns the clear color and alpha into a single
734
750
  * color object.
@@ -866,7 +882,19 @@ class Backend {
866
882
  *
867
883
  * @abstract
868
884
  */
869
- dispose() { }
885
+ async dispose() {
886
+
887
+ for ( const queryPool of Object.values( this.timestampQueryPool ) ) {
888
+
889
+ if ( queryPool !== null ) {
890
+
891
+ await queryPool.dispose();
892
+
893
+ }
894
+
895
+ }
896
+
897
+ }
870
898
 
871
899
  }
872
900
 
@@ -14,7 +14,6 @@ class BindGroup {
14
14
  *
15
15
  * @param {string} name - The bind group's name.
16
16
  * @param {Array<Binding>} bindings - An array of bindings.
17
- * @param {number} index - The group index.
18
17
  */
19
18
  constructor( name = '', bindings = [] ) {
20
19
 
@@ -149,6 +149,43 @@ class Bindings extends DataMap {
149
149
 
150
150
  }
151
151
 
152
+ /**
153
+ * Updates only the shared uniform buffers of the given render object.
154
+ *
155
+ * @param {RenderObject} renderObject - The render object.
156
+ */
157
+ updateSharedForRender( renderObject ) {
158
+
159
+ const bindings = this.getForRender( renderObject );
160
+
161
+ for ( const bindGroup of bindings ) {
162
+
163
+ for ( const binding of bindGroup.bindings ) {
164
+
165
+ if ( ( binding.isNodeUniformsGroup === true || binding.isNodeUniformBuffer === true ) && binding.groupNode.shared === true ) {
166
+
167
+ const updatedGroup = this.nodes.updateGroup( binding );
168
+
169
+ if ( updatedGroup === false ) continue;
170
+
171
+ const updated = binding.update();
172
+
173
+ if ( updated ) {
174
+
175
+ this.backend.updateBinding( binding );
176
+
177
+ }
178
+
179
+ if ( binding.updateRanges.length > 0 ) binding.clearUpdateRanges();
180
+
181
+ }
182
+
183
+ }
184
+
185
+ }
186
+
187
+ }
188
+
152
189
  /**
153
190
  * Deletes the bindings for the given compute node.
154
191
  *
@@ -225,7 +262,7 @@ class Bindings extends DataMap {
225
262
 
226
263
  // each object defines an array of bindings (ubos, textures, samplers etc.)
227
264
 
228
- this.backend.createBindings( bindGroup, bindings, 0 );
265
+ this.backend.createBindings( bindGroup, bindings, '' );
229
266
 
230
267
  groupData.bindGroup = bindGroup;
231
268
  groupData.usedTimes = 1;
@@ -271,6 +308,13 @@ class Bindings extends DataMap {
271
308
 
272
309
  this.backend.destroySampler( binding );
273
310
 
311
+ } else if ( binding.texture !== null ) {
312
+
313
+ // untrack destroyed bind group from its texture
314
+
315
+ const textureData = this.textures.get( binding.texture );
316
+ if ( textureData.bindGroups !== undefined ) textureData.bindGroups.delete( bindGroup );
317
+
274
318
  }
275
319
 
276
320
  binding.release();
@@ -315,7 +359,7 @@ class Bindings extends DataMap {
315
359
 
316
360
  let needsBindingsUpdate = false;
317
361
  let cacheBindings = true;
318
- let cacheIndex = 0;
362
+ let cacheKey = '';
319
363
  let version = 0;
320
364
 
321
365
  // iterate over all bindings and check if buffer updates or a new binding group is required
@@ -348,6 +392,8 @@ class Bindings extends DataMap {
348
392
 
349
393
  }
350
394
 
395
+ cacheKey += attribute.id + ',';
396
+
351
397
  }
352
398
 
353
399
  if ( binding.isUniformBuffer ) {
@@ -399,7 +445,7 @@ class Bindings extends DataMap {
399
445
 
400
446
  } else {
401
447
 
402
- cacheIndex = cacheIndex * 10 + texture.id;
448
+ cacheKey += texture.id + ',';
403
449
  version += texture.version;
404
450
 
405
451
  }
@@ -452,7 +498,7 @@ class Bindings extends DataMap {
452
498
 
453
499
  if ( needsBindingsUpdate === true ) {
454
500
 
455
- this.backend.updateBindings( bindGroup, bindings, cacheBindings ? cacheIndex : 0, version );
501
+ this.backend.updateBindings( bindGroup, bindings, cacheBindings ? cacheKey : '', version );
456
502
 
457
503
  }
458
504
 
@@ -6,6 +6,10 @@ import { Group } from '../../objects/Group.js';
6
6
  * are considered as one render bundle and processed as such by
7
7
  * the renderer.
8
8
  *
9
+ * Only renderable 3D objects are allowed in a bundle group. Other
10
+ * types like lights are not supported and must be added to the scene
11
+ * outside of the group.
12
+ *
9
13
  * This module is only fully supported by `WebGPURenderer` with a WebGPU backend.
10
14
  * With a WebGL backend, the group can technically be rendered but without
11
15
  * any performance improvements.
@@ -5,6 +5,8 @@ import { Vector4 } from '../../math/Vector4.js';
5
5
 
6
6
  const _plane = /*@__PURE__*/ new Plane();
7
7
 
8
+ let _clippingContextId = 0;
9
+
8
10
  /**
9
11
  * Represents the state that is used to perform clipping via clipping planes.
10
12
  * There is a default clipping context for each render context. When the
@@ -22,6 +24,14 @@ class ClippingContext {
22
24
  */
23
25
  constructor( parentContext = null ) {
24
26
 
27
+ /**
28
+ * The id of the clipping context.
29
+ *
30
+ * @type {number}
31
+ * @readonly
32
+ */
33
+ this.id = _clippingContextId ++;
34
+
25
35
  /**
26
36
  * The clipping context's version.
27
37
  *
@@ -222,7 +232,7 @@ class ClippingContext {
222
232
  if ( update ) {
223
233
 
224
234
  this.version ++;
225
- this.cacheKey = `${ this.intersectionPlanes.length }:${ this.unionPlanes.length }`;
235
+ this.cacheKey = `${ this.id }:${ this.intersectionPlanes.length }:${ this.unionPlanes.length }`;
226
236
 
227
237
  }
228
238
 
@@ -72,6 +72,15 @@ class Color4 extends Color {
72
72
 
73
73
  }
74
74
 
75
+ *[ Symbol.iterator ]() {
76
+
77
+ yield this.r;
78
+ yield this.g;
79
+ yield this.b;
80
+ yield this.a;
81
+
82
+ }
83
+
75
84
  }
76
85
 
77
86
  export default Color4;
@@ -8,8 +8,3 @@ export const AttributeType = {
8
8
  // size of a chunk in bytes (STD140 layout)
9
9
 
10
10
  export const GPU_CHUNK_BYTES = 16;
11
-
12
- // @TODO: Move to src/constants.js
13
-
14
- export const BlendColorFactor = 211;
15
- export const OneMinusBlendColorFactor = 212;