(
url: string,
onLoad: (data: Data3DTexture) => void,
onProgress?: (event: ProgressEvent) => void,
onError?: (error: unknown) => void
)
| 8 | |
| 9 | export class Texture3DLoader extends Loader<Data3DTexture> { |
| 10 | override load( |
| 11 | url: string, |
| 12 | onLoad: (data: Data3DTexture) => void, |
| 13 | onProgress?: (event: ProgressEvent) => void, |
| 14 | onError?: (error: unknown) => void |
| 15 | ): void { |
| 16 | const loader = new ImageLoader(this.manager) |
| 17 | loader.setRequestHeader(this.requestHeader) |
| 18 | loader.setPath(this.path) |
| 19 | loader.setWithCredentials(this.withCredentials) |
| 20 | loader.load( |
| 21 | url, |
| 22 | image => { |
| 23 | const canvas = document.createElement('canvas') |
| 24 | const context = canvas.getContext('2d') |
| 25 | if (context == null) { |
| 26 | onError?.(new Error('Could not obtain canvas context.')) |
| 27 | return |
| 28 | } |
| 29 | |
| 30 | // Assume cubic 3D texture. |
| 31 | const { width, height } = image |
| 32 | const size = Math.min(width, height) |
| 33 | canvas.width = width |
| 34 | canvas.height = height |
| 35 | context.drawImage(image, 0, 0) |
| 36 | const imageData = context.getImageData(0, 0, width, height).data |
| 37 | let data: Uint8Array |
| 38 | |
| 39 | if (width < height) { |
| 40 | data = new Uint8Array(imageData.buffer) |
| 41 | } else { |
| 42 | data = new Uint8Array(imageData.length) |
| 43 | const sizeSq = size ** 2 |
| 44 | for (let z = 0; z < size; ++z) { |
| 45 | for (let y = 0; y < size; ++y) { |
| 46 | for (let x = 0; x < size; ++x) { |
| 47 | const src = (x + z * size + y * sizeSq) * 4 |
| 48 | const dest = (x + y * size + z * sizeSq) * 4 |
| 49 | data[dest + 0] = imageData[src + 0] |
| 50 | data[dest + 1] = imageData[src + 1] |
| 51 | data[dest + 2] = imageData[src + 2] |
| 52 | data[dest + 3] = imageData[src + 3] |
| 53 | } |
| 54 | } |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | const texture = new Data3DTexture(data, size, size, size) |
| 59 | texture.minFilter = LinearFilter |
| 60 | texture.magFilter = LinearFilter |
| 61 | texture.wrapS = RepeatWrapping |
| 62 | texture.wrapT = RepeatWrapping |
| 63 | texture.wrapR = RepeatWrapping |
| 64 | texture.needsUpdate = true |
| 65 | |
| 66 | try { |
| 67 | onLoad(texture) |
nothing calls this directly
no outgoing calls
no test coverage detected