diff options
| author | Jules Laplace <jules@okfoc.us> | 2014-04-17 13:32:41 -0400 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2014-04-17 13:32:41 -0400 |
| commit | 3575f0ade6cd125e08aa40e0ff9187820bb3b1d0 (patch) | |
| tree | feeff0399047b1b3033e0c508bde359527ab75c8 /assets/javascripts/rectangles/engine | |
| parent | f6424c4756de2045648de0980de14a32b0126df7 (diff) | |
floor/ceiling region culling
Diffstat (limited to 'assets/javascripts/rectangles/engine')
| -rw-r--r-- | assets/javascripts/rectangles/engine/builder.js | 102 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/engine/clipper.js | 3 |
2 files changed, 80 insertions, 25 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 } } diff --git a/assets/javascripts/rectangles/engine/clipper.js b/assets/javascripts/rectangles/engine/clipper.js index d6eb618..2b04a23 100644 --- a/assets/javascripts/rectangles/engine/clipper.js +++ b/assets/javascripts/rectangles/engine/clipper.js @@ -47,6 +47,8 @@ var clipper = new function(){ 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 @@ -91,7 +93,6 @@ var clipper = new function(){ } } - base.rooms = sort_rooms_by_id(rooms) base.regions = sort_rects_by_position(regions) } |
