MX.MobileMovements = function (cam) { var touching = true, moving = false, startTime = null, v = 12, vr = Math.PI * 0.012, vx = vy = vz = 0; var directionLocked = false, directionLockThreshold = 5 var pos = { x: 0, y: viewHeight, z: 0, rotationX: 0, rotationY: 0 } var pointX, pointY, deltaX, deltaY, distX = 0, distY = 0, absDistX = 0, absDistY = 0, startTime return { init: function () { document.addEventListener("touchstart", function(e){ if (e.touches.length == 1) { touching = true startTime = Date.now() var point = event.touches[0] pointX = point.pageX pointY = point.pageY distX = distY = 0 pos.x = cam.x pos.z = cam.z pos.rotationY = cam.rotationY } }) document.addEventListener("touchmove", function(e){ e.preventDefault() if (e.touches.length == 1) { var timestamp = Date.now() var point = event.touches[0] deltaX = point.pageX - pointX deltaY = point.pageY - pointY pointX = point.pageX pointY = point.pageY distX += deltaX distY += deltaY absDistX = abs(distX) absDistY = abs(distY) } }) document.addEventListener("touchend", function(e){ e.preventDefault() if (e.touches.length == 0) { touching = directionLocked = false var timestamp = Date.now() var duration = startTime - timestamp if (duration < 300) { } } }) }, update: function () { if (distX || distY) { var oldDistY = absDistY, oldDistX = absDistX absDistY = avg(absDistY, 0, 5) var dy = (oldDistY - absDistY) * sign(distY) * 2 absDistX = avg(absDistX, 0, 5) var dx = (oldDistX - absDistX) * sign(distX) * 2 distY = sign(distY) * absDistY distX = sign(distX) * absDistX pos.x -= dy * Math.cos(pos.rotationY + Math.PI / 2) pos.z -= dy * Math.sin(pos.rotationY + Math.PI / 2) pos.rotationY += dx / (window.innerWidth) * Math.PI / 2 cam.rotationY = pos.rotationY app.tube("move", pos) } }, lock: function(){ locked = true }, unlock: function(){ locked = false }, scale: function(n){ if (n) scale = n; return scale }, resetScale: function(n){ scale = DEFAULT_SCALE }, gravity: function(g){ return typeof g == "boolean" ? gravity = g : gravity }, velocity: function(n){ v = clamp(n, 1, 50) }, jumpVelocity: function(n){ jumpV = clamp(n, 1, 50) }, } } // function momentum (current, start, time, lowerMargin, wrapperSize, deceleration) { // var distance = current - start, // speed = Math.abs(distance) / time, // destination, // duration; // // deceleration = deceleration === undefined ? 0.0006 : deceleration; // // destination = current + ( speed * speed ) / ( 2 * deceleration ) * ( distance < 0 ? -1 : 1 ); // duration = speed / deceleration; // // if ( destination < lowerMargin ) { // destination = wrapperSize ? lowerMargin - ( wrapperSize / 2.5 * ( speed / 8 ) ) : lowerMargin; // distance = Math.abs(destination - current); // duration = distance / speed; // } else if ( destination > 0 ) { // destination = wrapperSize ? wrapperSize / 2.5 * ( speed / 8 ) : 0; // distance = Math.abs(current) + destination; // duration = distance / speed; // } // // return { // destination: Math.round(destination), // duration: duration // }; // }