@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
@@ -52,7 +52,7 @@ import { WebGLUtils } from './webgl/WebGLUtils.js';
52
52
  import { WebXRManager } from './webxr/WebXRManager.js';
53
53
  import { WebGLMaterials } from './webgl/WebGLMaterials.js';
54
54
  import { WebGLUniformsGroups } from './webgl/WebGLUniformsGroups.js';
55
- import { createCanvasElement, probeAsync, toNormalizedProjectionMatrix, toReversedProjectionMatrix, warnOnce } from '../utils.js';
55
+ import { createCanvasElement, probeAsync, warnOnce } from '../utils.js';
56
56
  import { ColorManagement } from '../math/ColorManagement.js';
57
57
 
58
58
  /**
@@ -80,7 +80,7 @@ class WebGLRenderer {
80
80
  preserveDrawingBuffer = false,
81
81
  powerPreference = 'default',
82
82
  failIfMajorPerformanceCaveat = false,
83
- reverseDepthBuffer = false,
83
+ reversedDepthBuffer = false,
84
84
  } = parameters;
85
85
 
86
86
  /**
@@ -313,7 +313,6 @@ class WebGLRenderer {
313
313
 
314
314
  // camera matrices cache
315
315
 
316
- const _currentProjectionMatrix = new Matrix4();
317
316
  const _projScreenMatrix = new Matrix4();
318
317
 
319
318
  const _vector3 = new Vector3();
@@ -409,7 +408,7 @@ class WebGLRenderer {
409
408
 
410
409
  state = new WebGLState( _gl, extensions );
411
410
 
412
- if ( capabilities.reverseDepthBuffer && reverseDepthBuffer ) {
411
+ if ( capabilities.reversedDepthBuffer && reversedDepthBuffer ) {
413
412
 
414
413
  state.buffers.depth.setReversed( true );
415
414
 
@@ -1297,7 +1296,7 @@ class WebGLRenderer {
1297
1296
  * @param {Object3D} scene - The scene or another type of 3D object to precompile.
1298
1297
  * @param {Camera} camera - The camera.
1299
1298
  * @param {?Scene} [targetScene=null] - The target scene.
1300
- * @return {?Set} The precompiled materials.
1299
+ * @return {Set<Material>} The precompiled materials.
1301
1300
  */
