var modelAndTextures = document.getElementById('modelPlusTexture');
|
|
modelAndTextures?.addEventListener('change', function (event) {
|
|
var files = event.currentTarget.files;
|
loadFiles(files);
|
|
});
|
|
//LOAD AND ADD TO SCENE -> .OBJ, .MTL, .DAE AND ASSOCIATED IMAGE FILES
|
var loadFiles = function (files) {
|
|
var obj_path, mtl_path, dae_path, gltf_path, fbx_path;;
|
var loadingObj = false, loadingDae = false, loadingGLTF = false, loadingFBX = false;
|
|
var extraFiles = {}, file, imageFiles = [], image;
|
for (var i = 0; i < files.length; i++) {
|
file = files[i];
|
extraFiles[file.name] = file;
|
|
console.log("Filename: " + files[i].name);
|
console.log("Type: " + files[i].type);
|
console.log(files[i]);
|
console.log("Size: " + files[i].size + " bytes");
|
|
//Filenames that end in .obj/.OBJ or .mtl/.MTL
|
if (files[i].name.match(/\w*.obj\b/i)) {
|
|
obj_path = files[i].name;
|
// loadingDae = false;
|
loadingObj = true;
|
|
scene.remove(sample_model);
|
removeModel();
|
modelLoaded = true;
|
console.log(obj_path);
|
}
|
|
if (files[i].name.match(/\w*.mtl\b/i)) {
|
|
mtl_path = files[i].name;
|
console.log(mtl_path);
|
}
|
|
if (files[i].name.match(/\w*.dae\b/i)) {
|
|
dae_path = files[i].name;
|
// loadingObj = false;
|
loadingDae = true;
|
|
scene.remove(sample_model);
|
removeModel();
|
modelLoaded = true;
|
console.log(dae_path);
|
}
|
|
if (files[i].name.match(/\w*.gltf\b/i)) {
|
|
gltf_path = files[i].name;
|
loadingGLTF = true;
|
|
scene.remove(sample_model);
|
removeModel();
|
modelLoaded = true;
|
console.log(gltf_path);
|
}
|
|
if (files[i].name.match(/\w*.fbx\b/i)) {
|
|
fbx_path = files[i].name;
|
loadingFBX = true;
|
|
scene.remove(sample_model);
|
removeModel();
|
modelLoaded = true;
|
console.log(fbx_path);
|
}
|
|
}
|
|
manager.setURLModifier(function (url, path) {
|
|
url = url.replace('data:application/', '');
|
url = url.split(/[\/\\]/);
|
url = url[url.length - 1];
|
|
if (extraFiles[url] !== undefined) {
|
|
const blobURL = URL.createObjectURL(extraFiles[url]);
|
return blobURL;
|
}
|
|
return url;
|
});
|
|
if (loadingGLTF) {
|
|
var gltf_loader = new THREE.GLTFLoader(manager);
|
gltf_loader.load(gltf_path, function (gltf) {
|
|
console.log(gltf);
|
model = gltf.scene;
|
modelWithTextures = true;
|
console.log(model);
|
|
//clone and animations
|
// var clone = AnimationUtils.clone(model);
|
var anims = gltf.animations;
|
|
console.log(anims);
|
addAnimation( model, anims );
|
animControl( model );
|
playAllAnimation(anims);
|
|
model.traverse(function (child) {
|
|
if (child.isMesh) {
|
|
if (child.material.length > 1) {
|
for (var i = 0; i < child.material.length; i++) {
|
|
child.material[i].side = THREE.DoubleSide;
|
}
|
} else {
|
child.material.side = THREE.DoubleSide;
|
}
|
|
console.log(child);
|
|
console.log(child.material.map);
|
|
numOfMeshes++;
|
var geometry = child.geometry;
|
stats(gltf_path, geometry, numOfMeshes);
|
|
var wireframe2 = new THREE.WireframeGeometry(geometry);
|
var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel);
|
materials.wireframeAndModel.visible = false;
|
child.add(edges);
|
|
setWireFrame(child);
|
setWireframeAndModel(child);
|
|
var originalMaterial = child.material;
|
setPhong(child, originalMaterial);
|
setXray(child, originalMaterial);
|
|
}
|
|
});
|
|
setCamera(model);
|
smooth.disabled = true;
|
document.getElementById('smooth-model').innerHTML = "Smooth Model (Disabled)";
|
|
setBoundBox(model);
|
setPolarGrid(model);
|
setGrid(model);
|
setAxis(model);
|
|
scaleUp(model);
|
scaleDown(model);
|
|
fixRotation(model);
|
resetRotation(model);
|
|
model.position.set(0, 0, 0);
|
|
selectedObject = model;
|
outlinePass.selectedObjects = [selectedObject];
|
outlinePass.enabled = false;
|
|
scene.add(model);
|
});
|
|
}
|
|
if (loadingFBX) {
|
|
var fbx_loader = new THREE.FBXLoader(manager);
|
fbx_loader.load(fbx_path, function (fbx) {
|
|
console.log(fbx);
|
model = fbx;
|
modelWithTextures = true;
|
console.log(model);
|
|
var anims = fbx.animations;
|
addAnimation( model, anims );
|
animControl( model );
|
playAllAnimation(anims);
|
|
model.traverse(function (child) {
|
|
if (child.isMesh) {
|
|
if (child.material.length > 1) {
|
for (var i = 0; i < child.material.length; i++) {
|
|
child.material[i].side = THREE.DoubleSide;
|
}
|
} else {
|
child.material.side = THREE.DoubleSide;
|
}
|
|
console.log(child);
|
|
numOfMeshes++;
|
var geometry = child.geometry;
|
stats(fbx_path, geometry, numOfMeshes);
|
|
var wireframe2 = new THREE.WireframeGeometry(geometry);
|
var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel);
|
materials.wireframeAndModel.visible = false;
|
child.add(edges);
|
|
setWireFrame(child);
|
setWireframeAndModel(child);
|
|
var originalMaterial = child.material;
|
setPhong(child, originalMaterial);
|
setXray(child, originalMaterial);
|
}
|
|
});
|
|
setCamera(model);
|
smooth.disabled = true;
|
document.getElementById('smooth-model').innerHTML = "Smooth Model (Disabled)";
|
|
setBoundBox(model);
|
setPolarGrid(model);
|
setGrid(model);
|
setAxis(model);
|
|
scaleUp(model); scaleDown(model);
|
|
fixRotation(model);
|
resetRotation(model);
|
|
model.position.set(0, 0, 0);
|
|
selectedObject = model;
|
outlinePass.selectedObjects = [selectedObject];
|
outlinePass.enabled = false;
|
|
scene.add(model);
|
});
|
}
|
|
if (loadingDae) {
|
var collada_loader = new THREE.ColladaLoader(manager);
|
collada_loader.load(dae_path, function (collada) {
|
|
model = collada.scene;
|
modelWithTextures = true;
|
|
var anims = collada.animations
|
addAnimation( model, anims );
|
animControl( model );
|
playAllAnimation(anims);
|
|
console.log(model);
|
|
model.traverse(function (child) {
|
|
if (child.isMesh) {
|
|
if (child.material.length > 1) {
|
for (var i = 0; i < child.material.length; i++) {
|
|
child.material[i].side = THREE.DoubleSide;
|
//child.material[i].skinning = false;
|
}
|
}
|
else {
|
child.material.side = THREE.DoubleSide;
|
// child.material.skinning = false;
|
}
|
|
|
numOfMeshes++;
|
var geometry = child.geometry;
|
stats(dae_path, geometry, numOfMeshes);
|
|
var wireframe2 = new THREE.WireframeGeometry(child.geometry);
|
var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel);
|
materials.wireframeAndModel.visible = false;
|
|
model.rotation.set(0, 0, 0);
|
|
|
setWireFrame(child);
|
setWireframeAndModel(child);
|
|
var originalMaterial = child.material;
|
setXray(child, originalMaterial);
|
setPhong(child, originalMaterial);
|
|
setBoundBox(child);
|
setGrid(child);
|
setPolarGrid(child);
|
setAxis(child);
|
|
smooth.disabled = true;
|
document.getElementById('smooth-model').innerHTML = "Smooth Model (Disabled)";
|
}
|
|
});
|
|
model.position.set(0, 0, 0);
|
|
setCamera(model);
|
scaleUp(model); scaleDown(model);
|
|
fixRotation(model);
|
resetRotation(model);
|
|
selectedObject = model;
|
outlinePass.selectedObjects = [selectedObject];
|
outlinePass.enabled = false;
|
|
scene.add(model);
|
});
|
}
|
|
if (loadingObj) {
|
var mtlloader = new THREE.MTLLoader(manager);
|
mtlloader.load(mtl_path, function (materials_load) {
|
var loader = new THREE.OBJLoader(manager);
|
loader.setMaterials(materials_load);
|
loader.load(obj_path, function (obj) {
|
|
model = obj;
|
modelWithTextures = true;
|
|
model.traverse(function (child) {
|
if (child instanceof THREE.Mesh) {
|
|
if (child.material) {
|
child.material.side = THREE.DoubleSide;
|
}
|
|
numOfMeshes++;
|
var geometry = child.geometry;
|
stats(obj_path, geometry, numOfMeshes);
|
|
var wireframe2 = new THREE.WireframeGeometry(child.geometry);
|
var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel);
|
materials.wireframeAndModel.visible = false;
|
model.add(edges);
|
|
setWireFrame(child);
|
setWireframeAndModel(child);
|
|
var originalMaterial = child.material;
|
setXray(child, originalMaterial);
|
setPhong(child, originalMaterial);
|
|
}
|
});
|
|
setCamera(model);
|
setSmooth(model);
|
|
model.position.set(0, 0, 0);
|
|
setBoundBox(model);
|
setPolarGrid(model);
|
setGrid(model);
|
setAxis(model);
|
|
scaleUp(model);
|
scaleDown(model);
|
|
fixRotation(model);
|
resetRotation(model);
|
|
selectedObject = model;
|
outlinePass.selectedObjects = [selectedObject];
|
outlinePass.enabled = false;
|
|
scene.add(model);
|
});
|
});
|
}
|
};
|