@needle-tools/three 0.169.20-experimental.0 → 0.183.2-canary.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 (1051) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -6
  3. package/build/three.cjs +54184 -56703
  4. package/build/three.core.js +59506 -0
  5. package/build/three.core.min.js +6 -0
  6. package/build/three.module.js +11645 -73000
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +648 -0
  9. package/build/three.tsl.min.js +6 -0
  10. package/build/three.webgpu.js +53912 -51652
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +53888 -51806
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  15. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  16. package/examples/jsm/Addons.js +5 -15
  17. package/examples/jsm/animation/AnimationClipCreator.js +58 -6
  18. package/examples/jsm/animation/CCDIKSolver.js +152 -45
  19. package/examples/jsm/capabilities/WebGL.js +28 -29
  20. package/examples/jsm/capabilities/WebGPU.js +19 -17
  21. package/examples/jsm/controls/ArcballControls.js +474 -178
  22. package/examples/jsm/controls/DragControls.js +100 -58
  23. package/examples/jsm/controls/FirstPersonControls.js +116 -6
  24. package/examples/jsm/controls/FlyControls.js +50 -2
  25. package/examples/jsm/controls/MapControls.js +96 -8
  26. package/examples/jsm/controls/OrbitControls.js +496 -57
  27. package/examples/jsm/controls/PointerLockControls.js +115 -22
  28. package/examples/jsm/controls/TrackballControls.js +166 -14
  29. package/examples/jsm/controls/TransformControls.js +336 -26
  30. package/examples/jsm/csm/CSM.js +232 -18
  31. package/examples/jsm/csm/CSMFrustum.js +61 -4
  32. package/examples/jsm/csm/CSMHelper.js +50 -0
  33. package/examples/jsm/csm/CSMShader.js +13 -1
  34. package/examples/jsm/csm/CSMShadowNode.js +599 -0
  35. package/examples/jsm/curves/CurveExtras.js +303 -31
  36. package/examples/jsm/curves/NURBSCurve.js +91 -16
  37. package/examples/jsm/curves/NURBSSurface.js +52 -6
  38. package/examples/jsm/curves/NURBSUtils.js +102 -112
  39. package/examples/jsm/curves/NURBSVolume.js +24 -4
  40. package/examples/jsm/effects/AnaglyphEffect.js +134 -7
  41. package/examples/jsm/effects/AsciiEffect.js +69 -22
  42. package/examples/jsm/effects/OutlineEffect.js +61 -111
  43. package/examples/jsm/effects/ParallaxBarrierEffect.js +30 -0
  44. package/examples/jsm/effects/StereoEffect.js +31 -0
  45. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  46. package/examples/jsm/environments/DebugEnvironment.js +50 -0
  47. package/examples/jsm/environments/RoomEnvironment.js +83 -42
  48. package/examples/jsm/exporters/DRACOExporter.js +56 -14
  49. package/examples/jsm/exporters/EXRExporter.js +40 -9
  50. package/examples/jsm/exporters/GLTFExporter.js +502 -169
  51. package/examples/jsm/exporters/OBJExporter.js +21 -1
  52. package/examples/jsm/exporters/PLYExporter.js +44 -12
  53. package/examples/jsm/exporters/STLExporter.js +27 -5
  54. package/examples/jsm/exporters/USDZExporter.js +781 -291
  55. package/examples/jsm/geometries/BoxLineGeometry.js +23 -0
  56. package/examples/jsm/geometries/ConvexGeometry.js +19 -0
  57. package/examples/jsm/geometries/DecalGeometry.js +91 -30
  58. package/examples/jsm/geometries/ParametricFunctions.js +100 -0
  59. package/examples/jsm/geometries/ParametricGeometry.js +38 -5
  60. package/examples/jsm/geometries/RoundedBoxGeometry.js +68 -7
  61. package/examples/jsm/geometries/TeapotGeometry.js +23 -38
  62. package/examples/jsm/geometries/TextGeometry.js +48 -29
  63. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  64. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  65. package/examples/jsm/helpers/LightProbeHelper.js +36 -0
  66. package/examples/jsm/helpers/LightProbeHelperGPU.js +38 -1
  67. package/examples/jsm/helpers/OctreeHelper.js +36 -0
  68. package/examples/jsm/helpers/PositionalAudioHelper.js +60 -0
  69. package/examples/jsm/helpers/RapierHelper.js +59 -0
  70. package/examples/jsm/helpers/RectAreaLightHelper.js +36 -3
  71. package/examples/jsm/helpers/TextureHelper.js +28 -0
  72. package/examples/jsm/helpers/TextureHelperGPU.js +214 -0
  73. package/examples/jsm/helpers/VertexNormalsHelper.js +61 -2
  74. package/examples/jsm/helpers/VertexTangentsHelper.js +47 -2
  75. package/examples/jsm/helpers/ViewHelper.js +181 -9
  76. package/examples/jsm/inspector/Inspector.js +487 -0
  77. package/examples/jsm/inspector/RendererInspector.js +425 -0
  78. package/examples/jsm/inspector/tabs/Console.js +238 -0
  79. package/examples/jsm/inspector/tabs/Parameters.js +348 -0
  80. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  81. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  82. package/examples/jsm/inspector/ui/Graph.js +95 -0
  83. package/examples/jsm/inspector/ui/Item.js +170 -0
  84. package/examples/jsm/inspector/ui/List.js +75 -0
  85. package/examples/jsm/inspector/ui/Profiler.js +1975 -0
  86. package/examples/jsm/inspector/ui/Style.js +1613 -0
  87. package/examples/jsm/inspector/ui/Tab.js +233 -0
  88. package/examples/jsm/inspector/ui/Values.js +439 -0
  89. package/examples/jsm/inspector/ui/utils.js +56 -0
  90. package/examples/jsm/interactive/HTMLMesh.js +43 -12
  91. package/examples/jsm/interactive/InteractiveGroup.js +170 -52
  92. package/examples/jsm/interactive/SelectionBox.js +106 -9
  93. package/examples/jsm/interactive/SelectionHelper.js +76 -30
  94. package/examples/jsm/libs/demuxer_mp4.js +109 -0
  95. package/examples/jsm/libs/meshopt_decoder.module.js +76 -58
  96. package/examples/jsm/libs/motion-controllers.module.js +1 -1
  97. package/examples/jsm/lighting/TiledLighting.js +42 -0
  98. package/examples/jsm/lights/LightProbeGenerator.js +44 -7
  99. package/examples/jsm/lights/RectAreaLightTexturesLib.js +50 -14
  100. package/examples/jsm/lights/RectAreaLightUniformsLib.js +16 -0
  101. package/examples/jsm/lines/Line2.js +41 -4
  102. package/examples/jsm/lines/LineGeometry.js +80 -2
  103. package/examples/jsm/lines/LineMaterial.js +105 -5
  104. package/examples/jsm/lines/LineSegments2.js +54 -4
  105. package/examples/jsm/lines/LineSegmentsGeometry.js +65 -8
  106. package/examples/jsm/lines/Wireframe.js +41 -4
  107. package/examples/jsm/lines/WireframeGeometry2.js +27 -2
  108. package/examples/jsm/lines/webgpu/Line2.js +28 -2
  109. package/examples/jsm/lines/webgpu/LineSegments2.js +59 -24
  110. package/examples/jsm/lines/webgpu/Wireframe.js +86 -0
  111. package/examples/jsm/loaders/3DMLoader.js +78 -6
  112. package/examples/jsm/loaders/3MFLoader.js +148 -7
  113. package/examples/jsm/loaders/AMFLoader.js +34 -14
  114. package/examples/jsm/loaders/BVHLoader.js +59 -12
  115. package/examples/jsm/loaders/ColladaLoader.js +61 -4027
  116. package/examples/jsm/loaders/DDSLoader.js +68 -1
  117. package/examples/jsm/loaders/DRACOLoader.js +146 -22
  118. package/examples/jsm/loaders/EXRLoader.js +255 -34
  119. package/examples/jsm/loaders/FBXLoader.js +80 -42
  120. package/examples/jsm/loaders/FontLoader.js +83 -6
  121. package/examples/jsm/loaders/GCodeLoader.js +71 -14
  122. package/examples/jsm/loaders/GLTFLoader.js +381 -263
  123. package/examples/jsm/loaders/HDRCubeTextureLoader.js +52 -3
  124. package/examples/jsm/loaders/HDRLoader.js +485 -0
  125. package/examples/jsm/loaders/IESLoader.js +42 -0
  126. package/examples/jsm/loaders/KMZLoader.js +39 -6
  127. package/examples/jsm/loaders/KTX2Loader.js +124 -48
  128. package/examples/jsm/loaders/KTXLoader.js +31 -10
  129. package/examples/jsm/loaders/LDrawLoader.js +192 -145
  130. package/examples/jsm/loaders/LUT3dlLoader.js +47 -10
  131. package/examples/jsm/loaders/LUTCubeLoader.js +46 -9
  132. package/examples/jsm/loaders/LUTImageLoader.js +79 -38
  133. package/examples/jsm/loaders/LWOLoader.js +54 -59
  134. package/examples/jsm/loaders/LottieLoader.js +54 -1
  135. package/examples/jsm/loaders/MD2Loader.js +37 -1
  136. package/examples/jsm/loaders/MDDLoader.js +57 -12
  137. package/examples/jsm/loaders/MTLLoader.js +60 -35
  138. package/examples/jsm/loaders/MaterialXLoader.js +268 -34
  139. package/examples/jsm/loaders/NRRDLoader.js +40 -8
  140. package/examples/jsm/loaders/OBJLoader.js +51 -2
  141. package/examples/jsm/loaders/PCDLoader.js +173 -21
  142. package/examples/jsm/loaders/PDBLoader.js +41 -2
  143. package/examples/jsm/loaders/PLYLoader.js +70 -39
  144. package/examples/jsm/loaders/PVRLoader.js +25 -6
  145. package/examples/jsm/loaders/RGBELoader.js +6 -438
  146. package/examples/jsm/loaders/STLLoader.js +48 -38
  147. package/examples/jsm/loaders/SVGLoader.js +119 -25
  148. package/examples/jsm/loaders/TDSLoader.js +92 -74
  149. package/examples/jsm/loaders/TGALoader.js +23 -2
  150. package/examples/jsm/loaders/TIFFLoader.js +23 -0
  151. package/examples/jsm/loaders/TTFLoader.js +50 -3
  152. package/examples/jsm/loaders/USDLoader.js +279 -0
  153. package/examples/jsm/loaders/USDZLoader.js +4 -858
  154. package/examples/jsm/loaders/UltraHDRLoader.js +338 -166
  155. package/examples/jsm/loaders/VOXLoader.js +688 -87
  156. package/examples/jsm/loaders/VRMLLoader.js +121 -12
  157. package/examples/jsm/loaders/VTKLoader.js +77 -25
  158. package/examples/jsm/loaders/XYZLoader.js +36 -0
  159. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  160. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  161. package/examples/jsm/loaders/lwo/IFFParser.js +77 -77
  162. package/examples/jsm/loaders/usd/USDAParser.js +822 -0
  163. package/examples/jsm/loaders/usd/USDCParser.js +1852 -0
  164. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  165. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +183 -0
  166. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +154 -0
  167. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  168. package/examples/jsm/math/Capsule.js +91 -14
  169. package/examples/jsm/math/ColorConverter.js +22 -0
  170. package/examples/jsm/math/ColorSpaces.js +74 -2
  171. package/examples/jsm/math/ConvexHull.js +517 -93
  172. package/examples/jsm/math/ImprovedNoise.js +32 -15
  173. package/examples/jsm/math/Lut.js +113 -0
  174. package/examples/jsm/math/MeshSurfaceSampler.js +78 -13
  175. package/examples/jsm/math/OBB.js +141 -29
  176. package/examples/jsm/math/Octree.js +283 -7
  177. package/examples/jsm/math/SimplexNoise.js +68 -42
  178. package/examples/jsm/misc/ConvexObjectBreaker.js +45 -25
  179. package/examples/jsm/misc/GPUComputationRenderer.js +96 -20
  180. package/examples/jsm/misc/Gyroscope.js +12 -0
  181. package/examples/jsm/misc/MD2Character.js +117 -2
  182. package/examples/jsm/misc/MD2CharacterComplex.js +175 -11
  183. package/examples/jsm/misc/MorphAnimMesh.js +44 -0
  184. package/examples/jsm/misc/MorphBlendMesh.js +103 -0
  185. package/examples/jsm/misc/ProgressiveLightMap.js +100 -54
  186. package/examples/jsm/misc/ProgressiveLightMapGPU.js +322 -0
  187. package/examples/jsm/misc/RollerCoaster.js +57 -0
  188. package/examples/jsm/misc/TubePainter.js +437 -40
  189. package/examples/jsm/misc/Volume.js +123 -76
  190. package/examples/jsm/misc/VolumeSlice.js +95 -49
  191. package/examples/jsm/modifiers/CurveModifier.js +66 -38
  192. package/examples/jsm/modifiers/CurveModifierGPU.js +42 -19
  193. package/examples/jsm/modifiers/EdgeSplitModifier.js +20 -0
  194. package/examples/jsm/modifiers/SimplifyModifier.js +24 -10
  195. package/examples/jsm/modifiers/TessellateModifier.js +35 -2
  196. package/examples/jsm/objects/GroundedSkybox.js +25 -6
  197. package/examples/jsm/objects/Lensflare.js +94 -2
  198. package/examples/jsm/objects/LensflareMesh.js +64 -10
  199. package/examples/jsm/objects/MarchingCubes.js +90 -5
  200. package/examples/jsm/objects/Reflector.js +76 -2
  201. package/examples/jsm/objects/ReflectorForSSRPass.js +41 -0
  202. package/examples/jsm/objects/Refractor.js +62 -0
  203. package/examples/jsm/objects/ShadowMesh.js +54 -4
  204. package/examples/jsm/objects/Sky.js +106 -16
  205. package/examples/jsm/objects/SkyMesh.js +211 -38
  206. package/examples/jsm/objects/Water.js +49 -8
  207. package/examples/jsm/objects/Water2.js +49 -7
  208. package/examples/jsm/objects/Water2Mesh.js +50 -9
  209. package/examples/jsm/objects/WaterMesh.js +136 -43
  210. package/examples/jsm/physics/AmmoPhysics.js +60 -7
  211. package/examples/jsm/physics/JoltPhysics.js +65 -12
  212. package/examples/jsm/physics/RapierPhysics.js +217 -21
  213. package/examples/jsm/postprocessing/AfterimagePass.js +110 -29
  214. package/examples/jsm/postprocessing/BloomPass.js +128 -26
  215. package/examples/jsm/postprocessing/BokehPass.js +99 -22
  216. package/examples/jsm/postprocessing/ClearPass.js +54 -3
  217. package/examples/jsm/postprocessing/CubeTexturePass.js +82 -21
  218. package/examples/jsm/postprocessing/DotScreenPass.js +59 -10
  219. package/examples/jsm/postprocessing/EffectComposer.js +140 -6
  220. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  221. package/examples/jsm/postprocessing/FilmPass.js +54 -5
  222. package/examples/jsm/postprocessing/GTAOPass.js +202 -57
  223. package/examples/jsm/postprocessing/GlitchPass.js +86 -34
  224. package/examples/jsm/postprocessing/HalftonePass.js +65 -10
  225. package/examples/jsm/postprocessing/LUTPass.js +38 -8
  226. package/examples/jsm/postprocessing/MaskPass.js +91 -0
  227. package/examples/jsm/postprocessing/OutlinePass.js +272 -135
  228. package/examples/jsm/postprocessing/OutputPass.js +65 -14
  229. package/examples/jsm/postprocessing/Pass.js +100 -4
  230. package/examples/jsm/postprocessing/RenderPass.js +94 -0
  231. package/examples/jsm/postprocessing/RenderPixelatedPass.js +124 -45
  232. package/examples/jsm/postprocessing/RenderTransitionPass.js +120 -21
  233. package/examples/jsm/postprocessing/SAOPass.js +128 -55
  234. package/examples/jsm/postprocessing/SMAAPass.js +106 -75
  235. package/examples/jsm/postprocessing/SSAARenderPass.js +118 -35
  236. package/examples/jsm/postprocessing/SSAOPass.js +173 -60
  237. package/examples/jsm/postprocessing/SSRPass.js +268 -53
  238. package/examples/jsm/postprocessing/SavePass.js +69 -16
  239. package/examples/jsm/postprocessing/ShaderPass.js +65 -7
  240. package/examples/jsm/postprocessing/TAARenderPass.js +79 -24
  241. package/examples/jsm/postprocessing/TexturePass.js +72 -8
  242. package/examples/jsm/postprocessing/UnrealBloomPass.js +168 -59
  243. package/examples/jsm/renderers/CSS2DRenderer.js +98 -5
  244. package/examples/jsm/renderers/CSS3DRenderer.js +111 -7
  245. package/examples/jsm/renderers/Projector.js +288 -32
  246. package/examples/jsm/renderers/SVGRenderer.js +323 -61
  247. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +3 -1
  248. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  249. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +5 -1
  250. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +12 -5
  251. package/examples/jsm/shaders/AfterimageShader.js +8 -3
  252. package/examples/jsm/shaders/BasicShader.js +8 -1
  253. package/examples/jsm/shaders/BleachBypassShader.js +10 -3
  254. package/examples/jsm/shaders/BlendShader.js +8 -1
  255. package/examples/jsm/shaders/BokehShader.js +9 -3
  256. package/examples/jsm/shaders/BokehShader2.js +11 -4
  257. package/examples/jsm/shaders/BrightnessContrastShader.js +10 -4
  258. package/examples/jsm/shaders/ColorCorrectionShader.js +8 -1
  259. package/examples/jsm/shaders/ColorifyShader.js +8 -1
  260. package/examples/jsm/shaders/ConvolutionShader.js +9 -38
  261. package/examples/jsm/shaders/CopyShader.js +8 -1
  262. package/examples/jsm/shaders/DOFMipMapShader.js +10 -3
  263. package/examples/jsm/shaders/DepthLimitedBlurShader.js +10 -1
  264. package/examples/jsm/shaders/DigitalGlitch.js +10 -7
  265. package/examples/jsm/shaders/DotScreenShader.js +8 -3
  266. package/examples/jsm/shaders/ExposureShader.js +8 -1
  267. package/examples/jsm/shaders/FXAAShader.js +233 -221
  268. package/examples/jsm/shaders/FilmShader.js +13 -0
  269. package/examples/jsm/shaders/FocusShader.js +8 -3
  270. package/examples/jsm/shaders/FreiChenShader.js +10 -3
  271. package/examples/jsm/shaders/GTAOShader.js +55 -45
  272. package/examples/jsm/shaders/GammaCorrectionShader.js +11 -2
  273. package/examples/jsm/shaders/HalftoneShader.js +24 -4
  274. package/examples/jsm/shaders/HorizontalBlurShader.js +12 -3
  275. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +9 -2
  276. package/examples/jsm/shaders/HueSaturationShader.js +10 -3
  277. package/examples/jsm/shaders/KaleidoShader.js +11 -4
  278. package/examples/jsm/shaders/LuminosityHighPassShader.js +8 -4
  279. package/examples/jsm/shaders/LuminosityShader.js +8 -2
  280. package/examples/jsm/shaders/MirrorShader.js +10 -4
  281. package/examples/jsm/shaders/NormalMapShader.js +7 -2
  282. package/examples/jsm/shaders/OutputShader.js +19 -1
  283. package/examples/jsm/shaders/PoissonDenoiseShader.js +30 -17
  284. package/examples/jsm/shaders/RGBShiftShader.js +8 -1
  285. package/examples/jsm/shaders/SAOShader.js +27 -5
  286. package/examples/jsm/shaders/SMAAShader.js +24 -1
  287. package/examples/jsm/shaders/SSAOShader.js +37 -6
  288. package/examples/jsm/shaders/SSRShader.js +32 -6
  289. package/examples/jsm/shaders/SepiaShader.js +8 -3
  290. package/examples/jsm/shaders/SobelOperatorShader.js +9 -3
  291. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +13 -8
  292. package/examples/jsm/shaders/TechnicolorShader.js +10 -4
  293. package/examples/jsm/shaders/ToonShader.js +29 -6
  294. package/examples/jsm/shaders/TriangleBlurShader.js +9 -4
  295. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +19 -6
  296. package/examples/jsm/shaders/VelocityShader.js +8 -1
  297. package/examples/jsm/shaders/VerticalBlurShader.js +9 -2
  298. package/examples/jsm/shaders/VerticalTiltShiftShader.js +8 -1
  299. package/examples/jsm/shaders/VignetteShader.js +8 -3
  300. package/examples/jsm/shaders/VolumeShader.js +11 -2
  301. package/examples/jsm/shaders/WaterRefractionShader.js +11 -0
  302. package/examples/jsm/textures/FlakesTexture.js +14 -0
  303. package/examples/jsm/transpiler/AST.js +436 -31
  304. package/examples/jsm/transpiler/GLSLDecoder.js +380 -135
  305. package/examples/jsm/transpiler/Linker.js +327 -0
  306. package/examples/jsm/transpiler/ShaderToyDecoder.js +3 -1
  307. package/examples/jsm/transpiler/TSLEncoder.js +363 -97
  308. package/examples/jsm/transpiler/Transpiler.js +50 -1
  309. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  310. package/examples/jsm/transpiler/WGSLEncoder.js +839 -0
  311. package/examples/jsm/tsl/display/AfterImageNode.js +244 -0
  312. package/examples/jsm/tsl/display/AnaglyphPassNode.js +549 -0
  313. package/examples/jsm/tsl/display/AnamorphicNode.js +282 -0
  314. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  315. package/{src/nodes → examples/jsm/tsl}/display/BleachBypass.js +11 -4
  316. package/examples/jsm/tsl/display/BloomNode.js +534 -0
  317. package/examples/jsm/tsl/display/CRT.js +150 -0
  318. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  319. package/examples/jsm/tsl/display/DenoiseNode.js +334 -0
  320. package/examples/jsm/tsl/display/DepthOfFieldNode.js +554 -0
  321. package/examples/jsm/tsl/display/DotScreenNode.js +104 -0
  322. package/examples/jsm/tsl/display/FXAANode.js +365 -0
  323. package/examples/jsm/tsl/display/FilmNode.js +101 -0
  324. package/examples/jsm/tsl/display/GTAONode.js +571 -0
  325. package/examples/jsm/tsl/display/GaussianBlurNode.js +389 -0
  326. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  327. package/examples/jsm/tsl/display/LensflareNode.js +279 -0
  328. package/examples/jsm/tsl/display/Lut3DNode.js +109 -0
  329. package/examples/jsm/tsl/display/MotionBlur.js +33 -0
  330. package/examples/jsm/tsl/display/OutlineNode.js +762 -0
  331. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +89 -0
  332. package/examples/jsm/tsl/display/PixelationPassNode.js +335 -0
  333. package/examples/jsm/tsl/display/RGBShiftNode.js +96 -0
  334. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  335. package/examples/jsm/tsl/display/SMAANode.js +768 -0
  336. package/{src/nodes → examples/jsm/tsl}/display/SSAAPassNode.js +120 -49
  337. package/examples/jsm/tsl/display/SSGINode.js +642 -0
  338. package/examples/jsm/tsl/display/SSRNode.js +656 -0
  339. package/examples/jsm/tsl/display/SSSNode.js +490 -0
  340. package/{src/nodes → examples/jsm/tsl}/display/Sepia.js +9 -2
  341. package/examples/jsm/tsl/display/Shape.js +29 -0
  342. package/{src/nodes → examples/jsm/tsl}/display/SobelOperatorNode.js +61 -19
  343. package/examples/jsm/tsl/display/StereoCompositePassNode.js +192 -0
  344. package/{src/nodes → examples/jsm/tsl}/display/StereoPassNode.js +48 -12
  345. package/examples/jsm/tsl/display/TRAANode.js +726 -0
  346. package/examples/jsm/tsl/display/TransitionNode.js +141 -0
  347. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  348. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  349. package/examples/jsm/tsl/display/hashBlur.js +54 -0
  350. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  351. package/examples/jsm/tsl/lighting/TiledLightsNode.js +442 -0
  352. package/examples/jsm/tsl/math/Bayer.js +73 -0
  353. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  354. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  355. package/examples/jsm/tsl/utils/Raymarching.js +70 -0
  356. package/examples/jsm/utils/BufferGeometryUtils.js +91 -29
  357. package/examples/jsm/utils/CameraUtils.js +15 -6
  358. package/examples/jsm/utils/GeometryCompressionUtils.js +23 -30
  359. package/examples/jsm/utils/GeometryUtils.js +32 -27
  360. package/examples/jsm/utils/LDrawUtils.js +14 -5
  361. package/examples/jsm/utils/SceneOptimizer.js +458 -0
  362. package/examples/jsm/utils/SceneUtils.js +53 -3
  363. package/examples/jsm/utils/ShadowMapViewer.js +72 -33
  364. package/examples/jsm/utils/ShadowMapViewerGPU.js +61 -29
  365. package/examples/jsm/utils/SkeletonUtils.js +48 -0
  366. package/examples/jsm/utils/SortUtils.js +17 -5
  367. package/examples/jsm/utils/UVsDebug.js +12 -4
  368. package/examples/jsm/utils/{TextureUtils.js → WebGLTextureUtils.js} +16 -0
  369. package/examples/jsm/utils/{TextureUtilsGPU.js → WebGPUTextureUtils.js} +20 -2
  370. package/examples/jsm/utils/WorkerPool.js +67 -2
  371. package/examples/jsm/webxr/ARButton.js +19 -0
  372. package/examples/jsm/webxr/OculusHandModel.js +84 -0
  373. package/examples/jsm/webxr/OculusHandPointerModel.js +148 -22
  374. package/examples/jsm/webxr/Text2D.js +20 -6
  375. package/examples/jsm/webxr/VRButton.js +31 -0
  376. package/examples/jsm/webxr/XRButton.js +23 -0
  377. package/examples/jsm/webxr/XRControllerModelFactory.js +94 -3
  378. package/examples/jsm/webxr/XREstimatedLight.js +35 -4
  379. package/examples/jsm/webxr/XRHandMeshModel.js +37 -0
  380. package/examples/jsm/webxr/XRHandModelFactory.js +96 -6
  381. package/examples/jsm/webxr/XRHandPrimitiveModel.js +44 -0
  382. package/examples/jsm/webxr/XRPlanes.js +18 -0
  383. package/package.json +29 -37
  384. package/src/Three.Core.js +198 -0
  385. package/src/Three.Legacy.js +0 -21
  386. package/src/Three.TSL.js +641 -0
  387. package/src/Three.WebGPU.Nodes.js +14 -186
  388. package/src/Three.WebGPU.js +16 -186
  389. package/src/Three.js +2 -197
  390. package/src/animation/AnimationAction.js +263 -31
  391. package/src/animation/AnimationClip.js +162 -7
  392. package/src/animation/AnimationMixer.js +105 -15
  393. package/src/animation/AnimationObjectGroup.js +45 -21
  394. package/src/animation/AnimationUtils.js +163 -24
  395. package/src/animation/KeyframeTrack.js +191 -17
  396. package/src/animation/PropertyBinding.js +91 -16
  397. package/src/animation/PropertyMixer.js +72 -5
  398. package/src/animation/tracks/BooleanKeyframeTrack.js +33 -6
  399. package/src/animation/tracks/ColorKeyframeTrack.js +26 -5
  400. package/src/animation/tracks/NumberKeyframeTrack.js +26 -2
  401. package/src/animation/tracks/QuaternionKeyframeTrack.js +30 -1
  402. package/src/animation/tracks/StringKeyframeTrack.js +33 -2
  403. package/src/animation/tracks/VectorKeyframeTrack.js +26 -2
  404. package/src/audio/Audio.js +386 -8
  405. package/src/audio/AudioAnalyser.js +58 -1
  406. package/src/audio/AudioContext.js +15 -0
  407. package/src/audio/AudioListener.js +94 -13
  408. package/src/audio/PositionalAudio.js +107 -0
  409. package/src/cameras/ArrayCamera.js +37 -0
  410. package/src/cameras/Camera.js +61 -0
  411. package/src/cameras/CubeCamera.js +86 -0
  412. package/src/cameras/OrthographicCamera.js +110 -1
  413. package/src/cameras/PerspectiveCamera.js +174 -35
  414. package/src/cameras/StereoCamera.js +48 -2
  415. package/src/constants.js +1546 -11
  416. package/src/core/BufferAttribute.js +417 -3
  417. package/src/core/BufferGeometry.js +407 -22
  418. package/src/core/Clock.js +69 -8
  419. package/src/core/EventDispatcher.js +52 -8
  420. package/src/core/GLBufferAttribute.js +113 -2
  421. package/src/core/InstancedBufferAttribute.js +29 -0
  422. package/src/core/InstancedBufferGeometry.js +20 -0
  423. package/src/core/InstancedInterleavedBuffer.js +26 -0
  424. package/src/core/InterleavedBuffer.js +141 -7
  425. package/src/core/InterleavedBufferAttribute.js +200 -2
  426. package/src/core/Layers.js +71 -10
  427. package/src/core/Object3D.js +673 -26
  428. package/src/core/Raycaster.js +136 -2
  429. package/src/core/RenderTarget.js +256 -27
  430. package/src/core/RenderTarget3D.js +48 -0
  431. package/src/core/Timer.js +184 -0
  432. package/src/core/Uniform.js +29 -0
  433. package/src/core/UniformsGroup.js +84 -2
  434. package/src/extras/Controls.js +89 -1
  435. package/src/extras/DataUtils.js +50 -9
  436. package/src/extras/Earcut.js +18 -779
  437. package/src/extras/ImageUtils.js +22 -14
  438. package/src/extras/PMREMGenerator.js +316 -67
  439. package/src/extras/ShapeUtils.js +24 -2
  440. package/src/extras/TextureUtils.js +101 -15
  441. package/src/extras/core/Curve.js +156 -55
  442. package/src/extras/core/CurvePath.js +63 -22
  443. package/src/extras/core/Interpolations.js +34 -2
  444. package/src/extras/core/Path.js +134 -1
  445. package/src/extras/core/Shape.js +66 -3
  446. package/src/extras/core/ShapePath.js +80 -4
  447. package/src/extras/curves/ArcCurve.js +22 -0
  448. package/src/extras/curves/CatmullRomCurve3.js +89 -18
  449. package/src/extras/curves/CubicBezierCurve.js +67 -0
  450. package/src/extras/curves/CubicBezierCurve3.js +50 -0
  451. package/src/extras/curves/EllipseCurve.js +102 -0
  452. package/src/extras/curves/LineCurve.js +36 -0
  453. package/src/extras/curves/LineCurve3.js +36 -0
  454. package/src/extras/curves/QuadraticBezierCurve.js +59 -0
  455. package/src/extras/curves/QuadraticBezierCurve3.js +43 -0
  456. package/src/extras/curves/SplineCurve.js +48 -0
  457. package/src/extras/lib/earcut.js +685 -0
  458. package/src/geometries/BoxGeometry.js +39 -0
  459. package/src/geometries/CapsuleGeometry.js +196 -11
  460. package/src/geometries/CircleGeometry.js +41 -0
  461. package/src/geometries/ConeGeometry.js +39 -0
  462. package/src/geometries/CylinderGeometry.js +42 -2
  463. package/src/geometries/DodecahedronGeometry.js +33 -0
  464. package/src/geometries/EdgesGeometry.js +30 -2
  465. package/src/geometries/ExtrudeGeometry.js +148 -52
  466. package/src/geometries/IcosahedronGeometry.js +33 -0
  467. package/src/geometries/LatheGeometry.js +44 -3
  468. package/src/geometries/OctahedronGeometry.js +33 -0
  469. package/src/geometries/PlaneGeometry.js +35 -0
  470. package/src/geometries/PolyhedronGeometry.js +30 -1
  471. package/src/geometries/RingGeometry.js +37 -0
  472. package/src/geometries/ShapeGeometry.js +38 -0
  473. package/src/geometries/SphereGeometry.js +38 -0
  474. package/src/geometries/TetrahedronGeometry.js +33 -0
  475. package/src/geometries/TorusGeometry.js +44 -3
  476. package/src/geometries/TorusKnotGeometry.js +39 -0
  477. package/src/geometries/TubeGeometry.js +50 -0
  478. package/src/geometries/WireframeGeometry.js +32 -0
  479. package/src/helpers/ArrowHelper.js +62 -5
  480. package/src/helpers/AxesHelper.js +28 -0
  481. package/src/helpers/Box3Helper.js +28 -0
  482. package/src/helpers/BoxHelper.js +43 -7
  483. package/src/helpers/CameraHelper.js +103 -27
  484. package/src/helpers/DirectionalLightHelper.js +55 -0
  485. package/src/helpers/GridHelper.js +26 -0
  486. package/src/helpers/HemisphereLightHelper.js +42 -0
  487. package/src/helpers/PlaneHelper.js +33 -0
  488. package/src/helpers/PointLightHelper.js +43 -24
  489. package/src/helpers/PolarGridHelper.js +30 -0
  490. package/src/helpers/SkeletonHelper.js +73 -7
  491. package/src/helpers/SpotLightHelper.js +43 -0
  492. package/src/lights/AmbientLight.js +25 -0
  493. package/src/lights/DirectionalLight.js +70 -0
  494. package/src/lights/DirectionalLightShadow.js +15 -0
  495. package/src/lights/HemisphereLight.js +42 -0
  496. package/src/lights/Light.js +37 -11
  497. package/src/lights/LightProbe.js +37 -9
  498. package/src/lights/LightShadow.js +202 -7
  499. package/src/lights/PointLight.js +74 -0
  500. package/src/lights/PointLightShadow.js +15 -80
  501. package/src/lights/RectAreaLight.js +59 -0
  502. package/src/lights/SpotLight.js +124 -1
  503. package/src/lights/SpotLightShadow.js +33 -3
  504. package/src/lights/webgpu/IESSpotLight.js +22 -0
  505. package/src/lights/webgpu/ProjectorLight.js +46 -0
  506. package/src/loaders/AnimationLoader.js +34 -2
  507. package/src/loaders/AudioLoader.js +34 -2
  508. package/src/loaders/BufferGeometryLoader.js +38 -13
  509. package/src/loaders/Cache.js +75 -2
  510. package/src/loaders/CompressedTextureLoader.js +36 -3
  511. package/src/loaders/CubeTextureLoader.js +45 -0
  512. package/src/loaders/DataTextureLoader.js +45 -4
  513. package/src/loaders/FileLoader.js +85 -5
  514. package/src/loaders/ImageBitmapLoader.js +113 -11
  515. package/src/loaders/ImageLoader.js +85 -8
  516. package/src/loaders/Loader.js +150 -0
  517. package/src/loaders/LoaderUtils.js +18 -36
  518. package/src/loaders/LoadingManager.js +187 -0
  519. package/src/loaders/MaterialLoader.js +62 -3
  520. package/src/loaders/ObjectLoader.js +131 -31
  521. package/src/loaders/TextureLoader.js +33 -0
  522. package/src/loaders/nodes/NodeLoader.js +68 -4
  523. package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
  524. package/src/loaders/nodes/NodeObjectLoader.js +61 -0
  525. package/src/materials/LineBasicMaterial.js +74 -1
  526. package/src/materials/LineDashedMaterial.js +52 -1
  527. package/src/materials/Material.js +502 -8
  528. package/src/materials/MeshBasicMaterial.js +168 -2
  529. package/src/materials/MeshDepthMaterial.js +94 -0
  530. package/src/materials/MeshDistanceMaterial.js +76 -0
  531. package/src/materials/MeshLambertMaterial.js +283 -0
  532. package/src/materials/MeshMatcapMaterial.js +164 -0
  533. package/src/materials/MeshNormalMaterial.js +114 -0
  534. package/src/materials/MeshPhongMaterial.js +298 -0
  535. package/src/materials/MeshPhysicalMaterial.js +296 -4
  536. package/src/materials/MeshStandardMaterial.js +300 -2
  537. package/src/materials/MeshToonMaterial.js +219 -0
  538. package/src/materials/PointsMaterial.js +89 -0
  539. package/src/materials/RawShaderMaterial.js +25 -0
  540. package/src/materials/ShaderMaterial.js +234 -6
  541. package/src/materials/ShadowMaterial.js +54 -0
  542. package/src/materials/SpriteMaterial.js +82 -0
  543. package/src/materials/nodes/Line2NodeMaterial.js +158 -53
  544. package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
  545. package/src/materials/nodes/LineDashedNodeMaterial.js +81 -6
  546. package/src/materials/nodes/MeshBasicNodeMaterial.js +59 -2
  547. package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
  548. package/src/materials/nodes/MeshMatcapNodeMaterial.js +23 -3
  549. package/src/materials/nodes/MeshNormalNodeMaterial.js +27 -4
  550. package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
  551. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +276 -3
  552. package/src/materials/nodes/MeshSSSNodeMaterial.js +98 -10
  553. package/src/materials/nodes/MeshStandardNodeMaterial.js +83 -4
  554. package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
  555. package/src/materials/nodes/NodeMaterial.js +789 -74
  556. package/src/materials/nodes/NodeMaterials.js +0 -1
  557. package/src/materials/nodes/PointsNodeMaterial.js +180 -11
  558. package/src/materials/nodes/ShadowNodeMaterial.js +38 -0
  559. package/src/materials/nodes/SpriteNodeMaterial.js +86 -23
  560. package/src/materials/nodes/VolumeNodeMaterial.js +57 -84
  561. package/src/materials/nodes/manager/NodeMaterialObserver.js +329 -12
  562. package/src/math/Box2.js +177 -0
  563. package/src/math/Box3.js +271 -0
  564. package/src/math/Color.js +355 -11
  565. package/src/math/ColorManagement.js +158 -92
  566. package/src/math/Cylindrical.js +65 -6
  567. package/src/math/Euler.js +139 -5
  568. package/src/math/Frustum.js +108 -9
  569. package/src/math/FrustumArray.js +258 -0
  570. package/src/math/Interpolant.js +87 -8
  571. package/src/math/Line3.js +221 -2
  572. package/src/math/MathUtils.js +408 -20
  573. package/src/math/Matrix2.js +70 -0
  574. package/src/math/Matrix3.js +229 -4
  575. package/src/math/Matrix4.js +489 -94
  576. package/src/math/Plane.js +164 -2
  577. package/src/math/Quaternion.js +322 -90
  578. package/src/math/Ray.js +162 -0
  579. package/src/math/Sphere.js +175 -0
  580. package/src/math/Spherical.js +73 -11
  581. package/src/math/SphericalHarmonics3.js +112 -14
  582. package/src/math/Triangle.js +206 -2
  583. package/src/math/Vector2.js +396 -10
  584. package/src/math/Vector3.js +550 -15
  585. package/src/math/Vector4.js +415 -9
  586. package/src/math/interpolants/BezierInterpolant.js +108 -0
  587. package/src/math/interpolants/CubicInterpolant.js +10 -1
  588. package/src/math/interpolants/DiscreteInterpolant.js +10 -2
  589. package/src/math/interpolants/LinearInterpolant.js +13 -0
  590. package/src/math/interpolants/QuaternionLinearInterpolant.js +10 -1
  591. package/src/nodes/Nodes.js +91 -88
  592. package/src/nodes/TSL.js +32 -38
  593. package/src/nodes/accessors/AccessorsUtils.js +37 -9
  594. package/src/nodes/accessors/Arrays.js +68 -0
  595. package/src/nodes/accessors/BatchNode.js +49 -14
  596. package/src/nodes/accessors/Bitangent.js +82 -13
  597. package/src/nodes/accessors/BufferAttributeNode.js +269 -8
  598. package/src/nodes/accessors/BufferNode.js +91 -2
  599. package/src/nodes/accessors/BuiltinNode.js +63 -0
  600. package/src/nodes/accessors/Camera.js +400 -10
  601. package/src/nodes/accessors/ClippingNode.js +149 -45
  602. package/src/nodes/accessors/CubeTextureNode.js +137 -7
  603. package/src/nodes/accessors/InstanceNode.js +245 -40
  604. package/src/nodes/accessors/InstancedMeshNode.js +50 -0
  605. package/src/nodes/accessors/Lights.js +88 -0
  606. package/src/nodes/accessors/MaterialNode.js +355 -13
  607. package/src/nodes/accessors/MaterialProperties.js +57 -1
  608. package/src/nodes/accessors/MaterialReferenceNode.js +52 -14
  609. package/src/nodes/accessors/ModelNode.js +117 -5
  610. package/src/nodes/accessors/ModelViewProjectionNode.js +10 -39
  611. package/src/nodes/accessors/MorphNode.js +73 -26
  612. package/src/nodes/accessors/Normal.js +174 -19
  613. package/src/nodes/accessors/Object3DNode.js +146 -12
  614. package/src/nodes/accessors/PointUVNode.js +25 -0
  615. package/src/nodes/accessors/Position.js +119 -7
  616. package/src/nodes/accessors/ReferenceBaseNode.js +190 -4
  617. package/src/nodes/accessors/ReferenceNode.js +223 -8
  618. package/src/nodes/accessors/ReflectVector.js +29 -3
  619. package/src/nodes/accessors/RendererReferenceNode.js +45 -2
  620. package/src/nodes/accessors/SceneProperties.js +53 -0
  621. package/src/nodes/accessors/SkinningNode.js +180 -43
  622. package/src/nodes/accessors/StorageBufferNode.js +278 -26
  623. package/src/nodes/accessors/StorageTextureNode.js +205 -12
  624. package/src/nodes/accessors/Tangent.js +48 -10
  625. package/src/nodes/accessors/TangentUtils.js +46 -0
  626. package/src/nodes/accessors/Texture3DNode.js +104 -11
  627. package/src/nodes/accessors/TextureBicubic.js +31 -4
  628. package/src/nodes/accessors/TextureNode.js +564 -52
  629. package/src/nodes/accessors/TextureSizeNode.js +42 -1
  630. package/src/nodes/accessors/UV.js +9 -1
  631. package/src/nodes/accessors/UniformArrayNode.js +226 -34
  632. package/src/nodes/accessors/UserDataNode.js +46 -2
  633. package/src/nodes/accessors/VelocityNode.js +93 -3
  634. package/src/nodes/accessors/VertexColorNode.js +39 -4
  635. package/src/nodes/code/CodeNode.js +101 -8
  636. package/src/nodes/code/ExpressionNode.js +29 -2
  637. package/src/nodes/code/FunctionCallNode.js +98 -10
  638. package/src/nodes/code/FunctionNode.js +69 -2
  639. package/src/nodes/core/ArrayNode.js +174 -0
  640. package/src/nodes/core/AssignNode.js +80 -9
  641. package/src/nodes/core/AttributeNode.js +47 -4
  642. package/src/nodes/core/BypassNode.js +47 -3
  643. package/src/nodes/core/ConstNode.js +32 -0
  644. package/src/nodes/core/ContextNode.js +220 -14
  645. package/src/nodes/core/IndexNode.js +72 -7
  646. package/src/nodes/core/InputNode.js +50 -1
  647. package/src/nodes/core/InspectorNode.js +128 -0
  648. package/src/nodes/core/IsolateNode.js +133 -0
  649. package/src/nodes/core/LightingModel.js +65 -5
  650. package/src/nodes/core/MRTNode.js +113 -2
  651. package/src/nodes/core/Node.js +595 -36
  652. package/src/nodes/core/NodeAttribute.js +38 -0
  653. package/src/nodes/core/NodeBuilder.js +1840 -121
  654. package/src/nodes/core/NodeCache.js +41 -2
  655. package/src/nodes/core/NodeCode.js +31 -0
  656. package/src/nodes/core/NodeError.js +28 -0
  657. package/src/nodes/core/NodeFrame.js +153 -24
  658. package/src/nodes/core/NodeFunction.js +48 -1
  659. package/src/nodes/core/NodeFunctionInput.js +44 -0
  660. package/src/nodes/core/NodeParser.js +13 -1
  661. package/src/nodes/core/NodeUniform.js +53 -1
  662. package/src/nodes/core/NodeUtils.js +201 -51
  663. package/src/nodes/core/NodeVar.js +47 -1
  664. package/src/nodes/core/NodeVarying.js +47 -1
  665. package/src/nodes/core/OutputStructNode.js +54 -12
  666. package/src/nodes/core/ParameterNode.js +60 -2
  667. package/src/nodes/core/PropertyNode.js +286 -7
  668. package/src/nodes/core/StackNode.js +337 -20
  669. package/src/nodes/core/StackTrace.js +139 -0
  670. package/src/nodes/core/StructNode.js +134 -0
  671. package/src/nodes/core/StructType.js +13 -0
  672. package/src/nodes/core/StructTypeNode.js +126 -6
  673. package/src/nodes/core/SubBuildNode.js +89 -0
  674. package/src/nodes/core/TempNode.js +31 -5
  675. package/src/nodes/core/UniformGroupNode.js +85 -7
  676. package/src/nodes/core/UniformNode.js +163 -16
  677. package/src/nodes/core/VarNode.js +317 -10
  678. package/src/nodes/core/VaryingNode.js +115 -13
  679. package/src/nodes/core/constants.js +40 -0
  680. package/src/nodes/display/BlendModes.js +171 -0
  681. package/src/nodes/display/BumpMapNode.js +38 -2
  682. package/src/nodes/display/ColorAdjustment.js +118 -6
  683. package/src/nodes/display/ColorSpaceFunctions.js +22 -6
  684. package/src/nodes/display/ColorSpaceNode.js +97 -47
  685. package/src/nodes/display/FrontFacingNode.js +64 -7
  686. package/src/nodes/display/NormalMapNode.js +101 -54
  687. package/src/nodes/display/PassNode.js +690 -33
  688. package/src/nodes/display/RenderOutputNode.js +94 -4
  689. package/src/nodes/display/ScreenNode.js +138 -27
  690. package/src/nodes/display/ToneMappingFunctions.js +62 -10
  691. package/src/nodes/display/ToneMappingNode.js +88 -8
  692. package/src/nodes/display/ToonOutlinePassNode.js +84 -4
  693. package/src/nodes/display/ViewportDepthNode.js +227 -10
  694. package/src/nodes/display/ViewportDepthTextureNode.js +39 -5
  695. package/src/nodes/display/ViewportSharedTextureNode.js +35 -1
  696. package/src/nodes/display/ViewportTextureNode.js +171 -7
  697. package/src/nodes/fog/Fog.js +97 -0
  698. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  699. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  700. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  701. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  702. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  703. package/src/nodes/functions/BSDF/LTC.js +45 -1
  704. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  705. package/src/nodes/functions/BasicLightingModel.js +28 -6
  706. package/src/nodes/functions/PhongLightingModel.js +36 -6
  707. package/src/nodes/functions/PhysicalLightingModel.js +336 -91
  708. package/src/nodes/functions/ShadowMaskModel.js +30 -3
  709. package/src/nodes/functions/ToonLightingModel.js +21 -2
  710. package/src/nodes/functions/VolumetricLightingModel.js +183 -0
  711. package/src/nodes/functions/material/getAlphaHashThreshold.js +68 -0
  712. package/src/nodes/functions/material/getGeometryRoughness.js +10 -4
  713. package/src/nodes/functions/material/getParallaxCorrectNormal.js +37 -0
  714. package/src/nodes/geometry/RangeNode.js +97 -8
  715. package/src/nodes/gpgpu/AtomicFunctionNode.js +198 -23
  716. package/src/nodes/gpgpu/BarrierNode.js +52 -3
  717. package/src/nodes/gpgpu/ComputeBuiltinNode.js +135 -6
  718. package/src/nodes/gpgpu/ComputeNode.js +212 -16
  719. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  720. package/src/nodes/gpgpu/WorkgroupInfoNode.js +143 -9
  721. package/src/nodes/lighting/AONode.js +18 -0
  722. package/src/nodes/lighting/AmbientLightNode.js +10 -0
  723. package/src/nodes/lighting/AnalyticLightNode.js +186 -399
  724. package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
  725. package/src/nodes/lighting/BasicLightMapNode.js +17 -0
  726. package/src/nodes/lighting/DirectionalLightNode.js +12 -11
  727. package/src/nodes/lighting/EnvironmentNode.js +59 -19
  728. package/src/nodes/lighting/HemisphereLightNode.js +33 -2
  729. package/src/nodes/lighting/IESSpotLightNode.js +13 -1
  730. package/src/nodes/lighting/IrradianceNode.js +17 -0
  731. package/src/nodes/lighting/LightProbeNode.js +20 -0
  732. package/src/nodes/lighting/LightUtils.js +11 -3
  733. package/src/nodes/lighting/LightingContextNode.js +52 -4
  734. package/src/nodes/lighting/LightingNode.js +15 -6
  735. package/src/nodes/lighting/LightsNode.js +238 -35
  736. package/src/nodes/lighting/PointLightNode.js +60 -25
  737. package/src/nodes/lighting/PointShadowNode.js +325 -0
  738. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  739. package/src/nodes/lighting/RectAreaLightNode.js +50 -14
  740. package/src/nodes/lighting/ShadowBaseNode.js +81 -0
  741. package/src/nodes/lighting/ShadowFilterNode.js +264 -0
  742. package/src/nodes/lighting/ShadowNode.js +867 -0
  743. package/src/nodes/lighting/SpotLightNode.js +99 -18
  744. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  745. package/src/nodes/materialx/lib/mx_noise.js +166 -2
  746. package/src/nodes/math/BitcastNode.js +156 -0
  747. package/src/nodes/math/BitcountNode.js +433 -0
  748. package/src/nodes/math/ConditionalNode.js +110 -21
  749. package/src/nodes/math/Hash.js +8 -0
  750. package/src/nodes/math/MathNode.js +820 -97
  751. package/src/nodes/math/MathUtils.js +47 -1
  752. package/src/nodes/math/OperatorNode.js +517 -84
  753. package/src/nodes/math/PackFloatNode.js +98 -0
  754. package/src/nodes/math/TriNoise3D.js +17 -7
  755. package/src/nodes/math/UnpackFloatNode.js +96 -0
  756. package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
  757. package/src/nodes/parsers/GLSLNodeParser.js +11 -0
  758. package/src/nodes/pmrem/PMREMNode.js +180 -23
  759. package/src/nodes/pmrem/PMREMUtils.js +114 -5
  760. package/src/nodes/procedural/Checker.js +8 -0
  761. package/src/nodes/shapes/Shapes.js +33 -0
  762. package/src/nodes/tsl/TSLBase.js +10 -4
  763. package/src/nodes/tsl/TSLCore.js +732 -160
  764. package/src/nodes/utils/ArrayElementNode.js +55 -4
  765. package/src/nodes/utils/ConvertNode.js +31 -0
  766. package/src/nodes/utils/CubeMapNode.js +79 -2
  767. package/src/nodes/utils/DebugNode.js +83 -0
  768. package/src/nodes/utils/Discard.js +18 -2
  769. package/src/nodes/utils/EquirectUV.js +27 -0
  770. package/src/nodes/utils/EventNode.js +118 -0
  771. package/src/nodes/utils/FlipNode.js +38 -0
  772. package/src/nodes/utils/FunctionOverloadingNode.js +91 -22
  773. package/src/nodes/utils/JoinNode.js +57 -4
  774. package/src/nodes/utils/LoopNode.js +193 -55
  775. package/src/nodes/utils/MatcapUV.js +22 -0
  776. package/src/nodes/utils/MaxMipLevelNode.js +49 -1
  777. package/src/nodes/utils/MemberNode.js +120 -0
  778. package/src/nodes/utils/Oscillators.js +41 -0
  779. package/src/nodes/utils/Packing.js +30 -1
  780. package/src/nodes/utils/PostProcessingUtils.js +154 -0
  781. package/src/nodes/utils/RTTNode.js +165 -9
  782. package/src/nodes/utils/ReflectorNode.js +407 -21
  783. package/src/nodes/utils/RemapNode.js +81 -2
  784. package/src/nodes/utils/RotateNode.js +41 -1
  785. package/src/nodes/utils/SampleNode.js +91 -0
  786. package/src/nodes/utils/SetNode.js +44 -1
  787. package/src/nodes/utils/SplitNode.js +66 -3
  788. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  789. package/src/nodes/utils/SpriteUtils.js +16 -0
  790. package/src/nodes/utils/StorageArrayElementNode.js +56 -3
  791. package/src/nodes/utils/Timer.js +26 -0
  792. package/src/nodes/utils/TriplanarTextures.js +65 -0
  793. package/src/nodes/utils/UVUtils.js +48 -0
  794. package/src/nodes/utils/ViewportUtils.js +12 -0
  795. package/src/objects/BatchedMesh.js +798 -309
  796. package/src/objects/Bone.js +24 -0
  797. package/src/objects/ClippingGroup.js +68 -0
  798. package/src/objects/Group.js +24 -0
  799. package/src/objects/InstancedMesh.js +131 -2
  800. package/src/objects/LOD.js +99 -5
  801. package/src/objects/Line.js +90 -7
  802. package/src/objects/LineLoop.js +20 -0
  803. package/src/objects/LineSegments.js +20 -1
  804. package/src/objects/Mesh.js +84 -0
  805. package/src/objects/Points.js +60 -0
  806. package/src/objects/Skeleton.js +120 -5
  807. package/src/objects/SkinnedMesh.js +102 -6
  808. package/src/objects/Sprite.js +65 -1
  809. package/src/renderers/WebGL3DRenderTarget.js +26 -0
  810. package/src/renderers/WebGLArrayRenderTarget.js +26 -0
  811. package/src/renderers/WebGLCubeRenderTarget.js +41 -5
  812. package/src/renderers/WebGLRenderTarget.js +19 -0
  813. package/src/renderers/WebGLRenderer.js +1016 -278
  814. package/src/renderers/common/Animation.js +123 -14
  815. package/src/renderers/common/Attributes.js +41 -1
  816. package/src/renderers/common/Backend.js +623 -44
  817. package/src/renderers/common/Background.js +99 -16
  818. package/src/renderers/common/BindGroup.js +37 -2
  819. package/src/renderers/common/Binding.js +46 -0
  820. package/src/renderers/common/Bindings.js +211 -20
  821. package/src/renderers/common/BlendMode.js +143 -0
  822. package/src/renderers/common/Buffer.js +89 -0
  823. package/src/renderers/common/BufferUtils.js +25 -0
  824. package/src/renderers/common/BundleGroup.js +57 -0
  825. package/src/renderers/common/CanvasTarget.js +341 -0
  826. package/src/renderers/common/ChainMap.js +73 -10
  827. package/src/renderers/common/ClippingContext.js +172 -87
  828. package/src/renderers/common/Color4.js +40 -0
  829. package/src/renderers/common/ComputePipeline.js +24 -0
  830. package/src/renderers/common/Constants.js +2 -1
  831. package/src/renderers/common/CubeRenderTarget.js +77 -7
  832. package/src/renderers/common/DataMap.js +37 -1
  833. package/src/renderers/common/Geometries.js +163 -14
  834. package/src/renderers/common/IndirectStorageBufferAttribute.js +38 -0
  835. package/src/renderers/common/Info.js +81 -36
  836. package/src/renderers/common/InspectorBase.js +146 -0
  837. package/src/renderers/common/Lighting.js +57 -0
  838. package/src/renderers/common/Pipeline.js +22 -0
  839. package/src/renderers/common/Pipelines.js +150 -7
  840. package/src/renderers/common/PostProcessing.js +22 -84
  841. package/src/renderers/common/ProgrammableStage.js +60 -2
  842. package/src/renderers/common/QuadMesh.js +63 -6
  843. package/src/renderers/common/RenderBundle.js +14 -8
  844. package/src/renderers/common/RenderBundles.js +40 -10
  845. package/src/renderers/common/RenderContext.js +219 -4
  846. package/src/renderers/common/RenderContexts.js +54 -17
  847. package/src/renderers/common/RenderList.js +233 -24
  848. package/src/renderers/common/RenderLists.js +46 -6
  849. package/src/renderers/common/RenderObject.js +548 -46
  850. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  851. package/src/renderers/common/RenderObjects.js +133 -15
  852. package/src/renderers/common/RenderPipeline.js +216 -6
  853. package/src/renderers/common/Renderer.js +2155 -332
  854. package/src/renderers/common/RendererUtils.js +200 -0
  855. package/src/renderers/common/SampledTexture.js +99 -39
  856. package/src/renderers/common/Sampler.js +148 -1
  857. package/src/renderers/common/Storage3DTexture.js +100 -0
  858. package/src/renderers/common/StorageArrayTexture.js +84 -0
  859. package/src/renderers/common/StorageBuffer.js +38 -2
  860. package/src/renderers/common/StorageBufferAttribute.js +31 -2
  861. package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
  862. package/src/renderers/common/StorageTexture.js +65 -0
  863. package/src/renderers/common/Textures.js +273 -57
  864. package/src/renderers/common/TimestampQueryPool.js +163 -0
  865. package/src/renderers/common/Uniform.js +233 -3
  866. package/src/renderers/common/UniformBuffer.js +19 -0
  867. package/src/renderers/common/UniformsGroup.js +235 -26
  868. package/src/renderers/common/XRManager.js +1677 -0
  869. package/src/renderers/common/XRRenderTarget.js +91 -0
  870. package/src/renderers/common/extras/PMREMGenerator.js +371 -108
  871. package/src/renderers/common/nodes/NodeBuilderState.js +100 -6
  872. package/src/renderers/common/nodes/NodeLibrary.js +95 -17
  873. package/src/renderers/common/nodes/NodeManager.js +852 -0
  874. package/src/renderers/common/nodes/NodeSampledTexture.js +84 -8
  875. package/src/renderers/common/nodes/NodeSampler.js +41 -1
  876. package/src/renderers/common/nodes/NodeStorageBuffer.js +48 -3
  877. package/src/renderers/common/nodes/NodeUniform.js +285 -2
  878. package/src/renderers/common/nodes/NodeUniformBuffer.js +81 -0
  879. package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
  880. package/src/renderers/shaders/DFGLUTData.js +49 -0
  881. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  882. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  883. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  884. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  885. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  886. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +4 -24
  887. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  888. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +8 -0
  889. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  890. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  891. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  892. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  893. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  894. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  895. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  896. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +154 -59
  897. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  898. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  899. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  900. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  901. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +2 -2
  902. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  903. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  904. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +230 -181
  905. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  906. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  907. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
  908. package/src/renderers/shaders/ShaderChunk.js +3 -3
  909. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  910. package/src/renderers/shaders/ShaderLib/depth.glsl.js +14 -2
  911. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  912. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  913. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  914. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  915. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  916. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  917. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  918. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  919. package/src/renderers/shaders/ShaderLib.js +7 -5
  920. package/src/renderers/shaders/UniformsLib.js +2 -7
  921. package/src/renderers/shaders/UniformsUtils.js +21 -2
  922. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  923. package/src/renderers/webgl/WebGLBackground.js +30 -5
  924. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  925. package/src/renderers/webgl/WebGLBufferRenderer.js +2 -6
  926. package/src/renderers/webgl/WebGLCapabilities.js +7 -14
  927. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  928. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  929. package/src/renderers/webgl/WebGLGeometries.js +10 -35
  930. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +2 -6
  931. package/src/renderers/webgl/WebGLInfo.js +3 -1
  932. package/src/renderers/webgl/WebGLLights.js +18 -1
  933. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  934. package/src/renderers/webgl/WebGLObjects.js +3 -1
  935. package/src/renderers/webgl/WebGLOutput.js +267 -0
  936. package/src/renderers/webgl/WebGLProgram.js +87 -148
  937. package/src/renderers/webgl/WebGLPrograms.js +53 -51
  938. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  939. package/src/renderers/webgl/WebGLShadowMap.js +204 -28
  940. package/src/renderers/webgl/WebGLState.js +88 -56
  941. package/src/renderers/webgl/WebGLTextures.js +293 -59
  942. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  943. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  944. package/src/renderers/webgl/WebGLUtils.js +7 -5
  945. package/src/renderers/webgl-fallback/WebGLBackend.js +1416 -293
  946. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +5 -10
  947. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +785 -92
  948. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +62 -1
  949. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
  950. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +3 -3
  951. package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
  952. package/src/renderers/webgl-fallback/utils/WebGLState.js +584 -20
  953. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +468 -80
  954. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +396 -0
  955. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +72 -24
  956. package/src/renderers/webgpu/WebGPUBackend.js +1517 -428
  957. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +31 -4
  958. package/src/renderers/webgpu/WebGPURenderer.js +55 -4
  959. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +23 -16
  960. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +37 -42
  961. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +1335 -241
  962. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +32 -4
  963. package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
  964. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +144 -20
  965. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +460 -116
  966. package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -4
  967. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +283 -69
  968. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +225 -178
  969. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +583 -191
  970. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +310 -0
  971. package/src/renderers/webgpu/utils/WebGPUUtils.js +150 -28
  972. package/src/renderers/webxr/WebXRController.js +87 -2
  973. package/src/renderers/webxr/WebXRDepthSensing.js +52 -7
  974. package/src/renderers/webxr/WebXRManager.js +275 -15
  975. package/src/scenes/Fog.js +60 -0
  976. package/src/scenes/FogExp2.js +51 -0
  977. package/src/scenes/Scene.js +88 -0
  978. package/src/textures/CanvasTexture.js +28 -0
  979. package/src/textures/CompressedArrayTexture.js +57 -0
  980. package/src/textures/CompressedCubeTexture.js +29 -0
  981. package/src/textures/CompressedTexture.js +64 -6
  982. package/src/textures/CubeDepthTexture.js +76 -0
  983. package/src/textures/CubeTexture.js +52 -4
  984. package/src/textures/Data3DTexture.js +79 -2
  985. package/src/textures/DataArrayTexture.js +93 -0
  986. package/src/textures/DataTexture.js +65 -0
  987. package/src/textures/DepthTexture.js +59 -11
  988. package/src/textures/ExternalTexture.js +56 -0
  989. package/src/textures/FramebufferTexture.js +62 -0
  990. package/src/textures/Source.js +106 -4
  991. package/src/textures/Texture.js +488 -6
  992. package/src/textures/VideoFrameTexture.js +72 -0
  993. package/src/textures/VideoTexture.js +78 -6
  994. package/src/utils.js +322 -3
  995. package/examples/jsm/animation/MMDAnimationHelper.js +0 -1207
  996. package/examples/jsm/animation/MMDPhysics.js +0 -1406
  997. package/examples/jsm/cameras/CinematicCamera.js +0 -208
  998. package/examples/jsm/effects/PeppersGhostEffect.js +0 -153
  999. package/examples/jsm/exporters/MMDExporter.js +0 -217
  1000. package/examples/jsm/geometries/InstancedPointsGeometry.js +0 -174
  1001. package/examples/jsm/geometries/ParametricGeometries.js +0 -254
  1002. package/examples/jsm/libs/mmdparser.module.js +0 -11530
  1003. package/examples/jsm/loaders/GLTFLoaderAnimationPointer.js +0 -729
  1004. package/examples/jsm/loaders/MMDLoader.js +0 -2295
  1005. package/examples/jsm/loaders/RGBMLoader.js +0 -1081
  1006. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -432
  1007. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -144
  1008. package/examples/jsm/misc/Timer.js +0 -128
  1009. package/examples/jsm/objects/InstancedPoints.js +0 -21
  1010. package/examples/jsm/shaders/GodRaysShader.js +0 -321
  1011. package/examples/jsm/shaders/MMDToonShader.js +0 -134
  1012. package/src/materials/nodes/InstancedPointsNodeMaterial.js +0 -156
  1013. package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -24
  1014. package/src/nodes/accessors/SceneNode.js +0 -55
  1015. package/src/nodes/code/ScriptableNode.js +0 -505
  1016. package/src/nodes/code/ScriptableValueNode.js +0 -170
  1017. package/src/nodes/core/CacheNode.js +0 -50
  1018. package/src/nodes/core/UniformGroup.js +0 -13
  1019. package/src/nodes/display/AfterImageNode.js +0 -158
  1020. package/src/nodes/display/AnaglyphPassNode.js +0 -67
  1021. package/src/nodes/display/AnamorphicNode.js +0 -151
  1022. package/src/nodes/display/BlendMode.js +0 -54
  1023. package/src/nodes/display/BloomNode.js +0 -341
  1024. package/src/nodes/display/DenoiseNode.js +0 -204
  1025. package/src/nodes/display/DepthOfFieldNode.js +0 -124
  1026. package/src/nodes/display/DotScreenNode.js +0 -66
  1027. package/src/nodes/display/FXAANode.js +0 -332
  1028. package/src/nodes/display/FilmNode.js +0 -56
  1029. package/src/nodes/display/GTAONode.js +0 -331
  1030. package/src/nodes/display/GaussianBlurNode.js +0 -213
  1031. package/src/nodes/display/Lut3DNode.js +0 -57
  1032. package/src/nodes/display/MotionBlur.js +0 -25
  1033. package/src/nodes/display/ParallaxBarrierPassNode.js +0 -58
  1034. package/src/nodes/display/PixelationPassNode.js +0 -213
  1035. package/src/nodes/display/PosterizeNode.js +0 -33
  1036. package/src/nodes/display/RGBShiftNode.js +0 -53
  1037. package/src/nodes/display/StereoCompositePassNode.js +0 -110
  1038. package/src/nodes/display/TransitionNode.js +0 -80
  1039. package/src/nodes/fog/FogExp2Node.js +0 -35
  1040. package/src/nodes/fog/FogNode.js +0 -50
  1041. package/src/nodes/fog/FogRangeNode.js +0 -36
  1042. package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
  1043. package/src/nodes/utils/EquirectUVNode.js +0 -36
  1044. package/src/nodes/utils/MatcapUVNode.js +0 -33
  1045. package/src/nodes/utils/OscNode.js +0 -85
  1046. package/src/nodes/utils/SpriteSheetUVNode.js +0 -45
  1047. package/src/nodes/utils/TimerNode.js +0 -97
  1048. package/src/nodes/utils/TriplanarTexturesNode.js +0 -64
  1049. package/src/renderers/common/nodes/Nodes.js +0 -534
  1050. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  1051. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -136
