@plastic-software/three 0.175.13 → 0.178.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 (529) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +7747 -6792
  3. package/build/three.core.js +7371 -6576
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +190 -30
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +19 -11
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +4989 -2235
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +5082 -2469
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +0 -1
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +1 -0
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +18 -4
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +49 -35
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +12 -10
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +2 -1
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +7 -0
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/lighting/TiledLighting.js +1 -0
  76. package/examples/jsm/lights/LightProbeGenerator.js +1 -0
  77. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  78. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  79. package/examples/jsm/lines/Line2.js +1 -0
  80. package/examples/jsm/lines/LineGeometry.js +1 -0
  81. package/examples/jsm/lines/LineMaterial.js +4 -4
  82. package/examples/jsm/lines/LineSegments2.js +1 -0
  83. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  84. package/examples/jsm/lines/Wireframe.js +1 -0
  85. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  86. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  87. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  88. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  89. package/examples/jsm/loaders/3DMLoader.js +1 -0
  90. package/examples/jsm/loaders/3MFLoader.js +1 -0
  91. package/examples/jsm/loaders/AMFLoader.js +1 -0
  92. package/examples/jsm/loaders/BVHLoader.js +1 -0
  93. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  94. package/examples/jsm/loaders/DDSLoader.js +1 -0
  95. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  96. package/examples/jsm/loaders/EXRLoader.js +1 -0
  97. package/examples/jsm/loaders/FBXLoader.js +25 -23
  98. package/examples/jsm/loaders/FontLoader.js +1 -0
  99. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  100. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  101. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  102. package/examples/jsm/loaders/IESLoader.js +1 -0
  103. package/examples/jsm/loaders/KMZLoader.js +1 -0
  104. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  105. package/examples/jsm/loaders/KTXLoader.js +1 -0
  106. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  107. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  108. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  110. package/examples/jsm/loaders/LWOLoader.js +1 -13
  111. package/examples/jsm/loaders/LottieLoader.js +15 -0
  112. package/examples/jsm/loaders/MD2Loader.js +1 -0
  113. package/examples/jsm/loaders/MDDLoader.js +1 -0
  114. package/examples/jsm/loaders/MTLLoader.js +4 -3
  115. package/examples/jsm/loaders/MaterialXLoader.js +1 -0
  116. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  117. package/examples/jsm/loaders/OBJLoader.js +1 -0
  118. package/examples/jsm/loaders/PCDLoader.js +122 -19
  119. package/examples/jsm/loaders/PDBLoader.js +1 -0
  120. package/examples/jsm/loaders/PLYLoader.js +1 -0
  121. package/examples/jsm/loaders/PVRLoader.js +1 -0
  122. package/examples/jsm/loaders/RGBELoader.js +1 -0
  123. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  124. package/examples/jsm/loaders/STLLoader.js +1 -0
  125. package/examples/jsm/loaders/SVGLoader.js +1 -0
  126. package/examples/jsm/loaders/TDSLoader.js +1 -0
  127. package/examples/jsm/loaders/TGALoader.js +1 -0
  128. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  129. package/examples/jsm/loaders/TTFLoader.js +1 -0
  130. package/examples/jsm/loaders/USDZLoader.js +1 -0
  131. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  132. package/examples/jsm/loaders/VOXLoader.js +1 -0
  133. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  134. package/examples/jsm/loaders/VTKLoader.js +1 -0
  135. package/examples/jsm/loaders/XYZLoader.js +1 -0
  136. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  137. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  138. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  139. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  140. package/examples/jsm/math/Capsule.js +2 -0
  141. package/examples/jsm/math/ColorConverter.js +1 -0
  142. package/examples/jsm/math/ConvexHull.js +2 -0
  143. package/examples/jsm/math/ImprovedNoise.js +19 -14
  144. package/examples/jsm/math/Lut.js +2 -0
  145. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  146. package/examples/jsm/math/OBB.js +2 -0
  147. package/examples/jsm/math/Octree.js +20 -1
  148. package/examples/jsm/math/SimplexNoise.js +2 -0
  149. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  150. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  151. package/examples/jsm/misc/Gyroscope.js +1 -0
  152. package/examples/jsm/misc/MD2Character.js +2 -0
  153. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  154. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  155. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  156. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  157. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  158. package/examples/jsm/misc/RollerCoaster.js +5 -0
  159. package/examples/jsm/misc/Timer.js +2 -0
  160. package/examples/jsm/misc/TubePainter.js +1 -0
  161. package/examples/jsm/misc/Volume.js +2 -0
  162. package/examples/jsm/misc/VolumeSlice.js +1 -0
  163. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  164. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  165. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  166. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  167. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  168. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  169. package/examples/jsm/objects/Lensflare.js +3 -0
  170. package/examples/jsm/objects/LensflareMesh.js +1 -0
  171. package/examples/jsm/objects/MarchingCubes.js +2 -0
  172. package/examples/jsm/objects/Reflector.js +1 -0
  173. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  174. package/examples/jsm/objects/Refractor.js +1 -0
  175. package/examples/jsm/objects/ShadowMesh.js +1 -0
  176. package/examples/jsm/objects/Sky.js +2 -1
  177. package/examples/jsm/objects/SkyMesh.js +20 -17
  178. package/examples/jsm/objects/Water.js +1 -0
  179. package/examples/jsm/objects/Water2.js +1 -0
  180. package/examples/jsm/objects/Water2Mesh.js +3 -1
  181. package/examples/jsm/objects/WaterMesh.js +2 -1
  182. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  183. package/examples/jsm/physics/JoltPhysics.js +1 -0
  184. package/examples/jsm/physics/RapierPhysics.js +139 -12
  185. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  186. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  187. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  188. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  189. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  190. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  191. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  192. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  193. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  194. package/examples/jsm/postprocessing/GTAOPass.js +4 -3
  195. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  196. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  197. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  198. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  199. package/examples/jsm/postprocessing/OutlinePass.js +5 -2
  200. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  201. package/examples/jsm/postprocessing/Pass.js +3 -1
  202. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  203. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  204. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  205. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  206. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  207. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  208. package/examples/jsm/postprocessing/SSAOPass.js +2 -1
  209. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  210. package/examples/jsm/postprocessing/SavePass.js +2 -1
  211. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  212. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  213. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  214. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  215. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  216. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  217. package/examples/jsm/renderers/Projector.js +2 -0
  218. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  219. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  220. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  221. package/examples/jsm/shaders/BasicShader.js +4 -1
  222. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  223. package/examples/jsm/shaders/BlendShader.js +4 -1
  224. package/examples/jsm/shaders/BokehShader.js +4 -1
  225. package/examples/jsm/shaders/BokehShader2.js +4 -1
  226. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  227. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  228. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  229. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  230. package/examples/jsm/shaders/CopyShader.js +4 -1
  231. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  232. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  233. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  234. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  235. package/examples/jsm/shaders/ExposureShader.js +4 -1
  236. package/examples/jsm/shaders/FXAAShader.js +4 -1
  237. package/examples/jsm/shaders/FilmShader.js +4 -1
  238. package/examples/jsm/shaders/FocusShader.js +4 -1
  239. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  240. package/examples/jsm/shaders/GTAOShader.js +4 -1
  241. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  242. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  243. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  244. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  245. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  246. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  247. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  248. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  249. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  250. package/examples/jsm/shaders/MirrorShader.js +4 -1
  251. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  252. package/examples/jsm/shaders/OutputShader.js +4 -1
  253. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  254. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  255. package/examples/jsm/shaders/SAOShader.js +4 -1
  256. package/examples/jsm/shaders/SMAAShader.js +1 -0
  257. package/examples/jsm/shaders/SSAOShader.js +4 -1
  258. package/examples/jsm/shaders/SSRShader.js +1 -0
  259. package/examples/jsm/shaders/SepiaShader.js +4 -1
  260. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  261. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  262. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  263. package/examples/jsm/shaders/ToonShader.js +2 -1
  264. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  265. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +4 -1
  266. package/examples/jsm/shaders/VelocityShader.js +4 -1
  267. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  268. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  269. package/examples/jsm/shaders/VignetteShader.js +4 -1
  270. package/examples/jsm/shaders/VolumeShader.js +5 -2
  271. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  272. package/examples/jsm/textures/FlakesTexture.js +2 -0
  273. package/examples/jsm/transpiler/AST.js +381 -30
  274. package/examples/jsm/transpiler/GLSLDecoder.js +226 -87
  275. package/examples/jsm/transpiler/Linker.js +327 -0
  276. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  277. package/examples/jsm/transpiler/Transpiler.js +19 -1
  278. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  279. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  280. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  281. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  282. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  283. package/examples/jsm/tsl/display/BloomNode.js +1 -0
  284. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  285. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  286. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  287. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  288. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  289. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  290. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  291. package/examples/jsm/tsl/display/GaussianBlurNode.js +4 -29
  292. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  293. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  294. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  295. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  296. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  297. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  298. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  299. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  300. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  301. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  302. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  303. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  304. package/examples/jsm/tsl/display/TRAAPassNode.js +5 -4
  305. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  306. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  307. package/examples/jsm/tsl/lighting/TiledLightsNode.js +4 -3
  308. package/examples/jsm/tsl/math/Bayer.js +4 -1
  309. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  310. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  311. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  312. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  313. package/examples/jsm/utils/CameraUtils.js +4 -1
  314. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  315. package/examples/jsm/utils/GeometryUtils.js +4 -1
  316. package/examples/jsm/utils/LDrawUtils.js +2 -0
  317. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  318. package/examples/jsm/utils/SceneUtils.js +4 -1
  319. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  320. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  321. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  322. package/examples/jsm/utils/SortUtils.js +4 -1
  323. package/examples/jsm/utils/UVsDebug.js +4 -1
  324. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  325. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  326. package/examples/jsm/utils/WorkerPool.js +2 -0
  327. package/examples/jsm/webxr/ARButton.js +1 -0
  328. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  329. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  330. package/examples/jsm/webxr/Text2D.js +4 -1
  331. package/examples/jsm/webxr/VRButton.js +1 -0
  332. package/examples/jsm/webxr/XRButton.js +1 -0
  333. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  334. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  335. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  336. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  338. package/examples/jsm/webxr/XRPlanes.js +1 -0
  339. package/package.json +6 -4
  340. package/src/Three.Core.js +1 -1
  341. package/src/Three.TSL.js +18 -10
  342. package/src/Three.WebGPU.Nodes.js +1 -0
  343. package/src/Three.WebGPU.js +3 -0
  344. package/src/audio/AudioListener.js +13 -10
  345. package/src/cameras/ArrayCamera.js +9 -1
  346. package/src/constants.js +47 -20
  347. package/src/core/BufferAttribute.js +3 -3
  348. package/src/core/BufferGeometry.js +2 -5
  349. package/src/core/Clock.js +2 -8
  350. package/src/core/GLBufferAttribute.js +13 -1
  351. package/src/core/Object3D.js +23 -22
  352. package/src/core/RenderTarget.js +65 -21
  353. package/src/core/RenderTarget3D.js +1 -0
  354. package/src/extras/TextureUtils.js +1 -5
  355. package/src/extras/core/Curve.js +1 -1
  356. package/src/extras/core/Path.js +22 -22
  357. package/src/geometries/CapsuleGeometry.js +167 -17
  358. package/src/geometries/ExtrudeGeometry.js +39 -29
  359. package/src/helpers/ArrowHelper.js +2 -2
  360. package/src/helpers/SkeletonHelper.js +1 -1
  361. package/src/lights/LightShadow.js +14 -0
  362. package/src/lights/SpotLightShadow.js +9 -1
  363. package/src/lights/webgpu/ProjectorLight.js +46 -0
  364. package/src/loaders/BufferGeometryLoader.js +1 -10
  365. package/src/loaders/FileLoader.js +2 -2
  366. package/src/loaders/ImageBitmapLoader.js +25 -9
  367. package/src/loaders/ImageLoader.js +55 -8
  368. package/src/loaders/ObjectLoader.js +44 -16
  369. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  370. package/src/materials/Material.js +1 -7
  371. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  372. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  373. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  374. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  375. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  376. package/src/materials/nodes/NodeMaterial.js +105 -19
  377. package/src/materials/nodes/manager/NodeMaterialObserver.js +20 -2
  378. package/src/math/Box3.js +28 -0
  379. package/src/math/Color.js +7 -7
  380. package/src/math/ColorManagement.js +22 -3
  381. package/src/math/Frustum.js +6 -1
  382. package/src/math/FrustumArray.js +253 -0
  383. package/src/math/Quaternion.js +1 -1
  384. package/src/math/Ray.js +2 -0
  385. package/src/math/Sphere.js +28 -0
  386. package/src/nodes/Nodes.js +2 -3
  387. package/src/nodes/TSL.js +5 -3
  388. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  389. package/src/nodes/accessors/Bitangent.js +54 -26
  390. package/src/nodes/accessors/Camera.js +31 -4
  391. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  392. package/src/nodes/accessors/InstanceNode.js +5 -4
  393. package/src/nodes/accessors/Lights.js +2 -2
  394. package/src/nodes/accessors/MaterialNode.js +4 -0
  395. package/src/nodes/accessors/ModelNode.js +1 -1
  396. package/src/nodes/accessors/Normal.js +102 -16
  397. package/src/nodes/accessors/Object3DNode.js +7 -8
  398. package/src/nodes/accessors/Position.js +14 -4
  399. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  400. package/src/nodes/accessors/ReferenceNode.js +1 -1
  401. package/src/nodes/accessors/ReflectVector.js +3 -3
  402. package/src/nodes/accessors/SkinningNode.js +3 -2
  403. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  404. package/src/nodes/accessors/StorageTextureNode.js +14 -3
  405. package/src/nodes/accessors/Tangent.js +25 -17
  406. package/src/nodes/accessors/TangentUtils.js +46 -0
  407. package/src/nodes/accessors/TextureBicubic.js +21 -3
  408. package/src/nodes/accessors/TextureNode.js +59 -8
  409. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  410. package/src/nodes/accessors/VelocityNode.js +1 -0
  411. package/src/nodes/accessors/VertexColorNode.js +4 -4
  412. package/src/nodes/code/CodeNode.js +8 -11
  413. package/src/nodes/core/AssignNode.js +27 -5
  414. package/src/nodes/core/AttributeNode.js +2 -2
  415. package/src/nodes/core/ContextNode.js +7 -3
  416. package/src/nodes/core/Node.js +69 -20
  417. package/src/nodes/core/NodeBuilder.js +248 -29
  418. package/src/nodes/core/NodeUtils.js +42 -0
  419. package/src/nodes/core/NodeVarying.js +19 -1
  420. package/src/nodes/core/PropertyNode.js +8 -12
  421. package/src/nodes/core/StackNode.js +129 -26
  422. package/src/nodes/core/StructTypeNode.js +26 -4
  423. package/src/nodes/core/SubBuildNode.js +89 -0
  424. package/src/nodes/core/VarNode.js +11 -2
  425. package/src/nodes/core/VaryingNode.js +45 -24
  426. package/src/nodes/display/BlendModes.js +42 -1
  427. package/src/nodes/display/ColorSpaceNode.js +4 -27
  428. package/src/nodes/display/FrontFacingNode.js +34 -2
  429. package/src/nodes/display/NormalMapNode.js +19 -50
  430. package/src/nodes/display/PassNode.js +18 -19
  431. package/src/nodes/display/ScreenNode.js +0 -26
  432. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  433. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  434. package/src/nodes/functions/PhongLightingModel.js +3 -3
  435. package/src/nodes/functions/PhysicalLightingModel.js +14 -14
  436. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  437. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  438. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  439. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  440. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  441. package/src/nodes/gpgpu/ComputeNode.js +1 -1
  442. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  443. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  444. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  445. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  446. package/src/nodes/lighting/LightsNode.js +29 -11
  447. package/src/nodes/lighting/ProjectorLightNode.js +78 -0
  448. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  449. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  450. package/src/nodes/lighting/ShadowNode.js +174 -242
  451. package/src/nodes/lighting/SpotLightNode.js +44 -7
  452. package/src/nodes/materialx/lib/mx_noise.js +1 -1
  453. package/src/nodes/math/ConditionalNode.js +0 -19
  454. package/src/nodes/math/MathNode.js +68 -21
  455. package/src/nodes/math/OperatorNode.js +108 -98
  456. package/src/nodes/shapes/Shapes.js +5 -4
  457. package/src/nodes/tsl/TSLBase.js +1 -0
  458. package/src/nodes/tsl/TSLCore.js +160 -65
  459. package/src/nodes/utils/DebugNode.js +15 -3
  460. package/src/nodes/utils/Discard.js +2 -2
  461. package/src/nodes/utils/EquirectUV.js +27 -0
  462. package/src/nodes/utils/LoopNode.js +64 -34
  463. package/src/nodes/utils/MatcapUV.js +22 -0
  464. package/src/nodes/utils/RTTNode.js +13 -5
  465. package/src/nodes/utils/ReflectorNode.js +77 -7
  466. package/src/nodes/utils/SampleNode.js +81 -0
  467. package/src/nodes/utils/TriplanarTextures.js +65 -0
  468. package/src/objects/BatchedMesh.js +16 -4
  469. package/src/objects/Mesh.js +9 -0
  470. package/src/objects/Skeleton.js +1 -1
  471. package/src/objects/Sprite.js +9 -0
  472. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  473. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  474. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  475. package/src/renderers/WebGLRenderer.js +25 -11
  476. package/src/renderers/common/Animation.js +2 -2
  477. package/src/renderers/common/Background.js +13 -2
  478. package/src/renderers/common/CubeRenderTarget.js +1 -1
  479. package/src/renderers/common/RenderList.js +0 -4
  480. package/src/renderers/common/RenderObject.js +80 -4
  481. package/src/renderers/common/Renderer.js +116 -8
  482. package/src/renderers/common/Storage3DTexture.js +79 -0
  483. package/src/renderers/common/StorageArrayTexture.js +63 -0
  484. package/src/renderers/common/Textures.js +15 -21
  485. package/src/renderers/common/TimestampQueryPool.js +1 -0
  486. package/src/renderers/common/Uniform.js +1 -1
  487. package/src/renderers/common/UniformsGroup.js +14 -18
  488. package/src/renderers/common/XRManager.js +157 -27
  489. package/src/renderers/common/XRRenderTarget.js +21 -4
  490. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  491. package/src/renderers/common/nodes/Nodes.js +13 -3
  492. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +1 -1
  493. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  494. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  495. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  496. package/src/renderers/webgl/WebGLPrograms.js +4 -2
  497. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  498. package/src/renderers/webgl/WebGLState.js +4 -4
  499. package/src/renderers/webgl/WebGLTextures.js +144 -4
  500. package/src/renderers/webgl/WebGLUtils.js +1 -3
  501. package/src/renderers/webgl-fallback/WebGLBackend.js +244 -87
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +73 -7
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  504. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  507. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  508. package/src/renderers/webgpu/WebGPUBackend.js +451 -128
  509. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  510. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  511. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  512. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +86 -33
  513. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  514. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  515. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +28 -5
  516. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  517. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -8
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +45 -50
  519. package/src/renderers/webxr/WebXRController.js +1 -1
  520. package/src/renderers/webxr/WebXRManager.js +2 -1
  521. package/src/textures/DepthTexture.js +6 -10
  522. package/src/textures/Source.js +22 -0
  523. package/src/textures/Texture.js +118 -1
  524. package/src/textures/VideoTexture.js +1 -1
  525. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  526. package/src/core/RenderTargetArray.js +0 -40
  527. package/src/nodes/utils/EquirectUVNode.js +0 -65
  528. package/src/nodes/utils/MatcapUVNode.js +0 -49
  529. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -13,8 +13,11 @@ import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
