Handle loader errors.

This commit is contained in:
kovacsv 2021-08-06 18:54:52 +02:00
parent 395c3d524a
commit 2a0b7eadf2

View File

@ -40,8 +40,9 @@ OV.ThreeImporter = class extends OV.ImporterBase
return;
}
Promise.all (libraries).then (() => {
const loader = this.CreateLoader ();
this.LoadModel (fileContent, loader, onFinish);
const mainFileUrl = OV.CreateObjectUrl (fileContent);
const loader = this.CreateLoader (mainFileUrl);
this.LoadModel (mainFileUrl, loader, onFinish);
}).catch (() => {
onFinish ();
});
@ -58,11 +59,14 @@ OV.ThreeImporter = class extends OV.ImporterBase
return null;
}
CreateLoader ()
CreateLoader (mainFileUrl)
{
const manager = new THREE.LoadingManager ();
manager.setURLModifier ((url) => {
if (url.startsWith ('data:') || url.startsWith ('blob:')) {
if (url === mainFileUrl) {
return url;
}
if (url.startsWith ('data:')) {
return url;
}
const fileBuffer = this.callbacks.getFileBuffer (url);
@ -76,7 +80,7 @@ OV.ThreeImporter = class extends OV.ImporterBase
return loader;
}
LoadModel (fileContent, loader, onFinish)
LoadModel (mainFileUrl, loader, onFinish)
{
function SetColor (color, threeColor)
{
@ -93,40 +97,46 @@ OV.ThreeImporter = class extends OV.ImporterBase
}
// TODO: error handling
const mainFileUrl = OV.CreateObjectUrl (fileContent);
loader.load (mainFileUrl, (object) => {
object.traverse ((child) => {
if (child.isMesh) {
// TODO: merge same materials
// TODO: PBR materials
console.log (child);
let threeMaterial = child.material;
let material = new OV.Material (OV.MaterialType.Phong);
material.name = threeMaterial.name;
SetColor (material.color, threeMaterial.color);
if (threeMaterial.type === 'MeshPhongMaterial') {
SetColor (material.specular, threeMaterial.specular);
material.shininess = threeMaterial.shininess / 100.0;
}
const materialIndex = this.model.AddMaterial (material);
let mesh = OV.ConvertThreeGeometryToMesh (child.geometry, materialIndex);
if (child.matrixWorld !== undefined && child.matrixWorld !== null) {
const matrix = new OV.Matrix (child.matrixWorld.elements);
const transformation = new OV.Transformation (matrix);
// TODO: flip to transform mesh
let determinant = matrix.Determinant ();
let mirrorByX = OV.IsNegative (determinant);
if (mirrorByX) {
OV.FlipMeshTrianglesOrientation (mesh);
loader.load (mainFileUrl,
(object) => {
object.traverse ((child) => {
if (child.isMesh) {
// TODO: merge same materials
// TODO: PBR materials
console.log (child);
let threeMaterial = child.material;
let material = new OV.Material (OV.MaterialType.Phong);
material.name = threeMaterial.name;
SetColor (material.color, threeMaterial.color);
if (threeMaterial.type === 'MeshPhongMaterial') {
SetColor (material.specular, threeMaterial.specular);
material.shininess = threeMaterial.shininess / 100.0;
}
OV.TransformMesh (mesh, transformation);
const materialIndex = this.model.AddMaterial (material);
let mesh = OV.ConvertThreeGeometryToMesh (child.geometry, materialIndex);
if (child.matrixWorld !== undefined && child.matrixWorld !== null) {
const matrix = new OV.Matrix (child.matrixWorld.elements);
const transformation = new OV.Transformation (matrix);
const determinant = matrix.Determinant ();
const mirrorByX = OV.IsNegative (determinant);
OV.TransformMesh (mesh, transformation);
if (mirrorByX) {
OV.FlipMeshTrianglesOrientation (mesh);
}
}
this.model.AddMesh (mesh);
}
// TODO: transform
this.model.AddMesh (mesh);
}
});
onFinish ();
});
});
onFinish ();
},
() => {
},
(err) => {
this.SetError ();
this.SetMessage (err);
onFinish ();
}
);
}
};