super-three 0.181.0 → 0.184.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  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 +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. 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,7 @@ 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
+ * Defines the type of output buffers. The default `HalfFloatType` is recommend for
591
599
  * best quality. To save memory and bandwidth, `UnsignedByteType` might be used.
592
600
  * This will reduce rendering quality though.
593
601
  *
@@ -595,7 +603,7 @@ class Renderer {
595
603
  * @type {number}
596
604
  * @default HalfFloatType
597
605
  */
598
- this._colorBufferType = colorBufferType;
606
+ this._outputBufferType = outputBufferType;
599
607
 
600
608
  /**
601
609
  * A cache for shadow nodes per material
@@ -614,6 +622,16 @@ class Renderer {
614
622
  */
615
623
  this._initialized = false;
616
624
 
625
+ /**
626
+ * The call depth of the renderer. Counts the number of
627
+ * nested render calls.
628
+ *
629
+ * @private
630
+ * @type {number}
631
+ * @default - 1
632
+ */
633
+ this._callDepth = - 1;
634
+
617
635
  /**
618
636
  * A reference to the promise which initializes the renderer.
619
637
  *
@@ -652,6 +670,7 @@ class Renderer {
652
670
  * Shadow map configuration
653
671
  * @typedef {Object} ShadowMapConfig
654
672
  * @property {boolean} enabled - Whether to globally enable shadows or not.
673
+ * @property {boolean} transmitted - Whether to enable light transmission through non-opaque materials.
655
674
  * @property {number} type - The shadow map type.
656
675
  */
657
676
 
@@ -662,6 +681,7 @@ class Renderer {
662
681
  */
663
682
  this.shadowMap = {
664
683
  enabled: false,
684
+ transmitted: false,
665
685
  type: PCFShadowMap
666
686
  };
667
687
 
@@ -699,7 +719,7 @@ class Renderer {
699
719
  await this.compileAsync( scene, camera );
700
720
 
701
721
  const renderList = this._renderLists.get( scene, camera );
702
- const renderContext = this._renderContexts.get( scene, camera, this._renderTarget );
722
+ const renderContext = this._renderContexts.get( this._renderTarget, this._mrt );
703
723
 
704
724
  const material = scene.overrideMaterial || object.material;
705
725
 
@@ -763,18 +783,18 @@ class Renderer {
763
783
 
764
784
  }
765
785
 
766
- this._nodes = new Nodes( this, backend );
786
+ this._nodes = new NodeManager( this, backend );
767
787
  this._animation = new Animation( this, this._nodes, this.info );
768
- this._attributes = new Attributes( backend );
788
+ this._attributes = new Attributes( backend, this.info );
769
789
  this._background = new Background( this, this._nodes );
770
790
  this._geometries = new Geometries( this._attributes, this.info );
771
791
  this._textures = new Textures( this, backend, this.info );
772
- this._pipelines = new Pipelines( backend, this._nodes );
792
+ this._pipelines = new Pipelines( backend, this._nodes, this.info );
773
793
  this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this.info );
774
794
  this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );
775
795
  this._renderLists = new RenderLists( this.lighting );
776
796
  this._bundles = new RenderBundles();
777
- this._renderContexts = new RenderContexts();
797
+ this._renderContexts = new RenderContexts( this );
778
798
 
779
799
  //
780
800
 
@@ -835,7 +855,7 @@ class Renderer {
835
855
  * @param {Object3D} scene - The scene or 3D object to precompile.
836
856
  * @param {Camera} camera - The camera that is used to render the scene.
837
857
  * @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.
858
+ * @return {Promise} A Promise that resolves when the compile has been finished.
839
859
  */
840
860
  async compileAsync( scene, camera, targetScene = null ) {
841
861
 
@@ -850,16 +870,21 @@ class Renderer {
850
870
  const previousRenderId = nodeFrame.renderId;
851
871
  const previousRenderContext = this._currentRenderContext;
852
872
  const previousRenderObjectFunction = this._currentRenderObjectFunction;
873
+ const previousHandleObjectFunction = this._handleObjectFunction;
853
874
  const previousCompilationPromises = this._compilationPromises;
854
875
 
855
876
  //
856
877
 
857
- const sceneRef = ( scene.isScene === true ) ? scene : _scene;
858
-
859
878
  if ( targetScene === null ) targetScene = scene;
860
879
 
861
- const renderTarget = this._renderTarget;
862
- const renderContext = this._renderContexts.get( targetScene, camera, renderTarget );
880
+ // Use the actual scene for caching when compiling individual objects
881
+ // This ensures cache keys match between compileAsync and render
882
+ const sceneRef = ( scene.isScene === true ) ? scene : ( targetScene.isScene === true ) ? targetScene : _scene;
883
+
884
+ // Match render()'s logic: use frameBufferTarget when needsFrameBufferTarget is true
885
+ const useFrameBufferTarget = this.needsFrameBufferTarget && this._renderTarget === null;
886
+ const renderTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : ( this._renderTarget || this._outputRenderTarget );
887
+ const renderContext = this._renderContexts.get( renderTarget, this._mrt );
863
888
  const activeMipmapLevel = this._activeMipmapLevel;
864
889
 
865
890
  const compilationPromises = [];
@@ -891,7 +916,8 @@ class Renderer {
891
916
 
892
917
  //
893
918
 
894
- const renderList = this._renderLists.get( scene, camera );
919
+ // Use sceneRef for render list to ensure lightsNode matches between compileAsync and render
920
+ const renderList = this._renderLists.get( sceneRef, camera );
895
921
  renderList.begin();
896
922
 
897
923
  this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
@@ -933,9 +959,17 @@ class Renderer {
933
959
 
934
960
  //
935
961
 
936
- this._background.update( sceneRef, renderList, renderContext );
962
+ if ( targetScene !== scene ) {
937
963
 
938
- // process render lists
964
+ this._background.update( targetScene, renderList, renderContext );
965
+
966
+ } else {
967
+
968
+ this._background.update( sceneRef, renderList, renderContext );
969
+
970
+ }
971
+
972
+ // process render lists - _createObjectPipeline will push async promises to _compilationPromises
939
973
 
940
974
  const opaqueObjects = renderList.opaque;
941
975
  const transparentObjects = renderList.transparent;
@@ -951,13 +985,42 @@ class Renderer {
951
985
 
952
986
  this._currentRenderContext = previousRenderContext;
953
987
  this._currentRenderObjectFunction = previousRenderObjectFunction;
988
+ this._handleObjectFunction = previousHandleObjectFunction;
954
989
  this._compilationPromises = previousCompilationPromises;
955
990
 
956
- this._handleObjectFunction = this._renderObjectDirect;
991
+ // Process compilation work items sequentially to avoid freezing
992
+ // Yields between objects to keep animation smooth
993
+
994
+ for ( const item of compilationPromises ) {
995
+
996
+ const renderObject = this._objects.get( item.object, item.material, item.scene, item.camera, item.lightsNode, item.renderContext, item.clippingContext, item.passId );
997
+ renderObject.drawRange = item.object.geometry.drawRange;
998
+ renderObject.group = item.group;
999
+
1000
+ this._geometries.updateForRender( renderObject );
1001
+
1002
+ // Use async node building to yield to main thread
1003
+ await this._nodes.getForRenderAsync( renderObject );
1004
+
1005
+ this._nodes.updateBefore( renderObject );
1006
+ this._nodes.updateForRender( renderObject );
1007
+ this._bindings.updateForRender( renderObject );
1008
+
1009
+ // Wait for pipeline creation
1010
+ const pipelinePromises = [];
1011
+ this._pipelines.getForRender( renderObject, pipelinePromises );
1012
+ if ( pipelinePromises.length > 0 ) {
1013
+
1014
+ await Promise.all( pipelinePromises );
1015
+
1016
+ }
957
1017
 
958
- // wait for all promises setup by backends awaiting compilation/linking/pipeline creation to complete
1018
+ this._nodes.updateAfter( renderObject );
959
1019
 
960
- await Promise.all( compilationPromises );
1020
+ // Yield between objects to allow animation frames
1021
+ await yieldToMain();
1022
+
1023
+ }
961
1024
 
962
1025
  }
963
1026
 
@@ -996,11 +1059,6 @@ class Renderer {
996
1059
 
997
1060
  //
998
1061
 
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
1062
  set inspector( value ) {
1005
1063
 
1006
1064
  if ( this._inspector !== null ) {
@@ -1014,6 +1072,11 @@ class Renderer {
1014
1072
 
1015
1073
  }
1016
1074
 
1075
+ /**
1076
+ * The inspector instance. The inspector can be any class that extends from `InspectorBase`.
1077
+ *
1078
+ * @type {InspectorBase}
1079
+ */
1017
1080
  get inspector() {
1018
1081
 
1019
1082
  return this._inspector;
@@ -1031,15 +1094,17 @@ class Renderer {
1031
1094
  */
1032
1095
  set highPrecision( value ) {
1033
1096
 
1097
+ const contextNodeData = this.contextNode.value;
1098
+
1034
1099
  if ( value === true ) {
1035
1100
 
1036
- this.overrideNodes.modelViewMatrix = highpModelViewMatrix;
1037
- this.overrideNodes.modelNormalViewMatrix = highpModelNormalViewMatrix;
1101
+ contextNodeData.modelViewMatrix = highpModelViewMatrix;
1102
+ contextNodeData.modelNormalViewMatrix = highpModelNormalViewMatrix;
1038
1103
 
1039
1104
  } else if ( this.highPrecision ) {
1040
1105
 
1041
- this.overrideNodes.modelViewMatrix = null;
1042
- this.overrideNodes.modelNormalViewMatrix = null;
1106
+ delete contextNodeData.modelViewMatrix;
1107
+ delete contextNodeData.modelNormalViewMatrix;
1043
1108
 
1044
1109
  }
1045
1110
 
@@ -1053,7 +1118,9 @@ class Renderer {
1053
1118
  */
1054
1119
  get highPrecision() {
1055
1120
 
1056
- return this.overrideNodes.modelViewMatrix === highpModelViewMatrix && this.overrideNodes.modelNormalViewMatrix === highpModelNormalViewMatrix;
1121
+ const contextNodeData = this.contextNode.value;
1122
+
1123
+ return contextNodeData.modelViewMatrix === highpModelViewMatrix && contextNodeData.modelNormalViewMatrix === highpModelNormalViewMatrix;
1057
1124
 
1058
1125
  }
1059
1126
 
@@ -1083,13 +1150,27 @@ class Renderer {
1083
1150
  }
1084
1151
 
1085
1152
  /**
1086
- * Returns the color buffer type.
1153
+ * Returns the output buffer type.
1087
1154
  *
1088
- * @return {number} The color buffer type.
1155
+ * @return {number} The output buffer type.
1089
1156
  */
1090
- getColorBufferType() {
1157
+ getOutputBufferType() {
1091
1158
 
1092
- return this._colorBufferType;
1159
+ return this._outputBufferType;
1160
+
1161
+ }
1162
+
1163
+ /**
1164
+ * Returns the output buffer type.
1165
+ *
1166
+ * @deprecated since r182. Use `.getOutputBufferType()` instead.
1167
+ * @return {number} The output buffer type.
1168
+ */
1169
+ getColorBufferType() { // @deprecated, r182
1170
+
1171
+ warnOnce( 'Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".' );
1172
+
1173
+ return this.getOutputBufferType();
1093
1174
 
1094
1175
  }
1095
1176
 
@@ -1131,17 +1212,11 @@ class Renderer {
1131
1212
 
1132
1213
  //
1133
1214
 
1134
- const renderBundle = this._bundles.get( bundleGroup, camera );
1215
+ const renderBundle = this._bundles.get( bundleGroup, camera, renderContext );
1135
1216
  const renderBundleData = this.backend.get( renderBundle );
1136
1217
 
1137
- if ( renderBundleData.renderContexts === undefined ) renderBundleData.renderContexts = new Set();
1138
-
1139
- //
1140
-
1141
1218
  const needsUpdate = bundleGroup.version !== renderBundleData.version;
1142
- const renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || needsUpdate;
1143
-
1144
- renderBundleData.renderContexts.add( renderContext );
1219
+ const renderBundleNeedsUpdate = needsUpdate || renderBundleData.bundleGPU === undefined;
1145
1220
 
1146
1221
  if ( renderBundleNeedsUpdate ) {
1147
1222
 
@@ -1258,14 +1333,17 @@ class Renderer {
1258
1333
  const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
1259
1334
  const { depth, stencil } = this;
1260
1335
 
1261
- let frameBufferTarget = this._frameBufferTarget;
1336
+ // TODO: Unify CanvasTarget and OutputRenderTarget
1337
+ const target = this._outputRenderTarget || this._canvasTarget;
1338
+
1339
+ let frameBufferTarget = this._frameBufferTargets.get( target );
1262
1340
 
1263
- if ( frameBufferTarget === null ) {
1341
+ if ( frameBufferTarget === undefined ) {
1264
1342
 
1265
1343
  frameBufferTarget = new RenderTarget( width, height, {
1266
1344
  depthBuffer: depth,
1267
1345
  stencilBuffer: stencil,
1268
- type: this._colorBufferType,
1346
+ type: this._outputBufferType,
1269
1347
  format: RGBAFormat,
1270
1348
  colorSpace: ColorManagement.workingColorSpace,
1271
1349
  generateMipmaps: false,
@@ -1276,7 +1354,19 @@ class Renderer {
1276
1354
 
1277
1355
  frameBufferTarget.isPostProcessingRenderTarget = true;
1278
1356
 
1279
- this._frameBufferTarget = frameBufferTarget;
1357
+ const dispose = () => {
1358
+
1359
+ target.removeEventListener( 'dispose', dispose );
1360
+
1361
+ frameBufferTarget.dispose();
1362
+
1363
+ this._frameBufferTargets.delete( target );
1364
+
1365
+ };
1366
+
1367
+ target.addEventListener( 'dispose', dispose );
1368
+
1369
+ this._frameBufferTargets.set( target, frameBufferTarget );
1280
1370
 
1281
1371
  }
1282
1372
 
@@ -1284,6 +1374,7 @@ class Renderer {
1284
1374
 
1285
1375
  frameBufferTarget.depthBuffer = depth;
1286
1376
  frameBufferTarget.stencilBuffer = stencil;
1377
+
1287
1378
  if ( outputRenderTarget !== null ) {
1288
1379
 
1289
1380
  frameBufferTarget.setSize( outputRenderTarget.width, outputRenderTarget.height, outputRenderTarget.depth );
@@ -1294,13 +1385,18 @@ class Renderer {
1294
1385
 
1295
1386
  }
1296
1387
 
1297
- const canvasTarget = this._canvasTarget;
1388
+ // RenderTarget || CanvasTarget
1389
+
1390
+ const viewport = this._outputRenderTarget ? this._outputRenderTarget.viewport : target._viewport;
1391
+ const scissor = this._outputRenderTarget ? this._outputRenderTarget.scissor : target._scissor;
1392
+ const pixelRatio = this._outputRenderTarget ? 1 : target._pixelRatio;
1393
+ const scissorTest = this._outputRenderTarget ? this._outputRenderTarget.scissorTest : target._scissorTest;
1298
1394
 
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;
1395
+ frameBufferTarget.viewport.copy( viewport );
1396
+ frameBufferTarget.scissor.copy( scissor );
1397
+ frameBufferTarget.viewport.multiplyScalar( pixelRatio );
1398
+ frameBufferTarget.scissor.multiplyScalar( pixelRatio );
1399
+ frameBufferTarget.scissorTest = scissorTest;
1304
1400
  frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false;
1305
1401
  frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true;
1306
1402
  frameBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false;
@@ -1333,9 +1429,12 @@ class Renderer {
1333
1429
  const previousRenderId = nodeFrame.renderId;
1334
1430
  const previousRenderContext = this._currentRenderContext;
1335
1431
  const previousRenderObjectFunction = this._currentRenderObjectFunction;
1432
+ const previousHandleObjectFunction = this._handleObjectFunction;
1336
1433
 
1337
1434
  //
1338
1435
 
1436
+ this._callDepth ++;
1437
+
1339
1438
  const sceneRef = ( scene.isScene === true ) ? scene : _scene;
1340
1439
 
1341
1440
  const outputRenderTarget = this._renderTarget || this._outputRenderTarget;
@@ -1359,12 +1458,35 @@ class Renderer {
1359
1458
 
1360
1459
  }
1361
1460
 
1461
+ // make sure a new render target has correct default depth values
1462
+
1463
+ if ( renderTarget !== null && renderTarget.depthBuffer === true ) {
1464
+
1465
+ const renderTargetData = this._textures.get( renderTarget );
1466
+
1467
+ if ( renderTargetData.depthInitialized !== true ) {
1468
+
1469
+ // we need a single manual clear if auto clear depth is disabled
1470
+
1471
+ if ( this.autoClear === false || ( this.autoClear === true && this.autoClearDepth === false ) ) {
1472
+
1473
+ this.clearDepth();
1474
+
1475
+ }
1476
+
1477
+ renderTargetData.depthInitialized = true;
1478
+
1479
+ }
1480
+
1481
+ }
1482
+
1362
1483
  //
1363
1484
 
1364
- const renderContext = this._renderContexts.get( scene, camera, renderTarget );
1485
+ const renderContext = this._renderContexts.get( renderTarget, this._mrt, this._callDepth );
1365
1486
 
1366
1487
  this._currentRenderContext = renderContext;
1367
1488
  this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;
1489
+ this._handleObjectFunction = this._renderObjectDirect;
1368
1490
 
1369
1491
  //
1370
1492
 
@@ -1382,20 +1504,68 @@ class Renderer {
1382
1504
 
1383
1505
  //
1384
1506
 
1385
- const coordinateSystem = this.coordinateSystem;
1507
+
1386
1508
  const xr = this.xr;
1387
1509
 
1388
- if ( camera.coordinateSystem !== coordinateSystem && xr.isPresenting === false ) {
1510
+ if ( xr.isPresenting === false ) {
1511
+
1512
+ let projectionMatrixNeedsUpdate = false;
1513
+
1514
+ // reversed depth
1515
+
1516
+ if ( this.reversedDepthBuffer === true && camera.reversedDepth !== true ) {
1517
+
1518
+ camera._reversedDepth = true;
1519
+
1520
+ if ( camera.isArrayCamera ) {
1521
+
1522
+ for ( const subCamera of camera.cameras ) {
1523
+
1524
+ subCamera._reversedDepth = true;
1525
+
1526
+ }
1527
+
1528
+ }
1529
+
1530
+ projectionMatrixNeedsUpdate = true;
1531
+
1532
+ }
1533
+
1534
+ // WebGPU/WebGL coordinate system
1535
+
1536
+ const coordinateSystem = this.coordinateSystem;
1537
+
1538
+ if ( camera.coordinateSystem !== coordinateSystem ) {
1539
+
1540
+ camera.coordinateSystem = coordinateSystem;
1541
+
1542
+ if ( camera.isArrayCamera ) {
1543
+
1544
+ for ( const subCamera of camera.cameras ) {
1545
+
1546
+ subCamera.coordinateSystem = coordinateSystem;
1547
+
1548
+ }
1549
+
1550
+ }
1551
+
1552
+ projectionMatrixNeedsUpdate = true;
1389
1553
 
1390
- camera.coordinateSystem = coordinateSystem;
1391
- camera.updateProjectionMatrix();
1554
+ }
1555
+
1556
+ // camera update
1557
+
1558
+ if ( projectionMatrixNeedsUpdate === true ) {
1559
+
1560
+ camera.updateProjectionMatrix();
1392
1561
 
1393
- if ( camera.isArrayCamera ) {
1562
+ if ( camera.isArrayCamera ) {
1394
1563
 
1395
- for ( const subCamera of camera.cameras ) {
1564
+ for ( const subCamera of camera.cameras ) {
1396
1565
 
1397
- subCamera.coordinateSystem = coordinateSystem;
1398
- subCamera.updateProjectionMatrix();
1566
+ subCamera.updateProjectionMatrix();
1567
+
1568
+ }
1399
1569
 
1400
1570
  }
1401
1571
 
@@ -1564,9 +1734,12 @@ class Renderer {
1564
1734
 
1565
1735
  this._currentRenderContext = previousRenderContext;
1566
1736
  this._currentRenderObjectFunction = previousRenderObjectFunction;
1737
+ this._handleObjectFunction = previousHandleObjectFunction;
1567
1738
 
1568
1739
  //
1569
1740
 
1741
+ this._callDepth --;
1742
+
1570
1743
  if ( frameBufferTarget !== null ) {
1571
1744
 
1572
1745
  this.setRenderTarget( outputRenderTarget, activeCubeFace, activeMipmapLevel );
@@ -1608,12 +1781,52 @@ class Renderer {
1608
1781
  */
1609
1782
  _renderOutput( renderTarget ) {
1610
1783
 
1611
- const quad = this._quad;
1784
+ const cacheKey = this._nodes.getOutputCacheKey();
1785
+
1786
+ let quadData = this._quadCache.get( renderTarget.texture );
1787
+ let quad;
1612
1788
 
1613
- if ( this._nodes.hasOutputChange( renderTarget.texture ) ) {
1789
+ if ( quadData === undefined ) {
1790
+
1791
+ quad = new QuadMesh( new NodeMaterial() );
1792
+ quad.name = 'Output Color Transform';
1793
+ quad.material.name = 'outputColorTransform';
1614
1794
 
1615
1795
  quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
1616
- quad.material.needsUpdate = true;
1796
+
1797
+ quadData = {
1798
+ quad,
1799
+ cacheKey
1800
+ };
1801
+
1802
+ this._quadCache.set( renderTarget.texture, quadData );
1803
+
1804
+ // dispose logic
1805
+
1806
+ const dispose = () => {
1807
+
1808
+ quad.material.dispose();
1809
+
1810
+ this._quadCache.delete( renderTarget.texture );
1811
+
1812
+ renderTarget.texture.removeEventListener( 'dispose', dispose );
1813
+
1814
+ };
1815
+
1816
+ renderTarget.texture.addEventListener( 'dispose', dispose );
1817
+
1818
+ } else {
1819
+
1820
+ quad = quadData.quad;
1821
+
1822
+ if ( quadData.cacheKey !== cacheKey ) {
1823
+
1824
+ quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
1825
+ quad.material.needsUpdate = true;
1826
+
1827
+ quadData.cacheKey = cacheKey;
1828
+
1829
+ }
1617
1830
 
1618
1831
  }
1619
1832
 
@@ -1640,7 +1853,7 @@ class Renderer {
1640
1853
  */
1641
1854
  getMaxAnisotropy() {
1642
1855
 
1643
- return this.backend.getMaxAnisotropy();
1856
+ return this.backend.capabilities.getMaxAnisotropy();
1644
1857
 
1645
1858
  }
1646
1859
 
@@ -1699,12 +1912,42 @@ class Renderer {
1699
1912
  * from the GPU to the CPU in context of compute shaders.
1700
1913
  *
1701
1914
  * @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.
1915
+ * @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
1916
+ * @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
1917
+ * @param {number} offset - The storage buffer attribute.
1918
+ * @param {number} count - The offset from which to start reading the
1919
+ * @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
1704
1920
  */
1705
- async getArrayBufferAsync( attribute ) {
1921
+ async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
1922
+
1923
+ // tally the memory for this readback buffer
1924
+ if ( target !== null && target.isReadbackBuffer ) {
1925
+
1926
+ if ( this.info.memoryMap.has( target ) === false ) {
1927
+
1928
+ this.info.createReadbackBuffer( target );
1929
+
1930
+ const disposeInfo = () => {
1706
1931
 
1707
- return await this.backend.getArrayBufferAsync( attribute );
1932
+ target.removeEventListener( 'dispose', disposeInfo );
1933
+
1934
+ this.info.destroyReadbackBuffer( target );
1935
+
1936
+ };
1937
+
1938
+ target.addEventListener( 'dispose', disposeInfo );
1939
+
1940
+ }
1941
+
1942
+ }
1943
+
1944
+ if ( offset % 4 !== 0 || ( count > 0 && count % 4 !== 0 ) ) {
1945
+
1946
+ throw new Error( 'THREE.Renderer: "getArrayBufferAsync()" offset and count must be a multiple of 4.' );
1947
+
1948
+ }
1949
+
1950
+ return await this.backend.getArrayBufferAsync( attribute, target, offset, count );
1708
1951
 
1709
1952
  }
1710
1953
 
@@ -1842,9 +2085,9 @@ class Renderer {
1842
2085
  /**
1843
2086
  * Defines the scissor rectangle.
1844
2087
  *
1845
- * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the box in logical pixel unit.
2088
+ * @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the box in logical pixel unit.
1846
2089
  * 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.
2090
+ * @param {number} y - The vertical coordinate for the upper left corner of the box in logical pixel unit.
1848
2091
  * @param {number} width - The width of the scissor box in logical pixel unit.
1849
2092
  * @param {number} height - The height of the scissor box in logical pixel unit.
1850
2093
  */
@@ -1895,8 +2138,8 @@ class Renderer {
1895
2138
  /**
1896
2139
  * Defines the viewport.
1897
2140
  *
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.
2141
+ * @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the viewport origin in logical pixel unit.
2142
+ * @param {number} y - The vertical coordinate for the upper left corner of the viewport origin in logical pixel unit.
1900
2143
  * @param {number} width - The width of the viewport in logical pixel unit.
1901
2144
  * @param {number} height - The height of the viewport in logical pixel unit.
1902
2145
  * @param {number} minDepth - The minimum depth value of the viewport. WebGPU only.
@@ -1962,7 +2205,7 @@ class Renderer {
1962
2205
  */
1963
2206
  getClearDepth() {
1964
2207
 
1965
- return this._clearDepth;
2208
+ return ( this.reversedDepthBuffer === true ) ? 1 - this._clearDepth : this._clearDepth;
1966
2209
 
1967
2210
  }
1968
2211
 
@@ -2040,7 +2283,7 @@ class Renderer {
2040
2283
 
2041
2284
  const renderTargetData = this._textures.get( renderTarget );
2042
2285
 
2043
- renderContext = this._renderContexts.getForClear( renderTarget );
2286
+ renderContext = this._renderContexts.get( renderTarget, null, - 1 ); // using - 1 for the call depth to get a render context for the clear operation
2044
2287
  renderContext.textures = renderTargetData.textures;
2045
2288
  renderContext.depthTexture = renderTargetData.depthTexture;
2046
2289
  renderContext.width = renderTargetData.width;
@@ -2049,10 +2292,18 @@ class Renderer {
2049
2292
  renderContext.depth = renderTarget.depthBuffer;
2050
2293
  renderContext.stencil = renderTarget.stencilBuffer;
2051
2294
  // #30329
2052
- renderContext.clearColorValue = this.backend.getClearColor();
2295
+ const color = this.backend.getClearColor();
2296
+ renderContext.clearColorValue.r = color.r;
2297
+ renderContext.clearColorValue.g = color.g;
2298
+ renderContext.clearColorValue.b = color.b;
2299
+ renderContext.clearColorValue.a = color.a;
2300
+ renderContext.clearDepthValue = this.getClearDepth();
2301
+ renderContext.clearStencilValue = this.getClearStencil();
2053
2302
  renderContext.activeCubeFace = this.getActiveCubeFace();
2054
2303
  renderContext.activeMipmapLevel = this.getActiveMipmapLevel();
2055
2304
 
2305
+ if ( renderTarget.depthBuffer === true ) renderTargetData.depthInitialized = true;
2306
+
2056
2307
  }
2057
2308
 
2058
2309
  this.backend.clear( color, depth, stencil, renderContext );
@@ -2266,7 +2517,11 @@ class Renderer {
2266
2517
  this._renderContexts.dispose();
2267
2518
  this._textures.dispose();
2268
2519
 
2269
- if ( this._frameBufferTarget !== null ) this._frameBufferTarget.dispose();
2520
+ for ( const canvasTarget of this._frameBufferTargets.keys() ) {
2521
+
2522
+ canvasTarget.dispose();
2523
+
2524
+ }
2270
2525
 
2271
2526
  Object.values( this.backend.timestampQueryPool ).forEach( queryPool => {
2272
2527
 
@@ -2312,7 +2567,7 @@ class Renderer {
2312
2567
  /**
2313
2568
  * Sets the output render target for the renderer.
2314
2569
  *
2315
- * @param {Object} renderTarget - The render target to set as the output target.
2570
+ * @param {?RenderTarget} renderTarget - The render target to set as the output target.
2316
2571
  */
2317
2572
  setOutputRenderTarget( renderTarget ) {
2318
2573
 
@@ -2360,6 +2615,7 @@ class Renderer {
2360
2615
  /**
2361
2616
  * Resets the renderer to the initial state before WebXR started.
2362
2617
  *
2618
+ * @private
2363
2619
  */
2364
2620
  _resetXRState() {
2365
2621
 
@@ -2367,8 +2623,11 @@ class Renderer {
2367
2623
  this.setOutputRenderTarget( null );
2368
2624
  this.setRenderTarget( null );
2369
2625
 
2370
- this._frameBufferTarget.dispose();
2371
- this._frameBufferTarget = null;
2626
+ for ( const canvasTarget of this._frameBufferTargets.keys() ) {
2627
+
2628
+ canvasTarget.dispose();
2629
+
2630
+ }
2372
2631
 
2373
2632
  }
2374
2633
 
@@ -2641,6 +2900,37 @@ class Renderer {
2641
2900
 
2642
2901
  }
2643
2902
 
2903
+ /**
2904
+ * Initializes the given render target.
2905
+ *
2906
+ * @param {RenderTarget} renderTarget - The render target to intialize.
2907
+ */
2908
+ initRenderTarget( renderTarget ) {
2909
+
2910
+ if ( this._initialized === false ) {
2911
+
2912
+ throw new Error( 'Renderer: .initRenderTarget() called before the backend is initialized. Use "await renderer.init();" before before using this method.' );
2913
+
2914
+ }
2915
+
2916
+ this._textures.updateRenderTarget( renderTarget );
2917
+
2918
+ const renderTargetData = this._textures.get( renderTarget );
2919
+
2920
+ const renderContext = this._renderContexts.get( renderTarget );
2921
+
2922
+ renderContext.textures = renderTargetData.textures;
2923
+ renderContext.depthTexture = renderTargetData.depthTexture;
2924
+ renderContext.width = renderTargetData.width;
2925
+ renderContext.height = renderTargetData.height;
2926
+ renderContext.renderTarget = renderTarget;
2927
+ renderContext.depth = renderTarget.depthBuffer;
2928
+ renderContext.stencil = renderTarget.stencilBuffer;
2929
+
2930
+ this.backend.initRenderTarget( renderContext );
2931
+
2932
+ }
2933
+
2644
2934
  /**
2645
2935
  * Copies the current bound framebuffer into the given texture.
2646
2936
  *
@@ -2750,6 +3040,7 @@ class Renderer {
2750
3040
  * Analyzes the given 3D object's hierarchy and builds render lists from the
2751
3041
  * processed hierarchy.
2752
3042
  *
3043
+ * @private
2753
3044
  * @param {Object3D} object - The 3D object to process (usually a scene).
2754
3045
  * @param {Camera} camera - The camera the object is rendered with.
2755
3046
  * @param {number} groupOrder - The group order is derived from the `renderOrder` of groups and is used to group 3D objects within groups.
@@ -2975,6 +3266,7 @@ class Renderer {
2975
3266
  * Retrieves shadow nodes for the given material. This is used to setup shadow passes.
2976
3267
  * The result is cached per material and updated when the material's version changes.
2977
3268
  *
3269
+ * @private
2978
3270
  * @param {Material} material
2979
3271
  * @returns {Object} - The shadow nodes for the material.
2980
3272
  */
@@ -2989,12 +3281,13 @@ class Renderer {
2989
3281
  const hasMap = material.map !== null;
2990
3282
  const hasColorNode = material.colorNode && material.colorNode.isNode;
2991
3283
  const hasCastShadowNode = material.castShadowNode && material.castShadowNode.isNode;
3284
+ const hasMaskNode = ( material.maskShadowNode && material.maskShadowNode.isNode ) || ( material.maskNode && material.maskNode.isNode );
2992
3285
 
2993
3286
  let positionNode = null;
2994
3287
  let colorNode = null;
2995
3288
  let depthNode = null;
2996
3289
 
2997
- if ( hasMap || hasColorNode || hasCastShadowNode ) {
3290
+ if ( hasMap || hasColorNode || hasCastShadowNode || hasMaskNode ) {
2998
3291
 
2999
3292
  let shadowRGB;
3000
3293
  let shadowAlpha;
@@ -3004,6 +3297,12 @@ class Renderer {
3004
3297
  shadowRGB = material.castShadowNode.rgb;
3005
3298
  shadowAlpha = material.castShadowNode.a;
3006
3299
 
3300
+ if ( this.shadowMap.transmitted !== true ) {
3301
+
3302
+ warnOnce( 'Renderer: `shadowMap.transmitted` needs to be set to `true` when using `material.castShadowNode`.' );
3303
+
3304
+ }
3305
+
3007
3306
  } else {
3008
3307
 
3009
3308
  shadowRGB = vec3( 0 );
@@ -3025,6 +3324,20 @@ class Renderer {
3025
3324
 
3026
3325
  colorNode = vec4( shadowRGB, shadowAlpha );
3027
3326
 
3327
+ if ( hasMaskNode ) {
3328
+
3329
+ const maskNode = material.maskShadowNode || material.maskNode;
3330
+
3331
+ colorNode = Fn( ( [ color ] ) => {
3332
+
3333
+ maskNode.not().discard();
3334
+
3335
+ return color;
3336
+
3337
+ } )( colorNode );
3338
+
3339
+ }
3340
+
3028
3341
  }
3029
3342
 
3030
3343
  if ( material.depthNode && material.depthNode.isNode ) {
@@ -3093,9 +3406,9 @@ class Renderer {
3093
3406
  materialOverride = true;
3094
3407
 
3095
3408
  // store original nodes
3096
- materialColorNode = scene.overrideMaterial.colorNode;
3097
- materialDepthNode = scene.overrideMaterial.depthNode;
3098
- materialPositionNode = scene.overrideMaterial.positionNode;
3409
+ materialColorNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.colorNode : null;
3410
+ materialDepthNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.depthNode : null;
3411
+ materialPositionNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.positionNode : null;
3099
3412
  materialSide = scene.overrideMaterial.side;
3100
3413
 
3101
3414
  if ( material.positionNode && material.positionNode.isNode ) {
@@ -3114,7 +3427,15 @@ class Renderer {
3114
3427
 
3115
3428
  const { colorNode, depthNode, positionNode } = this._getShadowNodes( material );
3116
3429
 
3117
- overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
3430
+ if ( this.shadowMap.type === VSMShadowMap ) {
3431
+
3432
+ overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;
3433
+
3434
+ } else {
3435
+
3436
+ overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : _shadowSide[ material.side ];
3437
+
3438
+ }
3118
3439
 
3119
3440
  if ( colorNode !== null ) overrideMaterial.colorNode = colorNode;
3120
3441
  if ( depthNode !== null ) overrideMaterial.depthNode = depthNode;
@@ -3161,6 +3482,24 @@ class Renderer {
3161
3482
 
3162
3483
  }
3163
3484
 
3485
+ /**
3486
+ * Checks if the given compatibility is supported by the selected backend.
3487
+ *
3488
+ * @param {string} name - The compatibility's name.
3489
+ * @return {boolean} Whether the compatibility is supported or not.
3490
+ */
3491
+ hasCompatibility( name ) {
3492
+
3493
+ if ( this._initialized === false ) {
3494
+
3495
+ throw new Error( 'Renderer: .hasCompatibility() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
3496
+
3497
+ }
3498
+
3499
+ return this.backend.hasCompatibility( name );
3500
+
3501
+ }
3502
+
3164
3503
  /**
3165
3504
  * This method represents the default `_handleObjectFunction` implementation which creates
3166
3505
  * a render object from the given data and performs the draw command with the selected backend.
@@ -3181,6 +3520,16 @@ class Renderer {
3181
3520
  renderObject.drawRange = object.geometry.drawRange;
3182
3521
  renderObject.group = group;
3183
3522
 
3523
+ if ( this._currentRenderBundle !== null ) {
3524
+
3525
+ const renderBundleData = this.backend.get( this._currentRenderBundle );
3526
+
3527
+ renderBundleData.renderObjects.push( renderObject );
3528
+
3529
+ renderObject.bundle = this._currentRenderBundle.bundleGroup;
3530
+
3531
+ }
3532
+
3184
3533
  //
3185
3534
 
3186
3535
  const needsRefresh = this._nodes.needsRefresh( renderObject );
@@ -3200,20 +3549,14 @@ class Renderer {
3200
3549
 
3201
3550
  //
3202
3551
 
3203
- if ( this._currentRenderBundle !== null ) {
3204
-
3205
- const renderBundleData = this.backend.get( this._currentRenderBundle );
3552
+ if ( this._pipelines.isReady( renderObject ) ) {
3206
3553
 
3207
- renderBundleData.renderObjects.push( renderObject );
3554
+ this.backend.draw( renderObject, this.info );
3208
3555
 
3209
- renderObject.bundle = this._currentRenderBundle.bundleGroup;
3556
+ if ( needsRefresh ) this._nodes.updateAfter( renderObject );
3210
3557
 
3211
3558
  }
3212
3559
 
3213
- this.backend.draw( renderObject, this.info );
3214
-
3215
- if ( needsRefresh ) this._nodes.updateAfter( renderObject );
3216
-
3217
3560
  }
3218
3561
 
3219
3562
  /**
@@ -3232,6 +3575,27 @@ class Renderer {
3232
3575
  */
3233
3576
  _createObjectPipeline( object, material, scene, camera, lightsNode, group, clippingContext, passId ) {
3234
3577
 
3578
+ // If in async compilation mode, queue the work for sequential execution
3579
+ if ( this._compilationPromises !== null ) {
3580
+
3581
+ // Store work items instead of promises - will be processed sequentially
3582
+ this._compilationPromises.push( {
3583
+ object,
3584
+ material,
3585
+ scene,
3586
+ camera,
3587
+ lightsNode,
3588
+ group,
3589
+ clippingContext,
3590
+ passId,
3591
+ renderContext: this._currentRenderContext
3592
+ } );
3593
+
3594
+ return;
3595
+
3596
+ }
3597
+
3598
+ // Sync path
3235
3599
  const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
3236
3600
  renderObject.drawRange = object.geometry.drawRange;
3237
3601
  renderObject.group = group;