@@ -11,21 +11,205 @@ import WebGLCapabilities from './utils/WebGLCapabilities.js';
11
11
  import { GLFeatureName } from './utils/WebGLConstants.js';
12
12
  import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
13
13
 
14
- import { warnOnce } from '../../utils.js';
15
- import { WebGLCoordinateSystem } from '../../constants.js';
16
-
17
- //
18
-
14
+ import { isTypedArray, warnOnce, warn, error } from '../../utils.js';
15
+ import { WebGLCoordinateSystem, TimestampQuery, Compatibility } from '../../constants.js';
16
+ import WebGLTimestampQueryPool from './utils/WebGLTimestampQueryPool.js';
17
+
18
+ /**
19
+ * A backend implementation targeting WebGL 2.
20
+ *
21
+ * @private
22
+ * @augments Backend
23
+ */
19
24
  class WebGLBackend extends Backend {
20
25
 
26
+ /**
27
+ * WebGLBackend options.
28
+ *
29
+ * @typedef {Object} WebGLBackend~Options
30
+ * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
31
+ * @property {boolean} [reversedDepthBuffer=false] - Whether reversed depth buffer is enabled or not.
32
+ * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
33
+ * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
34
+ * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
35
+ * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
36
+ * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.
37
+ * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.
38
+ * @property {WebGL2RenderingContext} [context=undefined] - A WebGL 2 rendering context.
39
+ */
40
+
41
+ /**
42
+ * Constructs a new WebGPU backend.
43
+ *
44
+ * @param {WebGLBackend~Options} [parameters] - The configuration parameter.
45
+ */
21
46
  constructor( parameters = {} ) {
22
47
 
23
48
  super( parameters );
24
49
 
50
+ /**
51
+ * This flag can be used for type testing.
52
+ *
53
+ * @type {boolean}
54
+ * @readonly
55
+ * @default true
56
+ */
25
57
  this.isWebGLBackend = true;
26
58
 
59
+ /**
60
+ * A reference to a backend module holding shader attribute-related
61
+ * utility functions.
62
+ *
63
+ * @type {?WebGLAttributeUtils}
64
+ * @default null
65
+ */
66
+ this.attributeUtils = null;
67
+
68
+ /**
69
+ * A reference to a backend module holding extension-related
70
+ * utility functions.
71
+ *
72
+ * @type {?WebGLExtensions}
73
+ * @default null
74
+ */
75
+ this.extensions = null;
76
+
77
+ /**
78
+ * A reference to a backend module holding capability-related
79
+ * utility functions.
80
+ *
81
+ * @type {?WebGLCapabilities}
82
+ * @default null
83
+ */
84
+ this.capabilities = null;
85
+
86
+ /**
87
+ * A reference to a backend module holding texture-related
88
+ * utility functions.
89
+ *
90
+ * @type {?WebGLTextureUtils}
91
+ * @default null
92
+ */
93
+ this.textureUtils = null;
94
+
95
+ /**
96
+ * A reference to a backend module holding renderer-related
97
+ * utility functions.
98
+ *
99
+ * @type {?WebGLBufferRenderer}
100
+ * @default null
101
+ */
102
+ this.bufferRenderer = null;
103
+
104
+ /**
105
+ * A reference to the rendering context.
106
+ *
107
+ * @type {?WebGL2RenderingContext}
108
+ * @default null
109
+ */
110
+ this.gl = null;
111
+
112
+ /**
113
+ * A reference to a backend module holding state-related
114
+ * utility functions.
115
+ *
116
+ * @type {?WebGLState}
117
+ * @default null
118
+ */
119
+ this.state = null;
120
+
121
+ /**
122
+ * A reference to a backend module holding common
123
+ * utility functions.
124
+ *
125
+ * @type {?WebGLUtils}
126
+ * @default null
127
+ */
128
+ this.utils = null;
129
+
130
+ /**
131
+ * Dictionary for caching VAOs.
132
+ *
133
+ * @type {Object<string,WebGLVertexArrayObject>}
134
+ */
135
+ this.vaoCache = {};
136
+
137
+ /**
138
+ * Dictionary for caching transform feedback objects.
139
+ *
140
+ * @type {Object<string,WebGLTransformFeedback>}
141
+ */
142
+ this.transformFeedbackCache = {};
143
+
144
+ /**
145
+ * Controls if `gl.RASTERIZER_DISCARD` should be enabled or not.
146
+ * Only relevant when using compute shaders.
147
+ *
148
+ * @type {boolean}
149
+ * @default false
150
+ */
151
+ this.discard = false;
152
+
153
+ /**
154
+ * A reference to the `EXT_disjoint_timer_query_webgl2` extension. `null` if the
155
+ * device does not support the extension.
156
+ *
157
+ * @type {?EXTDisjointTimerQueryWebGL2}
158
+ * @default null
159
+ */
160
+ this.disjoint = null;
161
+
162
+ /**
163
+ * A reference to the `KHR_parallel_shader_compile` extension. `null` if the
164
+ * device does not support the extension.
165
+ *
166
+ * @type {?KHRParallelShaderCompile}
167
+ * @default null
168
+ */
169
+ this.parallel = null;
170
+
171
+ /**
172
+ * A reference to the current render context.
173
+ *
174
+ * @private
175
+ * @type {RenderContext}
176
+ * @default null
177
+ */
178
+ this._currentContext = null;
179
+
180
+ /**
181
+ * A unique collection of bindings.
182
+ *
183
+ * @private
184
+ * @type {WeakSet<Array<BindGroup>>}
185
+ */
186
+ this._knownBindings = new WeakSet();
187
+
188
+ /**
189
+ * Whether the device supports framebuffers invalidation or not.
190
+ *
191
+ * @private
192
+ * @type {boolean}
193
+ */
194
+ this._supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );
195
+
196
+ /**
197
+ * The target framebuffer when rendering with
198
+ * the WebXR device API.
199
+ *
200
+ * @private
201
+ * @type {?WebGLFramebuffer}
202
+ * @default null
203
+ */
204
+ this._xrFramebuffer = null;
205
+
27
206
  }
