@needle-tools/three 0.145.4 → 0.146.2

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 (393) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +32586 -35951
  3. package/build/three.js +32600 -35965
  4. package/build/three.min.js +6 -7
  5. package/build/three.module.js +1547 -1154
  6. package/examples/js/animation/AnimationClipCreator.js +0 -8
  7. package/examples/js/animation/CCDIKSolver.js +49 -66
  8. package/examples/js/animation/MMDAnimationHelper.js +66 -137
  9. package/examples/js/animation/MMDPhysics.js +70 -134
  10. package/examples/js/cameras/CinematicCamera.js +33 -22
  11. package/examples/js/controls/ArcballControls.js +138 -405
  12. package/examples/js/controls/DragControls.js +8 -33
  13. package/examples/js/controls/FirstPersonControls.js +32 -54
  14. package/examples/js/controls/FlyControls.js +29 -55
  15. package/examples/js/controls/OrbitControls.js +85 -95
  16. package/examples/js/controls/PointerLockControls.js +5 -14
  17. package/examples/js/controls/TrackballControls.js +33 -86
  18. package/examples/js/controls/TransformControls.js +84 -169
  19. package/examples/js/csm/CSM.js +4 -39
  20. package/examples/js/csm/CSMFrustum.js +3 -9
  21. package/examples/js/csm/CSMHelper.js +24 -4
  22. package/examples/js/csm/CSMShader.js +2 -6
  23. package/examples/js/curves/CurveExtras.js +27 -27
  24. package/examples/js/curves/NURBSCurve.js +4 -16
  25. package/examples/js/curves/NURBSSurface.js +3 -9
  26. package/examples/js/curves/NURBSUtils.js +8 -45
  27. package/examples/js/effects/AnaglyphEffect.js +4 -18
  28. package/examples/js/effects/AsciiEffect.js +32 -31
  29. package/examples/js/effects/OutlineEffect.js +26 -30
  30. package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
  31. package/examples/js/effects/PeppersGhostEffect.js +12 -39
  32. package/examples/js/effects/StereoEffect.js +0 -4
  33. package/examples/js/environments/RoomEnvironment.js +12 -10
  34. package/examples/js/exporters/ColladaExporter.js +48 -65
  35. package/examples/js/exporters/DRACOExporter.js +22 -22
  36. package/examples/js/exporters/EXRExporter.js +15 -18
  37. package/examples/js/exporters/GLTFExporter.js +143 -261
  38. package/examples/js/exporters/MMDExporter.js +5 -12
  39. package/examples/js/exporters/OBJExporter.js +42 -33
  40. package/examples/js/exporters/PLYExporter.js +38 -33
  41. package/examples/js/exporters/STLExporter.js +5 -7
  42. package/examples/js/exporters/USDZExporter.js +110 -25
  43. package/examples/js/geometries/BoxLineGeometry.js +0 -1
  44. package/examples/js/geometries/ConvexGeometry.js +11 -6
  45. package/examples/js/geometries/DecalGeometry.js +53 -20
  46. package/examples/js/geometries/LightningStrike.js +54 -67
  47. package/examples/js/geometries/ParametricGeometries.js +8 -7
  48. package/examples/js/geometries/ParametricGeometry.js +25 -12
  49. package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
  50. package/examples/js/geometries/TeapotGeometry.js +54 -50
  51. package/examples/js/geometries/TextGeometry.js +6 -4
  52. package/examples/js/helpers/LightProbeHelper.js +1 -2
  53. package/examples/js/helpers/OctreeHelper.js +22 -20
  54. package/examples/js/helpers/PositionalAudioHelper.js +8 -6
  55. package/examples/js/helpers/RectAreaLightHelper.js +6 -7
  56. package/examples/js/helpers/VertexNormalsHelper.js +15 -13
  57. package/examples/js/helpers/VertexTangentsHelper.js +15 -9
  58. package/examples/js/helpers/ViewHelper.js +31 -16
  59. package/examples/js/interactive/HTMLMesh.js +22 -33
  60. package/examples/js/interactive/InteractiveGroup.js +6 -12
  61. package/examples/js/interactive/SelectionBox.js +3 -70
  62. package/examples/js/interactive/SelectionHelper.js +0 -8
  63. package/examples/js/lights/LightProbeGenerator.js +32 -39
  64. package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
  65. package/examples/js/lines/LineGeometry.js +3 -5
  66. package/examples/js/lines/LineMaterial.js +4 -11
  67. package/examples/js/lines/LineSegments2.js +38 -89
  68. package/examples/js/lines/LineSegmentsGeometry.js +7 -28
  69. package/examples/js/lines/Wireframe.js +2 -7
  70. package/examples/js/lines/WireframeGeometry2.js +3 -1
  71. package/examples/js/loaders/3DMLoader.js +58 -155
  72. package/examples/js/loaders/3MFLoader.js +72 -106
  73. package/examples/js/loaders/AMFLoader.js +0 -25
  74. package/examples/js/loaders/BVHLoader.js +44 -43
  75. package/examples/js/loaders/BasisTextureLoader.js +16 -46
  76. package/examples/js/loaders/ColladaLoader.js +201 -359
  77. package/examples/js/loaders/DDSLoader.js +24 -25
  78. package/examples/js/loaders/DRACOLoader.js +29 -66
  79. package/examples/js/loaders/EXRLoader.js +67 -164
  80. package/examples/js/loaders/FBXLoader.js +286 -441
  81. package/examples/js/loaders/FontLoader.js +6 -15
  82. package/examples/js/loaders/GCodeLoader.js +15 -16
  83. package/examples/js/loaders/GLTFLoader.js +354 -405
  84. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
  85. package/examples/js/loaders/KMZLoader.js +3 -7
  86. package/examples/js/loaders/KTXLoader.js +12 -30
  87. package/examples/js/loaders/LDrawLoader.js +178 -289
  88. package/examples/js/loaders/LUT3dlLoader.js +7 -11
  89. package/examples/js/loaders/LUTCubeLoader.js +0 -8
  90. package/examples/js/loaders/LWOLoader.js +59 -124
  91. package/examples/js/loaders/LogLuvLoader.js +27 -77
  92. package/examples/js/loaders/LottieLoader.js +4 -4
  93. package/examples/js/loaders/MD2Loader.js +26 -27
  94. package/examples/js/loaders/MDDLoader.js +6 -10
  95. package/examples/js/loaders/MMDLoader.js +180 -189
  96. package/examples/js/loaders/MTLLoader.js +18 -47
  97. package/examples/js/loaders/MaterialXLoader.js +392 -0
  98. package/examples/js/loaders/NRRDLoader.js +44 -84
  99. package/examples/js/loaders/OBJLoader.js +50 -65
  100. package/examples/js/loaders/PCDLoader.js +34 -29
  101. package/examples/js/loaders/PDBLoader.js +17 -13
  102. package/examples/js/loaders/PLYLoader.js +9 -39
  103. package/examples/js/loaders/PRWMLoader.js +11 -22
  104. package/examples/js/loaders/PVRLoader.js +7 -16
  105. package/examples/js/loaders/RGBELoader.js +36 -61
  106. package/examples/js/loaders/RGBMLoader.js +26 -87
  107. package/examples/js/loaders/STLLoader.js +20 -27
  108. package/examples/js/loaders/SVGLoader.js +361 -233
  109. package/examples/js/loaders/TDSLoader.js +81 -118
  110. package/examples/js/loaders/TGALoader.js +39 -41
  111. package/examples/js/loaders/TIFFLoader.js +0 -1
  112. package/examples/js/loaders/TTFLoader.js +0 -8
  113. package/examples/js/loaders/TiltLoader.js +14 -15
  114. package/examples/js/loaders/VOXLoader.js +8 -16
  115. package/examples/js/loaders/VRMLLoader.js +243 -340
  116. package/examples/js/loaders/VTKLoader.js +101 -118
  117. package/examples/js/loaders/XYZLoader.js +2 -4
  118. package/examples/js/loaders/lwo/IFFParser.js +55 -136
  119. package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
  120. package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
  121. package/examples/js/materials/MeshGouraudMaterial.js +15 -13
  122. package/examples/js/math/Capsule.js +0 -17
  123. package/examples/js/math/ColorConverter.js +3 -3
  124. package/examples/js/math/ConvexHull.js +183 -139
  125. package/examples/js/math/ImprovedNoise.js +1 -1
  126. package/examples/js/math/Lut.js +8 -15
  127. package/examples/js/math/MeshSurfaceSampler.js +6 -28
  128. package/examples/js/math/OBB.js +90 -49
  129. package/examples/js/math/Octree.js +2 -57
  130. package/examples/js/math/SimplexNoise.js +74 -88
  131. package/examples/js/misc/ConvexObjectBreaker.js +37 -48
  132. package/examples/js/misc/GPUComputationRenderer.js +14 -18
  133. package/examples/js/misc/Gyroscope.js +5 -9
  134. package/examples/js/misc/MD2Character.js +14 -23
  135. package/examples/js/misc/MD2CharacterComplex.js +73 -54
  136. package/examples/js/misc/MorphAnimMesh.js +0 -6
  137. package/examples/js/misc/MorphBlendMesh.js +3 -30
  138. package/examples/js/misc/ProgressiveLightMap.js +47 -43
  139. package/examples/js/misc/RollerCoaster.js +17 -24
  140. package/examples/js/misc/TubePainter.js +18 -12
  141. package/examples/js/misc/Volume.js +16 -45
  142. package/examples/js/misc/VolumeSlice.js +14 -24
  143. package/examples/js/modifiers/CurveModifier.js +19 -21
  144. package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
  145. package/examples/js/modifiers/SimplifyModifier.js +56 -59
  146. package/examples/js/modifiers/TessellateModifier.js +2 -9
  147. package/examples/js/objects/GroundProjectedEnv.js +2 -14
  148. package/examples/js/objects/Lensflare.js +47 -38
  149. package/examples/js/objects/LightningStorm.js +10 -13
  150. package/examples/js/objects/MarchingCubes.js +80 -59
  151. package/examples/js/objects/Reflector.js +22 -20
  152. package/examples/js/objects/ReflectorForSSRPass.js +19 -23
  153. package/examples/js/objects/Refractor.js +52 -30
  154. package/examples/js/objects/ShadowMesh.js +1 -2
  155. package/examples/js/objects/Sky.js +2 -7
  156. package/examples/js/objects/Water.js +23 -18
  157. package/examples/js/objects/Water2.js +20 -19
  158. package/examples/js/physics/AmmoPhysics.js +23 -20
  159. package/examples/js/physics/OimoPhysics.js +19 -17
  160. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
  161. package/examples/js/postprocessing/AfterimagePass.js +19 -12
  162. package/examples/js/postprocessing/BloomPass.js +38 -17
  163. package/examples/js/postprocessing/BokehPass.js +29 -12
  164. package/examples/js/postprocessing/ClearPass.js +1 -6
  165. package/examples/js/postprocessing/CubeTexturePass.js +12 -9
  166. package/examples/js/postprocessing/DotScreenPass.js +7 -5
  167. package/examples/js/postprocessing/EffectComposer.js +25 -32
  168. package/examples/js/postprocessing/FilmPass.js +7 -5
  169. package/examples/js/postprocessing/GlitchPass.js +10 -11
  170. package/examples/js/postprocessing/HalftonePass.js +9 -9
  171. package/examples/js/postprocessing/LUTPass.js +2 -15
  172. package/examples/js/postprocessing/MaskPass.js +20 -17
  173. package/examples/js/postprocessing/OutlinePass.js +45 -36
  174. package/examples/js/postprocessing/Pass.js +11 -14
  175. package/examples/js/postprocessing/RenderPass.js +3 -7
  176. package/examples/js/postprocessing/SAOPass.js +40 -32
  177. package/examples/js/postprocessing/SMAAPass.js +34 -17
  178. package/examples/js/postprocessing/SSAARenderPass.js +14 -14
  179. package/examples/js/postprocessing/SSAOPass.js +56 -42
  180. package/examples/js/postprocessing/SSRPass.js +78 -61
  181. package/examples/js/postprocessing/SavePass.js +14 -6
  182. package/examples/js/postprocessing/ShaderPass.js +9 -8
  183. package/examples/js/postprocessing/TAARenderPass.js +11 -9
  184. package/examples/js/postprocessing/TexturePass.js +7 -4
  185. package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
  186. package/examples/js/renderers/CSS2DRenderer.js +2 -21
  187. package/examples/js/renderers/CSS3DRenderer.js +3 -24
  188. package/examples/js/renderers/Projector.js +29 -85
  189. package/examples/js/renderers/SVGRenderer.js +4 -50
  190. package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
  191. package/examples/js/shaders/AfterimageShader.js +3 -6
  192. package/examples/js/shaders/BasicShader.js +3 -6
  193. package/examples/js/shaders/BleachBypassShader.js +3 -6
  194. package/examples/js/shaders/BlendShader.js +3 -6
  195. package/examples/js/shaders/BokehShader.js +3 -6
  196. package/examples/js/shaders/BokehShader2.js +4 -13
  197. package/examples/js/shaders/BrightnessContrastShader.js +3 -6
  198. package/examples/js/shaders/ColorCorrectionShader.js +2 -6
  199. package/examples/js/shaders/ColorifyShader.js +2 -6
  200. package/examples/js/shaders/ConvolutionShader.js +5 -10
  201. package/examples/js/shaders/CopyShader.js +3 -6
  202. package/examples/js/shaders/DOFMipMapShader.js +3 -6
  203. package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
  204. package/examples/js/shaders/DigitalGlitch.js +3 -6
  205. package/examples/js/shaders/DotScreenShader.js +2 -6
  206. package/examples/js/shaders/FXAAShader.js +1 -3
  207. package/examples/js/shaders/FilmShader.js +3 -6
  208. package/examples/js/shaders/FocusShader.js +3 -6
  209. package/examples/js/shaders/FreiChenShader.js +2 -6
  210. package/examples/js/shaders/GammaCorrectionShader.js +3 -6
  211. package/examples/js/shaders/GodRaysShader.js +11 -24
  212. package/examples/js/shaders/HalftoneShader.js +3 -6
  213. package/examples/js/shaders/HorizontalBlurShader.js +3 -6
  214. package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
  215. package/examples/js/shaders/HueSaturationShader.js +3 -6
  216. package/examples/js/shaders/KaleidoShader.js +3 -6
  217. package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
  218. package/examples/js/shaders/LuminosityShader.js +3 -6
  219. package/examples/js/shaders/MMDToonShader.js +2 -6
  220. package/examples/js/shaders/MirrorShader.js +3 -6
  221. package/examples/js/shaders/NormalMapShader.js +2 -6
  222. package/examples/js/shaders/RGBShiftShader.js +3 -6
  223. package/examples/js/shaders/SAOShader.js +2 -6
  224. package/examples/js/shaders/SMAAShader.js +6 -18
  225. package/examples/js/shaders/SSAOShader.js +2 -6
  226. package/examples/js/shaders/SSRShader.js +6 -18
  227. package/examples/js/shaders/SepiaShader.js +3 -6
  228. package/examples/js/shaders/SobelOperatorShader.js +2 -6
  229. package/examples/js/shaders/TechnicolorShader.js +3 -6
  230. package/examples/js/shaders/ToneMapShader.js +3 -6
  231. package/examples/js/shaders/ToonShader.js +8 -24
  232. package/examples/js/shaders/TriangleBlurShader.js +2 -6
  233. package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
  234. package/examples/js/shaders/VelocityShader.js +126 -0
  235. package/examples/js/shaders/VerticalBlurShader.js +3 -6
  236. package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
  237. package/examples/js/shaders/VignetteShader.js +3 -6
  238. package/examples/js/shaders/VolumeShader.js +2 -6
  239. package/examples/js/shaders/WaterRefractionShader.js +2 -6
  240. package/examples/js/textures/FlakesTexture.js +0 -1
  241. package/examples/js/utils/BufferGeometryUtils.js +234 -168
  242. package/examples/js/utils/CameraUtils.js +5 -20
  243. package/examples/js/utils/GPUStatsPanel.js +3 -12
  244. package/examples/js/utils/GeometryCompressionUtils.js +19 -44
  245. package/examples/js/utils/GeometryUtils.js +13 -18
  246. package/examples/js/utils/LDrawUtils.js +8 -11
  247. package/examples/js/utils/PackedPhongMaterial.js +6 -4
  248. package/examples/js/utils/SceneUtils.js +117 -6
  249. package/examples/js/utils/ShadowMapViewer.js +17 -14
  250. package/examples/js/utils/SkeletonUtils.js +13 -27
  251. package/examples/js/utils/UVsDebug.js +20 -12
  252. package/examples/js/utils/WorkerPool.js +1 -11
  253. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  254. package/examples/jsm/capabilities/WebGPU.js +3 -1
  255. package/examples/jsm/controls/OrbitControls.js +44 -4
  256. package/examples/jsm/exporters/GLTFExporter.js +17 -131
  257. package/examples/jsm/exporters/USDZExporter.js +75 -19
  258. package/examples/jsm/interactive/HTMLMesh.js +2 -0
  259. package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
  260. package/examples/jsm/loaders/3DMLoader.js +1 -2
  261. package/examples/jsm/loaders/ColladaLoader.js +28 -0
  262. package/examples/jsm/loaders/FBXLoader.js +16 -2
  263. package/examples/jsm/loaders/GLTFLoader.js +204 -377
  264. package/examples/jsm/loaders/KTX2Loader.js +68 -29
  265. package/examples/jsm/loaders/LDrawLoader.js +14 -13
  266. package/examples/jsm/loaders/LottieLoader.js +4 -2
  267. package/examples/jsm/loaders/MaterialXLoader.js +728 -0
  268. package/examples/jsm/loaders/PCDLoader.js +1 -1
  269. package/examples/jsm/loaders/PLYLoader.js +68 -16
  270. package/examples/jsm/loaders/SVGLoader.js +227 -14
  271. package/examples/jsm/loaders/USDZLoader.js +31 -16
  272. package/examples/jsm/nodes/Nodes.js +14 -2
  273. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  274. package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
  275. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  276. package/examples/jsm/nodes/accessors/SkinningNode.js +1 -1
  277. package/examples/jsm/nodes/core/Node.js +1 -1
  278. package/examples/jsm/nodes/core/NodeBuilder.js +36 -4
  279. package/examples/jsm/nodes/core/NodeFrame.js +2 -2
  280. package/examples/jsm/nodes/core/NodeVarying.js +7 -4
  281. package/examples/jsm/nodes/core/VaryingNode.js +6 -4
  282. package/examples/jsm/nodes/core/constants.js +13 -13
  283. package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
  284. package/examples/jsm/nodes/display/ViewportNode.js +106 -0
  285. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  286. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  287. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
  288. package/examples/jsm/nodes/materials/Materials.js +9 -7
  289. package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
  290. package/examples/jsm/nodes/materialx/MaterialXNodes.js +6 -2
  291. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
  292. package/examples/jsm/nodes/math/MathNode.js +5 -0
  293. package/examples/jsm/nodes/math/OperatorNode.js +6 -1
  294. package/examples/jsm/nodes/shadernode/ShaderNode.js +26 -13
  295. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +2 -0
  296. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +18 -0
  297. package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
  298. package/examples/jsm/nodes/utils/JoinNode.js +8 -2
  299. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
  300. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  301. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
  302. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  303. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
  304. package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
  305. package/examples/jsm/postprocessing/BloomPass.js +22 -3
  306. package/examples/jsm/postprocessing/BokehPass.js +18 -4
  307. package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
  308. package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
  309. package/examples/jsm/postprocessing/EffectComposer.js +9 -0
  310. package/examples/jsm/postprocessing/FilmPass.js +8 -0
  311. package/examples/jsm/postprocessing/GlitchPass.js +13 -1
  312. package/examples/jsm/postprocessing/HalftonePass.js +8 -0
  313. package/examples/jsm/postprocessing/OutlinePass.js +10 -0
  314. package/examples/jsm/postprocessing/Pass.js +2 -0
  315. package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
  316. package/examples/jsm/postprocessing/SAOPass.js +20 -0
  317. package/examples/jsm/postprocessing/SMAAPass.js +16 -0
  318. package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
  319. package/examples/jsm/postprocessing/SavePass.js +17 -1
  320. package/examples/jsm/postprocessing/ShaderPass.js +8 -0
  321. package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
  322. package/examples/jsm/postprocessing/TexturePass.js +8 -0
  323. package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
  324. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +39 -16
  325. package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
  326. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
  327. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
  328. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
  329. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +35 -5
  330. package/examples/jsm/shaders/MMDToonShader.js +0 -2
  331. package/examples/jsm/shaders/VelocityShader.js +128 -0
  332. package/examples/jsm/utils/BufferGeometryUtils.js +130 -6
  333. package/examples/jsm/utils/SceneUtils.js +129 -4
  334. package/examples/jsm/utils/TextureUtils.js +85 -0
  335. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  336. package/examples/jsm/webxr/XRHandMeshModel.js +6 -3
  337. package/package.json +11 -12
  338. package/src/Three.js +1 -0
  339. package/src/audio/AudioContext.js +5 -5
  340. package/src/cameras/CubeCamera.js +14 -14
  341. package/src/constants.js +1 -1
  342. package/src/core/InstancedBufferGeometry.js +1 -7
  343. package/src/extras/Earcut.js +67 -67
  344. package/src/helpers/DirectionalLightHelper.js +5 -1
  345. package/src/helpers/HemisphereLightHelper.js +4 -1
  346. package/src/helpers/PointLightHelper.js +2 -1
  347. package/src/helpers/SpotLightHelper.js +4 -2
  348. package/src/lights/PointLight.js +2 -2
  349. package/src/lights/SpotLight.js +2 -2
  350. package/src/loaders/FileLoader.js +4 -1
  351. package/src/loaders/ObjectLoader.js +5 -1
  352. package/src/materials/Material.js +1 -1
  353. package/src/math/Color.js +5 -5
  354. package/src/math/Matrix3.js +53 -18
  355. package/src/math/Ray.js +2 -5
  356. package/src/math/Sphere.js +19 -26
  357. package/src/objects/InstancedMesh.js +7 -0
  358. package/src/objects/LOD.js +25 -6
  359. package/src/renderers/WebGL3DRenderTarget.js +1 -1
  360. package/src/renderers/WebGLArrayRenderTarget.js +1 -1
  361. package/src/renderers/WebGLCubeRenderTarget.js +1 -1
  362. package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
  363. package/src/renderers/WebGLRenderTarget.js +1 -1
  364. package/src/renderers/WebGLRenderer.js +36 -62
  365. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
  367. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
  369. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
  370. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
  371. package/src/renderers/shaders/ShaderChunk.js +3 -0
  372. package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
  373. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
  374. package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
  375. package/src/renderers/shaders/ShaderLib.js +20 -6
  376. package/src/renderers/shaders/UniformsLib.js +1 -1
  377. package/src/renderers/shaders/UniformsUtils.js +15 -0
  378. package/src/renderers/webgl/WebGLAttributes.js +2 -0
  379. package/src/renderers/webgl/WebGLBackground.js +15 -7
  380. package/src/renderers/webgl/WebGLLights.js +0 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +2 -1
  382. package/src/renderers/webgl/WebGLShadowMap.js +3 -1
  383. package/src/renderers/webgl/WebGLState.js +31 -1
  384. package/src/renderers/webgl/WebGLTextures.js +71 -18
  385. package/src/renderers/webgl/WebGLUniforms.js +116 -20
  386. package/src/renderers/webgl/WebGLUtils.js +1 -1
  387. package/src/renderers/webxr/WebXRController.js +46 -13
  388. package/src/renderers/webxr/WebXRManager.js +85 -3
  389. package/src/scenes/Scene.js +8 -0
  390. package/src/textures/CompressedArrayTexture.js +18 -0
  391. package/examples/js/libs/lottie_canvas.js +0 -12751
  392. package/examples/js/shaders/PixelShader.js +0 -51
  393. package/examples/jsm/shaders/PixelShader.js +0 -44
