UNPKG

three

Version:

JavaScript 3D library

79 lines (55 loc) 2.17 kB
import { QuadMesh, NodeMaterial, WebGPURenderer, CanvasTexture } from 'three'; import { texture, uv } from 'three/tsl'; /** @module WebGPUTextureUtils */ let _renderer; const _quadMesh = /*@__PURE__*/ new QuadMesh(); /** * Returns an uncompressed version of the given compressed texture. * * This module can only be used with {@link WebGPURenderer}. When using {@link WebGLRenderer}, * import the function from {@link WebGLTextureUtils}. * * @async * @param {CompressedTexture} blitTexture - The compressed texture. * @param {number} [maxTextureSize=Infinity] - The maximum size of the uncompressed texture. * @param {?WebGPURenderer} [renderer=null] - A reference to a renderer. * @return {Promise<CanvasTexture>} A Promise that resolved with the uncompressed texture. */ export async function decompress( blitTexture, maxTextureSize = Infinity, renderer = null ) { if ( renderer === null ) { renderer = _renderer = new WebGPURenderer(); await renderer.init(); } const material = new NodeMaterial(); material.fragmentNode = texture( blitTexture, uv().flipY() ); const width = Math.min( blitTexture.image.width, maxTextureSize ); const height = Math.min( blitTexture.image.height, maxTextureSize ); const currentOutputColorSpace = renderer.outputColorSpace; renderer.setSize( width, height ); renderer.outputColorSpace = blitTexture.colorSpace; _quadMesh.material = material; _quadMesh.render( renderer ); renderer.outputColorSpace = currentOutputColorSpace; const canvas = document.createElement( 'canvas' ); const context = canvas.getContext( '2d' ); canvas.width = width; canvas.height = height; context.drawImage( renderer.domElement, 0, 0, width, height ); const readableTexture = new CanvasTexture( canvas ); readableTexture.minFilter = blitTexture.minFilter; readableTexture.magFilter = blitTexture.magFilter; readableTexture.wrapS = blitTexture.wrapS; readableTexture.wrapT = blitTexture.wrapT; readableTexture.colorSpace = blitTexture.colorSpace; readableTexture.name = blitTexture.name; if ( _renderer !== null ) { _renderer.dispose(); _renderer = null; } return readableTexture; }