super-three 0.181.0 → 0.185.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 (693) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +21332 -19201
  4. package/build/three.core.js +20908 -19853
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1947 -862
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +37 -16
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +33628 -25197
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +33394 -25000
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +14 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +13 -6
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +127 -86
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +102 -17
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMFrustum.js +31 -6
  26. package/examples/jsm/csm/CSMShadowNode.js +10 -3
  27. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  28. package/examples/jsm/effects/AsciiEffect.js +14 -1
  29. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  30. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  31. package/examples/jsm/exporters/DRACOExporter.js +27 -6
  32. package/examples/jsm/exporters/EXRExporter.js +1 -1
  33. package/examples/jsm/exporters/GLTFExporter.js +266 -21
  34. package/examples/jsm/exporters/PLYExporter.js +286 -73
  35. package/examples/jsm/exporters/USDZExporter.js +353 -99
  36. package/examples/jsm/generators/CityGenerator.js +346 -0
  37. package/examples/jsm/generators/ForestGenerator.js +347 -0
  38. package/examples/jsm/generators/TerrainGenerator.js +504 -0
  39. package/examples/jsm/generators/TreeGenerator.js +377 -0
  40. package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
  41. package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
  42. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  43. package/examples/jsm/geometries/LoftGeometry.js +355 -0
  44. package/examples/jsm/geometries/TextGeometry.js +18 -0
  45. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  46. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  47. package/examples/jsm/helpers/LightProbeHelper.js +5 -4
  48. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  49. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  50. package/examples/jsm/helpers/ViewHelper.js +83 -14
  51. package/examples/jsm/inspector/Extension.js +13 -0
  52. package/examples/jsm/inspector/Inspector.js +244 -91
  53. package/examples/jsm/inspector/RendererInspector.js +165 -39
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  55. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  56. package/examples/jsm/inspector/tabs/Console.js +241 -25
  57. package/examples/jsm/inspector/tabs/Memory.js +136 -0
  58. package/examples/jsm/inspector/tabs/Parameters.js +115 -7
  59. package/examples/jsm/inspector/tabs/Performance.js +24 -9
  60. package/examples/jsm/inspector/tabs/Settings.js +306 -0
  61. package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
  62. package/examples/jsm/inspector/tabs/Viewer.js +723 -9
  63. package/examples/jsm/inspector/ui/Graph.js +162 -25
  64. package/examples/jsm/inspector/ui/Item.js +92 -13
  65. package/examples/jsm/inspector/ui/List.js +2 -2
  66. package/examples/jsm/inspector/ui/Profiler.js +1991 -44
  67. package/examples/jsm/inspector/ui/Style.js +1943 -543
  68. package/examples/jsm/inspector/ui/Tab.js +226 -5
  69. package/examples/jsm/inspector/ui/Values.js +126 -8
  70. package/examples/jsm/inspector/ui/utils.js +143 -10
  71. package/examples/jsm/interaction/InteractionManager.js +226 -0
  72. package/examples/jsm/libs/basis/README.md +0 -1
  73. package/examples/jsm/libs/demuxer_mp4.js +3 -3
  74. package/examples/jsm/libs/draco/README.md +0 -1
  75. package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
  76. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  77. package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
  78. package/examples/jsm/libs/mikktspace.module.js +34 -9
  79. package/examples/jsm/lighting/ClusteredLighting.js +55 -0
  80. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  81. package/examples/jsm/lighting/LightProbeGrid.js +681 -0
  82. package/examples/jsm/lines/LineMaterial.js +45 -16
  83. package/examples/jsm/lines/LineSegments2.js +8 -0
  84. package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
  85. package/examples/jsm/loaders/3DMLoader.js +6 -5
  86. package/examples/jsm/loaders/3MFLoader.js +2 -2
  87. package/examples/jsm/loaders/AMFLoader.js +2 -2
  88. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  89. package/examples/jsm/loaders/DRACOLoader.js +51 -18
  90. package/examples/jsm/loaders/EXRLoader.js +701 -90
  91. package/examples/jsm/loaders/FBXLoader.js +235 -37
  92. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  93. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  94. package/examples/jsm/loaders/HDRLoader.js +7 -30
  95. package/examples/jsm/loaders/KMZLoader.js +5 -5
  96. package/examples/jsm/loaders/KTX2Loader.js +58 -17
  97. package/examples/jsm/loaders/LDrawLoader.js +49 -58
  98. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  99. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  100. package/examples/jsm/loaders/LWOLoader.js +11 -39
  101. package/examples/jsm/loaders/LottieLoader.js +1 -1
  102. package/examples/jsm/loaders/MaterialXLoader.js +31 -9
  103. package/examples/jsm/loaders/NRRDLoader.js +5 -5
  104. package/examples/jsm/loaders/PCDLoader.js +11 -9
  105. package/examples/jsm/loaders/PLYLoader.js +218 -55
  106. package/examples/jsm/loaders/SVGLoader.js +549 -497
  107. package/examples/jsm/loaders/TDSLoader.js +0 -2
  108. package/examples/jsm/loaders/TGALoader.js +0 -2
  109. package/examples/jsm/loaders/TTFLoader.js +1 -1
  110. package/examples/jsm/loaders/USDLoader.js +127 -43
  111. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  112. package/examples/jsm/loaders/VOXLoader.js +660 -117
  113. package/examples/jsm/loaders/VRMLLoader.js +80 -3
  114. package/examples/jsm/loaders/VTKLoader.js +42 -25
  115. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  116. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  117. package/examples/jsm/loaders/usd/USDAParser.js +504 -344
  118. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  119. package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
  120. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  121. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  122. package/examples/jsm/math/Octree.js +131 -1
  123. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  124. package/examples/jsm/misc/RollerCoaster.js +42 -4
  125. package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
  126. package/examples/jsm/misc/Volume.js +2 -3
  127. package/examples/jsm/misc/VolumeSlice.js +0 -1
  128. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  129. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  130. package/examples/jsm/objects/LensflareMesh.js +1 -1
  131. package/examples/jsm/objects/Reflector.js +72 -25
  132. package/examples/jsm/objects/Sky.js +90 -6
  133. package/examples/jsm/objects/SkyMesh.js +150 -16
  134. package/examples/jsm/objects/Water.js +4 -3
  135. package/examples/jsm/objects/Water2.js +5 -3
  136. package/examples/jsm/objects/Water2Mesh.js +1 -1
  137. package/examples/jsm/objects/WaterMesh.js +5 -7
  138. package/examples/jsm/physics/AmmoPhysics.js +27 -15
  139. package/examples/jsm/physics/JoltPhysics.js +10 -6
  140. package/examples/jsm/physics/RapierPhysics.js +36 -7
  141. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  142. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  143. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  144. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  145. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  146. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  147. package/examples/jsm/renderers/Projector.js +246 -28
  148. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  149. package/examples/jsm/shaders/GTAOShader.js +19 -6
  150. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  151. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  152. package/examples/jsm/shaders/SAOShader.js +17 -4
  153. package/examples/jsm/shaders/SSAOShader.js +11 -1
  154. package/examples/jsm/shaders/SSRShader.js +6 -5
  155. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  156. package/examples/jsm/shaders/VignetteShader.js +1 -1
  157. package/examples/jsm/shaders/VolumeShader.js +31 -44
  158. package/examples/jsm/transpiler/AST.js +44 -0
  159. package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
  160. package/examples/jsm/transpiler/Linker.js +1 -1
  161. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  162. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  163. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  164. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  165. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  166. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  167. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  168. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  169. package/examples/jsm/tsl/display/BloomNode.js +75 -25
  170. package/examples/jsm/tsl/display/CRT.js +150 -0
  171. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  172. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  173. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  174. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  175. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  176. package/examples/jsm/tsl/display/FXAANode.js +13 -14
  177. package/examples/jsm/tsl/display/GTAONode.js +40 -17
  178. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  179. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  180. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
  181. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  182. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  183. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  184. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  185. package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
  186. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  187. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
  188. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  189. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  190. package/examples/jsm/tsl/display/SSAAPassNode.js +15 -27
  191. package/examples/jsm/tsl/display/SSGINode.js +96 -62
  192. package/examples/jsm/tsl/display/SSRNode.js +831 -134
  193. package/examples/jsm/tsl/display/SSSNode.js +8 -6
  194. package/examples/jsm/tsl/display/Shape.js +29 -0
  195. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  196. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  197. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  198. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  199. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  200. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  201. package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
  202. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  203. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  204. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  205. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
  206. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  207. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  208. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  209. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  210. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  211. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  212. package/examples/jsm/tsl/math/Bayer.js +53 -3
  213. package/examples/jsm/tsl/math/curlNoise.js +107 -0
  214. package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
  215. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
  216. package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
  217. package/examples/jsm/tsl/utils/RNoise.js +51 -0
  218. package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
  219. package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
  220. package/examples/jsm/utils/ColorUtils.js +76 -0
  221. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  222. package/examples/jsm/utils/LDrawUtils.js +1 -1
  223. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  224. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  225. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  226. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  227. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  228. package/examples/jsm/webxr/ARButton.js +1 -1
  229. package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
  230. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
  231. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  232. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  233. package/package.json +28 -34
  234. package/src/Three.Core.js +3 -1
  235. package/src/Three.TSL.js +35 -14
  236. package/src/Three.WebGPU.Nodes.js +5 -0
  237. package/src/Three.WebGPU.js +13 -0
  238. package/src/Three.js +1 -0
  239. package/src/animation/AnimationAction.js +18 -4
  240. package/src/animation/AnimationClip.js +0 -139
  241. package/src/animation/AnimationMixer.js +6 -0
  242. package/src/animation/AnimationUtils.js +1 -12
  243. package/src/animation/KeyframeTrack.js +47 -8
  244. package/src/animation/PropertyBinding.js +2 -2
  245. package/src/animation/PropertyMixer.js +4 -4
  246. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  247. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  248. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  249. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  250. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  251. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  252. package/src/audio/Audio.js +1 -1
  253. package/src/audio/AudioContext.js +2 -2
  254. package/src/audio/AudioListener.js +5 -3
  255. package/src/cameras/Camera.js +34 -4
  256. package/src/cameras/CubeCamera.js +20 -0
  257. package/src/cameras/StereoCamera.js +5 -2
  258. package/src/constants.js +90 -5
  259. package/src/core/BufferAttribute.js +13 -1
  260. package/src/core/BufferGeometry.js +43 -9
  261. package/src/core/Clock.js +7 -0
  262. package/src/core/Object3D.js +69 -11
  263. package/src/core/Raycaster.js +3 -3
  264. package/src/core/RenderTarget.js +19 -6
  265. package/src/extras/PMREMGenerator.js +13 -22
  266. package/src/extras/TextureUtils.js +6 -2
  267. package/src/extras/core/ShapePath.js +149 -160
  268. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  269. package/src/geometries/ExtrudeGeometry.js +2 -2
  270. package/src/geometries/PolyhedronGeometry.js +1 -1
  271. package/src/geometries/SphereGeometry.js +8 -3
  272. package/src/geometries/TorusGeometry.js +8 -3
  273. package/src/helpers/CameraHelper.js +3 -0
  274. package/src/helpers/DirectionalLightHelper.js +6 -1
  275. package/src/helpers/HemisphereLightHelper.js +5 -0
  276. package/src/helpers/PointLightHelper.js +3 -25
  277. package/src/helpers/SpotLightHelper.js +4 -1
  278. package/src/lights/DirectionalLight.js +13 -0
  279. package/src/lights/HemisphereLight.js +10 -0
  280. package/src/lights/Light.js +1 -11
  281. package/src/lights/LightProbe.js +0 -15
  282. package/src/lights/LightShadow.js +15 -6
  283. package/src/lights/PointLight.js +15 -0
  284. package/src/lights/PointLightShadow.js +0 -86
  285. package/src/lights/SpotLight.js +22 -1
  286. package/src/lights/webgpu/IESSpotLight.js +2 -1
  287. package/src/loaders/AudioLoader.js +11 -1
  288. package/src/loaders/Cache.js +28 -0
  289. package/src/loaders/DataTextureLoader.js +75 -42
  290. package/src/loaders/FileLoader.js +2 -3
  291. package/src/loaders/ImageBitmapLoader.js +12 -9
  292. package/src/loaders/Loader.js +6 -0
  293. package/src/loaders/LoadingManager.js +5 -0
  294. package/src/loaders/MaterialLoader.js +37 -266
  295. package/src/loaders/ObjectLoader.js +48 -6
  296. package/src/loaders/nodes/NodeLoader.js +2 -2
  297. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  298. package/src/materials/LineBasicMaterial.js +4 -0
  299. package/src/materials/Material.js +198 -1
  300. package/src/materials/MeshBasicMaterial.js +24 -0
  301. package/src/materials/MeshDepthMaterial.js +10 -0
  302. package/src/materials/MeshDistanceMaterial.js +10 -0
  303. package/src/materials/MeshLambertMaterial.js +49 -1
  304. package/src/materials/MeshMatcapMaterial.js +25 -1
  305. package/src/materials/MeshNormalMaterial.js +9 -1
  306. package/src/materials/MeshPhongMaterial.js +49 -1
  307. package/src/materials/MeshPhysicalMaterial.js +38 -0
  308. package/src/materials/MeshStandardMaterial.js +42 -1
  309. package/src/materials/MeshToonMaterial.js +35 -2
  310. package/src/materials/PointsMaterial.js +7 -0
  311. package/src/materials/ShaderMaterial.js +106 -1
  312. package/src/materials/SpriteMaterial.js +7 -0
  313. package/src/materials/nodes/Line2NodeMaterial.js +380 -297
  314. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  315. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  316. package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
  317. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
  318. package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
  319. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
  320. package/src/materials/nodes/NodeMaterial.js +153 -89
  321. package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
  322. package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
  323. package/src/math/Box3.js +5 -0
  324. package/src/math/FrustumArray.js +103 -133
  325. package/src/math/Interpolant.js +1 -1
  326. package/src/math/Line3.js +6 -5
  327. package/src/math/MathUtils.js +12 -12
  328. package/src/math/Matrix2.js +13 -9
  329. package/src/math/Matrix3.js +24 -9
  330. package/src/math/Matrix4.js +112 -74
  331. package/src/math/Plane.js +4 -3
  332. package/src/math/Quaternion.js +3 -29
  333. package/src/math/Sphere.js +1 -1
  334. package/src/math/Triangle.js +1 -1
  335. package/src/math/Vector2.js +13 -9
  336. package/src/math/Vector3.js +17 -15
  337. package/src/math/Vector4.js +15 -11
  338. package/src/math/interpolants/BezierInterpolant.js +106 -0
  339. package/src/nodes/Nodes.js +86 -71
  340. package/src/nodes/TSL.js +15 -13
  341. package/src/nodes/accessors/Arrays.js +5 -5
  342. package/src/nodes/accessors/Batch.js +108 -0
  343. package/src/nodes/accessors/Bitangent.js +7 -7
  344. package/src/nodes/accessors/BufferAttributeNode.js +120 -17
  345. package/src/nodes/accessors/BufferNode.js +29 -2
  346. package/src/nodes/accessors/Camera.js +149 -28
  347. package/src/nodes/accessors/ClippingNode.js +5 -5
  348. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  349. package/src/nodes/accessors/Instance.js +264 -0
  350. package/src/nodes/accessors/MaterialNode.js +27 -3
  351. package/src/nodes/accessors/MaterialProperties.js +6 -8
  352. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  353. package/src/nodes/accessors/ModelNode.js +1 -1
  354. package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
  355. package/src/nodes/accessors/Normal.js +24 -24
  356. package/src/nodes/accessors/Object3DNode.js +1 -1
  357. package/src/nodes/accessors/Position.js +39 -3
  358. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  359. package/src/nodes/accessors/ReferenceNode.js +9 -8
  360. package/src/nodes/accessors/ReflectVector.js +3 -3
  361. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  362. package/src/nodes/accessors/SceneProperties.js +47 -0
  363. package/src/nodes/accessors/Skinning.js +263 -0
  364. package/src/nodes/accessors/StorageBufferNode.js +16 -27
  365. package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
  366. package/src/nodes/accessors/StorageTextureNode.js +74 -11
  367. package/src/nodes/accessors/Tangent.js +8 -18
  368. package/src/nodes/accessors/Texture3DNode.js +32 -35
  369. package/src/nodes/accessors/TextureNode.js +124 -25
  370. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  371. package/src/nodes/accessors/UserDataNode.js +1 -2
  372. package/src/nodes/accessors/VertexColorNode.js +1 -2
  373. package/src/nodes/code/FunctionCallNode.js +1 -1
  374. package/src/nodes/code/FunctionNode.js +4 -19
  375. package/src/nodes/core/ArrayNode.js +21 -2
  376. package/src/nodes/core/AssignNode.js +3 -3
  377. package/src/nodes/core/AttributeNode.js +3 -3
  378. package/src/nodes/core/BypassNode.js +1 -1
  379. package/src/nodes/core/ContextNode.js +104 -5
  380. package/src/nodes/core/IndexNode.js +2 -1
  381. package/src/nodes/core/InputNode.js +1 -1
  382. package/src/nodes/core/InspectorNode.js +1 -1
  383. package/src/nodes/core/IsolateNode.js +1 -1
  384. package/src/nodes/core/MRTNode.js +55 -4
  385. package/src/nodes/core/Node.js +151 -17
  386. package/src/nodes/core/NodeBuilder.js +479 -101
  387. package/src/nodes/core/NodeError.js +28 -0
  388. package/src/nodes/core/NodeFrame.js +12 -4
  389. package/src/nodes/core/NodeUtils.js +20 -18
  390. package/src/nodes/core/OutputStructNode.js +13 -11
  391. package/src/nodes/core/OverrideContextNode.js +153 -0
  392. package/src/nodes/core/ParameterNode.js +4 -4
  393. package/src/nodes/core/PropertyNode.js +66 -4
  394. package/src/nodes/core/StackNode.js +91 -20
  395. package/src/nodes/core/StackTrace.js +139 -0
  396. package/src/nodes/core/StructNode.js +20 -8
  397. package/src/nodes/core/StructTypeNode.js +17 -23
  398. package/src/nodes/core/SubBuildNode.js +2 -2
  399. package/src/nodes/core/UniformGroupNode.js +36 -6
  400. package/src/nodes/core/UniformNode.js +21 -5
  401. package/src/nodes/core/VarNode.js +56 -23
  402. package/src/nodes/core/VaryingNode.js +14 -21
  403. package/src/nodes/display/BlendModes.js +1 -105
  404. package/src/nodes/display/BumpMapNode.js +6 -1
  405. package/src/nodes/display/ColorAdjustment.js +27 -9
  406. package/src/nodes/display/ColorSpaceNode.js +3 -3
  407. package/src/nodes/display/FrontFacingNode.js +38 -9
  408. package/src/nodes/display/NormalMapNode.js +41 -6
  409. package/src/nodes/display/PassNode.js +157 -56
  410. package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
  411. package/src/nodes/display/RenderOutputNode.js +19 -10
  412. package/src/nodes/display/ScreenNode.js +4 -2
  413. package/src/nodes/display/ToneMappingNode.js +1 -1
  414. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  415. package/src/nodes/display/ViewportDepthNode.js +52 -4
  416. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  417. package/src/nodes/display/ViewportTextureNode.js +39 -11
  418. package/src/nodes/fog/Fog.js +18 -35
  419. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  420. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  421. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  422. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  423. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  424. package/src/nodes/functions/VolumetricLightingModel.js +40 -7
  425. package/src/nodes/geometry/RangeNode.js +5 -3
  426. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  427. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  428. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  429. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  430. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  431. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
  432. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  433. package/src/nodes/lighting/EnvironmentNode.js +30 -5
  434. package/src/nodes/lighting/IESSpotLightNode.js +40 -2
  435. package/src/nodes/lighting/LightingContextNode.js +10 -2
  436. package/src/nodes/lighting/LightsNode.js +97 -65
  437. package/src/nodes/lighting/PointShadowNode.js +166 -148
  438. package/src/nodes/lighting/ShadowFilterNode.js +74 -117
  439. package/src/nodes/lighting/ShadowNode.js +149 -51
  440. package/src/nodes/materialx/lib/mx_noise.js +2 -2
  441. package/src/nodes/math/BitcastNode.js +1 -1
  442. package/src/nodes/math/BitcountNode.js +433 -0
  443. package/src/nodes/math/ConditionalNode.js +6 -6
  444. package/src/nodes/math/MathNode.js +115 -52
  445. package/src/nodes/math/OperatorNode.js +24 -23
  446. package/src/nodes/math/PackFloatNode.js +98 -0
  447. package/src/nodes/math/UnpackFloatNode.js +96 -0
  448. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  449. package/src/nodes/pmrem/PMREMNode.js +34 -3
  450. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  451. package/src/nodes/tsl/TSLBase.js +1 -1
  452. package/src/nodes/tsl/TSLCore.js +99 -33
  453. package/src/nodes/utils/ArrayElementNode.js +14 -1
  454. package/src/nodes/utils/ConvertNode.js +1 -1
  455. package/src/nodes/utils/DebugNode.js +12 -12
  456. package/src/nodes/utils/EquirectUV.js +30 -5
  457. package/src/nodes/utils/EventNode.js +31 -2
  458. package/src/nodes/utils/FlipNode.js +1 -1
  459. package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
  460. package/src/nodes/utils/JoinNode.js +3 -3
  461. package/src/nodes/utils/LoopNode.js +1 -1
  462. package/src/nodes/utils/MemberNode.js +2 -2
  463. package/src/nodes/utils/Packing.js +48 -5
  464. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  465. package/src/nodes/utils/RTTNode.js +41 -25
  466. package/src/nodes/utils/ReflectorNode.js +4 -4
  467. package/src/nodes/utils/Remap.js +48 -0
  468. package/src/nodes/utils/RotateNode.js +1 -1
  469. package/src/nodes/utils/SampleNode.js +1 -1
  470. package/src/nodes/utils/SetNode.js +1 -1
  471. package/src/nodes/utils/SplitNode.js +1 -1
  472. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  473. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  474. package/src/nodes/utils/UVUtils.js +28 -0
  475. package/src/objects/BatchedMesh.js +66 -30
  476. package/src/objects/InstancedMesh.js +19 -3
  477. package/src/objects/Line.js +1 -1
  478. package/src/objects/Mesh.js +1 -1
  479. package/src/objects/Points.js +1 -1
  480. package/src/objects/SkinnedMesh.js +26 -9
  481. package/src/renderers/WebGLRenderer.js +344 -156
  482. package/src/renderers/common/Animation.js +3 -3
  483. package/src/renderers/common/Attributes.js +15 -1
  484. package/src/renderers/common/Backend.js +78 -13
  485. package/src/renderers/common/Background.js +26 -13
  486. package/src/renderers/common/BindGroup.js +1 -16
  487. package/src/renderers/common/Binding.js +11 -0
  488. package/src/renderers/common/Bindings.js +141 -57
  489. package/src/renderers/common/BlendMode.js +143 -0
  490. package/src/renderers/common/Buffer.js +49 -0
  491. package/src/renderers/common/BundleGroup.js +1 -1
  492. package/src/renderers/common/ChainMap.js +30 -6
  493. package/src/renderers/common/ClippingContext.js +10 -2
  494. package/src/renderers/common/ComputePipeline.js +1 -1
  495. package/src/renderers/common/CubeRenderTarget.js +51 -7
  496. package/src/renderers/common/Geometries.js +29 -3
  497. package/src/renderers/common/Info.js +374 -4
  498. package/src/renderers/common/InspectorBase.js +6 -1
  499. package/src/renderers/common/Lighting.js +51 -19
  500. package/src/renderers/common/Pipelines.js +40 -7
  501. package/src/renderers/common/PostProcessing.js +8 -206
  502. package/src/renderers/common/ReadbackBuffer.js +78 -0
  503. package/src/renderers/common/RenderBundle.js +3 -1
  504. package/src/renderers/common/RenderBundles.js +7 -3
  505. package/src/renderers/common/RenderContext.js +16 -0
  506. package/src/renderers/common/RenderContexts.js +33 -49
  507. package/src/renderers/common/RenderList.js +41 -4
  508. package/src/renderers/common/RenderLists.js +2 -1
  509. package/src/renderers/common/RenderObject.js +88 -16
  510. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  511. package/src/renderers/common/RenderObjects.js +21 -5
  512. package/src/renderers/common/RenderPipeline.js +232 -17
  513. package/src/renderers/common/Renderer.js +700 -163
  514. package/src/renderers/common/Sampler.js +16 -48
  515. package/src/renderers/common/StorageBuffer.js +13 -1
  516. package/src/renderers/common/Textures.js +121 -9
  517. package/src/renderers/common/TimestampQueryPool.js +6 -4
  518. package/src/renderers/common/Uniform.js +8 -0
  519. package/src/renderers/common/UniformsGroup.js +84 -1
  520. package/src/renderers/common/XRManager.js +377 -51
  521. package/src/renderers/common/extras/PMREMGenerator.js +40 -61
  522. package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
  523. package/src/renderers/common/nodes/NodeLibrary.js +4 -4
  524. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
  525. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  526. package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -0
  527. package/src/renderers/shaders/DFGLUTData.js +19 -34
  528. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  529. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  530. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  531. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  532. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  533. package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
  534. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
  535. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  536. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
  537. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  538. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
  539. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  540. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  541. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  542. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  543. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +3 -1
  544. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  545. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  546. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
  547. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  548. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
  549. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  550. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  551. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  552. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  553. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  554. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
  555. package/src/renderers/shaders/ShaderChunk.js +5 -3
  556. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  557. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  558. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
  559. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  560. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  561. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  562. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  563. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  564. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  565. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  566. package/src/renderers/shaders/ShaderLib.js +7 -6
  567. package/src/renderers/shaders/UniformsLib.js +7 -5
  568. package/src/renderers/shaders/UniformsUtils.js +27 -5
  569. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  570. package/src/renderers/webgl/WebGLBackground.js +15 -15
  571. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  572. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  573. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  574. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  575. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  576. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  577. package/src/renderers/webgl/WebGLLights.js +18 -1
  578. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  579. package/src/renderers/webgl/WebGLObjects.js +3 -1
  580. package/src/renderers/webgl/WebGLOutput.js +271 -0
  581. package/src/renderers/webgl/WebGLProgram.js +54 -113
  582. package/src/renderers/webgl/WebGLPrograms.js +74 -55
  583. package/src/renderers/webgl/WebGLRenderLists.js +24 -1
  584. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  585. package/src/renderers/webgl/WebGLShaderCache.js +5 -11
  586. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  587. package/src/renderers/webgl/WebGLState.js +75 -37
  588. package/src/renderers/webgl/WebGLTextures.js +230 -56
  589. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  590. package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
  591. package/src/renderers/webgl/WebGLUtils.js +6 -2
  592. package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
  593. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  594. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
  595. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  596. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  597. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  598. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
  599. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  600. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
  601. package/src/renderers/webgpu/WebGPUBackend.js +733 -302
  602. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  603. package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
  604. package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
  605. package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
  606. package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
  607. package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
  608. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
  609. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
  610. package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
  611. package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
  612. package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
  613. package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
  614. package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
  615. package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
  616. package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
  617. package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
  618. package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
  619. package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
  620. package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
  621. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
  622. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
  623. package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
  624. package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
  625. package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
  626. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
  627. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
  628. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
  629. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
  630. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
  631. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  632. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  633. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
  634. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
  635. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
  636. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
  637. package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
  638. package/src/renderers/webxr/WebXRController.js +12 -0
  639. package/src/renderers/webxr/WebXRManager.js +4 -2
  640. package/src/textures/CubeDepthTexture.js +76 -0
  641. package/src/textures/DepthTexture.js +1 -1
  642. package/src/textures/ExternalTexture.js +0 -3
  643. package/src/textures/HTMLTexture.js +74 -0
  644. package/src/textures/Source.js +2 -2
  645. package/src/textures/Texture.js +16 -5
  646. package/src/utils.js +280 -3
  647. package/examples/fonts/LICENSE +0 -13
  648. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  649. package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
  650. package/examples/fonts/README.md +0 -11
  651. package/examples/fonts/droid/NOTICE +0 -190
  652. package/examples/fonts/droid/README.txt +0 -18
  653. package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
  654. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
  655. package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
  656. package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
  657. package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
  658. package/examples/fonts/gentilis_bold.typeface.json +0 -1
  659. package/examples/fonts/gentilis_regular.typeface.json +0 -1
  660. package/examples/fonts/helvetiker_bold.typeface.json +0 -1
  661. package/examples/fonts/helvetiker_regular.typeface.json +0 -1
  662. package/examples/fonts/optimer_bold.typeface.json +0 -1
  663. package/examples/fonts/optimer_regular.typeface.json +0 -1
  664. package/examples/fonts/ttf/README.md +0 -9
  665. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  666. package/examples/jsm/libs/ammo.wasm.js +0 -822
  667. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  668. package/examples/jsm/libs/draco/draco_encoder.js +0 -33
  669. package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
  670. package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
  671. package/examples/jsm/libs/opentype.module.js +0 -14506
  672. package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
  673. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
  674. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  675. package/examples/jsm/lighting/TiledLighting.js +0 -42
  676. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  677. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  678. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  679. package/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
  680. package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
  681. package/src/nodes/accessors/BatchNode.js +0 -163
  682. package/src/nodes/accessors/InstanceNode.js +0 -244
  683. package/src/nodes/accessors/InstancedMeshNode.js +0 -50
  684. package/src/nodes/accessors/SceneNode.js +0 -145
  685. package/src/nodes/accessors/SkinningNode.js +0 -327
  686. package/src/nodes/code/ScriptableNode.js +0 -726
  687. package/src/nodes/code/ScriptableValueNode.js +0 -253
  688. package/src/nodes/display/PosterizeNode.js +0 -65
  689. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  690. package/src/nodes/utils/RemapNode.js +0 -125
  691. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  692. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  693. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -9,7 +9,7 @@ import RenderLists from './RenderLists.js';
