///
module BABYLON.GLTF2 {
/**
* Utils functions for GLTF
*/
export class GLTFUtils {
/**
* If the uri is a base64 string
* @param uri: the uri to test
*/
public static IsBase64(uri: string): boolean {
return uri.length < 5 ? false : uri.substr(0, 5) === "data:";
}
/**
* Decode the base64 uri
* @param uri: the uri to decode
*/
public static DecodeBase64(uri: string): ArrayBuffer {
const decodedString = atob(uri.split(",")[1]);
const bufferLength = decodedString.length;
const bufferView = new Uint8Array(new ArrayBuffer(bufferLength));
for (let i = 0; i < bufferLength; i++) {
bufferView[i] = decodedString.charCodeAt(i);
}
return bufferView.buffer;
}
public static ValidateUri(uri: string): boolean {
return (uri.indexOf("..") === -1);
}
public static AssignIndices(array: Array<{index?: number}>): void {
if (array) {
for (let index = 0; index < array.length; index++) {
array[index].index = index;
}
}
}
public static GetArrayItem(array: ArrayLike, index: number): T {
if (!array || !array[index]) {
return null;
}
return array[index];
}
public static GetTextureWrapMode(mode: ETextureWrapMode): number {
// Set defaults if undefined
mode = mode === undefined ? ETextureWrapMode.REPEAT : mode;
switch (mode) {
case ETextureWrapMode.CLAMP_TO_EDGE: return Texture.CLAMP_ADDRESSMODE;
case ETextureWrapMode.MIRRORED_REPEAT: return Texture.MIRROR_ADDRESSMODE;
case ETextureWrapMode.REPEAT: return Texture.WRAP_ADDRESSMODE;
default:
Tools.Warn("Invalid texture wrap mode (" + mode + ")");
return Texture.WRAP_ADDRESSMODE;
}
}
public static GetTextureSamplingMode(magFilter: ETextureMagFilter, minFilter: ETextureMinFilter): number {
// Set defaults if undefined
magFilter = magFilter === undefined ? ETextureMagFilter.LINEAR : magFilter;
minFilter = minFilter === undefined ? ETextureMinFilter.LINEAR_MIPMAP_LINEAR : minFilter;
if (magFilter === ETextureMagFilter.LINEAR) {
switch (minFilter) {
case ETextureMinFilter.NEAREST: return Texture.LINEAR_NEAREST;
case ETextureMinFilter.LINEAR: return Texture.LINEAR_LINEAR;
case ETextureMinFilter.NEAREST_MIPMAP_NEAREST: return Texture.LINEAR_NEAREST_MIPNEAREST;
case ETextureMinFilter.LINEAR_MIPMAP_NEAREST: return Texture.LINEAR_LINEAR_MIPNEAREST;
case ETextureMinFilter.NEAREST_MIPMAP_LINEAR: return Texture.LINEAR_NEAREST_MIPLINEAR;
case ETextureMinFilter.LINEAR_MIPMAP_LINEAR: return Texture.LINEAR_LINEAR_MIPLINEAR;
default:
Tools.Warn("Invalid texture minification filter (" + minFilter + ")");
return Texture.LINEAR_LINEAR_MIPLINEAR;
}
}
else {
if (magFilter !== ETextureMagFilter.NEAREST) {
Tools.Warn("Invalid texture magnification filter (" + magFilter + ")");
}
switch (minFilter) {
case ETextureMinFilter.NEAREST: return Texture.NEAREST_NEAREST;
case ETextureMinFilter.LINEAR: return Texture.NEAREST_LINEAR;
case ETextureMinFilter.NEAREST_MIPMAP_NEAREST: return Texture.NEAREST_NEAREST_MIPNEAREST;
case ETextureMinFilter.LINEAR_MIPMAP_NEAREST: return Texture.NEAREST_LINEAR_MIPNEAREST;
case ETextureMinFilter.NEAREST_MIPMAP_LINEAR: return Texture.NEAREST_NEAREST_MIPLINEAR;
case ETextureMinFilter.LINEAR_MIPMAP_LINEAR: return Texture.NEAREST_LINEAR_MIPLINEAR;
default:
Tools.Warn("Invalid texture minification filter (" + minFilter + ")");
return Texture.NEAREST_NEAREST_MIPNEAREST;
}
}
}
}
}