summaryrefslogtreecommitdiff
path: root/assets/javascripts/rectangles/engine/builder.js
diff options
context:
space:
mode:
authorJules Laplace <jules@okfoc.us>2014-04-17 13:32:41 -0400
committerJules Laplace <jules@okfoc.us>2014-04-17 13:32:41 -0400
commit3575f0ade6cd125e08aa40e0ff9187820bb3b1d0 (patch)
treefeeff0399047b1b3033e0c508bde359527ab75c8 /assets/javascripts/rectangles/engine/builder.js
parentf6424c4756de2045648de0980de14a32b0126df7 (diff)
floor/ceiling region culling
Diffstat (limited to 'assets/javascripts/rectangles/engine/builder.js')
-rw-r--r--assets/javascripts/rectangles/engine/builder.js102
1 files changed, 78 insertions, 24 deletions
diff --git a/assets/javascripts/rectangles/engine/builder.js b/assets/javascripts/rectangles/engine/builder.js
index 7248689..697b7e7 100644
--- a/assets/javascripts/rectangles/engine/builder.js
+++ b/assets/javascripts/rectangles/engine/builder.js
@@ -26,6 +26,15 @@ var builder = new function(){
}
}
function build (){
+ clipper.rooms = sort_rooms_by_height(clipper.rooms)
+ clipper.rooms.forEach(function(r){
+ floors(r).forEach(function(el){
+ els.push(el)
+ scene.add(el)
+ })
+ })
+
+ clipper.rooms = sort_rooms_by_id(clipper.rooms)
clipper.regions.forEach(function(r){
walls(r).forEach(function(el){
els.push(el)
@@ -53,6 +62,7 @@ var builder = new function(){
el.height = height
el.rotationY = PI
el.x = r.x.a + width/2
+ el.y = height/2
el.z = r.y.a
list.push(el)
}
@@ -62,6 +72,7 @@ var builder = new function(){
el.height = height
el.rotationY = 0
el.x = r.x.b - width/2
+ el.y = height/2
el.z = r.y.b
list.push(el)
}
@@ -71,6 +82,7 @@ var builder = new function(){
el.height = height
el.width = depth
el.x = r.x.a
+ el.y = height/2
el.z = r.y.a + depth/2
list.push(el)
}
@@ -80,11 +92,53 @@ var builder = new function(){
el.height = height
el.width = depth
el.x = r.x.b
+ el.y = height/2
el.z = r.y.b - depth/2
list.push(el)
}
- el = wall('.bottom')
+ return list
+ }
+
+ function floors(rm){
+ var list = [], el = null
+
+ var already_constructed = rm.intersects.filter(function(rr){ return rr.constructed })
+
+ if (already_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
+ rm.regions.forEach(function(r){
+ var intersected = false
+ for (var i = 0; i < already_constructed.length; i++) {
+ if (already_constructed[i].rect.intersects(r)) {
+ // probably create walls here?
+ intersected = true
+ }
+ }
+ if (! intersected) {
+ list.push( ground(rm, r) )
+ list.push( ceiling(rm, r) )
+ }
+ })
+
+
+ }
+ else {
+ // render floor and ceiling for the entire rectangle
+ list.push( ground(rm, rm.rect) )
+ list.push( ceiling(rm, rm.rect) )
+ }
+
+ rm.constructed = true
+ return list
+ }
+
+ function ground(rm, r){
+ var width = r.x.length()
+ var depth = r.y.length()
+
+ var el = wall('.bottom')
el.height = depth
el.width = width
el.x = r.x.a + width/2
@@ -92,31 +146,31 @@ var builder = new function(){
el.z = r.y.a + depth/2
el.rotationX = PI/2
el.el.style.backgroundColor = "#f00"
- list.push(el)
+ return el
+ }
+ function ceiling(rm, r){
+ var width = r.x.length()
+ var depth = r.y.length()
+ var height = rm.height
- if (r.sides != 0) {
- el = wall('.top')
- el.height = depth
- el.width = width
- el.x = r.x.a + width/2
- el.y = height
- el.z = r.y.a + depth/2
- el.rotationX = -PI/2
- el.el.style.backgroundColor = "#00f"
- list.push(el)
- }
+ var el = wall('.top')
+ el.height = depth
+ el.width = width
+ el.x = r.x.a + width/2
+ el.y = height
+ el.z = r.y.a + depth/2
+ el.rotationX = -PI/2
+ el.el.style.backgroundColor = "#00f"
+ return el
+ }
- function 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.y = height/2
- el.type = "Face"
- el.el.style.opacity = 1.0
- return el
- }
-
- return list
+ function 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.type = "Face"
+ el.el.style.opacity = 1.0
+ return el
}
}