9
9
  import RenderContexts from './RenderContexts.js';
10
10
  import Textures from './Textures.js';
11
11
  import Background from './Background.js';
12
- import Nodes from './nodes/Nodes.js';
12
+ import NodeManager from './nodes/NodeManager.js';
13
13
  import Color4 from './Color4.js';
14
14
  import ClippingContext from './ClippingContext.js';
15
15
  import QuadMesh from './QuadMesh.js';
@@ -30,12 +30,13 @@ 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 } from '../../constants.js';
33
+ import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap, VSMShadowMap } from '../../constants.js';
34
34
 
35
- import { float, vec3, vec4 } from '../../nodes/tsl/TSLCore.js';
35
+ import { float, vec3, vec4, Fn } from '../../nodes/tsl/TSLCore.js';
36
36
  import { reference } from '../../nodes/accessors/ReferenceNode.js';
37
37
  import { highpModelNormalViewMatrix, highpModelViewMatrix } from '../../nodes/accessors/ModelNode.js';
38
- import { error, warn, warnOnce } from '../../utils.js';
38
+ import { context } from '../../nodes/core/ContextNode.js';
39
+ import { error, warn, warnOnce, yieldToMain } from '../../utils.js';
39
40
 
40
41
  const _scene = /*@__PURE__*/ new Scene();
