summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/javascripts/rectangles/engine/builder.js4
-rw-r--r--assets/javascripts/rectangles/engine/clipper.js42
-rw-r--r--assets/javascripts/rectangles/engine/mover.js2
-rw-r--r--assets/javascripts/rectangles/engine/rooms.js12
-rw-r--r--assets/javascripts/rectangles/engine/scenery.js2
-rw-r--r--assets/javascripts/rectangles/models/wall.js2
-rw-r--r--assets/javascripts/rectangles/util/sort.js8
-rw-r--r--rectangles.html1
8 files changed, 47 insertions, 26 deletions
diff --git a/assets/javascripts/rectangles/engine/builder.js b/assets/javascripts/rectangles/engine/builder.js
index 9894333..91bdeb4 100644
--- a/assets/javascripts/rectangles/engine/builder.js
+++ b/assets/javascripts/rectangles/engine/builder.js
@@ -27,7 +27,7 @@ var Builder = new function(){
})
})
- Rooms.sort_by_height().forEach(function(room){
+ Rooms.sorted_by_height().forEach(function(room){
build_floors(room).forEach(function(el){
els.push(el)
scene.add(el)
@@ -176,7 +176,7 @@ var Builder = new function(){
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
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
diff --git a/assets/javascripts/rectangles/engine/mover.js b/assets/javascripts/rectangles/engine/mover.js
index 3cf214f..413715a 100644
--- a/assets/javascripts/rectangles/engine/mover.js
+++ b/assets/javascripts/rectangles/engine/mover.js
@@ -1,4 +1,4 @@
-var mover = new function(){
+var Mover = new function(){
var base = this
base.room = null
diff --git a/assets/javascripts/rectangles/engine/rooms.js b/assets/javascripts/rectangles/engine/rooms.js
index 642193e..93ba7b8 100644
--- a/assets/javascripts/rectangles/engine/rooms.js
+++ b/assets/javascripts/rectangles/engine/rooms.js
@@ -17,7 +17,7 @@ var Rooms = new function(){
base.add_with_rect = function(rect){
var room = new Room({
- id: base.rooms.length,
+ id: base.list.length,
rect: rect,
height: quantize(randrange(300,800), 50),
})
@@ -28,4 +28,14 @@ var Rooms = new function(){
return base.list.forEach(f)
}
+ base.sorted_by_position = function(){
+ return sort_rooms_by_position( base.list )
+ }
+ base.sorted_by_height = function(){
+ return sort_rooms_by_height( base.list )
+ }
+ base.sorted_by_area = function(){
+ return sort_rooms_by_area( base.list )
+ }
+
}
diff --git a/assets/javascripts/rectangles/engine/scenery.js b/assets/javascripts/rectangles/engine/scenery.js
index 3a43755..1301949 100644
--- a/assets/javascripts/rectangles/engine/scenery.js
+++ b/assets/javascripts/rectangles/engine/scenery.js
@@ -4,7 +4,7 @@ wall_rotation[BACK] = 0
wall_rotation[LEFT] = HALF_PI
wall_rotation[RIGHT] = -HALF_PI
-var scenery = new function(){
+var Scenery = new function(){
var base = this;
diff --git a/assets/javascripts/rectangles/models/wall.js b/assets/javascripts/rectangles/models/wall.js
index 88eb75d..ae23125 100644
--- a/assets/javascripts/rectangles/models/wall.js
+++ b/assets/javascripts/rectangles/models/wall.js
@@ -37,7 +37,7 @@ window.Wall = (function(){
mouseover: function(){
},
mouseenter: function(e){
- scenery.mouse.mouseenter(e, base)
+ Scenery.mouse.mouseenter(e, base)
},
mousemove: function(e){
},
diff --git a/assets/javascripts/rectangles/util/sort.js b/assets/javascripts/rectangles/util/sort.js
index ec0f5e9..0985b75 100644
--- a/assets/javascripts/rectangles/util/sort.js
+++ b/assets/javascripts/rectangles/util/sort.js
@@ -53,7 +53,7 @@ function sort_rooms_by_id(list){
}
function sort_rooms_by_height(list){
return list.map(room_height_tuple)
- .sort(compare_car)
+ .sort(compare_car_reversed)
.map(cdr)
}
function sort_rooms_by_position(list){
@@ -62,8 +62,8 @@ function sort_rooms_by_position(list){
.map(cdr)
}
function sort_rooms_by_area(list){
- return list.map(room_area_tuple))
- .sort(compare_rect_area)
+ return list.map(room_area_tuple)
+ .sort(compare_car)
.map(cdr)
}
@@ -74,7 +74,7 @@ function sort_rects_by_position(list){
}
function sort_rects_by_area(list){
return list.map(rect_area_tuple)
- .sort(compare_rect_area)
+ .sort(compare_car)
.map(cdr)
}
diff --git a/rectangles.html b/rectangles.html
index 1a4901e..a274fe2 100644
--- a/rectangles.html
+++ b/rectangles.html
@@ -87,6 +87,7 @@ body > div {
<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/rooms.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/engine/builder.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/engine/clipper.js"></script>
<script type="text/javascript" src="assets/javascripts/rectangles/engine/mover.js"></script>