|
@@ -170,7 +170,6 @@
|
|
|
public etc1: any; //WEBGL_compressed_texture_etc1;
|
|
|
public etc2: any; //WEBGL_compressed_texture_etc;
|
|
|
public astc: any; //WEBGL_compressed_texture_astc;
|
|
|
- public atc: any; //WEBGL_compressed_texture_atc;
|
|
|
public textureFloat: boolean;
|
|
|
public vertexArrayObject: boolean;
|
|
|
public textureAnisotropicFilterExtension: EXT_texture_filter_anisotropic;
|
|
@@ -641,10 +640,9 @@
|
|
|
this._caps.astc = this._gl.getExtension('WEBGL_compressed_texture_astc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_astc');
|
|
|
this._caps.s3tc = this._gl.getExtension('WEBGL_compressed_texture_s3tc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');
|
|
|
this._caps.pvrtc = this._gl.getExtension('WEBGL_compressed_texture_pvrtc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');
|
|
|
- this._caps.etc1 = this._gl.getExtension('WEBGL_compressed_texture_etc1') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_etc1');
|
|
|
- this._caps.etc2 = this._gl.getExtension('WEBGL_compressed_texture_etc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_etc') ||
|
|
|
- this._gl.getExtension('WEBGL_compressed_texture_es3_0'); // also a requirement of OpenGL ES 3
|
|
|
- this._caps.atc = this._gl.getExtension('WEBGL_compressed_texture_atc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_atc');
|
|
|
+ this._caps.etc1 = this._gl.getExtension('WEBGL_compressed_texture_etc1' ) || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_etc1' );
|
|
|
+ this._caps.etc2 = this._gl.getExtension('WEBGL_compressed_texture_etc' ) || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_etc' ) ||
|
|
|
+ this._gl.getExtension('WEBGL_compressed_texture_es3_0'); // also a requirement of OpenGL ES 3
|
|
|
|
|
|
this._caps.textureAnisotropicFilterExtension = this._gl.getExtension('EXT_texture_filter_anisotropic') || this._gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic') || this._gl.getExtension('MOZ_EXT_texture_filter_anisotropic');
|
|
|
this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0;
|
|
@@ -702,13 +700,11 @@
|
|
|
// Next PVRTC & DXT, which are probably superior to ETC1/2.
|
|
|
// Likely no hardware which supports both PVR & DXT, so order matters little.
|
|
|
// ETC2 is newer and handles ETC1 (no alpha capability), so check for first.
|
|
|
- // ATC before ETC1, since both old (widely supported), but ATC supports alpha, but ETC1 does not
|
|
|
- if (this._caps.astc) this.texturesSupported.push('-astc.ktx');
|
|
|
- if (this._caps.s3tc) this.texturesSupported.push('-dxt.ktx');
|
|
|
+ if (this._caps.astc ) this.texturesSupported.push('-astc.ktx');
|
|
|
+ if (this._caps.s3tc ) this.texturesSupported.push('-dxt.ktx');
|
|
|
if (this._caps.pvrtc) this.texturesSupported.push('-pvrtc.ktx');
|
|
|
- if (this._caps.etc2) this.texturesSupported.push('-etc2.ktx');
|
|
|
- if (this._caps.atc) this.texturesSupported.push('-atc.ktx');
|
|
|
- if (this._caps.etc1) this.texturesSupported.push('-etc1.ktx');
|
|
|
+ if (this._caps.etc2 ) this.texturesSupported.push('-etc2.ktx');
|
|
|
+ if (this._caps.etc1 ) this.texturesSupported.push('-etc1.ktx');
|
|
|
|
|
|
if (this._gl.getShaderPrecisionFormat) {
|
|
|
var highp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);
|
|
@@ -2109,7 +2105,7 @@
|
|
|
* @param {Array<string>} formatsAvailable- The list of those format families you have created
|
|
|
* on your server. Syntax: '-' + format family + '.ktx'. (Case and order do not matter.)
|
|
|
*
|
|
|
- * Current families are astc, dxt, pvrtc, etc2, atc, & etc1.
|
|
|
+ * Current families are astc, dxt, pvrtc, etc2, & etc1.
|
|
|
* @returns The extension selected.
|
|
|
*/
|
|
|
public setTextureFormatToUse(formatsAvailable: Array<string>): string {
|
|
@@ -2125,35 +2121,48 @@
|
|
|
return this._textureFormatInUse = null;
|
|
|
}
|
|
|
|
|
|
- public createTexture(urlArg: string, noMipmap: boolean, invertY: boolean, scene: Scene, samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE, onLoad: () => void = null, onError: () => void = null, buffer: any = null, fallBack?: WebGLTexture, format?: number): WebGLTexture {
|
|
|
+ /**
|
|
|
+ * Usually called from BABYLON.Texture.ts. Passed information to create a WebGLTexture.
|
|
|
+ * @param {string} urlArg- This contains one of the following:
|
|
|
+ * 1. A conventional http URL, e.g. 'http://...' or 'file://...'
|
|
|
+ * 2. A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'
|
|
|
+ * 3. An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'
|
|
|
+ *
|
|
|
+ * @param {boolean} noMipmap- When true, no mipmaps shall be generated. Ignored for compressed textures. They must be in the file.
|
|
|
+ * @param {boolean} invertY- When true, image is flipped when loaded. You probably want true. Ignored for compressed textures. Must be flipped in the file.
|
|
|
+ * @param {Scene} scene- Needed for loading to the correct scene.
|
|
|
+ * @param {number} samplingMode- Mode with should be used sample / access the texture. Default: TRILINEAR
|
|
|
+ * @param {callback} onLoad- Optional callback to be called upon successful completion.
|
|
|
+ * @param {callback} onError- Optional callback to be called upon failure.
|
|
|
+ * @param {ArrayBuffer | HTMLImageElement} buffer- A source of a file previously fetched as either an ArrayBuffer (compressed or image format) or HTMLImageElement (image format)
|
|
|
+ * @param {WebGLTexture} fallback- An internal argument in case the function must be called again, due to etc1 not having alpha capabilities.
|
|
|
+ * @param {number} format- Internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures.
|
|
|
+ *
|
|
|
+ * @returns {WebGLTexture} for assignment back into BABYLON.Texture
|
|
|
+ */
|
|
|
+ public createTexture(urlArg: string, noMipmap: boolean, invertY: boolean, scene: Scene, samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE, onLoad: () => void = null, onError: () => void = null, buffer: ArrayBuffer | HTMLImageElement = null, fallBack?: WebGLTexture, format?: number): WebGLTexture {
|
|
|
var texture = fallBack ? fallBack : this._gl.createTexture();
|
|
|
|
|
|
- var extension: string;
|
|
|
- var isKTX = false;
|
|
|
- var fromData: any = false;
|
|
|
- var url = String(urlArg);
|
|
|
- if (url.substr(0, 5) === "data:") {
|
|
|
- fromData = true;
|
|
|
- }
|
|
|
|
|
|
- if (!fromData) {
|
|
|
- var lastDot = url.lastIndexOf('.')
|
|
|
- extension = url.substring(lastDot).toLowerCase();
|
|
|
- if (this._textureFormatInUse && !fromData && !fallBack) {
|
|
|
- extension = this._textureFormatInUse;
|
|
|
- url = url.substring(0, lastDot) + this._textureFormatInUse;
|
|
|
- isKTX = true;
|
|
|
-
|
|
|
- }
|
|
|
- } else {
|
|
|
- var oldUrl = url;
|
|
|
- fromData = oldUrl.split(':');
|
|
|
- url = oldUrl;
|
|
|
- extension = fromData[1].substr(fromData[1].length - 4, 4).toLowerCase();
|
|
|
- }
|
|
|
+ var url = String(urlArg); // assign a new string, so that the original is still available in case of fallback
|
|
|
+ var fromData = url.substr(0, 5) === "data:";
|
|
|
+ var isBase64 = fromData && url.indexOf("base64") !== -1;
|
|
|
|
|
|
+ // establish the file extension, if possible
|
|
|
+ var lastDot = url.lastIndexOf('.');
|
|
|
+ var extension = (lastDot > 0) ? url.substring(lastDot).toLowerCase() : "";
|
|
|
var isDDS = this.getCaps().s3tc && (extension === ".dds");
|
|
|
+ if (isDDS) {
|
|
|
+ BABYLON.Tools.Warn("DDS files deprecated since 3.0, use KTX files");
|
|
|
+ }
|
|
|
var isTGA = (extension === ".tga");
|
|
|
+
|
|
|
+ // determine if a ktx file should be substituted
|
|
|
+ var isKTX = false;
|
|
|
+ if (this._textureFormatInUse && !isBase64 && !fallBack) {
|
|
|
+ url = url.substring(0, lastDot) + this._textureFormatInUse;
|
|
|
+ isKTX = true;
|
|
|
+ }
|
|
|
|
|
|
scene._addPendingData(texture);
|
|
|
texture.url = url;
|
|
@@ -2161,6 +2170,7 @@
|
|
|
texture.references = 1;
|
|
|
texture.samplingMode = samplingMode;
|
|
|
texture.onLoadedCallbacks = [];
|
|
|
+
|
|
|
if (onLoad) {
|
|
|
texture.onLoadedCallbacks.push(onLoad);
|
|
|
}
|
|
@@ -2171,12 +2181,15 @@
|
|
|
|
|
|
// fallback for when compressed file not found to try again. For instance, etc1 does not have an alpha capable type
|
|
|
if (isKTX) {
|
|
|
- this.createTexture(urlArg, noMipmap, invertY, scene, samplingMode, onLoad, onError, buffer, texture);
|
|
|
+ this.createTexture(urlArg, noMipmap, invertY, scene, samplingMode, null, onError, buffer, texture);
|
|
|
} else if (onError) {
|
|
|
onError();
|
|
|
}
|
|
|
};
|
|
|
+
|
|
|
var callback: (arrayBuffer: any) => void;
|
|
|
+
|
|
|
+ // processing for non-image formats
|
|
|
if (isKTX || isTGA || isDDS) {
|
|
|
if (isKTX) {
|
|
|
callback = (data) => {
|
|
@@ -2209,13 +2222,14 @@
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- if (!(fromData instanceof Array))
|
|
|
- Tools.LoadFile(url, data => {
|
|
|
- callback(data);
|
|
|
- }, null, scene.database, true, onerror);
|
|
|
- else
|
|
|
- callback(buffer);
|
|
|
-
|
|
|
+ if (!buffer) {
|
|
|
+ Tools.LoadFile(url, data => {
|
|
|
+ callback(data);
|
|
|
+ }, null, scene.database, true, onerror);
|
|
|
+ } else {
|
|
|
+ callback(buffer);
|
|
|
+ }
|
|
|
+ // image format processing
|
|
|
} else {
|
|
|
var onload = (img) => {
|
|
|
prepareWebGLTexture(texture, this._gl, scene, img.width, img.height, invertY, noMipmap, false, (potWidth, potHeight) => {
|
|
@@ -2244,16 +2258,19 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- let internalFormat = format ? this._getInternalFormat(format) : this._gl.RGBA;
|
|
|
+ let internalFormat = format ? this._getInternalFormat(format) : ((extension === ".jpg") ? this._gl.RGB :this._gl.RGBA);
|
|
|
this._gl.texImage2D(this._gl.TEXTURE_2D, 0, internalFormat, internalFormat, this._gl.UNSIGNED_BYTE, isPot ? img : this._workingCanvas);
|
|
|
}, samplingMode);
|
|
|
};
|
|
|
|
|
|
|
|
|
- if (!(fromData instanceof Array))
|
|
|
+ if (!fromData || isBase64)
|
|
|
Tools.LoadImage(url, onload, onerror, scene.database);
|
|
|
- else
|
|
|
+ else if (buffer instanceof Array)
|
|
|
Tools.LoadImage(buffer, onload, onerror, scene.database);
|
|
|
+ else
|
|
|
+ onload(buffer);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
return texture;
|
|
@@ -2707,6 +2724,9 @@
|
|
|
isKTX = true;
|
|
|
}
|
|
|
var isDDS = this.getCaps().s3tc && (extension === ".dds");
|
|
|
+ if (isDDS) {
|
|
|
+ BABYLON.Tools.Warn("DDS files deprecated since 3.0, use KTX files");
|
|
|
+ }
|
|
|
|
|
|
if (isKTX) {
|
|
|
Tools.LoadFile(rootUrl, data => {
|