KHR_materials_unlit.ts 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /// <reference path="../../../../../dist/preview release/babylon.d.ts"/>
  2. module BABYLON.GLTF2.Extensions {
  3. // https://github.com/donmccurdy/glTF/tree/feat-khr-materials-cmnConstant/extensions/2.0/Khronos/KHR_materials_unlit
  4. const NAME = "KHR_materials_unlit";
  5. export class KHR_materials_unlit extends GLTFLoaderExtension {
  6. public readonly name = NAME;
  7. protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>> {
  8. return this._loadExtensionAsync<{}>(context, material, () => {
  9. material._babylonData = material._babylonData || {};
  10. let babylonData = material._babylonData[babylonDrawMode];
  11. if (!babylonData) {
  12. const name = material.name || `materialUnlit_${material._index}`;
  13. const babylonMaterial = this._loader._createMaterial(PBRMaterial, name, babylonDrawMode);
  14. babylonMaterial.unlit = true;
  15. const promise = this._loadUnlitPropertiesAsync(context, material, babylonMaterial);
  16. this._loader.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
  17. babylonData = {
  18. material: babylonMaterial,
  19. meshes: [],
  20. loaded: promise
  21. };
  22. material._babylonData[babylonDrawMode] = babylonData;
  23. }
  24. babylonData.meshes.push(babylonMesh);
  25. assign(babylonData.material);
  26. return babylonData.loaded;
  27. });
  28. }
  29. private _loadUnlitPropertiesAsync(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): Promise<void> {
  30. const promises = new Array<Promise<void>>();
  31. // Ensure metallic workflow
  32. babylonMaterial.metallic = 1;
  33. babylonMaterial.roughness = 1;
  34. const properties = material.pbrMetallicRoughness;
  35. if (properties) {
  36. if (properties.baseColorFactor) {
  37. babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);
  38. babylonMaterial.alpha = properties.baseColorFactor[3];
  39. }
  40. else {
  41. babylonMaterial.albedoColor = Color3.White();
  42. }
  43. if (properties.baseColorTexture) {
  44. promises.push(this._loader._loadTextureAsync(`${context}/baseColorTexture`, properties.baseColorTexture, texture => {
  45. babylonMaterial.albedoTexture = texture;
  46. }));
  47. }
  48. }
  49. if (material.doubleSided) {
  50. babylonMaterial.backFaceCulling = false;
  51. babylonMaterial.twoSidedLighting = true;
  52. }
  53. this._loader._loadMaterialAlphaProperties(context, material, babylonMaterial);
  54. return Promise.all(promises).then(() => {});
  55. }
  56. }
  57. GLTFLoader._Register(NAME, loader => new KHR_materials_unlit(loader));
  58. }