KHR_materials_translucency.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
  2. import { GLTFLoader } from "../glTFLoader.js";
  3. const NAME = "KHR_materials_translucency";
  4. /**
  5. * [Proposed Specification](https://github.com/KhronosGroup/glTF/pull/1825)
  6. * !!! Experimental Extension Subject to Changes !!!
  7. */
  8. // eslint-disable-next-line @typescript-eslint/naming-convention
  9. export class KHR_materials_translucency {
  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. if (this.enabled) {
  25. loader.parent.transparencyAsCoverage = true;
  26. }
  27. }
  28. /** @internal */
  29. dispose() {
  30. this._loader = null;
  31. }
  32. /**
  33. * @internal
  34. */
  35. loadMaterialPropertiesAsync(context, material, babylonMaterial) {
  36. return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => {
  37. const promises = new Array();
  38. promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
  39. promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));
  40. promises.push(this._loadTranslucentPropertiesAsync(extensionContext, material, babylonMaterial, extension));
  41. return Promise.all(promises).then(() => { });
  42. });
  43. }
  44. _loadTranslucentPropertiesAsync(context, material, babylonMaterial, extension) {
  45. if (!(babylonMaterial instanceof PBRMaterial)) {
  46. throw new Error(`${context}: Material type not supported`);
  47. }
  48. const pbrMaterial = babylonMaterial;
  49. // Enables "translucency" texture which represents diffusely-transmitted light.
  50. pbrMaterial.subSurface.isTranslucencyEnabled = true;
  51. // Since this extension models thin-surface transmission only, we must make the
  52. // internal IOR == 1.0 and set the thickness to 0.
  53. pbrMaterial.subSurface.volumeIndexOfRefraction = 1.0;
  54. pbrMaterial.subSurface.minimumThickness = 0.0;
  55. pbrMaterial.subSurface.maximumThickness = 0.0;
  56. // Albedo colour will tint transmission.
  57. pbrMaterial.subSurface.useAlbedoToTintTranslucency = true;
  58. if (extension.translucencyFactor !== undefined) {
  59. pbrMaterial.subSurface.translucencyIntensity = extension.translucencyFactor;
  60. }
  61. else {
  62. pbrMaterial.subSurface.translucencyIntensity = 0.0;
  63. pbrMaterial.subSurface.isTranslucencyEnabled = false;
  64. return Promise.resolve();
  65. }
  66. if (extension.translucencyTexture) {
  67. extension.translucencyTexture.nonColorData = true;
  68. return this._loader.loadTextureInfoAsync(`${context}/translucencyTexture`, extension.translucencyTexture).then((texture) => {
  69. pbrMaterial.subSurface.translucencyIntensityTexture = texture;
  70. });
  71. }
  72. else {
  73. return Promise.resolve();
  74. }
  75. }
  76. }
  77. GLTFLoader.RegisterExtension(NAME, (loader) => new KHR_materials_translucency(loader));
  78. //# sourceMappingURL=KHR_materials_translucency.js.map