28
207
 
208
+ /**
209
+ * Initializes the backend so it is ready for usage.
210
+ *
211
+ * @param {Renderer} renderer - The renderer.
212
+ */
29
213
  init( renderer ) {
30
214
 
31
215
  super.init( renderer );
@@ -34,7 +218,33 @@ class WebGLBackend extends Backend {
34
218
 
35
219
  const parameters = this.parameters;
36
220
 
37
- const glContext = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgl2' );
221
+ const contextAttributes = {
222
+ antialias: renderer.currentSamples > 0,
223
+ alpha: true, // always true for performance reasons
224
+ depth: renderer.depth,
225
+ stencil: renderer.stencil
226
+ };
227
+
228
+ const glContext = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgl2', contextAttributes );
229
+
230
+ function onContextLost( event ) {
231
+
232
+ event.preventDefault();
233
+
234
+ const contextLossInfo = {
235
+ api: 'WebGL',
236
+ message: event.statusMessage || 'Unknown reason',
237
+ reason: null,
238
+ originalEvent: event
239
+ };
240
+
241
+ renderer.onDeviceLost( contextLossInfo );
242
+
243
+ }
244
+
245
+ this._onContextLost = onContextLost;
246
+
247
+ renderer.domElement.addEventListener( 'webglcontextlost', onContextLost, false );
38
248
 
39
249
  this.gl = glContext;
40
250
 
@@ -47,11 +257,6 @@ class WebGLBackend extends Backend {
47
257
  this.state = new WebGLState( this );
48
258
  this.utils = new WebGLUtils( this );
49
259
 
50
- this.vaoCache = {};
51
- this.transformFeedbackCache = {};
52
- this.discard = false;
53
- this.trackTimestamp = ( parameters.trackTimestamp === true );
54
-
55
260
  this.extensions.get( 'EXT_color_buffer_float' );
56
261
  this.extensions.get( 'WEBGL_clip_cull_distance' );
57
262
  this.extensions.get( 'OES_texture_float_linear' );
@@ -59,158 +264,213 @@ class WebGLBackend extends Backend {
59
264
  this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
60
265
  this.extensions.get( 'WEBGL_render_shared_exponent' );
61
266
  this.extensions.get( 'WEBGL_multi_draw' );
267
+ this.extensions.get( 'OVR_multiview2' );
268
+ this.extensions.get( 'EXT_clip_control' );
62
269
 
63
270
  this.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );
64
271
  this.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );
272
+ this.drawBuffersIndexedExt = this.extensions.get( 'OES_draw_buffers_indexed' );
65
273
 
66
- this._currentContext = null;
274
+ if ( parameters.reversedDepthBuffer === true && this.extensions.has( 'EXT_clip_control' ) ) {
275
+
276
+ this.state.setReversedDepth( true );
277
+
278
+ }
67
279
 
68
280
  }
69
281
 
282
+ /**
283
+ * The coordinate system of the backend.
284
+ *
285
+ * @type {number}
286
+ * @readonly
287
+ */
70
288
  get coordinateSystem() {
71
289
 
72
290
  return WebGLCoordinateSystem;
73
291
 
74
292
  }
75
293
 
294
+ /**
295
+ * This method performs a readback operation by moving buffer data from
296
+ * a storage buffer attribute from the GPU to the CPU.
297
+ *
298
+ * @async
299
+ * @param {StorageBufferAttribute} attribute - The storage buffer attribute.
300
+ * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.
301
+ */
76
302
  async getArrayBufferAsync( attribute ) {
77
303
 
78
304
  return await this.attributeUtils.getArrayBufferAsync( attribute );
79
305
 
80
306
  }
81
307
 
308
+ /**
309
+ * Ensures the backend is XR compatible.
310
+ *
311
+ * @async
312
+ * @return {Promise} A Promise that resolve when the renderer is XR compatible.
313
+ */
314
+ async makeXRCompatible() {
82
315
 
83
- initTimestampQuery( renderContext ) {
84
-
85
- if ( ! this.disjoint || ! this.trackTimestamp ) return;
86
-
87
- const renderContextData = this.get( renderContext );
316
+ const attributes = this.gl.getContextAttributes();
88
317
 
89
- if ( this.queryRunning ) {
318
+ if ( attributes.xrCompatible !== true ) {
90
319
 
91
- if ( ! renderContextData.queryQueue ) renderContextData.queryQueue = [];
92
- renderContextData.queryQueue.push( renderContext );
93
- return;
320
+ await this.gl.makeXRCompatible();
94
321
 
95
322
  }
96
323
 
97
- if ( renderContextData.activeQuery ) {
324
+ }
325
+ /**
326
+ * Sets the XR rendering destination.
327
+ *
328
+ * @param {WebGLFramebuffer} xrFramebuffer - The XR framebuffer.
329
+ */
330
+ setXRTarget( xrFramebuffer ) {
98
331
 
99
- this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT );
100
- renderContextData.activeQuery = null;
332
+ this._xrFramebuffer = xrFramebuffer;
101
333
 
102
- }
334
+ }
103
335
 
104
- renderContextData.activeQuery = this.gl.createQuery();
336
+ /**
337
+ * Configures the given XR render target with external textures.
338
+ *
339
+ * This method is only relevant when using the WebXR Layers API.
340
+ *
341
+ * @param {XRRenderTarget} renderTarget - The XR render target.
342
+ * @param {WebGLTexture} colorTexture - A native color texture.
343
+ * @param {?WebGLTexture} [depthTexture=null] - A native depth texture.
344
+ */
345
+ setXRRenderTargetTextures( renderTarget, colorTexture, depthTexture = null ) {
105
346
 
106
- if ( renderContextData.activeQuery !== null ) {
347
+ const gl = this.gl;
107
348
 
108
- this.gl.beginQuery( this.disjoint.TIME_ELAPSED_EXT, renderContextData.activeQuery );
109
- this.queryRunning = true;
349
+ this.set( renderTarget.texture, { textureGPU: colorTexture, glInternalFormat: gl.RGBA8 } ); // see #24698 why RGBA8 and not SRGB8_ALPHA8 is used
110
350
 
111
- }
351
+ if ( depthTexture !== null ) {
112
352
 
113
- }
353
+ const glInternalFormat = renderTarget.stencilBuffer ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;
114
354
 
115
- // timestamp utils
355
+ this.set( renderTarget.depthTexture, { textureGPU: depthTexture, glInternalFormat: glInternalFormat } );
116
356
 
117
- prepareTimestampBuffer( renderContext ) {
357
+ // The multisample_render_to_texture extension doesn't work properly if there
358
+ // are midframe flushes and an external depth texture.
359
+ if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
118
360
 
119
- if ( ! this.disjoint || ! this.trackTimestamp ) return;
361
+ warn( 'WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
120
362
 
121
- const renderContextData = this.get( renderContext );
363
+ }
122
364
 
123
- if ( renderContextData.activeQuery ) {
365
+ renderTarget._autoAllocateDepthBuffer = false;
124
366
 
125
- this.gl.endQuery( this.disjoint.TIME_ELAPSED_EXT );
367
+ }
126
368
 
127
- if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = [];
128
- renderContextData.gpuQueries.push( { query: renderContextData.activeQuery } );
129
- renderContextData.activeQuery = null;
130
- this.queryRunning = false;
369
+ }
131
370
 
132
- if ( renderContextData.queryQueue && renderContextData.queryQueue.length > 0 ) {
371
+ /**
372
+ * Inits a time stamp query for the given render context.
373
+ *
374
+ * @param {string} type - The type of the timestamp query.
375
+ * @param {string} uid - A unique identifier for the timestamp query.
376
+ */
377
+ initTimestampQuery( type, uid ) {
133
378
 
134
- const nextRenderContext = renderContextData.queryQueue.shift();
135
- this.initTimestampQuery( nextRenderContext );
379
+ if ( ! this.disjoint || ! this.trackTimestamp ) return;
136
380
 
137
- }
381
+ if ( ! this.timestampQueryPool[ type ] ) {
382
+
383
+ // TODO: Variable maxQueries?
384
+ this.timestampQueryPool[ type ] = new WebGLTimestampQueryPool( this.gl, type, 2048 );
138
385
 
139
386
  }
140
387
 
141
- }
388
+ const timestampQueryPool = this.timestampQueryPool[ type ];
142
389
 
143
- async resolveTimestampAsync( renderContext, type = 'render' ) {
390
+ const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
144
391
 
145
- if ( ! this.disjoint || ! this.trackTimestamp ) return;
392
+ if ( baseOffset !== null ) {
146
393
 
147
- const renderContextData = this.get( renderContext );
394
+ timestampQueryPool.beginQuery( uid );
148
395
 
149
- if ( ! renderContextData.gpuQueries ) renderContextData.gpuQueries = [];
396
+ }
150
397
 
151
- for ( let i = 0; i < renderContextData.gpuQueries.length; i ++ ) {
398
+ }
152
399
 
153
- const queryInfo = renderContextData.gpuQueries[ i ];
154
- const available = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT_AVAILABLE );
155
- const disjoint = this.gl.getParameter( this.disjoint.GPU_DISJOINT_EXT );
400
+ // timestamp utils
156
401
 
157
- if ( available && ! disjoint ) {
402
+ /**
403
+ * Prepares the timestamp buffer.
404
+ *
405
+ * @param {string} type - The type of the timestamp query.
406
+ * @param {string} uid - A unique identifier for the timestamp query.
407
+ */
408
+ prepareTimestampBuffer( type, uid ) {
158
409
 
159
- const elapsed = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT );
160
- const duration = Number( elapsed ) / 1000000; // Convert nanoseconds to milliseconds
161
- this.gl.deleteQuery( queryInfo.query );
162
- renderContextData.gpuQueries.splice( i, 1 ); // Remove the processed query
163
- i --;
164
- this.renderer.info.updateTimestamp( type, duration );
410
+ if ( ! this.disjoint || ! this.trackTimestamp ) return;
165
411
 
166
- }
412
+ const timestampQueryPool = this.timestampQueryPool[ type ];
167
413
 
168
- }
414
+ timestampQueryPool.endQuery( uid );
169
415
 
170
416
  }
171
417
 
418
+
419
+ /**
420
+ * Returns the backend's rendering context.
421
+ *
422
+ * @return {WebGL2RenderingContext} The rendering context.
423
+ */
172
424
  getContext() {
173
425
 
174
426
  return this.gl;
175
427
 
176
428
  }
177
429
 
430
+ /**
431
+ * This method is executed at the beginning of a render call and prepares
432
+ * the WebGL state for upcoming render calls
433
+ *
434
+ * @param {RenderContext} renderContext - The render context.
435
+ */
178
436
  beginRender( renderContext ) {
179
437
 
180
- const { gl } = this;
438
+ const { state } = this;
181
439
  const renderContextData = this.get( renderContext );
182
440
 
183
441
  //
184
442
 
185
- //
443
+ if ( renderContext.viewport ) {
186
444
 
187
- this.initTimestampQuery( renderContext );
445
+ this.updateViewport( renderContext );
188
446
 
189
- renderContextData.previousContext = this._currentContext;
190
- this._currentContext = renderContext;
447
+ } else {
191
448
 
192
- this._setFramebuffer( renderContext );
449
+ const { width, height } = this.getDrawingBufferSize();
450
+ state.viewport( 0, 0, width, height );
193
451
 
194
- this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );
452
+ }
195
453
 
196
- //
197
- if ( renderContext.viewport ) {
454
+ if ( renderContext.scissor ) {
198
455
 
199
- this.updateViewport( renderContext );
456
+ this.updateScissor( renderContext );
200
457
 
201
458
  } else {
202
459
 
203
- gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
460
+ const { width, height } = this.getDrawingBufferSize();
461
+ state.scissor( 0, 0, width, height );
204
462
 
205
463
  }
206
464
 
207
- if ( renderContext.scissor ) {
465
+ //
208
466
 
209
- const { x, y, width, height } = renderContext.scissorValue;
467
+ this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
210
468
 
211
- gl.scissor( x, renderContext.height - height - y, width, height );
469
+ renderContextData.previousContext = this._currentContext;
470
+ this._currentContext = renderContext;
212
471
 
213
- }
472
+ this._setFramebuffer( renderContext );
473
+ this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );
214
474
 
215
475
  const occlusionQueryCount = renderContext.occlusionQueryCount;
216
476
 
@@ -230,12 +490,20 @@ class WebGLBackend extends Backend {
230
490
 
231
491
  }
232
492
 
493
+ /**
494
+ * This method is executed at the end of a render call and finalizes work
495
+ * after draw calls.
496
+ *
497
+ * @param {RenderContext} renderContext - The render context.
498
+ */
233
499
  finishRender( renderContext ) {
234
500
 
235
501
  const { gl, state } = this;
236
502
  const renderContextData = this.get( renderContext );
237
503
  const previousContext = renderContextData.previousContext;
238
504
 
505
+ state.resetVertexState();
506
+
239
507
  const occlusionQueryCount = renderContext.occlusionQueryCount;
240
508
 
241
509
  if ( occlusionQueryCount > 0 ) {
@@ -270,72 +538,47 @@ class WebGLBackend extends Backend {
270
538
 
271
539
  this._currentContext = previousContext;
272
540
 
273
- if ( renderContext.textures !== null && renderContext.renderTarget ) {
274
-
275
- const renderTargetContextData = this.get( renderContext.renderTarget );
276
-
277
- const { samples } = renderContext.renderTarget;
278
-
279
- if ( samples > 0 ) {
280
-
281
- const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
282
-
283
- const mask = gl.COLOR_BUFFER_BIT;
284
-
285
- const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
286
-
287
- const textures = renderContext.textures;
288
-
289
- state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
290
- state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
291
-
292
- for ( let i = 0; i < textures.length; i ++ ) {
293
-
294
- // TODO Add support for MRT
295
-
296
- if ( renderContext.scissor ) {
297
-
298
- const { x, y, width, height } = renderContext.scissorValue;
541
+ this._resolveRenderTarget( renderContext );
299
542
 
300
- const viewY = renderContext.height - height - y;
543
+ if ( previousContext !== null ) {
301
544
 
302
- gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
303
- gl.invalidateSubFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray, x, viewY, width, height );
545
+ this._setFramebuffer( previousContext );
304
546
 
305
- } else {
547
+ if ( previousContext.viewport ) {
306
548
 
307
- gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
308
- gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
549
+ this.updateViewport( previousContext );
309
550
 
310
- }
551
+ } else {
311
552
 
312
- }
553
+ const { width, height } = this.getDrawingBufferSize();
554
+ state.viewport( 0, 0, width, height );
313
555
 
314
556
  }
315
557
 
558
+ if ( previousContext.scissor ) {
316
559
 
317
- }
318
-
319
- if ( previousContext !== null ) {
320
-
321
- this._setFramebuffer( previousContext );
322
-
323
- if ( previousContext.viewport ) {
324
-
325
- this.updateViewport( previousContext );
560
+ this.updateScissor( previousContext );
326
561
 
327
562
  } else {
328
563
 
329
- gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
564
+ const { width, height } = this.getDrawingBufferSize();
565
+ state.scissor( 0, 0, width, height );
330
566
 
331
567
  }
332
568
 
333
569
  }
334
570
 
335
- this.prepareTimestampBuffer( renderContext );
571
+ this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
336
572
 
337
573
  }
338
574
 
575
+ /**
576
+ * This method processes the result of occlusion queries and writes it
577
+ * into render context data.
578
+ *
579
+ * @async
580
+ * @param {RenderContext} renderContext - The render context.
581
+ */
339
582
  resolveOccludedAsync( renderContext ) {
340
583
 
341
584
  const renderContextData = this.get( renderContext );
@@ -365,7 +608,7 @@ class WebGLBackend extends Backend {
365
608
 
366
609
  if ( gl.getQueryParameter( query, gl.QUERY_RESULT_AVAILABLE ) ) {
367
610
 
368
- if ( gl.getQueryParameter( query, gl.QUERY_RESULT ) > 0 ) occluded.add( currentOcclusionQueryObjects[ i ] );
611
+ if ( gl.getQueryParameter( query, gl.QUERY_RESULT ) === 0 ) occluded.add( currentOcclusionQueryObjects[ i ] );
369
612
 
370
613
  currentOcclusionQueries[ i ] = null;
371
614
  gl.deleteQuery( query );
@@ -394,6 +637,14 @@ class WebGLBackend extends Backend {
394
637
 
395
638
  }
396
639
 
640
+ /**
641
+ * Returns `true` if the given 3D object is fully occluded by other
642
+ * 3D objects in the scene.
643
+ *
644
+ * @param {RenderContext} renderContext - The render context.
645
+ * @param {Object3D} object - The 3D object to test.
646
+ * @return {boolean} Whether the 3D object is fully occluded or not.
647
+ */
397
648
  isOccluded( renderContext, object ) {
398
649
 
399
650
  const renderContextData = this.get( renderContext );
@@ -402,40 +653,90 @@ class WebGLBackend extends Backend {
402
653
 
403
654
  }
404
655
 
656
+ /**
657
+ * Updates the viewport with the values from the given render context.
658
+ *
659
+ * @param {RenderContext} renderContext - The render context.
660
+ */
405
661
  updateViewport( renderContext ) {
406
662
 
407
- const gl = this.gl;
663
+ const { state } = this;
408
664
  const { x, y, width, height } = renderContext.viewportValue;
409
665
 
410
- gl.viewport( x, renderContext.height - height - y, width, height );
666
+ state.viewport( x, renderContext.height - height - y, width, height );
411
667
 
412
668
  }
413
669
 
414
- setScissorTest( boolean ) {
670
+ /**
671
+ * Updates the scissor with the values from the given render context.
672
+ *
673
+ * @param {RenderContext} renderContext - The render context.
674
+ */
675
+ updateScissor( renderContext ) {
415
676
 
416
- const gl = this.gl;
677
+ const { state } = this;
678
+ const { x, y, width, height } = renderContext.scissorValue;
417
679
 
418
- if ( boolean ) {
680
+ state.scissor( x, renderContext.height - height - y, width, height );
419
681
 
420
- gl.enable( gl.SCISSOR_TEST );
682
+ }
421
683
 
422
- } else {
684
+ /**
685
+ * Defines the scissor test.
686
+ *
687
+ * @param {boolean} boolean - Whether the scissor test should be enabled or not.
688
+ */
689
+ setScissorTest( boolean ) {
423
690
 
424
- gl.disable( gl.SCISSOR_TEST );
691
+ const state = this.state;
425
692
 
426
- }
693
+ state.setScissorTest( boolean );
427
694
 
428
695
  }
429
696
 
430
- clear( color, depth, stencil, descriptor = null, setFrameBuffer = true ) {
697
+ /**
698
+ * Returns the clear color and alpha into a single
699
+ * color object.
700
+ *
701
+ * @return {Color4} The clear color.
702
+ */
703
+ getClearColor() {
431
704
 
432
- const { gl } = this;
705
+ const clearColor = super.getClearColor();
706
+
707
+ // Since the canvas is always created with alpha: true,
708
+ // WebGL must always premultiply the clear color.
709
+
710
+ clearColor.r *= clearColor.a;
711
+ clearColor.g *= clearColor.a;
712
+ clearColor.b *= clearColor.a;
713
+
714
+ return clearColor;
715
+
716
+ }
717
+
718
+ /**
719
+ * Performs a clear operation.
720
+ *
721
+ * @param {boolean} color - Whether the color buffer should be cleared or not.
722
+ * @param {boolean} depth - Whether the depth buffer should be cleared or not.
723
+ * @param {boolean} stencil - Whether the stencil buffer should be cleared or not.
724
+ * @param {?Object} [descriptor=null] - The render context of the current set render target.
725
+ * @param {boolean} [setFrameBuffer=true] - Controls whether the intermediate framebuffer should be set or not.
726
+ * @param {boolean} [resolveRenderTarget=true] - Controls whether an active render target should be resolved
727
+ * or not. Only relevant for explicit clears.
728
+ */
729
+ clear( color, depth, stencil, descriptor = null, setFrameBuffer = true, resolveRenderTarget = true ) {
730
+
731
+ const { gl, renderer } = this;
433
732
 
434
733
  if ( descriptor === null ) {
435
734
 
735
+ const clearColor = this.getClearColor();
736
+
436
737
  descriptor = {
437
738
  textures: null,
438
- clearColorValue: this.getClearColor()
739
+ clearColorValue: clearColor
439
740
  };
440
741
 
441
742
  }
@@ -450,13 +751,20 @@ class WebGLBackend extends Backend {
450
751
 
451
752
  if ( clear !== 0 ) {
452
753
 
453
- const clearColor = descriptor.clearColorValue || this.getClearColor();
754
+ let clearColor;
454
755
 
455
- // premultiply alpha
756
+ if ( descriptor.clearColorValue ) {
456
757
 
457
- clearColor.r *= clearColor.a;
458
- clearColor.g *= clearColor.a;
459
- clearColor.b *= clearColor.a;
758
+ clearColor = descriptor.clearColorValue;
759
+
760
+ } else {
761
+
762
+ clearColor = this.getClearColor();
763
+
764
+ }
765
+
766
+ const clearDepth = renderer.getClearDepth();
767
+ const clearStencil = renderer.getClearStencil();
460
768
 
461
769
  if ( depth ) this.state.setDepthMask( true );
462
770
 
@@ -473,7 +781,15 @@ class WebGLBackend extends Backend {
473
781
 
474
782
  for ( let i = 0; i < descriptor.textures.length; i ++ ) {
475
783
 
476
- gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
784
+ if ( i === 0 ) {
785
+
786
+ gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
787
+
788
+ } else {
789
+
790
+ gl.clearBufferfv( gl.COLOR, i, [ 0, 0, 0, 1 ] );
791
+
792
+ }
477
793
 
478
794
  }
479
795
 
@@ -481,58 +797,77 @@ class WebGLBackend extends Backend {
481
797
 
482
798
  if ( depth && stencil ) {
483
799
 
484
- gl.clearBufferfi( gl.DEPTH_STENCIL, 0, 1, 0 );
800
+ gl.clearBufferfi( gl.DEPTH_STENCIL, 0, clearDepth, clearStencil );
485
801
 
486
802
  } else if ( depth ) {
487
803
 
488
- gl.clearBufferfv( gl.DEPTH, 0, [ 1.0 ] );
804
+ gl.clearBufferfv( gl.DEPTH, 0, [ clearDepth ] );
489
805
 
490
806
  } else if ( stencil ) {
491
807
 
492
- gl.clearBufferiv( gl.STENCIL, 0, [ 0 ] );
808
+ gl.clearBufferiv( gl.STENCIL, 0, [ clearStencil ] );
493
809
 
494
810
  }
495
811
 
812
+ if ( setFrameBuffer && resolveRenderTarget ) this._resolveRenderTarget( descriptor );
813
+
496
814
  }
497
815
 
498
816
  }
499
817
 
500
818
  }
501
819
 
820
+ /**
821
+ * This method is executed at the beginning of a compute call and
822
+ * prepares the state for upcoming compute tasks.
823
+ *
824
+ * @param {Node|Array<Node>} computeGroup - The compute node(s).
825
+ */
502
826
  beginCompute( computeGroup ) {
503
827
 
504
828
  const { state, gl } = this;
505
829
 
830
+ //
831
+
506
832
  state.bindFramebuffer( gl.FRAMEBUFFER, null );
507
- this.initTimestampQuery( computeGroup );
833
+ this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
508
834
 
509
835
  }
510
836
 
511
- compute( computeGroup, computeNode, bindings, pipeline ) {
837
+ /**
838
+ * Executes a compute command for the given compute node.
839
+ *
840
+ * @param {Node|Array<Node>} computeGroup - The group of compute nodes of a compute call. Can be a single compute node.
841
+ * @param {Node} computeNode - The compute node.
842
+ * @param {Array<BindGroup>} bindings - The bindings.
843
+ * @param {ComputePipeline} pipeline - The compute pipeline.
844
+ * @param {?number} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.
845
+ */
846
+ compute( computeGroup, computeNode, bindings, pipeline, count = null ) {
512
847
 
513
848
  const { state, gl } = this;
514
849
 
515
- if ( ! this.discard ) {
850
+ if ( this.discard === false ) {
516
851
 
517
852
  // required here to handle async behaviour of render.compute()
518
- gl.enable( gl.RASTERIZER_DISCARD );
853
+ state.enable( gl.RASTERIZER_DISCARD );
519
854
  this.discard = true;
520
855
 
521
856
  }
522
857
 
523
858
  const { programGPU, transformBuffers, attributes } = this.get( pipeline );
524
859
 
525
- const vaoKey = this._getVaoKey( null, attributes );
860
+ const vaoKey = this._getVaoKey( attributes );
526
861
 
527
862
  const vaoGPU = this.vaoCache[ vaoKey ];
528
863
 
529
864
  if ( vaoGPU === undefined ) {
530
865
 
531
- this._createVao( null, attributes );
866
+ this.vaoCache[ vaoKey ] = this._createVao( attributes );
532
867
 
533
868
  } else {
534
869
 
535
- gl.bindVertexArray( vaoGPU );
870
+ state.setVertexState( vaoGPU );
536
871
 
537
872
  }
538
873
 
@@ -545,13 +880,29 @@ class WebGLBackend extends Backend {
545
880
  gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
546
881
  gl.beginTransformFeedback( gl.POINTS );
547
882
 
883
+ count = ( count !== null ) ? count : computeNode.count;
884
+
885
+ if ( Array.isArray( count ) ) {
886
+
887
+ warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not an array.' );
888
+
889
+ count = count[ 0 ];
890
+
891
+ } else if ( count && typeof count === 'object' && count.isIndirectStorageBufferAttribute ) {
892
+
893
+ warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not IndirectStorageBufferAttribute' );
894
+
895
+ count = computeNode.count;
896
+
897
+ }
898
+
548
899
  if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
549
900
 
550
- gl.drawArraysInstanced( gl.POINTS, 0, 1, computeNode.count );
901
+ gl.drawArraysInstanced( gl.POINTS, 0, 1, count );
551
902
 
552
903
  } else {
553
904
 
554
- gl.drawArrays( gl.POINTS, 0, computeNode.count );
905
+ gl.drawArrays( gl.POINTS, 0, count );
555
906
 
556
907
  }
557
908
 
@@ -564,7 +915,7 @@ class WebGLBackend extends Backend {
564
915
 
565
916
  const dualAttributeData = transformBuffers[ i ];
566
917
 
567
- if ( dualAttributeData.pbo ) {
918
+ if ( dualAttributeData.pbo && this.has( dualAttributeData.pbo ) ) {
568
919
 
569
920
  this.textureUtils.copyBufferToTexture( dualAttributeData.transformBuffer, dualAttributeData.pbo );
570
921
 
@@ -577,30 +928,62 @@ class WebGLBackend extends Backend {
577
928
 
578
929
  }
579
930
 
931
+ /**
932
+ * This method is executed at the end of a compute call and
933
+ * finalizes work after compute tasks.
934
+ *
935
+ * @param {Node|Array<Node>} computeGroup - The compute node(s).
936
+ */
580
937
  finishCompute( computeGroup ) {
581
938
 
582
- const gl = this.gl;
939
+ const { state, gl } = this;
583
940
 
584
941
  this.discard = false;
585
942
 
586
- gl.disable( gl.RASTERIZER_DISCARD );
943
+ state.disable( gl.RASTERIZER_DISCARD );
944
+
945
+ this.prepareTimestampBuffer( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
946
+
947
+ if ( this._currentContext ) {
948
+
949
+ this._setFramebuffer( this._currentContext );
950
+
951
+ }
952
+
953
+ }
954
+
955
+ /**
956
+ * Internal to determine if the current render target is a render target array with depth 2D array texture.
957
+ *
958
+ * @param {RenderContext} renderContext - The render context.
959
+ * @return {boolean} Whether the render target is a render target array with depth 2D array texture.
960
+ *
961
+ * @private
962
+ */
963
+ _isRenderCameraDepthArray( renderContext ) {
587
964
 
588
- this.prepareTimestampBuffer( computeGroup );
965
+ return renderContext.depthTexture && renderContext.depthTexture.isArrayTexture && renderContext.camera.isArrayCamera;
589
966
 
590
967
  }
591
968
 
969
+ /**
970
+ * Executes a draw command for the given render object.
971
+ *
972
+ * @param {RenderObject} renderObject - The render object to draw.
973
+ * @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.
974
+ */
592
975
  draw( renderObject/*, info*/ ) {
593
976
 
594
- const { object, pipeline, material, context } = renderObject;
977
+ const { object, pipeline, material, context, hardwareClippingPlanes } = renderObject;
595
978
  const { programGPU } = this.get( pipeline );
596
979
 
597
980
  const { gl, state } = this;
598
981
 
599
982
  const contextData = this.get( context );
600
983
 
601
- const drawParms = renderObject.getDrawParameters();
984
+ const drawParams = renderObject.getDrawParameters();
602
985
 
603
- if ( drawParms === null ) return;
986
+ if ( drawParams === null ) return;
604
987
 
605
988
  //
606
989
 
@@ -608,37 +991,44 @@ class WebGLBackend extends Backend {
608
991
 
609
992
  const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
610
993
 
611
- state.setMaterial( material, frontFaceCW );
994
+ state.setMaterial( material, frontFaceCW, hardwareClippingPlanes );
995
+
996
+ if ( context.mrt !== null && context.textures !== null ) {
997
+
998
+ state.setMRTBlending( context.textures, context.mrt, material );
999
+
1000
+ }
612
1001
 
613
1002
  state.useProgram( programGPU );
614
1003
 
615
- //
1004
+ // vertex state
616
1005
 
617
- let vaoGPU = renderObject.staticVao;
1006
+ const attributes = renderObject.getAttributes();
1007
+ const attributesData = this.get( attributes );
1008
+
1009
+ let vaoGPU = attributesData.vaoGPU;
618
1010
 
619
1011
  if ( vaoGPU === undefined ) {
620
1012
 
621
- const vaoKey = this._getVaoKey( renderObject.getIndex(), renderObject.getAttributes() );
1013
+ const vaoKey = this._getVaoKey( attributes );
622
1014
 
623
1015
  vaoGPU = this.vaoCache[ vaoKey ];
624
1016
 
625
1017
  if ( vaoGPU === undefined ) {
626
1018
 
627
- let staticVao;
628
-
629
- ( { vaoGPU, staticVao } = this._createVao( renderObject.getIndex(), renderObject.getAttributes() ) );
1019
+ vaoGPU = this._createVao( attributes );
630
1020
 
631
- if ( staticVao ) renderObject.staticVao = vaoGPU;
1021
+ this.vaoCache[ vaoKey ] = vaoGPU;
1022
+ attributesData.vaoGPU = vaoGPU;
632
1023
 
633
1024
  }
634
1025
 
635
1026
  }
636
1027
 
637
- gl.bindVertexArray( vaoGPU );
638
-
639
- //
640
-
641
1028
  const index = renderObject.getIndex();
1029
+ const indexGPU = ( index !== null ) ? this.get( index ).bufferGPU : null;
1030
+
1031
+ state.setVertexState( vaoGPU, indexGPU );
642
1032
 
643
1033
  //
644
1034
 
@@ -693,8 +1083,8 @@ class WebGLBackend extends Backend {
693
1083
 
694
1084
  //
695
1085
 
696
- const { vertexCount, instanceCount } = drawParms;
697
- let { firstVertex } = drawParms;
1086
+ const { vertexCount, instanceCount } = drawParams;
1087
+ let { firstVertex } = drawParams;
698
1088
 
699
1089
  renderer.object = object;
700
1090
 
@@ -713,43 +1103,172 @@ class WebGLBackend extends Backend {
713
1103
 
714
1104
  }
715
1105
 
716
- if ( object.isBatchedMesh ) {
1106
+ const draw = () => {
1107
+
1108
+ if ( object.isBatchedMesh ) {
1109
+
1110
+ if ( object._multiDrawInstances !== null ) {
1111
+
1112
+ // @deprecated, r174
1113
+ warnOnce( 'WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
1114
+ renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
717
1115
 
718
- if ( object._multiDrawInstances !== null ) {
1116
+ } else if ( ! this.hasFeature( 'WEBGL_multi_draw' ) ) {
719
1117
 
720
- renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
1118
+ warnOnce( 'WebGLBackend: WEBGL_multi_draw not supported.' );
721
1119
 
722
- } else if ( ! this.hasFeature( 'WEBGL_multi_draw' ) ) {
1120
+ } else {
1121
+
1122
+ renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
1123
+
1124
+ }
723
1125
 
724
- warnOnce( 'THREE.WebGLRenderer: WEBGL_multi_draw not supported.' );
1126
+ } else if ( instanceCount > 1 ) {
1127
+
1128
+ renderer.renderInstances( firstVertex, vertexCount, instanceCount );
725
1129
 
726
1130
  } else {
727
1131
 
728
- renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
1132
+ renderer.render( firstVertex, vertexCount );
1133
+
1134
+ }
1135
+
1136
+ };
1137
+
1138
+ if ( renderObject.camera.isArrayCamera === true && renderObject.camera.cameras.length > 0 && renderObject.camera.isMultiViewCamera === false ) {
1139
+
1140
+ const cameraData = this.get( renderObject.camera );
1141
+ const cameras = renderObject.camera.cameras;
1142
+ const cameraIndex = renderObject.getBindingGroup( 'cameraIndex' ).bindings[ 0 ];
1143
+
1144
+ if ( cameraData.indexesGPU === undefined || cameraData.indexesGPU.length !== cameras.length ) {
1145
+
1146
+ const data = new Uint32Array( [ 0, 0, 0, 0 ] );
1147
+ const indexesGPU = [];
1148
+
1149
+ for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1150
+
1151
+ const bufferGPU = gl.createBuffer();
1152
+
1153
+ data[ 0 ] = i;
1154
+
1155
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1156
+ gl.bufferData( gl.UNIFORM_BUFFER, data, gl.STATIC_DRAW );
1157
+
1158
+ indexesGPU.push( bufferGPU );
1159
+
1160
+ }
1161
+
1162
+ cameraData.indexesGPU = indexesGPU; // TODO: Create a global library for this
1163
+
1164
+ }
1165
+
1166
+ const cameraIndexData = this.get( cameraIndex );
1167
+ const pixelRatio = this.renderer.getPixelRatio();
1168
+
1169
+ const renderTarget = this._currentContext.renderTarget;
1170
+ const isRenderCameraDepthArray = this._isRenderCameraDepthArray( this._currentContext );
1171
+ const prevActiveCubeFace = this._currentContext.activeCubeFace;
1172
+
1173
+ if ( isRenderCameraDepthArray ) {
1174
+
1175
+ // Clear the depth texture
1176
+ const textureData = this.get( renderTarget.depthTexture );
1177
+
1178
+ if ( textureData.clearedRenderId !== this.renderer._nodes.nodeFrame.renderId ) {
1179
+
1180
+ textureData.clearedRenderId = this.renderer._nodes.nodeFrame.renderId;
1181
+
1182
+ const { stencilBuffer } = renderTarget;
1183
+
1184
+ for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1185
+
1186
+ this.renderer._activeCubeFace = i;
1187
+ this._currentContext.activeCubeFace = i;
1188
+
1189
+ this._setFramebuffer( this._currentContext );
1190
+ this.clear( false, true, stencilBuffer, this._currentContext, false, false );
1191
+
1192
+ }
1193
+
1194
+ this.renderer._activeCubeFace = prevActiveCubeFace;
1195
+ this._currentContext.activeCubeFace = prevActiveCubeFace;
1196
+
1197
+ }
729
1198
 
730
1199
  }
731
1200
 
732
- } else if ( instanceCount > 1 ) {
1201
+ for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1202
+
1203
+ const subCamera = cameras[ i ];
1204
+
1205
+ if ( object.layers.test( subCamera.layers ) ) {
733
1206
 
734
- renderer.renderInstances( firstVertex, vertexCount, instanceCount );
1207
+ if ( isRenderCameraDepthArray ) {
1208
+
1209
+ // Update the active layer
1210
+ this.renderer._activeCubeFace = i;
1211
+ this._currentContext.activeCubeFace = i;
1212
+
1213
+ this._setFramebuffer( this._currentContext );
1214
+
1215
+ }
1216
+
1217
+ const vp = subCamera.viewport;
1218
+
1219
+ if ( vp !== undefined ) {
1220
+
1221
+ const x = vp.x * pixelRatio;
1222
+ const y = vp.y * pixelRatio;
1223
+ const width = vp.width * pixelRatio;
1224
+ const height = vp.height * pixelRatio;
1225
+
1226
+ state.viewport(
1227
+ Math.floor( x ),
1228
+ Math.floor( renderObject.context.height - height - y ),
1229
+ Math.floor( width ),
1230
+ Math.floor( height )
1231
+ );
1232
+
1233
+ }
1234
+
1235
+ state.bindBufferBase( gl.UNIFORM_BUFFER, cameraIndexData.index, cameraData.indexesGPU[ i ] );
1236
+
1237
+ draw();
1238
+
1239
+ }
1240
+
1241
+ this._currentContext.activeCubeFace = prevActiveCubeFace;
1242
+ this.renderer._activeCubeFace = prevActiveCubeFace;
1243
+
1244
+ }
735
1245
 
736
1246
  } else {
737
1247
 
738
- renderer.render( firstVertex, vertexCount );
1248
+ draw();
739
1249
 
740
1250
  }
741
- //
742
-
743
- gl.bindVertexArray( null );
744
1251
 
745
1252
  }
746
1253
 
1254
+ /**
1255
+ * Explain why always null is returned.
1256
+ *
1257
+ * @param {RenderObject} renderObject - The render object.
1258
+ * @return {boolean} Whether the render pipeline requires an update or not.
1259
+ */
747
1260
  needsRenderUpdate( /*renderObject*/ ) {
748
1261
 
749
1262
  return false;
750
1263
 
751
1264
  }
752
1265
 
1266
+ /**
1267
+ * Explain why no cache key is computed.
1268
+ *
1269
+ * @param {RenderObject} renderObject - The render object.
1270
+ * @return {string} The cache key.
1271
+ */
753
1272
  getRenderCacheKey( /*renderObject*/ ) {
754
1273
 
755
1274
  return '';
@@ -758,53 +1277,104 @@ class WebGLBackend extends Backend {
758
1277
 
759
1278
  // textures
760
1279
 
1280
+ /**
1281
+ * Creates a default texture for the given texture that can be used
1282
+ * as a placeholder until the actual texture is ready for usage.
1283
+ *
1284
+ * @param {Texture} texture - The texture to create a default texture for.
1285
+ */
761
1286
  createDefaultTexture( texture ) {
762
1287
 
763
1288
  this.textureUtils.createDefaultTexture( texture );
764
1289
 
765
1290
  }
766
1291
 
1292
+ /**
1293
+ * Defines a texture on the GPU for the given texture object.
1294
+ *
1295
+ * @param {Texture} texture - The texture.
1296
+ * @param {Object} [options={}] - Optional configuration parameter.
1297
+ */
767
1298
  createTexture( texture, options ) {
768
1299
 
769
1300
  this.textureUtils.createTexture( texture, options );
770
1301
 
771
1302
  }
772
1303
 
1304
+ /**
1305
+ * Uploads the updated texture data to the GPU.
1306
+ *
1307
+ * @param {Texture} texture - The texture.
1308
+ * @param {Object} [options={}] - Optional configuration parameter.
1309
+ */
773
1310
  updateTexture( texture, options ) {
774
1311
 
775
1312
  this.textureUtils.updateTexture( texture, options );
776
1313
 
777
1314
  }
778
1315
 
1316
+ /**
1317
+ * Generates mipmaps for the given texture.
1318
+ *
1319
+ * @param {Texture} texture - The texture.
1320
+ */
779
1321
  generateMipmaps( texture ) {
780
1322
 
781
1323
  this.textureUtils.generateMipmaps( texture );
782
1324
 
783
1325
  }
784
1326
 
1327
+ /**
1328
+ * Destroys the GPU data for the given texture object.
1329
+ *
1330
+ * @param {Texture} texture - The texture.
1331
+ * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
1332
+ */
1333
+ destroyTexture( texture, isDefaultTexture = false ) {
785
1334
 
786
- destroyTexture( texture ) {
787
-
788
- this.textureUtils.destroyTexture( texture );
1335
+ this.textureUtils.destroyTexture( texture, isDefaultTexture );
789
1336
 
790
1337
  }
791
1338
 
792
- copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {
1339
+ /**
1340
+ * Returns texture data as a typed array.
1341
+ *
1342
+ * @async
1343
+ * @param {Texture} texture - The texture to copy.
1344
+ * @param {number} x - The x coordinate of the copy origin.
1345
+ * @param {number} y - The y coordinate of the copy origin.
1346
+ * @param {number} width - The width of the copy.
1347
+ * @param {number} height - The height of the copy.
1348
+ * @param {number} faceIndex - The face index.
1349
+ * @return {Promise<TypedArray>} A Promise that resolves with a typed array when the copy operation has finished.
1350
+ */
1351
+ async copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {
793
1352
 
794
1353
  return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height, faceIndex );
795
1354
 
796
1355
  }
797
1356
 
798
- createSampler( /*texture*/ ) {
1357
+ /**
1358
+ * This method does nothing since WebGL 2 has no concept of samplers.
1359
+ *
1360
+ * @param {Texture} texture - The texture to update the sampler for.
1361
+ * @return {string} The current sampler key.
1362
+ */
1363
+ updateSampler( /*texture*/ ) {
799
1364
 
800
- //console.warn( 'Abstract class.' );
1365
+ return '';
801
1366
 
802
1367
  }
803
1368
 
804
- destroySampler() {}
805
-
806
1369
  // node builder
807
1370
 
1371
+ /**
1372
+ * Returns a node builder for the given render object.
1373
+ *
1374
+ * @param {RenderObject} object - The render object.
1375
+ * @param {Renderer} renderer - The renderer.
1376
+ * @return {GLSLNodeBuilder} The node builder.
1377
+ */
808
1378
  createNodeBuilder( object, renderer ) {
809
1379
 
810
1380
  return new GLSLNodeBuilder( object, renderer );
@@ -813,6 +1383,11 @@ class WebGLBackend extends Backend {
813
1383
 
814
1384
  // program
815
1385
 
1386
+ /**
1387
+ * Creates a shader program from the given programmable stage.
1388
+ *
1389
+ * @param {ProgrammableStage} program - The programmable stage.
1390
+ */
816
1391
  createProgram( program ) {
817
1392
 
818
1393
  const gl = this.gl;
@@ -829,12 +1404,23 @@ class WebGLBackend extends Backend {
829
1404
 
830
1405
  }
831
1406
 
832
- destroyProgram( /*program*/ ) {
1407
+ /**
1408
+ * Destroys the shader program of the given programmable stage.
1409
+ *
1410
+ * @param {ProgrammableStage} program - The programmable stage.
1411
+ */
1412
+ destroyProgram( program ) {
833
1413
 
834
- console.warn( 'Abstract class.' );
1414
+ this.delete( program );
835
1415
 
836
1416
  }
837
1417
 
1418
+ /**
1419
+ * Creates a render pipeline for the given render object.
1420
+ *
1421
+ * @param {RenderObject} renderObject - The render object.
1422
+ * @param {Array<Promise>} promises - An array of compilation promises which are used in `compileAsync()`.
1423
+ */
838
1424
  createRenderPipeline( renderObject, promises ) {
839
1425
 
840
1426
  const gl = this.gl;
@@ -893,6 +1479,14 @@ class WebGLBackend extends Backend {
893
1479
 
894
1480
  }
895
1481
 
1482
+ /**
1483
+ * Formats the source code of error messages.
1484
+ *
1485
+ * @private
1486
+ * @param {string} string - The code.
1487
+ * @param {number} errorLine - The error line.
1488
+ * @return {string} The formatted code.
1489
+ */
896
1490
  _handleSource( string, errorLine ) {
897
1491
 
898
1492
  const lines = string.split( '\n' );
@@ -912,10 +1506,21 @@ class WebGLBackend extends Backend {
912
1506
 
913
1507
  }
914
1508
 
1509
+ /**
1510
+ * Gets the shader compilation errors from the info log.
1511
+ *
1512
+ * @private
1513
+ * @param {WebGL2RenderingContext} gl - The rendering context.
1514
+ * @param {WebGLShader} shader - The WebGL shader object.
1515
+ * @param {string} type - The shader type.
1516
+ * @return {string} The shader errors.
1517
+ */
915
1518
  _getShaderErrors( gl, shader, type ) {
916
1519
 
917
1520
  const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );
918
- const errors = gl.getShaderInfoLog( shader ).trim();
1521
+
1522
+ const shaderInfoLog = gl.getShaderInfoLog( shader ) || '';
1523
+ const errors = shaderInfoLog.trim();
919
1524
 
920
1525
  if ( status && errors === '' ) return '';
921
1526
 
@@ -933,17 +1538,25 @@ class WebGLBackend extends Backend {
933
1538
 
934
1539
  }
935
1540
 
1541
+ /**
1542
+ * Logs shader compilation errors.
1543
+ *
1544
+ * @private
1545
+ * @param {WebGLProgram} programGPU - The WebGL program.
1546
+ * @param {WebGLShader} glFragmentShader - The fragment shader as a native WebGL shader object.
1547
+ * @param {WebGLShader} glVertexShader - The vertex shader as a native WebGL shader object.
1548
+ */
936
1549
  _logProgramError( programGPU, glFragmentShader, glVertexShader ) {
937
1550
 
938
1551
  if ( this.renderer.debug.checkShaderErrors ) {
939
1552
 
940
1553
  const gl = this.gl;
941
1554
 
942
- const programLog = gl.getProgramInfoLog( programGPU ).trim();
1555
+ const programInfoLog = gl.getProgramInfoLog( programGPU ) || '';
1556
+ const programLog = programInfoLog.trim();
943
1557
 
944
1558
  if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
945
1559
 
946
-
947
1560
  if ( typeof this.renderer.debug.onShaderError === 'function' ) {
948
1561
 
949
1562
  this.renderer.debug.onShaderError( gl, programGPU, glVertexShader, glFragmentShader );
@@ -955,7 +1568,7 @@ class WebGLBackend extends Backend {
955
1568
  const vertexErrors = this._getShaderErrors( gl, glVertexShader, 'vertex' );
956
1569
  const fragmentErrors = this._getShaderErrors( gl, glFragmentShader, 'fragment' );
957
1570
 
958
- console.error(
1571
+ error(
959
1572
  'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
960
1573
  'VALIDATE_STATUS ' + gl.getProgramParameter( programGPU, gl.VALIDATE_STATUS ) + '\n\n' +
961
1574
  'Program Info Log: ' + programLog + '\n' +
@@ -967,7 +1580,7 @@ class WebGLBackend extends Backend {
967
1580
 
968
1581
  } else if ( programLog !== '' ) {
969
1582
 
970
- console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );
1583
+ warn( 'WebGLProgram: Program Info Log:', programLog );
971
1584
 
972
1585
  }
973
1586
 
@@ -975,6 +1588,13 @@ class WebGLBackend extends Backend {
975
1588
 
976
1589
  }
977
1590
 
1591
+ /**
1592
+ * Completes the shader program setup for the given render object.
1593
+ *
1594
+ * @private
1595
+ * @param {RenderObject} renderObject - The render object.
1596
+ * @param {RenderPipeline} pipeline - The render pipeline.
1597
+ */
978
1598
  _completeCompile( renderObject, pipeline ) {
979
1599
 
980
1600
  const { state, gl } = this;
@@ -1003,6 +1623,12 @@ class WebGLBackend extends Backend {
1003
1623
 
1004
1624
  }
1005
1625
 
1626
+ /**
1627
+ * Creates a compute pipeline for the given compute node.
1628
+ *
1629
+ * @param {ComputePipeline} computePipeline - The compute pipeline.
1630
+ * @param {Array<BindGroup>} bindings - The bindings.
1631
+ */
1006
1632
  createComputePipeline( computePipeline, bindings ) {
1007
1633
 
1008
1634
  const { state, gl } = this;
@@ -1059,8 +1685,6 @@ class WebGLBackend extends Backend {
1059
1685
 
1060
1686
  // Bindings
1061
1687
 
1062
- this.createBindings( null, bindings );
1063
-
1064
1688
  this._setupBindings( bindings, programGPU );
1065
1689
 
1066
1690
  const attributeNodes = computeProgram.attributes;
@@ -1099,60 +1723,132 @@ class WebGLBackend extends Backend {
1099
1723
 
1100
1724
  }
1101
1725
 
1102
- createBindings( bindGroup, bindings ) {
1726
+ /**
1727
+ * Creates bindings from the given bind group definition.
1728
+ *
1729
+ * @param {BindGroup} bindGroup - The bind group.
1730
+ * @param {Array<BindGroup>} bindings - Array of bind groups.
1731
+ * @param {number} cacheIndex - The cache index.
1732
+ * @param {number} version - The version.
1733
+ */
1734
+ createBindings( bindGroup, bindings /*, cacheIndex, version*/ ) {
1103
1735
 
1104
- this.updateBindings( bindGroup, bindings );
1736
+ if ( this._knownBindings.has( bindings ) === false ) {
1105
1737
 
1106
- }
1738
+ this._knownBindings.add( bindings );
1107
1739
 
1108
- updateBindings( bindGroup, bindings ) {
1740
+ let uniformBuffers = 0;
1741
+ let textures = 0;
1109
1742
 
1110
- if ( ! bindGroup ) return;
1743
+ for ( const bindGroup of bindings ) {
1111
1744
 
1112
- const { gl } = this;
1745
+ this.set( bindGroup, {
1746
+ textures: textures,
1747
+ uniformBuffers: uniformBuffers
1748
+ } );
1113
1749
 
1114
- const bindingsData = this.get( bindings );
1115
- const bindGroupData = this.get( bindGroup );
1750
+ for ( const binding of bindGroup.bindings ) {
1116
1751
 
1117
- if ( bindingsData.textureIndex === undefined ) bindingsData.textureIndex = 0;
1752
+ if ( binding.isUniformBuffer ) uniformBuffers ++;
1753
+ if ( binding.isSampledTexture ) textures ++;
1118
1754
 
1119
- if ( bindGroupData.textureIndex === undefined ) {
1755
+ }
1120
1756
 
1121
- bindGroupData.textureIndex = bindingsData.textureIndex;
1757
+ }
1122
1758
 
1123
- } else {
1759
+ }
1124
1760
 
1125
- // reset textureIndex to match previous mappimgs when rebuilt
1126
- bindingsData.textureIndex = bindGroupData.textureIndex;
1761
+ this.updateBindings( bindGroup, bindings );
1127
1762
 
1128
- }
1763
+ }
1764
+
1765
+ /**
1766
+ * Updates the given bind group definition.
1767
+ *
1768
+ * @param {BindGroup} bindGroup - The bind group.
1769
+ * @param {Array<BindGroup>} bindings - Array of bind groups.
1770
+ * @param {number} cacheIndex - The cache index.
1771
+ * @param {number} version - The version.
1772
+ */
1773
+ updateBindings( bindGroup /*, bindings, cacheIndex, version*/ ) {
1774
+
1775
+ const { gl } = this;
1776
+
1777
+ const bindGroupData = this.get( bindGroup );
1129
1778
 
1130
- let i = 0;
1779
+ let i = bindGroupData.uniformBuffers;
1780
+ let t = bindGroupData.textures;
1131
1781
 
1132
1782
  for ( const binding of bindGroup.bindings ) {
1133
1783
 
1784
+ const map = this.get( binding );
1785
+
1134
1786
  if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1135
1787
 
1136
- const data = binding.buffer;
1137
- const bufferGPU = gl.createBuffer();
1788
+ const array = binding.buffer;
1789
+ let { bufferGPU } = this.get( array );
1790
+
1791
+ if ( bufferGPU === undefined ) {
1792
+
1793
+ // create
1794
+
1795
+ bufferGPU = gl.createBuffer();
1796
+
1797
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1798
+ gl.bufferData( gl.UNIFORM_BUFFER, array.byteLength, gl.DYNAMIC_DRAW );
1799
+
1800
+ this.set( array, { bufferGPU } );
1801
+
1802
+ } else {
1803
+
1804
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1805
+
1806
+ }
1807
+
1808
+ // update
1809
+
1810
+ const updateRanges = binding.updateRanges;
1138
1811
 
1139
1812
  gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1140
- gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1141
1813
 
1142
- this.set( binding, {
1143
- index: bindGroup.index * 2 + i ++,
1144
- bufferGPU
1145
- } );
1814
+ if ( updateRanges.length === 0 ) {
1815
+
1816
+ gl.bufferData( gl.UNIFORM_BUFFER, array, gl.DYNAMIC_DRAW );
1817
+
1818
+ } else {
1819
+
1820
+ const isTyped = isTypedArray( array );
1821
+ const byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;
1822
+
1823
+ for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
1824
+
1825
+ const range = updateRanges[ i ];
1826
+
1827
+ const dataOffset = range.start * byteOffsetFactor;
1828
+ const size = range.count * byteOffsetFactor;
1829
+
1830
+ const bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
1831
+
1832
+ gl.bufferSubData( gl.UNIFORM_BUFFER, bufferOffset, array, dataOffset, size );
1833
+
1834
+ }
1835
+
1836
+ }
1837
+
1838
+ map.index = i ++;
1839
+ map.bufferGPU = bufferGPU;
1840
+
1841
+ this.set( binding, map );
1146
1842
 
1147
1843
  } else if ( binding.isSampledTexture ) {
1148
1844
 
1149
1845
  const { textureGPU, glTextureType } = this.get( binding.texture );
1150
1846
 
1151
- this.set( binding, {
1152
- index: bindingsData.textureIndex ++,
1153
- textureGPU,
1154
- glTextureType
1155
- } );
1847
+ map.index = t ++;
1848
+ map.textureGPU = textureGPU;
1849
+ map.glTextureType = glTextureType;
1850
+
1851
+ this.set( binding, map );
1156
1852
 
1157
1853
  }
1158
1854
 
@@ -1160,6 +1856,11 @@ class WebGLBackend extends Backend {
1160
1856
 
1161
1857
  }
1162
1858
 
1859
+ /**
1860
+ * Updates a buffer binding.
1861
+ *
1862
+ * @param {Buffer} binding - The buffer binding to update.
1863
+ */
1163
1864
  updateBinding( binding ) {
1164
1865
 
1165
1866
  const gl = this.gl;
@@ -1168,10 +1869,35 @@ class WebGLBackend extends Backend {
1168
1869
 
1169
1870
  const bindingData = this.get( binding );
1170
1871
  const bufferGPU = bindingData.bufferGPU;
1171
- const data = binding.buffer;
1872
+ const array = binding.buffer;
1873
+
1874
+ const updateRanges = binding.updateRanges;
1172
1875
 
1173
1876
  gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1174
- gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1877
+
1878
+ if ( updateRanges.length === 0 ) {
1879
+
1880
+ gl.bufferData( gl.UNIFORM_BUFFER, array, gl.DYNAMIC_DRAW );
1881
+
1882
+ } else {
1883
+
1884
+ const isTyped = isTypedArray( array );
1885
+ const byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;
1886
+
1887
+ for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
1888
+
1889
+ const range = updateRanges[ i ];
1890
+
1891
+ const dataOffset = range.start * byteOffsetFactor;
1892
+ const size = range.count * byteOffsetFactor;
1893
+
1894
+ const bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
1895
+
1896
+ gl.bufferSubData( gl.UNIFORM_BUFFER, bufferOffset, array, dataOffset, size );
1897
+
1898
+ }
1899
+
1900
+ }
1175
1901
 
1176
1902
  }
1177
1903
 
@@ -1179,6 +1905,11 @@ class WebGLBackend extends Backend {
1179
1905
 
1180
1906
  // attributes
1181
1907
 
1908
+ /**
1909
+ * Creates the GPU buffer of an indexed shader attribute.
1910
+ *
1911
+ * @param {BufferAttribute} attribute - The indexed buffer attribute.
1912
+ */
1182
1913
  createIndexAttribute( attribute ) {
1183
1914
 
1184
1915
  const gl = this.gl;
@@ -1187,6 +1918,11 @@ class WebGLBackend extends Backend {
1187
1918
 
1188
1919
  }
1189
1920
 
1921
+ /**
1922
+ * Creates the GPU buffer of a shader attribute.
1923
+ *
1924
+ * @param {BufferAttribute} attribute - The buffer attribute.
1925
+ */
1190
1926
  createAttribute( attribute ) {
1191
1927
 
1192
1928
  if ( this.has( attribute ) ) return;
@@ -1197,6 +1933,11 @@ class WebGLBackend extends Backend {
1197
1933
 
1198
1934
  }
1199
1935
 
1936
+ /**
1937
+ * Creates the GPU buffer of a storage attribute.
1938
+ *
1939
+ * @param {BufferAttribute} attribute - The buffer attribute.
1940
+ */
1200
1941
  createStorageAttribute( attribute ) {
1201
1942
 
1202
1943
  if ( this.has( attribute ) ) return;
@@ -1207,24 +1948,34 @@ class WebGLBackend extends Backend {
1207
1948
 
1208
1949
  }
1209
1950
 
1951
+ /**
1952
+ * Updates the GPU buffer of a shader attribute.
1953
+ *
1954
+ * @param {BufferAttribute} attribute - The buffer attribute to update.
1955
+ */
1210
1956
  updateAttribute( attribute ) {
1211
1957
 
1212
1958
  this.attributeUtils.updateAttribute( attribute );
1213
1959
 
1214
1960
  }
1215
1961
 
1962
+ /**
1963
+ * Destroys the GPU buffer of a shader attribute.
1964
+ *
1965
+ * @param {BufferAttribute} attribute - The buffer attribute to destroy.
1966
+ */
1216
1967
  destroyAttribute( attribute ) {
1217
1968
 
1218
1969
  this.attributeUtils.destroyAttribute( attribute );
1219
1970
 
1220
1971
  }
1221
1972
 
1222
- updateSize() {
1223
-
1224
- //console.warn( 'Abstract class.' );
1225
-
1226
- }
1227
-
1973
+ /**
1974
+ * Checks if the given feature is supported by the backend.
1975
+ *
1976
+ * @param {string} name - The feature's name.
1977
+ * @return {boolean} Whether the feature is supported or not.
1978
+ */
1228
1979
  hasFeature( name ) {
1229
1980
 
1230
1981
  const keysMatching = Object.keys( GLFeatureName ).filter( key => GLFeatureName[ key ] === name );
@@ -1241,24 +1992,81 @@ class WebGLBackend extends Backend {
1241
1992
 
1242
1993
  }
1243
1994
 
1995
+ /**
1996
+ * Returns the maximum anisotropy texture filtering value.
1997
+ *
1998
+ * @return {number} The maximum anisotropy texture filtering value.
1999
+ */
1244
2000
  getMaxAnisotropy() {
1245
2001
 
1246
2002
  return this.capabilities.getMaxAnisotropy();
1247
2003
 
1248
2004
  }
1249
2005
 
1250
- copyTextureToTexture( position, srcTexture, dstTexture, level ) {
2006
+ /**
2007
+ * Copies data of the given source texture to the given destination texture.
2008
+ *
2009
+ * @param {Texture} srcTexture - The source texture.
2010
+ * @param {Texture} dstTexture - The destination texture.
2011
+ * @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy.
2012
+ * @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy.
2013
+ * @param {number} [srcLevel=0] - The source mip level to copy from.
2014
+ * @param {number} [dstLevel=0] - The destination mip level to copy to.
2015
+ */
2016
+ copyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {
1251
2017
 
1252
- this.textureUtils.copyTextureToTexture( position, srcTexture, dstTexture, level );
2018
+ this.textureUtils.copyTextureToTexture( srcTexture, dstTexture, srcRegion, dstPosition, srcLevel, dstLevel );
1253
2019
 
1254
2020
  }
1255
2021
 
2022
+ /**
2023
+ * Copies the current bound framebuffer to the given texture.
2024
+ *
2025
+ * @param {Texture} texture - The destination texture.
2026
+ * @param {RenderContext} renderContext - The render context.
2027
+ * @param {Vector4} rectangle - A four dimensional vector defining the origin and dimension of the copy.
2028
+ */
1256
2029
  copyFramebufferToTexture( texture, renderContext, rectangle ) {
1257
2030
 
1258
2031
  this.textureUtils.copyFramebufferToTexture( texture, renderContext, rectangle );
1259
2032
 
1260
2033
  }
1261
2034
 
2035
+ /**
2036
+ * Checks if the given compatibility is supported by the backend.
2037
+ *
2038
+ * @param {string} name - The compatibility name.
2039
+ * @return {boolean} Whether the compatibility is supported or not.
2040
+ */
2041
+ hasCompatibility( name ) {
2042
+
2043
+ if ( name === Compatibility.TEXTURE_COMPARE ) return true;
2044
+
2045
+ return super.hasCompatibility( name );
2046
+
2047
+ }
2048
+
2049
+ /**
2050
+ * Initializes the render target defined in the given render context.
2051
+ *
2052
+ * @param {RenderContext} renderContext - The render context.
2053
+ */
2054
+ initRenderTarget( renderContext ) {
2055
+
2056
+ const { gl, state } = this;
2057
+
2058
+ this._setFramebuffer( renderContext );
2059
+
2060
+ state.bindFramebuffer( gl.FRAMEBUFFER, null );
2061
+
2062
+ }
2063
+
2064
+ /**
2065
+ * Configures the active framebuffer from the given render context.
2066
+ *
2067
+ * @private
2068
+ * @param {RenderContext} descriptor - The render context.
2069
+ */
1262
2070
  _setFramebuffer( descriptor ) {
1263
2071
 
1264
2072
  const { gl, state } = this;
@@ -1271,11 +2079,17 @@ class WebGLBackend extends Backend {
1271
2079
  const renderTargetContextData = this.get( renderTarget );
1272
2080
  const { samples, depthBuffer, stencilBuffer } = renderTarget;
1273
2081
 
1274
- const isCube = renderTarget.isWebGLCubeRenderTarget === true;
2082
+ const isCube = renderTarget.isCubeRenderTarget === true;
2083
+ const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
2084
+ const isRenderTargetArray = renderTarget.depth > 1;
2085
+ const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
2086
+ const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );
1275
2087
 
1276
2088
  let msaaFb = renderTargetContextData.msaaFrameBuffer;
1277
2089
  let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
1278
-
2090
+ const multisampledRTTExt = this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
2091
+ const multiviewExt = this.extensions.get( 'OVR_multiview2' );
2092
+ const useMultisampledRTT = this._useMultisampledExtension( renderTarget );
1279
2093
  const cacheKey = getCacheKey( descriptor );
1280
2094
 
1281
2095
  let fb;
@@ -1286,6 +2100,10 @@ class WebGLBackend extends Backend {
1286
2100
 
1287
2101
  fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
1288
2102
 
2103
+ } else if ( isXRRenderTarget && _hasExternalTextures === false ) {
2104
+
2105
+ fb = this._xrFramebuffer;
2106
+
1289
2107
  } else {
1290
2108
 
1291
2109
  renderTargetContextData.framebuffers || ( renderTargetContextData.framebuffers = {} );
@@ -1301,6 +2119,7 @@ class WebGLBackend extends Backend {
1301
2119
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
1302
2120
 
1303
2121
  const textures = descriptor.textures;
2122
+ const depthInvalidationArray = [];
1304
2123
 
1305
2124
  if ( isCube ) {
1306
2125
 
@@ -1309,8 +2128,9 @@ class WebGLBackend extends Backend {
1309
2128
  const { textureGPU } = this.get( textures[ 0 ] );
1310
2129
 
1311
2130
  const cubeFace = this.renderer._activeCubeFace;
2131
+ const mipLevel = this.renderer._activeMipmapLevel;
1312
2132
 
1313
- gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
2133
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );
1314
2134
 
1315
2135
  } else {
1316
2136
 
@@ -1321,29 +2141,182 @@ class WebGLBackend extends Backend {
1321
2141
  const texture = textures[ i ];
1322
2142
  const textureData = this.get( texture );
1323
2143
  textureData.renderTarget = descriptor.renderTarget;
2144
+ textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
1324
2145
 
1325
2146
  const attachment = gl.COLOR_ATTACHMENT0 + i;
1326
2147
 
1327
- gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2148
+ if ( renderTarget.multiview ) {
2149
+
2150
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, samples, 0, 2 );
2151
+
2152
+ } else if ( isRenderTarget3D || isRenderTargetArray ) {
2153
+
2154
+ const layer = this.renderer._activeCubeFace;
2155
+ const mipLevel = this.renderer._activeMipmapLevel;
2156
+
2157
+ gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );
2158
+
2159
+ } else {
2160
+
2161
+ if ( useMultisampledRTT ) {
2162
+
2163
+ multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2164
+
2165
+ } else {
2166
+
2167
+ const mipLevel = this.renderer._activeMipmapLevel;
2168
+
2169
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );
2170
+
2171
+ }
2172
+
2173
+ }
1328
2174
 
1329
2175
  }
1330
2176
 
1331
- state.drawBuffers( descriptor, fb );
2177
+ }
2178
+
2179
+ const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2180
+
2181
+ if ( renderTarget._autoAllocateDepthBuffer === true ) {
2182
+
2183
+ const renderbuffer = gl.createRenderbuffer();
2184
+ this.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );
2185
+ renderTargetContextData.xrDepthRenderbuffer = renderbuffer;
2186
+ depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
2187
+
2188
+ gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
2189
+ gl.framebufferRenderbuffer( gl.FRAMEBUFFER, depthStyle, gl.RENDERBUFFER, renderbuffer );
2190
+
2191
+
2192
+ } else {
2193
+
2194
+ if ( descriptor.depthTexture !== null ) {
2195
+
2196
+ depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
2197
+
2198
+ const textureData = this.get( descriptor.depthTexture );
2199
+ textureData.renderTarget = descriptor.renderTarget;
2200
+ textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
2201
+
2202
+ if ( renderTarget.multiview ) {
2203
+
2204
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
2205
+
2206
+ } else if ( _hasExternalTextures && useMultisampledRTT ) {
2207
+
2208
+ multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2209
+
2210
+ } else {
2211
+
2212
+ if ( descriptor.depthTexture.isArrayTexture ) {
2213
+
2214
+ const layer = this.renderer._activeCubeFace;
2215
+
2216
+ gl.framebufferTextureLayer( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, layer );
2217
+
2218
+ } else if ( descriptor.depthTexture.isCubeTexture ) {
2219
+
2220
+ const cubeFace = this.renderer._activeCubeFace;
2221
+
2222
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureData.textureGPU, 0 );
2223
+
2224
+ } else {
2225
+
2226
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2227
+
2228
+ }
2229
+
2230
+ }
2231
+
2232
+ }
1332
2233
 
1333
2234
  }
1334
2235
 
1335
- if ( descriptor.depthTexture !== null ) {
2236
+ renderTargetContextData.depthInvalidationArray = depthInvalidationArray;
2237
+
2238
+
2239
+ } else {
2240
+
2241
+ const isRenderCameraDepthArray = this._isRenderCameraDepthArray( descriptor );
2242
+
2243
+ if ( isRenderCameraDepthArray ) {
2244
+
2245
+ state.bindFramebuffer( gl.FRAMEBUFFER, fb );
2246
+
2247
+ const layer = this.renderer._activeCubeFace;
2248
+
2249
+ const depthData = this.get( descriptor.depthTexture );
2250
+ const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2251
+ gl.framebufferTextureLayer(
2252
+ gl.FRAMEBUFFER,
2253
+ depthStyle,
2254
+ depthData.textureGPU,
2255
+ 0,
2256
+ layer
2257
+ );
2258
+
2259
+ }
2260
+
2261
+ // rebind external XR textures
2262
+
2263
+ if ( ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) && ( renderTarget._isOpaqueFramebuffer !== true ) ) {
2264
+
2265
+ state.bindFramebuffer( gl.FRAMEBUFFER, fb );
2266
+
2267
+ // rebind color
2268
+
2269
+ const textureData = this.get( descriptor.textures[ 0 ] );
2270
+
2271
+ if ( renderTarget.multiview ) {
2272
+
2273
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureData.textureGPU, 0, samples, 0, 2 );
2274
+
2275
+ } else if ( useMultisampledRTT ) {
2276
+
2277
+ multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2278
+
2279
+ } else {
2280
+
2281
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2282
+
2283
+ }
2284
+
2285
+ // rebind depth
1336
2286
 
1337
- const textureData = this.get( descriptor.depthTexture );
1338
2287
  const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
1339
2288
 
1340
- gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2289
+ if ( renderTarget._autoAllocateDepthBuffer === true ) {
2290
+
2291
+ const renderbuffer = renderTargetContextData.xrDepthRenderbuffer;
2292
+ gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
2293
+ gl.framebufferRenderbuffer( gl.FRAMEBUFFER, depthStyle, gl.RENDERBUFFER, renderbuffer );
2294
+
2295
+ } else {
2296
+
2297
+ const textureData = this.get( descriptor.depthTexture );
2298
+
2299
+ if ( renderTarget.multiview ) {
2300
+
2301
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
2302
+
2303
+ } else if ( useMultisampledRTT ) {
2304
+
2305
+ multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2306
+
2307
+ } else {
2308
+
2309
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2310
+
2311
+ }
2312
+
2313
+ }
1341
2314
 
1342
2315
  }
1343
2316
 
1344
2317
  }
1345
2318
 
1346
- if ( samples > 0 ) {
2319
+ if ( samples > 0 && useMultisampledRTT === false && ! renderTarget.multiview ) {
1347
2320
 
1348
2321
  if ( msaaFb === undefined ) {
1349
2322
 
@@ -1365,13 +2338,6 @@ class WebGLBackend extends Backend {
1365
2338
 
1366
2339
  invalidationArray.push( gl.COLOR_ATTACHMENT0 + i );
1367
2340
 
1368
- if ( depthBuffer ) {
1369
-
1370
- const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
1371
- invalidationArray.push( depthStyle );
1372
-
1373
- }
1374
-
1375
2341
  const texture = descriptor.textures[ i ];
1376
2342
  const textureData = this.get( texture );
1377
2343
 
@@ -1381,13 +2347,15 @@ class WebGLBackend extends Backend {
1381
2347
 
1382
2348
  }
1383
2349
 
2350
+ gl.bindRenderbuffer( gl.RENDERBUFFER, null );
2351
+
1384
2352
  renderTargetContextData.msaaFrameBuffer = msaaFb;
1385
2353
  renderTargetContextData.msaaRenderbuffers = msaaRenderbuffers;
1386
2354
 
1387
- if ( depthRenderbuffer === undefined ) {
2355
+ if ( depthBuffer && depthRenderbuffer === undefined ) {
1388
2356
 
1389
2357
  depthRenderbuffer = gl.createRenderbuffer();
1390
- this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor );
2358
+ this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor, samples );
1391
2359
 
1392
2360
  renderTargetContextData.depthRenderbuffer = depthRenderbuffer;
1393
2361
 
@@ -1408,24 +2376,24 @@ class WebGLBackend extends Backend {
1408
2376
 
1409
2377
  }
1410
2378
 
2379
+ state.drawBuffers( descriptor, fb );
2380
+
1411
2381
  }
1412
2382
 
1413
2383
  state.bindFramebuffer( gl.FRAMEBUFFER, currentFrameBuffer );
1414
2384
 
1415
2385
  }
1416
2386
 
2387
+ /**
2388
+ * Computes the VAO key for the given index and attributes.
2389
+ *
2390
+ * @private
2391
+ * @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
2392
+ * @return {string} The VAO key.
2393
+ */
2394
+ _getVaoKey( attributes ) {
1417
2395
 
1418
- _getVaoKey( index, attributes ) {
1419
-
1420
- let key = [];
1421
-
1422
- if ( index !== null ) {
1423
-
1424
- const indexData = this.get( index );
1425
-
1426
- key += ':' + indexData.id;
1427
-
1428
- }
2396
+ let key = '';
1429
2397
 
1430
2398
  for ( let i = 0; i < attributes.length; i ++ ) {
1431
2399
 
@@ -1439,39 +2407,29 @@ class WebGLBackend extends Backend {
1439
2407
 
1440
2408
  }
1441
2409
 
1442
- _createVao( index, attributes ) {
2410
+ /**
2411
+ * Creates a VAO from the index and attributes.
2412
+ *
2413
+ * @private
2414
+ * @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
2415
+ * @return {Object} The VAO data.
2416
+ */
2417
+ _createVao( attributes ) {
1443
2418
 
1444
2419
  const { gl } = this;
1445
2420
 
1446
2421
  const vaoGPU = gl.createVertexArray();
1447
- let key = '';
1448
-
1449
- let staticVao = true;
1450
2422
 
1451
2423
  gl.bindVertexArray( vaoGPU );
1452
2424
 
1453
- if ( index !== null ) {
1454
-
1455
- const indexData = this.get( index );
1456
-
1457
- gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, indexData.bufferGPU );
1458
-
1459
- key += ':' + indexData.id;
1460
-
1461
- }
1462
-
1463
2425
  for ( let i = 0; i < attributes.length; i ++ ) {
1464
2426
 
1465
2427
  const attribute = attributes[ i ];
1466
2428
  const attributeData = this.get( attribute );
1467
2429
 
1468
- key += ':' + attributeData.id;
1469
-
1470
2430
  gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
1471
2431
  gl.enableVertexAttribArray( i );
1472
2432
 
1473
- if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) staticVao = false;
1474
-
1475
2433
  let stride, offset;
1476
2434
 
1477
2435
  if ( attribute.isInterleavedBufferAttribute === true ) {
@@ -1510,12 +2468,17 @@ class WebGLBackend extends Backend {
1510
2468
 
1511
2469
  gl.bindBuffer( gl.ARRAY_BUFFER, null );
1512
2470
 
1513
- this.vaoCache[ key ] = vaoGPU;
1514
-
1515
- return { vaoGPU, staticVao };
2471
+ return vaoGPU;
1516
2472
 
1517
2473
  }
1518
2474
 
2475
+ /**
2476
+ * Creates a transform feedback from the given transform buffers.
2477
+ *
2478
+ * @private
2479
+ * @param {Array<DualAttributeData>} transformBuffers - The transform buffers.
2480
+ * @return {WebGLTransformFeedback} The transform feedback.
2481
+ */
1519
2482
  _getTransformFeedback( transformBuffers ) {
1520
2483
 
1521
2484
  let key = '';
@@ -1556,7 +2519,13 @@ class WebGLBackend extends Backend {
1556
2519
 
1557
2520
  }
1558
2521
 
1559
-
2522
+ /**
2523
+ * Setups the given bindings.
2524
+ *
2525
+ * @private
2526
+ * @param {Array<BindGroup>} bindings - The bindings.
2527
+ * @param {WebGLProgram} programGPU - The WebGL program.
2528
+ */
1560
2529
  _setupBindings( bindings, programGPU ) {
1561
2530
 
1562
2531
  const gl = this.gl;
@@ -1586,6 +2555,12 @@ class WebGLBackend extends Backend {
1586
2555
 
1587
2556
  }
1588
2557
 
2558
+ /**
2559
+ * Binds the given uniforms.
2560
+ *
2561
+ * @private
2562
+ * @param {Array<BindGroup>} bindings - The bindings.
2563
+ */
1589
2564
  _bindUniforms( bindings ) {
1590
2565
 
1591
2566
  const { gl, state } = this;
@@ -1614,6 +2589,154 @@ class WebGLBackend extends Backend {
1614
2589
 
1615
2590
  }
1616
2591
 
2592
+ /**
2593
+ * The method ensures multisampled render targets are resolved.
2594
+ *
2595
+ * @private
2596
+ * @param {RenderContext} renderContext - The render context.
2597
+ */
2598
+ _resolveRenderTarget( renderContext ) {
2599
+
2600
+ const { gl, state } = this;
2601
+
2602
+ const renderTarget = renderContext.renderTarget;
2603
+
2604
+ if ( renderContext.textures !== null && renderTarget ) {
2605
+
2606
+ const renderTargetContextData = this.get( renderTarget );
2607
+
2608
+ if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
2609
+
2610
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
2611
+
2612
+ let mask = gl.COLOR_BUFFER_BIT;
2613
+
2614
+ if ( renderTarget.resolveDepthBuffer ) {
2615
+
2616
+ if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
2617
+ if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
2618
+
2619
+ }
2620
+
2621
+ const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
2622
+ const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
2623
+
2624
+ const textures = renderContext.textures;
2625
+ const isMRT = textures.length > 1;
2626
+
2627
+ state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
2628
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
2629
+
2630
+ if ( isMRT ) {
2631
+
2632
+ // blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
2633
+ // the engine temporarily removes all attachments and then configures each attachment for the resolve.
2634
+
2635
+ for ( let i = 0; i < textures.length; i ++ ) {
2636
+
2637
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
2638
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
2639
+
2640
+ }
2641
+
2642
+ }
2643
+
2644
+ for ( let i = 0; i < textures.length; i ++ ) {
2645
+
2646
+ if ( isMRT ) {
2647
+
2648
+ // configure attachment for resolve
2649
+
2650
+ const { textureGPU } = this.get( textures[ i ] );
2651
+
2652
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
2653
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
2654
+
2655
+ }
2656
+
2657
+ if ( renderContext.scissor ) {
2658
+
2659
+ const { x, y, width, height } = renderContext.scissorValue;
2660
+
2661
+ const viewY = renderContext.height - height - y;
2662
+
2663
+ gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
2664
+
2665
+ } else {
2666
+
2667
+ gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
2668
+
2669
+ }
2670
+
2671
+ }
2672
+
2673
+ if ( isMRT ) {
2674
+
2675
+ // restore attachments
2676
+
2677
+ for ( let i = 0; i < textures.length; i ++ ) {
2678
+
2679
+ const { textureGPU } = this.get( textures[ i ] );
2680
+
2681
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
2682
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
2683
+
2684
+ }
2685
+
2686
+ }
2687
+
2688
+ if ( this._supportsInvalidateFramebuffer === true ) {
2689
+
2690
+ gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
2691
+
2692
+ }
2693
+
2694
+ } else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
2695
+
2696
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
2697
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
2698
+ gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
2699
+
2700
+ }
2701
+
2702
+ }
2703
+
2704
+ }
2705
+
2706
+ /**
2707
+ * Returns `true` if the `WEBGL_multisampled_render_to_texture` extension
2708
+ * should be used when MSAA is enabled.
2709
+ *
2710
+ * @private
2711
+ * @param {RenderTarget} renderTarget - The render target that should be multisampled.
2712
+ * @return {boolean} Whether to use the `WEBGL_multisampled_render_to_texture` extension for MSAA or not.
2713
+ */
2714
+ _useMultisampledExtension( renderTarget ) {
2715
+
2716
+ if ( renderTarget.multiview === true ) {
2717
+
2718
+ return true;
2719
+
2720
+ }
2721
+
2722
+ return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget._autoAllocateDepthBuffer !== false;
2723
+
2724
+ }
2725
+
2726
+ /**
2727
+ * Frees internal resources.
2728
+ */
2729
+ dispose() {
2730
+
2731
+ if ( this.textureUtils !== null ) this.textureUtils.dispose();
2732
+
2733
+ const extension = this.extensions.get( 'WEBGL_lose_context' );
2734
+ if ( extension ) extension.loseContext();
2735
+
2736
+ this.renderer.domElement.removeEventListener( 'webglcontextlost', this._onContextLost );
2737
+
2738
+ }
2739
+
1617
2740
  }
1618
2741
 
1619
2742
  export default WebGLBackend;