summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulie Lala <jules@okfoc.us>2014-04-27 02:12:28 -0400
committerJulie Lala <jules@okfoc.us>2014-04-27 02:12:28 -0400
commit02dd0344889f45701021e86efef8d04b56175047 (patch)
tree65d9eef3cd0461e427e090128d372c7d002e64e5
parentfb7405f016f9f26b0fc81fb8a26dacd2b2350fa0 (diff)
group coincident walls
-rw-r--r--assets/javascripts/rectangles/engine/builder.js18
-rw-r--r--assets/javascripts/rectangles/models/room.js61
-rw-r--r--assets/javascripts/rectangles/models/wall.js20
-rw-r--r--assets/javascripts/rectangles/util/sort.js20
-rw-r--r--rectangles-stone.html1
-rw-r--r--rectangles.html3
6 files changed, 92 insertions, 31 deletions
diff --git a/assets/javascripts/rectangles/engine/builder.js b/assets/javascripts/rectangles/engine/builder.js
index d5caeee..748e8c5 100644
--- a/assets/javascripts/rectangles/engine/builder.js
+++ b/assets/javascripts/rectangles/engine/builder.js
@@ -42,13 +42,15 @@ var builder = new function(){
function bind (){
clipper.rooms.forEach(function(room){
- room.bind()
+ var walls = room.group_walls()
+ walls.forEach(function(wall){ wall.bind() })
})
}
function clear (){
els.forEach(function(el){
scene.remove(el)
+ el.destroy && el.destroy()
})
els = []
}
@@ -70,6 +72,7 @@ var builder = new function(){
el.x = region.x.a + width/2
el.y = height/2
el.z = region.y.a
+ el.rect = region
el.side = FRONT
room.walls.push(el)
list.push(el)
@@ -82,6 +85,7 @@ var builder = new function(){
el.x = region.x.b - width/2
el.y = height/2
el.z = region.y.b
+ el.rect = region
el.side = BACK
room.walls.push(el)
list.push(el)
@@ -94,6 +98,7 @@ var builder = new function(){
el.x = region.x.a
el.y = height/2
el.z = region.y.a + depth/2
+ el.rect = region
el.side = LEFT
room.walls.push(el)
list.push(el)
@@ -106,6 +111,7 @@ var builder = new function(){
el.x = region.x.b
el.y = height/2
el.z = region.y.b - depth/2
+ el.rect = region
el.side = RIGHT
room.walls.push(el)
list.push(el)
@@ -180,6 +186,7 @@ var builder = new function(){
el.x = region.x.a
el.y = lo.height + height/2
el.z = region.y.a + depth/2
+ el.rect = region
list.push(el)
hi.walls.push(el)
region.half_sides |= LEFT
@@ -193,6 +200,7 @@ var builder = new function(){
el.x = region.x.b
el.y = lo.height + height/2
el.z = region.y.b - depth/2
+ el.rect = region
list.push(el)
hi.walls.push(el)
region.half_sides |= RIGHT
@@ -206,6 +214,7 @@ var builder = new function(){
el.x = region.x.a + width/2
el.y = lo.height + height/2
el.z = region.y.a
+ el.rect = region
list.push(el)
hi.walls.push(el)
region.half_sides |= FRONT
@@ -219,6 +228,7 @@ var builder = new function(){
el.x = region.x.b - width/2
el.y = lo.height + height/2
el.z = region.y.b
+ el.rect = region
list.push(el)
hi.walls.push(el)
region.half_sides |= BACK
@@ -237,6 +247,7 @@ var builder = new function(){
el.y = 0
el.z = region.y.a + depth/2
el.rotationX = PI/2
+ el.rect = region
el.side = FLOOR
return el
}
@@ -252,6 +263,7 @@ var builder = new function(){
el.y = height
el.z = region.y.a + depth/2
el.rotationX = -PI/2
+ el.rect = region
el.side = CEILING
return el
}
@@ -264,6 +276,10 @@ var builder = new function(){
el.type = "Face"
el.el.style.opacity = 1.0
el.side = 0
+ el.rect = null
+ el.destroy = function(){
+ this.el = this.rect = null
+ }
return el
}
diff --git a/assets/javascripts/rectangles/models/room.js b/assets/javascripts/rectangles/models/room.js
index 34eed6a..f7c52d4 100644
--- a/assets/javascripts/rectangles/models/room.js
+++ b/assets/javascripts/rectangles/models/room.js
@@ -53,23 +53,64 @@ window.Room = (function(){
Room.prototype.group_walls = function(){
var base = this
- var array_groups = {}, rect_groups = []
+ var side_groups = {}, walls = []
+
+ base.walls.forEach(function(wall){
- sort_wall_els_by_x_then_z(base.walls)
+ // ignore half-walls for now
+ if (! wall.side) return;
- base.walls.forEach(function(wall){
- var w = array_groups[ wall.side ]
- if (w) {
- w.forEach(function(ww){
-
- })
+ if (side_groups[ wall.side ]) {
+ side_groups[ wall.side ].push(wall)
+ }
+ else {
+ side_groups[ wall.side ] = [wall]
+ }
+ })
+
+ pairs(side_groups).forEach(function(pair){
+ var side = pair[0], els = pair[1]
+
+ console.log(sidesToString(side))
+ if (side & LEFT_RIGHT) {
+ els.sort(compare_x)
+ console.log(els.map(function(r){ return r.rect+"" }).join("\n"))
}
else {
- array_groups[ wall.side ] = [[wall]]
+ console.log(els.map(function(r){ return r.rect+"" }).join("\n"))
}
+
+ var wall = new_wall(els.shift())
+ walls.push(wall)
+
+ els.forEach(function(el){
+ console.log(wall.rect.x.b, el.rect.x.a, el.rect.sides & LEFT_RIGHT)
+ if (side & FRONT_BACK && wall.rect.x.b == el.rect.x.a) {
+ wall.rect.x.b = el.rect.x.b
+ wall.mx.push(el)
+ }
+ else if (side & LEFT_RIGHT && wall.rect.y.b == el.rect.y.a) {
+ wall.rect.y.b = el.rect.y.b
+ wall.mx.push(el)
+ }
+ else {
+ wall = new_wall(el)
+ walls.push(wall)
+ }
+ })
+ console.log(walls.length)
})
- return groups
+ function new_wall (el) {
+ return new Wall ({
+ room: base.id,
+ side: el.side,
+ rect: el.rect.clone(),
+ el: el,
+ })
+ }
+
+ return walls
}
Room.prototype.clipTo = function(r){
diff --git a/assets/javascripts/rectangles/models/wall.js b/assets/javascripts/rectangles/models/wall.js
index b9705a2..50ae0e8 100644
--- a/assets/javascripts/rectangles/models/wall.js
+++ b/assets/javascripts/rectangles/models/wall.js
@@ -3,9 +3,14 @@ window.Wall = (function(){
var Wall = function(opt){
this.id = opt.id
this.room = opt.room
- this.rect = opt.rect
+ this.rect = opt.rect || new Rect (0,0,0,0)
+ this.rect.sides = opt.side
+ this.side = opt.side
this.mx = []
this.els = []
+ if (opt.el) {
+ this.mx.push(opt.el)
+ }
}
Wall.prototype.toString = function(){
@@ -14,15 +19,24 @@ window.Wall = (function(){
Wall.prototype.reset = function(){
}
+ Wall.prototype.destroy = function(){
+ this.mx.forEach(function(mx){
+ mx.destroy && mx.destroy()
+ })
+ this.room = this.rect = this.mx = this.els = null
+ }
Wall.prototype.bind = function(){
- this.$walls.bind({
+ var base = this
+ base.$walls = $( this.mx.map(function(mx){ return mx.el }) )
+ base.$walls.bind({
mouseover: function(){
},
mousemove: function(e){
},
mousedown: function(){
- $(this).css("background-color", choice(window.palettes.colors))
+ base.$walls.css("background-color", choice(window.palettes.colors))
+ console.log("zz")
}
})
}
diff --git a/assets/javascripts/rectangles/util/sort.js b/assets/javascripts/rectangles/util/sort.js
index 008e20a..17231ea 100644
--- a/assets/javascripts/rectangles/util/sort.js
+++ b/assets/javascripts/rectangles/util/sort.js
@@ -58,21 +58,9 @@ function sort_rects_by_area(list){
.map(function(r){ return r[1] })
}
-
-function sort_wall_els_by_x_then_z(list){
- return list.sort(function(a,b){
- return sort_wall_els_by_x(a,b) || sort_wall_els_by_z(a,b)
- })
-}
-
-function sort_wall_els_by_z(list){
- return list.sort(function(a,b){
- return a.z < b.z ? -1 : a.z == b.z ? 0 : 1
- })
+function compare_z(a,b){
+ return a.rect.y.a < b.rect.y.a ? -1 : a.rect.y.a == b.rect.y.a ? 0 : 1
}
-function sort_wall_els_by_x(a){
- return list.sort(function(a,b){
- return a.x < b.x ? -1 : a.x == b.x ? 0 : 1
- })
+function compare_x(a,b){
+ return a.rect.x.a > b.rect.x.a ? -1 : a.rect.x.a == b.rect.x.a ? 0 : 1
}
-
diff --git a/rectangles-stone.html b/rectangles-stone.html
index 05983ae..16fd49f 100644
--- a/rectangles-stone.html
+++ b/rectangles-stone.html
@@ -63,6 +63,7 @@ body > div {
<script type="text/javascript" src="assets/javascripts/rectangles/util/keys.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/models/tree.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/models/room.js"></script>
+<script type="text/javascript" src="assets/javascripts/rectangles/models/wall.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/models/rect.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/models/vec2.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/engine/builder.js"></script>
diff --git a/rectangles.html b/rectangles.html
index ab36bf2..6d651f2 100644
--- a/rectangles.html
+++ b/rectangles.html
@@ -80,8 +80,9 @@ body > div {
<script type="text/javascript" src="assets/javascripts/rectangles/util/wheel.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/util/mouse.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/util/keys.js"></script>
-<script type="text/javascript" src="assets/javascripts/rectangles/models/tree.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/models/room.js"></script>
+<script type="text/javascript" src="assets/javascripts/rectangles/models/wall.js"></script>
+<script type="text/javascript" src="assets/javascripts/rectangles/models/tree.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/models/rect.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/models/vec2.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/engine/builder.js"></script>