@@ -0,0 +1,234 @@
1
+ import {
2
+ WebGLRenderTarget,
3
+ MeshNormalMaterial,
4
+ ShaderMaterial,
5
+ Vector2,
6
+ Vector4,
7
+ DepthTexture,
8
+ NearestFilter
9
+ } from 'three';
10
+ import { Pass, FullScreenQuad } from './Pass.js';
11
+
12
+ class RenderPixelatedPass extends Pass {
13
+
14
+ constructor( pixelSize, scene, camera, options = {} ) {
15
+
16
+ super();
17
+
18
+ this.pixelSize = pixelSize;
19
+ this.resolution = new Vector2();
20
+ this.renderResolution = new Vector2();
21
+
22
+ this.pixelatedMaterial = this.createPixelatedMaterial();
23
+ this.normalMaterial = new MeshNormalMaterial();
24
+
25
+ this.fsQuad = new FullScreenQuad( this.pixelatedMaterial );
26
+ this.scene = scene;
27
+ this.camera = camera;
28
+
29
+ this.normalEdgeStrength = options.normalEdgeStrength || 0.3;
30
+ this.depthEdgeStrength = options.depthEdgeStrength || 0.4;
31
+
32
+ this.beautyRenderTarget = new WebGLRenderTarget();
33
+ this.beautyRenderTarget.texture.minFilter = NearestFilter;
34
+ this.beautyRenderTarget.texture.magFilter = NearestFilter;
35
+ this.beautyRenderTarget.depthTexture = new DepthTexture();
36
+
37
+ this.normalRenderTarget = new WebGLRenderTarget();
38
+ this.normalRenderTarget.texture.minFilter = NearestFilter;
39
+ this.normalRenderTarget.texture.magFilter = NearestFilter;
40
+
41
+
42
+
43
+ }
44
+
45
+ dispose() {
46
+
47
+ this.beautyRenderTarget.dispose();
48
+ this.normalRenderTarget.dispose();
49
+
50
+ this.pixelatedMaterial.dispose();
51
+ this.normalMaterial.dispose();
52
+
53
+ this.fsQuad.dispose();
54
+
55
+ }
56
+
57
+ setSize( width, height ) {
58
+
59
+ this.resolution.set( width, height );
60
+ this.renderResolution.set( ( width / this.pixelSize ) | 0, ( height / this.pixelSize ) | 0 );
61
+ const { x, y } = this.renderResolution;
62
+ this.beautyRenderTarget.setSize( x, y );
63
+ this.normalRenderTarget.setSize( x, y );
64
+ this.fsQuad.material.uniforms.resolution.value.set( x, y, 1 / x, 1 / y );
65
+
66
+ }
67
+
68
+ setPixelSize( pixelSize ) {
69
+
70
+ this.pixelSize = pixelSize;
71
+ this.setSize( this.resolution.x, this.resolution.y );
72
+
73
+ }
74
+
75
+ render( renderer, writeBuffer ) {
76
+
77
+ const uniforms = this.fsQuad.material.uniforms;
78
+ uniforms.normalEdgeStrength.value = this.normalEdgeStrength;
79
+ uniforms.depthEdgeStrength.value = this.depthEdgeStrength;
80
+
81
+ renderer.setRenderTarget( this.beautyRenderTarget );
82
+ renderer.render( this.scene, this.camera );
83
+
84
+ const overrideMaterial_old = this.scene.overrideMaterial;
85
+ renderer.setRenderTarget( this.normalRenderTarget );
86
+ this.scene.overrideMaterial = this.normalMaterial;
87
+ renderer.render( this.scene, this.camera );
88
+ this.scene.overrideMaterial = overrideMaterial_old;
89
+
90
+ uniforms.tDiffuse.value = this.beautyRenderTarget.texture;
91
+ uniforms.tDepth.value = this.beautyRenderTarget.depthTexture;
92
+ uniforms.tNormal.value = this.normalRenderTarget.texture;
93
+
94
+ if ( this.renderToScreen ) {
95
+
96
+ renderer.setRenderTarget( null );
97
+
98
+ } else {
99
+
100
+ renderer.setRenderTarget( writeBuffer );
101
+
102
+ if ( this.clear ) renderer.clear();
103
+
104
+ }
105
+
106
+ this.fsQuad.render( renderer );
107
+
108
+ }
109
+
110
+ createPixelatedMaterial() {
111
+
112
+ return new ShaderMaterial( {
113
+ uniforms: {
114
+ tDiffuse: { value: null },
115
+ tDepth: { value: null },
116
+ tNormal: { value: null },
117
+ resolution: {
118
+ value: new Vector4(
119
+ this.renderResolution.x,
120
+ this.renderResolution.y,
121
+ 1 / this.renderResolution.x,
122
+ 1 / this.renderResolution.y,
123
+ )
124
+ },
125
+ normalEdgeStrength: { value: 0 },
126
+ depthEdgeStrength: { value: 0 }
127
+ },
128
+ vertexShader: /* glsl */`
129
+ varying vec2 vUv;
130
+
131
+ void main() {
132
+
133
+ vUv = uv;
134
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
135
+
136
+ }
137
+ `,
138
+ fragmentShader: /* glsl */`
139
+ uniform sampler2D tDiffuse;
140
+ uniform sampler2D tDepth;
141
+ uniform sampler2D tNormal;
142
+ uniform vec4 resolution;
143
+ uniform float normalEdgeStrength;
144
+ uniform float depthEdgeStrength;
145
+ varying vec2 vUv;
146
+
147
+ float getDepth(int x, int y) {
148
+
149
+ return texture2D( tDepth, vUv + vec2(x, y) * resolution.zw ).r;
150
+
151
+ }
152
+
153
+ vec3 getNormal(int x, int y) {
154
+
155
+ return texture2D( tNormal, vUv + vec2(x, y) * resolution.zw ).rgb * 2.0 - 1.0;
156
+
157
+ }
158
+
159
+ float depthEdgeIndicator(float depth, vec3 normal) {
160
+
161
+ float diff = 0.0;
162
+ diff += clamp(getDepth(1, 0) - depth, 0.0, 1.0);
163
+ diff += clamp(getDepth(-1, 0) - depth, 0.0, 1.0);
164
+ diff += clamp(getDepth(0, 1) - depth, 0.0, 1.0);
165
+ diff += clamp(getDepth(0, -1) - depth, 0.0, 1.0);
166
+ return floor(smoothstep(0.01, 0.02, diff) * 2.) / 2.;
167
+
168
+ }
169
+
170
+ float neighborNormalEdgeIndicator(int x, int y, float depth, vec3 normal) {
171
+
172
+ float depthDiff = getDepth(x, y) - depth;
173
+ vec3 neighborNormal = getNormal(x, y);
174
+
175
+ // Edge pixels should yield to faces who's normals are closer to the bias normal.
176
+ vec3 normalEdgeBias = vec3(1., 1., 1.); // This should probably be a parameter.
177
+ float normalDiff = dot(normal - neighborNormal, normalEdgeBias);
178
+ float normalIndicator = clamp(smoothstep(-.01, .01, normalDiff), 0.0, 1.0);
179
+
180
+ // Only the shallower pixel should detect the normal edge.
181
+ float depthIndicator = clamp(sign(depthDiff * .25 + .0025), 0.0, 1.0);
182
+
183
+ return (1.0 - dot(normal, neighborNormal)) * depthIndicator * normalIndicator;
184
+
185
+ }
186
+
187
+ float normalEdgeIndicator(float depth, vec3 normal) {
188
+
189
+ float indicator = 0.0;
190
+
191
+ indicator += neighborNormalEdgeIndicator(0, -1, depth, normal);
192
+ indicator += neighborNormalEdgeIndicator(0, 1, depth, normal);
193
+ indicator += neighborNormalEdgeIndicator(-1, 0, depth, normal);
194
+ indicator += neighborNormalEdgeIndicator(1, 0, depth, normal);
195
+
196
+ return step(0.1, indicator);
197
+
198
+ }
199
+
200
+ void main() {
201
+
202
+ vec4 texel = texture2D( tDiffuse, vUv );
203
+
204
+ float depth = 0.0;
205
+ vec3 normal = vec3(0.0);
206
+
207
+ if (depthEdgeStrength > 0.0 || normalEdgeStrength > 0.0) {
208
+
209
+ depth = getDepth(0, 0);
210
+ normal = getNormal(0, 0);
211
+
212
+ }
213
+
214
+ float dei = 0.0;
215
+ if (depthEdgeStrength > 0.0)
216
+ dei = depthEdgeIndicator(depth, normal);
217
+
218
+ float nei = 0.0;
219
+ if (normalEdgeStrength > 0.0)
220
+ nei = normalEdgeIndicator(depth, normal);
221
+
222
+ float Strength = dei > 0.0 ? (1.0 - depthEdgeStrength * dei) : (1.0 + normalEdgeStrength * nei);
223
+
224
+ gl_FragColor = texel * Strength;
225
+
226
+ }
227
+ `
228
+ } );
229
+
230
+ }
231
+
232
+ }
233
+
234
+ export { RenderPixelatedPass };
@@ -400,6 +400,26 @@ class SAOPass extends Pass {
400
400
 
401
401
  }