1302
1301
  this.compile = function ( scene, camera, targetScene = null ) {
1303
1302
 
@@ -1557,7 +1556,7 @@ class WebGLRenderer {
1557
1556
  renderStateStack.push( currentRenderState );
1558
1557
 
1559
1558
  _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
1560
- _frustum.setFromProjectionMatrix( _projScreenMatrix );
1559
+ _frustum.setFromProjectionMatrix( _projScreenMatrix, WebGLCoordinateSystem, camera.reversedDepth );
1561
1560
 
1562
1561
  _localClippingEnabled = this.localClippingEnabled;
1563
1562
  _clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );
@@ -1890,6 +1889,9 @@ class WebGLRenderer {
1890
1889
  //
1891
1890
 
1892
1891
  const currentRenderTarget = _this.getRenderTarget();
1892
+ const currentActiveCubeFace = _this.getActiveCubeFace();
1893
+ const currentActiveMipmapLevel = _this.getActiveMipmapLevel();
1894
+
1893
1895
  _this.setRenderTarget( transmissionRenderTarget );
1894
1896
 
1895
1897
  _this.getClearColor( _currentClearColor );
@@ -1959,7 +1961,7 @@ class WebGLRenderer {
1959
1961
 
1960
1962
  }
1961
1963
 
1962
- _this.setRenderTarget( currentRenderTarget );
1964
+ _this.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );
1963
1965
 
1964
1966
  _this.setClearColor( _currentClearColor, _currentClearAlpha );
1965
1967
 
@@ -2385,23 +2387,17 @@ class WebGLRenderer {
2385
2387
 
2386
2388
  // common camera uniforms
2387
2389
 
2388
- const reverseDepthBuffer = state.buffers.depth.getReversed();
2389
-
2390
- if ( reverseDepthBuffer ) {
2391
-
2392
- _currentProjectionMatrix.copy( camera.projectionMatrix );
2390
+ const reversedDepthBuffer = state.buffers.depth.getReversed();
2393
2391
 
2394
- toNormalizedProjectionMatrix( _currentProjectionMatrix );
2395
- toReversedProjectionMatrix( _currentProjectionMatrix );
2392
+ if ( reversedDepthBuffer && camera.reversedDepth !== true ) {
2396
2393
 
2397
- p_uniforms.setValue( _gl, 'projectionMatrix', _currentProjectionMatrix );
2398
-
2399
- } else {
2400
-
2401
- p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
2394
+ camera._reversedDepth = true;
2395
+ camera.updateProjectionMatrix();
2402
2396
 
2403
2397
  }
2404
2398
 
2399
+ p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
2400
+
2405
2401
  p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
2406
2402
 
2407
2403
  const uCamPos = p_uniforms.map.cameraPosition;
@@ -2831,9 +2827,15 @@ class WebGLRenderer {
2831
2827
 
2832
2828
  } else if ( isRenderTarget3D ) {
2833
2829
 
2834
- const textureProperties = properties.get( renderTarget.texture );
2835
2830
  const layer = activeCubeFace;
2836
- _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel, layer );
2831
+
2832
+ for ( let i = 0; i < renderTarget.textures.length; i ++ ) {
2833
+
2834
+ const textureProperties = properties.get( renderTarget.textures[ i ] );
2835
+
2836
+ _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer );
2837
+
2838
+ }
2837
2839
 
2838
2840
  } else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {
2839
2841
 
@@ -2858,8 +2860,9 @@ class WebGLRenderer {
2858
2860
  * @param {number} height - The height of the copy region.
2859
2861
  * @param {TypedArray} buffer - The result buffer.
2860
2862
  * @param {number} [activeCubeFaceIndex] - The active cube face index.
2863
+ * @param {number} [textureIndex=0] - The texture index of an MRT render target.
2861
2864
  */
2862
- this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {
2865
+ this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {
2863
2866
 
2864
2867
  if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
2865
2868
 
@@ -2882,7 +2885,7 @@ class WebGLRenderer {
2882
2885
 
2883
2886
  try {
2884
2887
 
2885
- const texture = renderTarget.texture;
2888
+ const texture = renderTarget.textures[ textureIndex ];
2886
2889
  const textureFormat = texture.format;
2887
2890
  const textureType = texture.type;
2888
2891
 
@@ -2904,6 +2907,10 @@ class WebGLRenderer {
2904
2907
 
2905
2908
  if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
2906
2909
 
2910
+ // when using MRT, select the correct color buffer for the subsequent read command
2911
+
2912
+ if ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );
2913
+
2907
2914
  _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );
2908
2915
 
2909
2916
  }
@@ -2934,9 +2941,10 @@ class WebGLRenderer {
2934
2941
  * @param {number} height - The height of the copy region.
2935
2942
  * @param {TypedArray} buffer - The result buffer.
2936
2943
  * @param {number} [activeCubeFaceIndex] - The active cube face index.
2944
+ * @param {number} [textureIndex=0] - The texture index of an MRT render target.
2937
2945
  * @return {Promise<TypedArray>} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.
2938
2946
  */
2939
- this.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {
2947
+ this.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {
2940
2948
 
2941
2949
  if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
2942
2950
 
@@ -2959,7 +2967,7 @@ class WebGLRenderer {
2959
2967
  // set the active frame buffer to the one we want to read
2960
2968
  state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2961
2969
 
2962
- const texture = renderTarget.texture;
2970
+ const texture = renderTarget.textures[ textureIndex ];
2963
2971
  const textureFormat = texture.format;
2964
2972
  const textureType = texture.type;
2965
2973
 
@@ -2978,6 +2986,11 @@ class WebGLRenderer {
2978
2986
  const glBuffer = _gl.createBuffer();
2979
2987
  _gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );
2980
2988
  _gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );
2989
+
2990
+ // when using MRT, select the correct color buffer for the subsequent read command
2991
+
2992
+ if ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );
2993
+
2981
2994
  _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );
2982
2995
 
2983
2996
  // reset the frame buffer to the currently set buffer before waiting
@@ -3013,7 +3026,7 @@ class WebGLRenderer {
3013
3026
  * Copies pixels from the current bound framebuffer into the given texture.
3014
3027
  *
3015
3028
  * @param {FramebufferTexture} texture - The texture.
3016
- * @param {Vector2} position - The start position of the copy operation.
3029
+ * @param {?Vector2} [position=null] - The start position of the copy operation.
3017
3030
  * @param {number} [level=0] - The mip level. The default represents the base mip.
3018
3031
  */
3019
3032
  this.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {
@@ -3044,10 +3057,10 @@ class WebGLRenderer {
3044
3057
  *
3045
3058
  * @param {Texture} srcTexture - The source texture.
3046
3059
  * @param {Texture} dstTexture - The destination texture.
3047
- * @param {Box2|Box3} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.
3048
- * @param {Vector2|Vector3} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.
3049
- * @param {number} srcLevel - The source mipmap level to copy.
3050
- * @param {number} dstLevel - The destination mipmap level.
3060
+ * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.
3061
+ * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.
3062
+ * @param {number} [srcLevel=0] - The source mipmap level to copy.
3063
+ * @param {?number} [dstLevel=null] - The destination mipmap level.
3051
3064
  */
3052
3065
  this.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {
3053
3066
 
@@ -3439,7 +3452,7 @@ class WebGLRenderer {
3439
3452
  * @property {boolean} [depth=true] Whether the drawing buffer has a depth buffer of at least 16 bits.
3440
3453
  * @property {boolean} [logarithmicDepthBuffer=false] Whether to use a logarithmic depth buffer. It may be necessary to use this if dealing with huge differences in scale in a single scene.
3441
3454
  * Note that this setting uses `gl_FragDepth` if available which disables the Early Fragment Test optimization and can cause a decrease in performance.
3442
- * @property {boolean} [reverseDepthBuffer=false] Whether to use a reverse depth buffer. Requires the `EXT_clip_control` extension.
3455
+ * @property {boolean} [reversedDepthBuffer=false] Whether to use a reverse depth buffer. Requires the `EXT_clip_control` extension.
3443
3456
  * This is a more faster and accurate version than logarithmic depth buffer.
3444
3457
  **/
3445
3458
 
@@ -3460,7 +3473,7 @@ class WebGLRenderer {
3460
3473
  * @property {number} maxVertexTextures - The number of textures that can be used in a vertex shader.
3461
3474
  * @property {number} maxVertexUniforms - The maximum number of uniforms that can be used in a vertex shader.
3462
3475
  * @property {string} precision - The shader precision currently being used by the renderer.
3463
- * @property {boolean} reverseDepthBuffer - `true` if `reverseDepthBuffer` was set to `true` in the constructor
3476
+ * @property {boolean} reversedDepthBuffer - `true` if `reversedDepthBuffer` was set to `true` in the constructor
3464
3477
  * and the rendering context supports `EXT_clip_control`.
3465
3478
  * @property {boolean} vertexTextures - `true` if vertex textures can be used.
3466
3479
  **/
@@ -32,9 +32,9 @@ class Animation {
32
32
  * A reference to the context from `requestAnimationFrame()` can
33
33
  * be called (usually `window`).
34
34
  *
35
- * @type {Window|XRSession}
35
+ * @type {?(Window|XRSession)}
36
36
  */
37
- this._context = self;
37
+ this._context = typeof self !== 'undefined' ? self : null;
38
38
 
39
39
  /**
40
40
  * The user-defined animation loop.
@@ -1,6 +1,6 @@
1
1
  import DataMap from './DataMap.js';
2
2
  import Color4 from './Color4.js';
3
- import { vec4, context, normalWorld, backgroundBlurriness, backgroundIntensity, backgroundRotation, modelViewProjection } from '../../nodes/TSL.js';
3
+ import { vec4, context, normalWorldGeometry, backgroundBlurriness, backgroundIntensity, backgroundRotation, modelViewProjection } from '../../nodes/TSL.js';
4
4
  import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
5
5
 
6
6
  import { Mesh } from '../../objects/Mesh.js';
@@ -89,7 +89,7 @@ class Background extends DataMap {
89
89
 
90
90
  const backgroundMeshNode = context( vec4( backgroundNode ).mul( backgroundIntensity ), {
91
91
  // @TODO: Add Texture2D support using node context
92
- getUV: () => backgroundRotation.mul( normalWorld ),
92
+ getUV: () => backgroundRotation.mul( normalWorldGeometry ),
93
93
  getTextureLevel: () => backgroundBlurriness
94
94
  } );
95
95
 
@@ -118,6 +118,17 @@ class Background extends DataMap {
118
118
 
119
119
  };
120
120
 
121
+ function onBackgroundDispose() {
122
+
123
+ background.removeEventListener( 'dispose', onBackgroundDispose );
124
+
125
+ backgroundMesh.material.dispose();
126
+ backgroundMesh.geometry.dispose();
127
+
128
+ }
129
+
130
+ background.addEventListener( 'dispose', onBackgroundDispose );
131
+
121
132
  }
122
133
 
123
134
  const backgroundCacheKey = backgroundNode.getCacheKey();
@@ -244,24 +244,31 @@ class Bindings extends DataMap {
244
244
 
245
245
  }
246
246
 
247
- } else if ( binding.isSampler ) {
248
-
249
- binding.update();
250
-
251
247
  } else if ( binding.isSampledTexture ) {
252
248
 
253
- const texturesTextureData = this.textures.get( binding.texture );
254
-
255
- if ( binding.needsBindingsUpdate( texturesTextureData.generation ) ) needsBindingsUpdate = true;
256
-
257
249
  const updated = binding.update();
258
250
 
251
+ // get the texture data after the update, to sync the texture reference from node
252
+
259
253
  const texture = binding.texture;
254
+ const texturesTextureData = this.textures.get( texture );
260
255
 
261
256
  if ( updated ) {
262
257
 
258
+ // version: update the texture data or create a new one
259
+
263
260
  this.textures.updateTexture( texture );
264
261
 
262
+ // generation: update the bindings if a new texture has been created
263
+
264
+ if ( binding.generation !== texturesTextureData.generation ) {
265
+
266
+ binding.generation = texturesTextureData.generation;
267
+
268
+ needsBindingsUpdate = true;
269
+
270
+ }
271
+
265
272
  }
266
273
 
267
274
  const textureData = backend.get( texture );
@@ -277,16 +284,6 @@ class Bindings extends DataMap {
277
284
 
278
285
  }
279
286
 
280
- if ( backend.isWebGPUBackend === true && textureData.texture === undefined && textureData.externalTexture === undefined ) {
281
-
282
- // TODO: Remove this once we found why updated === false isn't bound to a texture in the WebGPU backend
283
- console.error( 'Bindings._update: binding should be available:', binding, updated, texture, binding.textureNode.value, needsBindingsUpdate );
284
-
285
- this.textures.updateTexture( texture );
286
- needsBindingsUpdate = true;
287
-
288
- }
289
-
290
287
  if ( texture.isStorageTexture === true ) {
291
288
 
292
289
  const textureData = this.get( texture );
@@ -305,6 +302,10 @@ class Bindings extends DataMap {
305
302
 
306
303
  }
307
304
 
305
+ } else if ( binding.isSampler ) {
306
+
307
+ binding.update();
308
+
308
309
  }
309
310
 
310
311
  }
@@ -34,8 +34,8 @@ class Color4 extends Color {
34
34
  * string argument to this method.
35
35
  *
36
36
  * @param {number|string|Color} r - The red value.
37
- * @param {number} g - The green value.
38
- * @param {number} b - The blue value.
37
+ * @param {number} [g] - The green value.
38
+ * @param {number} [b] - The blue value.
39
39
  * @param {number} [a=1] - The alpha value.
40
40
  * @return {Color4} A reference to this object.
41
41
  */
@@ -1,4 +1,4 @@
1
- import { equirectUV } from '../../nodes/utils/EquirectUVNode.js';
1
+ import { equirectUV } from '../../nodes/utils/EquirectUV.js';
2
2
  import { texture as TSL_Texture } from '../../nodes/accessors/TextureNode.js';
3
3
  import { positionWorldDirection } from '../../nodes/accessors/Position.js';
4
4
  import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
@@ -1,6 +1,7 @@
1
1
  import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
2
+ import { ColorManagement } from '../../math/ColorManagement.js';
2
3
  import { vec4, renderOutput } from '../../nodes/TSL.js';
3
- import { LinearSRGBColorSpace, NoToneMapping } from '../../constants.js';
4
+ import { NoToneMapping } from '../../constants.js';
4
5
  import QuadMesh from '../../renderers/common/QuadMesh.js';
5
6
 
6
7
  /**
@@ -82,6 +83,15 @@ class PostProcessing {
82
83
  */
83
84
  this._quadMesh = new QuadMesh( material );
84
85
 
86
+ /**
87
+ * The context of the post processing stack.
88
+ *
89
+ * @private
90
+ * @type {?Object}
91
+ * @default null
92
+ */
93
+ this._context = null;
94
+
85
95
  }
86
96
 
87
97
  /**
@@ -91,15 +101,17 @@ class PostProcessing {
91
101
  */
92
102
  render() {
93
103
 
104
+ const renderer = this.renderer;
105
+
94
106
  this._update();
95
107
 
96
- const renderer = this.renderer;
108
+ if ( this._context.onBeforePostProcessing !== null ) this._context.onBeforePostProcessing();
97
109
 
98
110
  const toneMapping = renderer.toneMapping;
99
111
  const outputColorSpace = renderer.outputColorSpace;
100
112
 
101
113
  renderer.toneMapping = NoToneMapping;
102
- renderer.outputColorSpace = LinearSRGBColorSpace;
114
+ renderer.outputColorSpace = ColorManagement.workingColorSpace;
103
115
 
104
116
  //
105
117
 
@@ -115,6 +127,20 @@ class PostProcessing {
115
127
  renderer.toneMapping = toneMapping;
116
128
  renderer.outputColorSpace = outputColorSpace;
117
129
 
130
+ if ( this._context.onAfterPostProcessing !== null ) this._context.onAfterPostProcessing();
131
+
132
+ }
133
+
134
+ /**
135
+ * Returns the current context of the post processing stack.
136
+ *
137
+ * @readonly
138
+ * @type {?Object}
139
+ */
140
+ get context() {
141
+
142
+ return this._context;
143
+
118
144
  }
119
145
 
120
146
  /**
@@ -140,7 +166,32 @@ class PostProcessing {
140
166
  const toneMapping = renderer.toneMapping;
141
167
  const outputColorSpace = renderer.outputColorSpace;
142
168
 
143
- this._quadMesh.material.fragmentNode = this.outputColorTransform === true ? renderOutput( this.outputNode, toneMapping, outputColorSpace ) : this.outputNode.context( { toneMapping, outputColorSpace } );
169
+ const context = {
170
+ postProcessing: this,
171
+ onBeforePostProcessing: null,
172
+ onAfterPostProcessing: null
173
+ };
174
+
175
+ let outputNode = this.outputNode;
176
+
177
+ if ( this.outputColorTransform === true ) {
178
+
179
+ outputNode = outputNode.context( context );
180
+
181
+ outputNode = renderOutput( outputNode, toneMapping, outputColorSpace );
182
+
183
+ } else {
184
+
185
+ context.toneMapping = toneMapping;
186
+ context.outputColorSpace = outputColorSpace;
187
+
188
+ outputNode = outputNode.context( context );
189
+
190
+ }
191
+
192
+ this._context = context;
193
+
194
+ this._quadMesh.material.fragmentNode = outputNode;
144
195
  this._quadMesh.material.needsUpdate = true;
145
196
 
146
197
  this.needsUpdate = false;
@@ -161,13 +212,15 @@ class PostProcessing {
161
212
 
162
213
  this._update();
163
214
 
215
+ if ( this._context.onBeforePostProcessing !== null ) this._context.onBeforePostProcessing();
216
+
164
217
  const renderer = this.renderer;
165
218
 
166
219
  const toneMapping = renderer.toneMapping;
167
220
  const outputColorSpace = renderer.outputColorSpace;
168
221
 
169
222
  renderer.toneMapping = NoToneMapping;
170
- renderer.outputColorSpace = LinearSRGBColorSpace;
223
+ renderer.outputColorSpace = ColorManagement.workingColorSpace;
171
224
 
172
225
  //
173
226
 
@@ -183,6 +236,8 @@ class PostProcessing {
183
236
  renderer.toneMapping = toneMapping;
184
237
  renderer.outputColorSpace = outputColorSpace;
185
238
 
239
+ if ( this._context.onAfterPostProcessing !== null ) this._context.onAfterPostProcessing();
240
+
186
241
  }
187
242
 
188
243
  }
@@ -19,10 +19,6 @@ function painterSortStable( a, b ) {
19
19
 
20
20
  return a.renderOrder - b.renderOrder;
21
21
 
22
- } else if ( a.material.id !== b.material.id ) {
23
-
24
- return a.material.id - b.material.id;
25
-
26
22
  } else if ( a.z !== b.z ) {
27
23
 
28
24
  return a.z - b.z;
@@ -171,6 +171,16 @@ class RenderObject {
171
171
  */
172
172
  this.attributes = null;
173
173
 
174
+ /**
175
+ * An object holding the version of the
176
+ * attributes. The keys are the attribute names
177
+ * and the values are the attribute versions.
178
+ *
179
+ * @type {?Object<string, number>}
180
+ * @default null
181
+ */
182
+ this.attributesId = null;
183
+
174
184
  /**
175
185
  * A reference to a render pipeline the render
176
186
  * object is processed with.
@@ -290,7 +300,7 @@ class RenderObject {
290
300
 
291
301
  /**
292
302
  * An event listener which is executed when `dispose()` is called on
293
- * the render object's material.
303
+ * the material of this render object.
294
304
  *
295
305
  * @method
296
306
  */
@@ -300,7 +310,23 @@ class RenderObject {
300
310
 
301
311
  };
302
312
 
313
+ /**
314
+ * An event listener which is executed when `dispose()` is called on
315
+ * the geometry of this render object.
316
+ *
317
+ * @method
318
+ */
319
+ this.onGeometryDispose = () => {
320
+
321
+ // clear geometry cache attributes
322
+
323
+ this.attributes = null;
324
+ this.attributesId = null;
325
+
326
+ };
327
+
303
328
  this.material.addEventListener( 'dispose', this.onMaterialDispose );
329
+ this.geometry.addEventListener( 'dispose', this.onGeometryDispose );
304
330
 
305
331
  }
306
332
 
@@ -439,6 +465,7 @@ class RenderObject {
439
465
 
440
466
  this.geometry = geometry;
441
467
  this.attributes = null;
468
+ this.attributesId = null;
442
469
 
443
470
  }
444
471
 
@@ -458,9 +485,25 @@ class RenderObject {
458
485
  const attributes = [];
459
486
  const vertexBuffers = new Set();
460
487
 
488
+ const attributesId = {};
489
+
461
490
  for ( const nodeAttribute of nodeAttributes ) {
462
491
 
463
- const attribute = nodeAttribute.node && nodeAttribute.node.attribute ? nodeAttribute.node.attribute : geometry.getAttribute( nodeAttribute.name );
492
+ let attribute;
493
+
494
+ if ( nodeAttribute.node && nodeAttribute.node.attribute ) {
495
+
496
+ // node attribute
497
+ attribute = nodeAttribute.node.attribute;
498
+
499
+ } else {
500
+
501
+ // geometry attribute
502
+ attribute = geometry.getAttribute( nodeAttribute.name );
503
+
504
+ attributesId[ nodeAttribute.name ] = attribute.version;
505
+
506
+ }
464
507
 
465
508
  if ( attribute === undefined ) continue;
466
509
 
@@ -472,6 +515,7 @@ class RenderObject {
472
515
  }
473
516
 
474
517
  this.attributes = attributes;
518
+ this.attributesId = attributesId;
475
519
  this.vertexBuffers = Array.from( vertexBuffers.values() );
476
520
 
477
521
  return attributes;
@@ -509,7 +553,18 @@ class RenderObject {
509
553
 
510
554
  const index = this.getIndex();
511
555
  const hasIndex = ( index !== null );
512
- const instanceCount = geometry.isInstancedBufferGeometry ? geometry.instanceCount : ( object.count > 1 ? object.count : 1 );
556
+
557
+ let instanceCount = 1;
558
+
559
+ if ( geometry.isInstancedBufferGeometry === true ) {
560
+
561
+ instanceCount = geometry.instanceCount;
562
+
563
+ } else if ( object.count !== undefined ) {
564
+
565
+ instanceCount = Math.max( 0, object.count );
566
+
567
+ }
513
568
 
514
569
  if ( instanceCount === 0 ) return null;
515
570
 
@@ -725,7 +780,27 @@ class RenderObject {
725
780
  */
726
781
  get needsGeometryUpdate() {
727
782
 
728
- return this.geometry.id !== this.object.geometry.id;
783
+ if ( this.geometry.id !== this.object.geometry.id ) return true;
784
+
785
+ if ( this.attributes !== null ) {
786
+
787
+ const attributesId = this.attributesId;
788
+
789
+ for ( const name in attributesId ) {
790
+
791
+ const attribute = this.geometry.getAttribute( name );
792
+
793
+ if ( attribute === undefined || attributesId[ name ] !== attribute.id ) {
794
+
795
+ return true;
796
+
797
+ }
798
+
799
+ }
800
+
801
+ }
802
+
803
+ return false;
729
804
 
730
805
  }
731
806
 
@@ -803,6 +878,7 @@ class RenderObject {
803
878
  dispose() {
804
879
 
805
880
  this.material.removeEventListener( 'dispose', this.onMaterialDispose );
881
+ this.geometry.removeEventListener( 'dispose', this.onGeometryDispose );
806
882
 
807
883
  this.onDispose();
808
884