3d-interface/js/ProgressiveLoader.js

195 lines
6.7 KiB
JavaScript
Raw Normal View History

2015-06-15 09:40:30 +02:00
var ProgressiveLoader = function(path, scene, callback) {
// Create MTLLoader
var loader = new THREE.MTLLoader(path.substring(0, path.lastIndexOf('/')) + '/');
loader.load(path.replace('.obj', '.mtl'), function(materialCreator) {
2015-06-15 09:40:30 +02:00
materialCreator.preload();
2015-06-10 11:59:02 +02:00
2015-06-15 09:40:30 +02:00
// Create mesh
var obj = new THREE.Object3D();
obj.up = new THREE.Vector3(0,0,1);
glob = obj;
2015-06-10 11:59:02 +02:00
2015-06-15 09:40:30 +02:00
var currentMesh;
var currentMaterial;
2015-06-09 17:36:21 +02:00
2015-06-15 09:40:30 +02:00
var added = false;
var finished = false;
2015-06-09 17:36:21 +02:00
2015-06-15 09:40:30 +02:00
var socket = io();
2015-06-15 09:40:30 +02:00
var vertices = [];
var textCoords = [];
var uvs = [];
var faces = [];
2015-06-09 17:36:21 +02:00
2015-06-15 09:40:30 +02:00
// Init streaming with socket
socket.emit('request', path.substring(1, path.length));
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
// When server's ready, start asking for the mesh
socket.on('ok', function() {
2015-06-10 14:48:11 +02:00
socket.emit('next');
2015-06-15 09:40:30 +02:00
});
// When receiving elements
socket.on('elements', function(arr) {
2015-06-10 14:48:11 +02:00
2015-06-15 09:40:30 +02:00
console.log("Got stuff");
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
if (!finished) {
socket.emit('next');
}
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
// Launch this code in async
setTimeout(function() {
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
// We'll receive an array of string (obj)
for (var i = 0; i < arr.length; i++) {
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
var elts = arr[i];
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
// console.log(line);
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
if (elts[0] === 'v') {
2015-06-15 09:40:30 +02:00
vertices.push(new THREE.Vector3(
elts[1],
elts[2],
elts[3]
));
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
} else if (elts[0] === 'vt') {
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
textCoords.push(new THREE.Vector2(
elts[1],
elts[2]
));
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
} else if (elts[0] === 'f') {
2015-06-10 12:00:57 +02:00
faces.push(new THREE.Face3(
2015-06-10 14:31:16 +02:00
elts[1],
2015-06-15 09:40:30 +02:00
elts[2],
elts[3]
2015-06-10 12:00:57 +02:00
));
2015-06-15 09:40:30 +02:00
// If the face has 4 vertices, create second triangle
if (elts.length === 5 || elts.length === 9) {
2015-06-10 12:00:57 +02:00
2015-06-15 09:40:30 +02:00
faces.push(new THREE.Face3(
elts[1],
elts[3],
elts[4]
));
2015-06-15 09:40:30 +02:00
}
2015-06-15 09:40:30 +02:00
// Add texture
if (elts.length === 7) {
uvs.push([
textCoords[elts[4]],
textCoords[elts[5]],
textCoords[elts[6]]
]);
}
2015-06-15 09:40:30 +02:00
if (elts.length === 9) {
uvs.push([
textCoords[elts[5]],
textCoords[elts[6]],
textCoords[elts[7]]
]);
}
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
if (elts.length === 9) {
uvs.push([
textCoords[elts[5]],
textCoords[elts[7]],
textCoords[elts[8]]
]);
}
2015-06-15 09:40:30 +02:00
// Add currentMesh to scene one there are a few faces in it
if (!added) {
scene.add(obj);
added = true;
}
2015-06-15 09:40:30 +02:00
if (!currentMesh) {
var geo = new THREE.Geometry();
geo.vertices = vertices;
geo.faces = faces;
geo.faceVertexUvs = [uvs];
2015-06-15 09:40:30 +02:00
var material, tmp = currentMaterial;
if (currentMaterial === undefined || currentMaterial === null) {
material = new THREE.MeshLambertMaterial({color: 'red'});
} else {
material = materialCreator.materials[currentMaterial.trim()];
material.side = THREE.DoubleSide;
if (material.map)
material.map.wrapS = material.map.wrapT = THREE.RepeatWrapping;
currentMaterial = null;
}
currentMesh = new THREE.Mesh(geo, material);
if (typeof callback === 'function') {
callback(currentMesh, obj);
}
currentMesh.geometry.computeFaceNormals();
}
obj.add(currentMesh);
} else if (elts[0] === 'u') {
// Add current mesh
// if (currentMesh) {
// obj.add(currentMesh);
// }
// Prepare new mesh
faces = [];
uvs = [];
// currentMesh.geometry.computeFaceNormals();
if (currentMesh) {
currentMesh.geometry.computeFaceNormals();
currentMesh.geometry.computeBoundingSphere();
currentMesh.geometry.groupsNeedUpdate = true;
currentMesh.geometry.elementsNeedUpdate = true;
currentMesh.geometry.normalsNeedUpdate = true;
currentMesh.geometry.uvsNeedUpdate = true;
}
2015-06-15 09:40:30 +02:00
currentMaterial = elts[1];
currentMesh = null;
2015-06-15 09:40:30 +02:00
// console.log(material.map);
// currentMesh = new THREE.Mesh(geo, material);
2015-06-15 09:40:30 +02:00
}
2015-06-10 11:50:47 +02:00
}
2015-06-15 09:40:30 +02:00
if (currentMesh) {
currentMesh.material.side = THREE.DoubleSide;
currentMesh.geometry.computeFaceNormals();
currentMesh.geometry.computeBoundingSphere();
currentMesh.geometry.groupsNeedUpdate = true;
currentMesh.geometry.elementsNeedUpdate = true;
currentMesh.geometry.normalsNeedUpdate = true;
currentMesh.geometry.uvsNeedUpdate = true;
}
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
},0);
});
2015-06-10 11:50:47 +02:00
2015-06-15 09:40:30 +02:00
socket.on('disconnect', function() {
console.log("Finished");
finished = true;
});
2015-06-10 11:50:47 +02:00
2015-06-09 17:36:21 +02:00
});
}