//https://maps.google.co.nz/maps/myplaces?ll=-38.75087,174.607258&spn=0.052479,0.154324&ctz=-780&t=h&z=13&layer=c&cbll=-38.750878,174.607314&panoid=N3qt_joqFI-93LKlaJBqBQ&cbp=11,198.35,,0,2.89
//https://maps.google.co.nz/?ll=-37.793237,175.303775&spn=0.001833,0.002411&t=h&z=19&layer=c&cbll=-37.793237,175.303775&panoid=qCIp44Wk4np0MUIEw_wjEA&cbp=12,98.51,,0,0
var fenway = new google.maps.LatLng(-37.793237, 175.303775);
var botswana = new google.maps.LatLng(-20.472393999999998, 24.515585999999995);
var NowyJork = new google.maps.LatLng(42.435272, -73.789272);
var sandy = new google.maps.LatLng(40.554113, -74.110851);
var sanFran = new google.maps.LatLng(37.775679, -122.425017);
var HMSOcelot = new google.maps.LatLng(51.395492,0.526726);
var geocoo = new google.maps.Geocoder();
$.urlParam = function(name){
var results = new RegExp('[\\?&]' + name + '=([^]*)').exec(window.location.href);
if (results==null){
return null;
}
else{
return results[1] || 0;
}
}
var startLocation;
var steps;
places = { hamilton: fenway,
botswana: botswana,
newyork: NowyJork,
sandy: sandy,
sanFran: sanFran,
submarine: HMSOcelot
}
var place = $.urlParam('place');
if(places[place]){
startLocation = places[place];
coolParty();
}
else if (!!place)
{
geocoo.geocode({address:decodeURIComponent(place)}, function(data, status){
console.log(data);
if(data[0])
startLocation = data[0].geometry.location;
else
startLocation = fenway;
coolParty();
});
}
else{ startLocation = fenway
coolParty();
}
var selectedLink;
var timeoutHandle;
var panorama;
var dataService;
var SVPaths = [];
function coolParty(){
var map = new google.maps.Map(
document.getElementById('map-canvas'));
var panoramaOptions = {
position: startLocation,
pov: {
heading: 90,
pitch: 10,
zoom: 1
},
linksControl:false,
panControl:false,
disableDefaultUI: true
};
dataService = new google.maps.StreetViewService();
panorama = new google.maps.StreetViewPanorama(document.getElementById('pano'), panoramaOptions);
map.setStreetView(panorama);
google.maps.event.addListener(panorama, "pov_changed", function() {
SyncThreeCamera(panorama.getPov().heading, panorama.getPov().pitch); //moved back to kinect
});
google.maps.event.addListener(panorama, "links_changed", function() {
console.log("nuking spheres and creating paths");
nukeSpheres();
createPaths();
});
google.maps.event.addListener(panorama, "zoom_changed", function(){
camera = cameraFromGoogleZoom(panorama.getZoom());
SyncThreeCamera(panorama.getPov().heading, panorama.getPov().pitch)
});
}
/*
function LoadLinks( depth ) {
var links = panorama.getLinks();
for ( var i = 0; i < links.length; ++i ) {
( function( panoLink ) {
dataService.getPanoramaById( panoLink.pano, function( svData, svStatus ) {
if ( svStatus == google.maps.StreetViewStatus.OK ) {
var distance = google.maps.geometry.spherical.computeDistanceBetween( panorama.getPosition(), svData.location.latLng );
var heading = panoLink.heading;
} else console.log( svData );
} );
} )( links[ i ] )
}
}*/
var skipSteps = 2;
function selecto(newIndex) {
var index = newIndex - 1;
var pathIndex = pickLink(panorama.getLinks());
//document.getElementById("kinectgripthing").innerHTML = "path: " + newIndex;
if(index >= SVPaths[pathIndex].length)
index = SVPaths[pathIndex].length - 1;
if (index >= 0 && SVPaths[pathIndex].length > index) {
selectSphere(SVPaths[pathIndex][index]);
return SVPaths[pathIndex][index];
} else
deselectSphere();
}
function selectSphere(link) {
if (link !== selectedLink) {
deselectSphere();
selectedLink = link;
if (selectedLink.sphere) {
selectedLink.sphere.scale = new THREE.Vector3(2, 2, 2);
selectoMore(selectedLink.sphere);
}
}
}
function deselectSphere() {
if (selectedLink && selectedLink.sphere){
selectedLink.sphere.scale = new THREE.Vector3(1, 1, 1);
if (selectedLink.sphere.anim)
userUnselectSphere(selectedLink.sphere);
}
selectedLink = null;
if (timeoutHandle !== null){
window.clearTimeout(timeoutHandle);
console.log("CLEARED TIMER")
}
}
var selectTime = 700;
function selectoMore(sphere) {
timeoutHandle = window.setTimeout(function() {
userSelectSphere(sphere);
/*
//separate stage 1
sphere.startTime = performance.now();
var speed = sphere.distance / selectTime;
//alert("heading equals " + sphere.heading + " and x equals " + sphere.position.x + " and distance equals " + sphere.distance );
//alert("all up is " + Math.sin(sphere.heading) * (sphere.position.x / sphere.distance));
var vec = new THREE.Vector3(Math.sin(sphere.heading) * (sphere.position.x / sphere.distance) , 0 , Math.cos(sphere.heading) * (sphere.position.z / sphere.distance) );
//alert("Raw vec is");
//alert(JSON.stringify(vec));
vec.normalize();
vec.multiplyScalar(speed);
//alert("scaled vec is");
//alert(JSON.stringify(vec));
sphere.vec = vec;
*/
/*
document.getElementById("kinectgripthing").innerHTML= "sphere " + sphere.id + ":
" + JSON.stringify(vec) + "
";
spheros.push(sphere);//begins animation
*/
}, selectTime);
console.log("SETTIMER");
}
function userSelectSphere(sphere){
//alert(JSON.stringify(getHipCameraPoint()));
sphere.anim = new Ease(sphere.startPos,getHipCameraPoint(), 500);
}
function userUnselectSphere(sphere){
var timeo = Math.min(500, sphere.anim.time)
sphere.anim = new Ease(sphere.position, sphere.startPos, timeo);
}
function jumpLoop(startPano) {
//console.log("entered jumpLoop with " + steps + " steps")
steps--;
getLinks(startPano, jumpLoopFinish);
}
function getLinks(startPano, finalMethod) {
dataService.getPanoramaById(startPano, function(StreetViewPanoramaData, StreetViewStatus) {
if (StreetViewStatus == "OK") pickHop(StreetViewPanoramaData.links, finalMethod);
else {
console.log("StreetViewStatus was " + StreetViewStatus + " so I gave up")
};
});
}
function jumpLoopFinish(responsePano) {
if (steps <= 0) { //break from loop
//panorama.setPano(responsePano);
dataService.getPanoramaById(responsePano.pano, function(svData, svStatus) {
if (svStatus == google.maps.StreetViewStatus.OK) {
var distance = google.maps.geometry.spherical.computeDistanceBetween(panorama.getPosition(), svData.location.latLng);
console.log("jumping to " + responsePano.pano);
var heading = google.maps.geometry.spherical.computeHeading(panorama.getPosition(), svData.location.latLng);
//createPanoSphere( heading, distance, responsePano );
panorama.setPano(responsePano.pano);
}
});
skipSteps++;
return;
}
console.log("steps = " + steps + " and going another round now from " + responsePano);
jumpLoop(responsePano.pano);
}
/**
*links, the collection of google streetview links
*finalMethod, method to pass result on to
**/
function pickLink(links) { //based off the current pano's heading return next forward jump
//console.log("Starting jump from " + startPano);
var setPano = null;
var povHeading = panorama.getPov().heading;
var minDiff = 360;
var theIndex;
//console.log("Starting picklink panorama pano is " + startPano);//+ " and startPano is " + startPano
for (var k = 0; k < links.length; k++) {
var linkBearing = (links[k].heading + 360) % 360;
var povHead = (povHeading + 360) % 360;
var diff = Math.abs(linkBearing - povHead);
//console.log("diff is " + diff + " at " + dummyLinks[k].pano);
if (diff > 180) {
diff = 360 - diff;
}
if (minDiff > diff) {
minDiff = diff;
setPano = links[k];
theIndex = k;
}
// console.log(links[k].description + " " + k + ": " + linkBearing + " minus " + povHead + " = " + (linkBearing - povHead) + ", mindiff is " + minDiff);
}
//console.log("Picked " + setPano + '\n');
//finalMethod( theIndex );
//console.log("k is " +k);
//console.log(theIndex);
return theIndex;
}
function pickHop(links) { //based off the current pano's heading return next forward jump
var setPano = null;
var povHeading = panorama.getPov().heading;
var minDiff = 360;
for (var k = 0; k < links.length; k++) {
var linkBearing = (links[k].heading + 360) % 360;
var povHead = (povHeading + 360) % 360;
var diff = Math.abs(linkBearing - povHead);
//console.log("diff is " + diff + " at " + dummyLinks[k].pano);
if (diff > 180) {
diff = 360 - diff;
}
if (minDiff > diff) {
minDiff = diff;
setPano = links[k];
}
}
return setPano;
}
function createPaths() {
console.log("Recomputing Paths");
var newPaths = panorama.getLinks();
SVPaths = [];
for (var i = 0; i < newPaths.length; ++i) {
SVPaths[i] = [newPaths[i]];
extendPath(SVPaths[i], 10);
}
console.log(SVPaths);
}
function extendPath(path, steps) {
var curLink = path[path.length - 1];
dataService.getPanoramaById(curLink.pano, function(svData, svStatus) {
if (svStatus == google.maps.StreetViewStatus.OK) {
var distance = google.maps.geometry.spherical.computeDistanceBetween(panorama.getPosition(), svData.location.latLng);
var heading = google.maps.geometry.spherical.computeHeading(panorama.getPosition(), svData.location.latLng);
createPanoSphere(heading, distance, curLink, svData.tiles.centerHeading);
curLink.distance = distance;
curLink.heading = heading;
} else
alert("Ohhh myyy goooooooooooood");
if (svStatus == "OK") pickExtendLink(curLink.heading, svData.links, function(nextLink) {
path.push(nextLink);
if (steps > 1)
extendPath(path, steps - 1);
});
else
console.log("StreetViewStatus was " + svStatus + " so I gave up");
});
}
function pickExtendLink(heading, links, finalMethod) { //based off the current pano's heading return next forward jump
//console.log("Starting jump from " + startPano);
var setPano = null;
var povHeading = heading;
var minDiff = 360;
//console.log("Starting picklink panorama pano is " + startPano);//+ " and startPano is " + startPano
for (var k = 0; k < links.length; k++) {
var linkBearing = (links[k].heading + 360) % 360;
var povHead = (povHeading + 360) % 360;
var diff = Math.abs(linkBearing - povHead);
//console.log("diff is " + diff + " at " + dummyLinks[k].pano);
if (diff > 180) {
diff = 360 - diff;
}
if (minDiff > diff) {
minDiff = diff;
setPano = links[k];
}
// console.log(links[k].description + " " + k + ": " + linkBearing + " minus " + povHead + " = " + (linkBearing - povHead) + ", mindiff is " + minDiff);
}
//console.log("Picked " + setPano + '\n');
finalMethod(setPano);
return setPano;
}