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
|
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
}
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.uid == base.wall.uid) 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
}
|