import { QuadMesh, NodeMaterial, WebGPURenderer, CanvasTexture } from 'three'; import { texture, uv } from 'three/tsl'; let _renderer; const _quadMesh = /*@__PURE__*/ new QuadMesh(); 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( 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; }