diff options
| author | Jules Laplace <jules@okfoc.us> | 2014-07-24 19:24:03 -0400 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2014-07-24 19:24:03 -0400 |
| commit | de9a0ec966a20540cafdad1019d498530b60700f (patch) | |
| tree | 9d86c1409e5ad4e05c53ffce0fd0a7546b885235 | |
| parent | 9261438f86b1faf22a0f8d9a366fb0daa3dd090d (diff) | |
testing wallbuilding with some broken testcases..
| -rw-r--r-- | public/assets/javascripts/mx/mx.js | 2 | ||||
| -rw-r--r-- | public/assets/javascripts/rectangles/engine/rooms/builder.js | 86 | ||||
| -rw-r--r-- | public/assets/javascripts/rectangles/engine/rooms/clipper.js | 6 | ||||
| -rw-r--r-- | test/03-test-clipper.js (renamed from test/03-test-clipping.js) | 36 | ||||
| -rw-r--r-- | test/04-test-builder.js | 118 | ||||
| -rw-r--r-- | views/partials/scripts.ejs | 16 |
6 files changed, 187 insertions, 77 deletions
diff --git a/public/assets/javascripts/mx/mx.js b/public/assets/javascripts/mx/mx.js index 6b36392..40a5f2e 100644 --- a/public/assets/javascripts/mx/mx.js +++ b/public/assets/javascripts/mx/mx.js @@ -587,7 +587,7 @@ var MX = MX || (function (undefined) { } } }) - + return MX })()
\ No newline at end of file diff --git a/public/assets/javascripts/rectangles/engine/rooms/builder.js b/public/assets/javascripts/rectangles/engine/rooms/builder.js index 6b565c2..492a8c6 100644 --- a/public/assets/javascripts/rectangles/engine/rooms/builder.js +++ b/public/assets/javascripts/rectangles/engine/rooms/builder.js @@ -1,22 +1,18 @@ (function(){ - var vec2, Rect, Room, sort, UidGenerator, _ + var Rooms, sort if ('window' in this) { - vec2 = window.vec2 - Rect = window.Rect - Room = window.Room + Rooms = window.Rooms sort = window.sort - UidGenerator = window.UidGenerator - _ = window._ } else { - vec2 = require('../../models/vec2') - Rect = require('../../models/rect') - Room = require('../../models/room') + MX = require('../../../../../../test/mocks/mx.js') + scene = MX.scene + Rooms = require('./_rooms') sort = require('../../util/sort') - UidGenerator = require('../../util/uid') - _ = require('lodash') FRONT = 0x1, BACK = 0x2, LEFT = 0x4, RIGHT = 0x8, FLOOR = 0x10, CEILING = 0x20 + PI = Math.PI + HALF_PI = PI/2 TOP = CEILING, BOTTOM = FLOOR function sidesToString(sides){ var s = "" @@ -30,7 +26,6 @@ } } - Rooms.builder = new function(){ var base = this @@ -41,33 +36,34 @@ } base.bind = function(){ - app.on("clip", rebuild) + app.on("clip", base.rebuild.bind(base)) } - function rebuild(){ + base.rebuild = function(){ if (window.scene) { - clear() - build() - bind() + base.clear() + base.build() + base.bind_walls() } } - function build (){ + + base.build = function (){ Rooms.regions.forEach(function(region){ - build_walls(region).forEach(function(el){ + this.build_walls(region).forEach(function(el){ els.push(el) scene.add(el) }) - }) + }.bind(this)) Rooms.sorted_by_height().forEach(function(room){ - build_floors(room).forEach(function(el){ + this.build_floors(room).forEach(function(el){ els.push(el) scene.add(el) }) - }) + }.bind(this)) } - function bind (){ + base.bind_walls = function (){ Rooms.forEach(function(room){ room.walls = room.group_mx_walls() room.walls.forEach(function(wall){ @@ -78,7 +74,7 @@ }) } - function clear (){ + base.clear = function (){ els.forEach(function(el){ scene.remove(el) el.destroy && el.destroy() @@ -86,7 +82,7 @@ els = [] } - function build_walls (region){ + this.build_walls = function (region) { var room = Rooms.list[ region.id ] var list = [], el = null @@ -96,7 +92,7 @@ var height = room.height if (region.sides & FRONT) { - el = make_wall('.front') + el = this.make_wall('.front') el.width = width el.height = height el.rotationY = PI @@ -109,7 +105,7 @@ list.push(el) } if (region.sides & BACK) { - var el = make_wall('.back') + var el = this.make_wall('.back') el.width = width el.height = height el.rotationY = 0 @@ -122,7 +118,7 @@ list.push(el) } if (region.sides & LEFT) { - el = make_wall('.left') + el = this.make_wall('.left') el.rotationY = HALF_PI el.height = height el.width = depth @@ -135,7 +131,7 @@ list.push(el) } if (region.sides & RIGHT) { - el = make_wall('.right') + el = this.make_wall('.right') el.rotationY = -HALF_PI el.height = height el.width = depth @@ -151,7 +147,7 @@ return list } - function build_floors(room){ + this.build_floors = function (room){ var list = [], el = null var constructed = room.intersects.filter(function(room){ return room.constructed }) @@ -171,17 +167,17 @@ else if (constructed[i].rect.intersects(region)) { intersected = true if (room.height < constructed[i].height) { - var ceiling_walls = make_ceiling_walls( room, constructed[i], region ) + var ceiling_walls = this.make_ceiling_walls( room, constructed[i], region ) list = list.concat(ceiling_walls) } } } if (! intersected) { - el = make_floor(room, region) + el = this.make_floor(room, region) list.push( el ) room.mx_floor.push(el) - el = make_ceiling(room, region) + el = this.make_ceiling(room, region) list.push( el ) room.mx_ceiling.push(el) } @@ -190,11 +186,11 @@ } else { // render floor and ceiling for the entire rectangle - el = make_floor(room, room.rect) + el = this.make_floor(room, room.rect) list.push( el ) room.mx_floor.push(el) - el = make_ceiling(room, room.rect) + el = this.make_ceiling(room, room.rect) list.push( el ) room.mx_ceiling.push(el) } @@ -203,7 +199,7 @@ return list } - function make_ceiling_walls( lo, hi, region ){ + this.make_ceiling_walls = function ( lo, hi, region ){ var list = [] var width = region.x.length() @@ -211,7 +207,7 @@ var height = hi.height - lo.height if (! (region.half_sides & LEFT) && region.x.a == hi.rect.x.a) { - el = make_wall('.left') + el = this.make_wall('.left') el.rotationY = HALF_PI el.height = height el.width = depth @@ -226,7 +222,7 @@ } if (! (region.half_sides & RIGHT) && region.x.b == hi.rect.x.b) { - el = make_wall('.right') + el = this.make_wall('.right') el.rotationY = -HALF_PI el.height = height el.width = depth @@ -241,7 +237,7 @@ } if (! (region.half_sides & FRONT) && region.y.a == hi.rect.y.a) { - el = make_wall('.front') + el = this.make_wall('.front') el.width = width el.height = height el.rotationY = PI @@ -256,7 +252,7 @@ } if (! (region.half_sides & BACK) && region.y.b == hi.rect.y.b) { - el = make_wall('.back') + el = this.make_wall('.back') el.width = width el.height = height el.rotationY = 0 @@ -272,11 +268,11 @@ return list } - function make_floor(room, region){ + this.make_floor = function (room, region) { var width = region.x.length() var depth = region.y.length() - var el = make_wall('.floor') + var el = this.make_wall('.floor') el.height = depth el.width = width el.x = region.x.a + width/2 @@ -287,12 +283,12 @@ el.side = FLOOR return el } - function make_ceiling(room, region){ + this.make_ceiling = function (room, region) { var width = region.x.length() var depth = region.y.length() var height = room.height - var el = make_wall('.ceiling') + var el = this.make_wall('.ceiling') el.height = depth el.width = width el.x = region.x.a + width/2 @@ -304,7 +300,7 @@ return el } - function make_wall(klass){ + this.make_wall = function (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 diff --git a/public/assets/javascripts/rectangles/engine/rooms/clipper.js b/public/assets/javascripts/rectangles/engine/rooms/clipper.js index d67f6ad..33e3a84 100644 --- a/public/assets/javascripts/rectangles/engine/rooms/clipper.js +++ b/public/assets/javascripts/rectangles/engine/rooms/clipper.js @@ -52,9 +52,9 @@ base.reset_rects() base.clip_rects() - base.cull_rects_iterative() + var culled = base.cull_rects_iterative() - Rooms.regions = sort.rects_by_position(regions) + Rooms.regions = sort.rects_by_position(culled) } // Reset the clipping/culling states of each of the rooms @@ -148,7 +148,7 @@ } } - return regions + return regions.filter(function(r){ return ! r.dupe }) } return base diff --git a/test/03-test-clipping.js b/test/03-test-clipper.js index 20dadb3..923a8a5 100644 --- a/test/03-test-clipping.js +++ b/test/03-test-clipper.js @@ -41,9 +41,8 @@ describe('clipper', function(){ describe('#cull_rects(rect, east)', function(){ Rooms.clipper.reset_rects() var regions = Rooms.clipper.clip_rects() - var culled = Rooms.clipper.cull_rects() - var culled_dupes = culled.filter(function(r){ return r.dupe }) - var culled_regions = culled.filter(function(r){ return ! r.dupe }) + var culled = Rooms.clipper.cull_rects_iterative() + var culled_dupes = regions.filter(function(r){ return r.dupe }) it('clipper returns 4 rects', function(){ assert.equal(4, regions.length) @@ -51,8 +50,8 @@ describe('clipper', function(){ it('culling marks 1 duplicate', function(){ assert.equal(1, culled_dupes.length) }) - it('culling marks 3 non-duplicate', function(){ - assert.equal(3, culled_regions.length) + it('culling returns 3 non-duplicate', function(){ + assert.equal(3, culled.length) }) }) @@ -66,9 +65,8 @@ describe('clipper', function(){ describe('#cull_rects(rect, corner)', function(){ Rooms.clipper.reset_rects() var regions = Rooms.clipper.clip_rects() - var culled = Rooms.clipper.cull_rects() - var culled_dupes = culled.filter(function(r){ return r.dupe }) - var culled_regions = culled.filter(function(r){ return ! r.dupe }) + var culled = Rooms.clipper.cull_rects_iterative() + var culled_dupes = regions.filter(function(r){ return r.dupe }) it('clipper returns 8 rects', function(){ assert.equal(8, regions.length) @@ -76,8 +74,8 @@ describe('clipper', function(){ it('culling marks 1 duplicate', function(){ assert.equal(1, culled_dupes.length) }) - it('culling marks 7 non-duplicate', function(){ - assert.equal(7, culled_regions.length) + it('culling returns 7 non-duplicate', function(){ + assert.equal(7, culled.length) }) }) @@ -95,17 +93,16 @@ describe('clipper', function(){ Rooms.clipper.reset_rects() var regions = Rooms.clipper.clip_rects() var culled = Rooms.clipper.cull_rects() - var culled_dupes = culled.filter(function(r){ return r.dupe }) - var culled_regions = culled.filter(function(r){ return ! r.dupe }) + var culled_dupes = regions.filter(function(r){ return r.dupe }) it('clipper returns 16 rects', function(){ assert.equal(16, regions.length) }) - it('culling marks 2 duplicate', function(){ - assert.equal(2, culled_dupes.length) + it('culling marks 3 duplicate', function(){ + assert.equal(3, culled_dupes.length) }) - it('culling marks 14 non-duplicate', function(){ - assert.equal(14, culled_regions.length) + it('culling returns 13 non-duplicate', function(){ + assert.equal(13, regions.length) }) }) */ @@ -115,8 +112,7 @@ describe('clipper', function(){ Rooms.clipper.reset_rects() var regions = Rooms.clipper.clip_rects() var culled = Rooms.clipper.cull_rects_iterative() - var culled_dupes = culled.filter(function(r){ return r.dupe }) - var culled_regions = culled.filter(function(r){ return ! r.dupe }) + var culled_dupes = regions.filter(function(r){ return r.dupe }) it('clipper returns 16 rects', function(){ assert.equal(16, regions.length) @@ -124,8 +120,8 @@ describe('clipper', function(){ it('culling marks 3 duplicate', function(){ assert.equal(3, culled_dupes.length) }) - it('culling marks 14 non-duplicate', function(){ - assert.equal(13, culled_regions.length) + it('culling returns 14 non-duplicate', function(){ + assert.equal(13, culled.length) }) }) diff --git a/test/04-test-builder.js b/test/04-test-builder.js new file mode 100644 index 0000000..f1c0f71 --- /dev/null +++ b/test/04-test-builder.js @@ -0,0 +1,118 @@ +var assert = require("assert") +var vec = require("../public/assets/javascripts/rectangles/models/vec2.js") +var Rect = require("../public/assets/javascripts/rectangles/models/rect.js") +var Room = require("../public/assets/javascripts/rectangles/models/room.js") +var Rooms = require("../public/assets/javascripts/rectangles/engine/rooms/_rooms.js") +var Clipper = require("../public/assets/javascripts/rectangles/engine/rooms/clipper.js") +var Builder = require("../public/assets/javascripts/rectangles/engine/rooms/builder.js") +var FRONT = 0x1, BACK = 0x2, LEFT = 0x4, RIGHT = 0x8, FLOOR = 0x10, CEILING = 0x20 +var ALL = FRONT | BACK | LEFT | RIGHT +function sidesToString(sides){ + var s = "" + if (sides & FRONT) s += "front " + if (sides & BACK) s += "back " + if (sides & LEFT) s += "left " + if (sides & RIGHT) s += "right " + if (sides & TOP) s += "top " + if (sides & BOTTOM) s += "bottom " + return s +} +function bitcount(v) { + v = v - ((v >>> 1) & 0x55555555); + v = (v & 0x33333333) + ((v >>> 2) & 0x33333333); + return ((v + (v >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24; +} + +var rect = new Rect( new vec(1,5), new vec(1,5) ) +var east = new Rect( new vec(2,6), new vec(1,5) ) +var corner = new Rect( new vec(3,7), new vec(3,7) ) +var peninsula = new Rect( new vec(4,6), new vec(6,8) ) + +function report(a) { + console.log( a.join("\n") ) +} +function reportSides(walls) { + console.log(walls.map(function(w){ return sidesToString(w.side) }).join("\n")) +} +function reset(){ + Rooms.list = {} + Rooms.regions = [] +} +function rebuild(){ + Rooms.clipper.reset_rects() + var regions = Rooms.clipper.clip_rects() + var culled = Rooms.clipper.cull_rects_iterative() + return culled +} + +describe('builder', function(){ + + reset() + var rect_room = Rooms.add_with_rect( rect ) + rebuild() + + describe('#build_walls(rect)', function(){ + var walls = Rooms.builder.build_walls(rect_room.regions[0]) + + it("should return 4 walls", function(){ + assert.equal(4, walls.length) + }) + it("should have one side per wall", function(){ + assert.equal(1, bitcount(walls[0].side)) + assert.equal(1, bitcount(walls[1].side)) + assert.equal(1, bitcount(walls[2].side)) + assert.equal(1, bitcount(walls[3].side)) + }) + }) + + describe('#build_floors(rect)', function(){ + var floors = Rooms.builder.build_floors(rect_room) + it("should make 2 floors", function(){ + assert.equal(2, floors.length) + }) + }) + + // + + reset() + var rect_room = Rooms.add_with_rect( rect ) + var rect_east = Rooms.add_with_rect( east ) + var regions = rebuild() + +console.log("\n\n") +console.log(regions.join("\n")) +console.log("\n\n") + + describe('#build_walls(rect, east)', function(){ + + var walls = regions.map(Rooms.builder.build_walls.bind(Rooms.builder)) + walls.map(function(w){ reportSides(w); console.log("--") }) + + it("should return 3 walls", function(){ + assert.equal(4, walls.length) + }) + it("should have one side per wall", function(){ + assert.equal(1, bitcount(walls[0].side)) + assert.equal(1, bitcount(walls[1].side)) + assert.equal(1, bitcount(walls[2].side)) + assert.equal(1, bitcount(walls[3].side)) + }) + }) + + describe('#build_floors(rect, east)', function(){ + var floors = Rooms.builder.build_floors(rect_room) + it("should make 2 floors", function(){ + assert.equal(2, floors.length) + }) + // reportSides(floors) + }) + + + + + + // Rooms.add_with_rect( corner ) + // Rooms.add_with_rect( peninsula ) + +}) + diff --git a/views/partials/scripts.ejs b/views/partials/scripts.ejs index 1bf1f98..0133ad0 100644 --- a/views/partials/scripts.ejs +++ b/views/partials/scripts.ejs @@ -9,6 +9,14 @@ <script type="text/javascript" src="/assets/javascripts/vendor/dataUriToBlob.js"></script> <script type="text/javascript" src="/assets/javascripts/util.js"></script> +<script type="text/javascript" src="/assets/javascripts/mx/mx.js"></script> +<script type="text/javascript" src="/assets/javascripts/mx/extensions/mx.scene.js"></script> +<script type="text/javascript" src="/assets/javascripts/mx/extensions/mx.movements.js"></script> +<script type="text/javascript" src="/assets/javascripts/mx/primitives/mx.image.js"></script> +<script type="text/javascript" src="/assets/javascripts/mx/primitives/mx.video.js"></script> +<script type="text/javascript" src="/assets/javascripts/mx/primitives/mx.youtube.js"></script> +<script type="text/javascript" src="/assets/javascripts/mx/primitives/mx.vimeo.js"></script> + <script type="text/javascript" src="/assets/javascripts/rectangles/_env.js"></script> <script type="text/javascript" src="/assets/javascripts/rectangles/util/constants.js"></script> <script type="text/javascript" src="/assets/javascripts/rectangles/util/colors.js"></script> @@ -44,14 +52,6 @@ <script type="text/javascript" src="/assets/javascripts/rectangles/engine/map/ui_minimap.js"></script> <script type="text/javascript" src="/assets/javascripts/rectangles/engine/map/draw.js"></script> -<script type="text/javascript" src="/assets/javascripts/mx/mx.js"></script> -<script type="text/javascript" src="/assets/javascripts/mx/extensions/mx.scene.js"></script> -<script type="text/javascript" src="/assets/javascripts/mx/extensions/mx.movements.js"></script> -<script type="text/javascript" src="/assets/javascripts/mx/primitives/mx.image.js"></script> -<script type="text/javascript" src="/assets/javascripts/mx/primitives/mx.video.js"></script> -<script type="text/javascript" src="/assets/javascripts/mx/primitives/mx.youtube.js"></script> -<script type="text/javascript" src="/assets/javascripts/mx/primitives/mx.vimeo.js"></script> - <script type="text/javascript" src="/assets/javascripts/ui/lib/View.js"></script> <script type="text/javascript" src="/assets/javascripts/ui/lib/Router.js"></script> <script type="text/javascript" src="/assets/javascripts/ui/lib/ModalView.js"></script> |
