@plastic-software/three 0.174.0 → 0.175.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 (544) hide show
  1. package/build/three.cjs +10655 -1446
  2. package/build/three.core.js +9626 -1094
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +834 -157
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +4 -2
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +2658 -1697
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +2654 -1709
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +1 -1
  13. package/examples/jsm/animation/AnimationClipCreator.js +57 -6
  14. package/examples/jsm/animation/CCDIKSolver.js +93 -39
  15. package/examples/jsm/capabilities/WebGL.js +28 -3
  16. package/examples/jsm/capabilities/WebGPU.js +16 -6
  17. package/examples/jsm/controls/ArcballControls.js +424 -154
  18. package/examples/jsm/controls/DragControls.js +93 -2
  19. package/examples/jsm/controls/FirstPersonControls.js +113 -4
  20. package/examples/jsm/controls/FlyControls.js +49 -2
  21. package/examples/jsm/controls/MapControls.js +42 -9
  22. package/examples/jsm/controls/OrbitControls.js +345 -42
  23. package/examples/jsm/controls/PointerLockControls.js +111 -9
  24. package/examples/jsm/controls/TrackballControls.js +159 -8
  25. package/examples/jsm/controls/TransformControls.js +252 -6
  26. package/examples/jsm/csm/CSM.js +226 -15
  27. package/examples/jsm/csm/CSMFrustum.js +52 -0
  28. package/examples/jsm/csm/CSMHelper.js +47 -0
  29. package/examples/jsm/csm/CSMShader.js +10 -1
  30. package/examples/jsm/csm/CSMShadowNode.js +156 -13
  31. package/examples/jsm/curves/CurveExtras.js +289 -31
  32. package/examples/jsm/curves/NURBSCurve.js +57 -14
  33. package/examples/jsm/curves/NURBSSurface.js +50 -6
  34. package/examples/jsm/curves/NURBSUtils.js +96 -112
  35. package/examples/jsm/curves/NURBSVolume.js +22 -4
  36. package/examples/jsm/effects/AnaglyphEffect.js +30 -0
  37. package/examples/jsm/effects/AsciiEffect.js +60 -15
  38. package/examples/jsm/effects/OutlineEffect.js +59 -111
  39. package/examples/jsm/effects/ParallaxBarrierEffect.js +28 -0
  40. package/examples/jsm/effects/PeppersGhostEffect.js +21 -2
  41. package/examples/jsm/effects/StereoEffect.js +29 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +49 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +23 -4
  44. package/examples/jsm/exporters/DRACOExporter.js +53 -13
  45. package/examples/jsm/exporters/EXRExporter.js +37 -8
  46. package/examples/jsm/exporters/GLTFExporter.js +171 -48
  47. package/examples/jsm/exporters/KTX2Exporter.js +20 -0
  48. package/examples/jsm/exporters/OBJExporter.js +18 -0
  49. package/examples/jsm/exporters/PLYExporter.js +39 -9
  50. package/examples/jsm/exporters/STLExporter.js +25 -5
  51. package/examples/jsm/exporters/USDZExporter.js +70 -3
  52. package/examples/jsm/geometries/BoxLineGeometry.js +22 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +18 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +20 -9
  55. package/examples/jsm/geometries/ParametricFunctions.js +97 -0
  56. package/examples/jsm/geometries/ParametricGeometry.js +37 -5
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +21 -0
  58. package/examples/jsm/geometries/TeapotGeometry.js +22 -38
  59. package/examples/jsm/geometries/TextGeometry.js +44 -16
  60. package/examples/jsm/helpers/LightProbeHelper.js +35 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +36 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +35 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +59 -0
  64. package/examples/jsm/helpers/RectAreaLightHelper.js +35 -3
  65. package/examples/jsm/helpers/TextureHelper.js +27 -0
  66. package/examples/jsm/helpers/TextureHelperGPU.js +28 -0
  67. package/examples/jsm/helpers/VertexNormalsHelper.js +58 -2
  68. package/examples/jsm/helpers/VertexTangentsHelper.js +46 -2
  69. package/examples/jsm/helpers/ViewHelper.js +75 -1
  70. package/examples/jsm/interactive/HTMLMesh.js +25 -0
  71. package/examples/jsm/interactive/InteractiveGroup.js +65 -5
  72. package/examples/jsm/interactive/SelectionBox.js +74 -9
  73. package/examples/jsm/interactive/SelectionHelper.js +71 -29
  74. package/examples/jsm/libs/motion-controllers.module.js +1 -1
  75. package/examples/jsm/lighting/TiledLighting.js +23 -0
  76. package/examples/jsm/lights/LightProbeGenerator.js +26 -1
  77. package/examples/jsm/lights/RectAreaLightTexturesLib.js +48 -13
  78. package/examples/jsm/lights/RectAreaLightUniformsLib.js +15 -0
  79. package/examples/jsm/lines/Line2.js +36 -0
  80. package/examples/jsm/lines/LineGeometry.js +52 -0
  81. package/examples/jsm/lines/LineMaterial.js +95 -0
  82. package/examples/jsm/lines/LineSegments2.js +51 -2
  83. package/examples/jsm/lines/LineSegmentsGeometry.js +62 -8
  84. package/examples/jsm/lines/Wireframe.js +38 -2
  85. package/examples/jsm/lines/WireframeGeometry2.js +24 -0
  86. package/examples/jsm/lines/webgpu/Line2.js +25 -1
  87. package/examples/jsm/lines/webgpu/LineSegments2.js +44 -6
  88. package/examples/jsm/lines/webgpu/Wireframe.js +30 -2
  89. package/examples/jsm/loaders/3DMLoader.js +71 -2
  90. package/examples/jsm/loaders/3MFLoader.js +41 -3
  91. package/examples/jsm/loaders/AMFLoader.js +31 -12
  92. package/examples/jsm/loaders/BVHLoader.js +57 -11
  93. package/examples/jsm/loaders/ColladaLoader.js +35 -0
  94. package/examples/jsm/loaders/DDSLoader.js +24 -0
  95. package/examples/jsm/loaders/DRACOLoader.js +73 -1
  96. package/examples/jsm/loaders/EXRLoader.js +40 -8
  97. package/examples/jsm/loaders/FBXLoader.js +42 -14
  98. package/examples/jsm/loaders/FontLoader.js +60 -2
  99. package/examples/jsm/loaders/GCodeLoader.js +33 -5
  100. package/examples/jsm/loaders/GLTFLoader.js +218 -5
  101. package/examples/jsm/loaders/HDRCubeTextureLoader.js +48 -0
  102. package/examples/jsm/loaders/IESLoader.js +41 -0
  103. package/examples/jsm/loaders/KMZLoader.js +32 -0
  104. package/examples/jsm/loaders/KTX2Loader.js +86 -18
  105. package/examples/jsm/loaders/KTXLoader.js +26 -6
  106. package/examples/jsm/loaders/LDrawLoader.js +115 -5
  107. package/examples/jsm/loaders/LUT3dlLoader.js +46 -10
  108. package/examples/jsm/loaders/LUTCubeLoader.js +45 -9
  109. package/examples/jsm/loaders/LUTImageLoader.js +78 -38
  110. package/examples/jsm/loaders/LWOLoader.js +46 -7
  111. package/examples/jsm/loaders/LottieLoader.js +37 -0
  112. package/examples/jsm/loaders/MD2Loader.js +36 -1
  113. package/examples/jsm/loaders/MDDLoader.js +56 -12
  114. package/examples/jsm/loaders/MTLLoader.js +38 -33
  115. package/examples/jsm/loaders/MaterialXLoader.js +33 -0
  116. package/examples/jsm/loaders/NRRDLoader.js +36 -5
  117. package/examples/jsm/loaders/OBJLoader.js +48 -1
  118. package/examples/jsm/loaders/PCDLoader.js +47 -0
  119. package/examples/jsm/loaders/PDBLoader.js +40 -2
  120. package/examples/jsm/loaders/PLYLoader.js +62 -32
  121. package/examples/jsm/loaders/PVRLoader.js +23 -5
  122. package/examples/jsm/loaders/RGBELoader.js +38 -5
  123. package/examples/jsm/loaders/RGBMLoader.js +67 -1
  124. package/examples/jsm/loaders/STLLoader.js +47 -38
  125. package/examples/jsm/loaders/SVGLoader.js +113 -20
  126. package/examples/jsm/loaders/TDSLoader.js +81 -61
  127. package/examples/jsm/loaders/TGALoader.js +22 -0
  128. package/examples/jsm/loaders/TIFFLoader.js +22 -0
  129. package/examples/jsm/loaders/TTFLoader.js +36 -2
  130. package/examples/jsm/loaders/USDZLoader.js +34 -1
  131. package/examples/jsm/loaders/UltraHDRLoader.js +58 -12
  132. package/examples/jsm/loaders/VOXLoader.js +57 -0
  133. package/examples/jsm/loaders/VRMLLoader.js +32 -1
  134. package/examples/jsm/loaders/VTKLoader.js +38 -0
  135. package/examples/jsm/loaders/XYZLoader.js +35 -0
  136. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +39 -0
  137. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +39 -0
  138. package/examples/jsm/materials/MeshPostProcessingMaterial.js +24 -2
  139. package/examples/jsm/math/Capsule.js +89 -14
  140. package/examples/jsm/math/ColorConverter.js +21 -0
  141. package/examples/jsm/math/ColorSpaces.js +53 -0
  142. package/examples/jsm/math/ConvexHull.js +514 -92
  143. package/examples/jsm/math/ImprovedNoise.js +14 -2
  144. package/examples/jsm/math/Lut.js +111 -0
  145. package/examples/jsm/math/MeshSurfaceSampler.js +76 -13
  146. package/examples/jsm/math/OBB.js +139 -46
  147. package/examples/jsm/math/Octree.js +132 -5
  148. package/examples/jsm/math/SimplexNoise.js +66 -42
  149. package/examples/jsm/misc/ConvexObjectBreaker.js +43 -25
  150. package/examples/jsm/misc/GPUComputationRenderer.js +92 -17
  151. package/examples/jsm/misc/Gyroscope.js +11 -0
  152. package/examples/jsm/misc/MD2Character.js +115 -2
  153. package/examples/jsm/misc/MD2CharacterComplex.js +170 -8
  154. package/examples/jsm/misc/MorphAnimMesh.js +43 -0
  155. package/examples/jsm/misc/MorphBlendMesh.js +102 -0
  156. package/examples/jsm/misc/ProgressiveLightMap.js +40 -15
  157. package/examples/jsm/misc/ProgressiveLightMapGPU.js +33 -13
  158. package/examples/jsm/misc/RollerCoaster.js +52 -0
  159. package/examples/jsm/misc/Timer.js +79 -2
  160. package/examples/jsm/misc/TubePainter.js +53 -0
  161. package/examples/jsm/misc/Volume.js +108 -72
  162. package/examples/jsm/misc/VolumeSlice.js +88 -45
  163. package/examples/jsm/modifiers/CurveModifier.js +57 -34
  164. package/examples/jsm/modifiers/CurveModifierGPU.js +36 -17
  165. package/examples/jsm/modifiers/EdgeSplitModifier.js +18 -0
  166. package/examples/jsm/modifiers/SimplifyModifier.js +20 -8
  167. package/examples/jsm/modifiers/TessellateModifier.js +33 -2
  168. package/examples/jsm/objects/GroundedSkybox.js +23 -5
  169. package/examples/jsm/objects/Lensflare.js +91 -2
  170. package/examples/jsm/objects/LensflareMesh.js +53 -2
  171. package/examples/jsm/objects/MarchingCubes.js +88 -5
  172. package/examples/jsm/objects/Reflector.js +70 -0
  173. package/examples/jsm/objects/ReflectorForSSRPass.js +39 -0
  174. package/examples/jsm/objects/Refractor.js +61 -0
  175. package/examples/jsm/objects/ShadowMesh.js +53 -4
  176. package/examples/jsm/objects/Sky.js +26 -9
  177. package/examples/jsm/objects/SkyMesh.js +60 -9
  178. package/examples/jsm/objects/Water.js +44 -5
  179. package/examples/jsm/objects/Water2.js +42 -3
  180. package/examples/jsm/objects/Water2Mesh.js +38 -3
  181. package/examples/jsm/objects/WaterMesh.js +94 -7
  182. package/examples/jsm/physics/AmmoPhysics.js +47 -0
  183. package/examples/jsm/physics/JoltPhysics.js +48 -0
  184. package/examples/jsm/physics/RapierPhysics.js +56 -0
  185. package/examples/jsm/postprocessing/AfterimagePass.js +90 -38
  186. package/examples/jsm/postprocessing/BloomPass.js +125 -24
  187. package/examples/jsm/postprocessing/BokehPass.js +98 -22
  188. package/examples/jsm/postprocessing/ClearPass.js +53 -3
  189. package/examples/jsm/postprocessing/CubeTexturePass.js +81 -21
  190. package/examples/jsm/postprocessing/DotScreenPass.js +58 -10
  191. package/examples/jsm/postprocessing/EffectComposer.js +131 -0
  192. package/examples/jsm/postprocessing/FilmPass.js +53 -5
  193. package/examples/jsm/postprocessing/GTAOPass.js +191 -48
  194. package/examples/jsm/postprocessing/GlitchPass.js +84 -33
  195. package/examples/jsm/postprocessing/HalftonePass.js +64 -10
  196. package/examples/jsm/postprocessing/LUTPass.js +37 -8
  197. package/examples/jsm/postprocessing/MaskPass.js +90 -0
  198. package/examples/jsm/postprocessing/OutlinePass.js +266 -133
  199. package/examples/jsm/postprocessing/OutputPass.js +53 -14
  200. package/examples/jsm/postprocessing/Pass.js +98 -4
  201. package/examples/jsm/postprocessing/RenderPass.js +83 -0
  202. package/examples/jsm/postprocessing/RenderPixelatedPass.js +123 -45
  203. package/examples/jsm/postprocessing/RenderTransitionPass.js +119 -21
  204. package/examples/jsm/postprocessing/SAOPass.js +126 -53
  205. package/examples/jsm/postprocessing/SMAAPass.js +103 -71
  206. package/examples/jsm/postprocessing/SSAARenderPass.js +117 -35
  207. package/examples/jsm/postprocessing/SSAOPass.js +160 -47
  208. package/examples/jsm/postprocessing/SSRPass.js +230 -49
  209. package/examples/jsm/postprocessing/SavePass.js +68 -16
  210. package/examples/jsm/postprocessing/ShaderPass.js +64 -7
  211. package/examples/jsm/postprocessing/TAARenderPass.js +78 -24
  212. package/examples/jsm/postprocessing/TexturePass.js +71 -8
  213. package/examples/jsm/postprocessing/UnrealBloomPass.js +113 -37
  214. package/examples/jsm/renderers/CSS2DRenderer.js +77 -1
  215. package/examples/jsm/renderers/CSS3DRenderer.js +99 -3
  216. package/examples/jsm/renderers/Projector.js +18 -2
  217. package/examples/jsm/renderers/SVGRenderer.js +124 -0
  218. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +9 -5
  219. package/examples/jsm/shaders/AfterimageShader.js +6 -4
  220. package/examples/jsm/shaders/BasicShader.js +6 -2
  221. package/examples/jsm/shaders/BleachBypassShader.js +8 -4
  222. package/examples/jsm/shaders/BlendShader.js +6 -2
  223. package/examples/jsm/shaders/BokehShader.js +7 -4
  224. package/examples/jsm/shaders/BokehShader2.js +7 -3
  225. package/examples/jsm/shaders/BrightnessContrastShader.js +8 -5
  226. package/examples/jsm/shaders/ColorCorrectionShader.js +6 -2
  227. package/examples/jsm/shaders/ColorifyShader.js +6 -2
  228. package/examples/jsm/shaders/ConvolutionShader.js +7 -39
  229. package/examples/jsm/shaders/CopyShader.js +6 -2
  230. package/examples/jsm/shaders/DOFMipMapShader.js +8 -4
  231. package/examples/jsm/shaders/DepthLimitedBlurShader.js +7 -1
  232. package/examples/jsm/shaders/DigitalGlitch.js +7 -7
  233. package/examples/jsm/shaders/DotScreenShader.js +6 -4
  234. package/examples/jsm/shaders/ExposureShader.js +6 -2
  235. package/examples/jsm/shaders/FXAAShader.js +15 -7
  236. package/examples/jsm/shaders/FilmShader.js +10 -0
  237. package/examples/jsm/shaders/FocusShader.js +6 -4
  238. package/examples/jsm/shaders/FreiChenShader.js +7 -3
  239. package/examples/jsm/shaders/GTAOShader.js +33 -39
  240. package/examples/jsm/shaders/GammaCorrectionShader.js +8 -2
  241. package/examples/jsm/shaders/GodRaysShader.js +14 -5
  242. package/examples/jsm/shaders/HalftoneShader.js +11 -5
  243. package/examples/jsm/shaders/HorizontalBlurShader.js +9 -3
  244. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +6 -2
  245. package/examples/jsm/shaders/HueSaturationShader.js +7 -3
  246. package/examples/jsm/shaders/KaleidoShader.js +8 -4
  247. package/examples/jsm/shaders/LuminosityHighPassShader.js +6 -5
  248. package/examples/jsm/shaders/LuminosityShader.js +6 -3
  249. package/examples/jsm/shaders/MirrorShader.js +7 -4
  250. package/examples/jsm/shaders/NormalMapShader.js +5 -3
  251. package/examples/jsm/shaders/OutputShader.js +11 -0
  252. package/examples/jsm/shaders/PoissonDenoiseShader.js +21 -15
  253. package/examples/jsm/shaders/RGBShiftShader.js +5 -1
  254. package/examples/jsm/shaders/SAOShader.js +8 -2
  255. package/examples/jsm/shaders/SMAAShader.js +23 -1
  256. package/examples/jsm/shaders/SSAOShader.js +23 -5
  257. package/examples/jsm/shaders/SSRShader.js +25 -1
  258. package/examples/jsm/shaders/SepiaShader.js +6 -4
  259. package/examples/jsm/shaders/SobelOperatorShader.js +5 -2
  260. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +10 -8
  261. package/examples/jsm/shaders/TechnicolorShader.js +7 -4
  262. package/examples/jsm/shaders/ToonShader.js +29 -7
  263. package/examples/jsm/shaders/TriangleBlurShader.js +6 -4
  264. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +6 -3
  265. package/examples/jsm/shaders/VelocityShader.js +6 -2
  266. package/examples/jsm/shaders/VerticalBlurShader.js +6 -2
  267. package/examples/jsm/shaders/VerticalTiltShiftShader.js +5 -1
  268. package/examples/jsm/shaders/VignetteShader.js +6 -4
  269. package/examples/jsm/shaders/VolumeShader.js +7 -1
  270. package/examples/jsm/shaders/WaterRefractionShader.js +8 -0
  271. package/examples/jsm/textures/FlakesTexture.js +12 -0
  272. package/examples/jsm/transpiler/Transpiler.js +31 -0
  273. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  274. package/examples/jsm/tsl/display/BloomNode.js +1 -1
  275. package/examples/jsm/tsl/display/PixelationPassNode.js +4 -4
  276. package/examples/jsm/tsl/display/SSRNode.js +1 -1
  277. package/examples/jsm/tsl/lighting/TiledLightsNode.js +29 -3
  278. package/examples/jsm/tsl/math/Bayer.js +14 -1
  279. package/examples/jsm/tsl/utils/Raymarching.js +4 -2
  280. package/examples/jsm/utils/BufferGeometryUtils.js +88 -29
  281. package/examples/jsm/utils/CameraUtils.js +10 -7
  282. package/examples/jsm/utils/GeometryCompressionUtils.js +20 -30
  283. package/examples/jsm/utils/GeometryUtils.js +12 -13
  284. package/examples/jsm/utils/LDrawUtils.js +11 -4
  285. package/examples/jsm/utils/SceneOptimizer.js +66 -20
  286. package/examples/jsm/utils/SceneUtils.js +50 -3
  287. package/examples/jsm/utils/ShadowMapViewer.js +47 -24
  288. package/examples/jsm/utils/ShadowMapViewerGPU.js +47 -24
  289. package/examples/jsm/utils/SkeletonUtils.js +45 -0
  290. package/examples/jsm/utils/SortUtils.js +14 -5
  291. package/examples/jsm/utils/UVsDebug.js +9 -4
  292. package/examples/jsm/utils/WebGLTextureUtils.js +13 -0
  293. package/examples/jsm/utils/WebGPUTextureUtils.js +14 -0
  294. package/examples/jsm/utils/WorkerPool.js +65 -2
  295. package/examples/jsm/webxr/ARButton.js +18 -0
  296. package/examples/jsm/webxr/OculusHandModel.js +83 -0
  297. package/examples/jsm/webxr/OculusHandPointerModel.js +125 -0
  298. package/examples/jsm/webxr/Text2D.js +11 -0
  299. package/examples/jsm/webxr/VRButton.js +30 -0
  300. package/examples/jsm/webxr/XRButton.js +22 -0
  301. package/examples/jsm/webxr/XRControllerModelFactory.js +87 -3
  302. package/examples/jsm/webxr/XREstimatedLight.js +33 -3
  303. package/examples/jsm/webxr/XRHandMeshModel.js +35 -0
  304. package/examples/jsm/webxr/XRHandModelFactory.js +92 -0
  305. package/examples/jsm/webxr/XRHandPrimitiveModel.js +42 -0
  306. package/examples/jsm/webxr/XRPlanes.js +17 -0
  307. package/package.json +1 -1
  308. package/src/Three.TSL.js +3 -1
  309. package/src/animation/AnimationAction.js +262 -30
  310. package/src/animation/AnimationClip.js +141 -2
  311. package/src/animation/AnimationMixer.js +99 -15
  312. package/src/animation/AnimationObjectGroup.js +41 -18
  313. package/src/animation/AnimationUtils.js +168 -18
  314. package/src/animation/KeyframeTrack.js +144 -10
  315. package/src/animation/PropertyBinding.js +77 -3
  316. package/src/animation/PropertyMixer.js +72 -5
  317. package/src/animation/tracks/BooleanKeyframeTrack.js +33 -6
  318. package/src/animation/tracks/ColorKeyframeTrack.js +26 -5
  319. package/src/animation/tracks/NumberKeyframeTrack.js +26 -2
  320. package/src/animation/tracks/QuaternionKeyframeTrack.js +30 -1
  321. package/src/animation/tracks/StringKeyframeTrack.js +33 -2
  322. package/src/animation/tracks/VectorKeyframeTrack.js +26 -2
  323. package/src/audio/AudioAnalyser.js +1 -1
  324. package/src/audio/AudioListener.js +2 -2
  325. package/src/audio/PositionalAudio.js +5 -5
  326. package/src/constants.js +1429 -5
  327. package/src/core/BufferAttribute.js +413 -3
  328. package/src/core/BufferGeometry.js +337 -1
  329. package/src/core/Clock.js +60 -0
  330. package/src/core/GLBufferAttribute.js +99 -0
  331. package/src/core/InstancedBufferAttribute.js +29 -0
  332. package/src/core/InstancedBufferGeometry.js +20 -0
  333. package/src/core/InstancedInterleavedBuffer.js +26 -0
  334. package/src/core/InterleavedBuffer.js +137 -3
  335. package/src/core/InterleavedBufferAttribute.js +197 -0
  336. package/src/core/Layers.js +71 -10
  337. package/src/core/Object3D.js +23 -0
  338. package/src/core/Raycaster.js +134 -1
  339. package/src/core/RenderTarget.js +166 -7
  340. package/src/core/RenderTarget3D.js +25 -0
  341. package/src/core/RenderTargetArray.js +18 -0
  342. package/src/core/Uniform.js +29 -0
  343. package/src/core/UniformsGroup.js +84 -2
  344. package/src/extras/Controls.js +16 -1
  345. package/src/extras/Earcut.js +3 -781
  346. package/src/extras/ImageUtils.js +3 -2
  347. package/src/extras/PMREMGenerator.js +22 -17
  348. package/src/extras/core/Curve.js +1 -1
  349. package/src/extras/core/Path.js +1 -1
  350. package/src/extras/lib/earcut.js +685 -0
  351. package/src/geometries/ConeGeometry.js +2 -2
  352. package/src/geometries/CylinderGeometry.js +2 -2
  353. package/src/geometries/ExtrudeGeometry.js +71 -39
  354. package/src/geometries/LatheGeometry.js +1 -1
  355. package/src/lights/LightShadow.js +1 -1
  356. package/src/lights/webgpu/IESSpotLight.js +1 -1
  357. package/src/loaders/AnimationLoader.js +31 -0
  358. package/src/loaders/AudioLoader.js +31 -0
  359. package/src/loaders/BufferGeometryLoader.js +34 -0
  360. package/src/loaders/Cache.js +45 -0
  361. package/src/loaders/CompressedTextureLoader.js +36 -3
  362. package/src/loaders/CubeTextureLoader.js +45 -0
  363. package/src/loaders/DataTextureLoader.js +44 -3
  364. package/src/loaders/FileLoader.js +57 -1
  365. package/src/loaders/ImageBitmapLoader.js +57 -0
  366. package/src/loaders/ImageLoader.js +30 -0
  367. package/src/loaders/Loader.js +4 -6
  368. package/src/loaders/LoaderUtils.js +18 -36
  369. package/src/loaders/LoadingManager.js +142 -0
  370. package/src/loaders/MaterialLoader.js +57 -0
  371. package/src/loaders/ObjectLoader.js +53 -0
  372. package/src/loaders/TextureLoader.js +33 -0
  373. package/src/loaders/nodes/NodeLoader.js +6 -2
  374. package/src/loaders/nodes/NodeMaterialLoader.js +1 -1
  375. package/src/loaders/nodes/NodeObjectLoader.js +3 -3
  376. package/src/materials/LineBasicMaterial.js +74 -1
  377. package/src/materials/LineDashedMaterial.js +52 -0
  378. package/src/materials/Material.js +18 -3
  379. package/src/materials/MeshBasicMaterial.js +165 -0
  380. package/src/materials/MeshDepthMaterial.js +93 -0
  381. package/src/materials/MeshDistanceMaterial.js +76 -0
  382. package/src/materials/MeshLambertMaterial.js +273 -0
  383. package/src/materials/MeshMatcapMaterial.js +142 -0
  384. package/src/materials/MeshNormalMaterial.js +113 -0
  385. package/src/materials/MeshPhongMaterial.js +288 -0
  386. package/src/materials/MeshPhysicalMaterial.js +292 -1
  387. package/src/materials/MeshStandardMaterial.js +297 -0
  388. package/src/materials/MeshToonMaterial.js +218 -0
  389. package/src/materials/PointsMaterial.js +89 -0
  390. package/src/materials/RawShaderMaterial.js +25 -0
  391. package/src/materials/ShaderMaterial.js +215 -6
  392. package/src/materials/ShadowMaterial.js +54 -0
  393. package/src/materials/SpriteMaterial.js +82 -0
  394. package/src/materials/nodes/Line2NodeMaterial.js +1 -1
  395. package/src/materials/nodes/LineBasicNodeMaterial.js +2 -2
  396. package/src/materials/nodes/LineDashedNodeMaterial.js +2 -2
  397. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  398. package/src/materials/nodes/MeshLambertNodeMaterial.js +2 -2
  399. package/src/materials/nodes/MeshMatcapNodeMaterial.js +2 -2
  400. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  401. package/src/materials/nodes/MeshPhongNodeMaterial.js +2 -2
  402. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -2
  403. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  404. package/src/materials/nodes/MeshStandardNodeMaterial.js +2 -2
  405. package/src/materials/nodes/MeshToonNodeMaterial.js +2 -2
  406. package/src/materials/nodes/NodeMaterial.js +7 -3
  407. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  408. package/src/materials/nodes/ShadowNodeMaterial.js +11 -2
  409. package/src/materials/nodes/SpriteNodeMaterial.js +1 -1
  410. package/src/materials/nodes/VolumeNodeMaterial.js +10 -1
  411. package/src/math/Color.js +1 -1
  412. package/src/math/MathUtils.js +223 -0
  413. package/src/nodes/Nodes.js +1 -0
  414. package/src/nodes/accessors/BatchNode.js +8 -8
  415. package/src/nodes/accessors/BuiltinNode.js +1 -1
  416. package/src/nodes/accessors/CubeTextureNode.js +1 -1
  417. package/src/nodes/accessors/InstanceNode.js +5 -5
  418. package/src/nodes/accessors/InstancedMeshNode.js +1 -1
  419. package/src/nodes/accessors/MorphNode.js +27 -23
  420. package/src/nodes/accessors/Normal.js +1 -1
  421. package/src/nodes/accessors/Object3DNode.js +12 -12
  422. package/src/nodes/accessors/ReferenceBaseNode.js +2 -2
  423. package/src/nodes/accessors/ReferenceNode.js +1 -1
  424. package/src/nodes/accessors/SkinningNode.js +46 -37
  425. package/src/nodes/accessors/StorageBufferNode.js +1 -1
  426. package/src/nodes/accessors/StorageTextureNode.js +3 -3
  427. package/src/nodes/accessors/Texture3DNode.js +1 -1
  428. package/src/nodes/accessors/TextureNode.js +25 -5
  429. package/src/nodes/accessors/TextureSizeNode.js +1 -1
  430. package/src/nodes/accessors/UniformArrayNode.js +2 -2
  431. package/src/nodes/code/CodeNode.js +4 -4
  432. package/src/nodes/code/ExpressionNode.js +4 -4
  433. package/src/nodes/code/FunctionCallNode.js +23 -3
  434. package/src/nodes/code/ScriptableNode.js +4 -4
  435. package/src/nodes/code/ScriptableValueNode.js +2 -2
  436. package/src/nodes/core/AssignNode.js +1 -1
  437. package/src/nodes/core/AttributeNode.js +1 -1
  438. package/src/nodes/core/BypassNode.js +1 -1
  439. package/src/nodes/core/CacheNode.js +1 -1
  440. package/src/nodes/core/ContextNode.js +1 -1
  441. package/src/nodes/core/InputNode.js +2 -2
  442. package/src/nodes/core/Node.js +14 -2
  443. package/src/nodes/core/NodeBuilder.js +86 -14
  444. package/src/nodes/core/StackNode.js +5 -5
  445. package/src/nodes/core/StructNode.js +1 -1
  446. package/src/nodes/core/StructTypeNode.js +2 -2
  447. package/src/nodes/core/VarNode.js +2 -8
  448. package/src/nodes/core/VaryingNode.js +3 -3
  449. package/src/nodes/display/BlendModes.js +4 -4
  450. package/src/nodes/display/BumpMapNode.js +1 -1
  451. package/src/nodes/display/NormalMapNode.js +1 -1
  452. package/src/nodes/display/PosterizeNode.js +1 -1
  453. package/src/nodes/display/ScreenNode.js +3 -3
  454. package/src/nodes/display/ViewportDepthNode.js +2 -2
  455. package/src/nodes/display/ViewportDepthTextureNode.js +2 -2
  456. package/src/nodes/display/ViewportSharedTextureNode.js +2 -2
  457. package/src/nodes/display/ViewportTextureNode.js +4 -4
  458. package/src/nodes/functions/ShadowMaskModel.js +4 -4
  459. package/src/nodes/functions/material/getParallaxCorrectNormal.js +6 -6
  460. package/src/nodes/geometry/RangeNode.js +1 -1
  461. package/src/nodes/gpgpu/AtomicFunctionNode.js +16 -40
  462. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  463. package/src/nodes/gpgpu/ComputeNode.js +30 -2
  464. package/src/nodes/lighting/AnalyticLightNode.js +9 -1
  465. package/src/nodes/lighting/LightsNode.js +3 -3
  466. package/src/nodes/lighting/ShadowNode.js +1 -1
  467. package/src/nodes/math/ConditionalNode.js +20 -3
  468. package/src/nodes/math/MathNode.js +83 -78
  469. package/src/nodes/math/OperatorNode.js +171 -82
  470. package/src/nodes/pmrem/PMREMNode.js +4 -4
  471. package/src/nodes/pmrem/PMREMUtils.js +2 -2
  472. package/src/nodes/tsl/TSLBase.js +2 -1
  473. package/src/nodes/tsl/TSLCore.js +115 -12
  474. package/src/nodes/utils/ArrayElementNode.js +3 -1
  475. package/src/nodes/utils/CubeMapNode.js +3 -3
  476. package/src/nodes/utils/DebugNode.js +70 -0
  477. package/src/nodes/utils/EquirectUVNode.js +2 -2
  478. package/src/nodes/utils/JoinNode.js +27 -2
  479. package/src/nodes/utils/LoopNode.js +58 -28
  480. package/src/nodes/utils/MaxMipLevelNode.js +1 -1
  481. package/src/nodes/utils/ReflectorNode.js +2 -2
  482. package/src/nodes/utils/RemapNode.js +6 -6
  483. package/src/nodes/utils/RotateNode.js +1 -1
  484. package/src/nodes/utils/SpriteSheetUVNode.js +3 -3
  485. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  486. package/src/nodes/utils/TriplanarTexturesNode.js +3 -3
  487. package/src/objects/BatchedMesh.js +4 -4
  488. package/src/objects/InstancedMesh.js +2 -2
  489. package/src/objects/LOD.js +1 -1
  490. package/src/objects/Skeleton.js +1 -1
  491. package/src/renderers/WebGL3DRenderTarget.js +25 -0
  492. package/src/renderers/WebGLArrayRenderTarget.js +25 -0
  493. package/src/renderers/WebGLCubeRenderTarget.js +39 -1
  494. package/src/renderers/WebGLRenderTarget.js +19 -0
  495. package/src/renderers/WebGLRenderer.js +617 -79
  496. package/src/renderers/common/Animation.js +2 -2
  497. package/src/renderers/common/Attributes.js +2 -2
  498. package/src/renderers/common/Backend.js +12 -3
  499. package/src/renderers/common/Background.js +1 -0
  500. package/src/renderers/common/Color4.js +1 -1
  501. package/src/renderers/common/CubeRenderTarget.js +13 -0
  502. package/src/renderers/common/PostProcessing.js +2 -0
  503. package/src/renderers/common/QuadMesh.js +2 -0
  504. package/src/renderers/common/RenderList.js +2 -2
  505. package/src/renderers/common/RenderObject.js +1 -1
  506. package/src/renderers/common/RenderObjects.js +2 -2
  507. package/src/renderers/common/Renderer.js +52 -31
  508. package/src/renderers/common/XRManager.js +333 -10
  509. package/src/renderers/common/extras/PMREMGenerator.js +6 -0
  510. package/src/renderers/common/nodes/NodeBuilderState.js +3 -3
  511. package/src/renderers/shaders/UniformsLib.js +1 -4
  512. package/src/renderers/shaders/UniformsUtils.js +1 -3
  513. package/src/renderers/webgl/WebGLBackground.js +4 -2
  514. package/src/renderers/webgl/WebGLState.js +9 -9
  515. package/src/renderers/webgl-fallback/WebGLBackend.js +25 -26
  516. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +3 -12
  517. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +67 -19
  518. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +1 -1
  519. package/src/renderers/webgpu/WebGPUBackend.js +128 -87
  520. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +1 -11
  521. package/src/renderers/webgpu/WebGPURenderer.js +17 -11
  522. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +4 -4
  523. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +5 -3
  524. package/src/renderers/webgpu/utils/WebGPUConstants.js +1 -1
  525. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +1 -1
  526. package/src/renderers/webxr/WebXRController.js +87 -2
  527. package/src/renderers/webxr/WebXRDepthSensing.js +49 -0
  528. package/src/renderers/webxr/WebXRManager.js +173 -1
  529. package/src/scenes/Scene.js +2 -1
  530. package/src/textures/CanvasTexture.js +28 -0
  531. package/src/textures/CompressedArrayTexture.js +57 -0
  532. package/src/textures/CompressedCubeTexture.js +29 -0
  533. package/src/textures/CompressedTexture.js +64 -6
  534. package/src/textures/CubeTexture.js +52 -4
  535. package/src/textures/Data3DTexture.js +77 -0
  536. package/src/textures/DataArrayTexture.js +93 -0
  537. package/src/textures/DataTexture.js +65 -0
  538. package/src/textures/DepthTexture.js +59 -9
  539. package/src/textures/FramebufferTexture.js +62 -0
  540. package/src/textures/Source.js +69 -0
  541. package/src/textures/Texture.js +5 -5
  542. package/src/textures/VideoFrameTexture.js +43 -6
  543. package/src/textures/VideoTexture.js +49 -4
  544. package/examples/jsm/geometries/ParametricGeometries.js +0 -254