402
402
 
403
+ dispose() {
404
+
405
+ this.saoRenderTarget.dispose();
406
+ this.blurIntermediateRenderTarget.dispose();
407
+ this.beautyRenderTarget.dispose();
408
+ this.normalRenderTarget.dispose();
409
+ this.depthRenderTarget.dispose();
410
+
411
+ this.depthMaterial.dispose();
412
+ this.normalMaterial.dispose();
413
+ this.saoMaterial.dispose();
414
+ this.vBlurMaterial.dispose();
415
+ this.hBlurMaterial.dispose();
416
+ this.materialCopy.dispose();
417
+ this.depthCopy.dispose();
418
+
419
+ this.fsQuad.dispose();
420
+
421
+ }
422
+
403
423
  }
404
424
 
405
425
  SAOPass.OUTPUT = {
@@ -183,6 +183,22 @@ class SMAAPass extends Pass {
183
183
 
184
184
  }
185
185
 
186
+ dispose() {
187
+
188
+ this.edgesRT.dispose();
189
+ this.weightsRT.dispose();
190
+
191
+ this.areaTexture.dispose();
192
+ this.searchTexture.dispose();
193
+
194
+ this.materialEdges.dispose();
195
+ this.materialWeights.dispose();
196
+ this.materialBlend.dispose();
197
+
198
+ this.fsQuad.dispose();
199
+
200
+ }
201
+
186
202
  }
