summaryrefslogtreecommitdiff
path: root/public/assets/javascripts/mx/extensions/mx.movementsMobile.js
blob: 994c8d74ba695e13b6a4d4c6ffaa3fe155119dd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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
// 	};
// }