13
13
 
14
14
  import { warnOnce } from '../../utils.js';
15
15
  import { WebGLCoordinateSystem } from '../../constants.js';
16
+ import { Vector2 } from '../../math/Vector2.js';
16
17
  import WebGLTimestampQueryPool from './utils/WebGLTimestampQueryPool.js';
17
18
 
19
+ const _drawingBufferSize = /*@__PURE__*/ new Vector2();
20
+
18
21
  /**
19
22
  * A backend implementation targeting WebGL 2.
20
23
  *
@@ -264,6 +267,7 @@ class WebGLBackend extends Backend {
264
267
  this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
265
268
  this.extensions.get( 'WEBGL_render_shared_exponent' );
266
269
  this.extensions.get( 'WEBGL_multi_draw' );
270
+ this.extensions.get( 'OVR_multiview2' );
267
271
 
268
272
  this.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );
269
273
  this.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );
@@ -360,13 +364,13 @@ class WebGLBackend extends Backend {
360
364
 
361
365
  // The multisample_render_to_texture extension doesn't work properly if there
362
366
  // are midframe flushes and an external depth texture.
363
- if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget.autoAllocateDepthBuffer ) {
367
+ if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
364
368
 
365
369
  console.warn( 'THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
366
370
 
367
371
  }
368
372
 
369
- renderTarget.autoAllocateDepthBuffer = false;
373
+ renderTarget._autoAllocateDepthBuffer = false;
370
374
 
371
375
  }
372
376
 
@@ -440,7 +444,7 @@ class WebGLBackend extends Backend {
440
444
  */
