|
@@ -1771,25 +1771,38 @@ var BABYLON;
|
|
material._babylonData = material._babylonData || {};
|
|
material._babylonData = material._babylonData || {};
|
|
var babylonData = material._babylonData[babylonDrawMode];
|
|
var babylonData = material._babylonData[babylonDrawMode];
|
|
if (!babylonData) {
|
|
if (!babylonData) {
|
|
- var promises = new Array();
|
|
|
|
this._parent._logOpen(context + " " + (material.name || ""));
|
|
this._parent._logOpen(context + " " + (material.name || ""));
|
|
- var name_4 = material.name || "material_" + material._index;
|
|
|
|
|
|
+ var name_4 = material.name || "material" + material._index;
|
|
var babylonMaterial = this._createMaterial(name_4, babylonDrawMode);
|
|
var babylonMaterial = this._createMaterial(name_4, babylonDrawMode);
|
|
- promises.push(this._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
|
|
|
|
- promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(context, material, babylonMaterial));
|
|
|
|
- this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
|
|
|
|
babylonData = {
|
|
babylonData = {
|
|
material: babylonMaterial,
|
|
material: babylonMaterial,
|
|
meshes: [],
|
|
meshes: [],
|
|
- loaded: Promise.all(promises).then(function () { })
|
|
|
|
|
|
+ loaded: this._loadMaterialPropertiesAsync(context, material, babylonMaterial)
|
|
};
|
|
};
|
|
material._babylonData[babylonDrawMode] = babylonData;
|
|
material._babylonData[babylonDrawMode] = babylonData;
|
|
|
|
+ this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
|
|
this._parent._logClose();
|
|
this._parent._logClose();
|
|
}
|
|
}
|
|
babylonData.meshes.push(babylonMesh);
|
|
babylonData.meshes.push(babylonMesh);
|
|
|
|
+ babylonMesh.onDisposeObservable.addOnce(function () {
|
|
|
|
+ var index = babylonData.meshes.indexOf(babylonMesh);
|
|
|
|
+ if (index !== -1) {
|
|
|
|
+ babylonData.meshes.splice(index, 1);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
assign(babylonData.material);
|
|
assign(babylonData.material);
|
|
return babylonData.loaded;
|
|
return babylonData.loaded;
|
|
};
|
|
};
|
|
|
|
+ GLTFLoader.prototype._loadMaterialPropertiesAsync = function (context, material, babylonMaterial) {
|
|
|
|
+ var promise = GLTF2.GLTFLoaderExtension._LoadMaterialPropertiesAsync(this, context, material, babylonMaterial);
|
|
|
|
+ if (promise) {
|
|
|
|
+ return promise;
|
|
|
|
+ }
|
|
|
|
+ var promises = new Array();
|
|
|
|
+ promises.push(this._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
|
|
|
|
+ promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(context, material, babylonMaterial));
|
|
|
|
+ return Promise.all(promises).then(function () { });
|
|
|
|
+ };
|
|
GLTFLoader.prototype._createMaterial = function (name, drawMode) {
|
|
GLTFLoader.prototype._createMaterial = function (name, drawMode) {
|
|
var babylonMaterial = new BABYLON.PBRMaterial(name, this._babylonScene);
|
|
var babylonMaterial = new BABYLON.PBRMaterial(name, this._babylonScene);
|
|
babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? BABYLON.Material.CounterClockWiseSideOrientation : BABYLON.Material.ClockWiseSideOrientation;
|
|
babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? BABYLON.Material.CounterClockWiseSideOrientation : BABYLON.Material.ClockWiseSideOrientation;
|
|
@@ -2213,6 +2226,11 @@ var BABYLON;
|
|
*/
|
|
*/
|
|
GLTFLoaderExtension.prototype._loadMaterialAsync = function (context, material, mesh, babylonMesh, babylonDrawMode, assign) { return null; };
|
|
GLTFLoaderExtension.prototype._loadMaterialAsync = function (context, material, mesh, babylonMesh, babylonDrawMode, assign) { return null; };
|
|
/**
|
|
/**
|
|
|
|
+ * Override this method to modify the default behavior for loading material properties.
|
|
|
|
+ * @hidden
|
|
|
|
+ */
|
|
|
|
+ GLTFLoaderExtension.prototype._loadMaterialPropertiesAsync = function (context, material, babylonMaterial) { return null; };
|
|
|
|
+ /**
|
|
* Override this method to modify the default behavior for loading textures.
|
|
* Override this method to modify the default behavior for loading textures.
|
|
* @hidden
|
|
* @hidden
|
|
*/
|
|
*/
|
|
@@ -2298,6 +2316,13 @@ var BABYLON;
|
|
return loader._applyExtensions(function (extension) { return extension._loadMaterialAsync(context, material, mesh, babylonMesh, babylonDrawMode, assign); });
|
|
return loader._applyExtensions(function (extension) { return extension._loadMaterialAsync(context, material, mesh, babylonMesh, babylonDrawMode, assign); });
|
|
};
|
|
};
|
|
/**
|
|
/**
|
|
|
|
+ * Helper method called by the loader to allow extensions to override loading material properties.
|
|
|
|
+ * @hidden
|
|
|
|
+ */
|
|
|
|
+ GLTFLoaderExtension._LoadMaterialPropertiesAsync = function (loader, context, material, babylonMaterial) {
|
|
|
|
+ return loader._applyExtensions(function (extension) { return extension._loadMaterialPropertiesAsync(context, material, babylonMaterial); });
|
|
|
|
+ };
|
|
|
|
+ /**
|
|
* Helper method called by the loader to allow extensions to override loading textures.
|
|
* Helper method called by the loader to allow extensions to override loading textures.
|
|
* @hidden
|
|
* @hidden
|
|
*/
|
|
*/
|
|
@@ -2432,8 +2457,9 @@ var BABYLON;
|
|
if (indexLOD !== 0) {
|
|
if (indexLOD !== 0) {
|
|
var previousNodeLOD = nodeLODs[indexLOD - 1];
|
|
var previousNodeLOD = nodeLODs[indexLOD - 1];
|
|
if (previousNodeLOD._babylonMesh) {
|
|
if (previousNodeLOD._babylonMesh) {
|
|
- previousNodeLOD._babylonMesh.dispose(false, true);
|
|
|
|
|
|
+ previousNodeLOD._babylonMesh.dispose();
|
|
delete previousNodeLOD._babylonMesh;
|
|
delete previousNodeLOD._babylonMesh;
|
|
|
|
+ _this._disposeUnusedMaterials();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
@@ -2533,6 +2559,23 @@ var BABYLON;
|
|
properties.push(property);
|
|
properties.push(property);
|
|
return properties;
|
|
return properties;
|
|
};
|
|
};
|
|
|
|
+ MSFT_lod.prototype._disposeUnusedMaterials = function () {
|
|
|
|
+ var materials = this._loader._gltf.materials;
|
|
|
|
+ if (materials) {
|
|
|
|
+ for (var _i = 0, materials_1 = materials; _i < materials_1.length; _i++) {
|
|
|
|
+ var material = materials_1[_i];
|
|
|
|
+ if (material._babylonData) {
|
|
|
|
+ for (var drawMode in material._babylonData) {
|
|
|
|
+ var babylonData = material._babylonData[drawMode];
|
|
|
|
+ if (babylonData.meshes.length === 0) {
|
|
|
|
+ babylonData.material.dispose(false, true);
|
|
|
|
+ delete material._babylonData[drawMode];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
return MSFT_lod;
|
|
return MSFT_lod;
|
|
}(GLTF2.GLTFLoaderExtension));
|
|
}(GLTF2.GLTFLoaderExtension));
|
|
Extensions.MSFT_lod = MSFT_lod;
|
|
Extensions.MSFT_lod = MSFT_lod;
|
|
@@ -2777,28 +2820,13 @@ var BABYLON;
|
|
_this.name = NAME;
|
|
_this.name = NAME;
|
|
return _this;
|
|
return _this;
|
|
}
|
|
}
|
|
- KHR_materials_pbrSpecularGlossiness.prototype._loadMaterialAsync = function (context, material, mesh, babylonMesh, babylonDrawMode, assign) {
|
|
|
|
|
|
+ KHR_materials_pbrSpecularGlossiness.prototype._loadMaterialPropertiesAsync = function (context, material, babylonMaterial) {
|
|
var _this = this;
|
|
var _this = this;
|
|
return this._loadExtensionAsync(context, material, function (extensionContext, extension) {
|
|
return this._loadExtensionAsync(context, material, function (extensionContext, extension) {
|
|
- material._babylonData = material._babylonData || {};
|
|
|
|
- var babylonData = material._babylonData[babylonDrawMode];
|
|
|
|
- if (!babylonData) {
|
|
|
|
- var promises = new Array();
|
|
|
|
- var name_1 = material.name || "materialSG_" + material._index;
|
|
|
|
- var babylonMaterial = _this._loader._createMaterial(name_1, babylonDrawMode);
|
|
|
|
- promises.push(_this._loader._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
|
|
|
|
- promises.push(_this._loadSpecularGlossinessPropertiesAsync(extensionContext, material, extension, babylonMaterial));
|
|
|
|
- _this._loader._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
|
|
|
|
- babylonData = {
|
|
|
|
- material: babylonMaterial,
|
|
|
|
- meshes: [],
|
|
|
|
- loaded: Promise.all(promises).then(function () { })
|
|
|
|
- };
|
|
|
|
- material._babylonData[babylonDrawMode] = babylonData;
|
|
|
|
- }
|
|
|
|
- babylonData.meshes.push(babylonMesh);
|
|
|
|
- assign(babylonData.material);
|
|
|
|
- return babylonData.loaded;
|
|
|
|
|
|
+ var promises = new Array();
|
|
|
|
+ promises.push(_this._loader._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
|
|
|
|
+ promises.push(_this._loadSpecularGlossinessPropertiesAsync(extensionContext, material, extension, babylonMaterial));
|
|
|
|
+ return Promise.all(promises).then(function () { });
|
|
});
|
|
});
|
|
};
|
|
};
|
|
KHR_materials_pbrSpecularGlossiness.prototype._loadSpecularGlossinessPropertiesAsync = function (context, material, properties, babylonMaterial) {
|
|
KHR_materials_pbrSpecularGlossiness.prototype._loadSpecularGlossinessPropertiesAsync = function (context, material, properties, babylonMaterial) {
|
|
@@ -2865,31 +2893,15 @@ var BABYLON;
|
|
_this.name = NAME;
|
|
_this.name = NAME;
|
|
return _this;
|
|
return _this;
|
|
}
|
|
}
|
|
- KHR_materials_unlit.prototype._loadMaterialAsync = function (context, material, mesh, babylonMesh, babylonDrawMode, assign) {
|
|
|
|
|
|
+ KHR_materials_unlit.prototype._loadMaterialPropertiesAsync = function (context, material, babylonMaterial) {
|
|
var _this = this;
|
|
var _this = this;
|
|
return this._loadExtensionAsync(context, material, function () {
|
|
return this._loadExtensionAsync(context, material, function () {
|
|
- material._babylonData = material._babylonData || {};
|
|
|
|
- var babylonData = material._babylonData[babylonDrawMode];
|
|
|
|
- if (!babylonData) {
|
|
|
|
- var name_1 = material.name || "materialUnlit_" + material._index;
|
|
|
|
- var babylonMaterial = _this._loader._createMaterial(name_1, babylonDrawMode);
|
|
|
|
- babylonMaterial.unlit = true;
|
|
|
|
- var promise = _this._loadUnlitPropertiesAsync(context, material, babylonMaterial);
|
|
|
|
- _this._loader._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
|
|
|
|
- babylonData = {
|
|
|
|
- material: babylonMaterial,
|
|
|
|
- meshes: [],
|
|
|
|
- loaded: promise
|
|
|
|
- };
|
|
|
|
- material._babylonData[babylonDrawMode] = babylonData;
|
|
|
|
- }
|
|
|
|
- babylonData.meshes.push(babylonMesh);
|
|
|
|
- assign(babylonData.material);
|
|
|
|
- return babylonData.loaded;
|
|
|
|
|
|
+ return _this._loadUnlitPropertiesAsync(context, material, babylonMaterial);
|
|
});
|
|
});
|
|
};
|
|
};
|
|
KHR_materials_unlit.prototype._loadUnlitPropertiesAsync = function (context, material, babylonMaterial) {
|
|
KHR_materials_unlit.prototype._loadUnlitPropertiesAsync = function (context, material, babylonMaterial) {
|
|
var promises = new Array();
|
|
var promises = new Array();
|
|
|
|
+ babylonMaterial.unlit = true;
|
|
// Ensure metallic workflow
|
|
// Ensure metallic workflow
|
|
babylonMaterial.metallic = 1;
|
|
babylonMaterial.metallic = 1;
|
|
babylonMaterial.roughness = 1;
|
|
babylonMaterial.roughness = 1;
|