summaryrefslogtreecommitdiff
path: root/public/assets/javascripts/rectangles/engine/rooms/clipper.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/javascripts/rectangles/engine/rooms/clipper.js')
-rw-r--r--public/assets/javascripts/rectangles/engine/rooms/clipper.js189
1 files changed, 108 insertions, 81 deletions
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
-}
+})()