diff options
Diffstat (limited to 'public/assets/javascripts/rectangles/engine/rooms/clipper.js')
| -rw-r--r-- | public/assets/javascripts/rectangles/engine/rooms/clipper.js | 189 |
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 -} +})() |
