CompressedTextureLoader.js 2.6 KB
Newer Older
B
bentok 已提交
1 2 3
import { LinearFilter } from '../constants.js';
import { FileLoader } from './FileLoader.js';
import { CompressedTexture } from '../textures/CompressedTexture.js';
4
import { Loader } from './Loader.js';
R
Rich Harris 已提交
5

M
Mr.doob 已提交
6 7
/**
 * Abstract Base class to block based textures loader (dds, pvr, ...)
M
Mugen87 已提交
8 9
 *
 * Sub classes have to implement the parse() method which will be used in load().
P
Pierre Lepers 已提交
10 11
 */

12
class CompressedTextureLoader extends Loader {
13

14
	constructor( manager ) {
M
Mr.doob 已提交
15

16
		super( manager );
17

18
	}
P
Pierre Lepers 已提交
19

20
	load( url, onLoad, onProgress, onError ) {
P
Pierre Lepers 已提交
21

M
Mugen87 已提交
22
		const scope = this;
P
Pierre Lepers 已提交
23

M
Mugen87 已提交
24
		const images = [];
P
Pierre Lepers 已提交
25

M
Mugen87 已提交
26
		const texture = new CompressedTexture();
P
Pierre Lepers 已提交
27

M
Mugen87 已提交
28
		const loader = new FileLoader( this.manager );
M
Mr.doob 已提交
29
		loader.setPath( this.path );
M
Mr.doob 已提交
30
		loader.setResponseType( 'arraybuffer' );
31
		loader.setRequestHeader( this.requestHeader );
32
		loader.setWithCredentials( scope.withCredentials );
P
Pierre Lepers 已提交
33

M
Mugen87 已提交
34 35
		let loaded = 0;

36
		function loadTexture( i ) {
P
Pierre Lepers 已提交
37

38
			loader.load( url[ i ], function ( buffer ) {
P
Pierre Lepers 已提交
39

M
Mugen87 已提交
40
				const texDatas = scope.parse( buffer, true );
M
Mr.doob 已提交
41

42 43 44 45 46 47
				images[ i ] = {
					width: texDatas.width,
					height: texDatas.height,
					format: texDatas.format,
					mipmaps: texDatas.mipmaps
				};
P
Pierre Lepers 已提交
48

49
				loaded += 1;
P
Pierre Lepers 已提交
50

51
				if ( loaded === 6 ) {
P
Pierre Lepers 已提交
52

53
					if ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;
P
Pierre Lepers 已提交
54

55
					texture.image = images;
56 57
					texture.format = texDatas.format;
					texture.needsUpdate = true;
P
Pierre Lepers 已提交
58

59
					if ( onLoad ) onLoad( texture );
60

61
				}
P
Pierre Lepers 已提交
62

63
			}, onProgress, onError );
P
Pierre Lepers 已提交
64

65
		}
P
Pierre Lepers 已提交
66

67
		if ( Array.isArray( url ) ) {
P
Pierre Lepers 已提交
68

M
Mugen87 已提交
69
			for ( let i = 0, il = url.length; i < il; ++ i ) {
P
Pierre Lepers 已提交
70 71 72 73 74 75 76 77 78 79 80

				loadTexture( i );

			}

		} else {

			// compressed cubemap texture stored in a single DDS file

			loader.load( url, function ( buffer ) {

M
Mugen87 已提交
81
				const texDatas = scope.parse( buffer, true );
P
Pierre Lepers 已提交
82 83 84

				if ( texDatas.isCubemap ) {

M
Mugen87 已提交
85
					const faces = texDatas.mipmaps.length / texDatas.mipmapCount;
P
Pierre Lepers 已提交
86

M
Mugen87 已提交
87
					for ( let f = 0; f < faces; f ++ ) {
P
Pierre Lepers 已提交
88

M
Mugen87 已提交
89
						images[ f ] = { mipmaps: [] };
P
Pierre Lepers 已提交
90

M
Mugen87 已提交
91
						for ( let i = 0; i < texDatas.mipmapCount; i ++ ) {
P
Pierre Lepers 已提交
92 93 94 95 96 97 98 99 100 101

							images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );
							images[ f ].format = texDatas.format;
							images[ f ].width = texDatas.width;
							images[ f ].height = texDatas.height;

						}

					}

102 103
					texture.image = images;

P
Pierre Lepers 已提交
104 105 106 107 108 109 110 111
				} else {

					texture.image.width = texDatas.width;
					texture.image.height = texDatas.height;
					texture.mipmaps = texDatas.mipmaps;

				}

M
Mr.doob 已提交
112 113
				if ( texDatas.mipmapCount === 1 ) {

R
Rich Harris 已提交
114
					texture.minFilter = LinearFilter;
M
Mr.doob 已提交
115 116

				}
117

P
Pierre Lepers 已提交
118 119 120 121 122
				texture.format = texDatas.format;
				texture.needsUpdate = true;

				if ( onLoad ) onLoad( texture );

123
			}, onProgress, onError );
P
Pierre Lepers 已提交
124 125 126 127 128 129

		}

		return texture;

	}
M
Mr.doob 已提交
130

131
}
R
Rich Harris 已提交
132 133


134
export { CompressedTextureLoader };