2015-06-12 11:07:05 +02:00
|
|
|
var ProgressiveLoader = function(path, scene, materialCreator, transparentElements) {
|
|
|
|
if (transparentElements === undefined) {
|
|
|
|
transparentElements = [];
|
|
|
|
}
|
|
|
|
|
2015-06-09 17:36:21 +02:00
|
|
|
// Create mesh
|
2015-06-11 17:22:37 +02:00
|
|
|
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-11 17:22:37 +02:00
|
|
|
var currentMesh;
|
|
|
|
var currentMaterial;
|
2015-06-10 11:59:02 +02:00
|
|
|
|
2015-06-09 17:36:21 +02:00
|
|
|
var added = false;
|
2015-06-10 11:24:59 +02:00
|
|
|
var finished = false;
|
2015-06-09 17:36:21 +02:00
|
|
|
|
2015-06-09 17:54:38 +02:00
|
|
|
var socket = io();
|
2015-06-09 17:36:21 +02:00
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
var vertices = [];
|
|
|
|
var textCoords = [];
|
|
|
|
var uvs = [];
|
|
|
|
var faces = [];
|
|
|
|
|
2015-06-10 11:59:02 +02:00
|
|
|
// Init streaming with socket
|
2015-06-11 17:22:37 +02:00
|
|
|
socket.emit('request', path);
|
2015-06-09 17:36:21 +02:00
|
|
|
|
2015-06-10 11:59:02 +02:00
|
|
|
// When server's ready, start asking for the mesh
|
2015-06-10 11:24:59 +02:00
|
|
|
socket.on('ok', function() {
|
|
|
|
socket.emit('next');
|
|
|
|
});
|
|
|
|
|
2015-06-10 11:59:02 +02:00
|
|
|
// When receiving elements
|
2015-06-10 11:50:47 +02:00
|
|
|
socket.on('elements', function(arr) {
|
|
|
|
|
2015-06-10 14:48:11 +02:00
|
|
|
if (!finished) {
|
|
|
|
socket.emit('next');
|
|
|
|
}
|
|
|
|
|
2015-06-10 12:00:57 +02:00
|
|
|
// Launch this code in async
|
|
|
|
setTimeout(function() {
|
2015-06-10 11:50:47 +02:00
|
|
|
|
2015-06-10 12:00:57 +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-10 14:31:16 +02:00
|
|
|
var elts = arr[i];
|
2015-06-10 11:50:47 +02:00
|
|
|
|
2015-06-10 12:00:57 +02:00
|
|
|
// console.log(line);
|
2015-06-10 11:50:47 +02:00
|
|
|
|
2015-06-10 14:31:16 +02:00
|
|
|
if (elts[0] === 'v') {
|
2015-06-10 11:50:47 +02:00
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
vertices.push(new THREE.Vector3(
|
2015-06-10 14:31:16 +02:00
|
|
|
elts[1],
|
|
|
|
elts[2],
|
|
|
|
elts[3]
|
2015-06-10 12:00:57 +02:00
|
|
|
));
|
2015-06-10 11:50:47 +02:00
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
verticesNeedUpdate = true;
|
2015-06-10 11:50:47 +02:00
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
} else if (elts[0] === 'vt') {
|
|
|
|
|
|
|
|
textCoords.push(new THREE.Vector2(
|
|
|
|
elts[1],
|
|
|
|
elts[2]
|
|
|
|
));
|
2015-06-10 11:50:47 +02:00
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
} else if (elts[0] === 'f') {
|
2015-06-10 11:50:47 +02:00
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
faces.push(new THREE.Face3(
|
2015-06-10 14:31:16 +02:00
|
|
|
elts[1],
|
|
|
|
elts[2],
|
|
|
|
elts[3]
|
2015-06-10 11:50:47 +02:00
|
|
|
));
|
|
|
|
|
2015-06-10 12:00:57 +02:00
|
|
|
// If the face has 4 vertices, create second triangle
|
2015-06-11 17:22:37 +02:00
|
|
|
if (elts.length === 5 || elts.length === 9) {
|
2015-06-10 12:00:57 +02:00
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
faces.push(new THREE.Face3(
|
2015-06-10 14:31:16 +02:00
|
|
|
elts[1],
|
|
|
|
elts[3],
|
|
|
|
elts[4]
|
2015-06-10 12:00:57 +02:00
|
|
|
));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
// Add texture
|
|
|
|
if (elts.length === 7 || elts.length === 9) {
|
|
|
|
uvs.push([
|
|
|
|
textCoords[elts[4]],
|
|
|
|
textCoords[elts[5]],
|
|
|
|
textCoords[elts[6]]
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (elts.length === 9) {
|
|
|
|
uvs.push([
|
|
|
|
textCoords[elts[5]],
|
|
|
|
textCoords[elts[7]],
|
|
|
|
textCoords[elts[8]]
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add currentMesh to scene one there are a few faces in it
|
2015-06-10 12:00:57 +02:00
|
|
|
if (!added) {
|
2015-06-11 17:22:37 +02:00
|
|
|
scene.add(obj);
|
2015-06-10 12:00:57 +02:00
|
|
|
added = true;
|
|
|
|
}
|
2015-06-10 11:50:47 +02:00
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
if (!currentMesh) {
|
|
|
|
var geo = new THREE.Geometry();
|
|
|
|
geo.vertices = vertices;
|
|
|
|
geo.faces = faces;
|
2015-06-12 11:07:05 +02:00
|
|
|
geo.faceVertexUvs = [uvs];
|
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
|
2015-06-12 11:07:05 +02:00
|
|
|
var material, tmp = currentMaterial;
|
2015-06-11 17:22:37 +02:00
|
|
|
if (currentMaterial === undefined || currentMaterial === null) {
|
|
|
|
material = new THREE.MeshLambertMaterial({color: 'red'});
|
|
|
|
} else {
|
2015-06-12 11:07:05 +02:00
|
|
|
material = materialCreator.materials[currentMaterial.trim()];
|
|
|
|
material.side = THREE.DoubleSide;
|
|
|
|
material.map.wrapS = material.map.wrapT = THREE.RepeatWrapping;
|
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
currentMaterial = null;
|
|
|
|
}
|
|
|
|
currentMesh = new THREE.Mesh(geo, material);
|
2015-06-12 11:07:05 +02:00
|
|
|
|
2015-06-12 11:15:01 +02:00
|
|
|
if (tmp && transparentElements.indexOf(tmp.trim()) !== -1) {
|
2015-06-12 11:07:05 +02:00
|
|
|
THREEx.Transparency.push(currentMesh);
|
|
|
|
} else {
|
|
|
|
currentMesh.raycastable = true;
|
|
|
|
}
|
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
}
|
2015-06-12 11:07:05 +02:00
|
|
|
currentMesh.geometry.computeFaceNormals();
|
2015-06-11 17:22:37 +02:00
|
|
|
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) {
|
2015-06-12 11:07:05 +02:00
|
|
|
currentMesh.geometry.computeFaceNormals();
|
|
|
|
currentMesh.geometry.computeBoundingSphere();
|
2015-06-11 17:22:37 +02:00
|
|
|
currentMesh.geometry.groupsNeedUpdate = true;
|
|
|
|
currentMesh.geometry.elementsNeedUpdate = true;
|
|
|
|
currentMesh.geometry.normalsNeedUpdate = true;
|
|
|
|
currentMesh.geometry.uvsNeedUpdate = true;
|
|
|
|
}
|
|
|
|
currentMaterial = elts[1];
|
|
|
|
currentMesh = null;
|
|
|
|
|
|
|
|
// console.log(material.map);
|
|
|
|
// currentMesh = new THREE.Mesh(geo, material);
|
|
|
|
|
2015-06-10 11:50:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
if (currentMesh) {
|
2015-06-12 11:15:01 +02:00
|
|
|
currentMesh.material.side = THREE.DoubleSide;
|
2015-06-11 17:22:37 +02:00
|
|
|
currentMesh.geometry.computeFaceNormals();
|
2015-06-12 11:07:05 +02:00
|
|
|
currentMesh.geometry.computeBoundingSphere();
|
2015-06-11 17:22:37 +02:00
|
|
|
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-10 12:00:57 +02:00
|
|
|
},0);
|
2015-06-10 11:50:47 +02:00
|
|
|
});
|
|
|
|
|
2015-06-10 14:48:11 +02:00
|
|
|
socket.on('disconnect', function() {
|
|
|
|
console.log("Finished");
|
2015-06-10 11:24:59 +02:00
|
|
|
finished = true;
|
2015-06-09 17:36:21 +02:00
|
|
|
});
|
|
|
|
|
2015-06-11 17:22:37 +02:00
|
|
|
return obj;
|
2015-06-09 17:36:21 +02:00
|
|
|
}
|