KHR_texture_transform.ts 2.7 KB

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