summaryrefslogtreecommitdiff
path: root/public/assets/javascripts/rectangles/engine
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/javascripts/rectangles/engine')
-rw-r--r--public/assets/javascripts/rectangles/engine/rooms/_rooms.js196
-rw-r--r--public/assets/javascripts/rectangles/engine/rooms/builder.js529
-rw-r--r--public/assets/javascripts/rectangles/engine/rooms/clipper.js189
3 files changed, 507 insertions, 407 deletions
diff --git a/public/assets/javascripts/rectangles/engine/rooms/_rooms.js b/public/assets/javascripts/rectangles/engine/rooms/_rooms.js
index e0033e3..f7fad3e 100644
--- a/public/assets/javascripts/rectangles/engine/rooms/_rooms.js
+++ b/public/assets/javascripts/rectangles/engine/rooms/_rooms.js
@@ -1,99 +1,139 @@
-var Rooms = new function(){
-
- var base = this
-
- base.list = {}
- base.walls = {}
- base.regions = []
+(function(){
- base.init = function(){
- Rooms.builder.init()
- Rooms.clipper.init()
- Rooms.mover.init()
+ var vec2, Rect, Room, sort, UidGenerator, _
+ if ('window' in this) {
+ vec2 = window.vec2
+ Rect = window.Rect
+ Room = window.Room
+ sort = window.sort
+ UidGenerator = window.UidGenerator
+ _ = window._
}
-
- base.filter = function(f){
- return _.values(base.list).filter(f)
+ else {
+ vec2 = require('../../models/vec2')
+ Rect = require('../../models/rect')
+ Room = require('../../models/room')
+ sort = require('../../util/sort')
+ UidGenerator = require('../../util/uid')
+ _ = require('lodash')
+ FRONT = 0x1, BACK = 0x2, LEFT = 0x4, RIGHT = 0x8, FLOOR = 0x10, CEILING = 0x20
+ TOP = CEILING, BOTTOM = FLOOR
+ function sidesToString(sides){
+ var s = ""
+ if (sides & FRONT) s += "front "
+ if (sides & BACK) s += "back "
+ if (sides & LEFT) s += "left "
+ if (sides & RIGHT) s += "right "
+ if (sides & TOP) s += "top "
+ if (sides & BOTTOM) s += "bottom "
+ return s
+ }
}
+
+ var Rooms = new function(){
+
+ var base = this
- base.add = function(room){
- base.list[room.id] = room
- }
+ base.list = {}
+ base.walls = {}
+ base.regions = []
+
+ base.init = function(){
+ Rooms.builder.init()
+ Rooms.clipper.init()
+ Rooms.mover.init()
+ }
- base.add_with_rect = function(rect){
- var room = new Room({
- rect: rect,
- height: 500
- })
- base.add(room)
- return room
- }
+ base.filter = function(f){
+ return _.values(base.list).filter(f)
+ }
- base.remove = function(room){
- delete base.list[room.id]
- Rooms.clipper.update()
- }
+ base.add = function(room){
+ base.list[room.id] = room
+ }
- base.removeAll = function(){
- base.list = {}
- base.regions = []
- Rooms.clipper.update()
- }
+ base.add_with_rect = function(rect){
+ var room = new Room({
+ rect: rect,
+ height: 500
+ })
+ base.add(room)
+ return room
+ }
- base.count = function(){
- return this.values().length
- }
+ base.remove = function(room){
+ delete base.list[room.id]
+ Rooms.clipper.update()
+ }
- base.forEach = function(f){
- return base.values().forEach(f)
- }
+ base.removeAll = function(){
+ base.list = {}
+ base.regions = []
+ Rooms.clipper.update()
+ }
- base.map = function(f){
- return base.values().map(f)
- }
+ base.count = function(){
+ return this.values().length
+ }
- base.values = function(){
- return _.values(base.list)
- }
+ base.forEach = function(f){
+ return base.values().forEach(f)
+ }
- base.serialize = function(){
- var rooms = base.map(function(room){
- return room.serialize()
- })
- return rooms
- }
+ base.map = function(f){
+ return base.values().map(f)
+ }
- base.deserialize = function(rooms_data){
- rooms_data.forEach(function(data){
- var rect = new Rect(data.rect.x[0], data.rect.y[0], data.rect.x[1], data.rect.y[1])
- var room = new Room({
- id: data.id,
- rect: rect,
- height: data.height
+ base.values = function(){
+ return _.values(base.list)
+ }
+
+ base.serialize = function(){
+ var rooms = base.map(function(room){
+ return room.serialize()
})
- base.add(room)
- })
- Rooms.clipper.update()
- }
+ return rooms
+ }
+
+ base.deserialize = function(rooms_data){
+ rooms_data.forEach(function(data){
+ var rect = new Rect(data.rect.x[0], data.rect.y[0], data.rect.x[1], data.rect.y[1])
+ var room = new Room({
+ id: data.id,
+ rect: rect,
+ height: data.height
+ })
+ base.add(room)
+ })
+ Rooms.clipper.update()
+ }
- base.serializeWalls = function(){
- return []
- }
+ base.serializeWalls = function(){
+ return []
+ }
- base.deserializeWalls = function(walls_data){
- return []
- }
+ base.deserializeWalls = function(walls_data){
+ return []
+ }
+
+ base.uid = UidGenerator(base.list)
- base.uid = UidGenerator(base.list)
+ base.sorted_by_position = function(){
+ return sort.rooms_by_position( base.values() )
+ }
+ base.sorted_by_height = function(){
+ return sort.rooms_by_height( base.values() )
+ }
+ base.sorted_by_area = function(){
+ return sort.rooms_by_area( base.values() )
+ }
- base.sorted_by_position = function(){
- return sort_rooms_by_position( base.values() )
}
- base.sorted_by_height = function(){
- return sort_rooms_by_height( base.values() )
+
+ if ('window' in this) {
+ window.Rooms = Rooms
}
- base.sorted_by_area = function(){
- return sort_rooms_by_area( base.values() )
+ else {
+ module.exports = Rooms
}
-
-}
+})()
diff --git a/public/assets/javascripts/rectangles/engine/rooms/builder.js b/public/assets/javascripts/rectangles/engine/rooms/builder.js
index 49e55dc..6b565c2 100644
--- a/public/assets/javascripts/rectangles/engine/rooms/builder.js
+++ b/public/assets/javascripts/rectangles/engine/rooms/builder.js
@@ -1,295 +1,328 @@
+(function(){
-Rooms.builder = new function(){
- var base = this
+ var vec2, Rect, Room, sort, UidGenerator, _
+ if ('window' in this) {
+ vec2 = window.vec2
+ Rect = window.Rect
+ Room = window.Room
+ sort = window.sort
+ UidGenerator = window.UidGenerator
+ _ = window._
+ }
+ else {
+ vec2 = require('../../models/vec2')
+ Rect = require('../../models/rect')
+ Room = require('../../models/room')
+ sort = require('../../util/sort')
+ UidGenerator = require('../../util/uid')
+ _ = require('lodash')
+ FRONT = 0x1, BACK = 0x2, LEFT = 0x4, RIGHT = 0x8, FLOOR = 0x10, CEILING = 0x20
+ TOP = CEILING, BOTTOM = FLOOR
+ function sidesToString(sides){
+ var s = ""
+ if (sides & FRONT) s += "front "
+ if (sides & BACK) s += "back "
+ if (sides & LEFT) s += "left "
+ if (sides & RIGHT) s += "right "
+ if (sides & TOP) s += "top "
+ if (sides & BOTTOM) s += "bottom "
+ return s
+ }
+ }
+
+
+ Rooms.builder = new function(){
+ var base = this
- var els = []
+ var els = []
- base.init = function(){
- base.bind()
- }
+ base.init = function(){
+ base.bind()
+ }
- base.bind = function(){
- app.on("clip", rebuild)
- }
+ base.bind = function(){
+ app.on("clip", rebuild)
+ }
- function rebuild(){
- if (window.scene) {
- clear()
- build()
- bind()
+ function rebuild(){
+ if (window.scene) {
+ clear()
+ build()
+ bind()
+ }
}
- }
- function build (){
- Rooms.regions.forEach(function(region){
- build_walls(region).forEach(function(el){
- els.push(el)
- scene.add(el)
+ function build (){
+ Rooms.regions.forEach(function(region){
+ build_walls(region).forEach(function(el){
+ els.push(el)
+ scene.add(el)
+ })
})
- })
- Rooms.sorted_by_height().forEach(function(room){
- build_floors(room).forEach(function(el){
- els.push(el)
- scene.add(el)
+ Rooms.sorted_by_height().forEach(function(room){
+ build_floors(room).forEach(function(el){
+ els.push(el)
+ scene.add(el)
+ })
})
- })
- }
+ }
- function bind (){
- Rooms.forEach(function(room){
- room.walls = room.group_mx_walls()
- room.walls.forEach(function(wall){
- Rooms.walls[ wall.id ] = wall
- wall.bind()
- wall.randomize_colors()
+ function bind (){
+ Rooms.forEach(function(room){
+ room.walls = room.group_mx_walls()
+ room.walls.forEach(function(wall){
+ Rooms.walls[ wall.id ] = wall
+ wall.bind()
+ wall.randomize_colors()
+ })
})
- })
- }
+ }
- function clear (){
- els.forEach(function(el){
- scene.remove(el)
- el.destroy && el.destroy()
- })
- els = []
- }
+ function clear (){
+ els.forEach(function(el){
+ scene.remove(el)
+ el.destroy && el.destroy()
+ })
+ els = []
+ }
- function build_walls (region){
- var room = Rooms.list[ region.id ]
+ function build_walls (region){
+ var room = Rooms.list[ region.id ]
- var list = [], el = null
+ var list = [], el = null
- var width = region.x.length()
- var depth = region.y.length()
- var height = room.height
+ var width = region.x.length()
+ var depth = region.y.length()
+ var height = room.height
- if (region.sides & FRONT) {
- el = make_wall('.front')
- el.width = width
- el.height = height
- el.rotationY = PI
- el.x = region.x.a + width/2
- el.y = height/2
- el.z = region.y.a
- el.rect = region
- el.side = FRONT
- room.mx_walls.push(el)
- list.push(el)
- }
- if (region.sides & BACK) {
- var el = make_wall('.back')
- el.width = width
- el.height = height
- el.rotationY = 0
- el.x = region.x.b - width/2
- el.y = height/2
- el.z = region.y.b
- el.rect = region
- el.side = BACK
- room.mx_walls.push(el)
- list.push(el)
- }
- if (region.sides & LEFT) {
- el = make_wall('.left')
- el.rotationY = HALF_PI
- el.height = height
- el.width = depth
- el.x = region.x.a
- el.y = height/2
- el.z = region.y.a + depth/2
- el.rect = region
- el.side = LEFT
- room.mx_walls.push(el)
- list.push(el)
- }
- if (region.sides & RIGHT) {
- el = make_wall('.right')
- el.rotationY = -HALF_PI
- el.height = height
- el.width = depth
- el.x = region.x.b
- el.y = height/2
- el.z = region.y.b - depth/2
- el.rect = region
- el.side = RIGHT
- room.mx_walls.push(el)
- list.push(el)
- }
+ if (region.sides & FRONT) {
+ el = make_wall('.front')
+ el.width = width
+ el.height = height
+ el.rotationY = PI
+ el.x = region.x.a + width/2
+ el.y = height/2
+ el.z = region.y.a
+ el.rect = region
+ el.side = FRONT
+ room.mx_walls.push(el)
+ list.push(el)
+ }
+ if (region.sides & BACK) {
+ var el = make_wall('.back')
+ el.width = width
+ el.height = height
+ el.rotationY = 0
+ el.x = region.x.b - width/2
+ el.y = height/2
+ el.z = region.y.b
+ el.rect = region
+ el.side = BACK
+ room.mx_walls.push(el)
+ list.push(el)
+ }
+ if (region.sides & LEFT) {
+ el = make_wall('.left')
+ el.rotationY = HALF_PI
+ el.height = height
+ el.width = depth
+ el.x = region.x.a
+ el.y = height/2
+ el.z = region.y.a + depth/2
+ el.rect = region
+ el.side = LEFT
+ room.mx_walls.push(el)
+ list.push(el)
+ }
+ if (region.sides & RIGHT) {
+ el = make_wall('.right')
+ el.rotationY = -HALF_PI
+ el.height = height
+ el.width = depth
+ el.x = region.x.b
+ el.y = height/2
+ el.z = region.y.b - depth/2
+ el.rect = region
+ el.side = RIGHT
+ room.mx_walls.push(el)
+ list.push(el)
+ }
- return list
- }
+ return list
+ }
- function build_floors(room){
- var list = [], el = null
+ function build_floors(room){
+ var list = [], el = null
- var constructed = room.intersects.filter(function(room){ return room.constructed })
- sort_rooms_by_height(constructed)
+ var constructed = room.intersects.filter(function(room){ return room.constructed })
+ sort.rooms_by_height(constructed)
- if (constructed.length > 0) {
- // render the regions that don't intersect with anything we've already rendered
- // if the height is different, calculate the overlapping sides and render half-walls
- room.regions.forEach(function(region){
- var intersected = false
- for (var i = 0; i < constructed.length; i++) {
- if (constructed[i].rect.contains(region)) {
- intersected = true
- // r.sides = 0xf
- // half_sides
- }
- else if (constructed[i].rect.intersects(region)) {
- intersected = true
- if (room.height < constructed[i].height) {
- var ceiling_walls = make_ceiling_walls( room, constructed[i], region )
- list = list.concat(ceiling_walls)
+ if (constructed.length > 0) {
+ // render the regions that don't intersect with anything we've already rendered
+ // if the height is different, calculate the overlapping sides and render half-walls
+ room.regions.forEach(function(region){
+ var intersected = false
+ for (var i = 0; i < constructed.length; i++) {
+ if (constructed[i].rect.contains(region)) {
+ intersected = true
+ // r.sides = 0xf
+ // half_sides
+ }
+ else if (constructed[i].rect.intersects(region)) {
+ intersected = true
+ if (room.height < constructed[i].height) {
+ var ceiling_walls = make_ceiling_walls( room, constructed[i], region )
+ list = list.concat(ceiling_walls)
+ }
}
}
- }
- if (! intersected) {
- el = make_floor(room, region)
- list.push( el )
- room.mx_floor.push(el)
+ if (! intersected) {
+ el = make_floor(room, region)
+ list.push( el )
+ room.mx_floor.push(el)
- el = make_ceiling(room, region)
- list.push( el )
- room.mx_ceiling.push(el)
- }
- })
+ el = make_ceiling(room, region)
+ list.push( el )
+ room.mx_ceiling.push(el)
+ }
+ })
- }
- else {
- // render floor and ceiling for the entire rectangle
- el = make_floor(room, room.rect)
- list.push( el )
- room.mx_floor.push(el)
+ }
+ else {
+ // render floor and ceiling for the entire rectangle
+ el = make_floor(room, room.rect)
+ list.push( el )
+ room.mx_floor.push(el)
- el = make_ceiling(room, room.rect)
- list.push( el )
- room.mx_ceiling.push(el)
- }
+ el = make_ceiling(room, room.rect)
+ list.push( el )
+ room.mx_ceiling.push(el)
+ }
- room.constructed = true
- return list
- }
+ room.constructed = true
+ return list
+ }
- function make_ceiling_walls( lo, hi, region ){
- var list = []
+ function make_ceiling_walls( lo, hi, region ){
+ var list = []
- var width = region.x.length()
- var depth = region.y.length()
- var height = hi.height - lo.height
+ var width = region.x.length()
+ var depth = region.y.length()
+ var height = hi.height - lo.height
- if (! (region.half_sides & LEFT) && region.x.a == hi.rect.x.a) {
- el = make_wall('.left')
- el.rotationY = HALF_PI
- el.height = height
- el.width = depth
- 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.mx_walls.push(el)
- region.half_sides |= LEFT
- el.half_side = LEFT
- }
+ if (! (region.half_sides & LEFT) && region.x.a == hi.rect.x.a) {
+ el = make_wall('.left')
+ el.rotationY = HALF_PI
+ el.height = height
+ el.width = depth
+ 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.mx_walls.push(el)
+ region.half_sides |= LEFT
+ el.half_side = LEFT
+ }
- if (! (region.half_sides & RIGHT) && region.x.b == hi.rect.x.b) {
- el = make_wall('.right')
- el.rotationY = -HALF_PI
- el.height = height
- el.width = depth
- 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.mx_walls.push(el)
- region.half_sides |= RIGHT
- el.half_side = RIGHT
+ if (! (region.half_sides & RIGHT) && region.x.b == hi.rect.x.b) {
+ el = make_wall('.right')
+ el.rotationY = -HALF_PI
+ el.height = height
+ el.width = depth
+ 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.mx_walls.push(el)
+ region.half_sides |= RIGHT
+ el.half_side = RIGHT
+ }
+
+ if (! (region.half_sides & FRONT) && region.y.a == hi.rect.y.a) {
+ el = make_wall('.front')
+ el.width = width
+ el.height = height
+ el.rotationY = PI
+ 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.mx_walls.push(el)
+ region.half_sides |= FRONT
+ el.half_side = FRONT
+ }
+
+ if (! (region.half_sides & BACK) && region.y.b == hi.rect.y.b) {
+ el = make_wall('.back')
+ el.width = width
+ el.height = height
+ el.rotationY = 0
+ 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.mx_walls.push(el)
+ region.half_sides |= BACK
+ el.half_side = BACK
+ }
+ return list
}
- if (! (region.half_sides & FRONT) && region.y.a == hi.rect.y.a) {
- el = make_wall('.front')
+ function make_floor(room, region){
+ var width = region.x.length()
+ var depth = region.y.length()
+
+ var el = make_wall('.floor')
+ el.height = depth
el.width = width
- el.height = height
- el.rotationY = PI
el.x = region.x.a + width/2
- el.y = lo.height + height/2
- el.z = region.y.a
+ el.y = 0
+ el.z = region.y.a + depth/2
+ el.rotationX = PI/2
el.rect = region
- list.push(el)
- hi.mx_walls.push(el)
- region.half_sides |= FRONT
- el.half_side = FRONT
+ el.side = FLOOR
+ return el
}
+ function make_ceiling(room, region){
+ var width = region.x.length()
+ var depth = region.y.length()
+ var height = room.height
- if (! (region.half_sides & BACK) && region.y.b == hi.rect.y.b) {
- el = make_wall('.back')
+ var el = make_wall('.ceiling')
+ el.height = depth
el.width = width
- el.height = height
- el.rotationY = 0
- el.x = region.x.b - width/2
- el.y = lo.height + height/2
- el.z = region.y.b
+ el.x = region.x.a + width/2
+ el.y = height
+ el.z = region.y.a + depth/2
+ el.rotationX = -PI/2
el.rect = region
- list.push(el)
- hi.mx_walls.push(el)
- region.half_sides |= BACK
- el.half_side = BACK
+ el.side = CEILING
+ return el
}
- return list
- }
- function make_floor(room, region){
- var width = region.x.length()
- var depth = region.y.length()
-
- var el = make_wall('.floor')
- el.height = depth
- el.width = width
- el.x = region.x.a + width/2
- el.y = 0
- el.z = region.y.a + depth/2
- el.rotationX = PI/2
- el.rect = region
- el.side = FLOOR
- return el
- }
- function make_ceiling(room, region){
- var width = region.x.length()
- var depth = region.y.length()
- var height = room.height
+ function make_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.side = 0
+ el.type = "Face"
+ el.el.style.opacity = 1.0
+ el.side = 0
+ el.rect = null
+ el.destroy = function(){
+ this.el = this.rect = null
+ }
- var el = make_wall('.ceiling')
- el.height = depth
- el.width = width
- el.x = region.x.a + width/2
- el.y = height
- el.z = region.y.a + depth/2
- el.rotationX = -PI/2
- el.rect = region
- el.side = CEILING
- return el
- }
+ // possible if walls are opaque
+ // el.el.classList.add("backface-hidden")
- function make_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.side = 0
- 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
}
- // possible if walls are opaque
- // el.el.classList.add("backface-hidden")
-
- return el
}
-}
-
+})()
diff --git a/public/assets/javascripts/rectangles/engine/rooms/clipper.js b/public/assets/javascripts/rectangles/engine/rooms/clipper.js
index e2bb894..cd45479 100644
--- a/public/assets/javascripts/rectangles/engine/rooms/clipper.js
+++ b/public/assets/javascripts/rectangles/engine/rooms/clipper.js
@@ -1,107 +1,134 @@
+(function(){
-Rooms.clipper = new function(){
- var base = this
-
- base.init = function(){
- base.bind()
- base.update()
+ var Rooms, Tree, sort
+ if ('window' in this) {
+ Rooms = window.Rooms
+ Tree = window.Tree
+ sort = window.sort
}
-
- base.bind = function(){
- map.ui && map.ui.mouse.tube.on("up", function(){ base.update() })
+ else {
+ Rooms = require('./_rooms')
+ Tree = require('../../models/tree')
+ sort = require('../../util/sort')
+ FRONT = 0x1, BACK = 0x2, LEFT = 0x4, RIGHT = 0x8, FLOOR = 0x10, CEILING = 0x20
+ TOP = CEILING, BOTTOM = FLOOR
+ function sidesToString(sides){
+ var s = ""
+ if (sides & FRONT) s += "front "
+ if (sides & BACK) s += "back "
+ if (sides & LEFT) s += "left "
+ if (sides & RIGHT) s += "right "
+ if (sides & TOP) s += "top "
+ if (sides & BOTTOM) s += "bottom "
+ return s
+ }
}
- base.update = function(){
- base.solve_rects()
- app.tube("clip")
- }
-
- var rooms, regions
+ Rooms.clipper = new function(){
+ var base = this
+
+ base.init = function(){
+ base.bind()
+ base.update()
+ }
- // Given a set of overlapping rooms, clip any intersections, then cull any duplicate polygons
- base.solve_rects = function(){
- if (Rooms.count() == 0) {
- Rooms.regions = regions = []
- return
+ base.bind = function(){
+ map.ui && map.ui.mouse.tube.on("up", function(){ base.update() })
+ }
+
+ base.update = function(){
+ base.solve_rects()
+ app.tube("clip")
}
+
+ var rooms, regions
+
+ // Given a set of overlapping rooms, clip any intersections, then cull any duplicate polygons
+ base.solve_rects = function(){
+ if (Rooms.count() == 0) {
+ Rooms.regions = regions = []
+ return
+ }
- base.reset_rects()
- base.clip_rects()
- base.cull_rects()
+ base.reset_rects()
+ base.clip_rects()
+ base.cull_rects()
- Rooms.regions = sort_rects_by_position(regions)
- }
+ Rooms.regions = sort.rects_by_position(regions)
+ }
- // Reset the clipping/culling states of each of the rooms
- base.reset_rects = function(){
- Rooms.forEach(function(room){
- room.reset()
- })
- }
+ // Reset the clipping/culling states of each of the rooms
+ base.reset_rects = function(){
+ Rooms.forEach(function(room){
+ room.reset()
+ })
+ }
- // Compare each room to the rooms it overlaps, and subdivide
- base.clip_rects = function(){
- var rooms = Rooms.sorted_by_position()
- regions = []
+ // Compare each room to the rooms it overlaps, and subdivide
+ base.clip_rects = function(){
+ var rooms = Rooms.sorted_by_position()
+ regions = []
- var left, right
- for (var i = 0; i < rooms.length; i++) {
- left = rooms[i]
- for (var j = i+1; j < rooms.length; j++) {
- right = rooms[j]
- if (left.rect.intersects(right.rect)) {
- left.clipTo(right.rect)
- right.clipTo(left.rect)
- left.intersects.push(right)
- right.intersects.push(left)
- }
- if (left.rect.x.b < right.rect.x.a) {
- break
+ var left, right
+ for (var i = 0; i < rooms.length; i++) {
+ left = rooms[i]
+ for (var j = i+1; j < rooms.length; j++) {
+ right = rooms[j]
+ if (left.rect.intersects(right.rect)) {
+ left.clipTo(right.rect)
+ right.clipTo(left.rect)
+ left.intersects.push(right)
+ right.intersects.push(left)
+ }
+ if (left.rect.x.b < right.rect.x.a) {
+ break
+ }
}
}
+ for (var i = 0; i < rooms.length; i++) {
+ rooms[i].regions = rooms[i].regions.filter(function(r){ return !!r })
+ regions = regions.concat(rooms[i].regions)
+ }
}
- for (var i = 0; i < rooms.length; i++) {
- rooms[i].regions = rooms[i].regions.filter(function(r){ return !!r })
- regions = regions.concat(rooms[i].regions)
- }
- }
- // Find overlapping regions (of the same size) and dedupe
- base.cull_rects = function(){
- regions = sort_rects_by_area( regions )
+ // Find overlapping regions (of the same size) and dedupe
+ base.cull_rects = function(){
+ regions = sort.rects_by_area( regions )
- var ty = new Tree (regions[0].y.a, [regions[0]])
- var tx = new Tree (regions[0].x.a, ty)
- var ttx, tty
+ var ty = new Tree (regions[0].y.a, [regions[0]])
+ var tx = new Tree (regions[0].x.a, ty)
+ var ttx, tty
- for (var i = 1; i < regions.length; i++) {
- ttx = tx.add (regions[i].x.a, null)
- if (ttx.data) {
- tty = ttx.data.add (regions[i].y.a, null)
- // duplicate polygon?
- if (tty.data) {
- tty.data.forEach(function(yy, ii){
- if (yy.intersects(regions[i])) {
- if (yy.area() > regions[i].area()) {
- regions[i].dupe = true
- }
- else {
- yy.dupe = true
- tty.data[ii] = regions[i]
+ for (var i = 1; i < regions.length; i++) {
+ ttx = tx.add (regions[i].x.a, null)
+ if (ttx.data) {
+ tty = ttx.data.add (regions[i].y.a, null)
+ // duplicate polygon?
+ if (tty.data) {
+ tty.data.forEach(function(yy, ii){
+ if (yy.intersects(regions[i])) {
+ if (yy.area() > regions[i].area()) {
+ regions[i].dupe = true
+ }
+ else {
+ yy.dupe = true
+ tty.data[ii] = regions[i]
+ }
}
- }
- })
+ })
+ }
+ else {
+ tty.data = [regions[i]]
+ }
}
else {
- tty.data = [regions[i]]
+ ttx.data = new Tree (regions[i].y.a, [regions[i]])
}
}
- else {
- ttx.data = new Tree (regions[i].y.a, [regions[i]])
- }
}
+
+ return base
}
- return base
-}
+})()