babylon.glTFLoaderUtils.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. var decodedString = atob(uri.split(",")[1]);
  20. var bufferLength = decodedString.length;
  21. var bufferView = new Uint8Array(new ArrayBuffer(bufferLength));
  22. for (var i = 0; i < bufferLength; i++) {
  23. bufferView[i] = decodedString.charCodeAt(i);
  24. }
  25. return bufferView.buffer;
  26. }
  27. /**
  28. * Returns the wrap mode of the texture
  29. * @param mode: the mode value
  30. */
  31. public static GetWrapMode(mode: number): number {
  32. switch (mode) {
  33. case ETextureWrapMode.CLAMP_TO_EDGE: return Texture.CLAMP_ADDRESSMODE;
  34. case ETextureWrapMode.MIRRORED_REPEAT: return Texture.MIRROR_ADDRESSMODE;
  35. case ETextureWrapMode.REPEAT: return Texture.WRAP_ADDRESSMODE;
  36. default: return Texture.WRAP_ADDRESSMODE;
  37. }
  38. }
  39. /**
  40. * Returns the byte stride giving an accessor
  41. * @param accessor: the GLTF accessor objet
  42. */
  43. public static GetByteStrideFromType(accessor: IGLTFAccessor): number {
  44. // Needs this function since "byteStride" isn't requiered in glTF format
  45. var type = accessor.type;
  46. switch (type) {
  47. case "VEC2": return 2;
  48. case "VEC3": return 3;
  49. case "VEC4": return 4;
  50. case "MAT2": return 4;
  51. case "MAT3": return 9;
  52. case "MAT4": return 16;
  53. default: return 1;
  54. }
  55. }
  56. /**
  57. * Returns the texture filter mode giving a mode value
  58. * @param mode: the filter mode value
  59. */
  60. public static GetTextureFilterMode(mode: number): ETextureMinFilter {
  61. switch (mode) {
  62. case ETextureMinFilter.LINEAR:
  63. case ETextureMinFilter.LINEAR_MIPMAP_NEAREST:
  64. case ETextureMinFilter.LINEAR_MIPMAP_LINEAR: return Texture.TRILINEAR_SAMPLINGMODE;
  65. case ETextureMinFilter.NEAREST:
  66. case ETextureMinFilter.NEAREST_MIPMAP_NEAREST: return Texture.NEAREST_SAMPLINGMODE;
  67. default: return Texture.BILINEAR_SAMPLINGMODE;
  68. }
  69. }
  70. public static GetBufferFromBufferView(runtime: IGLTFRuntime, bufferView: IGLTFBufferView, byteOffset: number, byteLength: number, componentType: EComponentType): ArrayBufferView {
  71. byteOffset += (bufferView.byteOffset || 0);
  72. var loadedBufferView = runtime.gltf.buffers[bufferView.buffer].loadedBufferView;
  73. if (byteOffset + byteLength > loadedBufferView.byteLength) {
  74. throw new Error("Buffer access is out of range");
  75. }
  76. var buffer = loadedBufferView.buffer;
  77. byteOffset += loadedBufferView.byteOffset;
  78. switch (componentType) {
  79. case EComponentType.BYTE: return new Int8Array(buffer, byteOffset, byteLength);
  80. case EComponentType.UNSIGNED_BYTE: return new Uint8Array(buffer, byteOffset, byteLength);
  81. case EComponentType.SHORT: return new Int16Array(buffer, byteOffset, byteLength);
  82. case EComponentType.UNSIGNED_SHORT: return new Uint16Array(buffer, byteOffset, byteLength);
  83. case EComponentType.UNSIGNED_INT: return new Uint32Array(buffer, byteOffset, byteLength);
  84. default: return new Float32Array(buffer, byteOffset, byteLength);
  85. }
  86. }
  87. /**
  88. * Returns a buffer from its accessor
  89. * @param runtime: the GLTF runtime
  90. * @param accessor: the GLTF accessor
  91. */
  92. public static GetBufferFromAccessor(runtime: IGLTFRuntime, accessor: IGLTFAccessor): ArrayBufferView {
  93. var bufferView = runtime.gltf.bufferViews[accessor.bufferView];
  94. var byteOffset = accessor.byteOffset || 0;
  95. var byteLength = accessor.count * GLTFUtils.GetByteStrideFromType(accessor);
  96. return GLTFUtils.GetBufferFromBufferView(runtime, bufferView, byteOffset, byteLength, accessor.componentType);
  97. }
  98. /**
  99. * Decodes a buffer view into a string
  100. * @param view: the buffer view
  101. */
  102. public static DecodeBufferToText(view: ArrayBufferView): string {
  103. var result = "";
  104. var length = view.byteLength;
  105. for (var i = 0; i < length; ++i) {
  106. result += String.fromCharCode(view[i]);
  107. }
  108. return result;
  109. }
  110. /**
  111. * Returns the default material of gltf.
  112. * @param scene: the Babylon.js scene
  113. */
  114. public static GetDefaultMaterial(runtime: IGLTFRuntime): PBRMaterial {
  115. if (!runtime.defaultMaterial) {
  116. var material = new PBRMaterial("gltf_default", runtime.babylonScene);
  117. material.sideOrientation = Material.CounterClockWiseSideOrientation;
  118. material.metallic = 1;
  119. material.roughness = 1;
  120. runtime.defaultMaterial = material;
  121. }
  122. return runtime.defaultMaterial;
  123. }
  124. }
  125. }