41
42
  const _drawingBufferSize = /*@__PURE__*/ new Vector2();
@@ -46,6 +47,8 @@ const _frustumArray = /*@__PURE__*/ new FrustumArray();
46
47
  const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
47
48
  const _vector4 = /*@__PURE__*/ new Vector4();
48
49
 
50
+ const _shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };
51
+
49
52
  /**
50
53
  * Base class for renderers.
51
54
  */
@@ -56,6 +59,7 @@ class Renderer {
56
59
  *
57
60
  * @typedef {Object} Renderer~Options
58
61
  * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
62
+ * @property {boolean} [reversedDepthBuffer=false] - Whether reversed depth buffer is enabled or not.
59
63
  * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
60
64
  * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
61
65
  * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
@@ -63,7 +67,7 @@ class Renderer {
63
67
  * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. This parameter can set to any other integer value than 0
64
68
  * to overwrite the default.
65
69
  * @property {?Function} [getFallback=null] - This callback function can be used to provide a fallback backend, if the primary backend can't be targeted.
66
- * @property {number} [colorBufferType=HalfFloatType] - Defines the type of color buffers. The default `HalfFloatType` is recommend for best
70
+ * @property {number} [outputBufferType=HalfFloatType] - Defines the type of output buffers. The default `HalfFloatType` is recommend for best
67
71
  * quality. To save memory and bandwidth, `UnsignedByteType` might be used. This will reduce rendering quality though.
68
72
  * @property {boolean} [multiview=false] - If set to `true`, the renderer will use multiview during WebXR rendering if supported.
69
73
  */
@@ -90,13 +94,14 @@ class Renderer {
90
94
 
91
95
  const {
92
96
  logarithmicDepthBuffer = false,
97
+ reversedDepthBuffer = false,
93
98
  alpha = true,
94
99
  depth = true,
95
100
  stencil = false,
96
101
  antialias = false,
97
102
  samples = 0,
98
103
  getFallback = null,
99
- colorBufferType = HalfFloatType,
104
+ outputBufferType = HalfFloatType,
100
105
  multiview = false
101
106
  } = parameters;
102
107
 
@@ -157,9 +162,19 @@ class Renderer {
157
162
  *
158
163
  * @type {boolean}
159
164
  * @default false
165
+ * @readonly
160
166
  */
161
167
  this.logarithmicDepthBuffer = logarithmicDepthBuffer;
162
168
 
169
+ /**
170
+ * Whether reversed depth buffer is enabled or not.
171
+ *
172
+ * @type {boolean}
173
+ * @default false
174
+ * @readonly
175
+ */
176
+ this.reversedDepthBuffer = reversedDepthBuffer;
177
+
163
178
  /**
164
179
  * Defines the output color space of the renderer.
165
180
  *
@@ -222,17 +237,13 @@ class Renderer {
222
237
  this.info = new Info();
223
238
 
224
239
  /**
225
- * Stores override nodes for specific transformations or calculations.
240
+ * A global context node that stores override nodes for specific transformations or calculations.
226
241
  * These nodes can be used to replace default behavior in the rendering pipeline.
227
242
  *
228
- * @type {Object}
229
- * @property {?Node} modelViewMatrix - An override node for the model-view matrix.
230
- * @property {?Node} modelNormalViewMatrix - An override node for the model normal view matrix.
243
+ * @type {ContextNode}
244
+ * @property {Object} value - The context value object.
231
245
  */
232
- this.overrideNodes = {
233
- modelViewMatrix: null,
234
- modelNormalViewMatrix: null
235
- };
246
+ this.contextNode = context();
236
247
 
237
248
  /**
238
249
  * The node library defines how certain library objects like materials, lights
@@ -320,7 +331,7 @@ class Renderer {
320
331
  * A reference to a renderer module for managing node related logic.
321
332
  *
322
333
  * @private
323
- * @type {?Nodes}
334
+ * @type {?NodeManager}
324
335
  * @default null
325
336
  */
326
337
  this._nodes = null;
@@ -407,15 +418,14 @@ class Renderer {
407
418
  this._background = null;
408
419
 
409
420
  /**
421
+ * Cache for the fullscreen quad.
410
422
  * This fullscreen quad is used for internal render passes
411
423
  * like the tone mapping and color space output pass.
412
424
  *
413
425
  * @private
414
- * @type {QuadMesh}
426
+ * @type {Map<Texture,QuadMesh>}
415
427
  */
416
- this._quad = new QuadMesh( new NodeMaterial() );
417
- this._quad.name = 'Output Color Transform';
418
- this._quad.material.name = 'outputColorTransform';
428
+ this._quadCache = new Map();
419
429
 
420
430
  /**
421
431
  * A reference to the current render context.
@@ -445,13 +455,12 @@ class Renderer {
445
455
  this._transparentSort = null;
446
456
 
447
457
  /**
448
- * The framebuffer target.
458
+ * Cache of framebuffer targets per canvas target.
449
459
  *
450
460
  * @private
451
- * @type {?RenderTarget}
452
- * @default null
461
+ * @type {Map<CanvasTarget, RenderTarget>}
453
462
  */
454
- this._frameBufferTarget = null;
463
+ this._frameBufferTargets = new Map();
455
464
 
456
465
  const alphaClear = this.alpha === true ? 0 : 1;
457
466
 
@@ -563,8 +572,7 @@ class Renderer {
563
572
  * and pipeline updates.
564
573
  *
565
574
  * @private
566
- * @type {?Function}
567
- * @default null
575
+ * @type {Function}
568
576
  */
569
577
  this._handleObjectFunction = this._renderObjectDirect;
570
578
 
@@ -587,7 +595,18 @@ class Renderer {
587
595
  this.onDeviceLost = this._onDeviceLost;
588
596
 
589
597
  /**
590
- * Defines the type of color buffers. The default `HalfFloatType` is recommend for
598
+ * A callback function that defines what should happen when an uncaptured
599
+ * backend error is reported (e.g. a WebGPU validation/out-of-memory/internal
600
+ * error raised outside an error scope). Applications can override this to
601
+ * surface errors in their own UI without letting them escalate to a device
602
+ * loss. The default implementation logs to the console.
603
+ *
604
+ * @type {Function}
605
+ */
606
+ this.onError = this._onError;
607
+
608
+ /**
609
+ * Defines the type of output buffers. The default `HalfFloatType` is recommend for
591
610
  * best quality. To save memory and bandwidth, `UnsignedByteType` might be used.
592
611
  * This will reduce rendering quality though.
593
612
  *
@@ -595,7 +614,7 @@ class Renderer {
595
614
  * @type {number}
596
615
  * @default HalfFloatType
597
616
  */
598
- this._colorBufferType = colorBufferType;
617
+ this._outputBufferType = outputBufferType;
599
618
 
600
619
  /**
601
620
  * A cache for shadow nodes per material
@@ -614,6 +633,16 @@ class Renderer {
614
633
  */
615
634
  this._initialized = false;
616
635
 
636
+ /**
637
+ * The call depth of the renderer. Counts the number of
638
+ * nested render calls.
639
+ *
640
+ * @private
641
+ * @type {number}
642
+ * @default - 1
643
+ */
644
+ this._callDepth = - 1;
645
+
617
646
  /**
618
647
  * A reference to the promise which initializes the renderer.
619
648
  *
@@ -632,6 +661,16 @@ class Renderer {
632
661
  */
633
662
  this._compilationPromises = null;
634
663
 
664
+ /**
665
+ * When an override material is in use, this property points to the current
666
+ * source material during the rendering of a render object.
667
+ *
668
+ * @private
669
+ * @type {?Material}
670
+ * @default null
671
+ */
672
+ this._currentSourceMaterial = null;
673
+
635
674
  /**
636
675
  * Whether the renderer should render transparent render objects or not.
637
676
  *
@@ -652,6 +691,7 @@ class Renderer {
652
691
  * Shadow map configuration
653
692
  * @typedef {Object} ShadowMapConfig
654
693
  * @property {boolean} enabled - Whether to globally enable shadows or not.
694
+ * @property {boolean} transmitted - Whether to enable light transmission through non-opaque materials.
655
695
  * @property {number} type - The shadow map type.
656
696
  */
657
697
 
@@ -662,6 +702,7 @@ class Renderer {
662
702
  */
663
703
  this.shadowMap = {
664
704
  enabled: false,
705
+ transmitted: false,
665
706
  type: PCFShadowMap
666
707
  };
667
708
 
@@ -696,10 +737,13 @@ class Renderer {
696
737
  onShaderError: null,
697
738
  getShaderAsync: async ( scene, camera, object ) => {
698
739
 
699
- await this.compileAsync( scene, camera );
740
+ await this.compileAsync( object, camera, scene );
741
+
742
+ const useFrameBufferTarget = this.needsFrameBufferTarget && this._renderTarget === null;
743
+ const renderTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : ( this._renderTarget || this._outputRenderTarget );
700
744
 
701
745
  const renderList = this._renderLists.get( scene, camera );
702
- const renderContext = this._renderContexts.get( scene, camera, this._renderTarget );
746
+ const renderContext = this._renderContexts.get( renderTarget, this._mrt );
703
747
 
704
748
  const material = scene.overrideMaterial || object.material;
705
749
 
@@ -763,18 +807,18 @@ class Renderer {
763
807
 
764
808
  }
765
809
 
766
- this._nodes = new Nodes( this, backend );
810
+ this._nodes = new NodeManager( this, backend );
767
811
  this._animation = new Animation( this, this._nodes, this.info );
768
- this._attributes = new Attributes( backend );
812
+ this._attributes = new Attributes( backend, this.info );
769
813
  this._background = new Background( this, this._nodes );
770
814
  this._geometries = new Geometries( this._attributes, this.info );
771
815
  this._textures = new Textures( this, backend, this.info );
772
- this._pipelines = new Pipelines( backend, this._nodes );
816
+ this._pipelines = new Pipelines( backend, this._nodes, this.info );
773
817
  this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this.info );
774
818
  this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );
775
819
  this._renderLists = new RenderLists( this.lighting );
776
820
  this._bundles = new RenderBundles();
777
- this._renderContexts = new RenderContexts();
821
+ this._renderContexts = new RenderContexts( this );
778
822
 
779
823
  //
780
824
 
@@ -835,7 +879,7 @@ class Renderer {
835
879
  * @param {Object3D} scene - The scene or 3D object to precompile.
836
880
  * @param {Camera} camera - The camera that is used to render the scene.
837
881
  * @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.
838
- * @return {Promise<Array|undefined>} A Promise that resolves when the compile has been finished.
882
+ * @return {Promise} A Promise that resolves when the compile has been finished.
839
883
  */
840
884
  async compileAsync( scene, camera, targetScene = null ) {
841
885
 
@@ -850,16 +894,21 @@ class Renderer {
850
894
  const previousRenderId = nodeFrame.renderId;
851
895
  const previousRenderContext = this._currentRenderContext;
852
896
  const previousRenderObjectFunction = this._currentRenderObjectFunction;
897
+ const previousHandleObjectFunction = this._handleObjectFunction;
853
898
  const previousCompilationPromises = this._compilationPromises;
854
899
 
855
900
  //
856
901
 
857
- const sceneRef = ( scene.isScene === true ) ? scene : _scene;
858
-
859
902
  if ( targetScene === null ) targetScene = scene;
860
903
 
861
- const renderTarget = this._renderTarget;
862
- const renderContext = this._renderContexts.get( targetScene, camera, renderTarget );
904
+ // Use the actual scene for caching when compiling individual objects
905
+ // This ensures cache keys match between compileAsync and render
906
+ const sceneRef = ( scene.isScene === true ) ? scene : ( targetScene.isScene === true ) ? targetScene : _scene;
907
+
908
+ // Match render()'s logic: use frameBufferTarget when needsFrameBufferTarget is true
909
+ const useFrameBufferTarget = this.needsFrameBufferTarget && this._renderTarget === null;
910
+ const renderTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : ( this._renderTarget || this._outputRenderTarget );
911
+ const renderContext = this._renderContexts.get( renderTarget, this._mrt );
863
912
  const activeMipmapLevel = this._activeMipmapLevel;
864
913
 
865
914
  const compilationPromises = [];
@@ -887,11 +936,31 @@ class Renderer {
887
936
 
888
937
  //
889
938
 
939
+ if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
940
+
941
+ camera = this._updateCamera( camera );
942
+
943
+ //
944
+
890
945
  sceneRef.onBeforeRender( this, scene, camera, renderTarget );
891
946
 
892
947
  //
893
948
 
894
- const renderList = this._renderLists.get( scene, camera );
949
+ const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
950
+
951
+ if ( camera.isArrayCamera ) {
952
+
953
+ frustum.setFromArrayCamera( camera );
954
+
955
+ } else {
956
+
957
+ _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
958
+ frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
959
+
960
+ }
961
+
962
+ // Use sceneRef for render list to ensure lightsNode matches between compileAsync and render
963
+ const renderList = this._renderLists.get( sceneRef, camera );
895
964
  renderList.begin();
896
965
 
897
966
  this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
@@ -933,9 +1002,17 @@ class Renderer {
933
1002
 
934
1003
  //
935
1004
 
936
- this._background.update( sceneRef, renderList, renderContext );
1005
+ if ( targetScene !== scene ) {
937
1006
 
938
- // process render lists
1007
+ this._background.update( targetScene, renderList, renderContext );
1008
+
1009
+ } else {
1010
+
1011
+ this._background.update( sceneRef, renderList, renderContext );
1012
+
1013
+ }
1014
+
1015
+ // process render lists - _createObjectPipeline will push async promises to _compilationPromises
939
1016
 
940
1017
  const opaqueObjects = renderList.opaque;
941
1018
  const transparentObjects = renderList.transparent;
@@ -951,13 +1028,41 @@ class Renderer {
951
1028
 
952
1029
  this._currentRenderContext = previousRenderContext;
953
1030
  this._currentRenderObjectFunction = previousRenderObjectFunction;
1031
+ this._handleObjectFunction = previousHandleObjectFunction;
954
1032
  this._compilationPromises = previousCompilationPromises;
955
1033
 
956
- this._handleObjectFunction = this._renderObjectDirect;
1034
+ // Process compilation work items sequentially to avoid freezing
1035
+ // Yields between objects to keep animation smooth
1036
+
1037
+ for ( const item of compilationPromises ) {
957
1038
 
958
- // wait for all promises setup by backends awaiting compilation/linking/pipeline creation to complete
1039
+ const renderObject = this._objects.get( item.object, item.material, item.scene, item.camera, item.lightsNode, item.renderContext, item.clippingContext, item.passId );
1040
+ renderObject.drawRange = item.object.geometry.drawRange;
1041
+ renderObject.group = item.group;
959
1042
 
960
- await Promise.all( compilationPromises );
1043
+ // Use async node building to yield to main thread
1044
+ await this._nodes.getForRenderAsync( renderObject );
1045
+
1046
+ this._nodes.updateBefore( renderObject );
1047
+ this._geometries.updateForRender( renderObject );
1048
+ this._nodes.updateForRender( renderObject );
1049
+ this._bindings.updateForRender( renderObject );
1050
+
1051
+ // Wait for pipeline creation
1052
+ const pipelinePromises = [];
1053
+ this._pipelines.getForRender( renderObject, pipelinePromises );
1054
+ if ( pipelinePromises.length > 0 ) {
1055
+
1056
+ await Promise.all( pipelinePromises );
1057
+
1058
+ }
1059
+
1060
+ this._nodes.updateAfter( renderObject );
1061
+
1062
+ // Yield between objects to allow animation frames
1063
+ await yieldToMain();
1064
+
1065
+ }
961
1066
 
962
1067
  }
963
1068
 
@@ -996,11 +1101,6 @@ class Renderer {
996
1101
 
997
1102
  //
998
1103
 
999
- /**
1000
- * Sets the inspector instance. The inspector can be any class that extends from `InspectorBase`.
1001
- *
1002
- * @param {InspectorBase} value - The new inspector.
1003
- */
1004
1104
  set inspector( value ) {
1005
1105
 
1006
1106
  if ( this._inspector !== null ) {
@@ -1014,6 +1114,11 @@ class Renderer {
1014
1114
 
1015
1115
  }
1016
1116
 
1117
+ /**
1118
+ * The inspector instance. The inspector can be any class that extends from `InspectorBase`.
1119
+ *
1120
+ * @type {InspectorBase}
1121
+ */
1017
1122
  get inspector() {
1018
1123
 
1019
1124
  return this._inspector;
@@ -1031,15 +1136,17 @@ class Renderer {
1031
1136
  */
1032
1137
  set highPrecision( value ) {
1033
1138
 
1139
+ const contextNodeData = this.contextNode.value;
1140
+
1034
1141
  if ( value === true ) {
1035
1142
 
1036
- this.overrideNodes.modelViewMatrix = highpModelViewMatrix;
1037
- this.overrideNodes.modelNormalViewMatrix = highpModelNormalViewMatrix;
1143
+ contextNodeData.modelViewMatrix = highpModelViewMatrix;
1144
+ contextNodeData.modelNormalViewMatrix = highpModelNormalViewMatrix;
1038
1145
 
1039
1146
  } else if ( this.highPrecision ) {
1040
1147
 
1041
- this.overrideNodes.modelViewMatrix = null;
1042
- this.overrideNodes.modelNormalViewMatrix = null;
1148
+ delete contextNodeData.modelViewMatrix;
1149
+ delete contextNodeData.modelNormalViewMatrix;
1043
1150
 
1044
1151
  }
1045
1152
 
@@ -1053,7 +1160,9 @@ class Renderer {
1053
1160
  */
1054
1161
  get highPrecision() {
1055
1162
 
1056
- return this.overrideNodes.modelViewMatrix === highpModelViewMatrix && this.overrideNodes.modelNormalViewMatrix === highpModelNormalViewMatrix;
1163
+ const contextNodeData = this.contextNode.value;
1164
+
1165
+ return contextNodeData.modelViewMatrix === highpModelViewMatrix && contextNodeData.modelNormalViewMatrix === highpModelNormalViewMatrix;
1057
1166
 
1058
1167
  }
1059
1168
 
@@ -1083,13 +1192,27 @@ class Renderer {
1083
1192
  }
1084
1193
 
1085
1194
  /**
1086
- * Returns the color buffer type.
1195
+ * Returns the output buffer type.
1087
1196
  *
1088
- * @return {number} The color buffer type.
1197
+ * @return {number} The output buffer type.
1089
1198
  */
1090
- getColorBufferType() {
1199
+ getOutputBufferType() {
1091
1200
 
1092
- return this._colorBufferType;
1201
+ return this._outputBufferType;
1202
+
1203
+ }
1204
+
1205
+ /**
1206
+ * Returns the output buffer type.
1207
+ *
1208
+ * @deprecated since r182. Use `.getOutputBufferType()` instead.
1209
+ * @return {number} The output buffer type.
1210
+ */
1211
+ getColorBufferType() { // @deprecated, r182
1212
+
1213
+ warnOnce( 'Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".' );
1214
+
1215
+ return this.getOutputBufferType();
1093
1216
 
1094
1217
  }
1095
1218
 
@@ -1115,6 +1238,41 @@ class Renderer {
1115
1238
 
1116
1239
  }
1117
1240
 
1241
+ /**
1242
+ * Default implementation of the uncaptured backend error callback.
1243
+ *
1244
+ * @private
1245
+ * @param {Object} info - Information about the uncaptured error.
1246
+ */
1247
+ _onError( info ) {
1248
+
1249
+ let errorMessage = `WebGPURenderer: Uncaptured ${ info.api } ${ info.type }`;
1250
+
1251
+ if ( info.message ) {
1252
+
1253
+ errorMessage += `: ${ info.message }`;
1254
+
1255
+ }
1256
+
1257
+ error( errorMessage );
1258
+
1259
+ }
1260
+
1261
+ /**
1262
+ * Returns `true` if the cached GPU render bundle for the given bundle group is
1263
+ * out-of-date and must be recorded again.
1264
+ *
1265
+ * @private
1266
+ * @param {BundleGroup} bundleGroup - The bundle group.
1267
+ * @param {Object} renderBundleData - The backend data of the render bundle.
1268
+ * @return {boolean} Whether the cached render bundle needs an update.
1269
+ */
1270
+ _bundleNeedsUpdate( bundleGroup, renderBundleData ) {
1271
+
1272
+ return renderBundleData.bundleGPU === undefined || bundleGroup.version !== renderBundleData.version;
1273
+
1274
+ }
1275
+
1118
1276
  /**
1119
1277
  * Renders the given render bundle.
1120
1278
  *
@@ -1131,28 +1289,14 @@ class Renderer {
1131
1289
 
1132
1290
  //
1133
1291
 
1134
- const renderBundle = this._bundles.get( bundleGroup, camera );
1292
+ const renderBundle = this._bundles.get( bundleGroup, camera, renderContext );
1135
1293
  const renderBundleData = this.backend.get( renderBundle );
1136
-
1137
- if ( renderBundleData.renderContexts === undefined ) renderBundleData.renderContexts = new Set();
1138
-
1139
- //
1140
-
1141
- const needsUpdate = bundleGroup.version !== renderBundleData.version;
1142
- const renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || needsUpdate;
1143
-
1144
- renderBundleData.renderContexts.add( renderContext );
1294
+ const renderBundleNeedsUpdate = this._bundleNeedsUpdate( bundleGroup, renderBundleData );
1145
1295
 
1146
1296
  if ( renderBundleNeedsUpdate ) {
1147
1297
 
1148
1298
  this.backend.beginBundle( renderContext );
1149
1299
 
1150
- if ( renderBundleData.renderObjects === undefined || needsUpdate ) {
1151
-
1152
- renderBundleData.renderObjects = [];
1153
-
1154
- }
1155
-
1156
1300
  this._currentRenderBundle = renderBundle;
1157
1301
 
1158
1302
  const {
@@ -1184,6 +1328,7 @@ class Renderer {
1184
1328
 
1185
1329
  this._nodes.updateBefore( renderObject );
1186
1330
 
1331
+ this._geometries.updateForRender( renderObject );
1187
1332
  this._nodes.updateForRender( renderObject );
1188
1333
  this._bindings.updateForRender( renderObject );
1189
1334
 
@@ -1218,7 +1363,7 @@ class Renderer {
1218
1363
 
1219
1364
  if ( this._initialized === false ) {
1220
1365
 
1221
- throw new Error( 'Renderer: .render() called before the backend is initialized. Use "await renderer.init();" before rendering.' );
1366
+ throw new Error( 'THREE.Renderer: .render() called before the backend is initialized. Use "await renderer.init();" before rendering.' );
1222
1367
 
1223
1368
  }
1224
1369
 
@@ -1238,6 +1383,37 @@ class Renderer {
1238
1383
 
1239
1384
  }
1240
1385
 
1386
+ _renderOutputLayers( quad, renderTarget ) {
1387
+
1388
+ if ( renderTarget.texture.isArrayTexture !== true || renderTarget.texture.image.depth <= 1 ) {
1389
+
1390
+ this._renderScene( quad, quad.camera, false );
1391
+ return;
1392
+
1393
+ }
1394
+
1395
+ const currentActiveCubeFace = this._activeCubeFace;
1396
+
1397
+ try {
1398
+
1399
+ for ( let layer = 0; layer < renderTarget.texture.image.depth; layer ++ ) {
1400
+
1401
+ this._nodes.setOutputLayerIndex( layer );
1402
+ this._activeCubeFace = layer;
1403
+
1404
+ this._renderScene( quad, quad.camera, false );
1405
+
1406
+ }
1407
+
1408
+ } finally {
1409
+
1410
+ this._nodes.setOutputLayerIndex( 0 );
1411
+ this._activeCubeFace = currentActiveCubeFace;
1412
+
1413
+ }
1414
+
1415
+ }
1416
+
1241
1417
  /**
1242
1418
  * Returns an internal render target which is used when computing the output tone mapping
1243
1419
  * and color space conversion. Unlike in `WebGLRenderer`, this is done in a separate render
@@ -1258,14 +1434,17 @@ class Renderer {
1258
1434
  const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
1259
1435
  const { depth, stencil } = this;
1260
1436
 
1261
- let frameBufferTarget = this._frameBufferTarget;
1437
+ // TODO: Unify CanvasTarget and OutputRenderTarget
1438
+ const target = this._outputRenderTarget || this._canvasTarget;
1439
+
1440
+ let frameBufferTarget = this._frameBufferTargets.get( target );
1262
1441
 
1263
- if ( frameBufferTarget === null ) {
1442
+ if ( frameBufferTarget === undefined ) {
1264
1443
 
1265
1444
  frameBufferTarget = new RenderTarget( width, height, {
1266
1445
  depthBuffer: depth,
1267
1446
  stencilBuffer: stencil,
1268
- type: this._colorBufferType,
1447
+ type: this._outputBufferType,
1269
1448
  format: RGBAFormat,
1270
1449
  colorSpace: ColorManagement.workingColorSpace,
1271
1450
  generateMipmaps: false,
@@ -1276,7 +1455,19 @@ class Renderer {
1276
1455
 
1277
1456
  frameBufferTarget.isPostProcessingRenderTarget = true;
1278
1457
 
1279
- this._frameBufferTarget = frameBufferTarget;
1458
+ const dispose = () => {
1459
+
1460
+ target.removeEventListener( 'dispose', dispose );
1461
+
1462
+ frameBufferTarget.dispose();
1463
+
1464
+ this._frameBufferTargets.delete( target );
1465
+
1466
+ };
1467
+
1468
+ target.addEventListener( 'dispose', dispose );
1469
+
1470
+ this._frameBufferTargets.set( target, frameBufferTarget );
1280
1471
 
1281
1472
  }
1282
1473
 
@@ -1284,6 +1475,7 @@ class Renderer {
1284
1475
 
1285
1476
  frameBufferTarget.depthBuffer = depth;
1286
1477
  frameBufferTarget.stencilBuffer = stencil;
1478
+
1287
1479
  if ( outputRenderTarget !== null ) {
1288
1480
 
1289
1481
  frameBufferTarget.setSize( outputRenderTarget.width, outputRenderTarget.height, outputRenderTarget.depth );
@@ -1294,14 +1486,20 @@ class Renderer {
1294
1486
 
1295
1487
  }
1296
1488
 
1297
- const canvasTarget = this._canvasTarget;
1489
+ // RenderTarget || CanvasTarget
1490
+
1491
+ const viewport = this._outputRenderTarget ? this._outputRenderTarget.viewport : target._viewport;
1492
+ const scissor = this._outputRenderTarget ? this._outputRenderTarget.scissor : target._scissor;
1493
+ const pixelRatio = this._outputRenderTarget ? 1 : target._pixelRatio;
1494
+ const scissorTest = this._outputRenderTarget ? this._outputRenderTarget.scissorTest : target._scissorTest;
1298
1495
 
1299
- frameBufferTarget.viewport.copy( canvasTarget._viewport );
1300
- frameBufferTarget.scissor.copy( canvasTarget._scissor );
1301
- frameBufferTarget.viewport.multiplyScalar( canvasTarget._pixelRatio );
1302
- frameBufferTarget.scissor.multiplyScalar( canvasTarget._pixelRatio );
1303
- frameBufferTarget.scissorTest = canvasTarget._scissorTest;
1496
+ frameBufferTarget.viewport.copy( viewport );
1497
+ frameBufferTarget.scissor.copy( scissor );
1498
+ frameBufferTarget.viewport.multiplyScalar( pixelRatio );
1499
+ frameBufferTarget.scissor.multiplyScalar( pixelRatio );
1500
+ frameBufferTarget.scissorTest = scissorTest;
1304
1501
  frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false;
1502
+ frameBufferTarget.useArrayDepthTexture = outputRenderTarget !== null ? outputRenderTarget.useArrayDepthTexture : false;
1305
1503
  frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true;
1306
1504
  frameBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false;
1307
1505
 
@@ -1333,9 +1531,14 @@ class Renderer {
1333
1531
  const previousRenderId = nodeFrame.renderId;
1334
1532
  const previousRenderContext = this._currentRenderContext;
1335
1533
  const previousRenderObjectFunction = this._currentRenderObjectFunction;
1534
+ const previousHandleObjectFunction = this._handleObjectFunction;
1535
+
1536
+ this.lighting.beginRender( scene );
1336
1537
 
1337
1538
  //
1338
1539
 
1540
+ this._callDepth ++;
1541
+
1339
1542
  const sceneRef = ( scene.isScene === true ) ? scene : _scene;
1340
1543
 
1341
1544
  const outputRenderTarget = this._renderTarget || this._outputRenderTarget;
@@ -1359,12 +1562,35 @@ class Renderer {
1359
1562
 
1360
1563
  }
1361
1564
 
1565
+ // make sure a new render target has correct default depth values
1566
+
1567
+ if ( renderTarget !== null && renderTarget.depthBuffer === true ) {
1568
+
1569
+ const renderTargetData = this._textures.get( renderTarget );
1570
+
1571
+ if ( renderTargetData.depthInitialized !== true ) {
1572
+
1573
+ // we need a single manual clear if auto clear depth is disabled
1574
+
1575
+ if ( this.autoClear === false || ( this.autoClear === true && this.autoClearDepth === false ) ) {
1576
+
1577
+ this.clearDepth();
1578
+
1579
+ }
1580
+
1581
+ renderTargetData.depthInitialized = true;
1582
+
1583
+ }
1584
+
1585
+ }
1586
+
1362
1587
  //
1363
1588
 
1364
- const renderContext = this._renderContexts.get( scene, camera, renderTarget );
1589
+ const renderContext = this._renderContexts.get( renderTarget, this._mrt, this._callDepth );
1365
1590
 
1366
1591
  this._currentRenderContext = renderContext;
1367
1592
  this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;
1593
+ this._handleObjectFunction = this._renderObjectDirect;
1368
1594
 
1369
1595
  //
1370
1596
 
@@ -1382,39 +1608,9 @@ class Renderer {
1382
1608
 
1383
1609
  //
1384
1610
 
1385
- const coordinateSystem = this.coordinateSystem;
1386
- const xr = this.xr;
1387
-
1388
- if ( camera.coordinateSystem !== coordinateSystem && xr.isPresenting === false ) {
1389
-
1390
- camera.coordinateSystem = coordinateSystem;
1391
- camera.updateProjectionMatrix();
1392
-
1393
- if ( camera.isArrayCamera ) {
1394
-
1395
- for ( const subCamera of camera.cameras ) {
1396
-
1397
- subCamera.coordinateSystem = coordinateSystem;
1398
- subCamera.updateProjectionMatrix();
1399
-
1400
- }
1401
-
1402
- }
1403
-
1404
- }
1405
-
1406
- //
1407
-
1408
1611
  if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
1409
1612
 
1410
- if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
1411
-
1412
- if ( xr.enabled === true && xr.isPresenting === true ) {
1413
-
1414
- if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );
1415
- camera = xr.getCamera(); // use XR camera for rendering
1416
-
1417
- }
1613
+ camera = this._updateCamera( camera );
1418
1614
 
1419
1615
  //
1420
1616
 
@@ -1462,7 +1658,11 @@ class Renderer {
1462
1658
 
1463
1659
  const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
1464
1660
 
1465
- if ( ! camera.isArrayCamera ) {
1661
+ if ( camera.isArrayCamera ) {
1662
+
1663
+ frustum.setFromArrayCamera( camera );
1664
+
1665
+ } else {
1466
1666
 
1467
1667
  _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
1468
1668
  frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
@@ -1478,7 +1678,7 @@ class Renderer {
1478
1678
 
1479
1679
  if ( this.sortObjects === true ) {
1480
1680
 
1481
- renderList.sort( this._opaqueSort, this._transparentSort );
1681
+ renderList.sort( this._opaqueSort, this._transparentSort, camera.reversedDepth );
1482
1682
 
1483
1683
  }
1484
1684
 
@@ -1561,12 +1761,16 @@ class Renderer {
1561
1761
  // restore render tree
1562
1762
 
1563
1763
  nodeFrame.renderId = previousRenderId;
1564
-
1565
1764
  this._currentRenderContext = previousRenderContext;
1566
1765
  this._currentRenderObjectFunction = previousRenderObjectFunction;
1766
+ this._handleObjectFunction = previousHandleObjectFunction;
1767
+
1768
+ this.lighting.finishRender( scene );
1567
1769
 
1568
1770
  //
1569
1771
 
1772
+ this._callDepth --;
1773
+
1570
1774
  if ( frameBufferTarget !== null ) {
1571
1775
 
1572
1776
  this.setRenderTarget( outputRenderTarget, activeCubeFace, activeMipmapLevel );
@@ -1608,12 +1812,52 @@ class Renderer {
1608
1812
  */
1609
1813
  _renderOutput( renderTarget ) {
1610
1814
 
1611
- const quad = this._quad;
1815
+ const cacheKey = this._nodes.getOutputCacheKey();
1612
1816
 
1613
- if ( this._nodes.hasOutputChange( renderTarget.texture ) ) {
1817
+ let quadData = this._quadCache.get( renderTarget.texture );
1818
+ let quad;
1819
+
1820
+ if ( quadData === undefined ) {
1821
+
1822
+ quad = new QuadMesh( new NodeMaterial() );
1823
+ quad.name = 'Output Color Transform';
1824
+ quad.material.name = 'outputColorTransform';
1614
1825
 
1615
1826
  quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
1616
- quad.material.needsUpdate = true;
1827
+
1828
+ quadData = {
1829
+ quad,
1830
+ cacheKey
1831
+ };
1832
+
1833
+ this._quadCache.set( renderTarget.texture, quadData );
1834
+
1835
+ // dispose logic
1836
+
1837
+ const dispose = () => {
1838
+
1839
+ quad.material.dispose();
1840
+
1841
+ this._quadCache.delete( renderTarget.texture );
1842
+
1843
+ renderTarget.texture.removeEventListener( 'dispose', dispose );
1844
+
1845
+ };
1846
+
1847
+ renderTarget.texture.addEventListener( 'dispose', dispose );
1848
+
1849
+ } else {
1850
+
1851
+ quad = quadData.quad;
1852
+
1853
+ if ( quadData.cacheKey !== cacheKey ) {
1854
+
1855
+ quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
1856
+ quad.material.needsUpdate = true;
1857
+
1858
+ quadData.cacheKey = cacheKey;
1859
+
1860
+ }
1617
1861
 
1618
1862
  }
1619
1863
 
@@ -1624,8 +1868,7 @@ class Renderer {
1624
1868
 
1625
1869
  this.autoClear = false;
1626
1870
  this.xr.enabled = false;
1627
-
1628
- this._renderScene( quad, quad.camera, false );
1871
+ this._renderOutputLayers( quad, renderTarget );
1629
1872
 
1630
1873
  this.autoClear = currentAutoClear;
1631
1874
  this.xr.enabled = currentXR;
@@ -1640,7 +1883,7 @@ class Renderer {
1640
1883
  */
1641
1884
  getMaxAnisotropy() {
1642
1885
 
1643
- return this.backend.getMaxAnisotropy();
1886
+ return this.backend.capabilities.getMaxAnisotropy();
1644
1887
 
1645
1888
  }
1646
1889
 
@@ -1699,12 +1942,42 @@ class Renderer {
1699
1942
  * from the GPU to the CPU in context of compute shaders.
1700
1943
  *
1701
1944
  * @async
1702
- * @param {StorageBufferAttribute} attribute - The storage buffer attribute.
1703
- * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.
1945
+ * @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
1946
+ * @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
1947
+ * @param {number} offset - The storage buffer attribute.
1948
+ * @param {number} count - The offset from which to start reading the
1949
+ * @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
1704
1950
  */
1705
- async getArrayBufferAsync( attribute ) {
1951
+ async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
1952
+
1953
+ // tally the memory for this readback buffer
1954
+ if ( target !== null && target.isReadbackBuffer ) {
1706
1955
 
1707
- return await this.backend.getArrayBufferAsync( attribute );
1956
+ if ( this.info.memoryMap.has( target ) === false ) {
1957
+
1958
+ this.info.createReadbackBuffer( target );
1959
+
1960
+ const disposeInfo = () => {
1961
+
1962
+ target.removeEventListener( 'dispose', disposeInfo );
1963
+
1964
+ this.info.destroyReadbackBuffer( target );
1965
+
1966
+ };
1967
+
1968
+ target.addEventListener( 'dispose', disposeInfo );
1969
+
1970
+ }
1971
+
1972
+ }
1973
+
1974
+ if ( offset % 4 !== 0 || ( count > 0 && count % 4 !== 0 ) ) {
1975
+
1976
+ throw new Error( 'THREE.Renderer: "getArrayBufferAsync()" offset and count must be a multiple of 4.' );
1977
+
1978
+ }
1979
+
1980
+ return await this.backend.getArrayBufferAsync( attribute, target, offset, count );
1708
1981
 
1709
1982
  }
1710
1983
 
@@ -1842,9 +2115,9 @@ class Renderer {
1842
2115
  /**
1843
2116
  * Defines the scissor rectangle.
1844
2117
  *
1845
- * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the box in logical pixel unit.
2118
+ * @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the box in logical pixel unit.
1846
2119
  * Instead of passing four arguments, the method also works with a single four-dimensional vector.
1847
- * @param {number} y - The vertical coordinate for the lower left corner of the box in logical pixel unit.
2120
+ * @param {number} y - The vertical coordinate for the upper left corner of the box in logical pixel unit.
1848
2121
  * @param {number} width - The width of the scissor box in logical pixel unit.
1849
2122
  * @param {number} height - The height of the scissor box in logical pixel unit.
1850
2123
  */
@@ -1895,8 +2168,8 @@ class Renderer {
1895
2168
  /**
1896
2169
  * Defines the viewport.
1897
2170
  *
1898
- * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.
1899
- * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin in logical pixel unit.
2171
+ * @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the viewport origin in logical pixel unit.
2172
+ * @param {number} y - The vertical coordinate for the upper left corner of the viewport origin in logical pixel unit.
1900
2173
  * @param {number} width - The width of the viewport in logical pixel unit.
1901
2174
  * @param {number} height - The height of the viewport in logical pixel unit.
1902
2175
  * @param {number} minDepth - The minimum depth value of the viewport. WebGPU only.
@@ -1962,7 +2235,7 @@ class Renderer {
1962
2235
  */
1963
2236
  getClearDepth() {
1964
2237
 
1965
- return this._clearDepth;
2238
+ return ( this.reversedDepthBuffer === true ) ? 1 - this._clearDepth : this._clearDepth;
1966
2239
 
1967
2240
  }
1968
2241
 
@@ -2026,7 +2299,7 @@ class Renderer {
2026
2299
 
2027
2300
  if ( this._initialized === false ) {
2028
2301
 
2029
- throw new Error( 'Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.' );
2302
+ throw new Error( 'THREE.Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
2030
2303
 
2031
2304
  }
2032
2305
 
@@ -2040,7 +2313,7 @@ class Renderer {
2040
2313
 
2041
2314
  const renderTargetData = this._textures.get( renderTarget );
2042
2315
 
2043
- renderContext = this._renderContexts.getForClear( renderTarget );
2316
+ renderContext = this._renderContexts.get( renderTarget, null, - 1 ); // using - 1 for the call depth to get a render context for the clear operation
2044
2317
  renderContext.textures = renderTargetData.textures;
2045
2318
  renderContext.depthTexture = renderTargetData.depthTexture;
2046
2319
  renderContext.width = renderTargetData.width;
@@ -2049,10 +2322,18 @@ class Renderer {
2049
2322
  renderContext.depth = renderTarget.depthBuffer;
2050
2323
  renderContext.stencil = renderTarget.stencilBuffer;
2051
2324
  // #30329
2052
- renderContext.clearColorValue = this.backend.getClearColor();
2325
+ const color = this.backend.getClearColor();
2326
+ renderContext.clearColorValue.r = color.r;
2327
+ renderContext.clearColorValue.g = color.g;
2328
+ renderContext.clearColorValue.b = color.b;
2329
+ renderContext.clearColorValue.a = color.a;
2330
+ renderContext.clearDepthValue = this.getClearDepth();
2331
+ renderContext.clearStencilValue = this.getClearStencil();
2053
2332
  renderContext.activeCubeFace = this.getActiveCubeFace();
2054
2333
  renderContext.activeMipmapLevel = this.getActiveMipmapLevel();
2055
2334
 
2335
+ if ( renderTarget.depthBuffer === true ) renderTargetData.depthInitialized = true;
2336
+
2056
2337
  }
2057
2338
 
2058
2339
  this.backend.clear( color, depth, stencil, renderContext );
@@ -2266,7 +2547,11 @@ class Renderer {
2266
2547
  this._renderContexts.dispose();
2267
2548
  this._textures.dispose();
2268
2549
 
2269
- if ( this._frameBufferTarget !== null ) this._frameBufferTarget.dispose();
2550
+ for ( const canvasTarget of this._frameBufferTargets.keys() ) {
2551
+
2552
+ canvasTarget.dispose();
2553
+
2554
+ }
2270
2555
 
2271
2556
  Object.values( this.backend.timestampQueryPool ).forEach( queryPool => {
2272
2557
 
@@ -2312,7 +2597,7 @@ class Renderer {
2312
2597
  /**
2313
2598
  * Sets the output render target for the renderer.
2314
2599
  *
2315
- * @param {Object} renderTarget - The render target to set as the output target.
2600
+ * @param {?RenderTarget} renderTarget - The render target to set as the output target.
2316
2601
  */
2317
2602
  setOutputRenderTarget( renderTarget ) {
2318
2603
 
@@ -2360,6 +2645,7 @@ class Renderer {
2360
2645
  /**
2361
2646
  * Resets the renderer to the initial state before WebXR started.
2362
2647
  *
2648
+ * @private
2363
2649
  */
2364
2650
  _resetXRState() {
2365
2651
 
@@ -2367,8 +2653,11 @@ class Renderer {
2367
2653
  this.setOutputRenderTarget( null );
2368
2654
  this.setRenderTarget( null );
2369
2655
 
2370
- this._frameBufferTarget.dispose();
2371
- this._frameBufferTarget = null;
2656
+ for ( const canvasTarget of this._frameBufferTargets.keys() ) {
2657
+
2658
+ canvasTarget.dispose();
2659
+
2660
+ }
2372
2661
 
2373
2662
  }
2374
2663
 
@@ -2583,7 +2872,7 @@ class Renderer {
2583
2872
 
2584
2873
  if ( this._initialized === false ) {
2585
2874
 
2586
- throw new Error( 'Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.' );
2875
+ throw new Error( 'THREE.Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
2587
2876
 
2588
2877
  }
2589
2878
 
@@ -2633,7 +2922,7 @@ class Renderer {
2633
2922
 
2634
2923
  if ( this._initialized === false ) {
2635
2924
 
2636
- throw new Error( 'Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.' );
2925
+ throw new Error( 'THREE.Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
2637
2926
 
2638
2927
  }
2639
2928
 
@@ -2641,6 +2930,37 @@ class Renderer {
2641
2930
 
2642
2931
  }
2643
2932
 
2933
+ /**
2934
+ * Initializes the given render target.
2935
+ *
2936
+ * @param {RenderTarget} renderTarget - The render target to intialize.
2937
+ */
2938
+ initRenderTarget( renderTarget ) {
2939
+
2940
+ if ( this._initialized === false ) {
2941
+
2942
+ throw new Error( 'THREE.Renderer: .initRenderTarget() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
2943
+
2944
+ }
2945
+
2946
+ this._textures.updateRenderTarget( renderTarget );
2947
+
2948
+ const renderTargetData = this._textures.get( renderTarget );
2949
+
2950
+ const renderContext = this._renderContexts.get( renderTarget );
2951
+
2952
+ renderContext.textures = renderTargetData.textures;
2953
+ renderContext.depthTexture = renderTargetData.depthTexture;
2954
+ renderContext.width = renderTargetData.width;
2955
+ renderContext.height = renderTargetData.height;
2956
+ renderContext.renderTarget = renderTarget;
2957
+ renderContext.depth = renderTarget.depthBuffer;
2958
+ renderContext.stencil = renderTarget.stencilBuffer;
2959
+
2960
+ this.backend.initRenderTarget( renderContext );
2961
+
2962
+ }
2963
+
2644
2964
  /**
2645
2965
  * Copies the current bound framebuffer into the given texture.
2646
2966
  *
@@ -2750,6 +3070,7 @@ class Renderer {
2750
3070
  * Analyzes the given 3D object's hierarchy and builds render lists from the
2751
3071
  * processed hierarchy.
2752
3072
  *
3073
+ * @private
2753
3074
  * @param {Object3D} object - The 3D object to process (usually a scene).
2754
3075
  * @param {Camera} camera - The camera the object is rendered with.
2755
3076
  * @param {number} groupOrder - The group order is derived from the `renderOrder` of groups and is used to group 3D objects within groups.
@@ -2782,7 +3103,7 @@ class Renderer {
2782
3103
 
2783
3104
  const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
2784
3105
 
2785
- if ( ! object.frustumCulled || frustum.intersectsSprite( object, camera ) ) {
3106
+ if ( ! object.frustumCulled || frustum.intersectsSprite( object ) ) {
2786
3107
 
2787
3108
  if ( this.sortObjects === true ) {
2788
3109
 
@@ -2808,7 +3129,7 @@ class Renderer {
2808
3129
 
2809
3130
  const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
2810
3131
 
2811
- if ( ! object.frustumCulled || frustum.intersectsObject( object, camera ) ) {
3132
+ if ( ! object.frustumCulled || frustum.intersectsObject( object ) ) {
2812
3133
 
2813
3134
  const { geometry, material } = object;
2814
3135
 
@@ -2857,9 +3178,40 @@ class Renderer {
2857
3178
  const baseRenderList = renderList;
2858
3179
 
2859
3180
  // replace render list
3181
+
2860
3182
  renderList = this._renderLists.get( object, camera );
2861
3183
 
2862
- renderList.begin();
3184
+ const renderBundle = this._bundles.get( object, camera, this._currentRenderContext );
3185
+ const renderBundleData = this.backend.get( renderBundle );
3186
+ const renderBundleNeedsUpdate = this._bundleNeedsUpdate( object, renderBundleData );
3187
+
3188
+ if ( renderBundleNeedsUpdate ) {
3189
+
3190
+ // update render list if necessary
3191
+
3192
+ renderList.begin();
3193
+
3194
+ if ( renderBundleData.renderObjects === undefined ) {
3195
+
3196
+ renderBundleData.renderObjects = [];
3197
+
3198
+ } else {
3199
+
3200
+ renderBundleData.renderObjects.length = 0;
3201
+
3202
+ }
3203
+
3204
+ const children = object.children;
3205
+
3206
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
3207
+
3208
+ this._projectObject( children[ i ], camera, groupOrder, renderList, clippingContext );
3209
+
3210
+ }
3211
+
3212
+ renderList.finish();
3213
+
3214
+ }
2863
3215
 
2864
3216
  baseRenderList.pushBundle( {
2865
3217
  bundleGroup: object,
@@ -2867,10 +3219,12 @@ class Renderer {
2867
3219
  renderList,
2868
3220
  } );
2869
3221
 
2870
- renderList.finish();
3222
+ return;
2871
3223
 
2872
3224
  }
2873
3225
 
3226
+ //
3227
+
2874
3228
  const children = object.children;
2875
3229
 
2876
3230
  for ( let i = 0, l = children.length; i < l; i ++ ) {
@@ -2975,6 +3329,7 @@ class Renderer {
2975
3329
  * Retrieves shadow nodes for the given material. This is used to setup shadow passes.
2976
3330
  * The result is cached per material and updated when the material's version changes.
2977
3331
  *
3332
+ * @private
2978
3333
  * @param {Material} material
2979
3334
  * @returns {Object} - The shadow nodes for the material.
2980
3335
  */
@@ -2986,15 +3341,16 @@ class Renderer {
2986
3341
 
2987
3342
  if ( cache === undefined || cache.version !== version ) {
2988
3343
 
2989
- const hasMap = material.map !== null;
3344
+ const hasMap = material.map && material.map.isTexture;
2990
3345
  const hasColorNode = material.colorNode && material.colorNode.isNode;
2991
3346
  const hasCastShadowNode = material.castShadowNode && material.castShadowNode.isNode;
3347
+ const hasMaskNode = ( material.maskShadowNode && material.maskShadowNode.isNode ) || ( material.maskNode && material.maskNode.isNode );
2992
3348
 
2993
3349
  let positionNode = null;
2994
3350
  let colorNode = null;
2995
3351
  let depthNode = null;
2996
3352
 
2997
- if ( hasMap || hasColorNode || hasCastShadowNode ) {
3353
+ if ( hasMap || hasColorNode || hasCastShadowNode || hasMaskNode ) {
2998
3354
 
2999
3355
  let shadowRGB;
3000
3356
  let shadowAlpha;
@@ -3004,6 +3360,12 @@ class Renderer {
3004
3360
  shadowRGB = material.castShadowNode.rgb;
3005
3361
  shadowAlpha = material.castShadowNode.a;
3006
3362
 
3363
+ if ( this.shadowMap.transmitted !== true ) {
3364
+
3365
+ warnOnce( 'Renderer: `shadowMap.transmitted` needs to be set to `true` when using `material.castShadowNode`.' );
3366
+
3367
+ }
3368
+
3007
3369
  } else {
3008
3370
 
3009
3371
  shadowRGB = vec3( 0 );
@@ -3025,6 +3387,20 @@ class Renderer {
3025
3387
 
3026
3388
  colorNode = vec4( shadowRGB, shadowAlpha );
3027
3389
 
3390
+ if ( hasMaskNode ) {
3391
+
3392
+ const maskNode = material.maskShadowNode || material.maskNode;
3393
+
3394
+ colorNode = Fn( ( [ color ] ) => {
3395
+
3396
+ maskNode.not().discard();
3397
+
3398
+ return color;
3399
+
3400
+ } )( colorNode );
3401
+
3402
+ }
3403
+
3028
3404
  }
3029
3405
 
3030
3406
  if ( material.depthNode && material.depthNode.isNode ) {
@@ -3058,6 +3434,98 @@ class Renderer {
3058
3434
 
3059
3435
  }
3060
3436
 
3437
+ /**
3438
+ * Updates the camera so it's prepared for rendering operations.
3439
+ *
3440
+ * @private
3441
+ * @param {Camera} camera - The camera to update.
3442
+ * @return {Camera} The returned camera might be different depending on whether XR is used or not.
3443
+ */
3444
+ _updateCamera( camera ) {
3445
+
3446
+ const xr = this.xr;
3447
+
3448
+ if ( xr.isPresenting === false ) {
3449
+
3450
+ let projectionMatrixNeedsUpdate = false;
3451
+
3452
+ // reversed depth
3453
+
3454
+ if ( this.reversedDepthBuffer === true && camera.reversedDepth !== true ) {
3455
+
3456
+ camera._reversedDepth = true;
3457
+
3458
+ if ( camera.isArrayCamera ) {
3459
+
3460
+ for ( const subCamera of camera.cameras ) {
3461
+
3462
+ subCamera._reversedDepth = true;
3463
+
3464
+ }
3465
+
3466
+ }
3467
+
3468
+ projectionMatrixNeedsUpdate = true;
3469
+
3470
+ }
3471
+
3472
+ // WebGPU/WebGL coordinate system
3473
+
3474
+ const coordinateSystem = this.coordinateSystem;
3475
+
3476
+ if ( camera.coordinateSystem !== coordinateSystem ) {
3477
+
3478
+ camera.coordinateSystem = coordinateSystem;
3479
+
3480
+ if ( camera.isArrayCamera ) {
3481
+
3482
+ for ( const subCamera of camera.cameras ) {
3483
+
3484
+ subCamera.coordinateSystem = coordinateSystem;
3485
+
3486
+ }
3487
+
3488
+ }
3489
+
3490
+ projectionMatrixNeedsUpdate = true;
3491
+
3492
+ }
3493
+
3494
+ // camera update
3495
+
3496
+ if ( projectionMatrixNeedsUpdate === true ) {
3497
+
3498
+ camera.updateProjectionMatrix();
3499
+
3500
+ if ( camera.isArrayCamera ) {
3501
+
3502
+ for ( const subCamera of camera.cameras ) {
3503
+
3504
+ subCamera.updateProjectionMatrix();
3505
+
3506
+ }
3507
+
3508
+ }
3509
+
3510
+ }
3511
+
3512
+ }
3513
+
3514
+ if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
3515
+
3516
+ // handle XR
3517
+
3518
+ if ( xr.enabled === true && xr.isPresenting === true ) {
3519
+
3520
+ if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );
3521
+ camera = xr.getCamera(); // use XR camera for rendering
3522
+
3523
+ }
3524
+
3525
+ return camera;
3526
+
3527
+ }
3528
+
3061
3529
  /**
3062
3530
  * This method represents the default render object function that manages the render lifecycle
3063
3531
  * of the object.
@@ -3079,6 +3547,11 @@ class Renderer {
3079
3547
  let materialDepthNode;
3080
3548
  let materialPositionNode;
3081
3549
  let materialSide;
3550
+ let materialDisplacementMap;
3551
+ let materialDisplacementScale;
3552
+ let materialDisplacementBias;
3553
+
3554
+ const previousSourceMaterial = this._currentSourceMaterial;
3082
3555
 
3083
3556
  //
3084
3557
 
@@ -3088,15 +3561,20 @@ class Renderer {
3088
3561
 
3089
3562
  if ( material.allowOverride === true && scene.overrideMaterial !== null ) {
3090
3563
 
3564
+ this._currentSourceMaterial = material;
3565
+
3091
3566
  const overrideMaterial = scene.overrideMaterial;
3092
3567
 
3093
3568
  materialOverride = true;
3094
3569
 
3095
3570
  // store original nodes
3096
- materialColorNode = scene.overrideMaterial.colorNode;
3097
- materialDepthNode = scene.overrideMaterial.depthNode;
3098
- materialPositionNode = scene.overrideMaterial.positionNode;
3571
+ materialColorNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.colorNode : null;
3572
+ materialDepthNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.depthNode : null;
3573
+ materialPositionNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.positionNode : null;
3099
3574
  materialSide = scene.overrideMaterial.side;
3575
+ materialDisplacementMap = overrideMaterial.displacementMap;
3576
+ materialDisplacementScale = overrideMaterial.displacementScale;
3577
+ materialDisplacementBias = overrideMaterial.displacementBias;
3100
3578
 
3101
3579
  if ( material.positionNode && material.positionNode.isNode ) {
3102
3580
 
@@ -3106,6 +3584,9 @@ class Renderer {
3106
3584
 
3107
3585
  overrideMaterial.alphaTest = material.alphaTest;
3108
3586
  overrideMaterial.alphaMap = material.alphaMap;
3587
+ overrideMaterial.displacementMap = material.displacementMap;
3588
+ overrideMaterial.displacementScale = material.displacementScale;
3589
+ overrideMaterial.displacementBias = material.displacementBias;
3109
3590
  overrideMaterial.transparent = material.transparent || material.transmission > 0 ||
3110
3591
  ( material.transmissionNode && material.transmissionNode.isNode ) ||
3111
3592
  ( material.backdropNode && material.backdropNode.isNode );
@@ -3114,7 +3595,15 @@ class Renderer {
3114
3595
 
3115
3596
  const { colorNode, depthNode, positionNode } = this._getShadowNodes( material );
3116
3597
 
3117
- overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
3598
+ if ( this.shadowMap.type === VSMShadowMap ) {
3599
+
3600
+ overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;
3601
+
3602
+ } else {
3603
+
3604
+ overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : _shadowSide[ material.side ];
3605
+
3606
+ }
3118
3607
 
3119
3608
  if ( colorNode !== null ) overrideMaterial.colorNode = colorNode;
3120
3609
  if ( depthNode !== null ) overrideMaterial.depthNode = depthNode;
@@ -3152,15 +3641,38 @@ class Renderer {
3152
3641
  scene.overrideMaterial.depthNode = materialDepthNode;
3153
3642
  scene.overrideMaterial.positionNode = materialPositionNode;
3154
3643
  scene.overrideMaterial.side = materialSide;
3644
+ scene.overrideMaterial.displacementMap = materialDisplacementMap;
3645
+ scene.overrideMaterial.displacementScale = materialDisplacementScale;
3646
+ scene.overrideMaterial.displacementBias = materialDisplacementBias;
3155
3647
 
3156
3648
  }
3157
3649
 
3650
+ this._currentSourceMaterial = previousSourceMaterial;
3651
+
3158
3652
  //
3159
3653
 
3160
3654
  object.onAfterRender( this, scene, camera, geometry, material, group );
3161
3655
 
3162
3656
  }
3163
3657
 
3658
+ /**
3659
+ * Checks if the given compatibility is supported by the selected backend.
3660
+ *
3661
+ * @param {string} name - The compatibility's name.
3662
+ * @return {boolean} Whether the compatibility is supported or not.
3663
+ */
3664
+ hasCompatibility( name ) {
3665
+
3666
+ if ( this._initialized === false ) {
3667
+
3668
+ throw new Error( 'THREE.Renderer: .hasCompatibility() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
3669
+
3670
+ }
3671
+
3672
+ return this.backend.hasCompatibility( name );
3673
+
3674
+ }
3675
+
3164
3676
  /**
3165
3677
  * This method represents the default `_handleObjectFunction` implementation which creates
3166
3678
  * a render object from the given data and performs the draw command with the selected backend.
@@ -3181,6 +3693,16 @@ class Renderer {
3181
3693
  renderObject.drawRange = object.geometry.drawRange;
3182
3694
  renderObject.group = group;
3183
3695
 
3696
+ if ( this._currentRenderBundle !== null ) {
3697
+
3698
+ const renderBundleData = this.backend.get( this._currentRenderBundle );
3699
+
3700
+ renderBundleData.renderObjects.push( renderObject );
3701
+
3702
+ renderObject.bundle = this._currentRenderBundle.bundleGroup;
3703
+
3704
+ }
3705
+
3184
3706
  //
3185
3707
 
3186
3708
  const needsRefresh = this._nodes.needsRefresh( renderObject );
@@ -3200,20 +3722,14 @@ class Renderer {
3200
3722
 
3201
3723
  //
3202
3724
 
3203
- if ( this._currentRenderBundle !== null ) {
3725
+ if ( this._pipelines.isReady( renderObject ) ) {
3204
3726
 
3205
- const renderBundleData = this.backend.get( this._currentRenderBundle );
3727
+ this.backend.draw( renderObject, this.info );
3206
3728
 
3207
- renderBundleData.renderObjects.push( renderObject );
3208
-
3209
- renderObject.bundle = this._currentRenderBundle.bundleGroup;
3729
+ if ( needsRefresh ) this._nodes.updateAfter( renderObject );
3210
3730
 
3211
3731
  }
3212
3732
 
3213
- this.backend.draw( renderObject, this.info );
3214
-
3215
- if ( needsRefresh ) this._nodes.updateAfter( renderObject );
3216
-
3217
3733
  }
3218
3734
 
3219
3735
  /**
@@ -3232,6 +3748,27 @@ class Renderer {
3232
3748
  */
3233
3749
  _createObjectPipeline( object, material, scene, camera, lightsNode, group, clippingContext, passId ) {
3234
3750
 
3751
+ // If in async compilation mode, queue the work for sequential execution
3752
+ if ( this._compilationPromises !== null ) {
3753
+
3754
+ // Store work items instead of promises - will be processed sequentially
3755
+ this._compilationPromises.push( {
3756
+ object,
3757
+ material,
3758
+ scene,
3759
+ camera,
3760
+ lightsNode,
3761
+ group,
3762
+ clippingContext,
3763
+ passId,
3764
+ renderContext: this._currentRenderContext
3765
+ } );
3766
+
3767
+ return;
3768
+
3769
+ }
3770
+
3771
+ // Sync path
3235
3772
  const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
3236
3773
  renderObject.drawRange = object.geometry.drawRange;
3237
3774
  renderObject.group = group;