").appendTo($('#wki-data-item')); // this is your annotation html element
//elem.append("
");
}
function onDocumentKeyUp(event) {
if (event.which === 27 || event.which === 13) {
if (attached !== '') {
transform.detach(attached);
controls[whichScene].enabled = true;
scene[whichScene].remove(transform);
searchSpheres(attached.id);
attached = '';
}
}
}
function onDocumentMouseDouble(event) {
if (pickConst == 5) {
event.preventDefault();
clickCount = 2;
var geo = new THREE.Geometry();
var tempVert = [];
var strSave = '';
var strFaces = '';
for (var aa = 0; aa < pickedVert.length; aa++) {
geo.vertices.push(pickedVert[aa]);
tempVert.push(spheres[aa].id);
strSave += pickedVert[aa].x + " " + pickedVert[aa].y + " " + pickedVert[aa].z + " ";
}
for (var face = 0; face < pickedVert.length - 2; face++) {
geo.faces.push(new THREE.Face3(0, face + 1, face + 2));
strFaces += 0 + " " + (face + 1) + " " + (face + 2) + " ";
}
if (strSave[strSave.length - 1] === '')
strSave.pop();
if (strFaces[strFaces.length - 1] === '')
strFaces.pop();
var _color = new THREE.Color(Math.random() * 0xffffff);
var redMat = new THREE.MeshBasicMaterial({
color : _color,
side : THREE.DoubleSide,
transparent : true,
opacity : 0.5,
depthTest : true,
depthWrite : false,
polygonOffset : true,
polygonOffsetFactor : -4
});
var polygon = new THREE.Mesh(geo, redMat);
scene[whichScene].add(polygon);
var tt = new Polygon(tempVert, polygon.id);
trObj.push(tt);
//triangles.push(polygon);
pickedVert = [];
spheres = [];
$("#descForm").data("type", "polygon");
$("#descForm").data("color", _color.getHex().toString(16));
$("#descForm").data("coords", strSave);
$("#descForm").data("faces", strFaces);
$("#descForm").dialog("option", "title", ("Description of entry no. " + polygon.id));
clearEvents();
lastAddedObject = {
"object" : polygon,
"tt" : tt
};
readID(_filename[0]);
$("#descForm").dialog("open");
}
}
function onDocumentMouseDown(event) {
if ($(event.target).is("CANVAS")) {
event.preventDefault();
clickCount = 1;
whichScene = $(event.target).context.offsetParent.id;
whichScene = whichScene.substr(whichScene.indexOf("_") + 1);
var offset = $('#object3d-viewer-canvas_' + whichScene).offset();
mouseDown.x = ((event.clientX - offset.left) / canvasWidth[whichScene]) * 2 - 1;
mouseDown.y = - ((event.clientY - (offset.top - document.body.scrollTop)) / (canvasHeight[whichScene])) * 2 + 1;
container[whichScene].style.cursor = 'move';
dragMouse = true;
}
}
function onDocumentMouseUp(event) {
if ($(event.target).is("CANVAS")) {
event.preventDefault();
whichScene = $(event.target).context.offsetParent.id;
whichScene = whichScene.substr(whichScene.indexOf("_") + 1);
var offset = $('#object3d-viewer-canvas_' + whichScene).offset();
mouseUp.x = ((event.clientX - offset.left) / canvasWidth[whichScene]) * 2 - 1;
mouseUp.y = - ((event.clientY - (offset.top - document.body.scrollTop)) / (canvasHeight[whichScene])) * 2 + 1;
container[whichScene].style.cursor = 'auto';
if (mouseUp.x == mouseDown.x && mouseUp.y == mouseDown.y) {
if (event.which === 1) {
if (pickConst == 5)
setTimeout(function () {
if (clickCount != 2)
picking(1);
}, 300);
else if (typePickingFaces) {
picking(1);
} else
picking(1);
}
if (event.which === 3) {
picking(3);
//if (typePickingFaces) {
raycasterr.setFromCamera(mouseUp, camera[whichScene]);
var intersectsFaces = raycasterr.intersectObjects(pickedFaces);
var intersectsMeshes = raycasterr.intersectObjects(createdMeshes);
if (intersectsFaces.length > 0) {
scene[whichScene].remove(scene[whichScene].getObjectById(intersectsFaces[0].object.id));
searchSpheresInFaces(intersectsFaces[0].object.id);
} else if (intersectsMeshes.length > 0) {
$("#confirm").data("id", intersectsMeshes[0].object.id);
$("#confirm").data("idd", intersectsMeshes[0].object.idd);
$("#confirm").data("type", 2);
$("#confirm").dialog("option", "title", ("Deleting entry of
" + intersectsMeshes[0].object.name + ""));
$("#confirm").dialog("open");
} else
if (pickedFaces.length > 0)
makeMeshFromFaces();
//}
}
}
dragMouse = false;
}
}
var iter = 0,
triangle;
var attached = '';
var egh = '';
var second = true;
var dist,
distT = [{
distance : 9999
}
],
distM = [{
distance : 9999
}
];
//typePick = pickConst;
function addEdges(_intersects) {
if (typeof(_intersects[0]) != 'undefined' && _intersects[0].object.id != '') {
if (typeof(egh.id) == 'undefined') {
egh = new THREE.WireframeHelper(_intersects[0].object, new THREE.Color(0xffffff - _intersects[0].object.material.color.getHex()));
egh.material.linewidth = 20;
egh.material.side = THREE.DoubleSide;
egh.material.transparent = true;
egh.material.depthTest = true;
egh.material.depthWrite = false;
egh.material.polygonOffset = true;
egh.material.polygonOffsetFactor = -4;
} else {
scene[whichScene].remove(scene[whichScene].getObjectById(egh.id));
egh = new THREE.WireframeHelper(_intersects[0].object, new THREE.Color(0xffffff /* intersects[0].object.material.color.getHex()*/
));
egh.material.linewidth = 20;
egh.material.side = THREE.DoubleSide;
egh.material.transparent = true;
egh.material.depthTest = true;
egh.material.depthWrite = false;
egh.material.polygonOffset = true;
egh.material.polygonOffsetFactor = -4;
}
scene[whichScene].add(egh);
}
}
function picking(wMouse) {
if (multi == false) {
raycaster.setFromCamera(mouseUp, camera[whichScene]);
var intersects;
if (wMouse == 1) {
intersects = raycaster.intersectObjects(scene[whichScene].children, true);
if (intersects.length > 0 && intersects[0].object.name !== '') {
if (typeof(intersects[1]) != 'undefined') {
if (intersects[1].object.id == intersects[0].object.id) {}
else {
second = false;
}
}
}
intersects = raycaster.intersectObjects(allSpheres);
if (intersects.length > 0) {
if (attached != '') {
transform.detach(attached);
attached == '';
} else {
attached = scene[whichScene].getObjectById(intersects[0].object.id);
controls.enabled = false;
transform.attach(attached);
scene[whichScene].add(transform);
}
if (typeof(egh.id) !== 'undefined') {
scene[whichScene].remove(scene[whichScene].getObjectById(egh.id));
egh = '';
}
} else {
intersectsMeshes = [];
/*if (typePickingFaces == 1 || typePickingFaces == 2)
intersectsMeshes = raycasterr.intersectObjects(createdMeshes);*/
if (intersectsMeshes.length == 0) {
intersectsT = raycaster.intersectObjects(triangles);
intersectsMeshes = raycasterr.intersectObjects(createdMeshes);
intersects = raycaster.intersectObjects(sceneObjects);
if (intersects.length > 0)
dist = raycaster.intersectObject(intersects[0].object);
else
dist = [{
distance : 9999999999
}
];
if (intersectsT.length > 0)
distT = raycaster.intersectObject(intersectsT[0].object);
else
distT = [{
distance : 9999999999
}
];
if (intersectsMeshes.length > 0)
distM = raycaster.intersectObject(intersectsMeshes[0].object);
else
distM = [{
distance : 9999999999
}
];
dist[0].distance = Math.round(dist[0].distance, 5);
distT[0].distance = Math.round(distT[0].distance, 5);
distM[0].distance = Math.round(distM[0].distance, 5);
if (distT[0].distance <= dist[0].distance) {
addEdges(intersectsT, egh);
} else if (distM[0].distance <= dist[0].distance) {
addEdges(intersectsMeshes, egh);
} else if (distT[0].distance > dist[0].distance) {
if (typeof(egh.id) !== 'undefined') {
scene[whichScene].remove(scene[whichScene].getObjectById(egh.id));
egh = '';
$("#tooltip").dialog("close");
} else if (intersects.length > 0) {
if (intersects[0].object.name != '') {
if ((typePickingFaces == 1 || typePickingFaces == 2) && searchFaces(intersects[0].faceIndex)) {
var faceIndex = intersects[0].faceIndex;
var geom = intersects[0].object.geometry;
var facesIndices = ["a", "b", "c"];
var tempVert = new THREE.Vector3();
var vertArray = [];
var vertArray2 = [];
facesIndices.forEach(function (indices) {
tempVert = (geom.vertices[intersects[0].object.geometry.faces[faceIndex][indices]]);
vertArray.push(tempVert);
});
if (typePickingFaces == 2) {
if (faceIndex % 2 == 0) {
faceIndex = faceIndex + 1;
} else {
faceIndex = faceIndex - 1;
}
var finished = false;
facesIndices.forEach(function (indices) {
var toPush = 0;
tempVert = (geom.vertices[intersects[0].object.geometry.faces[faceIndex][indices]]);
for (var ii = 0; ii < vertArray.length && finished == false; ii++) {
if (vertArray[ii] !== tempVert)
toPush++;
}
if (toPush === 3) {
vertArray.push(tempVert);
finished = true;
}
});
}
var geo = new THREE.Geometry();
for (var aa = 0; aa < vertArray.length; aa++) {
geo.vertices.push(vertArray[aa]);
}
for (var face = 0; face < vertArray.length - 2; face++) {
geo.faces.push(new THREE.Face3(0, face + 1, face + 2));
}
var redMat = new THREE.MeshBasicMaterial({
color : faceColor,
side : THREE.DoubleSide,
transparent : true,
opacity : 0.7,
depthTest : true,
depthWrite : false,
polygonOffset : true,
polygonOffsetFactor : -4
});
var polygon = new THREE.Mesh(geo, redMat);
if (wholePano != 6) {
polygon.position.x -= originPosition[whichScene].x;
polygon.position.y -= originPosition[whichScene].y;
polygon.position.z -= originPosition[whichScene].z;
}
scene[whichScene].add(polygon);
pickedFaces.push(polygon);
pickedFacesID.push(intersects[0].faceIndex);
var sphere = new THREE.Mesh(new THREE.SphereGeometry(sphereRadius / 2, 7, 7), new THREE.MeshBasicMaterial({
transparent : true,
opacity : 0.8,
color : 0xff0000
}));
sphere.position.set(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z);
scene[whichScene].add(sphere);
facesSpheres.push(sphere);
//geom.verticesNeedUpdate = true;
} else if (typePickingFaces == 0) {
if (typePick % (pickConst + 1) != 0) {
var sphere = new THREE.Mesh(new THREE.SphereGeometry(sphereRadius, 7, 7), new THREE.MeshBasicMaterial({
transparent : true,
opacity : 0.8,
color : 0xff0000
}));
/*lineGeometry.vertices.push(new THREE.Vector3(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z));
lineGeometry.vertices.needsUpdate = true;
line = new THREE.Line(lineGeometry, lineMaterial);
scene[whichScene].add(line);*/
sphere.position.set(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z);
scene[whichScene].add(sphere);
spheres.push(sphere);
allSpheres.push(sphere);
vertexx = sphere.position;
pickedVert.push(vertexx);
if (pickConst != 5)
typePick--;
}
if (typePick % (pickConst + 1) == 0) {
var pickedArea = new THREE.Geometry();
var toSlice = [];
var strSave = '';
for (var i = 0; i < pickedVert.length; i++) {
pickedArea.vertices.push(pickedVert[i]);
strSave += pickedVert[i].x + " " + pickedVert[i].y + " " + pickedVert[i].z + " ";
//iter++;
}
if (strSave[strSave.length - 1] === '')
strSave.pop();
pickedVert = [];
var _color = new THREE.Color();
_color.setHex(Math.random() * 0xffffff);
var redMat = new THREE.MeshBasicMaterial({
color : _color,
side : THREE.DoubleSide,
transparent : true,
opacity : 0.5,
depthTest : true,
depthWrite : false,
polygonOffset : true,
polygonOffsetFactor : -4
});
if (pickConst == 3) {
pickedArea.faces.push(new THREE.Face3(0, 2, 1));
triangle = new THREE.Mesh(pickedArea, redMat);
scene[whichScene].add(triangle);
var tt = new Triangle(spheres[0].id, spheres[1].id, spheres[2].id, triangle.id);
$("#descForm").data("type", "triangle");
}
if (pickConst == 4) {
pickedArea.faces.push(new THREE.Face3(0, 1, 2));
pickedArea.faces.push(new THREE.Face3(0, 2, 3));
triangle = new THREE.Mesh(pickedArea, redMat);
scene[whichScene].add(triangle);
var tt = new Quad(spheres[0].id, spheres[1].id, spheres[2].id, spheres[3].id, triangle.id);
$("#descForm").data("type", "quad");
} else if (pickConst == 5) {}
spheres = [];
//triangles.push(triangle);
trObj.push(tt);
typePick = pickConst;
$("#descForm").data("color", _color.getHex().toString(16));
$("#descForm").data("coords", strSave);
$("#descForm").data("faces", '');
$("#descForm").dialog("option", "title", ("Describe entry no. " + triangle.id));
clearEvents();
lastAddedObject = {
"object" : triangle,
"tt" : tt
};
readID(_filename[0]);
$("#descForm").dialog("open");
}
}
}
}
}
}
}
}
if (wMouse == 3) {
if (typePickingFaces == 1 || typePickingFaces == 2) {
var intersectsTriangles = raycaster.intersectObjects(pickedFaces);
var intersectsSpheres = raycaster.intersectObjects(facesSpheres);
if (intersectsTriangles.length > 0) {
if (intersectsTriangles[0].object.id == searchTriangles(intersectsTriangles[0].object.id)) {
for (var i = 0; i < spheres.length; i++) {
typePick++;
}
//pickedVert = [];
if (typeof(egh.id) !== 'undefined') {
scene[whichScene].remove(scene[whichScene].getObjectById(egh.id));
egh = '';
}
}
}
if (intersectsSpheres.length > 0) {
scene[whichScene].remove(scene[whichScene].getObjectById(intersectsSpheres[0].object.id));
var indd = spheres.indexOf(intersectsSpheres[0].object);
spheres.splice(indd, 1);
indd = pickedVert.indexOf(intersectsSpheres[0].object.position);
pickedVert.splice(indd, 1);
typePick++;
}
} else {
//raycasterT.setFromCamera( mouseUp, camera );
var intersectsTriangles = raycaster.intersectObjects(triangles);
var intersectsSpheres = raycaster.intersectObjects(spheres);
if (intersectsTriangles.length > 0) {
lastIDHoverT = lastIDHover = 0;
if (intersectsTriangles[0].object.id == searchTriangles(intersectsTriangles[0].object.id)) {
for (var i = 0; i < spheres.length; i++) {
typePick++;
}
if (typeof(egh.id) !== 'undefined') {
scene[whichScene].remove(scene[whichScene].getObjectById(egh.id));
egh = '';
}
}
}
if (intersectsSpheres.length > 0) {
scene[whichScene].remove(scene[whichScene].getObjectById(intersectsSpheres[0].object.id));
var indd = spheres.indexOf(intersectsSpheres[0].object);
spheres.splice(indd, 1);
indd = pickedVert.indexOf(intersectsSpheres[0].object.position);
pickedVert.splice(indd, 1);
typePick++;
}
}
}
}
}
function save(_name, _events, _type, _color, _coords, _faces, _filename, _isOK, _ii, _object) {
saving = true;
var eventsString = '';
_events.forEach (function (key) {
eventsString += key['name'] + "#" + key['uri'] + "#" + key['class_name'] + "|";
});
$("#descFormError").html("Saving, please wait...").css('color', 'blue');
$.ajax({
url:"http://www.patrimonium.net/wisski/object3d/save-annotation",
data: {params:"{\"name\":\""+_name+"\",\"target_obj_file\":\" \\t http://www.patrimonium.net/sites/default/files/"+_filename+"."+ext[_ii]+"\",\"color\":\"0x"+_color+"\",\"coords\":\""+_type+"("+_coords+"|"+_faces+")\",\"reference\":\""+ eventsString +"\"}"},
success : function (result) {
var obj = JSON.parse(result);
newID = obj['anno_uri'];
_object.idd = newID.substring(newID.lastIndexOf("/") + 1, newID.length);
$("#descFormError").html("
Entry saved successfully!").css('color', 'green');
if (_isOK === 1) {
setTimeout(function () {
$("#descForm").dialog("close");
$("#descFormError").html(" ");
$("#descName").html(" ");
saving = false;
//$("#descDescription").html(" ");
}, 1200);
}
},
error : function (jqXHR, textStatus, errorThrown) {
$("#descFormError").html("
Could not save description! ").css('color', 'red');
console.log(jqXHR + " " + textStatus + " " + errorThrown);
}
});
}
function saveEntry(_object, _name, _events, _filename, _ii, _color) {
saving = true;
var eventsString = '';
var newEvents = new Array();
_events.forEach (function (key) {
eventsString += key['name'] + "#" + key['uri'] + "#" + key['class_name'] + "|";
var tempEvent = new Array();
tempEvent.push(key['name']);
tempEvent.push(key['uri']);
tempEvent.push(key['class_name']);
newEvents.push(tempEvent);
});
/*spinner[_ii].opts.left = $("#descFormError").offset().left;
spinner[_ii].opts.top = $("#descFormError").offset().top;
spinner[_ii].spin(target);*/
$("#descFormError").html("Saving, please wait...").css('color', 'blue');
$.ajax({
url : "http://www.patrimonium.net/wisski/object3d/delete-annotation",
data: {params:"{\"anno_uri\":\"" + _object.idd + "\"}"},
success : function (result) {
if (result == '[]') {
$.ajax({
url : "http://www.patrimonium.net/wisski/object3d/save-annotation",
data: {params:"{\"name\":\""+_name+"\",\"target_obj_file\":\" \\t http://www.patrimonium.net/sites/default/files/"+_filename+"."+ext[_ii]+"\",\"coords\":\"" + _object.stringGeom + "\",\"color\":\"0x"+_color+"\",\"reference\":\""+ eventsString +"\"}"},
success : function (result) {
newID = _object.idd = result['anno_uri'];
_object.eventsString = eventsString;
scene[_ii].getObjectById(_object.id).events = newEvents;
readModTimeOnce(_filename, _ii);
$("#descFormError").html("
Entry saved successfully!").css('color', 'green');
//spinner[_ii].stop();
setTimeout(function () {
$("#descForm").dialog("close");
$("#descFormError").html(" ");
$("#descName").html(" ");
$(buttonDomElement).button('enable');
clearEvents();
saving = false;
}, 1200);
},
error : function (jqXHR, textStatus, errorThrown) {
$("#descFormError").html("
Could not save description! ").css('color', 'red');
console.log(jqXHR + " " + textStatus + " " + errorThrown);
}
});
}
},
error : function (jqXHR, textStatus, errorThrown) {
$("#descFormError").html("
Could not save description! ").css('color', 'red');
$(buttonDomElement).button('enable');
console.log(jqXHR + " " + textStatus + " " + errorThrown);
}
});
}
function removeNode(_idd, _filename) {
$.ajax({
url : "http://www.patrimonium.net/wisski/object3d/delete-annotation",
data : {params:"{\"anno_uri\":\"" + _idd + "\"}"},
success : function (result) {
console.log(result);
//$("#descFormError").html("
Entry saved successfully!").css('color', 'green');
},
error : function () {
//$("#descFormError").html("
Could not save description! ").css('color', 'red');
}
});
}
}
function animate() {
idAnimation = requestAnimationFrame(animate);
if (multi == true)
for (var ii = 0; ii < controls.length; ii++) {
controls[ii].update();
}
else
controls[mainID].update();
render();
}
function render() {
if (multi == false) {
if (typeof(realMirror) !== 'undefined')
realMirror.render( );
renderer[mainID].render(scene[mainID], camera[mainID]);
stats[mainID].update();
}
else {
for (var ii = 0; ii < renderer.length; ii++) {
renderer[ii].render(scene[ii], camera[ii]);
stats[ii].update();
}
}
}
function readID(_filename) {
var obj = [{
"filename" : _filename
}
];
$.ajax({
type : "post",
url : "../sites/default/readID.php",
data : JSON.stringify(obj),
contentType : "application/json; charset=utf-8",
dataType : "html",
cache : false,
processData : false,
success : function (result) {
newID = result;
},
error : function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR + " " + textStatus + " " + errorThrown);
}
});
}
function searchSpheres(_id) {
for (var ii = 0; ii < trObj.length; ii++) {
for (var name in trObj[ii]) {
var temp = trObj[ii][name];
if (typeof(temp.length) !== 'undefined') {
var geom = scene[whichScene].getObjectById(trObj[ii]['id']);
geom.geometry.verticesNeedUpdate = true;
} else {
if (_id === trObj[ii][name]) {
var geom = scene[whichScene].getObjectById(trObj[ii]['id']);
geom.geometry.verticesNeedUpdate = true;
}
}
}
}
}
function searchSpheresInFaces(_id) {
var _finished = false;
for (var ii = 0; ii < pickedFaces.length && _finished == false; ii++) {
if (pickedFaces[ii].id == _id) {
scene[whichScene].remove(scene[whichScene].getObjectById(facesSpheres[ii].id));
pickedFaces.splice(ii, 1);
pickedFacesID.splice(ii, 1);
facesSpheres.splice(ii, 1);
finished = true;
}
}
}
function searchSpheresInMeshes(_id, _type) {
var _finished = false;
if (_type == 0) {
for (var ii = 0; ii < createdMeshes.length && _finished == false; ii++) {
if (createdMeshes[ii].id == _id) {
scene[whichScene].remove(scene[whichScene].getObjectById(createdSpheres[ii].id));
createdMeshes.splice(ii, 1);
createdSpheres.splice(ii, 1);
lastIDHover = 0;
finished = true;
}
}
} else if (_type == 1) {
for (var ii = 0; ii < createdMeshes.length && _finished == false; ii++) {
if (createdMeshes[ii].id == _id) {
scene[whichScene].getObjectById(createdSpheres[ii].id).material.opacity = 1.0;
finished = true;
}
}
} else if (_type == 2) {
for (var ii = 0; ii < createdMeshes.length && _finished == false; ii++) {
if (createdMeshes[ii].id == _id) {
scene[whichScene].getObjectById(createdSpheres[ii].id).material.opacity = 0.5;
finished = true;
}
}
}
}
function makeMeshFromFaces() {
var preMesh = new THREE.Geometry();
var strFaces = '';
var strCoords = '';
for (var ii = 0; ii < pickedFaces.length; ii++) {
pickedFaces[ii].updateMatrix();
preMesh.merge(pickedFaces[ii].geometry, pickedFaces[ii].matrix, 0);
}
var redMat = new THREE.MeshBasicMaterial({
color : faceColor,
side : THREE.DoubleSide,
transparent : true,
opacity : 0.5,
depthTest : true,
depthWrite : false,
polygonOffset : true,
polygonOffsetFactor : -4
});
var mesh = new THREE.Mesh(preMesh, redMat);
scene[whichScene].add(mesh);
mesh.geometry.computeBoundingSphere();
for (var ii = 0; ii < mesh.geometry.vertices.length; ii++) {
strCoords += mesh.geometry.vertices[ii].x + " " + mesh.geometry.vertices[ii].y + " " + mesh.geometry.vertices[ii].z + " ";
}
for (var ii = 0; ii < mesh.geometry.faces.length; ii++) {
strFaces += mesh.geometry.faces[ii].a + " " + mesh.geometry.faces[ii].b + " " + mesh.geometry.faces[ii].c + " ";
}
if (strCoords[strCoords.length - 1] === '')
strCoords.pop();
if (strFaces[strFaces.length - 1] === '')
strFaces.pop();
//createdMeshes.push(mesh);
var sphere = new THREE.Mesh(new THREE.SphereGeometry(mesh.geometry.boundingSphere.radius / 15, 7, 7), new THREE.MeshBasicMaterial({
transparent : true,
color : (0xffffff - faceColor),
opacity : 0.5
}));
sphere.position.set(mesh.geometry.boundingSphere.center.x, mesh.geometry.boundingSphere.center.y, mesh.geometry.boundingSphere.center.z);
scene[whichScene].add(sphere);
createdSpheres.push(sphere);
for (var ii = 0; ii < pickedFaces.length; ii++) {
scene[whichScene].remove(scene[whichScene].getObjectById(pickedFaces[ii].id));
}
for (var ii = 0; ii < facesSpheres.length; ii++) {
scene[whichScene].remove(scene[whichScene].getObjectById(facesSpheres[ii].id));
}
$("#descForm").data("coords", strCoords);
$("#descForm").data("faces", strFaces);
$("#descForm").data("color", (faceColor.getHex().toString(16)));
$("#descForm").data("type", "face3");
$("#descForm").dialog("option", "title", ("Describe entry no. " + mesh.id));
lastAddedObject = {
"object" : mesh,
"mtt" : sphere.id
};
readID(filename[0]);
$("#descForm").dialog("open");
facesSpheres = [];
pickedFaces = [];
pickedFacesID = [];
faceColor.setHex(Math.random() * 0xffffff);
}
function searchTriangles(_id) {
for (var ii = 0; ii < triangles.length; ii++) {
if (trObj[ii].id == _id) {
var indd = trObj.indexOf(trObj[ii]);
if (typeof(trObj[ii].tabl) == 'undefined') {
scene[whichScene].remove(scene[whichScene].getObjectById(trObj[ii].a));
scene[whichScene].remove(scene[whichScene].getObjectById(trObj[ii].b));
scene[whichScene].remove(scene[whichScene].getObjectById(trObj[ii].c));
scene[whichScene].remove(scene[whichScene].getObjectById(trObj[ii].d));
} else {
for (var oo = 0; oo < trObj[ii].tabl.length; oo++) {
scene[whichScene].remove(scene[whichScene].getObjectById(trObj[ii].tabl[oo]));
}
}
trObj.splice(indd, 1);
}
if (triangles[ii].id == _id) {
var indd = triangles.indexOf(triangles[ii]);
$("#confirm").data("id", triangles[ii].id);
$("#confirm").data("idd", triangles[ii].idd);
$("#confirm").data("ind", indd);
$("#confirm").data("type", 1);
$("#confirm").dialog("option", "title", ("Deleting entry of
" + triangles[ii].name + ""));
$("#confirm").dialog("open");
return (_id);
}
}
}
function searchFaces(_id) {
if (pickedFacesID.length === 0)
return true;
else {
for (var ii = 0; ii < pickedFacesID.length; ii++) {
if (pickedFacesID[ii] === _id)
return false;
}
}
return true;
}
function addFloor(width, _x, _y, _z, ii) {
//material for ground
var material = new THREE.MeshLambertMaterial({
wireframe : true,
color : 0x0022ce,
side : THREE.DoubleSide,
transparent : true,
opacity : 0.2
});
var floorGeo = new THREE.PlaneGeometry(width, width, 20, 20);
floor = new THREE.Mesh(floorGeo, material);
floor.position.set(_x, _y, _z);
floor.rotation.x = Math.PI / 2;
floor.receiveShadow = true;
scene[ii].add(floor);
floor.geometry.computeBoundingSphere();
floors.push(floor);
floorID = floor.id;
return floor;
}
function addAxis(size, _text, ii) {
var origin = new THREE.AxisHelper(1);
origin.scale.set(_text.x * 0.7, _text.y * 0.7, _text.z * 0.7);
origin.position.set(0, 0, 0);
//origin.position.x += offsetNext.x;
//origin.position.y += offsetNext.y;
//origin.position.z += offsetNext.z;
scene[ii].add(origin);
origins.push(origin);
axisID = origin.id;
var bbb = new THREE.Box3().setFromObject(origin);
labels = new Array();
var color = new THREE.Color();
color.setRGB(255, 0, 0);
addText(_text.x, color, bbb.max.x, 'x', size, ii);
color.setRGB(0, 255, 0);
addText(_text.y, color, bbb.max.y, 'y', size, ii);
color.setRGB(0, 20, 255);
addText(_text.z, color, bbb.max.z, 'z', size, ii);
texts[ii] = labels;
}
function addText(_text, _color, pos, type, _size, ii) {
var textMaterial = new THREE.MeshBasicMaterial({
color : _color
});
_size /= 17;
var textGeo;
if (type !== 'xyz') {
var units = " cm";
_text = _text.replace(".", ",");
//if (parseFloat(_text) >= 100000) {units = " km"; _text = (parseFloat(_text)/100000).toFixed(4);}
if (parseFloat(_text) >= 100) {units = " m"; _text = (parseFloat(_text)/100).toFixed(2);}
textGeo = new THREE.TextGeometry(_text + units, {
size : _size,
height : 0.01,
curveSegments : 6,
font : "helvetiker",
style : "normal"
});
}
else {
textGeo = new THREE.TextGeometry(_text, {
size : _size,
height : 0.01,
curveSegments : 6,
font : "helvetiker",
style : "normal"
});
}
var text = new THREE.Mesh(textGeo, textMaterial);
text.position.set(0, 0, 0);
if (type == 'xyz') {
text.rotation.x = -Math.PI / 2;
text.rotation.z = -Math.PI / 2;
} else
text.rotation.y = -Math.PI / 2;
switch (type) {
case 'x':
text.position.x = pos;
labels.push(text);
break;
case 'y':
text.position.y = pos;
labels.push(text);
break;
case 'z':
text.position.z = pos;
labels.push(text);
break;
case 'xyz':
text.position.z = pos.z;
text.position.x = pos.x;
text.position.y = pos.y;
filenamesText.push(text);
break;
};
scene[ii].add(text);
scene[ii].updateMatrixWorld(true);
var position = new THREE.Vector3();
position.setFromMatrixPosition(text.matrixWorld);
labelsOrigin.push(position);
}
function addRay(raycasterr) {
var material = new THREE.LineBasicMaterial({
color : 0x0000ff
});
var geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(raycasterr.ray.origin.x, raycasterr.ray.origin.y, raycasterr.ray.origin.z));
geometry.vertices.push(new THREE.Vector3(raycasterr.ray.origin.x + (raycasterr.ray.direction.x * 100000), raycasterr.ray.origin.y + (raycasterr.ray.direction.y * 100000), raycasterr.ray.origin.z + (raycasterr.ray.direction.z * 100000)));
var line = new THREE.Line(geometry, material);
scene[whichScene].add(line);
}
function onWindowResize() {
if (multi)
for (var ii = 0; ii < camera.length; ii++) {
camera[ii].aspect = canvasWidth[ii] / canvasHeight[ii];
camera[ii].updateProjectionMatrix();
renderer[ii].setSize(canvasWidth[ii], canvasHeight[ii]);
}
else {
camera[mainID].aspect = canvasWidth[mainID] / canvasHeight[mainID];
camera[mainID].updateProjectionMatrix();
renderer[mainID].setSize(canvasWidth[mainID], canvasHeight[mainID]);
}
render();
}
function switchColor (_name) {
var values = {ka: "", kd: "", ks: ""};
values.ka = _name.ambient;
values.kd = _name.color;
values.ks = _name.specular;
return values;
}
function setGuiColors (_name) {
var values;
for (var ii = 0; ii < mObject.length; ii++)
{
if (isJSON || isDAE) {
for (var jj = 0; (typeof(mObject[ii].material) !== 'undefined') && (typeof(mObject[ii].material.materials) !== 'undefined') && jj < mObject[ii].material.materials.length; jj++) {
if (mObject[ii].material.materials[jj].name == _name || _name == 'all') {
values = switchColor (mObject[ii].material.materials[jj]);
}
}
} else {
for (var jj = 0; jj < mObject[ii].children.length; jj++) {
if (typeof (mObject[ii].children[jj].children) !== 'undefined' && mObject[ii].children[jj].children.length > 0 ) {
for (var kk = 0; kk < mObject[ii].children[jj].children.length; kk++) {
if (typeof (mObject[ii].children[jj].children[kk].material) !== 'undefined' && typeof (mObject[ii].children[jj].children[kk].material.ambient) !== 'undefined') {
if (mObject[ii].children[jj].children[kk].material.name == _name || _name == 'all') {
values = switchColor (mObject[ii].children[jj].children[kk].material);
}
}
}
}
else {
if (typeof (mObject[ii].children[jj].material) !== 'undefined') {
if (mObject[ii].children[jj].material.name == _name || _name == 'all') {
values = switchColor (mObject[ii].children[jj].material);
}
}
}
}
}
}
return values;
}
function floorsF() {
for (var ii = 0; ii < mObject.length; ii++) {
if (mObject[ii].children.length > 0) {
for (var jj = 0; jj < mObject[ii].children.length; jj++) {
if (mObject[ii].children[jj].type != 'Object3D') {
sceneObjects.push(mObject[ii].children[jj]);
}
else {
for (var kk = 0; kk < mObject[ii].children[jj].children.length; kk++) {
mObject[ii].children[jj].children[kk].name = 'obj';
sceneObjects.push(mObject[ii].children[jj].children[kk]);
}
}
}
} else {
sceneObjects.push(mObject[ii]);
}
}
for (var ii = 0; ii < lights.length; ii++) {
lights[ii][1].position.x = lightPosition.x = camera[mainID].position.x;
lights[ii][1].position.y = lightPosition.y = camera[mainID].position.y;
lights[ii][1].position.z = lightPosition.z = camera[mainID].position.z;
}
if (is3D) {
if (multi) {
if (typeof (geomStats[ii].vertices) !== 'undefined') {
for (var ii = 0; ii < geomStats.length; ii++) {
$("#vertices_"+ii+"").html("Vertices: "+ geomStats[ii].vertices + ", faces: " + geomStats[ii].faces + " | " + geomStats[ii].segments + " segments");
}
}
}
else {
if (typeof(geomStats[mainID].vertices) !== 'undefined' && wholePano !== 6)
$("#vertices_"+mainID+"").html("Vertices: "+geomStats[mainID].vertices + ", faces: " + geomStats[mainID].faces + " | " + geomStats[mainID].segments + " segments");
}
if (typeof (materialF5) !== 'undefined')
f5.remove(materialF5);
var matLabels = new Array();
matLabels.push("all");
for (var ii = 0; ii < sceneMaterials.length; ii++)
if (sceneMaterials[ii].name !== '')
matLabels.push(sceneMaterials[ii].name);
materialF5 = f5.add(settings, 'Material', matLabels).onChange(function () {
materialName = settings.Material;
var search = true;
for (var ii = 0; ii < sceneMaterials.length && search; ii++) {
if (sceneMaterials[ii].name == materialName)
{
search = false;
var tempColor = setGuiColors(sceneMaterials[ii].name);
textColors.Ka = "#" + tempColor.ka.getHexString();
textColors.Kd = "#" + tempColor.kd.getHexString();
textColors.Ks = "#" + tempColor.ks.getHexString();
for (var i = 0; i < gui.__folders.Materials.__controllers.length; i++) {
if (typeof(gui.__folders.Materials.__controllers[i].updateDisplay()) == 'function')
gui.__folders.Materials.__controllers[i].updateDisplay();
}
}
}
});
if (typeof (saveMTLbutton) !== 'undefined')
f5.remove(saveMTLbutton);
if (isDAE == false && wholePano !== 6)
saveMTLbutton = f5.add(settings, 'SaveMTL').name("Preview MTL");
}
}
function getModTime (_url, callback) {
_url.forEach(function(url) {
var xhr = $.ajax({
url: url,
success: function(response) {
return callback(xhr.responseURL + "|" + xhr.getResponseHeader("Last-Modified") + "|" + xhr.getResponseHeader('Content-Length'));
}
});
});
}
var spinner_begin;
$(window).load(function () {
$('.wisski_object3d').each(function (i, f) {
WissKI.object3d.files.push($(f).text());
});
if (WissKI.object3d.files.length == 0 && isJPG)
WissKI.object3d.files = JPGS;
else {is3D = true;}
if (WissKI.object3d.files.length > 0 || wholePano == 6 || WissKI.object3d.files[0] != null || isJPG) {
$('#object3d-viewer').append("
Loading of the 3D content...
The loading time depends on the file's size and it's format.
");
var target_begin = document.getElementById('spinner_begin');
spinner_begin = new Spinner(optsBegin);
spinner_begin.spin(target_begin);
console.log("Detected 3D files...");
var toRemove = new Array();
for (var ff = 0; ff < WissKI.object3d.files.length; ff++) {
var parts = WissKI.object3d.files[ff].split('.');
var pp = (parts.length > 1) ? parts.pop() : '';
pp = pp.toLowerCase();
if ((pp !== "jpg" && pp !== "png" && pp !== "tiff" && pp !== "tif" && pp !== "gif") || isJPG) {
var temp = WissKI.object3d.files[ff];
temp = temp.replace(/\\/g, '/');
temp = temp.substring(temp.lastIndexOf('/') + 1, temp.lastIndexOf('.'));
temp = temp.replace(/[|&;$%@"<>()+,]/g, "");
ext.push(pp);
filename.push(temp);
console.log("Loading '" + temp + "." + pp + "' file");
spinner.push(new Spinner(opts));
}
}
function performInit(filename) {
console.log("Performing " + filename);
for (var ii = 0; ii < toRemove.length; ii++) {
WissKI.object3d.files.splice(ii, 1);
}
$("#object3d-viewer-canvas_0").remove();
//$('#spinText_begin').html("");
spinner_begin.stop();
if (wholePano == 6) {
spinner[0] = new Spinner(opts);
}
var __filename = new Array();
__filename.push(filename[0]);
$.ajax({
url : initMain(__filename),
success : function () {
floorsF();
if (wholePano == 6) {
spinner[0].stop();
animate();
functionDone(0);
}
for (var ii = 0; ii < texts.length; ii++) {
for (var jj = 0; jj < texts[ii].length; jj++) {
texts[ii][jj].lookAt(camera[ii].position);
}
}
}
});
}
if (filename.length > 1)
{
if (is3D == true) {
var askUser = false;
$.ajax({
url: getModTime(WissKI.object3d.files, function (buf) {
var dd = buf.split("|");
dd[0] = dd[0].replace(/\\/g, '/');
dd[0] = dd[0].substring(dd[0].lastIndexOf('/') + 1, dd[0].lastIndexOf('.'));
dd[0] = dd[0].replace(/[|&;$%@"<>()+,]/g, "");
var str = {_modified: dd[1], _filename: dd[0], _size: dd[2]};
if (dd[2] > 20971520)
askUser = true;
filenameMod.push(str);
}),
complete: function () {
for (var ii = 0; ii < filenameMod.length; ii++) {
var search = true;
for (var jj = 0; jj < filename.length && search; jj++) {
if (filename[jj] == filenameMod[ii]._filename) {
var d = {_filename: filenameMod[ii]._filename, ext: ext[jj], _WissKI: WissKI.object3d.files[jj], date: new Date(filenameMod[ii]._modified), ind: jj, size: filenameMod[ii]._size};
filenameMod[ii] = d;
search = false;
}
}
}
filenameMod.sort(function(a,b) {
return new Date(a.date).getTime() - new Date(b.date).getTime()
});
//filenameMod.reverse();
for (var ii = 0; ii < filenameMod.length; ii++) {
if (filenameMod[ii]._filename != '') {
WissKI.object3d.files[ii] = filenameMod[ii]._WissKI;
filename[ii] = filenameMod[ii]._filename;
ext[ii] = filenameMod[ii].ext;
size[ii] = filenameMod[ii].size;
if (ext[ii] == 'dae' || ext[ii] == 'DAE' || filenameMod[ii].size > 20971520) {
askUser = true;
}
}
}
if (askUser) {
$('#object3d-viewer').append("
Loading huge 3D files may cause website suspension and/or long loading time. Are you sure to load this content?
");
$( "#confirm-load" ).dialog({
resizable: false,
height: 210,
modal: true,
buttons: {
"Yes, load it anyway": function() {
$( this ).dialog( "close" );
performInit(filename);
},
Cancel: function() {
$('#spinText_begin').html("You cancelled loading process. There would be 3D content.");
//$("#object3d-viewer-canvas_0").remove();
spinner_begin.stop();
$( this ).dialog( "close" );
}
}
});
}
else
performInit(filename);
},
error: function () {
$('#object3d-viewer').append("
Loading huge 3D files may cause website suspension and/or long loading time. Are you sure to load this content?
");
$( "#confirm-load" ).dialog({
resizable: false,
height: 210,
modal: true,
buttons: {
"Yes, load it anyway": function() {
$( this ).dialog( "close" );
performInit(filename);
},
Cancel: function() {
$('#spinText_begin').html("You cancelled loading process. There would be 3D content.");
//$("#object3d-viewer-canvas_0").remove();
spinner_begin.stop();
$( this ).dialog( "close" );
}
}
});
}
});
}
else {
var search = true;
for (var ii = 0; ii < filename.length && search; ii++) {
if (filename[ii].indexOf("_preview") == 1) {
search = false;
var _tempName = filename[0];
var _tempExt = ext[0];
var _tempWissKI = WissKI.object3d.files[0]
filename [0] = filename[ii];
filename[ii] = _tempName;
ext[0] = ext[ii];
ext[ii] = _tempExt;
WissKI.object3d.files[0] = WissKI.object3d.files[ii];
WissKI.object3d.files[ii] = _tempWissKI;
performInit(filename);
}
else if (filename[ii].indexOf("_preview") !== -1) {
search = false;
var _tempName = filename[0];
var _tempExt = ext[0];
var _tempWissKI = WissKI.object3d.files[0]
filename [0] = filename[ii];
filename[ii] = _tempName;
ext[0] = ext[ii];
ext[ii] = _tempExt;
WissKI.object3d.files[0] = WissKI.object3d.files[ii];
WissKI.object3d.files[ii] = _tempWissKI;
performInit(filename);
}
}
if (search == false) {
//performInit(filename[0]);
}
else {
performInit(filename);
}
}
}
else {
if (is3D == true) {
var askUser = false;
$.ajax({
url: getModTime(WissKI.object3d.files, function (buf) {
var dd = buf.split("|");
dd[0] = dd[0].replace(/\\/g, '/');
dd[0] = dd[0].substring(dd[0].lastIndexOf('/') + 1, dd[0].lastIndexOf('.'));
dd[0] = dd[0].replace(/[|&;$%@"<>()+,]/g, "");
var str = {_modified: dd[1], _filename: dd[0], _size: dd[2]};
if (dd[2] > 20971520)
askUser = true;
filenameMod.push(str);
}),
complete: function () {
for (var ii = 0; ii < filenameMod.length; ii++) {
var search = true;
for (var jj = 0; jj < filename.length && search; jj++) {
if (filename[jj] == filenameMod[ii]._filename) {
var d = {_filename: filenameMod[ii]._filename, ext: ext[jj], _WissKI: WissKI.object3d.files[jj], date: new Date(filenameMod[ii]._modified), ind: jj, size: filenameMod[ii]._size};
filenameMod[ii] = d;
search = false;
}
}
}
/*filenameMod.sort(function(a,b) {
return new Date(a.date).getTime() - new Date(b.date).getTime()
});*/
//filenameMod.reverse();
for (var ii = 0; ii < filenameMod.length; ii++) {
if (filenameMod[ii]._filename != '') {
WissKI.object3d.files[ii] = filenameMod[ii]._WissKI;
filename[ii] = filenameMod[ii]._filename;
ext[ii] = filenameMod[ii].ext;
size[ii] = filenameMod[ii].size;
if (ext[ii] == 'dae' || ext[ii] == 'DAE' || filenameMod[ii].size > 20971520) {
askUser = true;
}
}
}
if (askUser) {
$('#object3d-viewer').append("
Loading huge 3D files may cause website suspension and/or long loading time. Are you sure to load this content?
");
$( "#confirm-load" ).dialog({
resizable: false,
height: 210,
modal: true,
buttons: {
"Yes, load it anyway": function() {
$( this ).dialog( "close" );
performInit(filename);
},
Cancel: function() {
$('#spinText_begin').html("You cancelled loading process. There would be 3D content.");
spinner_begin.stop();
$( this ).dialog( "close" );
}
}
});
}
else
performInit(filename);
//performInit(filename);
},
error: function () {
$('#object3d-viewer').append("
Loading huge 3D files may cause website suspension and/or long loading time. Are you sure to load this content?
");
$( "#confirm-load" ).dialog({
resizable: false,
height: 210,
modal: true,
buttons: {
"Yes, load it anyway": function() {
$( this ).dialog( "close" );
performInit(filename);
},
Cancel: function() {
$('#spinText_begin').html("You cancelled loading process. There would be 3D content.");
//$("#object3d-viewer-canvas_0").remove();
spinner_begin.stop();
$( this ).dialog( "close" );
}
}
});
}
});
}
else {
performInit(filename);
}
//performInit(filename);
}
}
}); // end ready
//-->