187
203
 
188
204
  export { SMAAPass };
@@ -63,6 +63,10 @@ class SSAARenderPass extends Pass {
63
63
 
64
64
  }
65
65
 
66
+ this.copyMaterial.dispose();
67
+
68
+ this.fsQuad.dispose();
69
+
66
70
  }
67
71
 
68
72
  setSize( width, height ) {
@@ -32,7 +32,7 @@ class SavePass extends Pass {
32
32
 
33
33
  if ( this.renderTarget === undefined ) {
34
34
 
35
- this.renderTarget = new WebGLRenderTarget( window.innerWidth, window.innerHeight );
35
+ this.renderTarget = new WebGLRenderTarget(); // will be resized later
36
36
  this.renderTarget.texture.name = 'SavePass.rt';
37
37
 
38
38
  }
@@ -57,6 +57,22 @@ class SavePass extends Pass {
57
57
 
58
58
  }
59
59
 
60
+ setSize( width, height ) {
61
+
62
+ this.renderTarget.setSize( width, height );
63
+
64
+ }
65
+
66
+ dispose() {
67
+
68
+ this.renderTarget.dispose();
69
+
70
+ this.material.dispose();
71
+
72
+ this.fsQuad.dispose();
73
+
74
+ }
75
+
60
76
  }
61
77
 
62
78
  export { SavePass };
@@ -63,6 +63,14 @@ class ShaderPass extends Pass {
63
63
 
64
64
  }
65
65
 
66
+ dispose() {
67
+
68
+ this.material.dispose();
69
+
70
+ this.fsQuad.dispose();
71
+
72
+ }
73
+
66
74
  }
