super-three 0.152.0 → 0.154.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 (339) hide show
  1. package/build/three.cjs +778 -557
  2. package/build/three.js +778 -557
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +769 -539
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/cameras/CinematicCamera.js +1 -2
  7. package/examples/jsm/capabilities/WebGPU.js +15 -1
  8. package/examples/jsm/controls/ArcballControls.js +2 -1
  9. package/examples/jsm/controls/FlyControls.js +25 -9
  10. package/examples/jsm/controls/OrbitControls.js +5 -1
  11. package/examples/jsm/csm/CSM.js +1 -3
  12. package/examples/jsm/effects/AnaglyphEffect.js +6 -20
  13. package/examples/jsm/effects/OutlineEffect.js +1 -1
  14. package/examples/jsm/effects/ParallaxBarrierEffect.js +3 -0
  15. package/examples/jsm/environments/RoomEnvironment.js +6 -2
  16. package/examples/jsm/exporters/GLTFExporter.js +74 -2
  17. package/examples/jsm/exporters/USDZExporter.js +170 -129
  18. package/examples/jsm/helpers/ViewHelper.js +1 -1
  19. package/examples/jsm/lines/LineMaterial.js +1 -1
  20. package/examples/jsm/loaders/3DMLoader.js +1 -1
  21. package/examples/jsm/loaders/3MFLoader.js +5 -1
  22. package/examples/jsm/loaders/AMFLoader.js +5 -1
  23. package/examples/jsm/loaders/ColladaLoader.js +4 -1
  24. package/examples/jsm/loaders/DRACOLoader.js +2 -0
  25. package/examples/jsm/loaders/FBXLoader.js +9 -2
  26. package/examples/jsm/loaders/GLTFLoader.js +230 -94
  27. package/examples/jsm/loaders/KTX2Loader.js +106 -47
  28. package/examples/jsm/loaders/LDrawLoader.js +4 -7
  29. package/examples/jsm/loaders/MMDLoader.js +40 -13
  30. package/examples/jsm/loaders/PCDLoader.js +25 -10
  31. package/examples/jsm/loaders/PDBLoader.js +7 -2
  32. package/examples/jsm/loaders/PLYLoader.js +30 -8
  33. package/examples/jsm/loaders/STLLoader.js +8 -3
  34. package/examples/jsm/loaders/VRMLLoader.js +55 -7
  35. package/examples/jsm/loaders/VTKLoader.js +12 -4
  36. package/examples/jsm/loaders/XYZLoader.js +9 -3
  37. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -2
  38. package/examples/jsm/math/Lut.js +5 -4
  39. package/examples/jsm/math/MeshSurfaceSampler.js +82 -37
  40. package/examples/jsm/misc/GPUComputationRenderer.js +1 -0
  41. package/examples/jsm/misc/VolumeSlice.js +3 -1
  42. package/examples/jsm/nodes/Nodes.js +22 -16
  43. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +99 -0
  44. package/examples/jsm/nodes/accessors/BufferNode.js +2 -2
  45. package/examples/jsm/nodes/accessors/CameraNode.js +25 -4
  46. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +7 -1
  47. package/examples/jsm/nodes/accessors/InstanceNode.js +29 -12
  48. package/examples/jsm/nodes/accessors/MaterialNode.js +55 -47
  49. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -2
  50. package/examples/jsm/nodes/accessors/ModelNode.js +3 -1
  51. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +4 -9
  52. package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
  53. package/examples/jsm/nodes/accessors/NormalNode.js +3 -2
  54. package/examples/jsm/nodes/accessors/Object3DNode.js +10 -2
  55. package/examples/jsm/nodes/accessors/ReferenceNode.js +2 -2
  56. package/examples/jsm/nodes/accessors/SceneNode.js +46 -0
  57. package/examples/jsm/nodes/accessors/SkinningNode.js +43 -62
  58. package/examples/jsm/nodes/accessors/StorageBufferNode.js +2 -2
  59. package/examples/jsm/nodes/accessors/TangentNode.js +2 -2
  60. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
  61. package/examples/jsm/nodes/accessors/TextureNode.js +68 -6
  62. package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
  63. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  64. package/examples/jsm/nodes/code/CodeNode.js +3 -0
  65. package/examples/jsm/nodes/code/FunctionNode.js +25 -4
  66. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  67. package/examples/jsm/nodes/core/BypassNode.js +2 -2
  68. package/examples/jsm/nodes/core/ContextNode.js +2 -0
  69. package/examples/jsm/nodes/core/IndexNode.js +66 -0
  70. package/examples/jsm/nodes/core/LightingModel.js +2 -1
  71. package/examples/jsm/nodes/core/Node.js +13 -16
  72. package/examples/jsm/nodes/core/NodeAttribute.js +2 -1
  73. package/examples/jsm/nodes/core/NodeBuilder.js +86 -8
  74. package/examples/jsm/nodes/core/NodeUtils.js +10 -0
  75. package/examples/jsm/nodes/core/PropertyNode.js +6 -2
  76. package/examples/jsm/nodes/core/StackNode.js +8 -1
  77. package/examples/jsm/nodes/core/UniformNode.js +1 -1
  78. package/examples/jsm/nodes/core/VarNode.js +1 -3
  79. package/examples/jsm/nodes/display/BlendModeNode.js +9 -9
  80. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +7 -7
  81. package/examples/jsm/nodes/display/ColorSpaceNode.js +50 -49
  82. package/examples/jsm/nodes/display/NormalMapNode.js +3 -3
  83. package/examples/jsm/nodes/display/ToneMappingNode.js +24 -15
  84. package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
  85. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
  86. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +7 -6
  87. package/examples/jsm/nodes/display/ViewportTextureNode.js +33 -19
  88. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +5 -5
  89. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -8
  90. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  91. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
  92. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +4 -4
  93. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +2 -2
  94. package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
  95. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +2 -4
  96. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  97. package/examples/jsm/nodes/functions/PhongLightingModel.js +7 -7
  98. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +132 -19
  99. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +2 -2
  100. package/examples/jsm/nodes/functions/material/getRoughness.js +3 -3
  101. package/examples/jsm/nodes/geometry/RangeNode.js +33 -51
  102. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +6 -3
  103. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -2
  104. package/examples/jsm/nodes/lighting/EnvironmentNode.js +107 -62
  105. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +2 -2
  106. package/examples/jsm/nodes/lighting/LightUtils.js +2 -2
  107. package/examples/jsm/nodes/lighting/LightingContextNode.js +17 -15
  108. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  109. package/examples/jsm/nodes/lighting/SpotLightNode.js +3 -3
  110. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -15
  111. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -15
  112. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -10
  113. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -9
  114. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +41 -0
  115. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +1 -14
  116. package/examples/jsm/nodes/materials/NodeMaterial.js +119 -29
  117. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -9
  118. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  119. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +3 -3
  120. package/examples/jsm/nodes/materialx/lib/mx_noise.js +14 -14
  121. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +4 -4
  122. package/examples/jsm/nodes/math/MathNode.js +6 -0
  123. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  124. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  125. package/examples/jsm/nodes/shadernode/ShaderNode.js +60 -33
  126. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -3
  127. package/examples/jsm/nodes/utils/LoopNode.js +186 -0
  128. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +1 -1
  129. package/examples/jsm/objects/GroundProjectedSkybox.js +1 -1
  130. package/examples/jsm/objects/Lensflare.js +3 -4
  131. package/examples/jsm/objects/MarchingCubes.js +5 -1
  132. package/examples/jsm/objects/Reflector.js +4 -1
  133. package/examples/jsm/objects/Refractor.js +1 -1
  134. package/examples/jsm/objects/Sky.js +1 -1
  135. package/examples/jsm/objects/Water.js +2 -1
  136. package/examples/jsm/objects/Water2.js +1 -1
  137. package/examples/jsm/offscreen/scene.js +1 -0
  138. package/examples/jsm/physics/RapierPhysics.js +93 -133
  139. package/examples/jsm/postprocessing/AfterimagePass.js +3 -0
  140. package/examples/jsm/postprocessing/BloomPass.js +7 -2
  141. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  142. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  143. package/examples/jsm/postprocessing/EffectComposer.js +4 -1
  144. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  145. package/examples/jsm/postprocessing/OutlinePass.js +8 -9
  146. package/examples/jsm/postprocessing/OutputPass.js +72 -0
  147. package/examples/jsm/postprocessing/RenderPixelatedPass.js +4 -3
  148. package/examples/jsm/postprocessing/SAOPass.js +4 -2
  149. package/examples/jsm/postprocessing/SMAAPass.js +5 -2
  150. package/examples/jsm/postprocessing/SSAARenderPass.js +5 -13
  151. package/examples/jsm/postprocessing/SSAOPass.js +4 -2
  152. package/examples/jsm/postprocessing/SSRPass.js +3 -1
  153. package/examples/jsm/postprocessing/SavePass.js +5 -2
  154. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  155. package/examples/jsm/postprocessing/TAARenderPass.js +17 -4
  156. package/examples/jsm/postprocessing/TexturePass.js +2 -1
  157. package/examples/jsm/postprocessing/UnrealBloomPass.js +13 -13
  158. package/examples/jsm/renderers/{webgpu/WebGPUAnimation.js → common/Animation.js} +2 -2
  159. package/examples/jsm/renderers/common/Attributes.js +75 -0
  160. package/examples/jsm/renderers/common/Backend.js +162 -0
  161. package/examples/jsm/renderers/common/Background.js +134 -0
  162. package/examples/jsm/renderers/common/Binding.js +11 -0
  163. package/examples/jsm/renderers/common/Bindings.js +169 -0
  164. package/examples/jsm/renderers/common/Buffer.js +38 -0
  165. package/examples/jsm/renderers/{webgpu/WebGPUBufferUtils.js → common/BufferUtils.js} +2 -2
  166. package/examples/jsm/renderers/{webgpu/WebGPUWeakMap.js → common/ChainMap.js} +11 -5
  167. package/examples/jsm/renderers/common/ComputePipeline.js +17 -0
  168. package/examples/jsm/renderers/common/Constants.js +14 -0
  169. package/examples/jsm/renderers/common/CubeRenderTarget.js +65 -0
  170. package/examples/jsm/renderers/common/DataMap.js +54 -0
  171. package/examples/jsm/renderers/{webgpu/WebGPUGeometries.js → common/Geometries.js} +38 -37
  172. package/examples/jsm/renderers/{webgpu/WebGPUInfo.js → common/Info.js} +2 -3
  173. package/examples/jsm/renderers/common/Pipeline.js +13 -0
  174. package/examples/jsm/renderers/common/Pipelines.js +321 -0
  175. package/examples/jsm/renderers/common/ProgrammableStage.js +18 -0
  176. package/examples/jsm/renderers/common/RenderContext.js +37 -0
  177. package/examples/jsm/renderers/common/RenderContexts.js +38 -0
  178. package/examples/jsm/renderers/{webgpu/WebGPURenderLists.js → common/RenderList.js} +2 -39
  179. package/examples/jsm/renderers/common/RenderLists.js +38 -0
  180. package/examples/jsm/renderers/common/RenderObject.js +113 -0
  181. package/examples/jsm/renderers/common/RenderObjects.js +92 -0
  182. package/examples/jsm/renderers/common/RenderPipeline.js +16 -0
  183. package/examples/jsm/renderers/{webgpu/WebGPURenderTarget.js → common/RenderTarget.js} +2 -2
  184. package/examples/jsm/renderers/common/Renderer.js +864 -0
  185. package/examples/jsm/renderers/common/SampledTexture.js +80 -0
  186. package/examples/jsm/renderers/common/Sampler.js +18 -0
  187. package/examples/jsm/renderers/common/StorageBuffer.js +17 -0
  188. package/examples/jsm/renderers/common/Textures.js +206 -0
  189. package/examples/jsm/renderers/{webgpu/WebGPUUniform.js → common/Uniform.js} +13 -9
  190. package/examples/jsm/renderers/common/UniformBuffer.js +15 -0
  191. package/examples/jsm/renderers/{webgpu/WebGPUUniformsGroup.js → common/UniformsGroup.js} +13 -13
  192. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodes.js → common/nodes/NodeRender.js} +3 -3
  193. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampledTexture.js → common/nodes/NodeSampledTexture.js} +4 -4
  194. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampler.js → common/nodes/NodeSampler.js} +3 -3
  195. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeUniform.js → common/nodes/NodeUniform.js} +1 -1
  196. package/examples/jsm/renderers/common/nodes/Nodes.js +319 -0
  197. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
  198. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +23 -19
  199. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +847 -0
  200. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +15 -1131
  201. package/examples/jsm/renderers/webgpu/nodes/{WebGPUNodeBuilder.js → WGSLNodeBuilder.js} +75 -45
  202. package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeFunction.js +2 -2
  203. package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeParser.js +1 -1
  204. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +255 -0
  205. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +145 -0
  206. package/examples/jsm/renderers/webgpu/{constants.js → utils/WebGPUConstants.js} +6 -7
  207. package/examples/jsm/renderers/webgpu/{WebGPURenderPipeline.js → utils/WebGPUPipelineUtils.js} +154 -247
  208. package/examples/jsm/renderers/webgpu/{WebGPUTextureUtils.js → utils/WebGPUTextureMipmapUtils.js} +3 -25
  209. package/examples/jsm/renderers/webgpu/{WebGPUTextures.js → utils/WebGPUTextureUtils.js} +392 -505
  210. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +92 -0
  211. package/examples/jsm/shaders/BleachBypassShader.js +2 -0
  212. package/examples/jsm/shaders/BlendShader.js +1 -2
  213. package/examples/jsm/shaders/BokehShader2.js +3 -0
  214. package/examples/jsm/shaders/ColorifyShader.js +2 -0
  215. package/examples/jsm/shaders/ConvolutionShader.js +2 -0
  216. package/examples/jsm/shaders/CopyShader.js +4 -2
  217. package/examples/jsm/shaders/DotScreenShader.js +2 -0
  218. package/examples/jsm/shaders/ExposureShader.js +44 -0
  219. package/examples/jsm/shaders/FilmShader.js +2 -0
  220. package/examples/jsm/shaders/GammaCorrectionShader.js +2 -0
  221. package/examples/jsm/shaders/HorizontalBlurShader.js +2 -0
  222. package/examples/jsm/shaders/OutputShader.js +61 -0
  223. package/examples/jsm/shaders/RGBShiftShader.js +2 -0
  224. package/examples/jsm/shaders/SepiaShader.js +2 -0
  225. package/examples/jsm/shaders/ToonShader.js +13 -5
  226. package/examples/jsm/shaders/VerticalBlurShader.js +2 -0
  227. package/examples/jsm/shaders/VignetteShader.js +2 -0
  228. package/examples/jsm/shaders/WaterRefractionShader.js +5 -2
  229. package/examples/jsm/utils/BufferGeometryUtils.js +17 -1
  230. package/examples/jsm/utils/TextureUtils.js +86 -0
  231. package/examples/jsm/webxr/OculusHandPointerModel.js +34 -13
  232. package/examples/jsm/webxr/XRHandPrimitiveModel.js +1 -0
  233. package/examples/jsm/webxr/XRPlanes.js +100 -0
  234. package/package.json +3 -1
  235. package/src/Three.Legacy.js +0 -228
  236. package/src/audio/PositionalAudio.js +8 -0
  237. package/src/cameras/Camera.js +5 -0
  238. package/src/cameras/CubeCamera.js +76 -13
  239. package/src/cameras/OrthographicCamera.js +1 -1
  240. package/src/cameras/PerspectiveCamera.js +1 -1
  241. package/src/constants.js +13 -1
  242. package/src/core/BufferAttribute.js +3 -25
  243. package/src/core/BufferGeometry.js +1 -8
  244. package/src/core/Object3D.js +1 -1
  245. package/src/extras/core/Curve.js +1 -1
  246. package/src/loaders/CubeTextureLoader.js +2 -0
  247. package/src/loaders/Loader.js +2 -0
  248. package/src/loaders/MaterialLoader.js +5 -0
  249. package/src/loaders/ObjectLoader.js +1 -0
  250. package/src/materials/Material.js +13 -1
  251. package/src/materials/MeshPhysicalMaterial.js +32 -6
  252. package/src/math/Color.js +16 -11
  253. package/src/math/Frustum.js +16 -2
  254. package/src/math/MathUtils.js +16 -0
  255. package/src/math/Matrix3.js +26 -6
  256. package/src/math/Matrix4.js +74 -19
  257. package/src/objects/InstancedMesh.js +3 -0
  258. package/src/objects/Mesh.js +14 -10
  259. package/src/objects/Skeleton.js +1 -3
  260. package/src/objects/SkinnedMesh.js +36 -8
  261. package/src/renderers/WebGLRenderer.js +126 -21
  262. package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
  263. package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
  264. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +6 -0
  265. package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -0
  266. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +26 -3
  267. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +9 -1
  268. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +26 -0
  269. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -2
  270. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +10 -2
  271. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +1 -1
  272. package/src/renderers/shaders/ShaderChunk/{output_fragment.glsl.js → opaque_fragment.glsl.js} +1 -2
  273. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  274. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +3 -3
  275. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +10 -5
  276. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +6 -1
  277. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +7 -1
  278. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +6 -1
  279. package/src/renderers/shaders/ShaderChunk.js +10 -6
  280. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  281. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -1
  282. package/src/renderers/shaders/ShaderLib/cube.glsl.js +1 -1
  283. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  284. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  285. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -1
  286. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -2
  287. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +4 -2
  288. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +4 -2
  289. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +4 -2
  290. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +4 -2
  291. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +12 -2
  292. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +4 -2
  293. package/src/renderers/shaders/ShaderLib/points.glsl.js +4 -2
  294. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  295. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +4 -2
  296. package/src/renderers/shaders/ShaderLib.js +4 -1
  297. package/src/renderers/shaders/UniformsLib.js +2 -0
  298. package/src/renderers/webgl/WebGLBindingStates.js +13 -5
  299. package/src/renderers/webgl/WebGLGeometries.js +12 -0
  300. package/src/renderers/webgl/WebGLInfo.js +0 -1
  301. package/src/renderers/webgl/WebGLMaterials.js +18 -0
  302. package/src/renderers/webgl/WebGLObjects.js +23 -3
  303. package/src/renderers/webgl/WebGLProgram.js +43 -5
  304. package/src/renderers/webgl/WebGLPrograms.js +19 -7
  305. package/src/renderers/webgl/WebGLTextures.js +19 -1
  306. package/src/renderers/webvr/WebVRManager.js +12 -0
  307. package/src/renderers/webxr/WebXRManager.js +39 -99
  308. package/src/scenes/Scene.js +0 -14
  309. package/src/textures/DepthTexture.js +22 -0
  310. package/src/textures/FramebufferTexture.js +1 -3
  311. package/src/textures/Source.js +4 -0
  312. package/src/textures/Texture.js +1 -1
  313. package/examples/jsm/exporters/ColladaExporter.js +0 -725
  314. package/examples/jsm/geometries/LightningStrike.js +0 -1017
  315. package/examples/jsm/loaders/PRWMLoader.js +0 -299
  316. package/examples/jsm/nodes/core/InstanceIndexNode.js +0 -26
  317. package/examples/jsm/objects/LightningStorm.js +0 -245
  318. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +0 -361
  319. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +0 -197
  320. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +0 -190
  321. package/examples/jsm/renderers/webgpu/WebGPUBinding.js +0 -22
  322. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +0 -270
  323. package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +0 -43
  324. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +0 -78
  325. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +0 -22
  326. package/examples/jsm/renderers/webgpu/WebGPUProperties.js +0 -44
  327. package/examples/jsm/renderers/webgpu/WebGPURenderObject.js +0 -40
  328. package/examples/jsm/renderers/webgpu/WebGPURenderObjects.js +0 -50
  329. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +0 -274
  330. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +0 -54
  331. package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +0 -75
  332. package/examples/jsm/renderers/webgpu/WebGPUSampler.js +0 -29
  333. package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +0 -20
  334. package/examples/jsm/renderers/webgpu/WebGPUTextureRenderer.js +0 -38
  335. package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +0 -18
  336. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +0 -88
  337. package/examples/jsm/shaders/ToneMapShader.js +0 -73
  338. /package/src/renderers/shaders/ShaderChunk/{encodings_fragment.glsl.js → colorspace_fragment.glsl.js} +0 -0
  339. /package/src/renderers/shaders/ShaderChunk/{encodings_pars_fragment.glsl.js → colorspace_pars_fragment.glsl.js} +0 -0
