babylon.glTFLoaderUtils.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /// <reference path="../../../../dist/preview release/babylon.d.ts"/>
  2. module BABYLON.GLTF2 {
  3. /**
  4. * Utils functions for GLTF
  5. */
  6. export class GLTFUtils {
  7. /**
  8. * If the uri is a base64 string
  9. * @param uri: the uri to test
  10. */
  11. public static IsBase64(uri: string): boolean {
  12. return uri.length < 5 ? false : uri.substr(0, 5) === "data:";
  13. }
  14. /**
  15. * Decode the base64 uri
  16. * @param uri: the uri to decode
  17. */
  18. public static DecodeBase64(uri: string): ArrayBuffer {
  19. const decodedString = atob(uri.split(",")[1]);
  20. const bufferLength = decodedString.length;
  21. const bufferView = new Uint8Array(new ArrayBuffer(bufferLength));
  22. for (let i = 0; i < bufferLength; i++) {
  23. bufferView[i] = decodedString.charCodeAt(i);
  24. }
  25. return bufferView.buffer;
  26. }
  27. public static ValidateUri(uri: string): boolean {
  28. return (uri.indexOf("..") === -1);
  29. }
  30. public static AssignIndices(array: Array<{index?: number}>): void {
  31. if (array) {
  32. for (let index = 0; index < array.length; index++) {
  33. array[index].index = index;
  34. }
  35. }
  36. }
  37. public static GetArrayItem<T>(array: ArrayLike<T>, index: number): T {
  38. if (!array || !array[index]) {
  39. return null;
  40. }
  41. return array[index];
  42. }
  43. public static GetTextureWrapMode(mode: ETextureWrapMode): number {
  44. // Set defaults if undefined
  45. mode = mode === undefined ? ETextureWrapMode.REPEAT : mode;
  46. switch (mode) {
  47. case ETextureWrapMode.CLAMP_TO_EDGE: return Texture.CLAMP_ADDRESSMODE;
  48. case ETextureWrapMode.MIRRORED_REPEAT: return Texture.MIRROR_ADDRESSMODE;
  49. case ETextureWrapMode.REPEAT: return Texture.WRAP_ADDRESSMODE;
  50. default:
  51. Tools.Warn("Invalid texture wrap mode (" + mode + ")");
  52. return Texture.WRAP_ADDRESSMODE;
  53. }
  54. }
  55. public static GetTextureSamplingMode(magFilter: ETextureMagFilter, minFilter: ETextureMinFilter): number {
  56. // Set defaults if undefined
  57. magFilter = magFilter === undefined ? ETextureMagFilter.LINEAR : magFilter;
  58. minFilter = minFilter === undefined ? ETextureMinFilter.LINEAR_MIPMAP_LINEAR : minFilter;
  59. if (magFilter === ETextureMagFilter.LINEAR) {
  60. switch (minFilter) {
  61. case ETextureMinFilter.NEAREST: return Texture.LINEAR_NEAREST;
  62. case ETextureMinFilter.LINEAR: return Texture.LINEAR_LINEAR;
  63. case ETextureMinFilter.NEAREST_MIPMAP_NEAREST: return Texture.LINEAR_NEAREST_MIPNEAREST;
  64. case ETextureMinFilter.LINEAR_MIPMAP_NEAREST: return Texture.LINEAR_LINEAR_MIPNEAREST;
  65. case ETextureMinFilter.NEAREST_MIPMAP_LINEAR: return Texture.LINEAR_NEAREST_MIPLINEAR;
  66. case ETextureMinFilter.LINEAR_MIPMAP_LINEAR: return Texture.LINEAR_LINEAR_MIPLINEAR;
  67. default:
  68. Tools.Warn("Invalid texture minification filter (" + minFilter + ")");
  69. return Texture.LINEAR_LINEAR_MIPLINEAR;
  70. }
  71. }
  72. else {
  73. if (magFilter !== ETextureMagFilter.NEAREST) {
  74. Tools.Warn("Invalid texture magnification filter (" + magFilter + ")");
  75. }
  76. switch (minFilter) {
  77. case ETextureMinFilter.NEAREST: return Texture.NEAREST_NEAREST;
  78. case ETextureMinFilter.LINEAR: return Texture.NEAREST_LINEAR;
  79. case ETextureMinFilter.NEAREST_MIPMAP_NEAREST: return Texture.NEAREST_NEAREST_MIPNEAREST;
  80. case ETextureMinFilter.LINEAR_MIPMAP_NEAREST: return Texture.NEAREST_LINEAR_MIPNEAREST;
  81. case ETextureMinFilter.NEAREST_MIPMAP_LINEAR: return Texture.NEAREST_NEAREST_MIPLINEAR;
  82. case ETextureMinFilter.LINEAR_MIPMAP_LINEAR: return Texture.NEAREST_LINEAR_MIPLINEAR;
  83. default:
  84. Tools.Warn("Invalid texture minification filter (" + minFilter + ")");
  85. return Texture.NEAREST_NEAREST_MIPNEAREST;
  86. }
  87. }
  88. }
  89. }
  90. }