67
75
 
68
76
  export { ShaderPass };
@@ -130,6 +130,15 @@ class TAARenderPass extends SSAARenderPass {
130
130
 
131
131
  }
132
132
 
133
+ dispose() {
134
+
135
+ super.dispose();
136
+
137
+ if ( this.sampleRenderTarget !== undefined ) this.sampleRenderTarget.dispose();
138
+ if ( this.holdRenderTarget !== undefined ) this.holdRenderTarget.dispose();
139
+
140
+ }
141
+
133
142
  }
134
143
 
135
144
  const _JitterVectors = [
@@ -55,6 +55,14 @@ class TexturePass extends Pass {
55
55
 
56
56
  }
57
57
 
58
+ dispose() {
59
+
60
+ this.material.dispose();
61
+
62
+ this.fsQuad.dispose();
63
+
64
+ }
65
+
58
66
  }
59
67
 
60
68
  export { TexturePass };
@@ -170,6 +170,22 @@ class UnrealBloomPass extends Pass {
170
170
 
171
171
  this.renderTargetBright.dispose();
172
172
 
173
+ //
174
+
175
+ for ( let i = 0; i < this.separableBlurMaterials.length; i ++ ) {
176
+
177
+ this.separableBlurMaterials[ i ].dispose();
178
+
179
+ }
180
+
181
+ this.compositeMaterial.dispose();
182
+ this.materialCopy.dispose();
183
+ this.basic.dispose();
184
+
185
+ //
186
+
187
+ this.fsQuad.dispose();
188
+
173
189
  }