@@ -79,7 +79,7 @@ class GLSLNodeBuilder extends NodeBuilder {
79
79
  * An array that holds objects defining the varying and attribute data in
80
80
  * context of Transform Feedback.
81
81
  *
82
- * @type {Object<string,Map<string,Object>>}
82
+ * @type {Array<Object<string,AttributeNode|string>>}
83
83
  */
84
84
  this.transforms = [];
85
85
 
@@ -97,14 +97,6 @@ class GLSLNodeBuilder extends NodeBuilder {
97
97
  */
98
98
  this.builtins = { vertex: [], fragment: [], compute: [] };
99
99
 
100
- /**
101
- * Whether comparison in shader code are generated with methods or not.
102
- *
103
- * @type {boolean}
104
- * @default true
105
- */
106
- this.useComparisonMethod = true;
107
-
108
100
  }
109
101
 
110
102
  /**
@@ -775,7 +767,7 @@ ${ flowData.code }
775
767
 
776
768
  const flat = type.includes( 'int' ) || type.includes( 'uv' ) || type.includes( 'iv' ) ? 'flat ' : '';
777
769
 
778
- snippet += `${flat} out ${type} ${varying.name};\n`;
770
+ snippet += `${flat}out ${type} ${varying.name};\n`;
779
771
 
780
772
  } else {
781
773
 
@@ -1073,10 +1065,9 @@ ${ flowData.code }
1073
1065
  for ( let i = 0; i < transforms.length; i ++ ) {
1074
1066
 
1075
1067
  const transform = transforms[ i ];
1076
-
1077
1068
  const attributeName = this.getPropertyName( transform.attributeNode );
1078
1069
 
1079
- snippet += `${ transform.varyingName } = ${ attributeName };\n\t`;
1070
+ if ( attributeName ) snippet += `${ transform.varyingName } = ${ attributeName };\n\t`;
1080
1071
 
1081
1072
  }
1082
1073
 
@@ -697,33 +697,57 @@ class WebGLTextureUtils {
697
697
  *
698
698
  * @param {Texture} srcTexture - The source texture.
699
699
  * @param {Texture} dstTexture - The destination texture.
700
- * @param {?Vector4} [srcRegion=null] - The region of the source texture to copy.
700
+ * @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy.
701
701
  * @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy.
702
- * @param {number} [level=0] - The mip level to copy.
702
+ * @param {number} [srcLevel=0] - The source mip level to copy from.
703
+ * @param {number} [dstLevel=0] - The destination mip level to copy to.
703
704
  */
704
- copyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) {
705
+ copyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {
705
706
 
706
707
  const { gl, backend } = this;
707
708
  const { state } = this.backend;
708
709
 
709
710
  const { textureGPU: dstTextureGPU, glTextureType, glType, glFormat } = backend.get( dstTexture );
710
711
 
711
- let width, height, minX, minY;
712
- let dstX, dstY;
712
+ state.bindTexture( glTextureType, dstTextureGPU );
713
+
714
+ // gather the necessary dimensions to copy
715
+ let width, height, depth, minX, minY, minZ;
716
+ let dstX, dstY, dstZ;
717
+ const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;
713
718
 
714
719
  if ( srcRegion !== null ) {
715
720
 
716
721
  width = srcRegion.max.x - srcRegion.min.x;
717
722
  height = srcRegion.max.y - srcRegion.min.y;
723
+ depth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;
718
724
  minX = srcRegion.min.x;
719
725
  minY = srcRegion.min.y;
726
+ minZ = srcRegion.isBox3 ? srcRegion.min.z : 0;
720
727
 
721
728
  } else {
722
729
 
723
- width = srcTexture.image.width;
724
- height = srcTexture.image.height;
730
+ const levelScale = Math.pow( 2, - srcLevel );
731
+ width = Math.floor( image.width * levelScale );
732
+ height = Math.floor( image.height * levelScale );
733
+
734
+ if ( srcTexture.isDataArrayTexture ) {
735
+
736
+ depth = image.depth;
737
+
738
+ } else if ( srcTexture.isData3DTexture ) {
739
+
740
+ depth = Math.floor( image.depth * levelScale );
741
+
742
+ } else {
743
+
744
+ depth = 1;
745
+
746
+ }
747
+
725
748
  minX = 0;
726
749
  minY = 0;
750
+ minZ = 0;
727
751
 
728
752
  }
729
753
 
@@ -731,36 +755,36 @@ class WebGLTextureUtils {
731
755
 
732
756
  dstX = dstPosition.x;
733
757
  dstY = dstPosition.y;
758
+ dstZ = dstPosition.z;
734
759
 
735
760
  } else {
736
761
 
737
762
  dstX = 0;
738
763
  dstY = 0;
764
+ dstZ = 0;
739
765
 
740
766
  }
741
767
 
742
- state.bindTexture( glTextureType, dstTextureGPU );
743
768
 
744
- // As another texture upload may have changed pixelStorei
745
- // parameters, make sure they are correct for the dstTexture
746
- gl.pixelStorei( gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
747
769
  gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
748
770
  gl.pixelStorei( gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
749
771
  gl.pixelStorei( gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
750
772
 
773
+ // used for copying data from cpu
751
774
  const currentUnpackRowLen = gl.getParameter( gl.UNPACK_ROW_LENGTH );
752
775
  const currentUnpackImageHeight = gl.getParameter( gl.UNPACK_IMAGE_HEIGHT );
753
776
  const currentUnpackSkipPixels = gl.getParameter( gl.UNPACK_SKIP_PIXELS );
754
777
  const currentUnpackSkipRows = gl.getParameter( gl.UNPACK_SKIP_ROWS );
755
778
  const currentUnpackSkipImages = gl.getParameter( gl.UNPACK_SKIP_IMAGES );
756
779
 
757
- const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;
758
-
759
780
  gl.pixelStorei( gl.UNPACK_ROW_LENGTH, image.width );
760
781
  gl.pixelStorei( gl.UNPACK_IMAGE_HEIGHT, image.height );
761
782
  gl.pixelStorei( gl.UNPACK_SKIP_PIXELS, minX );
762
783
  gl.pixelStorei( gl.UNPACK_SKIP_ROWS, minY );
784
+ gl.pixelStorei( gl.UNPACK_SKIP_IMAGES, minZ );
763
785
 
786
+ // set up the src texture
787
+ const isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;
764
788
  if ( srcTexture.isRenderTargetTexture || srcTexture.isDepthTexture ) {
765
789
 
766
790
  const srcTextureData = backend.get( srcTexture );
@@ -786,19 +810,37 @@ class WebGLTextureUtils {
786
810
 
787
811
  } else {
788
812
 
789
- if ( srcTexture.isDataTexture ) {
813
+ if ( isDst3D ) {
790
814
 
791
- gl.texSubImage2D( gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data );
815
+ // copy data into the 3d texture
816
+ if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
817
+
818
+ gl.texSubImage3D( glTextureType, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );
819
+
820
+ } else if ( dstTexture.isCompressedArrayTexture ) {
821
+
822
+ gl.compressedTexSubImage3D( glTextureType, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );
823
+
824
+ } else {
825
+
826
+ gl.texSubImage3D( glTextureType, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );
827
+
828
+ }
792
829
 
793
830
  } else {
794
831
 
795
- if ( srcTexture.isCompressedTexture ) {
832
+ // copy data into the 2d texture
833
+ if ( srcTexture.isDataTexture ) {
834
+
835
+ gl.texSubImage2D( glTextureType, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );
796
836
 
797
- gl.compressedTexSubImage2D( gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data );
837
+ } else if ( srcTexture.isCompressedTexture ) {
838
+
839
+ gl.compressedTexSubImage2D( glTextureType, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );
798
840
 
799
841
  } else {
800
842
 
801
- gl.texSubImage2D( gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image );
843
+ gl.texSubImage2D( glTextureType, dstLevel, dstX, dstY, width, height, glFormat, glType, image );
802
844
 
803
845
  }
804
846
 
@@ -806,6 +848,7 @@ class WebGLTextureUtils {
806
848
 
807
849
  }
808
850
 
851
+ // reset values
809
852
  gl.pixelStorei( gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );
810
853
  gl.pixelStorei( gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );
811
854
  gl.pixelStorei( gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );
@@ -813,12 +856,17 @@ class WebGLTextureUtils {
813
856
  gl.pixelStorei( gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );
814
857
 
815
858
  // Generate mipmaps only when copying level 0
816
- if ( level === 0 && dstTexture.generateMipmaps ) gl.generateMipmap( gl.TEXTURE_2D );
859
+ if ( dstLevel === 0 && dstTexture.generateMipmaps ) {
860
+
861
+ gl.generateMipmap( glTextureType );
862
+
863
+ }
817
864
 
818
865
  state.unbindTexture();
819
866
 
820
867
  }
821
868
 
869
+
822
870
  /**
823
871
  * Copies the current bound framebuffer to the given texture.
824
872
  *
@@ -45,7 +45,7 @@ class WebGLUtils {
45
45
  *
46
46
  * @param {number} p - The three.js constant.
47
47
  * @param {string} [colorSpace=NoColorSpace] - The color space.
48
- * @return {number} The corresponding WebGL constant.
48
+ * @return {?number} The corresponding WebGL constant.
49
49
  */
50
50
  convert( p, colorSpace = NoColorSpace ) {
51
51
 
@@ -25,22 +25,28 @@ import { warnOnce } from '../../utils.js';
25
25
  */
26
26
  class WebGPUBackend extends Backend {
27
27
 
28
+ /**
29
+ * WebGPUBackend options.
30
+ *
31
+ * @typedef {Object} WebGPUBackend~Options
32
+ * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
33
+ * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
34
+ * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
35
+ * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
36
+ * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
37
+ * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.
38
+ * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.
39
+ * @property {boolean} [trackTimestamp=false] - Whether to track timestamps with a Timestamp Query API or not.
40
+ * @property {string} [powerPreference=undefined] - The power preference.
41
+ * @property {Object} [requiredLimits=undefined] - Specifies the limits that are required by the device request. The request will fail if the adapter cannot provide these limits.
42
+ * @property {GPUDevice} [device=undefined] - If there is an existing GPU device on app level, it can be passed to the renderer as a parameter.
43
+ * @property {number} [outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead.
44
+ */
45
+
28
46
  /**
29
47
  * Constructs a new WebGPU backend.
30
48
  *
31
- * @param {Object} parameters - The configuration parameter.
32
- * @param {boolean} [parameters.logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
33
- * @param {boolean} [parameters.alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
34
- * @param {boolean} [parameters.depth=true] - Whether the default framebuffer should have a depth buffer or not.
35
- * @param {boolean} [parameters.stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
36
- * @param {boolean} [parameters.antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
37
- * @param {number} [parameters.samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.
38
- * @param {boolean} [parameters.forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.
39
- * @param {boolean} [parameters.trackTimestamp=false] - Whether to track timestamps with a Timestamp Query API or not.
40
- * @param {string} [parameters.powerPreference=undefined] - The power preference.
41
- * @param {Object} [parameters.requiredLimits=undefined] - Specifies the limits that are required by the device request. The request will fail if the adapter cannot provide these limits.
42
- * @param {GPUDevice} [parameters.device=undefined] - If there is an existing GPU device on app level, it can be passed to the renderer as a parameter.
43
- * @param {number} [parameters.outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead.
49
+ * @param {WebGPUBackend~Options} [parameters] - The configuration parameter.
44
50
  */
45
51
  constructor( parameters = {} ) {
46
52
 
@@ -60,14 +66,6 @@ class WebGPUBackend extends Backend {
60
66
 
61
67
  this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
62
68
 
63
- /**
64
- * Whether to track timestamps with a Timestamp Query API or not.
65
- *
66
- * @type {boolean}
67
- * @default false
68
- */
69
- this.trackTimestamp = ( parameters.trackTimestamp === true );
70
-
71
69
  /**
72
70
  * A reference to the device.
73
71
  *
@@ -363,10 +361,9 @@ class WebGPUBackend extends Backend {
363
361
  renderTargetData.width !== renderTarget.width ||
364
362
  renderTargetData.height !== renderTarget.height ||
365
363
  renderTargetData.dimensions !== renderTarget.dimensions ||
366
- renderTargetData.activeMipmapLevel !== renderTarget.activeMipmapLevel ||
364
+ renderTargetData.activeMipmapLevel !== renderContext.activeMipmapLevel ||
367
365
  renderTargetData.activeCubeFace !== renderContext.activeCubeFace ||
368
- renderTargetData.samples !== renderTarget.samples ||
369
- renderTargetData.loadOp !== colorAttachmentsConfig.loadOp
366
+ renderTargetData.samples !== renderTarget.samples
370
367
  ) {
371
368
 
372
369
  descriptors = {};
@@ -378,23 +375,25 @@ class WebGPUBackend extends Backend {
378
375
  const onDispose = () => {
379
376
 
380
377
  renderTarget.removeEventListener( 'dispose', onDispose );
381
-
382
378
  this.delete( renderTarget );
383
379
 
384
380
  };
385
381
 
386
- renderTarget.addEventListener( 'dispose', onDispose );
382
+ if ( renderTarget.hasEventListener( 'dispose', onDispose ) === false ) {
383
+
384
+ renderTarget.addEventListener( 'dispose', onDispose );
385
+
386
+ }
387
387
 
388
388
  }
389
389
 
390
390
  const cacheKey = renderContext.getCacheKey();
391
+ let descriptorBase = descriptors[ cacheKey ];
391
392
 
392
- let descriptor = descriptors[ cacheKey ];
393
-
394
- if ( descriptor === undefined ) {
393
+ if ( descriptorBase === undefined ) {
395
394
 
396
395
  const textures = renderContext.textures;
397
- const colorAttachments = [];
396
+ const textureViews = [];
398
397
 
399
398
  let sliceIndex;
400
399
 
@@ -442,44 +441,24 @@ class WebGPUBackend extends Backend {
442
441
 
443
442
  }
444
443
 
445
- // only apply the user-defined clearValue to the first color attachment like in beginRender()
446
-
447
- let clearValue = { r: 0, g: 0, b: 0, a: 1 };
448
-
449
- if ( i === 0 && colorAttachmentsConfig.clearValue ) {
450
-
451
- clearValue = colorAttachmentsConfig.clearValue;
452
-
453
- }
454
-
455
- colorAttachments.push( {
444
+ textureViews.push( {
456
445
  view,
457
- depthSlice: sliceIndex,
458
446
  resolveTarget,
459
- loadOp: colorAttachmentsConfig.loadOP || GPULoadOp.Load,
460
- storeOp: colorAttachmentsConfig.storeOP || GPUStoreOp.Store,
461
- clearValue: clearValue
447
+ depthSlice: sliceIndex
462
448
  } );
463
449
 
464
450
  }
465
451
 
466
-
467
- descriptor = {
468
- colorAttachments,
469
- };
452
+ descriptorBase = { textureViews };
470
453
 
471
454
  if ( renderContext.depth ) {
472
455
 
473
456
  const depthTextureData = this.get( renderContext.depthTexture );
474
-
475
- const depthStencilAttachment = {
476
- view: depthTextureData.texture.createView()
477
- };
478
- descriptor.depthStencilAttachment = depthStencilAttachment;
457
+ descriptorBase.depthStencilView = depthTextureData.texture.createView();
479
458
 
480
459
  }
481
460
 
482
- descriptors[ cacheKey ] = descriptor;
461
+ descriptors[ cacheKey ] = descriptorBase;
483
462
 
484
463
  renderTargetData.width = renderTarget.width;
485
464
  renderTargetData.height = renderTarget.height;
@@ -487,8 +466,41 @@ class WebGPUBackend extends Backend {
487
466
  renderTargetData.activeMipmapLevel = renderContext.activeMipmapLevel;
488
467
  renderTargetData.activeCubeFace = renderContext.activeCubeFace;
489
468
  renderTargetData.dimensions = renderTarget.dimensions;
490
- renderTargetData.depthSlice = sliceIndex;
491
- renderTargetData.loadOp = colorAttachments[ 0 ].loadOp;
469
+
470
+ }
471
+
472
+ const descriptor = {
473
+ colorAttachments: []
474
+ };
475
+
476
+ // Apply dynamic properties to cached views
477
+ for ( let i = 0; i < descriptorBase.textureViews.length; i ++ ) {
478
+
479
+ const viewInfo = descriptorBase.textureViews[ i ];
480
+
481
+ let clearValue = { r: 0, g: 0, b: 0, a: 1 };
482
+ if ( i === 0 && colorAttachmentsConfig.clearValue ) {
483
+
484
+ clearValue = colorAttachmentsConfig.clearValue;
485
+
486
+ }
487
+
488
+ descriptor.colorAttachments.push( {
489
+ view: viewInfo.view,
490
+ depthSlice: viewInfo.depthSlice,
491
+ resolveTarget: viewInfo.resolveTarget,
492
+ loadOp: colorAttachmentsConfig.loadOp || GPULoadOp.Load,
493
+ storeOp: colorAttachmentsConfig.storeOp || GPUStoreOp.Store,
494
+ clearValue: clearValue
495
+ } );
496
+
497
+ }
498
+
499
+ if ( descriptorBase.depthStencilView ) {
500
+
501
+ descriptor.depthStencilAttachment = {
502
+ view: descriptorBase.depthStencilView
503
+ };
492
504
 
493
505
  }
494
506
 
@@ -867,7 +879,6 @@ class WebGPUBackend extends Backend {
867
879
  const renderer = this.renderer;
868
880
 
869
881
  let colorAttachments = [];
870
-
871
882
  let depthStencilAttachment;
872
883
  let clearValue;
873
884
 
@@ -911,29 +922,35 @@ class WebGPUBackend extends Backend {
911
922
  supportsDepth = renderTargetContext.depth;
912
923
  supportsStencil = renderTargetContext.stencil;
913
924
 
914
- if ( color ) {
925
+ const clearConfig = {
926
+ loadOp: color ? GPULoadOp.Clear : GPULoadOp.Load,
927
+ clearValue: color ? clearValue : undefined
928
+ };
915
929
 
916
- const descriptor = this._getRenderPassDescriptor( renderTargetContext, { loadOp: GPULoadOp.Clear, clearValue } );
930
+ if ( supportsDepth ) {
917
931
 
918
- colorAttachments = descriptor.colorAttachments;
932
+ clearConfig.depthLoadOp = depth ? GPULoadOp.Clear : GPULoadOp.Load;
933
+ clearConfig.depthClearValue = depth ? renderer.getClearDepth() : undefined;
934
+ clearConfig.depthStoreOp = GPUStoreOp.Store;
919
935
 
920
936
  }
921
937
 
922
- if ( supportsDepth || supportsStencil ) {
923
-
924
- const depthTextureData = this.get( renderTargetContext.depthTexture );
938
+ if ( supportsStencil ) {
925
939
 
926
- depthStencilAttachment = {
927
- view: depthTextureData.texture.createView()
928
- };
940
+ clearConfig.stencilLoadOp = stencil ? GPULoadOp.Clear : GPULoadOp.Load;
941
+ clearConfig.stencilClearValue = stencil ? renderer.getClearStencil() : undefined;
942
+ clearConfig.stencilStoreOp = GPUStoreOp.Store;
929
943
 
930
944
  }
931
945
 
932
- }
946
+ const descriptor = this._getRenderPassDescriptor( renderTargetContext, clearConfig );
933
947
 
934
- //
948
+ colorAttachments = descriptor.colorAttachments;
949
+ depthStencilAttachment = descriptor.depthStencilAttachment;
950
+
951
+ }
935
952
 
936
- if ( supportsDepth ) {
953
+ if ( supportsDepth && depthStencilAttachment && depthStencilAttachment.depthLoadOp === undefined ) {
937
954
 
938
955
  if ( depth ) {
939
956
 
@@ -952,7 +969,7 @@ class WebGPUBackend extends Backend {
952
969
 
953
970
  //
954
971
 
955
- if ( supportsStencil ) {
972
+ if ( supportsStencil && depthStencilAttachment && depthStencilAttachment.stencilLoadOp === undefined ) {
956
973
 
957
974
  if ( stencil ) {
958
975
 
@@ -1865,38 +1882,56 @@ class WebGPUBackend extends Backend {
1865
1882
  *
1866
1883
  * @param {Texture} srcTexture - The source texture.
1867
1884
  * @param {Texture} dstTexture - The destination texture.
1868
- * @param {?Vector4} [srcRegion=null] - The region of the source texture to copy.
1885
+ * @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy.
1869
1886
  * @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy.
1870
- * @param {number} [level=0] - The mip level to copy.
1887
+ * @param {number} [srcLevel=0] - The mipmap level to copy.
1888
+ * @param {number} [dstLevel=0] - The destination mip level to copy to.
1871
1889
  */
1872
- copyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) {
1890
+ copyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {
1873
1891
 
1874
1892
  let dstX = 0;
1875
1893
  let dstY = 0;
1876
- let dstLayer = 0;
1894
+ let dstZ = 0;
1877
1895
 
1878
1896
  let srcX = 0;
1879
1897
  let srcY = 0;
1880
- let srcLayer = 0;
1898
+ let srcZ = 0;
1881
1899
 
1882
1900
  let srcWidth = srcTexture.image.width;
1883
1901
  let srcHeight = srcTexture.image.height;
1902
+ let srcDepth = 1;
1903
+
1884
1904
 
1885
1905
  if ( srcRegion !== null ) {
1886
1906
 
1887
- srcX = srcRegion.x;
1888
- srcY = srcRegion.y;
1889
- srcLayer = srcRegion.z || 0;
1890
- srcWidth = srcRegion.width;
1891
- srcHeight = srcRegion.height;
1907
+ if ( srcRegion.isBox3 === true ) {
1908
+
1909
+ srcX = srcRegion.min.x;
1910
+ srcY = srcRegion.min.y;
1911
+ srcZ = srcRegion.min.z;
1912
+ srcWidth = srcRegion.max.x - srcRegion.min.x;
1913
+ srcHeight = srcRegion.max.y - srcRegion.min.y;
1914
+ srcDepth = srcRegion.max.z - srcRegion.min.z;
1915
+
1916
+ } else {
1917
+
1918
+ // Assume it's a Box2
1919
+ srcX = srcRegion.min.x;
1920
+ srcY = srcRegion.min.y;
1921
+ srcWidth = srcRegion.max.x - srcRegion.min.x;
1922
+ srcHeight = srcRegion.max.y - srcRegion.min.y;
1923
+ srcDepth = 1;
1924
+
1925
+ }
1892
1926
 
1893
1927
  }
1894
1928
 
1929
+
1895
1930
  if ( dstPosition !== null ) {
1896
1931
 
1897
1932
  dstX = dstPosition.x;
1898
1933
  dstY = dstPosition.y;
1899
- dstLayer = dstPosition.z || 0;
1934
+ dstZ = dstPosition.z || 0;
1900
1935
 
1901
1936
  }
1902
1937
 
@@ -1908,23 +1943,29 @@ class WebGPUBackend extends Backend {
1908
1943
  encoder.copyTextureToTexture(
1909
1944
  {
1910
1945
  texture: sourceGPU,
1911
- mipLevel: level,
1912
- origin: { x: srcX, y: srcY, z: srcLayer }
1946
+ mipLevel: srcLevel,
1947
+ origin: { x: srcX, y: srcY, z: srcZ }
1913
1948
  },
1914
1949
  {
1915
1950
  texture: destinationGPU,
1916
- mipLevel: level,
1917
- origin: { x: dstX, y: dstY, z: dstLayer }
1951
+ mipLevel: dstLevel,
1952
+ origin: { x: dstX, y: dstY, z: dstZ }
1918
1953
  },
1919
1954
  [
1920
1955
  srcWidth,
1921
1956
  srcHeight,
1922
- 1
1957
+ srcDepth
1923
1958
  ]
1924
1959
  );
1925
1960
 
1926
1961
  this.device.queue.submit( [ encoder.finish() ] );
1927
1962
 
1963
+ if ( dstLevel === 0 && dstTexture.generateMipmaps ) {
1964
+
1965
+ this.textureUtils.generateMipmaps( dstTexture );
1966
+
1967
+ }
1968
+
1928
1969
  }
1929
1970
 
1930
1971
  /**
@@ -15,17 +15,7 @@ class WebGPURenderer extends Renderer {
15
15
  /**
16
16
  * Constructs a new WebGPU renderer.
17
17
  *
18
- * @param {Object} parameters - The configuration parameter.
19
- * @param {boolean} [parameters.logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
20
- * @param {boolean} [parameters.alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
21
- * @param {boolean} [parameters.depth=true] - Whether the default framebuffer should have a depth buffer or not.
22
- * @param {boolean} [parameters.stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
23
- * @param {boolean} [parameters.antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
24
- * @param {number} [parameters.samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.
25
- * @param {boolean} [parameters.forceWebGL=false] - If set to `true`, the renderer uses it WebGL 2 backend no matter if WebGPU is supported or not.
26
- * @param {number} [parameters.outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead.
27
- * @param {number} [parameters.colorBufferType=HalfFloatType] - Defines the type of color buffers. The default `HalfFloatType` is recommend for best
28
- * quality. To save memory and bandwidth, `UnsignedByteType` might be used. This will reduce rendering quality though.
18
+ * @param {WebGPURenderer~Options} [parameters] - The configuration parameter.
29
19
  */
30
20
  constructor( parameters = {} ) {
31
21
 
@@ -27,20 +27,26 @@ const debugHandler = {
27
27
  class WebGPURenderer extends Renderer {
28
28
 
29
29
  /**
30
- * Constructs a new WebGPU renderer.
30
+ * WebGPURenderer options.
31
31
  *
32
- * @param {Object} parameters - The configuration parameter.
33
- * @param {boolean} [parameters.logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
34
- * @param {boolean} [parameters.alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
35
- * @param {boolean} [parameters.depth=true] - Whether the default framebuffer should have a depth buffer or not.
36
- * @param {boolean} [parameters.stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
37
- * @param {boolean} [parameters.antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
38
- * @param {number} [parameters.samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.
39
- * @param {boolean} [parameters.forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.
40
- * @param {number} [parameters.outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead.
41
- * @param {number} [parameters.colorBufferType=HalfFloatType] - Defines the type of color buffers. The default `HalfFloatType` is recommend for best
32
+ * @typedef {Object} WebGPURenderer~Options
33
+ * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
34
+ * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
35
+ * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
36
+ * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
37
+ * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
38
+ * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.
39
+ * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.
40
+ * @property {number} [outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead.
41
+ * @property {number} [colorBufferType=HalfFloatType] - Defines the type of color buffers. The default `HalfFloatType` is recommend for best
42
42
  * quality. To save memory and bandwidth, `UnsignedByteType` might be used. This will reduce rendering quality though.
43
43
  */
44
+
45
+ /**
46
+ * Constructs a new WebGPU renderer.
47
+ *
48
+ * @param {WebGPURenderer~Options} [parameters] - The configuration parameter.
49
+ */
44
50
  constructor( parameters = {} ) {
45
51
 
46
52
  let BackendClass;