@plastic-software/three 0.174.0 → 0.175.1

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 (567) hide show
  1. package/build/three.cjs +10744 -1476
  2. package/build/three.core.js +9633 -1096
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +918 -189
  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 +1432 -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 +58 -1
  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/ShaderChunk/alphamap_fragment.glsl.js +10 -1
  512. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -1
  513. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +5 -1
  514. package/src/renderers/shaders/ShaderChunk/common.glsl.js +82 -0
  515. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +22 -2
  516. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +12 -1
  517. package/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js +8 -2
  518. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +31 -11
  519. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +5 -1
  520. package/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js +1 -1
  521. package/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js +1 -1
  522. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +2 -1
  523. package/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js +12 -1
  524. package/src/renderers/shaders/ShaderChunk/triplanar_fragment.glsl.js +20 -0
  525. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +52 -7
  526. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +25 -6
  527. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +19 -7
  528. package/src/renderers/shaders/ShaderChunk.js +2 -0
  529. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -0
  530. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -0
  531. package/src/renderers/shaders/UniformsLib.js +6 -5
  532. package/src/renderers/shaders/UniformsUtils.js +1 -3
  533. package/src/renderers/webgl/WebGLBackground.js +4 -2
  534. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  535. package/src/renderers/webgl/WebGLProgram.js +25 -5
  536. package/src/renderers/webgl/WebGLPrograms.js +21 -7
  537. package/src/renderers/webgl/WebGLState.js +9 -9
  538. package/src/renderers/webgl-fallback/WebGLBackend.js +25 -26
  539. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +3 -12
  540. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +67 -19
  541. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +1 -1
  542. package/src/renderers/webgpu/WebGPUBackend.js +128 -87
  543. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +1 -11
  544. package/src/renderers/webgpu/WebGPURenderer.js +17 -11
  545. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +4 -4
  546. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +5 -3
  547. package/src/renderers/webgpu/utils/WebGPUConstants.js +1 -1
  548. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +1 -1
  549. package/src/renderers/webxr/WebXRController.js +87 -2
  550. package/src/renderers/webxr/WebXRDepthSensing.js +49 -0
  551. package/src/renderers/webxr/WebXRManager.js +173 -1
  552. package/src/scenes/Scene.js +2 -1
  553. package/src/textures/CanvasTexture.js +28 -0
  554. package/src/textures/CompressedArrayTexture.js +57 -0
  555. package/src/textures/CompressedCubeTexture.js +29 -0
  556. package/src/textures/CompressedTexture.js +64 -6
  557. package/src/textures/CubeTexture.js +52 -4
  558. package/src/textures/Data3DTexture.js +77 -0
  559. package/src/textures/DataArrayTexture.js +93 -0
  560. package/src/textures/DataTexture.js +65 -0
  561. package/src/textures/DepthTexture.js +59 -9
  562. package/src/textures/FramebufferTexture.js +62 -0
  563. package/src/textures/Source.js +69 -0
  564. package/src/textures/Texture.js +5 -5
  565. package/src/textures/VideoFrameTexture.js +43 -6
  566. package/src/textures/VideoTexture.js +49 -4
  567. package/examples/jsm/geometries/ParametricGeometries.js +0 -254
