KHR_texture_transform.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { Nullable } from "babylonjs/types";
  2. import { BaseTexture } from "babylonjs/Materials/Textures/baseTexture";
  3. import { Texture } from "babylonjs/Materials/Textures/texture";
  4. import { ITextureInfo, TextureDataType } from "../glTFLoaderInterfaces";
  5. import { IGLTFLoaderExtension } from "../glTFLoaderExtension";
  6. import { GLTFLoader } from "../glTFLoader";
  7. import { IKHRTextureTransform } from 'babylonjs-gltf2interface';
  8. const NAME = "KHR_texture_transform";
  9. /**
  10. * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_transform)
  11. */
  12. export class KHR_texture_transform implements IGLTFLoaderExtension {
  13. /**
  14. * The name of this extension.
  15. */
  16. public readonly name = NAME;
  17. /**
  18. * Defines whether this extension is enabled.
  19. */
  20. public enabled: boolean;
  21. private _loader: GLTFLoader;
  22. /** @hidden */
  23. constructor(loader: GLTFLoader) {
  24. this._loader = loader;
  25. this.enabled = this._loader.isExtensionUsed(NAME);
  26. }
  27. /** @hidden */
  28. public dispose() {
  29. (this._loader as any) = null;
  30. }
  31. /** @hidden */
  32. public loadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void, textureDataType: TextureDataType = TextureDataType.Color): Nullable<Promise<BaseTexture>> {
  33. return GLTFLoader.LoadExtensionAsync<IKHRTextureTransform, BaseTexture>(context, textureInfo, this.name, (extensionContext, extension) => {
  34. return this._loader.loadTextureInfoAsync(context, textureInfo, (babylonTexture) => {
  35. if (!(babylonTexture instanceof Texture)) {
  36. throw new Error(`${extensionContext}: Texture type not supported`);
  37. }
  38. if (extension.offset) {
  39. babylonTexture.uOffset = extension.offset[0];
  40. babylonTexture.vOffset = extension.offset[1];
  41. }
  42. // Always rotate around the origin.
  43. babylonTexture.uRotationCenter = 0;
  44. babylonTexture.vRotationCenter = 0;
  45. if (extension.rotation) {
  46. babylonTexture.wAng = -extension.rotation;
  47. }
  48. if (extension.scale) {
  49. babylonTexture.uScale = extension.scale[0];
  50. babylonTexture.vScale = extension.scale[1];
  51. }
  52. if (extension.texCoord != undefined) {
  53. babylonTexture.coordinatesIndex = extension.texCoord;
  54. }
  55. assign(babylonTexture);
  56. }, textureDataType);
  57. });
  58. }
  59. }
  60. GLTFLoader.RegisterExtension(NAME, (loader) => new KHR_texture_transform(loader));