@plastic-software/three 0.175.14 → 0.179.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 (572) hide show
  1. package/README.md +4 -4
  2. package/build/three.cjs +8402 -6787
  3. package/build/three.core.js +8007 -6688
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +397 -102
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +84 -27
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +6831 -2838
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +6648 -2838
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +1 -3
  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 +2 -1
  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 +22 -8
  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 +57 -38
  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 +679 -300
  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 +48 -8
  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 +11 -2
  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/libs/meshopt_decoder.module.js +75 -58
  76. package/examples/jsm/lighting/TiledLighting.js +1 -0
  77. package/examples/jsm/lights/LightProbeGenerator.js +15 -3
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  79. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  80. package/examples/jsm/lines/Line2.js +1 -0
  81. package/examples/jsm/lines/LineGeometry.js +1 -0
  82. package/examples/jsm/lines/LineMaterial.js +4 -4
  83. package/examples/jsm/lines/LineSegments2.js +1 -0
  84. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  85. package/examples/jsm/lines/Wireframe.js +1 -0
  86. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  87. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  88. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  89. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  90. package/examples/jsm/loaders/3DMLoader.js +1 -0
  91. package/examples/jsm/loaders/3MFLoader.js +1 -0
  92. package/examples/jsm/loaders/AMFLoader.js +1 -0
  93. package/examples/jsm/loaders/BVHLoader.js +1 -0
  94. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  95. package/examples/jsm/loaders/DDSLoader.js +1 -0
  96. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  97. package/examples/jsm/loaders/EXRLoader.js +211 -22
  98. package/examples/jsm/loaders/FBXLoader.js +25 -23
  99. package/examples/jsm/loaders/FontLoader.js +1 -0
  100. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  101. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  102. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  103. package/examples/jsm/loaders/IESLoader.js +1 -0
  104. package/examples/jsm/loaders/KMZLoader.js +1 -0
  105. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  106. package/examples/jsm/loaders/KTXLoader.js +1 -0
  107. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  108. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  110. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  111. package/examples/jsm/loaders/LWOLoader.js +1 -13
  112. package/examples/jsm/loaders/LottieLoader.js +15 -0
  113. package/examples/jsm/loaders/MD2Loader.js +1 -0
  114. package/examples/jsm/loaders/MDDLoader.js +1 -0
  115. package/examples/jsm/loaders/MTLLoader.js +4 -3
  116. package/examples/jsm/loaders/MaterialXLoader.js +213 -30
  117. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  118. package/examples/jsm/loaders/OBJLoader.js +1 -0
  119. package/examples/jsm/loaders/PCDLoader.js +122 -19
  120. package/examples/jsm/loaders/PDBLoader.js +1 -0
  121. package/examples/jsm/loaders/PLYLoader.js +1 -0
  122. package/examples/jsm/loaders/PVRLoader.js +1 -0
  123. package/examples/jsm/loaders/RGBELoader.js +1 -0
  124. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  125. package/examples/jsm/loaders/STLLoader.js +1 -0
  126. package/examples/jsm/loaders/SVGLoader.js +1 -0
  127. package/examples/jsm/loaders/TDSLoader.js +1 -0
  128. package/examples/jsm/loaders/TGALoader.js +1 -0
  129. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  130. package/examples/jsm/loaders/TTFLoader.js +14 -1
  131. package/examples/jsm/loaders/USDLoader.js +219 -0
  132. package/examples/jsm/loaders/USDZLoader.js +4 -891
  133. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  134. package/examples/jsm/loaders/VOXLoader.js +1 -0
  135. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  136. package/examples/jsm/loaders/VTKLoader.js +1 -0
  137. package/examples/jsm/loaders/XYZLoader.js +1 -0
  138. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  139. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  140. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  141. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  142. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  143. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  144. package/examples/jsm/math/Capsule.js +2 -0
  145. package/examples/jsm/math/ColorConverter.js +1 -0
  146. package/examples/jsm/math/ConvexHull.js +2 -0
  147. package/examples/jsm/math/ImprovedNoise.js +19 -14
  148. package/examples/jsm/math/Lut.js +2 -0
  149. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  150. package/examples/jsm/math/OBB.js +2 -0
  151. package/examples/jsm/math/Octree.js +20 -1
  152. package/examples/jsm/math/SimplexNoise.js +2 -0
  153. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  154. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  155. package/examples/jsm/misc/Gyroscope.js +1 -0
  156. package/examples/jsm/misc/MD2Character.js +2 -0
  157. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  158. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  159. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  160. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  161. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  162. package/examples/jsm/misc/RollerCoaster.js +5 -0
  163. package/examples/jsm/misc/TubePainter.js +1 -0
  164. package/examples/jsm/misc/Volume.js +2 -0
  165. package/examples/jsm/misc/VolumeSlice.js +1 -0
  166. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  167. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  168. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  169. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  170. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  171. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  172. package/examples/jsm/objects/Lensflare.js +3 -0
  173. package/examples/jsm/objects/LensflareMesh.js +4 -3
  174. package/examples/jsm/objects/MarchingCubes.js +2 -0
  175. package/examples/jsm/objects/Reflector.js +1 -0
  176. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  177. package/examples/jsm/objects/Refractor.js +1 -0
  178. package/examples/jsm/objects/ShadowMesh.js +1 -0
  179. package/examples/jsm/objects/Sky.js +2 -1
  180. package/examples/jsm/objects/SkyMesh.js +22 -19
  181. package/examples/jsm/objects/Water.js +1 -0
  182. package/examples/jsm/objects/Water2.js +1 -0
  183. package/examples/jsm/objects/Water2Mesh.js +3 -1
  184. package/examples/jsm/objects/WaterMesh.js +2 -1
  185. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  186. package/examples/jsm/physics/JoltPhysics.js +1 -0
  187. package/examples/jsm/physics/RapierPhysics.js +149 -13
  188. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  189. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  190. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  191. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  192. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  193. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  194. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  195. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  196. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  197. package/examples/jsm/postprocessing/GTAOPass.js +14 -12
  198. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  199. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  200. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  201. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  202. package/examples/jsm/postprocessing/OutlinePass.js +22 -19
  203. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  204. package/examples/jsm/postprocessing/Pass.js +3 -1
  205. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  206. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  207. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  208. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  209. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  210. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  211. package/examples/jsm/postprocessing/SSAOPass.js +12 -10
  212. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  213. package/examples/jsm/postprocessing/SavePass.js +2 -1
  214. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  215. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  216. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  217. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  218. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  219. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  220. package/examples/jsm/renderers/Projector.js +2 -0
  221. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  222. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  223. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  224. package/examples/jsm/shaders/BasicShader.js +4 -1
  225. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  226. package/examples/jsm/shaders/BlendShader.js +4 -1
  227. package/examples/jsm/shaders/BokehShader.js +4 -1
  228. package/examples/jsm/shaders/BokehShader2.js +4 -1
  229. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  230. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  231. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  232. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  233. package/examples/jsm/shaders/CopyShader.js +4 -1
  234. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  235. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  236. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  237. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  238. package/examples/jsm/shaders/ExposureShader.js +4 -1
  239. package/examples/jsm/shaders/FXAAShader.js +4 -1
  240. package/examples/jsm/shaders/FilmShader.js +4 -1
  241. package/examples/jsm/shaders/FocusShader.js +4 -1
  242. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  243. package/examples/jsm/shaders/GTAOShader.js +4 -1
  244. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  245. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  246. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  247. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  248. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  249. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  250. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  251. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  252. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  253. package/examples/jsm/shaders/MirrorShader.js +4 -1
  254. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  255. package/examples/jsm/shaders/OutputShader.js +4 -1
  256. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  257. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  258. package/examples/jsm/shaders/SAOShader.js +4 -1
  259. package/examples/jsm/shaders/SMAAShader.js +1 -0
  260. package/examples/jsm/shaders/SSAOShader.js +4 -1
  261. package/examples/jsm/shaders/SSRShader.js +1 -0
  262. package/examples/jsm/shaders/SepiaShader.js +4 -1
  263. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  264. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  265. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  266. package/examples/jsm/shaders/ToonShader.js +2 -1
  267. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  268. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +15 -3
  269. package/examples/jsm/shaders/VelocityShader.js +4 -1
  270. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  271. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  272. package/examples/jsm/shaders/VignetteShader.js +4 -1
  273. package/examples/jsm/shaders/VolumeShader.js +5 -2
  274. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  275. package/examples/jsm/textures/FlakesTexture.js +2 -0
  276. package/examples/jsm/transpiler/AST.js +381 -30
  277. package/examples/jsm/transpiler/GLSLDecoder.js +227 -88
  278. package/examples/jsm/transpiler/Linker.js +327 -0
  279. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  280. package/examples/jsm/transpiler/Transpiler.js +19 -1
  281. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  282. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  283. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  284. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  285. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  286. package/examples/jsm/tsl/display/BloomNode.js +9 -7
  287. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  288. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  289. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  290. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  291. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  292. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  293. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  294. package/examples/jsm/tsl/display/GaussianBlurNode.js +9 -36
  295. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  296. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  297. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  298. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  299. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  300. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  301. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  302. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  303. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  304. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  305. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  306. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  307. package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +184 -174
  308. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  309. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  310. package/examples/jsm/tsl/lighting/TiledLightsNode.js +5 -4
  311. package/examples/jsm/tsl/math/Bayer.js +4 -1
  312. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  313. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  314. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  315. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  316. package/examples/jsm/utils/CameraUtils.js +4 -1
  317. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  318. package/examples/jsm/utils/GeometryUtils.js +4 -1
  319. package/examples/jsm/utils/LDrawUtils.js +2 -0
  320. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  321. package/examples/jsm/utils/SceneUtils.js +4 -1
  322. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  323. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  324. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  325. package/examples/jsm/utils/SortUtils.js +4 -1
  326. package/examples/jsm/utils/UVsDebug.js +4 -1
  327. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  328. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  329. package/examples/jsm/utils/WorkerPool.js +2 -0
  330. package/examples/jsm/webxr/ARButton.js +1 -0
  331. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  332. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  333. package/examples/jsm/webxr/Text2D.js +4 -1
  334. package/examples/jsm/webxr/VRButton.js +1 -0
  335. package/examples/jsm/webxr/XRButton.js +1 -0
  336. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  338. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  339. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  340. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  341. package/examples/jsm/webxr/XRPlanes.js +1 -0
  342. package/package.json +6 -4
  343. package/src/Three.Core.js +2 -1
  344. package/src/Three.TSL.js +83 -26
  345. package/src/Three.WebGPU.Nodes.js +1 -0
  346. package/src/Three.WebGPU.js +3 -0
  347. package/src/animation/KeyframeTrack.js +1 -1
  348. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  349. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  350. package/src/audio/AudioListener.js +13 -10
  351. package/src/cameras/ArrayCamera.js +9 -1
  352. package/src/cameras/Camera.js +14 -0
  353. package/src/cameras/OrthographicCamera.js +1 -1
  354. package/src/cameras/PerspectiveCamera.js +1 -1
  355. package/src/constants.js +47 -20
  356. package/src/core/BufferAttribute.js +3 -3
  357. package/src/core/BufferGeometry.js +2 -5
  358. package/src/core/Clock.js +2 -8
  359. package/src/core/GLBufferAttribute.js +13 -1
  360. package/src/core/Object3D.js +23 -22
  361. package/src/core/RenderTarget.js +65 -21
  362. package/src/core/RenderTarget3D.js +1 -0
  363. package/{examples/jsm/misc → src/core}/Timer.js +4 -40
  364. package/src/extras/PMREMGenerator.js +11 -0
  365. package/src/extras/TextureUtils.js +1 -5
  366. package/src/extras/core/Curve.js +1 -1
  367. package/src/extras/core/Path.js +22 -22
  368. package/src/geometries/CapsuleGeometry.js +167 -17
  369. package/src/geometries/ExtrudeGeometry.js +39 -29
  370. package/src/helpers/ArrowHelper.js +2 -2
  371. package/src/helpers/CameraHelper.js +41 -11
  372. package/src/helpers/SkeletonHelper.js +36 -7
  373. package/src/lights/LightShadow.js +34 -7
  374. package/src/lights/PointLightShadow.js +1 -1
  375. package/src/lights/SpotLightShadow.js +9 -1
  376. package/src/lights/webgpu/ProjectorLight.js +46 -0
  377. package/src/loaders/BufferGeometryLoader.js +1 -10
  378. package/src/loaders/FileLoader.js +27 -4
  379. package/src/loaders/ImageBitmapLoader.js +48 -9
  380. package/src/loaders/ImageLoader.js +55 -8
  381. package/src/loaders/Loader.js +14 -0
  382. package/src/loaders/LoadingManager.js +23 -0
  383. package/src/loaders/ObjectLoader.js +44 -16
  384. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  385. package/src/materials/Material.js +1 -7
  386. package/src/materials/MeshBasicMaterial.js +1 -1
  387. package/src/materials/nodes/Line2NodeMaterial.js +0 -8
  388. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  389. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  390. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  391. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  392. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  393. package/src/materials/nodes/NodeMaterial.js +106 -20
  394. package/src/materials/nodes/PointsNodeMaterial.js +5 -0
  395. package/src/materials/nodes/manager/NodeMaterialObserver.js +107 -4
  396. package/src/math/Box3.js +28 -0
  397. package/src/math/Color.js +7 -7
  398. package/src/math/ColorManagement.js +22 -3
  399. package/src/math/Frustum.js +25 -9
  400. package/src/math/FrustumArray.js +258 -0
  401. package/src/math/Line3.js +129 -2
  402. package/src/math/Matrix4.js +48 -27
  403. package/src/math/Quaternion.js +1 -1
  404. package/src/math/Ray.js +2 -0
  405. package/src/math/Sphere.js +28 -0
  406. package/src/math/Spherical.js +2 -2
  407. package/src/nodes/Nodes.js +3 -3
  408. package/src/nodes/TSL.js +6 -3
  409. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  410. package/src/nodes/accessors/Bitangent.js +54 -26
  411. package/src/nodes/accessors/Camera.js +40 -13
  412. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  413. package/src/nodes/accessors/InstanceNode.js +5 -4
  414. package/src/nodes/accessors/Lights.js +2 -2
  415. package/src/nodes/accessors/MaterialNode.js +4 -0
  416. package/src/nodes/accessors/ModelNode.js +1 -1
  417. package/src/nodes/accessors/Normal.js +110 -24
  418. package/src/nodes/accessors/Object3DNode.js +7 -8
  419. package/src/nodes/accessors/Position.js +14 -4
  420. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  421. package/src/nodes/accessors/ReferenceNode.js +19 -4
  422. package/src/nodes/accessors/ReflectVector.js +3 -3
  423. package/src/nodes/accessors/SceneNode.js +1 -1
  424. package/src/nodes/accessors/SkinningNode.js +3 -2
  425. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  426. package/src/nodes/accessors/StorageTextureNode.js +15 -4
  427. package/src/nodes/accessors/Tangent.js +25 -17
  428. package/src/nodes/accessors/TangentUtils.js +46 -0
  429. package/src/nodes/accessors/TextureBicubic.js +21 -3
  430. package/src/nodes/accessors/TextureNode.js +71 -8
  431. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  432. package/src/nodes/accessors/VelocityNode.js +1 -0
  433. package/src/nodes/accessors/VertexColorNode.js +4 -4
  434. package/src/nodes/code/CodeNode.js +8 -11
  435. package/src/nodes/core/ArrayNode.js +12 -0
  436. package/src/nodes/core/AssignNode.js +30 -5
  437. package/src/nodes/core/AttributeNode.js +2 -2
  438. package/src/nodes/core/ContextNode.js +27 -4
  439. package/src/nodes/core/Node.js +83 -22
  440. package/src/nodes/core/NodeBuilder.js +273 -49
  441. package/src/nodes/core/NodeUtils.js +46 -1
  442. package/src/nodes/core/NodeVarying.js +19 -1
  443. package/src/nodes/core/PropertyNode.js +8 -12
  444. package/src/nodes/core/StackNode.js +171 -26
  445. package/src/nodes/core/StructTypeNode.js +26 -4
  446. package/src/nodes/core/SubBuildNode.js +89 -0
  447. package/src/nodes/core/UniformNode.js +63 -5
  448. package/src/nodes/core/VarNode.js +102 -4
  449. package/src/nodes/core/VaryingNode.js +45 -24
  450. package/src/nodes/display/BlendModes.js +42 -1
  451. package/src/nodes/display/ColorSpaceNode.js +4 -27
  452. package/src/nodes/display/FrontFacingNode.js +34 -2
  453. package/src/nodes/display/NormalMapNode.js +19 -50
  454. package/src/nodes/display/PassNode.js +165 -20
  455. package/src/nodes/display/ScreenNode.js +0 -26
  456. package/src/nodes/display/ViewportTextureNode.js +67 -7
  457. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  458. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  459. package/src/nodes/functions/PhongLightingModel.js +3 -3
  460. package/src/nodes/functions/PhysicalLightingModel.js +16 -16
  461. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  462. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  463. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  464. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  465. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  466. package/src/nodes/gpgpu/ComputeNode.js +68 -24
  467. package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
  468. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  469. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  470. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  471. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  472. package/src/nodes/lighting/LightsNode.js +29 -11
  473. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  474. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  475. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  476. package/src/nodes/lighting/ShadowNode.js +174 -242
  477. package/src/nodes/lighting/SpotLightNode.js +44 -7
  478. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  479. package/src/nodes/materialx/lib/mx_noise.js +166 -2
  480. package/src/nodes/math/ConditionalNode.js +1 -20
  481. package/src/nodes/math/MathNode.js +146 -75
  482. package/src/nodes/math/OperatorNode.js +129 -119
  483. package/src/nodes/shapes/Shapes.js +5 -4
  484. package/src/nodes/tsl/TSLBase.js +1 -0
  485. package/src/nodes/tsl/TSLCore.js +222 -72
  486. package/src/nodes/utils/DebugNode.js +16 -4
  487. package/src/nodes/utils/Discard.js +2 -2
  488. package/src/nodes/utils/EquirectUV.js +27 -0
  489. package/src/nodes/utils/EventNode.js +83 -0
  490. package/src/nodes/utils/LoopNode.js +64 -34
  491. package/src/nodes/utils/MatcapUV.js +22 -0
  492. package/src/nodes/utils/RTTNode.js +22 -5
  493. package/src/nodes/utils/ReflectorNode.js +77 -7
  494. package/src/nodes/utils/SampleNode.js +81 -0
  495. package/src/nodes/utils/TriplanarTextures.js +65 -0
  496. package/src/objects/BatchedMesh.js +20 -6
  497. package/src/objects/Mesh.js +9 -0
  498. package/src/objects/Skeleton.js +1 -1
  499. package/src/objects/Sprite.js +9 -0
  500. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  501. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  502. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  503. package/src/renderers/WebGLRenderer.js +45 -32
  504. package/src/renderers/common/Animation.js +2 -2
  505. package/src/renderers/common/Background.js +13 -2
  506. package/src/renderers/common/Bindings.js +19 -18
  507. package/src/renderers/common/Color4.js +2 -2
  508. package/src/renderers/common/CubeRenderTarget.js +1 -1
  509. package/src/renderers/common/PostProcessing.js +60 -5
  510. package/src/renderers/common/RenderList.js +0 -4
  511. package/src/renderers/common/RenderObject.js +80 -4
  512. package/src/renderers/common/Renderer.js +133 -22
  513. package/src/renderers/common/SampledTexture.js +3 -71
  514. package/src/renderers/common/Sampler.js +79 -0
  515. package/src/renderers/common/Storage3DTexture.js +100 -0
  516. package/src/renderers/common/StorageArrayTexture.js +84 -0
  517. package/src/renderers/common/StorageTexture.js +19 -0
  518. package/src/renderers/common/Textures.js +34 -24
  519. package/src/renderers/common/TimestampQueryPool.js +1 -0
  520. package/src/renderers/common/Uniform.js +1 -1
  521. package/src/renderers/common/UniformsGroup.js +14 -18
  522. package/src/renderers/common/XRManager.js +183 -35
  523. package/src/renderers/common/XRRenderTarget.js +21 -4
  524. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  525. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  526. package/src/renderers/common/nodes/Nodes.js +13 -3
  527. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  528. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +20 -2
  529. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  530. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  531. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  532. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  533. package/src/renderers/webgl/WebGLMaterials.js +6 -6
  534. package/src/renderers/webgl/WebGLProgram.js +22 -16
  535. package/src/renderers/webgl/WebGLPrograms.js +8 -6
  536. package/src/renderers/webgl/WebGLShadowMap.js +14 -3
  537. package/src/renderers/webgl/WebGLState.js +4 -4
  538. package/src/renderers/webgl/WebGLTextures.js +163 -11
  539. package/src/renderers/webgl/WebGLUtils.js +1 -3
  540. package/src/renderers/webgl-fallback/WebGLBackend.js +261 -94
  541. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -9
  542. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  543. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  544. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  545. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  546. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  547. package/src/renderers/webgpu/WebGPUBackend.js +505 -143
  548. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  549. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  550. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  551. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +129 -96
  552. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  553. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  554. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +58 -31
  555. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  556. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -9
  557. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +50 -108
  558. package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
  559. package/src/renderers/webxr/WebXRController.js +1 -1
  560. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  561. package/src/renderers/webxr/WebXRManager.js +70 -9
  562. package/src/textures/DepthTexture.js +6 -10
  563. package/src/textures/ExternalTexture.js +45 -0
  564. package/src/textures/FramebufferTexture.js +2 -2
  565. package/src/textures/Source.js +32 -0
  566. package/src/textures/Texture.js +118 -1
  567. package/src/textures/VideoTexture.js +31 -3
  568. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  569. package/src/core/RenderTargetArray.js +0 -40
  570. package/src/nodes/utils/EquirectUVNode.js +0 -65
  571. package/src/nodes/utils/MatcapUVNode.js +0 -49
  572. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -11,6 +11,8 @@ import { AddEquation, BackSide, CustomBlending, DepthFormat, DepthStencilFormat,
11
11
  import { DepthTexture } from '../../textures/DepthTexture.js';
12
12
  import { XRRenderTarget } from './XRRenderTarget.js';
13
13
  import { CylinderGeometry } from '../../geometries/CylinderGeometry.js';
14
+ import QuadMesh from './QuadMesh.js';
15
+ import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
14
16
  import { PlaneGeometry } from '../../geometries/PlaneGeometry.js';
15
17
  import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial.js';
16
18
  import { Mesh } from '../../objects/Mesh.js';
@@ -32,8 +34,9 @@ class XRManager extends EventDispatcher {
32
34
  * Constructs a new XR manager.
33
35
  *
34
36
  * @param {Renderer} renderer - The renderer.
37
+ * @param {boolean} [multiview=false] - Enables multiview if the device supports it.
35
38
  */
36
- constructor( renderer ) {
39
+ constructor( renderer, multiview = false ) {
37
40
 
38
41
  super();
39
42
 
@@ -168,6 +171,17 @@ class XRManager extends EventDispatcher {
168
171
  */
169
172
  this._supportsLayers = false;
170
173
 
174
+ /**
175
+ * Whether the device supports binding gl objects.
176
+ *
177
+ * @private
178
+ * @type {boolean}
179
+ * @readonly
180
+ */
181
+ this._supportsGlBinding = typeof XRWebGLBinding !== 'undefined';
182
+
183
+ this._frameBufferTargets = null;
184
+
171
185
  /**
172
186
  * Helper function to create native WebXR Layer.
173
187
  *
@@ -352,7 +366,27 @@ class XRManager extends EventDispatcher {
352
366
  * @type {boolean}
353
367
  * @readonly
354
368
  */
355
- this._useLayers = ( typeof XRWebGLBinding !== 'undefined' && 'createProjectionLayer' in XRWebGLBinding.prototype ); // eslint-disable-line compat/compat
369
+ this._useLayers = ( this._supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype ); // eslint-disable-line compat/compat
370
+
371
+ /**
372
+ * Whether the usage of multiview has been requested by the application or not.
373
+ *
374
+ * @private
375
+ * @type {boolean}
376
+ * @default false
377
+ * @readonly
378
+ */
379
+ this._useMultiviewIfPossible = multiview;
380
+
381
+ /**
382
+ * Whether the usage of multiview is actually enabled. This flag only evaluates to `true`
383
+ * if multiview has been requested by the application and the `OVR_multiview2` is available.
384
+ *
385
+ * @private
386
+ * @type {boolean}
387
+ * @readonly
388
+ */
389
+ this._useMultiview = false;
356
390
 
357
391
  }
358
392
 
@@ -564,7 +598,33 @@ class XRManager extends EventDispatcher {
564
598
 
565
599
  }
566
600
 
567
- createQuadLayer( width, height, translation, quaternion, pixelwidth, pixelheight, rendercall, attributes = [] ) {
601
+ /**
602
+ * Returns `true` if the engine renders to a multiview target.
603
+ *
604
+ * @return {boolean} Whether the engine renders to a multiview render target or not.
605
+ */
606
+ useMultiview() {
607
+
608
+ return this._useMultiview;
609
+
610
+ }
611
+
612
+ /**
613
+ * This method can be used in XR applications to create a quadratic layer that presents a separate
614
+ * rendered scene.
615
+ *
616
+ * @param {number} width - The width of the layer plane in world units.
617
+ * @param {number} height - The height of the layer plane in world units.
618
+ * @param {Vector3} translation - The position/translation of the layer plane in world units.
619
+ * @param {Quaternion} quaternion - The orientation of the layer plane expressed as a quaternion.
620
+ * @param {number} pixelwidth - The width of the layer's render target in pixels.
621
+ * @param {number} pixelheight - The height of the layer's render target in pixels.
622
+ * @param {Function} rendercall - A callback function that renders the layer. Similar to code in
623
+ * the default animation loop, this method can be used to update/transform 3D object in the layer's scene.
624
+ * @param {Object} [attributes={}] - Allows to configure the layer's render target.
625
+ * @return {Mesh} A mesh representing the quadratic XR layer. This mesh should be added to the XR scene.
626
+ */
627
+ createQuadLayer( width, height, translation, quaternion, pixelwidth, pixelheight, rendercall, attributes = {} ) {
568
628
 
569
629
  const geometry = new PlaneGeometry( width, height );
570
630
  const renderTarget = new XRRenderTarget(
@@ -590,6 +650,8 @@ class XRManager extends EventDispatcher {
590
650
  resolveStencilBuffer: false
591
651
  } );
592
652
 
653
+ renderTarget._autoAllocateDepthBuffer = true;
654
+
593
655
  const material = new MeshBasicMaterial( { color: 0xffffff, side: FrontSide } );
594
656
  material.map = renderTarget.texture;
595
657
  material.map.offset.y = 1;
@@ -637,7 +699,23 @@ class XRManager extends EventDispatcher {
637
699
 
638
700
  }
639
701
 
640
- createCylinderLayer( radius, centralAngle, aspectratio, translation, quaternion, pixelwidth, pixelheight, rendercall, attributes = [] ) {
702
+ /**
703
+ * This method can be used in XR applications to create a cylindrical layer that presents a separate
704
+ * rendered scene.
705
+ *
706
+ * @param {number} radius - The radius of the cylinder in world units.
707
+ * @param {number} centralAngle - The central angle of the cylinder in radians.
708
+ * @param {number} aspectratio - The aspect ratio.
709
+ * @param {Vector3} translation - The position/translation of the layer plane in world units.
710
+ * @param {Quaternion} quaternion - The orientation of the layer plane expressed as a quaternion.
711
+ * @param {number} pixelwidth - The width of the layer's render target in pixels.
712
+ * @param {number} pixelheight - The height of the layer's render target in pixels.
713
+ * @param {Function} rendercall - A callback function that renders the layer. Similar to code in
714
+ * the default animation loop, this method can be used to update/transform 3D object in the layer's scene.
715
+ * @param {Object} [attributes={}] - Allows to configure the layer's render target.
716
+ * @return {Mesh} A mesh representing the cylindrical XR layer. This mesh should be added to the XR scene.
717
+ */
718
+ createCylinderLayer( radius, centralAngle, aspectratio, translation, quaternion, pixelwidth, pixelheight, rendercall, attributes = {} ) {
641
719
 
642
720
  const geometry = new CylinderGeometry( radius, radius, radius * centralAngle / aspectratio, 64, 64, true, Math.PI - centralAngle / 2, centralAngle );
643
721
  const renderTarget = new XRRenderTarget(
@@ -663,6 +741,8 @@ class XRManager extends EventDispatcher {
663
741
  resolveStencilBuffer: false
664
742
  } );
665
743
 
744
+ renderTarget._autoAllocateDepthBuffer = true;
745
+
666
746
  const material = new MeshBasicMaterial( { color: 0xffffff, side: BackSide } );
667
747
  material.map = renderTarget.texture;
668
748
  material.map.offset.y = 1;
@@ -711,39 +791,80 @@ class XRManager extends EventDispatcher {
711
791
 
712
792
  }
713
793
 
794
+ /**
795
+ * Renders the XR layers that have been previously added to the scene.
796
+ *
797
+ * This method is usually called in your animation loop before rendering
798
+ * the actual scene via `renderer.render( scene, camera );`.
799
+ */
714
800
  renderLayers( ) {
715
801
 
716
802
  const translationObject = new Vector3();
717
803
  const quaternionObject = new Quaternion();
804
+ const renderer = this._renderer;
718
805
 
719
806
  const wasPresenting = this.isPresenting;
807
+ const rendererOutputTarget = renderer.getOutputRenderTarget();
808
+ const rendererFramebufferTarget = renderer._frameBufferTarget;
720
809
  this.isPresenting = false;
721
810
 
811
+ const rendererSize = new Vector2();
812
+ renderer.getSize( rendererSize );
813
+ const rendererQuad = renderer._quad;
814
+
722
815
  for ( const layer of this._layers ) {
723
816
 
724
817
  layer.renderTarget.isXRRenderTarget = this._session !== null;
725
- layer.renderTarget.hasExternalTextures = layer.renderTarget.isXRRenderTarget;
726
- layer.renderTarget.autoAllocateDepthBuffer = ! layer.renderTarget.isXRRenderTarget;
818
+ layer.renderTarget._hasExternalTextures = layer.renderTarget.isXRRenderTarget;
727
819
 
728
820
  if ( layer.renderTarget.isXRRenderTarget && this._supportsLayers ) {
729
821
 
730
822
  layer.xrlayer.transform = new XRRigidTransform( layer.plane.getWorldPosition( translationObject ), layer.plane.getWorldQuaternion( quaternionObject ) );
731
823
 
732
824
  const glSubImage = this._glBinding.getSubImage( layer.xrlayer, this._xrFrame );
733
- this._renderer.backend.setXRRenderTargetTextures(
825
+ renderer.backend.setXRRenderTargetTextures(
734
826
  layer.renderTarget,
735
827
  glSubImage.colorTexture,
736
- glSubImage.depthStencilTexture );
828
+ undefined );
737
829
 
738
- }
830
+ renderer._setXRLayerSize( layer.renderTarget.width, layer.renderTarget.height );
831
+ renderer.setOutputRenderTarget( layer.renderTarget );
832
+ renderer.setRenderTarget( null );
833
+ renderer._frameBufferTarget = null;
834
+
835
+ this._frameBufferTargets || ( this._frameBufferTargets = new WeakMap() );
836
+ const { frameBufferTarget, quad } = this._frameBufferTargets.get( layer.renderTarget ) || { frameBufferTarget: null, quad: null };
837
+ if ( ! frameBufferTarget ) {
838
+
839
+ renderer._quad = new QuadMesh( new NodeMaterial() );
840
+ this._frameBufferTargets.set( layer.renderTarget, { frameBufferTarget: renderer._getFrameBufferTarget(), quad: renderer._quad } );
841
+
842
+ } else {
843
+
844
+ renderer._frameBufferTarget = frameBufferTarget;
845
+ renderer._quad = quad;
846
+
847
+ }
739
848
 
740
- this._renderer.setRenderTarget( layer.renderTarget );
741
- layer.rendercall();
849
+ layer.rendercall();
850
+
851
+ renderer._frameBufferTarget = null;
852
+
853
+ } else {
854
+
855
+ renderer.setRenderTarget( layer.renderTarget );
856
+ layer.rendercall();
857
+
858
+ }
742
859
 
743
860
  }
744
861
 
862
+ renderer.setRenderTarget( null );
863
+ renderer.setOutputRenderTarget( rendererOutputTarget );
864
+ renderer._frameBufferTarget = rendererFramebufferTarget;
865
+ renderer._setXRLayerSize( rendererSize.x, rendererSize.y );
866
+ renderer._quad = rendererQuad;
745
867
  this.isPresenting = wasPresenting;
746
- this._renderer.setRenderTarget( null );
747
868
 
748
869
  }
749
870
 
@@ -803,9 +924,18 @@ class XRManager extends EventDispatcher {
803
924
 
804
925
  //
805
926
 
927
+ if ( this._supportsGlBinding ) {
928
+
929
+ const glBinding = new XRWebGLBinding( session, gl );
930
+ this._glBinding = glBinding;
931
+
932
+ }
933
+
934
+ //
935
+
806
936
  if ( this._useLayers === true ) {
807
937
 
808
- // default path using XRWebGLBinding/XRProjectionLayer
938
+ // default path using XRProjectionLayer
809
939
 
810
940
  let depthFormat = null;
811
941
  let depthType = null;
@@ -822,18 +952,27 @@ class XRManager extends EventDispatcher {
822
952
  const projectionlayerInit = {
823
953
  colorFormat: gl.RGBA8,
824
954
  depthFormat: glDepthFormat,
825
- scaleFactor: this._framebufferScaleFactor
955
+ scaleFactor: this._framebufferScaleFactor,
956
+ clearOnAccess: false
826
957
  };
827
958
 
828
- const glBinding = new XRWebGLBinding( session, gl );
829
- const glProjLayer = glBinding.createProjectionLayer( projectionlayerInit );
959
+ if ( this._useMultiviewIfPossible && renderer.hasFeature( 'OVR_multiview2' ) ) {
960
+
961
+ projectionlayerInit.textureType = 'texture-array';
962
+ this._useMultiview = true;
963
+
964
+ }
965
+
966
+ const glProjLayer = this._glBinding.createProjectionLayer( projectionlayerInit );
830
967
  const layersArray = [ glProjLayer ];
831
968
 
832
- this._glBinding = glBinding;
833
969
  this._glProjLayer = glProjLayer;
834
970
 
835
971
  renderer.setPixelRatio( 1 );
836
- renderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );
972
+ renderer._setXRLayerSize( glProjLayer.textureWidth, glProjLayer.textureHeight );
973
+
974
+ const depth = this._useMultiview ? 2 : 1;
975
+ const depthTexture = new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat, depth );
837
976
 
838
977
  this._xrRenderTarget = new XRRenderTarget(
839
978
  glProjLayer.textureWidth,
@@ -842,19 +981,22 @@ class XRManager extends EventDispatcher {
842
981
  format: RGBAFormat,
843
982
  type: UnsignedByteType,
844
983
  colorSpace: renderer.outputColorSpace,
845
- depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),
984
+ depthTexture: depthTexture,
846
985
  stencilBuffer: renderer.stencil,
847
986
  samples: attributes.antialias ? 4 : 0,
848
987
  resolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),
849
988
  resolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false ),
989
+ depth: this._useMultiview ? 2 : 1,
990
+ multiview: this._useMultiview
850
991
  } );
851
992
 
852
- this._xrRenderTarget.hasExternalTextures = true;
853
-
854
- this._referenceSpace = await session.requestReferenceSpace( this.getReferenceSpaceType() );
993
+ this._xrRenderTarget._hasExternalTextures = true;
994
+ this._xrRenderTarget.depth = this._useMultiview ? 2 : 1;
855
995
 
856
996
  this._supportsLayers = session.enabledFeatures.includes( 'layers' );
857
997
 
998
+ this._referenceSpace = await session.requestReferenceSpace( this.getReferenceSpaceType() );
999
+
858
1000
  if ( this._supportsLayers ) {
859
1001
 
860
1002
  // switch layers to native
@@ -895,7 +1037,7 @@ class XRManager extends EventDispatcher {
895
1037
  session.updateRenderState( { baseLayer: glBaseLayer } );
896
1038
 
897
1039
  renderer.setPixelRatio( 1 );
898
- renderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );
1040
+ renderer._setXRLayerSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight );
899
1041
 
900
1042
  this._xrRenderTarget = new XRRenderTarget(
901
1043
  glBaseLayer.framebufferWidth,
@@ -910,6 +1052,9 @@ class XRManager extends EventDispatcher {
910
1052
  }
911
1053
  );
912
1054
 
1055
+ this._xrRenderTarget._isOpaqueFramebuffer = true;
1056
+ this._referenceSpace = await session.requestReferenceSpace( this.getReferenceSpaceType() );
1057
+
913
1058
  }
914
1059
 
915
1060
  //
@@ -950,6 +1095,7 @@ class XRManager extends EventDispatcher {
950
1095
 
951
1096
  cameraXR.near = cameraR.near = cameraL.near = depthNear;
952
1097
  cameraXR.far = cameraR.far = cameraL.far = depthFar;
1098
+ cameraXR.isMultiViewCamera = this._useMultiview;
953
1099
 
954
1100
  if ( this._currentDepthNear !== cameraXR.near || this._currentDepthFar !== cameraXR.far ) {
955
1101
 
@@ -965,9 +1111,11 @@ class XRManager extends EventDispatcher {
965
1111
 
966
1112
  }
967
1113
 
968
- cameraL.layers.mask = camera.layers.mask | 0b010;
969
- cameraR.layers.mask = camera.layers.mask | 0b100;
970
- cameraXR.layers.mask = cameraL.layers.mask | cameraR.layers.mask;
1114
+ // inherit camera layers and enable eye layers (1 = left, 2 = right)
1115
+ cameraXR.layers.mask = camera.layers.mask | 0b110;
1116
+ cameraL.layers.mask = cameraXR.layers.mask & 0b011;
1117
+ cameraR.layers.mask = cameraXR.layers.mask & 0b101;
1118
+
971
1119
 
972
1120
  const parent = camera.parent;
973
1121
  const cameras = cameraXR.cameras;
@@ -1212,9 +1360,7 @@ function onSessionEnd() {
1212
1360
 
1213
1361
  // restore framebuffer/rendering state
1214
1362
 
1215
- renderer.backend.setXRTarget( null );
1216
- renderer.setOutputRenderTarget( null );
1217
- renderer.setRenderTarget( null );
1363
+ renderer._resetXRState();
1218
1364
 
1219
1365
  this._session = null;
1220
1366
  this._xrRenderTarget = null;
@@ -1252,6 +1398,8 @@ function onSessionEnd() {
1252
1398
 
1253
1399
  layer.plane.material = layer.material;
1254
1400
  layer.material.map = layer.renderTarget.texture;
1401
+ layer.material.map.offset.y = 1;
1402
+ layer.material.map.repeat.y = - 1;
1255
1403
  delete layer.xrlayer;
1256
1404
 
1257
1405
  }
@@ -1261,9 +1409,9 @@ function onSessionEnd() {
1261
1409
  //
1262
1410
 
1263
1411
  this.isPresenting = false;
1412
+ this._useMultiview = false;
1264
1413
 
1265
1414
  renderer._animation.stop();
1266
-
1267
1415
  renderer._animation.setAnimationLoop( this._currentAnimationLoop );
1268
1416
  renderer._animation.setContext( this._currentAnimationContext );
1269
1417
  renderer._animation.start();
@@ -1351,25 +1499,25 @@ function createXRLayer( layer ) {
1351
1499
 
1352
1500
  return this._glBinding.createQuadLayer( {
1353
1501
  transform: new XRRigidTransform( layer.translation, layer.quaternion ),
1354
- depthFormat: this._gl.DEPTH_COMPONENT,
1355
1502
  width: layer.width / 2,
1356
1503
  height: layer.height / 2,
1357
1504
  space: this._referenceSpace,
1358
1505
  viewPixelWidth: layer.pixelwidth,
1359
- viewPixelHeight: layer.pixelheight
1506
+ viewPixelHeight: layer.pixelheight,
1507
+ clearOnAccess: false
1360
1508
  } );
1361
1509
 
1362
1510
  } else {
1363
1511
 
1364
1512
  return this._glBinding.createCylinderLayer( {
1365
1513
  transform: new XRRigidTransform( layer.translation, layer.quaternion ),
1366
- depthFormat: this._gl.DEPTH_COMPONENT,
1367
1514
  radius: layer.radius,
1368
1515
  centralAngle: layer.centralAngle,
1369
1516
  aspectRatio: layer.aspectRatio,
1370
1517
  space: this._referenceSpace,
1371
1518
  viewPixelWidth: layer.pixelwidth,
1372
- viewPixelHeight: layer.pixelheight
1519
+ viewPixelHeight: layer.pixelheight,
1520
+ clearOnAccess: false
1373
1521
  } );
1374
1522
 
1375
1523
  }
@@ -1431,7 +1579,7 @@ function onAnimationFrame( time, frame ) {
1431
1579
  backend.setXRRenderTargetTextures(
1432
1580
  this._xrRenderTarget,
1433
1581
  glSubImage.colorTexture,
1434
- this._glProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture
1582
+ ( this._glProjLayer.ignoreDepthValues && ! this._useMultiview ) ? undefined : glSubImage.depthStencilTexture
1435
1583
  );
1436
1584
 
1437
1585
  }
@@ -34,10 +34,11 @@ class XRRenderTarget extends RenderTarget {
34
34
  * are defined by external textures. This flag is
35
35
  * set to `true` when using the WebXR Layers API.
36
36
  *
37
+ * @private
37
38
  * @type {boolean}
38
39
  * @default false
39
40
  */
40
- this.hasExternalTextures = false;
41
+ this._hasExternalTextures = false;
41
42
 
42
43
  /**
43
44
  * Whether a depth buffer should automatically be allocated
@@ -50,10 +51,25 @@ class XRRenderTarget extends RenderTarget {
50
51
  *
51
52
  * Reference: {@link https://www.w3.org/TR/webxrlayers-1/#dom-xrprojectionlayer-ignoredepthvalues}.
52
53
  *
54
+ * @private
53
55
  * @type {boolean}
54
56
  * @default true
55
57
  */
56
- this.autoAllocateDepthBuffer = true;
58
+ this._autoAllocateDepthBuffer = true;
59
+
60
+ /**
61
+ * Whether this render target is associated with a XRWebGLLayer.
62
+ *
63
+ * A XRWebGLLayer points to an opaque framebuffer. Basically,
64
+ * this means that you don't have access to its bound color,
65
+ * stencil and depth buffers. We need to handle this framebuffer
66
+ * differently since its textures are always bound.
67
+ *
68
+ * @private
69
+ * @type {boolean}
70
+ * @default false
71
+ * */
72
+ this._isOpaqueFramebuffer = false;
57
73
 
58
74
  }
59
75
 
@@ -61,8 +77,9 @@ class XRRenderTarget extends RenderTarget {
61
77
 
62
78
  super.copy( source );
63
79
 
64
- this.hasExternalTextures = source.hasExternalTextures;
65
- this.autoAllocateDepthBuffer = source.autoAllocateDepthBuffer;
80
+ this._hasExternalTextures = source._hasExternalTextures;
81
+ this._autoAllocateDepthBuffer = source._autoAllocateDepthBuffer;
82
+ this._isOpaqueFramebuffer = source._isOpaqueFramebuffer;
66
83
 
67
84
  return this;
68
85
 
@@ -1,6 +1,6 @@
1
1
  import NodeMaterial from '../../../materials/nodes/NodeMaterial.js';
2
2
  import { getDirection, blur } from '../../../nodes/pmrem/PMREMUtils.js';
3
- import { equirectUV } from '../../../nodes/utils/EquirectUVNode.js';
3
+ import { equirectUV } from '../../../nodes/utils/EquirectUV.js';
4
4
  import { uniform } from '../../../nodes/core/UniformNode.js';
5
5
  import { uniformArray } from '../../../nodes/accessors/UniformArrayNode.js';
6
6
  import { texture } from '../../../nodes/accessors/TextureNode.js';
@@ -161,7 +161,7 @@ class PMREMGenerator {
161
161
 
162
162
  console.warn( 'THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.' );
163
163
 
164
- const cubeUVRenderTarget = renderTarget || this._allocateTargets();
164
+ const cubeUVRenderTarget = renderTarget || this._allocateTarget();
165
165
 
166
166
  options.renderTarget = cubeUVRenderTarget;
167
167
 
@@ -175,9 +175,11 @@ class PMREMGenerator {
175
175
  _oldActiveCubeFace = this._renderer.getActiveCubeFace();
176
176
  _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();
177
177
 
178
- const cubeUVRenderTarget = renderTarget || this._allocateTargets();
178
+ const cubeUVRenderTarget = renderTarget || this._allocateTarget();
179
179
  cubeUVRenderTarget.depthBuffer = true;
180
180
 
181
+ this._init( cubeUVRenderTarget );
182
+
181
183
  this._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );
182
184
 
183
185
  if ( sigma > 0 ) {
@@ -238,7 +240,7 @@ class PMREMGenerator {
238
240
 
239
241
  this._setSizeFromTexture( equirectangular );
240
242
 
241
- const cubeUVRenderTarget = renderTarget || this._allocateTargets();
243
+ const cubeUVRenderTarget = renderTarget || this._allocateTarget();
242
244
 
243
245
  this.fromEquirectangularAsync( equirectangular, cubeUVRenderTarget );
244
246
 
@@ -286,7 +288,7 @@ class PMREMGenerator {
286
288
 
287
289
  this._setSizeFromTexture( cubemap );
288
290
 
289
- const cubeUVRenderTarget = renderTarget || this._allocateTargets();
291
+ const cubeUVRenderTarget = renderTarget || this._allocateTarget();
290
292
 
291
293
  this.fromCubemapAsync( cubemap, renderTarget );
292
294
 
@@ -423,7 +425,8 @@ class PMREMGenerator {
423
425
  _oldActiveCubeFace = this._renderer.getActiveCubeFace();
424
426
  _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();
425
427
 
426
- const cubeUVRenderTarget = renderTarget || this._allocateTargets();
428
+ const cubeUVRenderTarget = renderTarget || this._allocateTarget();
429
+ this._init( cubeUVRenderTarget );
427
430
  this._textureToCubeUV( texture, cubeUVRenderTarget );
428
431
  this._applyPMREM( cubeUVRenderTarget );
429
432
  this._cleanup( cubeUVRenderTarget );
@@ -432,24 +435,20 @@ class PMREMGenerator {
432
435
 
433
436
  }
434
437
 
435
- _allocateTargets() {
438
+ _allocateTarget() {
436
439
 
437
440
  const width = 3 * Math.max( this._cubeSize, 16 * 7 );
438
441
  const height = 4 * this._cubeSize;
439
442
 
440
- const params = {
441
- magFilter: LinearFilter,
442
- minFilter: LinearFilter,
443
- generateMipmaps: false,
444
- type: HalfFloatType,
445
- format: RGBAFormat,
446
- colorSpace: LinearSRGBColorSpace,
447
- //depthBuffer: false
448
- };
443
+ const cubeUVRenderTarget = _createRenderTarget( width, height );
444
+
445
+ return cubeUVRenderTarget;
446
+
447
+ }
449
448
 
450
- const cubeUVRenderTarget = _createRenderTarget( width, height, params );
449
+ _init( renderTarget ) {
451
450
 
452
- if ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {
451
+ if ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== renderTarget.width || this._pingPongRenderTarget.height !== renderTarget.height ) {
453
452
 
454
453
  if ( this._pingPongRenderTarget !== null ) {
455
454
 
@@ -457,17 +456,15 @@ class PMREMGenerator {
457
456
 
458
457
  }
459
458
 
460
- this._pingPongRenderTarget = _createRenderTarget( width, height, params );
459
+ this._pingPongRenderTarget = _createRenderTarget( renderTarget.width, renderTarget.height );
461
460
 
462
461
  const { _lodMax } = this;
463
462
  ( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas, lodMeshes: this._lodMeshes } = _createPlanes( _lodMax ) );
464
463
 
465
- this._blurMaterial = _getBlurShader( _lodMax, width, height );
464
+ this._blurMaterial = _getBlurShader( _lodMax, renderTarget.width, renderTarget.height );
466
465
 
467
466
  }
468
467
 
469
- return cubeUVRenderTarget;
470
-
471
468
  }
472
469
 
473
470
  async _compileMaterial( material ) {
@@ -849,7 +846,17 @@ function _createPlanes( lodMax ) {
849
846
 
850
847
  }
851
848
 
852
- function _createRenderTarget( width, height, params ) {
849
+ function _createRenderTarget( width, height ) {
850
+
851
+ const params = {
852
+ magFilter: LinearFilter,
853
+ minFilter: LinearFilter,
854
+ generateMipmaps: false,
855
+ type: HalfFloatType,
856
+ format: RGBAFormat,
857
+ colorSpace: LinearSRGBColorSpace,
858
+ //depthBuffer: false
859
+ };
853
860
 
854
861
  const cubeUVRenderTarget = new RenderTarget( width, height, params );
855
862
  cubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;
@@ -45,18 +45,6 @@ class NodeSampledTexture extends SampledTexture {
45
45
 
46
46
  }
47
47
 
48
- /**
49
- * Overwrites the default to additionally check if the node value has changed.
50
- *
51
- * @param {number} generation - The generation.
52
- * @return {boolean} Whether an update is required or not.
53
- */
54
- needsBindingsUpdate( generation ) {
55
-
56
- return this.textureNode.value !== this.texture || super.needsBindingsUpdate( generation );
57
-
58
- }
59
-
60
48
  /**
61
49
  * Updates the binding.
62
50
  *
@@ -3,7 +3,8 @@ import ChainMap from '../ChainMap.js';
3
3
  import NodeBuilderState from './NodeBuilderState.js';
4
4
  import { cubeMapNode } from '../../../nodes/utils/CubeMapNode.js';
5
5
  import { NodeFrame } from '../../../nodes/Nodes.js';
6
- import { objectGroup, renderGroup, frameGroup, cubeTexture, texture, fog, rangeFogFactor, densityFogFactor, reference, pmremTexture, screenUV } from '../../../nodes/TSL.js';
6
+ import { objectGroup, renderGroup, frameGroup, cubeTexture, texture, texture3D, vec3, fog, rangeFogFactor, densityFogFactor, reference, pmremTexture, screenUV } from '../../../nodes/TSL.js';
7
+ import { builtin } from '../../../nodes/accessors/BuiltinNode.js';
7
8
 
8
9
  import { CubeUVReflectionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
9
10
  import { hashArray } from '../../../nodes/core/NodeUtils.js';
@@ -201,6 +202,12 @@ class Nodes extends DataMap {
201
202
  nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
202
203
  nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
203
204
  nodeBuilder.clippingContext = renderObject.clippingContext;
205
+ if ( this.renderer.getOutputRenderTarget() ? this.renderer.getOutputRenderTarget().multiview : false ) {
206
+
207
+ nodeBuilder.enableMultiview();
208
+
209
+ }
210
+
204
211
  nodeBuilder.build();
205
212
 
206
213
  nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
@@ -403,6 +410,7 @@ class Nodes extends DataMap {
403
410
  if ( environmentNode ) _cacheKeyValues.push( environmentNode.getCacheKey() );
404
411
  if ( fogNode ) _cacheKeyValues.push( fogNode.getCacheKey() );
405
412
 
413
+ _cacheKeyValues.push( this.renderer.getOutputRenderTarget() && this.renderer.getOutputRenderTarget().multiview ? 1 : 0 );
406
414
  _cacheKeyValues.push( this.renderer.shadowMap.enabled ? 1 : 0 );
407
415
 
408
416
  cacheKeyData.callId = callId;
@@ -658,7 +666,7 @@ class Nodes extends DataMap {
658
666
 
659
667
  const renderer = this.renderer;
660
668
 
661
- return renderer.toneMapping + ',' + renderer.currentColorSpace;
669
+ return renderer.toneMapping + ',' + renderer.currentColorSpace + ',' + renderer.xr.isPresenting;
662
670
 
663
671
  }
664
672
 
@@ -689,7 +697,9 @@ class Nodes extends DataMap {
689
697
  const renderer = this.renderer;
690
698
  const cacheKey = this.getOutputCacheKey();
691
699
 
692
- const output = texture( outputTarget, screenUV ).renderOutput( renderer.toneMapping, renderer.currentColorSpace );
700
+ const output = outputTarget.isArrayTexture ?
701
+ texture3D( outputTarget, vec3( screenUV, builtin( 'gl_ViewID_OVR' ) ) ).renderOutput( renderer.toneMapping, renderer.currentColorSpace ) :
702
+ texture( outputTarget, screenUV ).renderOutput( renderer.toneMapping, renderer.currentColorSpace );
693
703
 
694
704
  _outputNodeMap.set( outputTarget, cacheKey );
695
705
 
@@ -1,7 +1,7 @@
1
1
  export default /* glsl */`
2
2
  #ifdef PREMULTIPLIED_ALPHA
3
3
 
4
- // Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.
4
+ // Get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.
5
5
  gl_FragColor.rgb *= gl_FragColor.a;
6
6
 
7
7
  #endif