174
190
 
175
191
  setSize( width, height ) {
@@ -1,7 +1,6 @@
1
1
  import { defaultShaderStages, NodeFrame, MathNode, GLSLNodeParser, NodeBuilder } from 'three/nodes';
2
2
  import SlotNode from './SlotNode.js';
3
- import { PerspectiveCamera, ShaderChunk, ShaderLib, UniformsUtils, UniformsLib,
4
- LinearEncoding, RGBAFormat, UnsignedByteType, sRGBEncoding } from 'three';
3
+ import { PerspectiveCamera, ShaderChunk, ShaderLib, UniformsUtils, UniformsLib } from 'three';
5
4
 
6
5
  const nodeFrame = new NodeFrame();
7
6
  nodeFrame.camera = new PerspectiveCamera();
@@ -73,7 +72,17 @@ class WebGLNodeBuilder extends NodeBuilder {
73
72
 
74
73
  _parseShaderLib() {
75
74
 
76
- const type = this.material.type;
75
+ const material = this.material;
76
+
77
+ let type = material.type;
78
+
79
+ // see https://github.com/mrdoob/three.js/issues/23707
80
+
81
+ if ( material.isMeshPhysicalNodeMaterial ) type = 'MeshPhysicalNodeMaterial';
82
+ else if ( material.isMeshStandardNodeMaterial ) type = 'MeshStandardNodeMaterial';
83
+ else if ( material.isMeshBasicNodeMaterial ) type = 'MeshBasicNodeMaterial';
84
+ else if ( material.isPointsNodeMaterial ) type = 'PointsNodeMaterial';
85
+ else if ( material.isLineBasicNodeMaterial ) type = 'LineBasicNodeMaterial';
77
86
 
78
87
  // shader lib
79
88
 
@@ -501,15 +510,31 @@ class WebGLNodeBuilder extends NodeBuilder {
501
510
 
502
511
  }
503
512
 
504
- getVaryings( /* shaderStage */ ) {
513
+ getVaryings( shaderStage ) {
505
514
 
506
515
  let snippet = '';
507
516
 
508
517
  const varyings = this.varyings;
509
518
 
510
- for ( const varying of varyings ) {
519
+ if ( shaderStage === 'vertex' ) {
520
+
521
+ for ( const varying of varyings ) {
522
+
523
+ snippet += `${varying.needsInterpolation ? 'varying' : '/*varying*/'} ${varying.type} ${varying.name}; `;
524
+
525
+ }
526
+
527
+ } else if ( shaderStage === 'fragment' ) {
528
+
529
+ for ( const varying of varyings ) {
530
+
531
+ if ( varying.needsInterpolation ) {
511
532
 
512
- snippet += `varying ${varying.type} ${varying.name}; `;
533
+ snippet += `varying ${varying.type} ${varying.name}; `;
534
+
535
+ }
536
+
537
+ }
513
538
 
514
539
  }
515
540
 
@@ -546,23 +571,21 @@ class WebGLNodeBuilder extends NodeBuilder {
546
571
 
547
572
  }
548
573
 
549
- getTextureEncodingFromMap( map ) {
550
-
551
- const isWebGL2 = this.renderer.capabilities.isWebGL2;
574
+ getFrontFacing() {
552
575
 
553
- if ( isWebGL2 && map && map.isTexture && map.format === RGBAFormat && map.type === UnsignedByteType && map.encoding === sRGBEncoding ) {
576
+ return 'gl_FrontFacing';
554
577
 
555
- return LinearEncoding; // disable inline decode for sRGB textures in WebGL 2
578
+ }
556
579
 
557
- }
580
+ getFragCoord() {
558
581
 
559
- return super.getTextureEncodingFromMap( map );
582
+ return 'gl_FragCoord';
560
583
 
561
584
  }
562
585
 
563
- getFrontFacing() {
586
+ isFlipY() {
564
587
 
565
- return 'gl_FrontFacing';
588
+ return true;
566
589
 
567
590
  }
568
591
 
@@ -692,7 +715,7 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]}
692
715
  this.addCode(
693
716
  shaderStage,
694
717
  'main() {',
695
- this.flowCode[ shaderStage ]
718
+ '\n\t' + this.flowCode[ shaderStage ]
696
719
  );
697
720
 
698
721
  }
@@ -0,0 +1,58 @@
1
+ class WebGPUAnimation {
2
+
3
+ constructor() {
4
+
5
+ this.nodes = null;
6
+
7
+ this.animationLoop = null;
8
+ this.requestId = null;
9
+
10
+ this.isAnimating = false;
11
+
12
+ this.context = self;
13
+
14
+ }
15
+
16
+ start() {
17
+
18
+ if ( this.isAnimating === true || this.animationLoop === null || this.nodes === null ) return;
19
+
20
+ this.isAnimating = true;
21
+
22
+ const update = ( time, frame ) => {
23
+
24
+ this.requestId = self.requestAnimationFrame( update );
25
+
26
+ this.animationLoop( time, frame );
27
+
28
+ this.nodes.updateFrame();
29
+
30
+ };
31
+
32
+ this.requestId = self.requestAnimationFrame( update );
33
+
34
+ }
35
+
36
+ stop() {
37
+
38
+ self.cancelAnimationFrame( this.requestId );
39
+
40
+ this.isAnimating = false;
41
+
42
+ }
43
+
44
+ setAnimationLoop( callback ) {
45
+
46
+ this.animationLoop = callback;
47
+
48
+ }
49
+
50
+ setNodes( nodes ) {
51
+
52
+ this.nodes = nodes;
53
+
54
+ }
55
+
56
+ }
57
+
58
+ export default WebGPUAnimation;
@@ -23,7 +23,7 @@ class WebGPUAttributes {
23
23
 
24
24
  if ( data ) {
25
25
 
26
- data.buffer.destroy();
26
+ this._destroyBuffers( data );
27
27
 
28
28
  this.buffers.delete( attribute );
29
29
 
@@ -51,7 +51,7 @@ class WebGPUAttributes {
51
51
 
52
52
  } else if ( usage && usage !== data.usage ) {
53
53
 
54
- data.buffer.destroy();
54
+ this._destroyBuffers( data );
55
55
 
56
56
  data = this._createBuffer( attribute, usage );
57
57
 
@@ -67,6 +67,53 @@ class WebGPUAttributes {
67
67
 
68
68
  }
69
69
 
70
+ async getArrayBuffer( attribute ) {
71
+
72
+ const data = this.get( attribute );
73
+ const device = this.device;
74
+
75
+ const gpuBuffer = data.buffer;
76
+ const size = gpuBuffer.size;
77
+
78
+ let gpuReadBuffer = data.readBuffer;
79
+ let needsUnmap = true;
80
+
81
+ if ( gpuReadBuffer === null ) {
82
+
83
+ gpuReadBuffer = device.createBuffer( {
84
+ size,
85
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
86
+ } );
87
+
88
+ needsUnmap = false;
89
+
90
+ data.readBuffer = gpuReadBuffer;
91
+
92
+ }
93
+
94
+ const cmdEncoder = device.createCommandEncoder( {} );
95
+
96
+ cmdEncoder.copyBufferToBuffer(
97
+ gpuBuffer,
98
+ 0,
99
+ gpuReadBuffer,
100
+ 0,
101
+ size
102
+ );
103
+
104
+ if ( needsUnmap ) gpuReadBuffer.unmap();
105
+
106
+ const gpuCommands = cmdEncoder.finish();
107
+ device.queue.submit( [ gpuCommands ] );
108
+
109
+ await gpuReadBuffer.mapAsync( GPUMapMode.READ );
110
+
111
+ const arrayBuffer = gpuReadBuffer.getMappedRange();
112
+
113
+ return new Float32Array( arrayBuffer );
114
+
115
+ }
116
+
70
117
  _createBuffer( attribute, usage ) {
71
118
 
72
119
  const array = attribute.array;
@@ -74,7 +121,7 @@ class WebGPUAttributes {
74
121
 
75
122
  const buffer = this.device.createBuffer( {
76
123
  size,
77
- usage: usage | GPUBufferUsage.COPY_DST,
124
+ usage: usage | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,
78
125
  mappedAtCreation: true
79
126
  } );
80
127
 
@@ -87,6 +134,7 @@ class WebGPUAttributes {
87
134
  return {
88
135
  version: attribute.version,
89
136
  buffer,
137
+ readBuffer: null,
90
138
  usage
91
139
  };
92
140
 
@@ -94,6 +142,8 @@ class WebGPUAttributes {
94
142
 
95
143
  _writeBuffer( buffer, attribute ) {
96
144
 
145
+ const device = this.device;
146
+
97
147
  const array = attribute.array;
98
148
  const updateRange = attribute.updateRange;
99
149
 
@@ -101,7 +151,7 @@ class WebGPUAttributes {
101
151
 
102
152
  // Not using update ranges
103
153
 
104
- this.device.queue.writeBuffer(
154
+ device.queue.writeBuffer(
105
155
  buffer,
106
156
  0,
107
157
  array,
@@ -110,7 +160,7 @@ class WebGPUAttributes {
110
160
 
111
161
  } else {
112
162
 
113
- this.device.queue.writeBuffer(
163
+ device.queue.writeBuffer(
114
164
  buffer,
115
165
  0,
116
166
  array,
@@ -124,6 +174,14 @@ class WebGPUAttributes {
124
174
 
125
175
  }
126
176
 
177
+ _destroyBuffers( { buffer, readBuffer } ) {
178
+
179
+ buffer.destroy();
180
+
181
+ if ( readBuffer !== null ) readBuffer.destroy();
182
+
183
+ }
184
+
127
185
  }
128
186
 
129
187
  export default WebGPUAttributes;