summaryrefslogtreecommitdiff
path: root/assets/javascripts/rectangles/engine/scenery/image/move.js
blob: e79ede9a9fa4c66b1c2a76fe26b695a8238f1f89 (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
Scenery.image.move = function(base){

	var x, y, z, bounds
	var dragging = false

	this.bind = function(){
		Scenery.mouse.bind_el(base.mx_img.el)
		Scenery.mouse.on("down", down)
		Scenery.mouse.on("enter", switch_wall)
		Scenery.mouse.on("drag", drag)
		Scenery.mouse.on("up", up)
	}

	this.unbind = function(){
		Scenery.mouse.bind_el(base.mx_img.el)
		Scenery.mouse.off("down", down)
		Scenery.mouse.off("enter", switch_wall)
		Scenery.mouse.off("drag", drag)
		Scenery.mouse.off("up", up)
	}
	
	function down (e, cursor){
		if (e.target != base.mx_img.el) return;
		dragging = true
		x = base.mx_img.x
		y = base.mx_img.y
		z = base.mx_img.z
		bounds = base.bounds
		document.body.classList.add("dragging")
	}
	
	function drag (e, cursor){
		if (! dragging) return
		
		base.mx_img.y = bounds.y.clamp( y - cursor.y.magnitude()*cursor_amp )
		switch (base.wall.side) {
			case FRONT:
			case BACK:
				base.mx_img.x = bounds.x.clamp( x + cos(wall_rotation[base.wall.side]) * cursor.x.magnitude()*cursor_amp )
				break
			case LEFT:
			case RIGHT:
				base.mx_img.z = bounds.x.clamp( z + sin(wall_rotation[base.wall.side]) * cursor.x.magnitude()*cursor_amp )
				break
		}
		
		Scenery.resize.move_dots()
	}

	function up (e, cursor){
		dragging = false
		document.body.classList.remove("dragging")
	}
	
	function switch_wall (e, new_wall, cursor){
		if (! dragging) return
		if (new_wall.uid == base.wall.uid) return
		if (! new_wall.fits(base.img)) return

		base.bounds = bounds = new_wall.bounds_for(base.img)
		base.center = new_wall.center()

		x = base.center.a
		z = base.center.b
		
		var wall_group = base.wall.side | new_wall.side
		
		if (base.wall.side !== new_wall.side && wall_group !== FRONT_BACK && wall_group !== LEFT_RIGHT) {
			switch (base.wall.side) {
				case FRONT:
					z = bounds.x.a
					break
				case BACK:
					z = bounds.x.b
					break
				case LEFT:
					x = bounds.x.a
					break
				case RIGHT:
					x = bounds.x.b
					break
			}
		}

		cursor.x.a = cursor.x.b
		
		base.mx_img.move({
			x: x,
			z: z,
			rotationY: wall_rotation[ new_wall.side ]
		})
		
		base.wall = new_wall

		Scenery.resize.rotate_dots()
		Scenery.resize.move_dots()
	}
	
	return this

}