@@ -1,476 +1,451 @@
1
- import { GPUTextureFormat, GPUAddressMode, GPUFilterMode, GPUTextureDimension, GPUFeatureName } from './constants.js';
2
- import { VideoTexture, CubeTexture, Texture, NearestFilter, NearestMipmapNearestFilter, NearestMipmapLinearFilter, LinearFilter, RepeatWrapping, MirroredRepeatWrapping, RGB_ETC2_Format, RGBA_ETC2_EAC_Format,
3
- RGBAFormat, RedFormat, RGFormat, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, UnsignedByteType, FloatType, HalfFloatType, SRGBColorSpace, DepthFormat, DepthStencilFormat, DepthTexture,
1
+ import {
2
+ GPUTextureFormat, GPUAddressMode, GPUFilterMode, GPUTextureDimension, GPUFeatureName
3
+ } from './WebGPUConstants.js';
4
+
5
+ import {
6
+ CubeTexture, Texture,
7
+ NearestFilter, NearestMipmapNearestFilter, NearestMipmapLinearFilter, LinearFilter,
8
+ RepeatWrapping, MirroredRepeatWrapping,
9
+ RGB_ETC2_Format, RGBA_ETC2_EAC_Format,
10
+ RGBAFormat, RedFormat, RGFormat, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, UnsignedByteType, FloatType, HalfFloatType, SRGBColorSpace, DepthFormat, DepthStencilFormat,
4
11
  RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format,
5
- RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, UnsignedIntType, UnsignedShortType, UnsignedInt248Type
12
+ RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, UnsignedIntType, UnsignedShortType, UnsignedInt248Type,
13
+ NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare
6
14
  } from 'three';
7
- import WebGPUTextureUtils from './WebGPUTextureUtils.js';
8
15
 
9
- class WebGPUTextures {
16
+ import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
10
17
 
11
- constructor( device, properties, info ) {
18
+ import WebGPUTextureMipmapUtils from './WebGPUTextureMipmapUtils.js';
12
19
 
13
- this.device = device;
14
- this.properties = properties;
15
- this.info = info;
20
+ const _compareToWebGPU = {
21
+ [ NeverCompare ]: 'never',
22
+ [ AlwaysCompare ]: 'less',
23
+ [ LessCompare ]: 'equal',
24
+ [ LessEqualCompare ]: 'less-equal',
25
+ [ EqualCompare ]: 'greater',
26
+ [ GreaterEqualCompare ]: 'not-equal',
27
+ [ GreaterCompare ]: 'greater-equal',
28
+ [ NotEqualCompare ]: 'always'
29
+ };
16
30
 
17
- this.defaultTexture = null;
18
- this.depthDefaultTexture = null;
19
- this.defaultVideoTexture = null;
20
- this.defaultCubeTexture = null;
21
- this.defaultSampler = null;
22
-
23
- this.samplerCache = new Map();
24
- this.utils = null;
25
-
26
- }
27
-
28
- getDefaultSampler() {
31
+ class WebGPUTextureUtils {
29
32
 
30
- if ( this.defaultSampler === null ) {
33
+ constructor( backend ) {
31
34
 
32
- this.defaultSampler = this.device.createSampler( {} );
35
+ this.backend = backend;
33
36
 
34
- }
37
+ this.mipmapUtils = null;
35
38
 
36
- return this.defaultSampler;
39
+ this.defaultTexture = null;
40
+ this.defaultCubeTexture = null;
37
41
 
38
42
  }
39
43
 
40
- getDefaultDepthTexture() {
41
-
42
- if ( this.depthDefaultTexture === null ) {
43
-
44
- const depthTexture = new DepthTexture();
45
- depthTexture.image.width = 1;
46
- depthTexture.image.height = 1;
47
-
48
- this._uploadTexture( depthTexture );
49
-
50
- this.depthDefaultTexture = this.getTextureGPU( depthTexture );
51
-
52
- }
53
-
54
- return this.depthDefaultTexture;
55
-
56
- }
44
+ createSampler( texture ) {
57
45
 
58
- getDefaultTexture() {
46
+ const backend = this.backend;
47
+ const device = backend.device;
59
48
 
60
- if ( this.defaultTexture === null ) {
49
+ const textureGPU = backend.get( texture );
61
50
 
62
- const texture = new Texture();
63
- texture.minFilter = NearestFilter;
64
- texture.magFilter = NearestFilter;
51
+ const samplerDescriptorGPU = {
52
+ addressModeU: this._convertAddressMode( texture.wrapS ),
53
+ addressModeV: this._convertAddressMode( texture.wrapT ),
54
+ addressModeW: this._convertAddressMode( texture.wrapR ),
55
+ magFilter: this._convertFilterMode( texture.magFilter ),
56
+ minFilter: this._convertFilterMode( texture.minFilter ),
57
+ mipmapFilter: this._convertFilterMode( texture.minFilter ),
58
+ maxAnisotropy: texture.anisotropy
59
+ };
65
60
 
66
- this._uploadTexture( texture );
61
+ if ( texture.isDepthTexture && texture.compareFunction !== null ) {
67
62
 
68
- this.defaultTexture = this.getTextureGPU( texture );
63
+ samplerDescriptorGPU.compare = _compareToWebGPU[ texture.compareFunction ];
69
64
 
70
65
  }
71
66
 
72
- return this.defaultTexture;
67
+ textureGPU.sampler = device.createSampler( samplerDescriptorGPU );
73
68
 
74
69
  }
75
70
 
76
- getDefaultVideoTexture() {
71
+ createDefaultTexture( texture ) {
77
72
 
78
- if ( this.defaultVideoTexture === null ) {
73
+ let textureGPU;
79
74
 
80
- const video = document.getElementById( 'video' );
75
+ if ( texture.isCubeTexture ) {
81
76
 
82
- const texture = new VideoTexture( video );
83
- texture.minFilter = NearestFilter;
84
- texture.magFilter = NearestFilter;
77
+ textureGPU = this._getDefaultCubeTextureGPU();
85
78
 
86
- this._uploadVideoTexture( texture );
79
+ } else {
87
80
 
88
- this.defaultVideoTexture = this.getTextureGPU( texture );
81
+ textureGPU = this._getDefaultTextureGPU();
89
82
 
90
83
  }
91
84
 
92
- return this.defaultVideoTexture;
85
+ this.backend.get( texture ).texture = textureGPU;
93
86
 
94
87
  }
95
88
 
96
- getDefaultCubeTexture() {
97
-
98
- if ( this.defaultCubeTexture === null ) {
89
+ createTexture( texture, options = {} ) {
99
90
 
100
- const texture = new CubeTexture();
101
- texture.minFilter = NearestFilter;
102
- texture.magFilter = NearestFilter;
91
+ const backend = this.backend;
92
+ const textureData = backend.get( texture );
103
93
 
104
- this._uploadTexture( texture );
94
+ if ( textureData.initialized ) {
105
95
 
106
- this.defaultCubeTexture = this.getTextureGPU( texture );
96
+ throw new Error( 'WebGPUTextureUtils: Texture already initialized.' );
107
97
 
108
98
  }
109
99
 
110
- return this.defaultCubeTexture;
100
+ const { width, height, depth } = this._getSize( texture );
111
101
 
112
- }
102
+ const needsMipmaps = this._needsMipmaps( texture );
103
+ const dimension = this._getDimension( texture );
104
+ const mipLevelCount = this._getMipLevelCount( texture, width, height, needsMipmaps );
105
+ const format = texture.internalFormat || this._getFormat( texture );
106
+ //const sampleCount = texture.isRenderTargetTexture || texture.isDepthTexture ? backend.utils.getSampleCount( renderContext ) : 1;
107
+ const sampleCount = options.sampleCount !== undefined ? options.sampleCount : 1;
113
108
 
114
- getTextureGPU( texture ) {
109
+ let usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC;
115
110
 
116
- const textureProperties = this.properties.get( texture );
111
+ if ( texture.isCompressedTexture !== true ) {
117
112
 
118
- return textureProperties.textureGPU;
113
+ usage |= GPUTextureUsage.RENDER_ATTACHMENT;
119
114
 
120
- }
115
+ }
121
116
 
122
- getSampler( texture ) {
117
+ const textureDescriptorGPU = {
118
+ label: texture.name,
119
+ size: {
120
+ width: width,
121
+ height: height,
122
+ depthOrArrayLayers: depth,
123
+ },
124
+ mipLevelCount: mipLevelCount,
125
+ sampleCount: sampleCount,
126
+ dimension: dimension,
127
+ format: format,
128
+ usage: usage
129
+ };
123
130
 
124
- const textureProperties = this.properties.get( texture );
131
+ // texture creation
125
132
 
126
- return textureProperties.samplerGPU;
133
+ if ( texture.isVideoTexture ) {
127
134
 
128
- }
135
+ const video = texture.source.data;
136
+ const videoFrame = new VideoFrame( video );
129
137
 
130
- updateTexture( texture ) {
138
+ textureDescriptorGPU.size.width = videoFrame.displayWidth;
139
+ textureDescriptorGPU.size.height = videoFrame.displayHeight;
131
140
 
132
- let needsUpdate = false;
141
+ videoFrame.close();
133
142
 
134
- const textureProperties = this.properties.get( texture );
143
+ textureData.externalTexture = video;
135
144
 
136
- if ( texture.version > 0 && textureProperties.version !== texture.version ) {
145
+ } else {
137
146
 
138
- const image = texture.image;
147
+ textureData.texture = backend.device.createTexture( textureDescriptorGPU );
139
148
 
140
- if ( image === undefined ) {
149
+ }
141
150
 
142
- console.warn( 'THREE.WebGPURenderer: Texture marked for update but image is undefined.' );
151
+ textureData.initialized = true;
143
152
 
144
- } else if ( image.complete === false ) {
153
+ textureData.needsMipmaps = needsMipmaps;
154
+ textureData.textureDescriptorGPU = textureDescriptorGPU;
145
155
 
146
- console.warn( 'THREE.WebGPURenderer: Texture marked for update but image is incomplete.' );
156
+ }
147
157
 
148
- } else {
158
+ destroyTexture( texture ) {
149
159
 
150
- // texture init
160
+ const backend = this.backend;
161
+ const textureData = backend.get( texture );
151
162
 
152
- if ( textureProperties.initialized === undefined ) {
163
+ textureData.texture.destroy();
153
164
 
154
- textureProperties.initialized = true;
165
+ backend.delete( texture );
155
166
 
156
- const disposeCallback = onTextureDispose.bind( this );
157
- textureProperties.disposeCallback = disposeCallback;
167
+ }
158
168
 
159
- texture.addEventListener( 'dispose', disposeCallback );
169
+ destroySampler( texture ) {
160
170
 
161
- this.info.memory.textures ++;
171
+ const backend = this.backend;
172
+ const textureData = backend.get( texture );
162
173
 
163
- }
174
+ delete textureData.sampler;
164
175
 
165
- //
176
+ }
166
177
 
167
- if ( texture.isVideoTexture ) {
178
+ generateMipmaps( texture ) {
168
179
 
169
- needsUpdate = this._uploadVideoTexture( texture );
180
+ const textureData = this.backend.get( texture );
170
181
 
171
- } else {
182
+ if ( texture.isCubeTexture ) {
172
183
 
173
- needsUpdate = this._uploadTexture( texture );
184
+ for ( let i = 0; i < 6; i ++ ) {
174
185
 
175
- }
186
+ this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i );
176
187
 
177
188
  }
178
189
 
179
- }
180
-
181
- // if the texture is used for RTT, it's necessary to init it once so the binding
182
- // group's resource definition points to the respective GPUTexture
183
-
184
- if ( textureProperties.initializedRTT === false ) {
190
+ } else {
185
191
 
186
- textureProperties.initializedRTT = true;
187
- needsUpdate = true;
192
+ this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU );
188
193
 
189
194
  }
190
195
 
191
- return needsUpdate;
192
-
193
196
  }
194
197
 
195
- updateSampler( texture ) {
198
+ updateTexture( texture ) {
196
199
 
197
- const array = [];
200
+ const textureData = this.backend.get( texture );
198
201
 
199
- array.push( texture.wrapS );
200
- array.push( texture.wrapT );
201
- array.push( texture.wrapR );
202
- array.push( texture.magFilter );
203
- array.push( texture.minFilter );
204
- array.push( texture.anisotropy );
202
+ const { needsMipmaps, textureDescriptorGPU } = textureData;
205
203
 
206
- const key = array.join();
207
- let samplerGPU = this.samplerCache.get( key );
204
+ // transfer texture data
208
205
 
209
- if ( samplerGPU === undefined ) {
206
+ if ( texture.isDataTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {
210
207
 
211
- samplerGPU = this.device.createSampler( {
212
- addressModeU: this._convertAddressMode( texture.wrapS ),
213
- addressModeV: this._convertAddressMode( texture.wrapT ),
214
- addressModeW: this._convertAddressMode( texture.wrapR ),
215
- magFilter: this._convertFilterMode( texture.magFilter ),
216
- minFilter: this._convertFilterMode( texture.minFilter ),
217
- mipmapFilter: this._convertFilterMode( texture.minFilter ),
218
- maxAnisotropy: texture.anisotropy
219
- } );
208
+ this._copyBufferToTexture( texture.image, textureData.texture, textureDescriptorGPU, needsMipmaps );
220
209
 
221
- this.samplerCache.set( key, samplerGPU );
210
+ } else if ( texture.isCompressedTexture ) {
222
211
 
223
- }
212
+ this._copyCompressedBufferToTexture( texture.mipmaps, textureData.texture, textureDescriptorGPU );
224
213
 
225
- const textureProperties = this.properties.get( texture );
226
- textureProperties.samplerGPU = samplerGPU;
214
+ } else if ( texture.isCubeTexture ) {
227
215
 
228
- }
216
+ if ( texture.image.length === 6 ) {
229
217
 
230
- initRenderTarget( renderTarget ) {
218
+ this._copyCubeMapToTexture( texture.image, texture, textureData.texture, textureDescriptorGPU, needsMipmaps );
231
219
 
232
- const properties = this.properties;
233
- const renderTargetProperties = properties.get( renderTarget );
220
+ }
234
221
 
235
- if ( renderTargetProperties.initialized === undefined ) {
222
+ } else if ( texture.isRenderTargetTexture ) {
236
223
 
237
- const device = this.device;
224
+ if ( needsMipmaps === true ) this._generateMipmaps( textureData.texture, textureDescriptorGPU );
238
225
 
239
- const width = renderTarget.width;
240
- const height = renderTarget.height;
226
+ } else if ( texture.isVideoTexture ) {
241
227
 
242
- const texture = renderTarget.texture;
228
+ const video = texture.source.data;
243
229
 
244
- const colorTextureFormat = texture.internalFormat || this._getFormat( texture );
245
- const label = texture.name ? '_' + texture.name : '';
246
- const needsMipmaps = this._needsMipmaps( texture );
247
- const mipLevelCount = this._getMipLevelCount( texture, width, height, needsMipmaps );
230
+ textureData.externalTexture = video;
248
231
 
249
- const colorTextureGPU = device.createTexture( {
250
- label: 'renderTarget' + label,
251
- size: {
252
- width: width,
253
- height: height,
254
- depthOrArrayLayers: 1
255
- },
256
- mipLevelCount: mipLevelCount,
257
- format: colorTextureFormat,
258
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST
259
- } );
232
+ } else if ( texture.image !== null ) {
260
233
 
261
- this.info.memory.textures ++;
234
+ this._copyImageToTexture( texture.image, texture, textureData.texture, textureDescriptorGPU, needsMipmaps );
262
235
 
263
- renderTargetProperties.colorTextureGPU = colorTextureGPU;
264
- renderTargetProperties.colorTextureFormat = colorTextureFormat;
236
+ } else {
265
237
 
266
- // When the ".texture" or ".depthTexture" property of a render target is used as a map,
267
- // the renderer has to find the respective GPUTexture objects to setup the bind groups.
268
- // Since it's not possible to see just from a texture object whether it belongs to a render
269
- // target or not, we need the initializedRTT flag.
238
+ console.warn( 'WebGPUTextureUtils: Unable to update texture.' );
270
239
 
271
- const textureProperties = properties.get( texture );
272
- textureProperties.textureGPU = colorTextureGPU;
273
- textureProperties.initializedRTT = false;
240
+ }
274
241
 
275
- if ( renderTarget.depthBuffer === true ) {
242
+ //
276
243
 
277
- const depthTextureFormat = renderTarget.depthTexture !== null ? this._getFormat( renderTarget.depthTexture ) : GPUTextureFormat.Depth24PlusStencil8;
244
+ textureData.version = texture.version;
278
245
 
279
- const depthTextureGPU = device.createTexture( {
280
- label: 'renderTarget' + label + '_depthBuffer',
281
- size: {
282
- width: width,
283
- height: height,
284
- depthOrArrayLayers: 1
285
- },
286
- format: depthTextureFormat,
287
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST
288
- } );
246
+ }
289
247
 
290
- this.info.memory.textures ++;
248
+ async copyTextureToBuffer( texture, x, y, width, height ) {
291
249
 
292
- renderTargetProperties.depthTextureGPU = depthTextureGPU;
293
- renderTargetProperties.depthTextureFormat = depthTextureFormat;
250
+ const device = this.backend.device;
294
251
 
295
- if ( renderTarget.depthTexture !== null ) {
252
+ const textureData = this.backend.get( texture );
253
+ const textureGPU = textureData.texture;
254
+ const format = textureData.textureDescriptorGPU.format;
255
+ const bytesPerTexel = this._getBytesPerTexel( format );
296
256
 
297
- const depthTextureProperties = properties.get( renderTarget.depthTexture );
298
- depthTextureProperties.textureGPU = depthTextureGPU;
299
- depthTextureProperties.initializedRTT = false;
257
+ const readBuffer = device.createBuffer(
258
+ {
259
+ size: width * height * bytesPerTexel,
260
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
261
+ }
262
+ );
300
263
 
301
- }
264
+ const encoder = device.createCommandEncoder();
302
265
 
266
+ encoder.copyTextureToBuffer(
267
+ {
268
+ texture: textureGPU,
269
+ origin: { x, y },
270
+ },
271
+ {
272
+ buffer: readBuffer,
273
+ bytesPerRow: width * bytesPerTexel
274
+ },
275
+ {
276
+ width: width,
277
+ height: height
303
278
  }
304
279
 
305
- //
280
+ );
306
281
 
307
- const disposeCallback = onRenderTargetDispose.bind( this );
308
- renderTargetProperties.disposeCallback = disposeCallback;
282
+ const typedArrayType = this._getTypedArrayType( format );
309
283
 
310
- renderTarget.addEventListener( 'dispose', disposeCallback );
284
+ device.queue.submit( [ encoder.finish() ] );
311
285
 
312
- //
286
+ await readBuffer.mapAsync( GPUMapMode.READ );
313
287
 
314
- renderTargetProperties.initialized = true;
288
+ const buffer = readBuffer.getMappedRange();
315
289
 
316
- }
290
+ return new typedArrayType( buffer );
317
291
 
318
292
  }
319
293
 
320
- dispose() {
294
+ _isEnvironmentTexture( texture ) {
295
+
296
+ const mapping = texture.mapping;
321
297
 
322
- this.samplerCache.clear();
298
+ return ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) || ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );
323
299
 
324
300
  }
325
301
 
326
- _convertAddressMode( value ) {
302
+ _getDefaultTextureGPU() {
327
303
 
328
- let addressMode = GPUAddressMode.ClampToEdge;
304
+ let defaultTexture = this.defaultTexture;
329
305
 
330
- if ( value === RepeatWrapping ) {
306
+ if ( defaultTexture === null ) {
331
307
 
332
- addressMode = GPUAddressMode.Repeat;
308
+ const texture = new Texture();
309
+ texture.minFilter = NearestFilter;
310
+ texture.magFilter = NearestFilter;
333
311
 
334
- } else if ( value === MirroredRepeatWrapping ) {
312
+ this.createTexture( texture );
335
313
 
336
- addressMode = GPUAddressMode.MirrorRepeat;
314
+ this.defaultTexture = defaultTexture = texture;
337
315
 
338
316
  }
339
317
 
340
- return addressMode;
318
+ return this.backend.get( defaultTexture ).texture;
341
319
 
342
320
  }
343
321
 
344
- _convertFilterMode( value ) {
322
+ _getDefaultCubeTextureGPU() {
345
323
 
346
- let filterMode = GPUFilterMode.Linear;
324
+ let defaultCubeTexture = this.defaultTexture;
347
325
 
348
- if ( value === NearestFilter || value === NearestMipmapNearestFilter || value === NearestMipmapLinearFilter ) {
326
+ if ( defaultCubeTexture === null ) {
349
327
 
350
- filterMode = GPUFilterMode.Nearest;
328
+ const texture = new CubeTexture();
329
+ texture.minFilter = NearestFilter;
330
+ texture.magFilter = NearestFilter;
351
331
 
352
- }
332
+ this.createTexture( texture );
353
333
 
354
- return filterMode;
334
+ this.defaultCubeTexture = defaultCubeTexture = texture;
355
335
 
356
- }
336
+ }
357
337
 
358
- _uploadVideoTexture( texture ) {
338
+ return this.backend.get( defaultCubeTexture ).texture;
359
339
 
360
- const device = this.device;
340
+ }
361
341
 
362
- const textureProperties = this.properties.get( texture );
342
+ _copyImageToTexture( image, texture, textureGPU, textureDescriptorGPU, needsMipmaps, originDepth ) {
363
343
 
364
- const textureGPU = device.importExternalTexture( {
365
- source: texture.source.data
366
- } );
344
+ if ( this._isHTMLImage( image ) ) {
367
345
 
368
- textureProperties.textureGPU = textureGPU;
369
- //textureProperties.version = texture.version; // @TODO: Force update for now, study a better solution soon using native VideoTexture.update() to fix warns
346
+ this._getImageBitmapFromHTML( image, texture ).then( imageBitmap => {
370
347
 
371
- return true;
348
+ this._copyExternalImageToTexture( imageBitmap, textureGPU, textureDescriptorGPU, needsMipmaps, originDepth );
372
349
 
373
- }
350
+ } );
374
351
 
375
- _uploadTexture( texture ) {
352
+ } else {
376
353
 
377
- let needsUpdate = false;
354
+ // assume ImageBitmap
378
355
 
379
- const device = this.device;
380
- const image = texture.image;
356
+ this._copyExternalImageToTexture( image, textureGPU, textureDescriptorGPU, needsMipmaps, originDepth );
381
357
 
382
- const textureProperties = this.properties.get( texture );
358
+ }
383
359
 
384
- const { width, height, depth } = this._getSize( texture );
385
- const needsMipmaps = this._needsMipmaps( texture );
386
- const dimension = this._getDimension( texture );
387
- const mipLevelCount = this._getMipLevelCount( texture, width, height, needsMipmaps );
388
- const format = texture.internalFormat || this._getFormat( texture );
360
+ }
389
361
 
390
- let usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST;
362
+ _isHTMLImage( image ) {
391
363
 
392
- if ( needsMipmaps ) {
364
+ return ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement );
393
365
 
394
- // current mipmap generation requires RENDER_ATTACHMENT
366
+ }
395
367
 
396
- usage |= GPUTextureUsage.RENDER_ATTACHMENT;
368
+ _copyCubeMapToTexture( images, texture, textureGPU, textureDescriptorGPU, needsMipmaps ) {
397
369
 
398
- }
370
+ for ( let i = 0; i < 6; i ++ ) {
399
371
 
400
- const textureGPUDescriptor = {
401
- label: texture.name,
402
- size: {
403
- width: width,
404
- height: height,
405
- depthOrArrayLayers: depth,
406
- },
407
- mipLevelCount: mipLevelCount,
408
- sampleCount: 1,
409
- dimension: dimension,
410
- format: format,
411
- usage: usage
412
- };
372
+ const image = images[ i ];
413
373
 
414
- // texture creation
374
+ if ( image.isDataTexture ) {
415
375
 
416
- let textureGPU = textureProperties.textureGPU;
376
+ this._copyBufferToTexture( image.image, textureGPU, textureDescriptorGPU, needsMipmaps, i );
417
377
 
418
- if ( textureGPU === undefined ) {
378
+ } else {
419
379
 
420
- textureGPU = device.createTexture( textureGPUDescriptor );
380
+ this._copyImageToTexture( image, texture, textureGPU, textureDescriptorGPU, needsMipmaps, i );
421
381
 
422
- needsUpdate = true;
382
+ }
423
383
 
424
384
  }
425
385
 
426
- // transfer texture data
386
+ }
427
387
 
428
- if ( texture.isDataTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {
388
+ _copyExternalImageToTexture( image, textureGPU, textureDescriptorGPU, needsMipmaps, originDepth = 0 ) {
429
389
 
430
- this._copyBufferToTexture( image, textureGPU, textureGPUDescriptor, needsMipmaps );
390
+ const device = this.backend.device;
431
391
 
432
- } else if ( texture.isCompressedTexture ) {
392
+ device.queue.copyExternalImageToTexture(
393
+ {
394
+ source: image
395
+ }, {
396
+ texture: textureGPU,
397
+ mipLevel: 0,
398
+ origin: { x: 0, y: 0, z: originDepth }
399
+ }, {
400
+ width: image.width,
401
+ height: image.height,
402
+ depthOrArrayLayers: 1
403
+ }
404
+ );
433
405
 
434
- this._copyCompressedBufferToTexture( texture.mipmaps, textureGPU, textureGPUDescriptor );
406
+ if ( needsMipmaps ) this._generateMipmaps( textureGPU, textureDescriptorGPU, originDepth );
435
407
 
436
- } else if ( texture.isCubeTexture ) {
408
+ }
437
409
 
438
- if ( image.length === 6 ) {
410
+ _generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer = 0 ) {
439
411
 
440
- this._copyCubeMapToTexture( image, texture, textureGPU, textureGPUDescriptor, needsMipmaps );
412
+ if ( this.mipmapUtils === null ) {
441
413
 
442
- }
414
+ this.mipmapUtils = new WebGPUTextureMipmapUtils( this.backend.device );
443
415
 
444
- } else if ( texture.isRenderTargetTexture ) {
416
+ }
445
417
 
446
- if ( needsMipmaps === true ) this._generateMipmaps( textureGPU, textureGPUDescriptor );
418
+ this.mipmapUtils.generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer );
447
419
 
448
- } else if ( texture.isDepthTexture !== true && image !== null ) {
420
+ }
449
421
 
450
- this._copyImageToTexture( image, texture, textureGPU, textureGPUDescriptor, needsMipmaps );
422
+ _getImageBitmapFromHTML( image, texture ) {
451
423
 
452
- }
424
+ const width = image.width;
425
+ const height = image.height;
453
426
 
454
- //
427
+ const options = {};
455
428
 
456
- textureProperties.textureGPU = textureGPU;
457
- textureProperties.version = texture.version;
429
+ options.imageOrientation = ( texture.flipY === true ) ? 'flipY' : 'none';
430
+ options.premultiplyAlpha = ( texture.premultiplyAlpha === true ) ? 'premultiply' : 'default';
458
431
 
459
- return needsUpdate;
432
+ return createImageBitmap( image, 0, 0, width, height, options );
460
433
 
461
434
  }
462
435
 
463
- _copyBufferToTexture( image, textureGPU, textureGPUDescriptor, needsMipmaps, originDepth = 0 ) {
436
+ _copyBufferToTexture( image, textureGPU, textureDescriptorGPU, needsMipmaps, originDepth = 0 ) {
464
437
 
465
438
  // @TODO: Consider to use GPUCommandEncoder.copyBufferToTexture()
466
439
  // @TODO: Consider to support valid buffer layouts with other formats like RGB
467
440
 
441
+ const device = this.backend.device;
442
+
468
443
  const data = image.data;
469
444
 
470
- const bytesPerTexel = this._getBytesPerTexel( textureGPUDescriptor.format );
445
+ const bytesPerTexel = this._getBytesPerTexel( textureDescriptorGPU.format );
471
446
  const bytesPerRow = image.width * bytesPerTexel;
472
447
 
473
- this.device.queue.writeTexture(
448
+ device.queue.writeTexture(
474
449
  {
475
450
  texture: textureGPU,
476
451
  mipLevel: 0,
@@ -487,55 +462,17 @@ class WebGPUTextures {
487
462
  depthOrArrayLayers: ( image.depth !== undefined ) ? image.depth : 1
488
463
  } );
489
464
 
490
- if ( needsMipmaps === true ) this._generateMipmaps( textureGPU, textureGPUDescriptor, originDepth );
491
-
492
- }
493
-
494
- _copyCubeMapToTexture( images, texture, textureGPU, textureGPUDescriptor, needsMipmaps ) {
495
-
496
- for ( let i = 0; i < 6; i ++ ) {
497
-
498
- const image = images[ i ];
499
-
500
- if ( image.isDataTexture ) {
501
-
502
- this._copyBufferToTexture( image.image, textureGPU, textureGPUDescriptor, needsMipmaps, i );
503
-
504
- } else {
505
-
506
- this._copyImageToTexture( image, texture, textureGPU, textureGPUDescriptor, needsMipmaps, i );
507
-
508
- }
509
-
510
- }
511
-
512
- }
513
-
514
- _copyExternalImageToTexture( image, textureGPU, textureGPUDescriptor, needsMipmaps, originDepth = 0 ) {
515
-
516
- this.device.queue.copyExternalImageToTexture(
517
- {
518
- source: image
519
- }, {
520
- texture: textureGPU,
521
- mipLevel: 0,
522
- origin: { x: 0, y: 0, z: originDepth }
523
- }, {
524
- width: image.width,
525
- height: image.height,
526
- depthOrArrayLayers: 1
527
- }
528
- );
529
-
530
- if ( needsMipmaps ) this._generateMipmaps( textureGPU, textureGPUDescriptor, originDepth );
465
+ if ( needsMipmaps === true ) this._generateMipmaps( textureGPU, textureDescriptorGPU, originDepth );
531
466
 
532
467
  }
533
468
 
534
- _copyCompressedBufferToTexture( mipmaps, textureGPU, textureGPUDescriptor ) {
469
+ _copyCompressedBufferToTexture( mipmaps, textureGPU, textureDescriptorGPU ) {
535
470
 
536
471
  // @TODO: Consider to use GPUCommandEncoder.copyBufferToTexture()
537
472
 
538
- const blockData = this._getBlockData( textureGPUDescriptor.format );
473
+ const device = this.backend.device;
474
+
475
+ const blockData = this._getBlockData( textureDescriptorGPU.format );
539
476
 
540
477
  for ( let i = 0; i < mipmaps.length; i ++ ) {
541
478
 
@@ -546,7 +483,7 @@ class WebGPUTextures {
546
483
 
547
484
  const bytesPerRow = Math.ceil( width / blockData.width ) * blockData.byteLength;
548
485
 
549
- this.device.queue.writeTexture(
486
+ device.queue.writeTexture(
550
487
  {
551
488
  texture: textureGPU,
552
489
  mipLevel: i
@@ -567,18 +504,6 @@ class WebGPUTextures {
567
504
 
568
505
  }
569
506
 
570
- _generateMipmaps( textureGPU, textureGPUDescriptor, baseArrayLayer ) {
571
-
572
- if ( this.utils === null ) {
573
-
574
- this.utils = new WebGPUTextureUtils( this.device ); // only create this helper if necessary
575
-
576
- }
577
-
578
- this.utils.generateMipmaps( textureGPU, textureGPUDescriptor, baseArrayLayer );
579
-
580
- }
581
-
582
507
  _getBlockData( format ) {
583
508
 
584
509
  // this method is only relevant for compressed texture formats
@@ -616,6 +541,76 @@ class WebGPUTextures {
616
541
 
617
542
  }
618
543
 
544
+ _convertAddressMode( value ) {
545
+
546
+ let addressMode = GPUAddressMode.ClampToEdge;
547
+
548
+ if ( value === RepeatWrapping ) {
549
+
550
+ addressMode = GPUAddressMode.Repeat;
551
+
552
+ } else if ( value === MirroredRepeatWrapping ) {
553
+
554
+ addressMode = GPUAddressMode.MirrorRepeat;
555
+
556
+ }
557
+
558
+ return addressMode;
559
+
560
+ }
561
+
562
+ _convertFilterMode( value ) {
563
+
564
+ let filterMode = GPUFilterMode.Linear;
565
+
566
+ if ( value === NearestFilter || value === NearestMipmapNearestFilter || value === NearestMipmapLinearFilter ) {
567
+
568
+ filterMode = GPUFilterMode.Nearest;
569
+
570
+ }
571
+
572
+ return filterMode;
573
+
574
+ }
575
+
576
+ _getSize( texture ) {
577
+
578
+ const image = texture.image;
579
+
580
+ let width, height, depth;
581
+
582
+ if ( texture.isCubeTexture ) {
583
+
584
+ const faceImage = image.length > 0 ? image[ 0 ].image || image[ 0 ] : null;
585
+
586
+ width = faceImage ? faceImage.width : 1;
587
+ height = faceImage ? faceImage.height : 1;
588
+ depth = 6; // one image for each side of the cube map
589
+
590
+ } else if ( image !== null ) {
591
+
592
+ width = image.width;
593
+ height = image.height;
594
+ depth = ( image.depth !== undefined ) ? image.depth : 1;
595
+
596
+ } else {
597
+
598
+ width = height = depth = 1;
599
+
600
+ }
601
+
602
+ return { width, height, depth };
603
+
604
+ }
605
+
606
+ _needsMipmaps( texture ) {
607
+
608
+ if ( this._isEnvironmentTexture( texture ) ) return true;
609
+
610
+ return ( texture.isCompressedTexture !== true ) /*&& ( texture.generateMipmaps === true )*/ && ( texture.minFilter !== NearestFilter ) && ( texture.minFilter !== LinearFilter );
611
+
612
+ }
613
+
619
614
  _getBytesPerTexel( format ) {
620
615
 
621
616
  if ( format === GPUTextureFormat.R8Unorm ) return 1;
@@ -630,6 +625,42 @@ class WebGPUTextures {
630
625
 
631
626
  }
632
627
 
628
+ _getTypedArrayType( format ) {
629
+
630
+ if ( format === GPUTextureFormat.R8Uint ) return Uint8Array;
631
+ if ( format === GPUTextureFormat.R8Sint ) return Int8Array;
632
+ if ( format === GPUTextureFormat.R8Unorm ) return Uint8Array;
633
+ if ( format === GPUTextureFormat.R8Snorm ) return Int8Array;
634
+ if ( format === GPUTextureFormat.RG8Uint ) return Uint8Array;
635
+ if ( format === GPUTextureFormat.RG8Sint ) return Int8Array;
636
+ if ( format === GPUTextureFormat.RG8Unorm ) return Uint8Array;
637
+ if ( format === GPUTextureFormat.RG8Snorm ) return Int8Array;
638
+ if ( format === GPUTextureFormat.RGBA8Uint ) return Uint8Array;
639
+ if ( format === GPUTextureFormat.RGBA8Sint ) return Int8Array;
640
+ if ( format === GPUTextureFormat.RGBA8Unorm ) return Uint8Array;
641
+ if ( format === GPUTextureFormat.RGBA8Snorm ) return Int8Array;
642
+
643
+
644
+ if ( format === GPUTextureFormat.R16Uint ) return Uint16Array;
645
+ if ( format === GPUTextureFormat.R16Sint ) return Int16Array;
646
+ if ( format === GPUTextureFormat.RG16Uint ) return Uint16Array;
647
+ if ( format === GPUTextureFormat.RG16Sint ) return Int16Array;
648
+ if ( format === GPUTextureFormat.RGBA16Uint ) return Uint16Array;
649
+ if ( format === GPUTextureFormat.RGBA16Sint ) return Int16Array;
650
+
651
+
652
+ if ( format === GPUTextureFormat.R32Uint ) return Uint32Array;
653
+ if ( format === GPUTextureFormat.R32Sint ) return Int32Array;
654
+ if ( format === GPUTextureFormat.R32Float ) return Float32Array;
655
+ if ( format === GPUTextureFormat.RG32Uint ) return Uint32Array;
656
+ if ( format === GPUTextureFormat.RG32Sint ) return Int32Array;
657
+ if ( format === GPUTextureFormat.RG32Float ) return Float32Array;
658
+ if ( format === GPUTextureFormat.RGBA32Uint ) return Uint32Array;
659
+ if ( format === GPUTextureFormat.RGBA32Sint ) return Int32Array;
660
+ if ( format === GPUTextureFormat.RGBA32Float ) return Float32Array;
661
+
662
+ }
663
+
633
664
  _getDimension( texture ) {
634
665
 
635
666
  let dimension;
@@ -648,6 +679,28 @@ class WebGPUTextures {
648
679
 
649
680
  }
650
681
 
682
+ _getMipLevelCount( texture, width, height, needsMipmaps ) {
683
+
684
+ let mipLevelCount;
685
+
686
+ if ( texture.isCompressedTexture ) {
687
+
688
+ mipLevelCount = texture.mipmaps.length;
689
+
690
+ } else if ( needsMipmaps ) {
691
+
692
+ mipLevelCount = Math.floor( Math.log2( Math.max( width, height ) ) ) + 1;
693
+
694
+ } else {
695
+
696
+ mipLevelCount = 1; // a texture without mipmaps has a base mip (mipLevel 0)
697
+
698
+ }
699
+
700
+ return mipLevelCount;
701
+
702
+ }
703
+
651
704
  _getFormat( texture ) {
652
705
 
653
706
  const format = texture.format;
@@ -656,7 +709,11 @@ class WebGPUTextures {
656
709
 
657
710
  let formatGPU;
658
711
 
659
- if ( texture.isCompressedTexture === true ) {
712
+ if ( /*texture.isRenderTargetTexture === true ||*/ texture.isFramebufferTexture === true ) {
713
+
714
+ formatGPU = GPUTextureFormat.BGRA8Unorm;
715
+
716
+ } else if ( texture.isCompressedTexture === true ) {
660
717
 
661
718
  switch ( format ) {
662
719
 
@@ -875,176 +932,6 @@ class WebGPUTextures {
875
932
 
876
933
  }
877
934
 
878
- _isHTMLImage( image ) {
879
-
880
- return ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement );
881
-
882
- }
883
-
884
- _copyImageToTexture( image, texture, textureGPU, textureGPUDescriptor, needsMipmaps, originDepth ) {
885
-
886
- if ( this._isHTMLImage( image ) ) {
887
-
888
- this._getImageBitmapFromHTML( image, texture ).then( imageBitmap => {
889
-
890
- this._copyExternalImageToTexture( imageBitmap, textureGPU, textureGPUDescriptor, needsMipmaps, originDepth );
891
-
892
- } );
893
-
894
- } else {
895
-
896
- // assume ImageBitmap
897
-
898
- this._copyExternalImageToTexture( image, textureGPU, textureGPUDescriptor, needsMipmaps, originDepth );
899
-
900
- }
901
-
902
- }
903
-
904
- _getImageBitmapFromHTML( image, texture ) {
905
-
906
- const width = image.width;
907
- const height = image.height;
908
-
909
- const options = {};
910
-
911
- options.imageOrientation = ( texture.flipY === true ) ? 'flipY' : 'none';
912
- options.premultiplyAlpha = ( texture.premultiplyAlpha === true ) ? 'premultiply' : 'default';
913
-
914
- return createImageBitmap( image, 0, 0, width, height, options );
915
-
916
- }
917
-
918
- _getImageBitmap( image, texture ) {
919
-
920
- const width = image.width;
921
- const height = image.height;
922
-
923
- if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||
924
- ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ) {
925
-
926
- const options = {};
927
-
928
- options.imageOrientation = ( texture.flipY === true ) ? 'flipY' : 'none';
929
- options.premultiplyAlpha = ( texture.premultiplyAlpha === true ) ? 'premultiply' : 'default';
930
-
931
- return createImageBitmap( image, 0, 0, width, height, options );
932
-
933
- } else {
934
-
935
- // assume ImageBitmap
936
-
937
- return Promise.resolve( image );
938
-
939
- }
940
-
941
- }
942
-
943
- _getMipLevelCount( texture, width, height, needsMipmaps ) {
944
-
945
- let mipLevelCount;
946
-
947
- if ( texture.isCompressedTexture ) {
948
-
949
- mipLevelCount = texture.mipmaps.length;
950
-
951
- } else if ( needsMipmaps ) {
952
-
953
- mipLevelCount = Math.floor( Math.log2( Math.max( width, height ) ) ) + 1;
954
-
955
- } else {
956
-
957
- mipLevelCount = 1; // a texture without mipmaps has a base mip (mipLevel 0)
958
-
959
- }
960
-
961
- return mipLevelCount;
962
-
963
- }
964
-
965
- _getSize( texture ) {
966
-
967
- const image = texture.image;
968
-
969
- let width, height, depth;
970
-
971
- if ( texture.isCubeTexture ) {
972
-
973
- const faceImage = image.length > 0 ? image[ 0 ].image || image[ 0 ] : null;
974
-
975
- width = faceImage ? faceImage.width : 1;
976
- height = faceImage ? faceImage.height : 1;
977
- depth = 6; // one image for each side of the cube map
978
-
979
- } else if ( image !== null ) {
980
-
981
- width = image.width;
982
- height = image.height;
983
- depth = ( image.depth !== undefined ) ? image.depth : 1;
984
-
985
- } else {
986
-
987
- width = height = depth = 1;
988
-
989
- }
990
-
991
- return { width, height, depth };
992
-
993
- }
994
-
995
- _needsMipmaps( texture ) {
996
-
997
- return ( texture.isCompressedTexture !== true ) && ( texture.generateMipmaps === true ) && ( texture.minFilter !== NearestFilter ) && ( texture.minFilter !== LinearFilter );
998
-
999
- }
1000
-
1001
- }
1002
-
1003
- function onRenderTargetDispose( event ) {
1004
-
1005
- const renderTarget = event.target;
1006
- const properties = this.properties;
1007
-
1008
- const renderTargetProperties = properties.get( renderTarget );
1009
-
1010
- renderTarget.removeEventListener( 'dispose', renderTargetProperties.disposeCallback );
1011
-
1012
- renderTargetProperties.colorTextureGPU.destroy();
1013
- properties.remove( renderTarget.texture );
1014
-
1015
- this.info.memory.textures --;
1016
-
1017
- if ( renderTarget.depthBuffer === true ) {
1018
-
1019
- renderTargetProperties.depthTextureGPU.destroy();
1020
-
1021
- this.info.memory.textures --;
1022
-
1023
- if ( renderTarget.depthTexture !== null ) {
1024
-
1025
- properties.remove( renderTarget.depthTexture );
1026
-
1027
- }
1028
-
1029
- }
1030
-
1031
- properties.remove( renderTarget );
1032
-
1033
- }
1034
-
1035
- function onTextureDispose( event ) {
1036
-
1037
- const texture = event.target;
1038
-
1039
- const textureProperties = this.properties.get( texture );
1040
- textureProperties.textureGPU.destroy();
1041
-
1042
- texture.removeEventListener( 'dispose', textureProperties.disposeCallback );
1043
-
1044
- this.properties.remove( texture );
1045
-
1046
- this.info.memory.textures --;
1047
-
1048
935
  }
1049
936
 
1050
- export default WebGPUTextures;
937
+ export default WebGPUTextureUtils;