KHR_texture_transform.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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/README.md)
  16. */
  17. export class KHR_texture_transform implements IGLTFLoaderExtension {
  18. /** The name of this extension. */
  19. public readonly name = NAME;
  20. /** Defines whether this extension is enabled. */
  21. public enabled: boolean;
  22. private _loader: GLTFLoader;
  23. /** @hidden */
  24. constructor(loader: GLTFLoader) {
  25. this._loader = loader;
  26. this.enabled = this._loader.isExtensionUsed(NAME);
  27. }
  28. /** @hidden */
  29. public dispose() {
  30. delete this._loader;
  31. }
  32. /** @hidden */
  33. public loadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void): Nullable<Promise<BaseTexture>> {
  34. return GLTFLoader.LoadExtensionAsync<IKHRTextureTransform, BaseTexture>(context, textureInfo, this.name, (extensionContext, extension) => {
  35. return this._loader.loadTextureInfoAsync(context, textureInfo, (babylonTexture) => {
  36. if (!(babylonTexture instanceof Texture)) {
  37. throw new Error(`${extensionContext}: Texture type not supported`);
  38. }
  39. if (extension.offset) {
  40. babylonTexture.uOffset = extension.offset[0];
  41. babylonTexture.vOffset = extension.offset[1];
  42. }
  43. // Always rotate around the origin.
  44. babylonTexture.uRotationCenter = 0;
  45. babylonTexture.vRotationCenter = 0;
  46. if (extension.rotation) {
  47. babylonTexture.wAng = -extension.rotation;
  48. }
  49. if (extension.scale) {
  50. babylonTexture.uScale = extension.scale[0];
  51. babylonTexture.vScale = extension.scale[1];
  52. }
  53. if (extension.texCoord != undefined) {
  54. babylonTexture.coordinatesIndex = extension.texCoord;
  55. }
  56. assign(babylonTexture);
  57. });
  58. });
  59. }
  60. }
  61. GLTFLoader.RegisterExtension(NAME, (loader) => new KHR_texture_transform(loader));