@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
@@ -30,7 +30,7 @@ import { Matrix4 } from '../../math/Matrix4.js';
30
30
  import { Vector2 } from '../../math/Vector2.js';
31
31
  import { Vector4 } from '../../math/Vector4.js';
32
32
  import { RenderTarget } from '../../core/RenderTarget.js';
33
- import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap, VSMShadowMap } from '../../constants.js';
33
+ import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, RenderObjectRefreshType } from '../../constants.js';
34
34
 
35
35
  import { float, vec3, vec4, Fn } from '../../nodes/tsl/TSLCore.js';
36
36
  // WITH_GENESYS
@@ -277,7 +277,7 @@ class Renderer {
277
277
  * @type {number}
278
278
  * @default 0
279
279
  */
280
- this._samples = samples || ( antialias === true ) ? 4 : 0;
280
+ this._samples = samples || ( antialias === true ? 4 : 0 );
281
281
 
282
282
  /**
283
283
  * OnCanvasTargetResize callback function.
@@ -666,6 +666,16 @@ class Renderer {
666
666
  */
667
667
  this._compilationPromises = null;
668
668
 
669
+ /**
670
+ * Whether the renderer is currently precompiling a render object in
671
+ * `compileAsync()`.
672
+ *
673
+ * @private
674
+ * @type {boolean}
675
+ * @default false
676
+ */
677
+ this._isPreCompiling = false;
678
+
669
679
  /**
670
680
  * When an override material is in use, this property points to the current
671
681
  * source material during the rendering of a render object.
@@ -728,6 +738,9 @@ class Renderer {
728
738
  * Debug configuration.
729
739
  * @typedef {Object} DebugConfig
730
740
  * @property {boolean} checkShaderErrors - Whether shader errors should be checked or not.
741
+ * @property {Object} diagnostics - Diagnostics configuration for the shader generation.
742
+ * @property {boolean} diagnostics.keywords - Whether declaration names that collide with reserved keywords should be renamed or not.
743
+ * @property {?Function} onNodeBuilderCreated - A callback function that is executed after a node builder has been created and before it is built.
731
744
  * @property {?Function} onShaderError - A callback function that is executed when a shader error happens. Only supported with WebGL 2 right now.
732
745
  * @property {Function} getShaderAsync - Allows the get the raw shader code for the given scene, camera and 3D object.
733
746
  */
@@ -739,6 +752,10 @@ class Renderer {
739
752
  */
740
753
  this.debug = {
741
754
  checkShaderErrors: true,
755
+ diagnostics: {
756
+ keywords: false
757
+ },
758
+ onNodeBuilderCreated: null,
742
759
  onShaderError: null,
743
760
  getShaderAsync: async ( scene, camera, object ) => {
744
761
 
@@ -747,7 +764,7 @@ class Renderer {
747
764
  const useFrameBufferTarget = this.needsFrameBufferTarget && this._renderTarget === null;
748
765
  const renderTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : ( this._renderTarget || this._outputRenderTarget );
749
766
 
750
- const renderList = this._renderLists.get( scene, camera );
767
+ const renderList = this._renderLists.get( scene, camera, this.lighting );
751
768
  const renderContext = this._renderContexts.get( renderTarget, this._mrt );
752
769
 
753
770
  const material = scene.overrideMaterial || object.material;
@@ -821,7 +838,7 @@ class Renderer {
821
838
  this._pipelines = new Pipelines( backend, this._nodes, this.info );
822
839
  this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this.info );
823
840
  this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );
824
- this._renderLists = new RenderLists( this.lighting );
841
+ this._renderLists = new RenderLists();
825
842
  this._bundles = new RenderBundles();
826
843
  this._renderContexts = new RenderContexts( this );
827
844
 
@@ -830,12 +847,6 @@ class Renderer {
830
847
  this._animation.start();
831
848
  this._initialized = true;
832
849
 
833
- //
834
-
835
- this._inspector.init();
836
-
837
- //
838
-
839
850
  resolve( this );
840
851
 
841
852
  } );
@@ -884,14 +895,23 @@ class Renderer {
884
895
  * @param {Object3D} scene - The scene or 3D object to precompile.
885
896
  * @param {Camera} camera - The camera that is used to render the scene.
886
897
  * @param {?Scene} targetScene - If the first argument is a 3D object, this parameter must represent the scene the 3D object is going to be added.
898
+ * @param {onProgressCallback} [onProgress] - Executed while the compilation is in progress.
887
899
  * @return {Promise} A Promise that resolves when the compile has been finished.
888
900
  */
889
- async compileAsync( scene, camera, targetScene = null ) {
901
+ async compileAsync( scene, camera, targetScene = null, onProgress = null ) {
890
902
 
891
903
  if ( this._isDeviceLost === true ) return;
892
904
 
893
905
  if ( this._initialized === false ) await this.init();
894
906
 
907
+ if ( this.shadowMap.type === PCFSoftShadowMap ) {
908
+
909
+ warn( 'WebGPURenderer: PCFSoftShadowMap has been removed. Using PCFShadowMap instead.' );
910
+
911
+ this.shadowMap.type = PCFShadowMap;
912
+
913
+ }
914
+
895
915
  // preserve render tree
896
916
 
897
917
  const nodeFrame = this._nodes.nodeFrame;
@@ -912,7 +932,9 @@ class Renderer {
912
932
 
913
933
  // Match render()'s logic: use frameBufferTarget when needsFrameBufferTarget is true
914
934
  const useFrameBufferTarget = this.needsFrameBufferTarget && this._renderTarget === null;
915
- const renderTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : ( this._renderTarget || this._outputRenderTarget );
935
+ const outputRenderTarget = this._renderTarget || this._outputRenderTarget;
936
+ const useXRCamera = this.xr.isPresenting === true && this.isOutputTarget;
937
+ const renderTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : outputRenderTarget;
916
938
  const renderContext = this._renderContexts.get( renderTarget, this._mrt );
917
939
  const activeMipmapLevel = this._activeMipmapLevel;
918
940
 
@@ -943,7 +965,7 @@ class Renderer {
943
965
 
944
966
  if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
945
967
 
946
- camera = this._updateCamera( camera );
968
+ camera = this._updateCamera( camera, useXRCamera );
947
969
 
948
970
  //
949
971
 
@@ -951,21 +973,20 @@ class Renderer {
951
973
 
952
974
  //
953
975
 
954
- const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
976
+ _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
955
977
 
956
978
  if ( camera.isArrayCamera ) {
957
979
 
958
- frustum.setFromArrayCamera( camera );
980
+ _frustumArray.setFromArrayCamera( camera );
959
981
 
960
982
  } else {
961
983
 
962
- _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
963
- frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
984
+ _frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
964
985
 
965
986
  }
966
987
 
967
988
  // Use sceneRef for render list to ensure lightsNode matches between compileAsync and render
968
- const renderList = this._renderLists.get( sceneRef, camera );
989
+ const renderList = this._renderLists.get( sceneRef, camera, this.lighting );
969
990
  renderList.begin();
970
991
 
971
992
  this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
@@ -1043,6 +1064,9 @@ class Renderer {
1043
1064
  // Process compilation work items sequentially to avoid freezing
1044
1065
  // Yields between objects to keep animation smooth
1045
1066
 
1067
+ const total = compilationPromises.length;
1068
+ let loaded = 0;
1069
+
1046
1070
  for ( const item of compilationPromises ) {
1047
1071
 
1048
1072
  const renderObject = this._objects.get( item.object, item.material, item.scene, item.camera, item.lightsNode, item.renderContext, item.clippingContext, item.passId );
@@ -1052,10 +1076,12 @@ class Renderer {
1052
1076
  // Use async node building to yield to main thread
1053
1077
  await this._nodes.getForRenderAsync( renderObject );
1054
1078
 
1079
+ this._isPreCompiling = true; // note: no awaits are allowed when this flag is true otherwise the state leaks outside of this method
1055
1080
  this._nodes.updateBefore( renderObject );
1056
1081
  this._geometries.updateForRender( renderObject );
1057
1082
  this._nodes.updateForRender( renderObject );
1058
1083
  this._bindings.updateForRender( renderObject );
1084
+ this._isPreCompiling = false;
1059
1085
 
1060
1086
  // Wait for pipeline creation
1061
1087
  const pipelinePromises = [];
@@ -1066,7 +1092,17 @@ class Renderer {
1066
1092
 
1067
1093
  }
1068
1094
 
1095
+ this._isPreCompiling = true;
1069
1096
  this._nodes.updateAfter( renderObject );
1097
+ this._isPreCompiling = false;
1098
+
1099
+ loaded ++;
1100
+
1101
+ if ( onProgress !== null ) {
1102
+
1103
+ onProgress( new ProgressEvent( 'progress', { lengthComputable: true, loaded, total } ) );
1104
+
1105
+ }
1070
1106
 
1071
1107
  // Yield between objects to allow animation frames
1072
1108
  await yieldToMain();
@@ -1075,6 +1111,93 @@ class Renderer {
1075
1111
 
1076
1112
  }
1077
1113
 
1114
+ /**
1115
+ * Compile compute programs. This can be useful to avoid a
1116
+ * phenomenon which is called "shader compilation stutter", which occurs when
1117
+ * rendering an object with a new shader for the first time.
1118
+ *
1119
+ * @async
1120
+ * @param {Node|Array<Node>} computeNodes - The compute node(s).
1121
+ * @param {onProgressCallback} [onProgress] - Executed while the compilation is in progress.
1122
+ * @return {Promise} A Promise that resolves when the compile has been finished.
1123
+ */
1124
+ async compileComputeAsync( computeNodes, onProgress = null ) {
1125
+
1126
+ if ( this._isDeviceLost === true ) return;
1127
+
1128
+ if ( this._initialized === false ) await this.init();
1129
+
1130
+ const computeList = Array.isArray( computeNodes ) ? computeNodes : [ computeNodes ];
1131
+
1132
+ if ( computeList.length === 0 || computeList.some( ( computeNode ) => computeNode === undefined || computeNode === null || computeNode.isComputeNode !== true ) ) {
1133
+
1134
+ throw new Error( 'THREE.Renderer: .compileComputeAsync() expects a ComputeNode.' );
1135
+
1136
+ }
1137
+
1138
+ const total = computeList.length;
1139
+ let loaded = 0;
1140
+
1141
+ //
1142
+
1143
+ const pipelines = this._pipelines;
1144
+ const bindings = this._bindings;
1145
+ const nodes = this._nodes;
1146
+
1147
+ for ( const computeNode of computeList ) {
1148
+
1149
+ if ( pipelines.has( computeNode ) === false ) {
1150
+
1151
+ const dispose = () => {
1152
+
1153
+ computeNode.removeEventListener( 'dispose', dispose );
1154
+
1155
+ pipelines.delete( computeNode );
1156
+ bindings.deleteForCompute( computeNode );
1157
+ nodes.delete( computeNode );
1158
+
1159
+ };
1160
+
1161
+ computeNode.addEventListener( 'dispose', dispose );
1162
+
1163
+ const onInitFn = computeNode.onInitFunction;
1164
+
1165
+ if ( onInitFn !== null ) {
1166
+
1167
+ onInitFn.call( computeNode, { renderer: this } );
1168
+
1169
+ }
1170
+
1171
+ }
1172
+
1173
+ await nodes.getForComputeAsync( computeNode );
1174
+
1175
+ nodes.updateBeforeForCompute( computeNode );
1176
+ nodes.updateForCompute( computeNode );
1177
+ bindings.updateForCompute( computeNode );
1178
+
1179
+ const computeBindings = bindings.getForCompute( computeNode );
1180
+ const compilationPromises = [];
1181
+
1182
+ pipelines.getForCompute( computeNode, computeBindings, compilationPromises );
1183
+ await Promise.all( compilationPromises );
1184
+
1185
+ nodes.updateAfterForCompute( computeNode );
1186
+
1187
+ loaded ++;
1188
+
1189
+ if ( onProgress !== null ) {
1190
+
1191
+ onProgress( new ProgressEvent( 'progress', { lengthComputable: true, loaded, total } ) );
1192
+
1193
+ }
1194
+
1195
+ if ( loaded < total ) await yieldToMain();
1196
+
1197
+ }
1198
+
1199
+ }
1200
+
1078
1201
  /**
1079
1202
  * Renders the scene in an async fashion.
1080
1203
  *
@@ -1337,7 +1460,9 @@ class Renderer {
1337
1460
 
1338
1461
  const renderObject = renderObjects[ i ];
1339
1462
 
1340
- if ( this._nodes.needsRefresh( renderObject ) ) {
1463
+ const refreshType = this._nodes.needsRefresh( renderObject );
1464
+
1465
+ if ( refreshType === RenderObjectRefreshType.FULL ) {
1341
1466
 
1342
1467
  this._nodes.updateBefore( renderObject );
1343
1468
 
@@ -1347,6 +1472,15 @@ class Renderer {
1347
1472
 
1348
1473
  this._nodes.updateAfter( renderObject );
1349
1474
 
1475
+ } else if ( refreshType === RenderObjectRefreshType.SHARED ) {
1476
+
1477
+ this._nodes.updateBefore( renderObject );
1478
+
1479
+ this._nodes.updateForRender( renderObject );
1480
+ this._bindings.updateSharedForRender( renderObject );
1481
+
1482
+ this._nodes.updateAfter( renderObject );
1483
+
1350
1484
  }
1351
1485
 
1352
1486
  }
@@ -1414,7 +1548,9 @@ class Renderer {
1414
1548
 
1415
1549
  _renderOutputLayers( quad, renderTarget ) {
1416
1550
 
1417
- if ( renderTarget.texture.isArrayTexture !== true || renderTarget.texture.image.depth <= 1 ) {
1551
+ const useMultiview = this.backend.isWebGLBackend === true && renderTarget.multiview === true;
1552
+
1553
+ if ( useMultiview || renderTarget.texture.isArrayTexture !== true || renderTarget.texture.image.depth <= 1 ) {
1418
1554
 
1419
1555
  this._renderScene( quad, quad.camera, false );
1420
1556
  return;
@@ -1453,12 +1589,7 @@ class Renderer {
1453
1589
  */
1454
1590
  _getFrameBufferTarget() {
1455
1591
 
1456
- const { currentToneMapping, currentColorSpace } = this;
1457
-
1458
- const useToneMapping = currentToneMapping !== NoToneMapping;
1459
- const useColorSpace = currentColorSpace !== ColorManagement.workingColorSpace;
1460
-
1461
- if ( useToneMapping === false && useColorSpace === false ) return null;
1592
+ if ( this.needsFrameBufferTarget === false ) return null;
1462
1593
 
1463
1594
  const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
1464
1595
  const { depth, stencil } = this;
@@ -1530,6 +1661,10 @@ class Renderer {
1530
1661
  frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false;
1531
1662
  frameBufferTarget.useArrayDepthTexture = outputRenderTarget !== null ? outputRenderTarget.useArrayDepthTexture : false;
1532
1663
  frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true;
1664
+ frameBufferTarget.resolveStencilBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveStencilBuffer : true;
1665
+ frameBufferTarget.storeMultisampledColorBuffer = outputRenderTarget !== null ? outputRenderTarget.storeMultisampledColorBuffer : true;
1666
+ frameBufferTarget.storeMultisampledDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.storeMultisampledDepthBuffer : true;
1667
+ frameBufferTarget.storeMultisampledStencilBuffer = outputRenderTarget !== null ? outputRenderTarget.storeMultisampledStencilBuffer : true;
1533
1668
  frameBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false;
1534
1669
 
1535
1670
  return frameBufferTarget;
@@ -1549,6 +1684,14 @@ class Renderer {
1549
1684
 
1550
1685
  if ( this._isDeviceLost === true ) return;
1551
1686
 
1687
+ if ( this.shadowMap.type === PCFSoftShadowMap ) {
1688
+
1689
+ warn( 'WebGPURenderer: PCFSoftShadowMap has been removed. Using PCFShadowMap instead.' );
1690
+
1691
+ this.shadowMap.type = PCFShadowMap;
1692
+
1693
+ }
1694
+
1552
1695
  //
1553
1696
 
1554
1697
  const frameBufferTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : null;
@@ -1571,6 +1714,7 @@ class Renderer {
1571
1714
  const sceneRef = ( scene.isScene === true ) ? scene : _scene;
1572
1715
 
1573
1716
  const outputRenderTarget = this._renderTarget || this._outputRenderTarget;
1717
+ const useXRCamera = this.xr.isPresenting === true && this.isOutputTarget;
1574
1718
 
1575
1719
  const activeCubeFace = this._activeCubeFace;
1576
1720
  const activeMipmapLevel = this._activeMipmapLevel;
@@ -1664,7 +1808,7 @@ class Renderer {
1664
1808
  ProfilerService.end( 'scene.updateMatrixWorld' );
1665
1809
  // !WITH_GENESYS
1666
1810
 
1667
- camera = this._updateCamera( camera );
1811
+ camera = this._updateCamera( camera, useXRCamera );
1668
1812
 
1669
1813
  //
1670
1814
 
@@ -1710,16 +1854,15 @@ class Renderer {
1710
1854
 
1711
1855
  //
1712
1856
 
1713
- const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
1857
+ _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
1714
1858
 
1715
1859
  if ( camera.isArrayCamera ) {
1716
1860
 
1717
- frustum.setFromArrayCamera( camera );
1861
+ _frustumArray.setFromArrayCamera( camera );
1718
1862
 
1719
1863
  } else {
1720
1864
 
1721
- _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
1722
- frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
1865
+ _frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
1723
1866
 
1724
1867
  }
1725
1868
 
@@ -1727,7 +1870,9 @@ class Renderer {
1727
1870
  ProfilerService.begin( 'buildRenderList' );
1728
1871
  // !WITH_GENESYS
1729
1872
 
1730
- const renderList = this._renderLists.get( scene, camera );
1873
+ this._renderLists.update( nodeFrame.frameId );
1874
+
1875
+ const renderList = this._renderLists.get( scene, camera, this.lighting );
1731
1876
  renderList.begin();
1732
1877
 
1733
1878
  // WITH_GENESYS
@@ -1744,7 +1889,7 @@ class Renderer {
1744
1889
 
1745
1890
  if ( this.sortObjects === true ) {
1746
1891
 
1747
- renderList.sort( this._opaqueSort, this._transparentSort, camera.reversedDepth );
1892
+ renderList.sort( this._opaqueSort, this._transparentSort );
1748
1893
 
1749
1894
  }
1750
1895
 
@@ -1784,6 +1929,7 @@ class Renderer {
1784
1929
  renderContext.activeCubeFace = activeCubeFace;
1785
1930
  renderContext.activeMipmapLevel = activeMipmapLevel;
1786
1931
  renderContext.occlusionQueryCount = renderList.occlusionQueryCount;
1932
+ renderContext.fullscreenPass = scene.isQuadMesh === true;
1787
1933
 
1788
1934
  // WITH_GENESYS
1789
1935
  // Size is finalized above from the active RT or drawing buffer.
@@ -2233,6 +2379,22 @@ class Renderer {
2233
2379
 
2234
2380
  }
2235
2381
 
2382
+ /**
2383
+ * Resets the backend's internal state cache. Useful when the rendering context is shared with
2384
+ * other libraries that change the state. A no-op for the WebGPU backend.
2385
+ */
2386
+ resetState() {
2387
+
2388
+ if ( this._initialized === false ) {
2389
+
2390
+ throw new Error( 'THREE.Renderer: .resetState() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
2391
+
2392
+ }
2393
+
2394
+ this.backend.resetState();
2395
+
2396
+ }
2397
+
2236
2398
  /**
2237
2399
  * Returns the viewport definition.
2238
2400
  *
@@ -2522,6 +2684,7 @@ class Renderer {
2522
2684
  * Returns `true` if a framebuffer target is needed to perform tone mapping or color space conversion.
2523
2685
  * If this is the case, the renderer allocates an internal render target for that purpose.
2524
2686
  *
2687
+ * @type {boolean}
2525
2688
  */
2526
2689
  get needsFrameBufferTarget() {
2527
2690
 
@@ -2548,8 +2711,8 @@ class Renderer {
2548
2711
  * The current number of samples used for multi-sample anti-aliasing (MSAA).
2549
2712
  *
2550
2713
  * When rendering to a custom render target, the number of samples of that render target is used.
2551
- * If the renderer needs an internal framebuffer target for tone mapping or color space conversion,
2552
- * the number of samples is set to 0.
2714
+ * The number of samples is set to 0 when the renderer needs an internal framebuffer target for
2715
+ * tone mapping or color space conversion, or when rendering a fullscreen quad to screen.
2553
2716
  *
2554
2717
  * @type {number}
2555
2718
  */
@@ -2561,7 +2724,7 @@ class Renderer {
2561
2724
 
2562
2725
  samples = this._renderTarget.samples;
2563
2726
 
2564
- } else if ( this.needsFrameBufferTarget ) {
2727
+ } else if ( this.needsFrameBufferTarget || this._currentRenderContext?.fullscreenPass === true ) {
2565
2728
 
2566
2729
  samples = 0;
2567
2730
 
@@ -2610,13 +2773,13 @@ class Renderer {
2610
2773
  * Frees all internal resources of the renderer. Call this method if the renderer
2611
2774
  * is no longer in use by your app.
2612
2775
  */
2613
- dispose() {
2776
+ async dispose() {
2614
2777
 
2615
2778
  if ( this._initialized === true ) {
2616
2779
 
2617
2780
  this.info.dispose();
2618
- this.backend.dispose();
2619
2781
 
2782
+ this._inspector.dispose();
2620
2783
  this._animation.dispose();
2621
2784
  this._objects.dispose();
2622
2785
  this._geometries.dispose();
@@ -2633,11 +2796,7 @@ class Renderer {
2633
2796
 
2634
2797
  }
2635
2798
 
2636
- Object.values( this.backend.timestampQueryPool ).forEach( queryPool => {
2637
-
2638
- if ( queryPool !== null ) queryPool.dispose();
2639
-
2640
- } );
2799
+ await this.backend.dispose();
2641
2800
 
2642
2801
  // WITH_GENESYS
2643
2802
  // Drop the strong reference to the active `RenderContext` so module-level
@@ -2835,7 +2994,7 @@ class Renderer {
2835
2994
 
2836
2995
  if ( this._initialized === false ) {
2837
2996
 
2838
- warn( 'Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead.' );
2997
+ warn( 'Renderer: ".compute()" called before the backend is initialized. Try using ".computeAsync()" instead.' );
2839
2998
 
2840
2999
  return this.computeAsync( computeNodes, dispatchSize );
2841
3000
 
@@ -2908,6 +3067,7 @@ class Renderer {
2908
3067
 
2909
3068
  }
2910
3069
 
3070
+ nodes.updateBeforeForCompute( computeNode );
2911
3071
  nodes.updateForCompute( computeNode );
2912
3072
  bindings.updateForCompute( computeNode );
2913
3073
 
@@ -2916,6 +3076,8 @@ class Renderer {
2916
3076
 
2917
3077
  backend.compute( computeNodes, computeNode, computeBindings, computePipeline, dispatchSize );
2918
3078
 
3079
+ nodes.updateAfterForCompute( computeNode );
3080
+
2919
3081
  }
2920
3082
 
2921
3083
  backend.finishCompute( computeNodes );
@@ -3171,7 +3333,7 @@ class Renderer {
3171
3333
  * @param {number} width - The width of the copy region.
3172
3334
  * @param {number} height - The height of the copy region.
3173
3335
  * @param {number} [textureIndex=0] - The texture index of a MRT render target.
3174
- * @param {number} [faceIndex=0] - The active cube face index.
3336
+ * @param {number} [faceIndex=0] - The cube face, depth slice or array layer index.
3175
3337
  * @return {Promise<TypedArray>} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.
3176
3338
  */
3177
3339
  async readRenderTargetPixelsAsync( renderTarget, x, y, width, height, textureIndex = 0, faceIndex = 0 ) {
@@ -3221,7 +3383,7 @@ class Renderer {
3221
3383
 
3222
3384
  const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
3223
3385
 
3224
- if ( ! object.frustumCulled || frustum.intersectsSprite( object ) ) {
3386
+ if ( ! object.frustumCulled || object.intersectsFrustum( frustum ) ) {
3225
3387
 
3226
3388
  if ( this.sortObjects === true ) {
3227
3389
 
@@ -3247,7 +3409,7 @@ class Renderer {
3247
3409
 
3248
3410
  const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
3249
3411
 
3250
- if ( ! object.frustumCulled || frustum.intersectsObject( object ) ) {
3412
+ if ( ! object.frustumCulled || object.intersectsFrustum( frustum ) ) {
3251
3413
 
3252
3414
  const { geometry, material } = object;
3253
3415
 
@@ -3297,7 +3459,7 @@ class Renderer {
3297
3459
 
3298
3460
  // replace render list
3299
3461
 
3300
- renderList = this._renderLists.get( object, camera );
3462
+ renderList = this._renderLists.get( object, camera, this.lighting );
3301
3463
 
3302
3464
  const renderBundle = this._bundles.get( object, camera, this._currentRenderContext );
3303
3465
  const renderBundleData = this.backend.get( renderBundle );
@@ -3574,13 +3736,14 @@ class Renderer {
3574
3736
  *
3575
3737
  * @private
3576
3738
  * @param {Camera} camera - The camera to update.
3739
+ * @param {boolean} useXRCamera - Whether the XR camera should be used when presenting.
3577
3740
  * @return {Camera} The returned camera might be different depending on whether XR is used or not.
3578
3741
  */
3579
- _updateCamera( camera ) {
3742
+ _updateCamera( camera, useXRCamera ) {
3580
3743
 
3581
3744
  const xr = this.xr;
3582
3745
 
3583
- if ( xr.isPresenting === false ) {
3746
+ if ( xr.isPresenting === false || useXRCamera === false ) {
3584
3747
 
3585
3748
  let projectionMatrixNeedsUpdate = false;
3586
3749
 
@@ -3650,7 +3813,7 @@ class Renderer {
3650
3813
 
3651
3814
  // handle XR
3652
3815
 
3653
- if ( xr.enabled === true && xr.isPresenting === true ) {
3816
+ if ( useXRCamera === true && xr.enabled === true && xr.isPresenting === true ) {
3654
3817
 
3655
3818
  if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );
3656
3819
  camera = xr.getCamera(); // use XR camera for rendering
@@ -3849,9 +4012,9 @@ class Renderer {
3849
4012
 
3850
4013
  //
3851
4014
 
3852
- const needsRefresh = this._nodes.needsRefresh( renderObject );
4015
+ const refreshType = this._nodes.needsRefresh( renderObject );
3853
4016
 
3854
- if ( needsRefresh ) {
4017
+ if ( refreshType === RenderObjectRefreshType.FULL ) {
3855
4018
 
3856
4019
  this._nodes.updateBefore( renderObject );
3857
4020
 
@@ -3860,6 +4023,13 @@ class Renderer {
3860
4023
  this._nodes.updateForRender( renderObject );
3861
4024
  this._bindings.updateForRender( renderObject );
3862
4025
 
4026
+ } else if ( refreshType === RenderObjectRefreshType.SHARED ) {
4027
+
4028
+ this._nodes.updateBefore( renderObject );
4029
+
4030
+ this._nodes.updateForRender( renderObject );
4031
+ this._bindings.updateSharedForRender( renderObject );
4032
+
3863
4033
  }
3864
4034
 
3865
4035
  this._pipelines.updateForRender( renderObject );
@@ -3870,7 +4040,7 @@ class Renderer {
3870
4040
 
3871
4041
  this.backend.draw( renderObject, this.info );
3872
4042
 
3873
- if ( needsRefresh ) this._nodes.updateAfter( renderObject );
4043
+ if ( refreshType !== RenderObjectRefreshType.NONE ) this._nodes.updateAfter( renderObject );
3874
4044
 
3875
4045
  }
3876
4046
 
@@ -3950,7 +4120,8 @@ class Renderer {
3950
4120
  * @param {Object3D} scene - The scene or 3D object to precompile.
3951
4121
  * @param {Camera} camera - The camera that is used to render the scene.
3952
4122
  * @param {Scene} targetScene - If the first argument is a 3D object, this parameter must represent the scene the 3D object is going to be added.
3953
- * @return {function(Object3D, Camera, ?Scene): Promise|undefined} A Promise that resolves when the compile has been finished.
4123
+ * @param {onProgressCallback} [onProgress] - Executed while the compilation is in progress.
4124
+ * @return {function(Object3D, Camera, ?Scene, ?onProgressCallback): Promise|undefined} A Promise that resolves when the compile has been finished.
3954
4125
  */
3955
4126
  get compile() {
3956
4127
 
@@ -74,6 +74,22 @@ class Storage3DTexture extends Texture {
74
74
 
75
75
  }
76
76
 
77
+ /**
78
+ * Copies the values of the given texture to this instance.
79
+ *
80
+ * @param {Storage3DTexture} source - The texture to copy.
81
+ * @return {Storage3DTexture} A reference to this instance.
82
+ */
83
+ copy( source ) {
84
+
85
+ super.copy( source );
86
+
87
+ this.wrapR = source.wrapR;
88
+
89
+ return this;
90
+
91
+ }
92
+
77
93
  /**
78
94
  * Sets the size of the storage 3d texture.
79
95
  *
@@ -135,7 +135,7 @@ class Textures extends DataMap {
135
135
 
136
136
  textureNeedsUpdate = true;
137
137
 
138
- if ( depthTexture ) {
138
+ if ( depthTexture && depthTexture.renderTarget === renderTarget ) {
139
139
 
140
140
  depthTexture.needsUpdate = true;
141
141
  depthTexture.image.width = mipWidth;
@@ -158,7 +158,7 @@ class Textures extends DataMap {
158
158
 
159
159
  textureNeedsUpdate = true;
160
160
 
161
- if ( depthTexture ) {
161
+ if ( depthTexture && depthTexture.renderTarget === renderTarget ) {
162
162
 
163
163
  depthTexture.needsUpdate = true;
164
164
 
@@ -600,7 +600,7 @@ class Textures extends DataMap {
600
600
 
601
601
  }
602
602
 
603
- if ( depthTexture ) {
603
+ if ( depthTexture && depthTexture.renderTarget === renderTarget ) {
604
604
 
605
605
  this._destroyTexture( depthTexture );
606
606