summaryrefslogtreecommitdiff
path: root/assets/javascripts/rectangles/engine
diff options
context:
space:
mode:
authorJulie Lala <jules@okfoc.us>2014-04-17 02:32:53 -0400
committerJulie Lala <jules@okfoc.us>2014-04-17 02:32:53 -0400
commit1af8f41cc88e3c57bfabe6d4a5dcd83fc4a0e1bc (patch)
treee10fd06cd40c21a7375f626ac130b438613b8abe /assets/javascripts/rectangles/engine
parent3b7c327b6502ef6e510a0a0e77c6b6facf0be723 (diff)
further code bath, fix minimap orientation/translation
Diffstat (limited to 'assets/javascripts/rectangles/engine')
-rw-r--r--assets/javascripts/rectangles/engine/builder.js123
-rw-r--r--assets/javascripts/rectangles/engine/clipper.js104
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
+}
+