summaryrefslogtreecommitdiff
path: root/assets/javascripts/rectangles/engine/builder.js
blob: edca2ed83f11201b1d1a6747ea41838295b9dec0 (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
var builder = new function(){
	var base = this
	base.tube = new Tube ()
	
	var els = []

	base.init = function(){
		base.bind()
	}

	base.bind = function(){
		base.tube.on("clipper:update", rebuild)
	}

	base.wheel = new wheel({
		el: document.querySelector("#map"),
		update: function(e, val, delta){
			console.log(e.clientX, e.clientY, delta)
		}
	})
	
	function rebuild(){
		if (window.scene) {
			clear()
			build()
		}
	}
	function build (){
		clipper.regions.forEach(function(r){
			walls(r).forEach(function(el){
				els.push(el)
				scene.add(el)
			})
		})
	}
	function clear (){
		els.forEach(function(el){
			scene.remove(el)
		})
		els = []
	}

	function walls (r){
		var list = [], el = null
		
		var width = r.x.length()
		var depth = r.y.length()
		var height = clipper.rooms[r.id].height

		if (r.sides & FRONT) {
			el = wall('.front')
			el.width = width
			el.height = height
			el.rotationY = PI
			el.x = r.x.a + width/2
			el.z = r.y.a
			list.push(el)
		}
		if (r.sides & BACK) {
			var el = wall('.back')
			el.width = width
			el.height = height
			el.rotationY = 0
			el.x = r.x.b - width/2
			el.z = r.y.b
			list.push(el)
		}
		if (r.sides & LEFT) {
			el = wall('.left')
			el.rotationY = HALF_PI
			el.height = height
			el.width = depth
			el.x = r.x.a
			el.z = r.y.a + depth/2
			list.push(el)
		}
		if (r.sides & RIGHT) {
			el = wall('.right')
			el.rotationY = -HALF_PI
			el.height = height
			el.width = depth
			el.x = r.x.b
			el.z = r.y.b - depth/2
			list.push(el)
		}

		el = wall('.bottom')
		el.height = depth
		el.width = width
		el.x = r.x.a + width/2
		el.y = 0
		el.z = r.y.a + depth/2
		el.rotationX = PI/2
		el.el.style.backgroundColor = "#f00"
		list.push(el)

		if (r.sides != 0) {
			el = wall('.top')
			el.height = depth
			el.width = width
			el.x = r.x.a + width/2
			el.y = height
			el.z = r.y.a + depth/2
			el.rotationX = -PI/2
			el.el.style.backgroundColor = "#00f"
			list.push(el)
		}

		function wall(klass){
			var el = new MX.Object3D(".face" + (klass || ""))
			el.width = el.height = el.scaleX = el.scaleY = el.scaleZ = 1
			el.z = el.y = el.x = 0
			el.y = height/2
			el.type = "Face"
			el.el.style.opacity = 1.0
			return el
		}
		
		return list
	}

}