-
Notifications
You must be signed in to change notification settings - Fork 3.5k
/
loadCRN.js
90 lines (83 loc) · 3.66 KB
/
loadCRN.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
define([
'../ThirdParty/when',
'./CompressedTextureBuffer',
'./defined',
'./DeveloperError',
'./Resource',
'./TaskProcessor'
], function(
when,
CompressedTextureBuffer,
defined,
DeveloperError,
Resource,
TaskProcessor) {
'use strict';
var transcodeTaskProcessor = new TaskProcessor('transcodeCRNToDXT', Number.POSITIVE_INFINITY);
/**
* Asynchronously loads and parses the given URL to a CRN file or parses the raw binary data of a CRN file.
* Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded,
* or reject if the URL failed to load or failed to parse the data. The data is loaded
* using XMLHttpRequest, which means that in order to make requests to another origin,
* the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
*
* @exports loadCRN
*
* @param {Resource|String|ArrayBuffer} resourceOrUrlOrBuffer The URL of the binary data or an ArrayBuffer.
* @returns {Promise.<CompressedTextureBuffer>|undefined} A promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
*
* @exception {RuntimeError} Unsupported compressed format.
*
* @example
* // load a single URL asynchronously
* Cesium.loadCRN('some/url').then(function(textureData) {
* var width = textureData.width;
* var height = textureData.height;
* var format = textureData.internalFormat;
* var arrayBufferView = textureData.bufferView;
* // use the data to create a texture
* }).otherwise(function(error) {
* // an error occurred
* });
*
* @see {@link https://github.com/BinomialLLC/crunch|crunch DXTc texture compression and transcoding library}
* @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
* @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
*/
function loadCRN(resourceOrUrlOrBuffer) {
//>>includeStart('debug', pragmas.debug);
if (!defined(resourceOrUrlOrBuffer)) {
throw new DeveloperError('resourceOrUrlOrBuffer is required.');
}
//>>includeEnd('debug');
var loadPromise;
if (resourceOrUrlOrBuffer instanceof ArrayBuffer || ArrayBuffer.isView(resourceOrUrlOrBuffer)) {
loadPromise = when.resolve(resourceOrUrlOrBuffer);
} else {
var resource = Resource.createIfNeeded(resourceOrUrlOrBuffer);
loadPromise = resource.fetchArrayBuffer();
}
if (!defined(loadPromise)) {
return undefined;
}
return loadPromise.then(function(data) {
if (!defined(data)) {
return;
}
var transferrableObjects = [];
if (data instanceof ArrayBuffer) {
transferrableObjects.push(data);
} else if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) {
transferrableObjects.push(data.buffer);
} else {
// data is a view of an array buffer. need to copy so it is transferrable to web worker
data = data.slice(0, data.length);
transferrableObjects.push(data.buffer);
}
return transcodeTaskProcessor.scheduleTask(data, transferrableObjects);
}).then(function(compressedTextureBuffer) {
return CompressedTextureBuffer.clone(compressedTextureBuffer);
});
}
return loadCRN;
});