ShadowEditor/editor/js/Loader.js
2018-06-07 19:50:07 +08:00

552 lines
14 KiB
JavaScript

/**
* @author mrdoob / http://mrdoob.com/
*/
var Loader = function (editor) {
var scope = this;
var signals = editor.signals;
this.texturePath = '';
this.loadFile = function (file) {
var filename = file.name;
var extension = filename.split('.').pop().toLowerCase();
var reader = new FileReader();
reader.addEventListener('progress', function (event) {
var size = '(' + Math.floor(event.total / 1000).format() + ' KB)';
var progress = Math.floor((event.loaded / event.total) * 100) + '%';
console.log('加载中', filename, size, progress);
});
switch (extension) {
case 'amf':
reader.addEventListener('load', function (event) {
var loader = new THREE.AMFLoader();
var amfobject = loader.parse(event.target.result);
editor.execute(new AddObjectCommand(amfobject));
}, false);
reader.readAsArrayBuffer(file);
break;
case 'awd':
reader.addEventListener('load', function (event) {
var loader = new THREE.AWDLoader();
var scene = loader.parse(event.target.result);
editor.execute(new SetSceneCommand(scene));
}, false);
reader.readAsArrayBuffer(file);
break;
case 'babylon':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var json = JSON.parse(contents);
var loader = new THREE.BabylonLoader();
var scene = loader.parse(json);
editor.execute(new SetSceneCommand(scene));
}, false);
reader.readAsText(file);
break;
case 'babylonmeshdata':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var json = JSON.parse(contents);
var loader = new THREE.BabylonLoader();
var geometry = loader.parseGeometry(json);
var material = new THREE.MeshStandardMaterial();
var mesh = new THREE.Mesh(geometry, material);
mesh.name = filename;
editor.execute(new AddObjectCommand(mesh));
}, false);
reader.readAsText(file);
break;
case 'ctm':
reader.addEventListener('load', function (event) {
var data = new Uint8Array(event.target.result);
var stream = new CTM.Stream(data);
stream.offset = 0;
var loader = new THREE.CTMLoader();
loader.createModel(new CTM.File(stream), function (geometry) {
geometry.sourceType = "ctm";
geometry.sourceFile = file.name;
var material = new THREE.MeshStandardMaterial();
var mesh = new THREE.Mesh(geometry, material);
mesh.name = filename;
editor.execute(new AddObjectCommand(mesh));
});
}, false);
reader.readAsArrayBuffer(file);
break;
case 'dae':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var loader = new THREE.ColladaLoader();
var collada = loader.parse(contents);
collada.scene.name = filename;
editor.execute(new AddObjectCommand(collada.scene));
}, false);
reader.readAsText(file);
break;
case 'fbx':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var loader = new THREE.FBXLoader();
var object = loader.parse(contents);
editor.execute(new AddObjectCommand(object));
}, false);
reader.readAsText(file);
break;
case 'glb':
case 'gltf':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var loader = new THREE.GLTFLoader();
loader.parse(contents, function (result) {
result.scene.name = filename;
editor.execute(new AddObjectCommand(result.scene));
});
}, false);
reader.readAsArrayBuffer(file);
break;
case 'js':
case 'json':
case '3geo':
case '3mat':
case '3obj':
case '3scn':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
// 2.0
if (contents.indexOf('postMessage') !== -1) {
var blob = new Blob([contents], { type: 'text/javascript' });
var url = URL.createObjectURL(blob);
var worker = new Worker(url);
worker.onmessage = function (event) {
event.data.metadata = { version: 2 };
handleJSON(event.data, file, filename);
};
worker.postMessage(Date.now());
return;
}
// >= 3.0
var data;
try {
data = JSON.parse(contents);
} catch (error) {
alert(error);
return;
}
handleJSON(data, file, filename);
}, false);
reader.readAsText(file);
break;
case 'kmz':
reader.addEventListener('load', function (event) {
var loader = new THREE.KMZLoader();
var collada = loader.parse(event.target.result);
collada.scene.name = filename;
editor.execute(new AddObjectCommand(collada.scene));
}, false);
reader.readAsArrayBuffer(file);
break;
case 'md2':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var geometry = new THREE.MD2Loader().parse(contents);
var material = new THREE.MeshStandardMaterial({
morphTargets: true,
morphNormals: true
});
var mesh = new THREE.Mesh(geometry, material);
mesh.mixer = new THREE.AnimationMixer(mesh);
mesh.name = filename;
editor.execute(new AddObjectCommand(mesh));
}, false);
reader.readAsArrayBuffer(file);
break;
case 'obj':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var object = new THREE.OBJLoader().parse(contents);
object.name = filename;
editor.execute(new AddObjectCommand(object));
}, false);
reader.readAsText(file);
break;
case 'playcanvas':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var json = JSON.parse(contents);
var loader = new THREE.PlayCanvasLoader();
var object = loader.parse(json);
editor.execute(new AddObjectCommand(object));
}, false);
reader.readAsText(file);
break;
case 'ply':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var geometry = new THREE.PLYLoader().parse(contents);
geometry.sourceType = "ply";
geometry.sourceFile = file.name;
var material = new THREE.MeshStandardMaterial();
var mesh = new THREE.Mesh(geometry, material);
mesh.name = filename;
editor.execute(new AddObjectCommand(mesh));
}, false);
reader.readAsArrayBuffer(file);
break;
case 'stl':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var geometry = new THREE.STLLoader().parse(contents);
geometry.sourceType = "stl";
geometry.sourceFile = file.name;
var material = new THREE.MeshStandardMaterial();
var mesh = new THREE.Mesh(geometry, material);
mesh.name = filename;
editor.execute(new AddObjectCommand(mesh));
}, false);
if (reader.readAsBinaryString !== undefined) {
reader.readAsBinaryString(file);
} else {
reader.readAsArrayBuffer(file);
}
break;
/*
case 'utf8':
reader.addEventListener( 'load', function ( event ) {
var contents = event.target.result;
var geometry = new THREE.UTF8Loader().parse( contents );
var material = new THREE.MeshLambertMaterial();
var mesh = new THREE.Mesh( geometry, material );
editor.execute( new AddObjectCommand( mesh ) );
}, false );
reader.readAsBinaryString( file );
break;
*/
case 'vtk':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var geometry = new THREE.VTKLoader().parse(contents);
geometry.sourceType = "vtk";
geometry.sourceFile = file.name;
var material = new THREE.MeshStandardMaterial();
var mesh = new THREE.Mesh(geometry, material);
mesh.name = filename;
editor.execute(new AddObjectCommand(mesh));
}, false);
reader.readAsText(file);
break;
case 'wrl':
reader.addEventListener('load', function (event) {
var contents = event.target.result;
var result = new THREE.VRMLLoader().parse(contents);
editor.execute(new SetSceneCommand(result));
}, false);
reader.readAsText(file);
break;
default:
alert('不支持的文件类型(' + extension + ').');
break;
}
};
function handleJSON(data, file, filename) {
if (data.metadata === undefined) { // 2.0
data.metadata = { type: 'Geometry' };
}
if (data.metadata.type === undefined) { // 3.0
data.metadata.type = 'Geometry';
}
if (data.metadata.formatVersion !== undefined) {
data.metadata.version = data.metadata.formatVersion;
}
switch (data.metadata.type.toLowerCase()) {
case 'buffergeometry':
var loader = new THREE.BufferGeometryLoader();
var result = loader.parse(data);
var mesh = new THREE.Mesh(result);
editor.execute(new AddObjectCommand(mesh));
break;
case 'geometry':
var loader = new THREE.JSONLoader();
loader.setTexturePath(scope.texturePath);
var result = loader.parse(data);
var geometry = result.geometry;
var material;
if (result.materials !== undefined) {
if (result.materials.length > 1) {
material = new THREE.MultiMaterial(result.materials);
} else {
material = result.materials[0];
}
} else {
material = new THREE.MeshStandardMaterial();
}
geometry.sourceType = "ascii";
geometry.sourceFile = file.name;
var mesh;
if (geometry.animation && geometry.animation.hierarchy) {
mesh = new THREE.SkinnedMesh(geometry, material);
} else {
mesh = new THREE.Mesh(geometry, material);
}
mesh.name = filename;
editor.execute(new AddObjectCommand(mesh));
break;
case 'object':
var loader = new THREE.ObjectLoader();
loader.setTexturePath(scope.texturePath);
var result = loader.parse(data);
if (result instanceof THREE.Scene) {
editor.execute(new SetSceneCommand(result));
} else {
editor.execute(new AddObjectCommand(result));
}
break;
case 'scene':
// DEPRECATED
var loader = new THREE.SceneLoader();
loader.parse(data, function (result) {
editor.execute(new SetSceneCommand(result.scene));
}, '');
break;
case 'app':
editor.fromJSON(data);
break;
}
}
};