///
module BABYLON.GLTF2.Extensions {
// https://github.com/donmccurdy/glTF/tree/feat-khr-materials-cmnConstant/extensions/2.0/Khronos/KHR_materials_unlit
const NAME = "KHR_materials_unlit";
export class KHR_materials_unlit extends GLTFLoaderExtension {
public readonly name = NAME;
protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable> {
return this._loadExtensionAsync<{}>(context, material, () => {
material._babylonData = material._babylonData || {};
let babylonData = material._babylonData[babylonDrawMode];
if (!babylonData) {
const name = material.name || `materialUnlit_${material._index}`;
const babylonMaterial = this._loader._createMaterial(PBRMaterial, name, babylonDrawMode);
babylonMaterial.unlit = true;
const promise = this._loadUnlitPropertiesAsync(context, material, babylonMaterial);
this._loader.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
babylonData = {
material: babylonMaterial,
meshes: [],
loaded: promise
};
material._babylonData[babylonDrawMode] = babylonData;
}
babylonData.meshes.push(babylonMesh);
assign(babylonData.material);
return babylonData.loaded;
});
}
private _loadUnlitPropertiesAsync(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): Promise {
const promises = new Array>();
// Ensure metallic workflow
babylonMaterial.metallic = 1;
babylonMaterial.roughness = 1;
const properties = material.pbrMetallicRoughness;
if (properties) {
if (properties.baseColorFactor) {
babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);
babylonMaterial.alpha = properties.baseColorFactor[3];
}
else {
babylonMaterial.albedoColor = Color3.White();
}
if (properties.baseColorTexture) {
promises.push(this._loader._loadTextureAsync(`${context}/baseColorTexture`, properties.baseColorTexture, texture => {
babylonMaterial.albedoTexture = texture;
}));
}
}
if (material.doubleSided) {
babylonMaterial.backFaceCulling = false;
babylonMaterial.twoSidedLighting = true;
}
this._loader._loadMaterialAlphaProperties(context, material, babylonMaterial);
return Promise.all(promises).then(() => {});
}
}
GLTFLoader._Register(NAME, loader => new KHR_materials_unlit(loader));
}