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

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

	this.bind = function(){
		Scenery.mouse.bind_el(base.mx.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.unbind_el(base.mx.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.el) return;
		if (editor.permissions.destroy) {
			Scenery.remove(base.id)
			return
		}

		// load the modal
		app.controller.pick(base)

		if (! (editor.permissions.move || editor.permissions.resize) ) {
			e.clickAccepted = false
			return
		}
		dragging = true
		x = base.mx.x
		y = base.mx.y
		z = base.mx.z
		bounds = base.bounds
		document.body.classList.add("dragging")
	}
	
	function drag (e, cursor){
		if (! dragging) return

		base.mx.y = bounds.y.clamp( y - cursor.y.magnitude()*cursor_amp )
		switch (base.wall.side) {
			case FRONT:
			case BACK:
				base.mx.x = bounds.x.clamp( x + cos(wall_rotation[base.wall.side]) * cursor.x.magnitude()*cursor_amp )
				break
			case LEFT:
			case RIGHT:
				base.mx.z = bounds.x.clamp( z + sin(wall_rotation[base.wall.side]) * cursor.x.magnitude()*cursor_amp )
				break
		}
		
		if (editor.permissions.resize) {
			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.id == base.wall.id) return
		if (! new_wall.fits(base.media, base.scale)) return

		var old_wall_side = base.wall.side
		var wall_group = old_wall_side | new_wall.side

		base.set_wall(new_wall)

		bounds = base.bounds
		x = base.center.a
		z = base.center.b
		
		if (old_wall_side !== new_wall.side && wall_group !== FRONT_BACK && wall_group !== LEFT_RIGHT) {
			switch (old_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.move({
			x: x,
			z: z,
			rotationY: wall_rotation[ new_wall.side ]
		})

		if (editor.permissions.resize) {
			Scenery.resize.rotate_dots()
			Scenery.resize.move_dots()
		}
	}
	
	return this

}