/*
var fenway = new google.maps.LatLng(42.345573,-71.098326);
var mapOptions = {
center: fenway,
zoom: 14
};
var map = new google.maps.Map(
document.getElementById('map-canvas'), mapOptions);
var panoramaOptions = {
position: fenway,
pov: {
heading: 34,
pitch: 10
}
};
var panorama = new google.maps.StreetViewPanorama(document.getElementById('pano'),panoramaOptions);
map.setStreetView(panorama);
*/
"use strict";
var SkeletonTrackingState = {
NotTracked: 0,
Position: 1,
Tracked: 2
};
var jointTrackingState = {
Inferred: 1,
NotTracked: 0,
Tracked: 2
}; //need to work out which means its tracked, probably wrong right now
var JointType = {
HipCenter: 0,
Spine: 1,
ShoulderCenter: 2,
Head: 3,
ShoulderLeft: 4,
ElbowLeft: 5,
WristLeft: 6,
HandLeft: 7,
ShoulderRight: 8,
ElbowRight: 9,
WristRight: 10,
HandRight: 11,
HipLeft: 12,
KneeLeft: 13,
Ankle: 14,
FootLeft: 15,
HipRight: 16,
KneeRight: 17,
AnkleRight: 18,
FootRight: 19
}
var offset = 0;
var handPointer = null;
var pressExtentY;
var pressOriginY;
var jumps;
$( document ).ready( function() {
function testBox( col ) {
var b = document.createElement( 'div' );
b.style.width = '200px';
b.style.height = '50px';
b.style.position = 'relative';
b.style.top = '150px';
b.style.backgroundColor = col;
b.style.fontSize = 'x-large';
document.body.appendChild( b );
return b;
}
//var s4 = testBox('red');
//var s3 = testBox('green');
var streamImageWidth = 640;
var streamImageHeight = 480;
var streamImageResolution = streamImageWidth.toString() + "x" + streamImageHeight.toString();
var isSensorConnected = false;
var engagedUser = null;
var cursor = null;
var userViewerCanvasElement = null;
var backgroundRemovalCanvasElement = null;
var inPress = false;
var isGripping = false;
// Log errors encountered during sensor configuration
function configError( statusText, errorData ) {
console.log( ( errorData != null ) ? JSON.stringify( errorData ) : statusText );
}
// Determine if the specified object has any properties or not
function isEmptyObject( obj ) {
if ( obj == null ) {
return true;
}
var numProperties = 0;
for ( var prop in obj ) {
if ( obj.hasOwnProperty( prop ) ) {
++numProperties;
}
}
return numProperties <= 0;
}
// Show or hide the cursor
function setCursorVisibility( isVisible ) {
if ( cursor == null ) {
return;
}
if ( isVisible ) {
cursor.show();
} else {
cursor.hide();
}
}
// Show or hide a canvas element
function setCanvasVisibility( canvasElement, isVisible ) {
if ( canvasElement == null ) {
return;
}
var canvasQuery = $( canvasElement );
if ( isVisible ) {
if ( !canvasQuery.hasClass( "showing" ) ) {
// Clear canvas before showing it
var canvasContext = canvasElement.getContext( "2d" );
canvasContext.clearRect( 0, 0, streamImageWidth, streamImageHeight );
}
canvasQuery.addClass( "showing" );
} else {
canvasQuery.removeClass( "showing" );
}
}
window.addEventListener( "handPointerGrip", function() {
//alert("I'm cool")
//linkHop();
isGripping = true;
$('#kinect-cursor-normal').attr("xlink:href","#kinect-grip-hand-base");
//alert(handPointer.isInGripInteraction);
/*
var uiController = new KinectUIController();
var othercursor = document.getElementById(uiController.CURSOR_ID);
console.log(JSON.stringify(cursor));
console.log(JSON.stringify(othercursor));
$(othercursor).addClass("kinect-grip-hand-base");
*/
} );
window.addEventListener( "handPointerGripRelease", function() {
isGripping = false;
$('#kinect-cursor-normal').attr("xlink:href","#kinect-open-hand-base");
if(selectedLink) {console.log("jumping to" + selectedLink); panorama.setPano(selectedLink.pano); selectedLink = null;}
} );
var pressOrigin;
var pressExtent = 0;
window.addEventListener( "handPointerPress", function() {
//alert("I'm cool")
if ( !inPress ) {
inPress = true;
}
} );
/*
window.addEventListener( "handPointerPressRelease",function(){
//alert("I'm not cool")
//console.log("Press extended " + (pressExtent - pressOrigin) + " distance units");
var extent = (pressExtent - pressOrigin);
document.getElementById("kinectgripthing").innerHTML = "press extent: " + extent.toFixed(2) + "
" + "pressOrigin = " + pressOrigin.toFixed(2) + '
' + "pressDest = " + pressExtent.toFixed(2);
if(extent > .07){
if(!isGripping) linkHop();
else {
steps = skipSteps;
jumpLoop(panorama.getPano());
}
}
if(inPress)
inPress = false;
});*/
/*document.getElementById( "pano" ).addEventListener( "handPointerLeave", function() {
isGripping = false;
$('#kinect-cursor-normal').attr("xlink:href","#kinect-open-hand-base");
} );*/
/*
document.getElementById( "pano" ).addEventListener( "handPointerEnter", function() {
console.log("Hand Entered");
if(handPointer){
if(handPointer.IsInGripInteraction){
$('#kinect-cursor-normal').attr("xlink:href","#kinect-grip-hand-base");
isGripping = true;
console.log("found hand grip");
}
else{
$('#kinect-cursor-normal').attr("xlink:href","#kinect-open-hand-base");
isGripping = false;
console.log("found hand normal");
}
}
else
{ $('#kinect-cursor-normal').attr("xlink:href","#kinect-open-hand-base"); console.log("I goofed");}
} );
*/
// Update sensor state and perform UI transitions (showing/hiding appropriate UI elements)
// related to sensor status or engagement state changes
var delayedConfigTimeoutId = null;
function updateUserState( newIsSensorConnected, newEngagedUser, sensorToConfig ) {
var hasEngagedUser = engagedUser != null;
var newHasEngagedUser = newEngagedUser != null;
// If there's a pending configuration change when state changes again, cancel previous timeout
if ( delayedConfigTimeoutId != null ) {
clearTimeout( delayedConfigTimeoutId );
delayedConfigTimeoutId = null;
}
if ( ( isSensorConnected != newIsSensorConnected ) || ( engagedUser != newEngagedUser ) ) {
if ( newIsSensorConnected ) {
var immediateConfig = {};
var delayedConfig = {};
immediateConfig[ Kinect.INTERACTION_STREAM_NAME ] = {
"enabled": true
};
immediateConfig[ Kinect.USERVIEWER_STREAM_NAME ] = {
"resolution": streamImageResolution
};
immediateConfig[ Kinect.BACKGROUNDREMOVAL_STREAM_NAME ] = {
"resolution": streamImageResolution
};
immediateConfig[ Kinect.SKELETON_STREAM_NAME ] = {
"enabled": true
};
setCursorVisibility( newHasEngagedUser );
setCanvasVisibility(userViewerCanvasElement, !newHasEngagedUser);
setCanvasVisibility( backgroundRemovalCanvasElement, newHasEngagedUser );
if ( newHasEngagedUser ) {
immediateConfig[ Kinect.BACKGROUNDREMOVAL_STREAM_NAME ].enabled = true;
immediateConfig[ Kinect.BACKGROUNDREMOVAL_STREAM_NAME ].trackingId = newEngagedUser;
delayedConfig[ Kinect.USERVIEWER_STREAM_NAME ] = {
"enabled": false
};
} else {
immediateConfig[ Kinect.USERVIEWER_STREAM_NAME ].enabled = true;
if ( hasEngagedUser ) {
delayedConfig[ Kinect.BACKGROUNDREMOVAL_STREAM_NAME ] = {
"enabled": false
};
}
}
// Perform immediate configuration
sensorToConfig.postConfig( immediateConfig, configError );
// schedule delayed configuration for 2 seconds later
if ( !isEmptyObject( delayedConfig ) ) {
delayedConfigTimeoutId = setTimeout( function() {
sensorToConfig.postConfig( delayedConfig, configError );
delayedConfigTimeoutId = null;
}, 2000 );
}
} else {
setCursorVisibility( false );
setCanvasVisibility(userViewerCanvasElement, false);
setCanvasVisibility( backgroundRemovalCanvasElement, false );
}
}
isSensorConnected = newIsSensorConnected;
engagedUser = newEngagedUser;
}
// Get the id of the engaged user, if present, or null if there is no engaged user
function findEngagedUser( userStates ) {
var engagedUserId = null;
for ( var i = 0; i < userStates.length; ++i ) {
var entry = userStates[ i ];
if ( entry.userState == "engaged" ) {
engagedUserId = entry.id;
break;
}
}
return engagedUserId;
}
// Respond to user state change event
function onUserStatesChanged( newUserStates ) {
var newEngagedUser = findEngagedUser( newUserStates );
updateUserState( isSensorConnected, newEngagedUser, sensor );
}
// Create sensor and UI adapter layers
var sensor = Kinect.sensor( Kinect.DEFAULT_SENSOR_NAME, function( sensorToConfig, isConnected ) {
if ( isConnected ) {
// Determine what is the engagement state upon connection
sensorToConfig.getConfig( function( data ) {
var engagedUserId = findEngagedUser( data[ Kinect.INTERACTION_STREAM_NAME ].userStates );
//alert( JSON.stringify( data ) );
updateUserState( true, engagedUserId, sensorToConfig );
} );
} else {
updateUserState( false, engagedUser, sensorToConfig );
}
} );
var uiAdapter = KinectUI.createAdapter( sensor );
//KinectUI.setIsGripTarget(document.getElementById("kinectgripthing"), true);
//KinectUI.setIsGripTarget(document.getElementById("pano"), true);
uiAdapter.promoteButtons();
cursor = uiAdapter.createDefaultCursor();
userViewerCanvasElement = document.getElementById("userViewerCanvas");
backgroundRemovalCanvasElement = document.getElementById( "backgroundRemovalCanvas" );
//uiAdapter.bindStreamToCanvas(Kinect.USERVIEWER_STREAM_NAME, userViewerCanvasElement);
uiAdapter.bindStreamToCanvas( Kinect.BACKGROUNDREMOVAL_STREAM_NAME, backgroundRemovalCanvasElement );
var oldHeading = 0;
sensor.addStreamFrameHandler( function( frame ) {
//document.getElementById("kinectgripthing").innerHTML="pie" +offset+ " pie2 " + isGripping;
switch ( frame.stream ) {
case Kinect.SKELETON_STREAM_NAME:
for ( var iSkeleton = 0; iSkeleton < frame.skeletons.length; ++iSkeleton ) {
var skeleton = frame.skeletons[ iSkeleton ];
if ( skeleton.trackingState == 2 && skeleton.trackingId == engagedUser ) {
//console.log("number of uiAdapter handPointers is " + uiAdapter.handPointers.length);
for(var j = 0; j < uiAdapter.handPointers.length; j++){
if(uiAdapter.handPointers[j].getIsPrimaryHandOfPrimaryUser() && uiAdapter.handPointers[j].isTracked) {
handPointer = uiAdapter.handPointers[j];
pressExtentY = handPointer.rawY;
if ( !isGripping ) {
pressOriginY = handPointer.rawY;
} else {
var diffY = ( -pressExtentY + pressOriginY );
var newJumps = Math.round( diffY * 15 );
//if ( jumps != newJumps ) {
steps = jumps = newJumps;
//alert(jumps);
//document.getElementById( "kinectgripthing" ).innerHTML = "press extentY: " + diffY.toFixed( 2 ) + "
" + "pressOriginY = " + pressOriginY.toFixed( 2 ) + '
' + "newJumps = " + newJumps;
//jumpLoop( panorama.getPano() );
selecto(steps);
//}
}
if ( !inPress ) {
pressOrigin = handPointer.rawZ;
}
else if ( inPress ) {
pressExtent = handPointer.rawZ;
//console.log(cursor);
var extent = ( pressExtent - pressOrigin );
//document.getElementById( "kinectgripthing" ).innerHTML = "extent check has failed
pressOrigin = " + pressOrigin.toFixed( 2 ) + '
' + "pressDest = " + pressExtent.toFixed( 2 )+ "
" + "press extent: " + extent.toFixed( 2 );
if ( extent > .05 ) {
//document.getElementById( "kinectgripthing" ).innerHTML = "extent check has passed
pressOrigin = " + pressOrigin.toFixed( 2 ) + '
' + "pressDest = " + pressExtent.toFixed( 2 ) + "
" + "press extent: " + extent.toFixed( 2 );
/*console.log( "link hopping" );
linkHop();*/
inPress = false;
}
}
break;}
}
var x = skeleton.boneOrientations[ JointType.ShoulderCenter ].absoluteRotation.matrix.m13;
var y = skeleton.boneOrientations[ JointType.ShoulderCenter ].absoluteRotation.matrix.m23;
var z = skeleton.boneOrientations[ JointType.ShoulderCenter ].absoluteRotation.matrix.m33;
//var tilt = skeleton.joints[JointType.Head].position.z - skeleton.joints[JointType.ShoulderCenter].position.z;
var len = x * x + z * z;
x = x / len;
z = z / len;
var orient = Math.atan2( x, z );
var heading = orient * ( 180 / Math.PI ) * 2 + 70;
var pitch = y * 180 - 20;
//heading = 0.9 * oldHeading + 0.1 * heading;
//if(heading > 360){alert("heading hsa gone full circle and more")}
oldHeading = heading;
var pov = panorama.getPov();
//alert(cursor);
//console.log(cursor.IsInGripInteraction);
//if the user is not gripping, move their view
if ( !isGripping ) {
pov.heading = heading + offset;
pov.pitch = pitch;
panorama.setPov( pov );
SyncThreeCamera( pov.heading, pov.pitch );
} else {
offset = ( pov.heading + 360 ) - ( heading + 360 );
offset = offset % 360;
//alert(offset);
}
}
//SyncThreeCamera(pov.heading, pov.pitch)
//var kin = document.getElementById("kinectgripthing");
//kin.innerHTML = x + "
" + y + "
" + z +"
" + Math.atan2(x, z);
//kin.innerHTML = "Heading is " + "
" + heading;
//if(g){console.log(JSON.stringify(skeleton)); g = !g}
//s1.left = skeleton.joint[]
/*skeleton.trackingId;
skeleton.trackingState;
skeleton.position;*/
}
break;
}
} );
//braeden done
sensor.addEventHandler( function( event ) {
switch ( event.category ) {
case Kinect.USERSTATE_EVENT_CATEGORY:
switch ( event.eventType ) {
case Kinect.USERSTATESCHANGED_EVENT_TYPE:
onUserStatesChanged( event.userStates );
break;
}
break;
}
} );
} );
function modePov( list ) {
var count = 0;
var mode;
for ( var i = 0; i < list.length - 1; i++ ) {
var tempCount = 0;
for ( var j = 1; j < list.length; j++ ) {
console.log( list[ i ].heading + " against " + list[ j ].heading )
if ( list[ i ].heading == list[ i ].heading ) {
tempCount++;
//alert("BANG BANG");
}
}
if ( tempCount > count ) {
mode = list[ i ];
count = tempCount;
} //console.log("setting mode from heading " + mode.heading);
}
console.log( "mode had frequency of " + count );
//console.log(list);
return mode;
}
document.addEventListener( 'keydown', function( e ) {
var keyCode = e.keyCode;
/*sensor.getConfig((function(data){
alert("ALERT ALERT Keydown detected \r\n" + JSON.stringify(data))
}));*/
} );
function linkHop() {
var panoLink = pickHop( panorama.getLinks());
console.log(panoLink);
panorama.setPano(panoLink.pano);
}
function keyDownTextField(e){
var keyCode = e.keyCode;
if(keyCode == 69){
selectedLink = selecto(4);
}
}