441
445
  beginRender( renderContext ) {
442
446
 
443
- const { state, gl } = this;
447
+ const { state } = this;
444
448
  const renderContextData = this.get( renderContext );
445
449
 
446
450
  //
@@ -451,7 +455,8 @@ class WebGLBackend extends Backend {
451
455
 
452
456
  } else {
453
457
 
454
- state.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
458
+ const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
459
+ state.viewport( 0, 0, width, height );
455
460
 
456
461
  }
457
462
 
@@ -471,10 +476,8 @@ class WebGLBackend extends Backend {
471
476
  this._currentContext = renderContext;
472
477
 
473
478
  this._setFramebuffer( renderContext );
474
-
475
479
  this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );
476
480
 
477
-
478
481
  const occlusionQueryCount = renderContext.occlusionQueryCount;
479
482
 
480
483
  if ( occlusionQueryCount > 0 ) {
@@ -540,29 +543,60 @@ class WebGLBackend extends Backend {
540
543
  }
541
544
 
542
545
  this._currentContext = previousContext;
546
+ const renderTarget = renderContext.renderTarget;
543
547
 
544
- if ( renderContext.textures !== null && renderContext.renderTarget ) {
548
+ if ( renderContext.textures !== null && renderTarget ) {
545
549
 
546
- const renderTargetContextData = this.get( renderContext.renderTarget );
547
-
548
- const { samples } = renderContext.renderTarget;
550
+ const renderTargetContextData = this.get( renderTarget );
549
551
 
550
- if ( samples > 0 && this._useMultisampledRTT( renderContext.renderTarget ) === false ) {
552
+ if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
551
553
 
552
554
  const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
553
555
 
554
- const mask = gl.COLOR_BUFFER_BIT;
556
+ let mask = gl.COLOR_BUFFER_BIT;
557
+
558
+ if ( renderTarget.resolveDepthBuffer ) {
559
+
560
+ if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
561
+ if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
562
+
563
+ }
555
564
 
556
565
  const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
566
+ const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
557
567
 
558
568
  const textures = renderContext.textures;
569
+ const isMRT = textures.length > 1;
559
570
 
560
571
  state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
561
572
  state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
562
573
 
574
+ if ( isMRT ) {
575
+
576
+ // blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
577
+ // the engine temporarily removes all attachments and then configures each attachment for the resolve.
578
+
579
+ for ( let i = 0; i < textures.length; i ++ ) {
580
+
581
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
582
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
583
+
584
+ }
585
+
586
+ }
587
+
563
588
  for ( let i = 0; i < textures.length; i ++ ) {
564
589
 
565
- // TODO Add support for MRT
590
+ if ( isMRT ) {
591
+
592
+ // configure attachment for resolve
593
+
594
+ const { textureGPU } = this.get( textures[ i ] );
595
+
596
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
597
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
598
+
599
+ }
566
600
 
567
601
  if ( renderContext.scissor ) {
568
602
 
@@ -572,28 +606,42 @@ class WebGLBackend extends Backend {
572
606
 
573
607
  gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
574
608
 
575
- if ( this._supportsInvalidateFramebuffer === true ) {
609
+ } else {
576
610
 
577
- gl.invalidateSubFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray, x, viewY, width, height );
611
+ gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
578
612
 
579
- }
613
+ }
580
614
 
581
- } else {
615
+ }
582
616
 
583
- gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
617
+ if ( isMRT ) {
584
618
 
585
- if ( this._supportsInvalidateFramebuffer === true ) {
619
+ // restore attachments
586
620
 
587
- gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
621
+ for ( let i = 0; i < textures.length; i ++ ) {
588
622
 
589
- }
623
+ const { textureGPU } = this.get( textures[ i ] );
624
+
625
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
626
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
590
627
 
591
628
  }
592
629
 
593
630
  }
594
631
 
595
- }
632
+ if ( this._supportsInvalidateFramebuffer === true ) {
633
+
634
+ gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
635
+
636
+ }
596
637
 
638
+ } else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
639
+
640
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
641
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
642
+ gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
643
+
644
+ }
597
645
 
598
646
  }
599
647
 
@@ -607,7 +655,8 @@ class WebGLBackend extends Backend {
607
655
 
608
656
  } else {
609
657
 
610
- state.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
658
+ const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
659
+ state.viewport( 0, 0, width, height );
611
660
 
612
661
  }
613
662
 
@@ -887,7 +936,7 @@ class WebGLBackend extends Backend {
887
936
 
888
937
  if ( vaoGPU === undefined ) {
889
938
 
890
- this._createVao( attributes );
939
+ this.vaoCache[ vaoKey ] = this._createVao( attributes );
891
940
 
892
941
  } else {
893
942
 
@@ -923,7 +972,7 @@ class WebGLBackend extends Backend {
923
972
 
924
973
  const dualAttributeData = transformBuffers[ i ];
925
974
 
926
- if ( dualAttributeData.pbo ) {
975
+ if ( dualAttributeData.pbo && this.has( dualAttributeData.pbo ) ) {
927
976
 
928
977
  this.textureUtils.copyBufferToTexture( dualAttributeData.transformBuffer, dualAttributeData.pbo );
929
978
 
@@ -960,6 +1009,20 @@ class WebGLBackend extends Backend {
960
1009
 
961
1010
  }
962
1011
 
1012
+ /**
1013
+ * Internal to determine if the current render target is a render target array with depth 2D array texture.
1014
+ *
1015
+ * @param {RenderContext} renderContext - The render context.
1016
+ * @return {boolean} Whether the render target is a render target array with depth 2D array texture.
1017
+ *
1018
+ * @private
1019
+ */
1020
+ _isRenderCameraDepthArray( renderContext ) {
1021
+
1022
+ return renderContext.depthTexture && renderContext.depthTexture.isArrayTexture && renderContext.camera.isArrayCamera;
1023
+
1024
+ }
1025
+
963
1026
  /**
964
1027
  * Executes a draw command for the given render object.
965
1028
  *
@@ -991,28 +1054,23 @@ class WebGLBackend extends Backend {
991
1054
 
992
1055
  // vertex state
993
1056
 
994
- const renderObjectData = this.get( renderObject );
1057
+ const attributes = renderObject.getAttributes();
1058
+ const attributesData = this.get( attributes );
995
1059
 
996
- let vaoGPU = renderObjectData.staticVao;
1060
+ let vaoGPU = attributesData.vaoGPU;
997
1061
 
998
- if ( vaoGPU === undefined || renderObjectData.geometryId !== renderObject.geometry.id ) {
1062
+ if ( vaoGPU === undefined ) {
999
1063
 
1000
- const vaoKey = this._getVaoKey( renderObject.getAttributes() );
1064
+ const vaoKey = this._getVaoKey( attributes );
1001
1065
 
1002
1066
  vaoGPU = this.vaoCache[ vaoKey ];
1003
1067
 
1004
1068
  if ( vaoGPU === undefined ) {
1005
1069
 
1006
- let staticVao;
1007
-
1008
- ( { vaoGPU, staticVao } = this._createVao( renderObject.getAttributes() ) );
1070
+ vaoGPU = this._createVao( attributes );
1009
1071
 
1010
- if ( staticVao ) {
1011
-
1012
- renderObjectData.staticVao = vaoGPU;
1013
- renderObjectData.geometryId = renderObject.geometry.id;
1014
-
1015
- }
1072
+ this.vaoCache[ vaoKey ] = vaoGPU;
1073
+ attributesData.vaoGPU = vaoGPU;
1016
1074
 
1017
1075
  }
1018
1076
 
@@ -1128,7 +1186,7 @@ class WebGLBackend extends Backend {
1128
1186
 
1129
1187
  };
1130
1188
 
1131
- if ( renderObject.camera.isArrayCamera && renderObject.camera.cameras.length > 0 ) {
1189
+ if ( renderObject.camera.isArrayCamera === true && renderObject.camera.cameras.length > 0 && renderObject.camera.isMultiViewCamera === false ) {
1132
1190
 
1133
1191
  const cameraData = this.get( renderObject.camera );
1134
1192
  const cameras = renderObject.camera.cameras;
@@ -1159,25 +1217,71 @@ class WebGLBackend extends Backend {
1159
1217
  const cameraIndexData = this.get( cameraIndex );
1160
1218
  const pixelRatio = this.renderer.getPixelRatio();
1161
1219
 
1220
+ const renderTarget = this._currentContext.renderTarget;
1221
+ const isRenderCameraDepthArray = this._isRenderCameraDepthArray( this._currentContext );
1222
+ const prevActiveCubeFace = this._currentContext.activeCubeFace;
1223
+
1224
+ if ( isRenderCameraDepthArray ) {
1225
+
1226
+ // Clear the depth texture
1227
+ const textureData = this.get( renderTarget.depthTexture );
1228
+
1229
+ if ( textureData.clearedRenderId !== this.renderer._nodes.nodeFrame.renderId ) {
1230
+
1231
+ textureData.clearedRenderId = this.renderer._nodes.nodeFrame.renderId;
1232
+
1233
+ const { stencilBuffer } = renderTarget;
1234
+
1235
+ for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1236
+
1237
+ this.renderer._activeCubeFace = i;
1238
+ this._currentContext.activeCubeFace = i;
1239
+
1240
+ this._setFramebuffer( this._currentContext );
1241
+ this.clear( false, true, stencilBuffer, this._currentContext, false );
1242
+
1243
+ }
1244
+
1245
+ this.renderer._activeCubeFace = prevActiveCubeFace;
1246
+ this._currentContext.activeCubeFace = prevActiveCubeFace;
1247
+
1248
+ }
1249
+
1250
+ }
1251
+
1162
1252
  for ( let i = 0, len = cameras.length; i < len; i ++ ) {
1163
1253
 
1164
1254
  const subCamera = cameras[ i ];
1165
1255
 
1166
1256
  if ( object.layers.test( subCamera.layers ) ) {
1167
1257
 
1258
+ if ( isRenderCameraDepthArray ) {
1259
+
1260
+ // Update the active layer
1261
+ this.renderer._activeCubeFace = i;
1262
+ this._currentContext.activeCubeFace = i;
1263
+
1264
+ this._setFramebuffer( this._currentContext );
1265
+
1266
+ }
1267
+
1168
1268
  const vp = subCamera.viewport;
1169
1269
 
1170
- const x = vp.x * pixelRatio;
1171
- const y = vp.y * pixelRatio;
1172
- const width = vp.width * pixelRatio;
1173
- const height = vp.height * pixelRatio;
1270
+ if ( vp !== undefined ) {
1174
1271
 
1175
- state.viewport(
1176
- Math.floor( x ),
1177
- Math.floor( renderObject.context.height - height - y ),
1178
- Math.floor( width ),
1179
- Math.floor( height )
1180
- );
1272
+ const x = vp.x * pixelRatio;
1273
+ const y = vp.y * pixelRatio;
1274
+ const width = vp.width * pixelRatio;
1275
+ const height = vp.height * pixelRatio;
1276
+
1277
+ state.viewport(
1278
+ Math.floor( x ),
1279
+ Math.floor( renderObject.context.height - height - y ),
1280
+ Math.floor( width ),
1281
+ Math.floor( height )
1282
+ );
1283
+
1284
+ }
1181
1285
 
1182
1286
  state.bindBufferBase( gl.UNIFORM_BUFFER, cameraIndexData.index, cameraData.indexesGPU[ i ] );
1183
1287
 
@@ -1185,6 +1289,9 @@ class WebGLBackend extends Backend {
1185
1289
 
1186
1290
  }
1187
1291
 
1292
+ this._currentContext.activeCubeFace = prevActiveCubeFace;
1293
+ this.renderer._activeCubeFace = prevActiveCubeFace;
1294
+
1188
1295
  }
1189
1296
 
1190
1297
  } else {
@@ -1928,15 +2035,15 @@ class WebGLBackend extends Backend {
1928
2035
 
1929
2036
  const isCube = renderTarget.isWebGLCubeRenderTarget === true;
1930
2037
  const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
1931
- const isRenderTargetArray = renderTarget.isRenderTargetArray === true;
2038
+ const isRenderTargetArray = renderTarget.depth > 1;
1932
2039
  const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
1933
- const hasExternalTextures = ( isXRRenderTarget === true && renderTarget.hasExternalTextures === true );
2040
+ const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );
1934
2041
 
1935
2042
  let msaaFb = renderTargetContextData.msaaFrameBuffer;
1936
2043
  let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
1937
2044
  const multisampledRTTExt = this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
1938
- const useMultisampledRTT = this._useMultisampledRTT( renderTarget );
1939
-
2045
+ const multiviewExt = this.extensions.get( 'OVR_multiview2' );
2046
+ const useMultisampledRTT = this._useMultisampledExtension( renderTarget );
1940
2047
  const cacheKey = getCacheKey( descriptor );
1941
2048
 
1942
2049
  let fb;
@@ -1947,7 +2054,7 @@ class WebGLBackend extends Backend {
1947
2054
 
1948
2055
  fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
1949
2056
 
1950
- } else if ( isXRRenderTarget && hasExternalTextures === false ) {
2057
+ } else if ( isXRRenderTarget && _hasExternalTextures === false ) {
1951
2058
 
1952
2059
  fb = this._xrFramebuffer;
1953
2060
 
@@ -1966,6 +2073,7 @@ class WebGLBackend extends Backend {
1966
2073
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
1967
2074
 
1968
2075
  const textures = descriptor.textures;
2076
+ const depthInvalidationArray = [];
1969
2077
 
1970
2078
  if ( isCube ) {
1971
2079
 
@@ -1990,7 +2098,11 @@ class WebGLBackend extends Backend {
1990
2098
 
1991
2099
  const attachment = gl.COLOR_ATTACHMENT0 + i;
1992
2100
 
1993
- if ( isRenderTarget3D || isRenderTargetArray ) {
2101
+ if ( renderTarget.multiview ) {
2102
+
2103
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, samples, 0, 2 );
2104
+
2105
+ } else if ( isRenderTarget3D || isRenderTargetArray ) {
1994
2106
 
1995
2107
  const layer = this.renderer._activeCubeFace;
1996
2108
 
@@ -1998,7 +2110,7 @@ class WebGLBackend extends Backend {
1998
2110
 
1999
2111
  } else {
2000
2112
 
2001
- if ( hasExternalTextures && useMultisampledRTT ) {
2113
+ if ( useMultisampledRTT ) {
2002
2114
 
2003
2115
  multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2004
2116
 
@@ -2012,32 +2124,52 @@ class WebGLBackend extends Backend {
2012
2124
 
2013
2125
  }
2014
2126
 
2015
- state.drawBuffers( descriptor, fb );
2016
-
2017
2127
  }
2018
2128
 
2019
- if ( renderTarget.isXRRenderTarget && renderTarget.autoAllocateDepthBuffer === true ) {
2129
+ const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2130
+
2131
+ if ( renderTarget._autoAllocateDepthBuffer === true ) {
2020
2132
 
2021
2133
  const renderbuffer = gl.createRenderbuffer();
2022
2134
  this.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );
2023
2135
  renderTargetContextData.xrDepthRenderbuffer = renderbuffer;
2136
+ depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
2137
+
2138
+ gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
2139
+ gl.framebufferRenderbuffer( gl.FRAMEBUFFER, depthStyle, gl.RENDERBUFFER, renderbuffer );
2140
+
2024
2141
 
2025
2142
  } else {
2026
2143
 
2027
2144
  if ( descriptor.depthTexture !== null ) {
2028
2145
 
2146
+ depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
2147
+
2029
2148
  const textureData = this.get( descriptor.depthTexture );
2030
- const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2031
2149
  textureData.renderTarget = descriptor.renderTarget;
2032
2150
  textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
2033
2151
 
2034
- if ( hasExternalTextures && useMultisampledRTT ) {
2152
+ if ( renderTarget.multiview ) {
2153
+
2154
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
2155
+
2156
+ } else if ( _hasExternalTextures && useMultisampledRTT ) {
2035
2157
 
2036
2158
  multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2037
2159
 
2038
2160
  } else {
2039
2161
 
2040
- gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2162
+ if ( descriptor.depthTexture.isArrayTexture ) {
2163
+
2164
+ const layer = this.renderer._activeCubeFace;
2165
+
2166
+ gl.framebufferTextureLayer( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, layer );
2167
+
2168
+ } else {
2169
+
2170
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2171
+
2172
+ }
2041
2173
 
2042
2174
  }
2043
2175
 
@@ -2045,11 +2177,34 @@ class WebGLBackend extends Backend {
2045
2177
 
2046
2178
  }
2047
2179
 
2180
+ renderTargetContextData.depthInvalidationArray = depthInvalidationArray;
2181
+
2182
+
2048
2183
  } else {
2049
2184
 
2185
+ const isRenderCameraDepthArray = this._isRenderCameraDepthArray( descriptor );
2186
+
2187
+ if ( isRenderCameraDepthArray ) {
2188
+
2189
+ state.bindFramebuffer( gl.FRAMEBUFFER, fb );
2190
+
2191
+ const layer = this.renderer._activeCubeFace;
2192
+
2193
+ const depthData = this.get( descriptor.depthTexture );
2194
+ const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2195
+ gl.framebufferTextureLayer(
2196
+ gl.FRAMEBUFFER,
2197
+ depthStyle,
2198
+ depthData.textureGPU,
2199
+ 0,
2200
+ layer
2201
+ );
2202
+
2203
+ }
2204
+
2050
2205
  // rebind external XR textures
2051
2206
 
2052
- if ( isXRRenderTarget && hasExternalTextures ) {
2207
+ if ( ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) && ( renderTarget._isOpaqueFramebuffer !== true ) ) {
2053
2208
 
2054
2209
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
2055
2210
 
@@ -2057,7 +2212,11 @@ class WebGLBackend extends Backend {
2057
2212
 
2058
2213
  const textureData = this.get( descriptor.textures[ 0 ] );
2059
2214
 
2060
- if ( useMultisampledRTT ) {
2215
+ if ( renderTarget.multiview ) {
2216
+
2217
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureData.textureGPU, 0, samples, 0, 2 );
2218
+
2219
+ } else if ( useMultisampledRTT ) {
2061
2220
 
2062
2221
  multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2063
2222
 
@@ -2071,7 +2230,7 @@ class WebGLBackend extends Backend {
2071
2230
 
2072
2231
  const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2073
2232
 
2074
- if ( renderTarget.autoAllocateDepthBuffer === true ) {
2233
+ if ( renderTarget._autoAllocateDepthBuffer === true ) {
2075
2234
 
2076
2235
  const renderbuffer = renderTargetContextData.xrDepthRenderbuffer;
2077
2236
  gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
@@ -2081,7 +2240,11 @@ class WebGLBackend extends Backend {
2081
2240
 
2082
2241
  const textureData = this.get( descriptor.depthTexture );
2083
2242
 
2084
- if ( useMultisampledRTT ) {
2243
+ if ( renderTarget.multiview ) {
2244
+
2245
+ multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
2246
+
2247
+ } else if ( useMultisampledRTT ) {
2085
2248
 
2086
2249
  multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
2087
2250
 
@@ -2097,7 +2260,7 @@ class WebGLBackend extends Backend {
2097
2260
 
2098
2261
  }
2099
2262
 
2100
- if ( samples > 0 && useMultisampledRTT === false ) {
2263
+ if ( samples > 0 && useMultisampledRTT === false && ! renderTarget.multiview ) {
2101
2264
 
2102
2265
  if ( msaaFb === undefined ) {
2103
2266
 
@@ -2119,13 +2282,6 @@ class WebGLBackend extends Backend {
2119
2282
 
2120
2283
  invalidationArray.push( gl.COLOR_ATTACHMENT0 + i );
2121
2284
 
2122
- if ( depthBuffer ) {
2123
-
2124
- const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
2125
- invalidationArray.push( depthStyle );
2126
-
2127
- }
2128
-
2129
2285
  const texture = descriptor.textures[ i ];
2130
2286
  const textureData = this.get( texture );
2131
2287
 
@@ -2135,10 +2291,12 @@ class WebGLBackend extends Backend {
2135
2291
 
2136
2292
  }
2137
2293
 
2294
+ gl.bindRenderbuffer( gl.RENDERBUFFER, null );
2295
+
2138
2296
  renderTargetContextData.msaaFrameBuffer = msaaFb;
2139
2297
  renderTargetContextData.msaaRenderbuffers = msaaRenderbuffers;
2140
2298
 
2141
- if ( depthRenderbuffer === undefined ) {
2299
+ if ( depthBuffer && depthRenderbuffer === undefined ) {
2142
2300
 
2143
2301
  depthRenderbuffer = gl.createRenderbuffer();
2144
2302
  this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor, samples );
@@ -2162,6 +2320,8 @@ class WebGLBackend extends Backend {
2162
2320
 
2163
2321
  }
2164
2322
 
2323
+ state.drawBuffers( descriptor, fb );
2324
+
2165
2325
  }
2166
2326
 
2167
2327
  state.bindFramebuffer( gl.FRAMEBUFFER, currentFrameBuffer );
@@ -2203,9 +2363,6 @@ class WebGLBackend extends Backend {
2203
2363
  const { gl } = this;
2204
2364
 
2205
2365
  const vaoGPU = gl.createVertexArray();
2206
- let key = '';
2207
-
2208
- let staticVao = true;
2209
2366
 
2210
2367
  gl.bindVertexArray( vaoGPU );
2211
2368
 
@@ -2214,13 +2371,9 @@ class WebGLBackend extends Backend {
2214
2371
  const attribute = attributes[ i ];
2215
2372
  const attributeData = this.get( attribute );
2216
2373
 
2217
- key += ':' + attributeData.id;
2218
-
2219
2374
  gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
2220
2375
  gl.enableVertexAttribArray( i );
2221
2376
 
2222
- if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) staticVao = false;
2223
-
2224
2377
  let stride, offset;
2225
2378
 
2226
2379
  if ( attribute.isInterleavedBufferAttribute === true ) {
@@ -2259,9 +2412,7 @@ class WebGLBackend extends Backend {
2259
2412
 
2260
2413
  gl.bindBuffer( gl.ARRAY_BUFFER, null );
2261
2414
 
2262
- this.vaoCache[ key ] = vaoGPU;
2263
-
2264
- return { vaoGPU, staticVao };
2415
+ return vaoGPU;
2265
2416
 
2266
2417
  }
2267
2418
 
@@ -2390,9 +2541,15 @@ class WebGLBackend extends Backend {
2390
2541
  * @param {RenderTarget} renderTarget - The render target that should be multisampled.
2391
2542
  * @return {boolean} Whether to use the `WEBGL_multisampled_render_to_texture` extension for MSAA or not.
2392
2543
  */
2393
- _useMultisampledRTT( renderTarget ) {
2544
+ _useMultisampledExtension( renderTarget ) {
2545
+
2546
+ if ( renderTarget.multiview === true ) {
2547
+
2548
+ return true;
2549
+
2550
+ }
2394
2551
 
2395
- return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget.autoAllocateDepthBuffer !== false;
2552
+ return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget._autoAllocateDepthBuffer !== false;
2396
2553
 
2397
2554
  }
2398
2555