summaryrefslogtreecommitdiff
path: root/assets/javascripts/rectangles/engine/clipper.js
diff options
context:
space:
mode:
Diffstat (limited to 'assets/javascripts/rectangles/engine/clipper.js')
-rw-r--r--assets/javascripts/rectangles/engine/clipper.js42
1 files changed, 26 insertions, 16 deletions
diff --git a/assets/javascripts/rectangles/engine/clipper.js b/assets/javascripts/rectangles/engine/clipper.js
index 01a4921..d814fec 100644
--- a/assets/javascripts/rectangles/engine/clipper.js
+++ b/assets/javascripts/rectangles/engine/clipper.js
@@ -2,11 +2,6 @@
var Clipper = new function(){
var base = this
- var rooms = base.rooms = []
- var regions = base.regions = []
-
- var modified = true
-
base.init = function(){
base.bind()
base.update()
@@ -17,20 +12,34 @@ var Clipper = new function(){
}
base.update = function(){
- Clipper.solve_rects()
+ 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 (base.rooms.length == 0) return;
-
- for (var i = 0; i < base.rooms.length; i++) {
- base.rooms[i].reset()
+ if (Rooms.list.length == 0) return
+
+ base.reset_rects()
+ base.clip_rects()
+ base.cull_rects()
+
+ Rooms.regions = sort_rects_by_position(regions)
+ }
+
+ // Reset the clipping/culling states of each of the rooms
+ base.reset_rects = function(){
+ for (var i = 0; i < Rooms.list.length; i++) {
+ Rooms.list[i].reset()
}
+ }
- var rooms = sort_rooms_by_position( base.rooms )
-
- var 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++) {
@@ -52,7 +61,10 @@ var Clipper = new function(){
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 )
var ty = new Tree (regions[0].y.a, [regions[0]])
@@ -85,8 +97,6 @@ var Clipper = new function(){
ttx.data = new Tree (regions[i].y.a, [regions[i]])
}
}
-
- base.regions = sort_rects_by_position(regions)
}
return base