@@ -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;
@@ -321,7 +321,7 @@ class WGSLNodeBuilder extends NodeBuilder {
321
321
  */
322
322
  generateWrapFunction( texture ) {
323
323
 
324
- const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }_${texture.isData3DTexture ? '3d' : '2d'}T`;
324
+ const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }_${ texture.isData3DTexture ? '3d' : '2d' }T`;
325
325
 
326
326
  let nodeCode = wgslCodeCache[ functionName ];
327
327
 
@@ -331,7 +331,7 @@ class WGSLNodeBuilder extends NodeBuilder {
331
331
 
332
332
  // For 3D textures, use vec3f; for texture arrays, keep vec2f since array index is separate
333
333
  const coordType = texture.isData3DTexture ? 'vec3f' : 'vec2f';
334
- let code = `fn ${functionName}( coord : ${coordType} ) -> ${coordType} {\n\n\treturn ${coordType}(\n`;
334
+ let code = `fn ${ functionName }( coord : ${ coordType } ) -> ${ coordType } {\n\n\treturn ${ coordType }(\n`;
335
335
 
336
336
  const addWrapSnippet = ( wrap, axis ) => {
337
337
 
@@ -403,7 +403,7 @@ class WGSLNodeBuilder extends NodeBuilder {
403
403
 
404
404
  /**
405
405
  * Generates a WGSL variable that holds the texture dimension of the given texture.
406
- * It also returns information about the the number of layers (elements) of an arrayed
406
+ * It also returns information about the number of layers (elements) of an arrayed
407
407
  * texture as well as the cube face count of cube textures.
408
408
  *
409
409
  * @param {Texture} texture - The texture to generate the function for.
@@ -516,7 +516,7 @@ class WGSLNodeBuilder extends NodeBuilder {
516
516
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
517
517
 
518
518
  const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
519
- const coordSnippet = `${vecType}<u32>(${wrapFunction}(${uvSnippet}) * ${vecType}<f32>(${textureDimension}))`;
519
+ const coordSnippet = `${ vecType }<u32>(${ wrapFunction }(${ uvSnippet }) * ${ vecType }<f32>(${ textureDimension }))`;
520
520
 
521
521
  return this.generateTextureLoad( texture, textureProperty, coordSnippet, depthSnippet, levelSnippet );
522
522
 
@@ -71,11 +71,11 @@ class WebGPUAttributeUtils {
71
71
  // patch for INT16 and UINT16
72
72
  if ( attribute.normalized === false ) {
73
73
 
74
- if ( array.constructor === Int16Array ) {
74
+ if ( array.constructor === Int16Array || array.constructor === Int8Array ) {
75
75
 
76
76
  array = new Int32Array( array );
77
77
 
78
- } else if ( array.constructor === Uint16Array ) {
78
+ } else if ( array.constructor === Uint16Array || array.constructor === Uint8Array ) {
79
79
 
80
80
  array = new Uint32Array( array );
81
81
 
@@ -202,9 +202,11 @@ class WebGPUAttributeUtils {
202
202
 
203
203
  }
204
204
 
205
+ const bufferOffset = dataOffset * ( isTypedArray ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
206
+
205
207
  device.queue.writeBuffer(
206
208
  buffer,
207
- 0,
209
+ bufferOffset,
208
210
  array,
209
211
  dataOffset,
210
212
  size
@@ -113,7 +113,7 @@ export const GPUTextureFormat = {
113
113
  // Packed 32-bit formats
114
114
  RGB9E5UFloat: 'rgb9e5ufloat',
115
115
  RGB10A2Unorm: 'rgb10a2unorm',
116
- RG11B10uFloat: 'rgb10a2unorm',
116
+ RG11B10UFloat: 'rgb10a2unorm',
117
117
 
118
118
  // 64-bit formats
119
119
 
@@ -877,7 +877,7 @@ class WebGPUTextureUtils {
877
877
  if ( format === GPUTextureFormat.BC1RGBAUnorm || format === GPUTextureFormat.BC1RGBAUnormSRGB ) return { byteLength: 8, width: 4, height: 4 }; // DXT1
878
878
  if ( format === GPUTextureFormat.BC2RGBAUnorm || format === GPUTextureFormat.BC2RGBAUnormSRGB ) return { byteLength: 16, width: 4, height: 4 }; // DXT3
879
879
  if ( format === GPUTextureFormat.BC3RGBAUnorm || format === GPUTextureFormat.BC3RGBAUnormSRGB ) return { byteLength: 16, width: 4, height: 4 }; // DXT5
880
- if ( format === GPUTextureFormat.BC4RUnorm || format === GPUTextureFormat.BC4RSNorm ) return { byteLength: 8, width: 4, height: 4 }; // RGTC1
880
+ if ( format === GPUTextureFormat.BC4RUnorm || format === GPUTextureFormat.BC4RSnorm ) return { byteLength: 8, width: 4, height: 4 }; // RGTC1
881
881
  if ( format === GPUTextureFormat.BC5RGUnorm || format === GPUTextureFormat.BC5RGSnorm ) return { byteLength: 16, width: 4, height: 4 }; // RGTC2
882
882
  if ( format === GPUTextureFormat.BC6HRGBUFloat || format === GPUTextureFormat.BC6HRGBFloat ) return { byteLength: 16, width: 4, height: 4 }; // BPTC (float)
883
883
  if ( format === GPUTextureFormat.BC7RGBAUnorm || format === GPUTextureFormat.BC7RGBAUnormSRGB ) return { byteLength: 16, width: 4, height: 4 }; // BPTC (unorm)
@@ -3,16 +3,56 @@ import { Group } from '../../objects/Group.js';
3
3
 
4
4
  const _moveEvent = { type: 'move' };
5
5
 
6
+ /**
7
+ * Class for representing a XR controller with its
8
+ * different coordinate systems.
9
+ *
10
+ * @private
11
+ */
6
12
  class WebXRController {
7
13
 
14
+ /**
15
+ * Constructs a new XR controller.
16
+ */
8
17
  constructor() {
9
18
 
19
+ /**
20
+ * A group representing the target ray space
21
+ * of the XR controller.
22
+ *
23
+ * @private
24
+ * @type {?Group}
25
+ * @default null
26
+ */
10
27
  this._targetRay = null;
28
+
29
+ /**
30
+ * A group representing the grip space
31
+ * of the XR controller.
32
+ *
33
+ * @private
34
+ * @type {?Group}
35
+ * @default null
36
+ */
11
37
  this._grip = null;
38
+
39
+ /**
40
+ * A group representing the hand space
41
+ * of the XR controller.
42
+ *
43
+ * @private
44
+ * @type {?Group}
45
+ * @default null
46
+ */
12
47
  this._hand = null;
13
48
 
14
49
  }
15
50
 
51
+ /**
52
+ * Returns a group representing the hand space of the XR controller.
53
+ *
54
+ * @return {Group} A group representing the hand space of the XR controller.
55
+ */
16
56
  getHandSpace() {
17
57
 
18
58
  if ( this._hand === null ) {
@@ -30,6 +70,11 @@ class WebXRController {
30
70
 
31
71
  }
32
72
 
73
+ /**
74
+ * Returns a group representing the target ray space of the XR controller.
75
+ *
76
+ * @return {Group} A group representing the target ray space of the XR controller.
77
+ */
33
78
  getTargetRaySpace() {
34
79
 
35
80
  if ( this._targetRay === null ) {
@@ -48,6 +93,11 @@ class WebXRController {
48
93
 
49
94
  }
50
95
 
96
+ /**
97
+ * Returns a group representing the grip space of the XR controller.
98
+ *
99
+ * @return {Group} A group representing the grip space of the XR controller.
100
+ */
51
101
  getGripSpace() {
52
102
 
53
103
  if ( this._grip === null ) {
@@ -66,6 +116,13 @@ class WebXRController {
66
116
 
67
117
  }
68
118
 
119
+ /**
120
+ * Dispatches the given event to the groups representing
121
+ * the different coordinate spaces of the XR controller.
122
+ *
123
+ * @param {Object} event - The event to dispatch.
124
+ * @return {WebXRController} A reference to this instance.
125
+ */
69
126
  dispatchEvent( event ) {
70
127
 
71
128
  if ( this._targetRay !== null ) {
@@ -90,6 +147,12 @@ class WebXRController {
90
147
 
91
148
  }
92
149
 
150
+ /**
151
+ * Connects the controller with the given XR input source.
152
+ *
153
+ * @param {XRInputSource} inputSource - The input source.
154
+ * @return {WebXRController} A reference to this instance.
155
+ */
93
156
  connect( inputSource ) {
94
157
 
95
158
  if ( inputSource && inputSource.hand ) {
@@ -115,6 +178,12 @@ class WebXRController {
115
178
 
116
179
  }
117
180
 
181
+ /**
182
+ * Disconnects the controller from the given XR input source.
183
+ *
184
+ * @param {XRInputSource} inputSource - The input source.
185
+ * @return {WebXRController} A reference to this instance.
186
+ */
118
187
  disconnect( inputSource ) {
119
188
 
120
189
  this.dispatchEvent( { type: 'disconnected', data: inputSource } );
@@ -141,6 +210,16 @@ class WebXRController {
141
210
 
142
211
  }
143
212
 
213
+ /**
214
+ * Updates the controller with the given input source, XR frame and reference space.
215
+ * This updates the transformations of the groups that represent the different
216
+ * coordinate systems of the controller.
217
+ *
218
+ * @param {XRInputSource} inputSource - The input source.
219
+ * @param {XRFrame} frame - The XR frame.
220
+ * @param {XRReferenceSpace} referenceSpace - The reference space.
221
+ * @return {WebXRController} A reference to this instance.
222
+ */
144
223
  update( inputSource, frame, referenceSpace ) {
145
224
 
146
225
  let inputPose = null;
@@ -318,8 +397,14 @@ class WebXRController {
318
397
 
319
398
  }
320
399
 
321
- // private method
322
-
400
+ /**
401
+ * Returns a group representing the hand joint for the given input joint.
402
+ *
403
+ * @private
404
+ * @param {Group} hand - The group representing the hand space.
405
+ * @param {XRHandJoint} inputjoint - The XR frame.
406
+ * @return {Group} A group representing the hand joint for the given input joint.
407
+ */
323
408
  _getHandJoint( hand, inputjoint ) {
324
409
 
325
410
  if ( hand.joints[ inputjoint.jointName ] === undefined ) {