diff options
| author | Julie Lala <jules@okfoc.us> | 2014-04-17 02:32:53 -0400 |
|---|---|---|
| committer | Julie Lala <jules@okfoc.us> | 2014-04-17 02:32:53 -0400 |
| commit | 1af8f41cc88e3c57bfabe6d4a5dcd83fc4a0e1bc (patch) | |
| tree | e10fd06cd40c21a7375f626ac130b438613b8abe /assets/javascripts/rectangles/engine | |
| parent | 3b7c327b6502ef6e510a0a0e77c6b6facf0be723 (diff) | |
further code bath, fix minimap orientation/translation
Diffstat (limited to 'assets/javascripts/rectangles/engine')
| -rw-r--r-- | assets/javascripts/rectangles/engine/builder.js | 123 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/engine/clipper.js | 104 |
2 files changed, 227 insertions, 0 deletions
diff --git a/assets/javascripts/rectangles/engine/builder.js b/assets/javascripts/rectangles/engine/builder.js new file mode 100644 index 0000000..edca2ed --- /dev/null +++ b/assets/javascripts/rectangles/engine/builder.js @@ -0,0 +1,123 @@ +var builder = new function(){ + var base = this + base.tube = new Tube () + + var els = [] + + base.init = function(){ + base.bind() + } + + base.bind = function(){ + base.tube.on("clipper:update", rebuild) + } + + base.wheel = new wheel({ + el: document.querySelector("#map"), + update: function(e, val, delta){ + console.log(e.clientX, e.clientY, delta) + } + }) + + function rebuild(){ + if (window.scene) { + clear() + build() + } + } + function build (){ + clipper.regions.forEach(function(r){ + walls(r).forEach(function(el){ + els.push(el) + scene.add(el) + }) + }) + } + function clear (){ + els.forEach(function(el){ + scene.remove(el) + }) + els = [] + } + + function walls (r){ + var list = [], el = null + + var width = r.x.length() + var depth = r.y.length() + var height = clipper.rooms[r.id].height + + if (r.sides & FRONT) { + el = wall('.front') + el.width = width + el.height = height + el.rotationY = PI + el.x = r.x.a + width/2 + el.z = r.y.a + list.push(el) + } + if (r.sides & BACK) { + var el = wall('.back') + el.width = width + el.height = height + el.rotationY = 0 + el.x = r.x.b - width/2 + el.z = r.y.b + list.push(el) + } + if (r.sides & LEFT) { + el = wall('.left') + el.rotationY = HALF_PI + el.height = height + el.width = depth + el.x = r.x.a + el.z = r.y.a + depth/2 + list.push(el) + } + if (r.sides & RIGHT) { + el = wall('.right') + el.rotationY = -HALF_PI + el.height = height + el.width = depth + el.x = r.x.b + el.z = r.y.b - depth/2 + list.push(el) + } + + el = wall('.bottom') + el.height = depth + el.width = width + el.x = r.x.a + width/2 + el.y = 0 + el.z = r.y.a + depth/2 + el.rotationX = PI/2 + el.el.style.backgroundColor = "#f00" + list.push(el) + + 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) + } + + 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 + } + +} + diff --git a/assets/javascripts/rectangles/engine/clipper.js b/assets/javascripts/rectangles/engine/clipper.js new file mode 100644 index 0000000..13fc378 --- /dev/null +++ b/assets/javascripts/rectangles/engine/clipper.js @@ -0,0 +1,104 @@ + +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() + } + + base.bind = function(){ + map.ui.mouse.tube.on("up", function(){ base.update() }) + } + + base.update = function(){ + clipper.solve_rects() + builder.tube("clipper:update") + } + + base.add_room = function(r){ + rooms.push( new room({ + id: base.rooms.length, + rect: r, + }) ) + } + + base.solve_rects = function(){ + if (base.rooms.length == 0) return; + + for (var i = 0; i < base.rooms.length; i++) { + base.rooms[i].id = i + base.rooms[i].reset() + } + + var rooms = sort_rooms_by_position( base.rooms ) + + var 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) + } + 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) + } + + 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 + + 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 { + ttx.data = new tree (regions[i].y.a, [regions[i]]) + } + } + + base.regions = sort_rects_by_position(regions) + } + + // generate floor and ceiling for some regions + // generate walls from surviving regions + // generate ceiling-walls where ceiling has discontinuity + + return base +} + |
