KHR_materials_dispersion.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
  2. import { GLTFLoader } from "../glTFLoader.js";
  3. const NAME = "KHR_materials_dispersion";
  4. /**
  5. * [Specification](https://github.com/KhronosGroup/glTF/blob/87bd64a7f5e23c84b6aef2e6082069583ed0ddb4/extensions/2.0/Khronos/KHR_materials_dispersion/README.md)
  6. * @experimental
  7. */
  8. // eslint-disable-next-line @typescript-eslint/naming-convention
  9. export class KHR_materials_dispersion {
  10. /**
  11. * @internal
  12. */
  13. constructor(loader) {
  14. /**
  15. * The name of this extension.
  16. */
  17. this.name = NAME;
  18. /**
  19. * Defines a number that determines the order the extensions are applied.
  20. */
  21. this.order = 174;
  22. this._loader = loader;
  23. this.enabled = this._loader.isExtensionUsed(NAME);
  24. }
  25. /** @internal */
  26. dispose() {
  27. this._loader = null;
  28. }
  29. /**
  30. * @internal
  31. */
  32. loadMaterialPropertiesAsync(context, material, babylonMaterial) {
  33. return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {
  34. const promises = new Array();
  35. promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
  36. promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));
  37. promises.push(this._loadDispersionPropertiesAsync(extensionContext, material, babylonMaterial, extension));
  38. return Promise.all(promises).then(() => { });
  39. });
  40. }
  41. _loadDispersionPropertiesAsync(context, material, babylonMaterial, extension) {
  42. if (!(babylonMaterial instanceof PBRMaterial)) {
  43. throw new Error(`${context}: Material type not supported`);
  44. }
  45. // If transparency isn't enabled already, this extension shouldn't do anything.
  46. // i.e. it requires either the KHR_materials_transmission or KHR_materials_translucency extensions.
  47. if (!babylonMaterial.subSurface.isRefractionEnabled || !extension.dispersion) {
  48. return Promise.resolve();
  49. }
  50. babylonMaterial.subSurface.isDispersionEnabled = true;
  51. babylonMaterial.subSurface.dispersion = extension.dispersion;
  52. return Promise.resolve();
  53. }
  54. }
  55. GLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_dispersion(loader));
  56. //# sourceMappingURL=KHR_materials_dispersion.js.map