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.
- package/build/three.cjs +778 -557
- package/build/three.js +778 -557
- package/build/three.min.js +1 -1
- package/build/three.module.js +769 -539
- package/build/three.module.min.js +1 -1
- package/examples/jsm/cameras/CinematicCamera.js +1 -2
- package/examples/jsm/capabilities/WebGPU.js +15 -1
- package/examples/jsm/controls/ArcballControls.js +2 -1
- package/examples/jsm/controls/FlyControls.js +25 -9
- package/examples/jsm/controls/OrbitControls.js +5 -1
- package/examples/jsm/csm/CSM.js +1 -3
- package/examples/jsm/effects/AnaglyphEffect.js +6 -20
- package/examples/jsm/effects/OutlineEffect.js +1 -1
- package/examples/jsm/effects/ParallaxBarrierEffect.js +3 -0
- package/examples/jsm/environments/RoomEnvironment.js +6 -2
- package/examples/jsm/exporters/GLTFExporter.js +74 -2
- package/examples/jsm/exporters/USDZExporter.js +170 -129
- package/examples/jsm/helpers/ViewHelper.js +1 -1
- package/examples/jsm/lines/LineMaterial.js +1 -1
- package/examples/jsm/loaders/3DMLoader.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +5 -1
- package/examples/jsm/loaders/ColladaLoader.js +4 -1
- package/examples/jsm/loaders/DRACOLoader.js +2 -0
- package/examples/jsm/loaders/FBXLoader.js +9 -2
- package/examples/jsm/loaders/GLTFLoader.js +230 -94
- package/examples/jsm/loaders/KTX2Loader.js +106 -47
- package/examples/jsm/loaders/LDrawLoader.js +4 -7
- package/examples/jsm/loaders/MMDLoader.js +40 -13
- package/examples/jsm/loaders/PCDLoader.js +25 -10
- package/examples/jsm/loaders/PDBLoader.js +7 -2
- package/examples/jsm/loaders/PLYLoader.js +30 -8
- package/examples/jsm/loaders/STLLoader.js +8 -3
- package/examples/jsm/loaders/VRMLLoader.js +55 -7
- package/examples/jsm/loaders/VTKLoader.js +12 -4
- package/examples/jsm/loaders/XYZLoader.js +9 -3
- package/examples/jsm/materials/MeshGouraudMaterial.js +2 -2
- package/examples/jsm/math/Lut.js +5 -4
- package/examples/jsm/math/MeshSurfaceSampler.js +82 -37
- package/examples/jsm/misc/GPUComputationRenderer.js +1 -0
- package/examples/jsm/misc/VolumeSlice.js +3 -1
- package/examples/jsm/nodes/Nodes.js +22 -16
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +99 -0
- package/examples/jsm/nodes/accessors/BufferNode.js +2 -2
- package/examples/jsm/nodes/accessors/CameraNode.js +25 -4
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +7 -1
- package/examples/jsm/nodes/accessors/InstanceNode.js +29 -12
- package/examples/jsm/nodes/accessors/MaterialNode.js +55 -47
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -2
- package/examples/jsm/nodes/accessors/ModelNode.js +3 -1
- package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +4 -9
- package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
- package/examples/jsm/nodes/accessors/NormalNode.js +3 -2
- package/examples/jsm/nodes/accessors/Object3DNode.js +10 -2
- package/examples/jsm/nodes/accessors/ReferenceNode.js +2 -2
- package/examples/jsm/nodes/accessors/SceneNode.js +46 -0
- package/examples/jsm/nodes/accessors/SkinningNode.js +43 -62
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +2 -2
- package/examples/jsm/nodes/accessors/TangentNode.js +2 -2
- package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +68 -6
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
- package/examples/jsm/nodes/accessors/UVNode.js +1 -1
- package/examples/jsm/nodes/code/CodeNode.js +3 -0
- package/examples/jsm/nodes/code/FunctionNode.js +25 -4
- package/examples/jsm/nodes/core/AttributeNode.js +1 -1
- package/examples/jsm/nodes/core/BypassNode.js +2 -2
- package/examples/jsm/nodes/core/ContextNode.js +2 -0
- package/examples/jsm/nodes/core/IndexNode.js +66 -0
- package/examples/jsm/nodes/core/LightingModel.js +2 -1
- package/examples/jsm/nodes/core/Node.js +13 -16
- package/examples/jsm/nodes/core/NodeAttribute.js +2 -1
- package/examples/jsm/nodes/core/NodeBuilder.js +86 -8
- package/examples/jsm/nodes/core/NodeUtils.js +10 -0
- package/examples/jsm/nodes/core/PropertyNode.js +6 -2
- package/examples/jsm/nodes/core/StackNode.js +8 -1
- package/examples/jsm/nodes/core/UniformNode.js +1 -1
- package/examples/jsm/nodes/core/VarNode.js +1 -3
- package/examples/jsm/nodes/display/BlendModeNode.js +9 -9
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +7 -7
- package/examples/jsm/nodes/display/ColorSpaceNode.js +50 -49
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -3
- package/examples/jsm/nodes/display/ToneMappingNode.js +24 -15
- package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +7 -6
- package/examples/jsm/nodes/display/ViewportTextureNode.js +33 -19
- package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +5 -5
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -8
- package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
- package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
- package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +4 -4
- package/examples/jsm/nodes/functions/BSDF/D_GGX.js +2 -2
- package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
- package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +2 -4
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
- package/examples/jsm/nodes/functions/PhongLightingModel.js +7 -7
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +132 -19
- package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +2 -2
- package/examples/jsm/nodes/functions/material/getRoughness.js +3 -3
- package/examples/jsm/nodes/geometry/RangeNode.js +33 -51
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +6 -3
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -2
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +107 -62
- package/examples/jsm/nodes/lighting/HemisphereLightNode.js +2 -2
- package/examples/jsm/nodes/lighting/LightUtils.js +2 -2
- package/examples/jsm/nodes/lighting/LightingContextNode.js +17 -15
- package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
- package/examples/jsm/nodes/lighting/SpotLightNode.js +3 -3
- package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -15
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -15
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -10
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -9
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +41 -0
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +1 -14
- package/examples/jsm/nodes/materials/NodeMaterial.js +119 -29
- package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -9
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
- package/examples/jsm/nodes/materialx/lib/mx_hsv.js +3 -3
- package/examples/jsm/nodes/materialx/lib/mx_noise.js +14 -14
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +4 -4
- package/examples/jsm/nodes/math/MathNode.js +6 -0
- package/examples/jsm/nodes/math/OperatorNode.js +1 -1
- package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
- package/examples/jsm/nodes/shadernode/ShaderNode.js +60 -33
- package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -3
- package/examples/jsm/nodes/utils/LoopNode.js +186 -0
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +1 -1
- package/examples/jsm/objects/GroundProjectedSkybox.js +1 -1
- package/examples/jsm/objects/Lensflare.js +3 -4
- package/examples/jsm/objects/MarchingCubes.js +5 -1
- package/examples/jsm/objects/Reflector.js +4 -1
- package/examples/jsm/objects/Refractor.js +1 -1
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/Water.js +2 -1
- package/examples/jsm/objects/Water2.js +1 -1
- package/examples/jsm/offscreen/scene.js +1 -0
- package/examples/jsm/physics/RapierPhysics.js +93 -133
- package/examples/jsm/postprocessing/AfterimagePass.js +3 -0
- package/examples/jsm/postprocessing/BloomPass.js +7 -2
- package/examples/jsm/postprocessing/BokehPass.js +3 -2
- package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
- package/examples/jsm/postprocessing/EffectComposer.js +4 -1
- package/examples/jsm/postprocessing/FilmPass.js +1 -0
- package/examples/jsm/postprocessing/OutlinePass.js +8 -9
- package/examples/jsm/postprocessing/OutputPass.js +72 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +4 -3
- package/examples/jsm/postprocessing/SAOPass.js +4 -2
- package/examples/jsm/postprocessing/SMAAPass.js +5 -2
- package/examples/jsm/postprocessing/SSAARenderPass.js +5 -13
- package/examples/jsm/postprocessing/SSAOPass.js +4 -2
- package/examples/jsm/postprocessing/SSRPass.js +3 -1
- package/examples/jsm/postprocessing/SavePass.js +5 -2
- package/examples/jsm/postprocessing/ShaderPass.js +1 -0
- package/examples/jsm/postprocessing/TAARenderPass.js +17 -4
- package/examples/jsm/postprocessing/TexturePass.js +2 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +13 -13
- package/examples/jsm/renderers/{webgpu/WebGPUAnimation.js → common/Animation.js} +2 -2
- package/examples/jsm/renderers/common/Attributes.js +75 -0
- package/examples/jsm/renderers/common/Backend.js +162 -0
- package/examples/jsm/renderers/common/Background.js +134 -0
- package/examples/jsm/renderers/common/Binding.js +11 -0
- package/examples/jsm/renderers/common/Bindings.js +169 -0
- package/examples/jsm/renderers/common/Buffer.js +38 -0
- package/examples/jsm/renderers/{webgpu/WebGPUBufferUtils.js → common/BufferUtils.js} +2 -2
- package/examples/jsm/renderers/{webgpu/WebGPUWeakMap.js → common/ChainMap.js} +11 -5
- package/examples/jsm/renderers/common/ComputePipeline.js +17 -0
- package/examples/jsm/renderers/common/Constants.js +14 -0
- package/examples/jsm/renderers/common/CubeRenderTarget.js +65 -0
- package/examples/jsm/renderers/common/DataMap.js +54 -0
- package/examples/jsm/renderers/{webgpu/WebGPUGeometries.js → common/Geometries.js} +38 -37
- package/examples/jsm/renderers/{webgpu/WebGPUInfo.js → common/Info.js} +2 -3
- package/examples/jsm/renderers/common/Pipeline.js +13 -0
- package/examples/jsm/renderers/common/Pipelines.js +321 -0
- package/examples/jsm/renderers/common/ProgrammableStage.js +18 -0
- package/examples/jsm/renderers/common/RenderContext.js +37 -0
- package/examples/jsm/renderers/common/RenderContexts.js +38 -0
- package/examples/jsm/renderers/{webgpu/WebGPURenderLists.js → common/RenderList.js} +2 -39
- package/examples/jsm/renderers/common/RenderLists.js +38 -0
- package/examples/jsm/renderers/common/RenderObject.js +113 -0
- package/examples/jsm/renderers/common/RenderObjects.js +92 -0
- package/examples/jsm/renderers/common/RenderPipeline.js +16 -0
- package/examples/jsm/renderers/{webgpu/WebGPURenderTarget.js → common/RenderTarget.js} +2 -2
- package/examples/jsm/renderers/common/Renderer.js +864 -0
- package/examples/jsm/renderers/common/SampledTexture.js +80 -0
- package/examples/jsm/renderers/common/Sampler.js +18 -0
- package/examples/jsm/renderers/common/StorageBuffer.js +17 -0
- package/examples/jsm/renderers/common/Textures.js +206 -0
- package/examples/jsm/renderers/{webgpu/WebGPUUniform.js → common/Uniform.js} +13 -9
- package/examples/jsm/renderers/common/UniformBuffer.js +15 -0
- package/examples/jsm/renderers/{webgpu/WebGPUUniformsGroup.js → common/UniformsGroup.js} +13 -13
- package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodes.js → common/nodes/NodeRender.js} +3 -3
- package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampledTexture.js → common/nodes/NodeSampledTexture.js} +4 -4
- package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampler.js → common/nodes/NodeSampler.js} +3 -3
- package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeUniform.js → common/nodes/NodeUniform.js} +1 -1
- package/examples/jsm/renderers/common/nodes/Nodes.js +319 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
- package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +23 -19
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +847 -0
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +15 -1131
- package/examples/jsm/renderers/webgpu/nodes/{WebGPUNodeBuilder.js → WGSLNodeBuilder.js} +75 -45
- package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeFunction.js +2 -2
- package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeParser.js +1 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +255 -0
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +145 -0
- package/examples/jsm/renderers/webgpu/{constants.js → utils/WebGPUConstants.js} +6 -7
- package/examples/jsm/renderers/webgpu/{WebGPURenderPipeline.js → utils/WebGPUPipelineUtils.js} +154 -247
- package/examples/jsm/renderers/webgpu/{WebGPUTextureUtils.js → utils/WebGPUTextureMipmapUtils.js} +3 -25
- package/examples/jsm/renderers/webgpu/{WebGPUTextures.js → utils/WebGPUTextureUtils.js} +392 -505
- package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +92 -0
- package/examples/jsm/shaders/BleachBypassShader.js +2 -0
- package/examples/jsm/shaders/BlendShader.js +1 -2
- package/examples/jsm/shaders/BokehShader2.js +3 -0
- package/examples/jsm/shaders/ColorifyShader.js +2 -0
- package/examples/jsm/shaders/ConvolutionShader.js +2 -0
- package/examples/jsm/shaders/CopyShader.js +4 -2
- package/examples/jsm/shaders/DotScreenShader.js +2 -0
- package/examples/jsm/shaders/ExposureShader.js +44 -0
- package/examples/jsm/shaders/FilmShader.js +2 -0
- package/examples/jsm/shaders/GammaCorrectionShader.js +2 -0
- package/examples/jsm/shaders/HorizontalBlurShader.js +2 -0
- package/examples/jsm/shaders/OutputShader.js +61 -0
- package/examples/jsm/shaders/RGBShiftShader.js +2 -0
- package/examples/jsm/shaders/SepiaShader.js +2 -0
- package/examples/jsm/shaders/ToonShader.js +13 -5
- package/examples/jsm/shaders/VerticalBlurShader.js +2 -0
- package/examples/jsm/shaders/VignetteShader.js +2 -0
- package/examples/jsm/shaders/WaterRefractionShader.js +5 -2
- package/examples/jsm/utils/BufferGeometryUtils.js +17 -1
- package/examples/jsm/utils/TextureUtils.js +86 -0
- package/examples/jsm/webxr/OculusHandPointerModel.js +34 -13
- package/examples/jsm/webxr/XRHandPrimitiveModel.js +1 -0
- package/examples/jsm/webxr/XRPlanes.js +100 -0
- package/package.json +3 -1
- package/src/Three.Legacy.js +0 -228
- package/src/audio/PositionalAudio.js +8 -0
- package/src/cameras/Camera.js +5 -0
- package/src/cameras/CubeCamera.js +76 -13
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/constants.js +13 -1
- package/src/core/BufferAttribute.js +3 -25
- package/src/core/BufferGeometry.js +1 -8
- package/src/core/Object3D.js +1 -1
- package/src/extras/core/Curve.js +1 -1
- package/src/loaders/CubeTextureLoader.js +2 -0
- package/src/loaders/Loader.js +2 -0
- package/src/loaders/MaterialLoader.js +5 -0
- package/src/loaders/ObjectLoader.js +1 -0
- package/src/materials/Material.js +13 -1
- package/src/materials/MeshPhysicalMaterial.js +32 -6
- package/src/math/Color.js +16 -11
- package/src/math/Frustum.js +16 -2
- package/src/math/MathUtils.js +16 -0
- package/src/math/Matrix3.js +26 -6
- package/src/math/Matrix4.js +74 -19
- package/src/objects/InstancedMesh.js +3 -0
- package/src/objects/Mesh.js +14 -10
- package/src/objects/Skeleton.js +1 -3
- package/src/objects/SkinnedMesh.js +36 -8
- package/src/renderers/WebGLRenderer.js +126 -21
- package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
- package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +26 -3
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +9 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +26 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -2
- package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +10 -2
- package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/{output_fragment.glsl.js → opaque_fragment.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +3 -3
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +10 -5
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +6 -1
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +7 -1
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +6 -1
- package/src/renderers/shaders/ShaderChunk.js +10 -6
- package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/cube.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -2
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +12 -2
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/points.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/sprite.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib.js +4 -1
- package/src/renderers/shaders/UniformsLib.js +2 -0
- package/src/renderers/webgl/WebGLBindingStates.js +13 -5
- package/src/renderers/webgl/WebGLGeometries.js +12 -0
- package/src/renderers/webgl/WebGLInfo.js +0 -1
- package/src/renderers/webgl/WebGLMaterials.js +18 -0
- package/src/renderers/webgl/WebGLObjects.js +23 -3
- package/src/renderers/webgl/WebGLProgram.js +43 -5
- package/src/renderers/webgl/WebGLPrograms.js +19 -7
- package/src/renderers/webgl/WebGLTextures.js +19 -1
- package/src/renderers/webvr/WebVRManager.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +39 -99
- package/src/scenes/Scene.js +0 -14
- package/src/textures/DepthTexture.js +22 -0
- package/src/textures/FramebufferTexture.js +1 -3
- package/src/textures/Source.js +4 -0
- package/src/textures/Texture.js +1 -1
- package/examples/jsm/exporters/ColladaExporter.js +0 -725
- package/examples/jsm/geometries/LightningStrike.js +0 -1017
- package/examples/jsm/loaders/PRWMLoader.js +0 -299
- package/examples/jsm/nodes/core/InstanceIndexNode.js +0 -26
- package/examples/jsm/objects/LightningStorm.js +0 -245
- package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +0 -361
- package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +0 -197
- package/examples/jsm/renderers/webgpu/WebGPUBackground.js +0 -190
- package/examples/jsm/renderers/webgpu/WebGPUBinding.js +0 -22
- package/examples/jsm/renderers/webgpu/WebGPUBindings.js +0 -270
- package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +0 -43
- package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +0 -78
- package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +0 -22
- package/examples/jsm/renderers/webgpu/WebGPUProperties.js +0 -44
- package/examples/jsm/renderers/webgpu/WebGPURenderObject.js +0 -40
- package/examples/jsm/renderers/webgpu/WebGPURenderObjects.js +0 -50
- package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +0 -274
- package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +0 -54
- package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +0 -75
- package/examples/jsm/renderers/webgpu/WebGPUSampler.js +0 -29
- package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +0 -20
- package/examples/jsm/renderers/webgpu/WebGPUTextureRenderer.js +0 -38
- package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +0 -18
- package/examples/jsm/renderers/webgpu/WebGPUUtils.js +0 -88
- package/examples/jsm/shaders/ToneMapShader.js +0 -73
- /package/src/renderers/shaders/ShaderChunk/{encodings_fragment.glsl.js → colorspace_fragment.glsl.js} +0 -0
- /package/src/renderers/shaders/ShaderChunk/{encodings_pars_fragment.glsl.js → colorspace_pars_fragment.glsl.js} +0 -0
|
@@ -1,476 +1,451 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
16
|
+
import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
|
|
10
17
|
|
|
11
|
-
|
|
18
|
+
import WebGPUTextureMipmapUtils from './WebGPUTextureMipmapUtils.js';
|
|
12
19
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
33
|
+
constructor( backend ) {
|
|
31
34
|
|
|
32
|
-
|
|
35
|
+
this.backend = backend;
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
this.mipmapUtils = null;
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
this.defaultTexture = null;
|
|
40
|
+
this.defaultCubeTexture = null;
|
|
37
41
|
|
|
38
42
|
}
|
|
39
43
|
|
|
40
|
-
|
|
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
|
-
|
|
46
|
+
const backend = this.backend;
|
|
47
|
+
const device = backend.device;
|
|
59
48
|
|
|
60
|
-
|
|
49
|
+
const textureGPU = backend.get( texture );
|
|
61
50
|
|
|
62
|
-
|
|
63
|
-
texture.
|
|
64
|
-
texture.
|
|
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
|
-
|
|
61
|
+
if ( texture.isDepthTexture && texture.compareFunction !== null ) {
|
|
67
62
|
|
|
68
|
-
|
|
63
|
+
samplerDescriptorGPU.compare = _compareToWebGPU[ texture.compareFunction ];
|
|
69
64
|
|
|
70
65
|
}
|
|
71
66
|
|
|
72
|
-
|
|
67
|
+
textureGPU.sampler = device.createSampler( samplerDescriptorGPU );
|
|
73
68
|
|
|
74
69
|
}
|
|
75
70
|
|
|
76
|
-
|
|
71
|
+
createDefaultTexture( texture ) {
|
|
77
72
|
|
|
78
|
-
|
|
73
|
+
let textureGPU;
|
|
79
74
|
|
|
80
|
-
|
|
75
|
+
if ( texture.isCubeTexture ) {
|
|
81
76
|
|
|
82
|
-
|
|
83
|
-
texture.minFilter = NearestFilter;
|
|
84
|
-
texture.magFilter = NearestFilter;
|
|
77
|
+
textureGPU = this._getDefaultCubeTextureGPU();
|
|
85
78
|
|
|
86
|
-
|
|
79
|
+
} else {
|
|
87
80
|
|
|
88
|
-
|
|
81
|
+
textureGPU = this._getDefaultTextureGPU();
|
|
89
82
|
|
|
90
83
|
}
|
|
91
84
|
|
|
92
|
-
|
|
85
|
+
this.backend.get( texture ).texture = textureGPU;
|
|
93
86
|
|
|
94
87
|
}
|
|
95
88
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if ( this.defaultCubeTexture === null ) {
|
|
89
|
+
createTexture( texture, options = {} ) {
|
|
99
90
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
texture.magFilter = NearestFilter;
|
|
91
|
+
const backend = this.backend;
|
|
92
|
+
const textureData = backend.get( texture );
|
|
103
93
|
|
|
104
|
-
|
|
94
|
+
if ( textureData.initialized ) {
|
|
105
95
|
|
|
106
|
-
|
|
96
|
+
throw new Error( 'WebGPUTextureUtils: Texture already initialized.' );
|
|
107
97
|
|
|
108
98
|
}
|
|
109
99
|
|
|
110
|
-
|
|
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
|
-
|
|
109
|
+
let usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC;
|
|
115
110
|
|
|
116
|
-
|
|
111
|
+
if ( texture.isCompressedTexture !== true ) {
|
|
117
112
|
|
|
118
|
-
|
|
113
|
+
usage |= GPUTextureUsage.RENDER_ATTACHMENT;
|
|
119
114
|
|
|
120
|
-
|
|
115
|
+
}
|
|
121
116
|
|
|
122
|
-
|
|
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
|
-
|
|
131
|
+
// texture creation
|
|
125
132
|
|
|
126
|
-
|
|
133
|
+
if ( texture.isVideoTexture ) {
|
|
127
134
|
|
|
128
|
-
|
|
135
|
+
const video = texture.source.data;
|
|
136
|
+
const videoFrame = new VideoFrame( video );
|
|
129
137
|
|
|
130
|
-
|
|
138
|
+
textureDescriptorGPU.size.width = videoFrame.displayWidth;
|
|
139
|
+
textureDescriptorGPU.size.height = videoFrame.displayHeight;
|
|
131
140
|
|
|
132
|
-
|
|
141
|
+
videoFrame.close();
|
|
133
142
|
|
|
134
|
-
|
|
143
|
+
textureData.externalTexture = video;
|
|
135
144
|
|
|
136
|
-
|
|
145
|
+
} else {
|
|
137
146
|
|
|
138
|
-
|
|
147
|
+
textureData.texture = backend.device.createTexture( textureDescriptorGPU );
|
|
139
148
|
|
|
140
|
-
|
|
149
|
+
}
|
|
141
150
|
|
|
142
|
-
|
|
151
|
+
textureData.initialized = true;
|
|
143
152
|
|
|
144
|
-
|
|
153
|
+
textureData.needsMipmaps = needsMipmaps;
|
|
154
|
+
textureData.textureDescriptorGPU = textureDescriptorGPU;
|
|
145
155
|
|
|
146
|
-
|
|
156
|
+
}
|
|
147
157
|
|
|
148
|
-
|
|
158
|
+
destroyTexture( texture ) {
|
|
149
159
|
|
|
150
|
-
|
|
160
|
+
const backend = this.backend;
|
|
161
|
+
const textureData = backend.get( texture );
|
|
151
162
|
|
|
152
|
-
|
|
163
|
+
textureData.texture.destroy();
|
|
153
164
|
|
|
154
|
-
|
|
165
|
+
backend.delete( texture );
|
|
155
166
|
|
|
156
|
-
|
|
157
|
-
textureProperties.disposeCallback = disposeCallback;
|
|
167
|
+
}
|
|
158
168
|
|
|
159
|
-
|
|
169
|
+
destroySampler( texture ) {
|
|
160
170
|
|
|
161
|
-
|
|
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
|
-
|
|
178
|
+
generateMipmaps( texture ) {
|
|
168
179
|
|
|
169
|
-
|
|
180
|
+
const textureData = this.backend.get( texture );
|
|
170
181
|
|
|
171
|
-
|
|
182
|
+
if ( texture.isCubeTexture ) {
|
|
172
183
|
|
|
173
|
-
|
|
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
|
-
|
|
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
|
-
|
|
198
|
+
updateTexture( texture ) {
|
|
196
199
|
|
|
197
|
-
const
|
|
200
|
+
const textureData = this.backend.get( texture );
|
|
198
201
|
|
|
199
|
-
|
|
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
|
-
|
|
207
|
-
let samplerGPU = this.samplerCache.get( key );
|
|
204
|
+
// transfer texture data
|
|
208
205
|
|
|
209
|
-
if (
|
|
206
|
+
if ( texture.isDataTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {
|
|
210
207
|
|
|
211
|
-
|
|
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
|
-
|
|
210
|
+
} else if ( texture.isCompressedTexture ) {
|
|
222
211
|
|
|
223
|
-
|
|
212
|
+
this._copyCompressedBufferToTexture( texture.mipmaps, textureData.texture, textureDescriptorGPU );
|
|
224
213
|
|
|
225
|
-
|
|
226
|
-
textureProperties.samplerGPU = samplerGPU;
|
|
214
|
+
} else if ( texture.isCubeTexture ) {
|
|
227
215
|
|
|
228
|
-
|
|
216
|
+
if ( texture.image.length === 6 ) {
|
|
229
217
|
|
|
230
|
-
|
|
218
|
+
this._copyCubeMapToTexture( texture.image, texture, textureData.texture, textureDescriptorGPU, needsMipmaps );
|
|
231
219
|
|
|
232
|
-
|
|
233
|
-
const renderTargetProperties = properties.get( renderTarget );
|
|
220
|
+
}
|
|
234
221
|
|
|
235
|
-
if (
|
|
222
|
+
} else if ( texture.isRenderTargetTexture ) {
|
|
236
223
|
|
|
237
|
-
|
|
224
|
+
if ( needsMipmaps === true ) this._generateMipmaps( textureData.texture, textureDescriptorGPU );
|
|
238
225
|
|
|
239
|
-
|
|
240
|
-
const height = renderTarget.height;
|
|
226
|
+
} else if ( texture.isVideoTexture ) {
|
|
241
227
|
|
|
242
|
-
const
|
|
228
|
+
const video = texture.source.data;
|
|
243
229
|
|
|
244
|
-
|
|
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
|
-
|
|
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.
|
|
234
|
+
this._copyImageToTexture( texture.image, texture, textureData.texture, textureDescriptorGPU, needsMipmaps );
|
|
262
235
|
|
|
263
|
-
|
|
264
|
-
renderTargetProperties.colorTextureFormat = colorTextureFormat;
|
|
236
|
+
} else {
|
|
265
237
|
|
|
266
|
-
|
|
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
|
-
|
|
272
|
-
textureProperties.textureGPU = colorTextureGPU;
|
|
273
|
-
textureProperties.initializedRTT = false;
|
|
240
|
+
}
|
|
274
241
|
|
|
275
|
-
|
|
242
|
+
//
|
|
276
243
|
|
|
277
|
-
|
|
244
|
+
textureData.version = texture.version;
|
|
278
245
|
|
|
279
|
-
|
|
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
|
-
|
|
248
|
+
async copyTextureToBuffer( texture, x, y, width, height ) {
|
|
291
249
|
|
|
292
|
-
|
|
293
|
-
renderTargetProperties.depthTextureFormat = depthTextureFormat;
|
|
250
|
+
const device = this.backend.device;
|
|
294
251
|
|
|
295
|
-
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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
|
-
|
|
308
|
-
renderTargetProperties.disposeCallback = disposeCallback;
|
|
282
|
+
const typedArrayType = this._getTypedArrayType( format );
|
|
309
283
|
|
|
310
|
-
|
|
284
|
+
device.queue.submit( [ encoder.finish() ] );
|
|
311
285
|
|
|
312
|
-
|
|
286
|
+
await readBuffer.mapAsync( GPUMapMode.READ );
|
|
313
287
|
|
|
314
|
-
|
|
288
|
+
const buffer = readBuffer.getMappedRange();
|
|
315
289
|
|
|
316
|
-
|
|
290
|
+
return new typedArrayType( buffer );
|
|
317
291
|
|
|
318
292
|
}
|
|
319
293
|
|
|
320
|
-
|
|
294
|
+
_isEnvironmentTexture( texture ) {
|
|
295
|
+
|
|
296
|
+
const mapping = texture.mapping;
|
|
321
297
|
|
|
322
|
-
|
|
298
|
+
return ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) || ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );
|
|
323
299
|
|
|
324
300
|
}
|
|
325
301
|
|
|
326
|
-
|
|
302
|
+
_getDefaultTextureGPU() {
|
|
327
303
|
|
|
328
|
-
let
|
|
304
|
+
let defaultTexture = this.defaultTexture;
|
|
329
305
|
|
|
330
|
-
if (
|
|
306
|
+
if ( defaultTexture === null ) {
|
|
331
307
|
|
|
332
|
-
|
|
308
|
+
const texture = new Texture();
|
|
309
|
+
texture.minFilter = NearestFilter;
|
|
310
|
+
texture.magFilter = NearestFilter;
|
|
333
311
|
|
|
334
|
-
|
|
312
|
+
this.createTexture( texture );
|
|
335
313
|
|
|
336
|
-
|
|
314
|
+
this.defaultTexture = defaultTexture = texture;
|
|
337
315
|
|
|
338
316
|
}
|
|
339
317
|
|
|
340
|
-
return
|
|
318
|
+
return this.backend.get( defaultTexture ).texture;
|
|
341
319
|
|
|
342
320
|
}
|
|
343
321
|
|
|
344
|
-
|
|
322
|
+
_getDefaultCubeTextureGPU() {
|
|
345
323
|
|
|
346
|
-
let
|
|
324
|
+
let defaultCubeTexture = this.defaultTexture;
|
|
347
325
|
|
|
348
|
-
if (
|
|
326
|
+
if ( defaultCubeTexture === null ) {
|
|
349
327
|
|
|
350
|
-
|
|
328
|
+
const texture = new CubeTexture();
|
|
329
|
+
texture.minFilter = NearestFilter;
|
|
330
|
+
texture.magFilter = NearestFilter;
|
|
351
331
|
|
|
352
|
-
|
|
332
|
+
this.createTexture( texture );
|
|
353
333
|
|
|
354
|
-
|
|
334
|
+
this.defaultCubeTexture = defaultCubeTexture = texture;
|
|
355
335
|
|
|
356
|
-
|
|
336
|
+
}
|
|
357
337
|
|
|
358
|
-
|
|
338
|
+
return this.backend.get( defaultCubeTexture ).texture;
|
|
359
339
|
|
|
360
|
-
|
|
340
|
+
}
|
|
361
341
|
|
|
362
|
-
|
|
342
|
+
_copyImageToTexture( image, texture, textureGPU, textureDescriptorGPU, needsMipmaps, originDepth ) {
|
|
363
343
|
|
|
364
|
-
|
|
365
|
-
source: texture.source.data
|
|
366
|
-
} );
|
|
344
|
+
if ( this._isHTMLImage( image ) ) {
|
|
367
345
|
|
|
368
|
-
|
|
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
|
-
|
|
348
|
+
this._copyExternalImageToTexture( imageBitmap, textureGPU, textureDescriptorGPU, needsMipmaps, originDepth );
|
|
372
349
|
|
|
373
|
-
|
|
350
|
+
} );
|
|
374
351
|
|
|
375
|
-
|
|
352
|
+
} else {
|
|
376
353
|
|
|
377
|
-
|
|
354
|
+
// assume ImageBitmap
|
|
378
355
|
|
|
379
|
-
|
|
380
|
-
const image = texture.image;
|
|
356
|
+
this._copyExternalImageToTexture( image, textureGPU, textureDescriptorGPU, needsMipmaps, originDepth );
|
|
381
357
|
|
|
382
|
-
|
|
358
|
+
}
|
|
383
359
|
|
|
384
|
-
|
|
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
|
-
|
|
362
|
+
_isHTMLImage( image ) {
|
|
391
363
|
|
|
392
|
-
|
|
364
|
+
return ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement );
|
|
393
365
|
|
|
394
|
-
|
|
366
|
+
}
|
|
395
367
|
|
|
396
|
-
|
|
368
|
+
_copyCubeMapToTexture( images, texture, textureGPU, textureDescriptorGPU, needsMipmaps ) {
|
|
397
369
|
|
|
398
|
-
|
|
370
|
+
for ( let i = 0; i < 6; i ++ ) {
|
|
399
371
|
|
|
400
|
-
|
|
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
|
-
|
|
374
|
+
if ( image.isDataTexture ) {
|
|
415
375
|
|
|
416
|
-
|
|
376
|
+
this._copyBufferToTexture( image.image, textureGPU, textureDescriptorGPU, needsMipmaps, i );
|
|
417
377
|
|
|
418
|
-
|
|
378
|
+
} else {
|
|
419
379
|
|
|
420
|
-
|
|
380
|
+
this._copyImageToTexture( image, texture, textureGPU, textureDescriptorGPU, needsMipmaps, i );
|
|
421
381
|
|
|
422
|
-
|
|
382
|
+
}
|
|
423
383
|
|
|
424
384
|
}
|
|
425
385
|
|
|
426
|
-
|
|
386
|
+
}
|
|
427
387
|
|
|
428
|
-
|
|
388
|
+
_copyExternalImageToTexture( image, textureGPU, textureDescriptorGPU, needsMipmaps, originDepth = 0 ) {
|
|
429
389
|
|
|
430
|
-
|
|
390
|
+
const device = this.backend.device;
|
|
431
391
|
|
|
432
|
-
|
|
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
|
-
|
|
406
|
+
if ( needsMipmaps ) this._generateMipmaps( textureGPU, textureDescriptorGPU, originDepth );
|
|
435
407
|
|
|
436
|
-
|
|
408
|
+
}
|
|
437
409
|
|
|
438
|
-
|
|
410
|
+
_generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer = 0 ) {
|
|
439
411
|
|
|
440
|
-
|
|
412
|
+
if ( this.mipmapUtils === null ) {
|
|
441
413
|
|
|
442
|
-
|
|
414
|
+
this.mipmapUtils = new WebGPUTextureMipmapUtils( this.backend.device );
|
|
443
415
|
|
|
444
|
-
}
|
|
416
|
+
}
|
|
445
417
|
|
|
446
|
-
|
|
418
|
+
this.mipmapUtils.generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer );
|
|
447
419
|
|
|
448
|
-
|
|
420
|
+
}
|
|
449
421
|
|
|
450
|
-
|
|
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
|
-
|
|
457
|
-
|
|
429
|
+
options.imageOrientation = ( texture.flipY === true ) ? 'flipY' : 'none';
|
|
430
|
+
options.premultiplyAlpha = ( texture.premultiplyAlpha === true ) ? 'premultiply' : 'default';
|
|
458
431
|
|
|
459
|
-
return
|
|
432
|
+
return createImageBitmap( image, 0, 0, width, height, options );
|
|
460
433
|
|
|
461
434
|
}
|
|
462
435
|
|
|
463
|
-
_copyBufferToTexture( image, textureGPU,
|
|
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(
|
|
445
|
+
const bytesPerTexel = this._getBytesPerTexel( textureDescriptorGPU.format );
|
|
471
446
|
const bytesPerRow = image.width * bytesPerTexel;
|
|
472
447
|
|
|
473
|
-
|
|
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,
|
|
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,
|
|
469
|
+
_copyCompressedBufferToTexture( mipmaps, textureGPU, textureDescriptorGPU ) {
|
|
535
470
|
|
|
536
471
|
// @TODO: Consider to use GPUCommandEncoder.copyBufferToTexture()
|
|
537
472
|
|
|
538
|
-
const
|
|
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
|
-
|
|
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.
|
|
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
|
|
937
|
+
export default WebGPUTextureUtils;
|