summaryrefslogtreecommitdiff
path: root/assets/javascripts/rectangles/engine
diff options
context:
space:
mode:
Diffstat (limited to 'assets/javascripts/rectangles/engine')
-rw-r--r--assets/javascripts/rectangles/engine/map/_map.js40
-rw-r--r--assets/javascripts/rectangles/engine/map/draw.js162
-rw-r--r--assets/javascripts/rectangles/engine/map/ui.js131
-rw-r--r--assets/javascripts/rectangles/engine/rooms/_rooms.js (renamed from assets/javascripts/rectangles/engine/rooms.js)6
-rw-r--r--assets/javascripts/rectangles/engine/rooms/builder.js (renamed from assets/javascripts/rectangles/engine/builder.js)2
-rw-r--r--assets/javascripts/rectangles/engine/rooms/clipper.js (renamed from assets/javascripts/rectangles/engine/clipper.js)2
-rw-r--r--assets/javascripts/rectangles/engine/rooms/mover.js (renamed from assets/javascripts/rectangles/engine/mover.js)4
-rw-r--r--assets/javascripts/rectangles/engine/scenery.js177
-rw-r--r--assets/javascripts/rectangles/engine/scenery/_scenery.js44
-rw-r--r--assets/javascripts/rectangles/engine/scenery/image.js115
10 files changed, 499 insertions, 184 deletions
diff --git a/assets/javascripts/rectangles/engine/map/_map.js b/assets/javascripts/rectangles/engine/map/_map.js
new file mode 100644
index 0000000..53084bb
--- /dev/null
+++ b/assets/javascripts/rectangles/engine/map/_map.js
@@ -0,0 +1,40 @@
+/*
+*/
+
+window.ctx = window.w = window.h = null;
+
+var map = new function(){
+ var base = this
+ base.el = document.querySelector("#map")
+ base.dimensions = new vec2(500,500)
+ base.bounds = new vec2(500,500)
+ base.center = new vec2(0,0)
+
+ base.sides = function(){
+ var sides = base.bounds.clone().div(2).div(base.zoom)
+ return new Rect( base.center.a - sides.a, -base.center.b - sides.b,
+ base.center.a + sides.a, -base.center.b + sides.b )
+ }
+
+ base.zoom = 1/8
+ base.zoom_exponent = -3
+ base.set_zoom = function (n) {
+ base.zoom_exponent = n
+ base.zoom = pow(2, base.zoom_exponent)
+ }
+
+ var canvas = document.createElement("canvas")
+ var ctx = window.ctx = canvas.getContext("2d")
+ var w = window.w = canvas.width = 500
+ var h = window.h = canvas.height = 500
+ document.querySelector("#map").appendChild(canvas)
+
+ base.update = function(){
+ base.draw.animate()
+ }
+
+ base.toggle = function(){
+ $(base.el).toggle()
+ }
+
+}
diff --git a/assets/javascripts/rectangles/engine/map/draw.js b/assets/javascripts/rectangles/engine/map/draw.js
new file mode 100644
index 0000000..b2fc05f
--- /dev/null
+++ b/assets/javascripts/rectangles/engine/map/draw.js
@@ -0,0 +1,162 @@
+
+map.draw = new function(){
+
+ var base = this
+
+ base.animate = function(){
+ ctx.save()
+ map.draw.clear_canvas()
+ map.draw.ruler()
+
+ ctx.translate( map.bounds.a * 1/2, map.bounds.b * 1/2)
+ ctx.scale( map.zoom, map.zoom )
+ ctx.translate( map.center.a, map.center.b)
+ ctx.scale( -1, 1 )
+
+ map.draw.regions(Rooms.regions)
+ map.draw.mouse(map.ui.mouse.cursor)
+ map.draw.coords()
+ scene && map.draw.camera(scene.camera)
+
+ ctx.restore()
+ }
+
+ base.clear_canvas = function(){
+ ctx.fillStyle = "rgba(255,255,255,0.99)"
+ ctx.clearRect(0,0,w,h)
+ ctx.fillRect(0,0,w,h)
+ }
+
+ base.ruler = function (){
+ ctx.strokeStyle = "rgba(80,80,80,0.5)"
+ ctx.lineWidth = 1
+ var len = 5
+ for (var i = 0.5; i < w; i += 10) {
+ line(i, 0, i, len)
+ line(0, i, len, i)
+ }
+ }
+
+ base.regions = function(regions){
+ for (var i = 0; i < regions.length; i++) {
+ if (regions[i].dupe) continue
+ ctx.fillStyle = colors[i % colors.length]
+ fill_region(regions[i])
+ stroke_sides(regions[i])
+ }
+ }
+
+ base.mouse = function(mouse){
+ var radius = 3 / map.zoom
+
+ ctx.fillStyle = "rgba(255,0,0,0.4)";
+ ctx.beginPath();
+ ctx.arc(mouse.x.b, mouse.y.b, radius, 0, 2*Math.PI, false);
+ ctx.fill();
+
+ if (mouse.width() != 0 && mouse.height() != 0) {
+ if (map.ui.dragging) {
+ stroke_rect(mouse)
+ }
+ else {
+ ctx.fillStyle = "rgba(255,255,0,0.5)"
+ fill_region( mouse.clone().translate() )
+ }
+ }
+ }
+
+ base.camera = function(cam){
+ ctx.lineWidth = 0.5
+
+ ctx.save()
+
+ ctx.translate(cam.x, cam.z)
+ ctx.rotate(cam.rotationY)
+
+ var radius = 3 / map.zoom
+
+ ctx.fillStyle = '#888';
+
+ ctx.beginPath();
+ ctx.moveTo(0,0)
+ ctx.lineTo(-radius,-radius/2)
+ ctx.lineTo(0,radius*3)
+ ctx.lineTo(radius,-radius/2)
+ ctx.moveTo(0,0)
+ ctx.fill()
+
+ ctx.restore()
+ }
+
+ base.coords = function(){
+ ctx.fillStyle = "#888";
+ dot_at(0,0)
+ ctx.fillStyle = "#bbb";
+ dot_at(100,0)
+ dot_at(0,100)
+ ctx.fillStyle = "#ddd";
+ dot_at(200,0)
+ dot_at(0,200)
+ ctx.fillStyle = "#eee";
+ dot_at(300,0)
+ dot_at(0,300)
+
+ ctx.strokeStyle = "rgba(0,0,0,0.1)"
+ ctx.lineWidth = 1/map.zoom
+
+ var sides = map.sides()
+ var quant = sides.clone().quantize(200)
+ for (var x = quant.x.a - 200; x <= quant.x.b; x += 200) {
+ line(x, sides.y.a, x, sides.y.b)
+ }
+ for (var y = quant.y.a - 200; y <= quant.y.b; y += 200) {
+ line(sides.x.a, y, sides.x.b, y)
+ }
+ }
+
+ //
+
+ function line (x,y,a,b,translation){
+ if (translation) {
+ x += translation.a
+ a += translation.a
+ y += translation.b
+ b += translation.b
+ }
+ ctx.beginPath()
+ ctx.moveTo(x,y)
+ ctx.lineTo(a,b)
+ ctx.stroke()
+ }
+
+ function fill_region(r){
+ ctx.fillRect(r.x.a + r.translation.a,
+ r.y.a + r.translation.b,
+ r.x.length(),
+ r.y.length())
+ }
+
+ function stroke_sides (r){
+ if (r.sides & FRONT) line(r.x.a, r.y.a, r.x.b, r.y.a)
+ if (r.sides & BACK) line(r.x.a, r.y.b, r.x.b, r.y.b)
+ if (r.sides & LEFT) line(r.x.a, r.y.a, r.x.a, r.y.b)
+ if (r.sides & RIGHT) line(r.x.b, r.y.a, r.x.b, r.y.b)
+ }
+
+ function stroke_rect (r){
+ line(r.x.a, r.y.a, r.x.b, r.y.b, r.translation)
+ }
+
+ function dot_at (x,z){
+ ctx.save()
+ ctx.translate(x,z)
+
+ var radius = 2 / map.zoom
+
+ ctx.beginPath();
+ ctx.arc(0, 0, radius, 0, 2*Math.PI, false);
+ ctx.fill();
+
+ ctx.restore()
+ }
+} \ No newline at end of file
diff --git a/assets/javascripts/rectangles/engine/map/ui.js b/assets/javascripts/rectangles/engine/map/ui.js
new file mode 100644
index 0000000..6e9a5ab
--- /dev/null
+++ b/assets/javascripts/rectangles/engine/map/ui.js
@@ -0,0 +1,131 @@
+
+map.ui = new function(){
+
+ var base = this
+
+ base.creating = base.dragging = base.resizing = false
+
+ base.mouse = new mouse({
+ el: map.el,
+ down: down,
+ move: move,
+ drag: drag,
+ up: up,
+ rightclick: rightclick,
+ })
+
+ base.wheel = new wheel({
+ el: map.el,
+ update: mousewheel,
+ })
+
+ //
+
+ function down (e, cursor){
+ cursor.x.div(w).add(0.5).mul(map.bounds.a / map.zoom).add(map.center.a)
+ cursor.y.div(h).sub(0.5).mul(map.bounds.b / map.zoom).sub(map.center.b)
+
+ if (e.ctrlKey || e.which === 3) {
+ cursor.quantize(1)
+ map.center.a = cursor.x.a
+ map.center.b = -cursor.y.a
+ console.log(map.center+"")
+ cursor.x.b = cursor.x.a
+ cursor.y.b = cursor.y.a
+ base.mouse.down = false
+ e.preventDefault()
+ e.stopPropagation()
+ return
+ }
+
+ var intersects = Rooms.filter(function(r){
+ return r.focused = r.rect.contains(cursor.x.a, cursor.y.a)
+ })
+
+ if (intersects.length) {
+ base.dragging = intersects[0]
+ base.resizing = base.dragging.rect.nearEdge(cursor.x.a, cursor.y.a, resize_margin / map.zoom)
+ base.dragging.rect.translation.sides = base.resizing
+ }
+ else {
+ base.creating = true
+ }
+
+ if (e.shiftKey && base.dragging) {
+ base.dragging.rect.quantize(10)
+ }
+ }
+
+ function move (e, cursor) {
+ cursor.x.div(w).add(0.5).mul(map.bounds.a / map.zoom).add(map.center.a)
+ cursor.y.div(h).sub(0.5).mul(map.bounds.b / map.zoom).sub(map.center.b)
+ }
+
+ function drag (e, cursor) {
+ cursor.x.b = ((cursor.x.b/w)+0.5) * map.bounds.a / map.zoom + map.center.a
+ cursor.y.b = ((cursor.y.b/h)-0.5) * map.bounds.b / map.zoom - map.center.b
+
+ if (base.resizing) {
+ var x_length = base.dragging.rect.x.length(),
+ y_length = base.dragging.rect.y.length()
+
+ if (base.resizing & LEFT) {
+ base.dragging.rect.translation.a = clamp( cursor.x.magnitude(), x_length - side_max, x_length - side_min )
+ }
+ if (base.resizing & RIGHT) {
+ base.dragging.rect.translation.a = clamp( cursor.x.magnitude(), side_min - x_length, side_max - x_length )
+ }
+ if (base.resizing & FRONT) {
+ base.dragging.rect.translation.b = clamp( cursor.y.magnitude(), y_length - side_max, y_length - side_min )
+ }
+ if (base.resizing & BACK) {
+ base.dragging.rect.translation.b = clamp( cursor.y.magnitude(), side_min - y_length, side_max - y_length )
+ }
+ }
+ else if (base.dragging) {
+ base.dragging.rect.translation.a = cursor.x.magnitude()
+ base.dragging.rect.translation.b = cursor.y.magnitude()
+ }
+ }
+
+ function up (e, cursor, new_cursor) {
+ new_cursor.x.div(w).add(0.5).mul(map.bounds.a / map.zoom).add(map.center.a)
+ new_cursor.y.div(h).sub(0.5).mul(map.bounds.b / map.zoom).sub(map.center.b)
+
+ if (base.creating) {
+ if (cursor.height() > side_min && cursor.width() > side_min) {
+ cursor.x.abs().quantize(1)
+ cursor.y.abs().quantize(1)
+ Rooms.add_with_rect( cursor )
+ }
+ }
+
+ if (base.resizing) {
+ base.dragging.rect.resize()
+ }
+ else if (base.dragging) {
+ base.dragging.rect.translate()
+ }
+
+ base.creating = base.dragging = base.resizing = false
+ }
+
+ function mousewheel (e, val, delta){
+ var cursor = base.mouse.cursor
+
+ var intersects = Rooms.filter(function(r){
+ return r.focused = r.rect.contains(cursor.x.a, cursor.y.a)
+ })
+
+ if (intersects.length) {
+ intersects[0].height = clamp( ~~(intersects[0].height - delta), height_min, height_max )
+ Rooms.clipper.update()
+ }
+ else {
+ map.set_zoom(map.zoom_exponent - delta/20)
+ }
+ }
+
+ function rightclick (e){
+ }
+}
diff --git a/assets/javascripts/rectangles/engine/rooms.js b/assets/javascripts/rectangles/engine/rooms/_rooms.js
index 93ba7b8..411a093 100644
--- a/assets/javascripts/rectangles/engine/rooms.js
+++ b/assets/javascripts/rectangles/engine/rooms/_rooms.js
@@ -6,9 +6,9 @@ var Rooms = new function(){
base.regions = []
base.init = function(){
- Builder.init()
- Clipper.init()
- Mover.init()
+ Rooms.builder.init()
+ Rooms.clipper.init()
+ Rooms.mover.init()
}
base.filter = function(f){
diff --git a/assets/javascripts/rectangles/engine/builder.js b/assets/javascripts/rectangles/engine/rooms/builder.js
index 91bdeb4..8586a7b 100644
--- a/assets/javascripts/rectangles/engine/builder.js
+++ b/assets/javascripts/rectangles/engine/rooms/builder.js
@@ -1,5 +1,5 @@
-var Builder = new function(){
+Rooms.builder = new function(){
var base = this
var els = []
diff --git a/assets/javascripts/rectangles/engine/clipper.js b/assets/javascripts/rectangles/engine/rooms/clipper.js
index d814fec..8989ba8 100644
--- a/assets/javascripts/rectangles/engine/clipper.js
+++ b/assets/javascripts/rectangles/engine/rooms/clipper.js
@@ -1,5 +1,5 @@
-var Clipper = new function(){
+Rooms.clipper = new function(){
var base = this
base.init = function(){
diff --git a/assets/javascripts/rectangles/engine/mover.js b/assets/javascripts/rectangles/engine/rooms/mover.js
index 413715a..e67d9bc 100644
--- a/assets/javascripts/rectangles/engine/mover.js
+++ b/assets/javascripts/rectangles/engine/rooms/mover.js
@@ -1,4 +1,4 @@
-var Mover = new function(){
+Rooms.mover = new function(){
var base = this
base.room = null
@@ -14,7 +14,7 @@ var Mover = new function(){
keys.on("backslash", function(){
base.noclip = ! base.noclip
base.room = null
- app.movements.gravity( ! app.movements.gravity() )
+ app.movements.gravity( ! base.noclip )
})
}
diff --git a/assets/javascripts/rectangles/engine/scenery.js b/assets/javascripts/rectangles/engine/scenery.js
deleted file mode 100644
index 1301949..0000000
--- a/assets/javascripts/rectangles/engine/scenery.js
+++ /dev/null
@@ -1,177 +0,0 @@
-var wall_rotation = {}
-wall_rotation[FRONT] = PI
-wall_rotation[BACK] = 0
-wall_rotation[LEFT] = HALF_PI
-wall_rotation[RIGHT] = -HALF_PI
-
-var Scenery = new function(){
-
- var base = this;
-
- base.mouse = new mouse ({ use_offset: false })
-
- base.init = function(){
- var urls = [
- "http://okfocus.s3.amazonaws.com/office/ducks/duck1.jpg",
- "http://okfocus.s3.amazonaws.com/office/ducks/duck2.jpg",
- "http://okfocus.s3.amazonaws.com/office/ducks/duck3.jpg",
- "http://okfocus.s3.amazonaws.com/office/ducks/duck4.jpg",
- "http://okfocus.s3.amazonaws.com/office/ducks/duck5.jpg",
- ]
- var loader = new Loader(function(){
- base.load(loader.images)
- })
- loader.preloadImages(urls)
- }
-
- base.load = function(images){
- images.forEach(function(img){
- img.width = 300
- img.height = ~~(300 * img.naturalHeight/img.naturalWidth)
- })
-
- Rooms.forEach(function(room){
- room.walls.forEach(function(wall){
- new_image(wall, choice(images))
- })
- })
- }
-
- function new_image (wall, img) {
- var x, z
-
- if (! wall.fits(img)) return
-
- var mx_img = new MX.Image({
- src: img.src,
- x: 0,
- y: Rooms.list[wall.room].height/2 - img.height/2 - 20,
- z: 0,
- scale: 300/img.naturalWidth,
- rotationY: 0,
- backface: false,
- })
-
- var center = wall.center_for(img, null)
- mx_img.move({
- x: center.a,
- z: center.b,
- rotationY: wall_rotation[ wall.side ]
- })
- scene.add(mx_img)
-
- // https://s3.amazonaws.com/luckyplop/f5b2c20e602cdfc86383910f294dcf23d91fa956.png
-
- var x = 0, y = 0, z = 0, bounds
-
- // should be proportional to distance from wall
- var cursor_amp = 1.5
- var dragging = false
-
- base.mouse.bind_el(mx_img.el)
- base.mouse.tube.on("down", function(e, cursor){
- if (e.target != mx_img.el) return;
- dragging = true
- x = mx_img.x
- y = mx_img.y
- z = mx_img.z
- bounds = wall.bounds_for(img)
- document.body.classList.add("dragging")
- })
- base.mouse.tube.on("enter", function(e, new_wall, cursor){
- if (! dragging) return
- if (new_wall.uid == wall.uid) return
- if (! new_wall.fits(img)) return
-
- bounds = new_wall.bounds_for(img)
- center = new_wall.center_for(img)
-
- x = center.a
- z = center.b
-
- var wall_group = wall.side | new_wall.side
-
- if (wall.side !== new_wall.side && wall_group !== FRONT_BACK && wall_group !== LEFT_RIGHT) {
- switch (wall.side) {
- case FRONT:
- z = bounds.x.a
- break
- case BACK:
- z = bounds.x.b
- break
- case LEFT:
- x = bounds.x.a
- break
- case RIGHT:
- x = bounds.x.b
- break
- }
- }
-
- cursor.x.a = cursor.x.b
-
- mx_img.move({
- x: x,
- z: z,
- rotationY: wall_rotation[ new_wall.side ]
- })
-
- wall = new_wall
- })
- base.mouse.tube.on("drag", function(e, cursor){
- if (! dragging) return
-
- mx_img.y = bounds.y.clamp( y - cursor.y.magnitude()*cursor_amp )
- switch (wall.side) {
- case FRONT:
- mx_img.x = bounds.x.clamp( x - cursor.x.magnitude()*cursor_amp )
- break
- case BACK:
- mx_img.x = bounds.x.clamp( x + cursor.x.magnitude()*cursor_amp )
- break
- case LEFT:
- mx_img.z = bounds.x.clamp( z + cursor.x.magnitude()*cursor_amp )
- break
- case RIGHT:
- mx_img.z = bounds.x.clamp( z - cursor.x.magnitude()*cursor_amp )
- break
- }
- })
- base.mouse.tube.on("up", function(e, cursor){
- dragging = false
- document.body.classList.remove("dragging")
- })
- }
-
- function side_direction (a, b) {
- if (a === b) return 0
- if ((a | b) === FRONT_BACK) return 0
- if ((a | b) === LEFT_RIGHT) return 0
- switch (a) {
- case FRONT:
- return b & LEFT ? -1 : 1
- case BACK:
- return b & RIGHT ? -1 : 1
- case LEFT:
- return b & FRONT ? -1 : 1
- case RIGHT:
- return b & BACK ? -1 : 1
- }
- }
-
-// console.log([
-// compare_sides( LEFT, RIGHT ),
-// compare_sides( FRONT, BACK ),
-// compare_sides( FRONT, LEFT ),
-// compare_sides( FRONT, RIGHT ),
-// compare_sides( BACK, RIGHT ),
-// compare_sides( BACK, LEFT ),
-// compare_sides( LEFT, FRONT ),
-// compare_sides( LEFT, BACK ),
-// compare_sides( RIGHT, BACK ),
-// compare_sides( RIGHT, FRONT ),
-// ].join("\n"))
-
- return base
-
-}
diff --git a/assets/javascripts/rectangles/engine/scenery/_scenery.js b/assets/javascripts/rectangles/engine/scenery/_scenery.js
new file mode 100644
index 0000000..dbd9dbe
--- /dev/null
+++ b/assets/javascripts/rectangles/engine/scenery/_scenery.js
@@ -0,0 +1,44 @@
+
+var Scenery = new function(){
+
+ var base = this;
+
+ base.images = []
+
+ base.mouse = new mouse ({ use_offset: false })
+
+ base.init = function(){
+ var urls = [
+ "http://okfocus.s3.amazonaws.com/office/ducks/duck1.jpg",
+ "http://okfocus.s3.amazonaws.com/office/ducks/duck2.jpg",
+ "http://okfocus.s3.amazonaws.com/office/ducks/duck3.jpg",
+ "http://okfocus.s3.amazonaws.com/office/ducks/duck4.jpg",
+ "http://okfocus.s3.amazonaws.com/office/ducks/duck5.jpg",
+ ]
+ var loader = new Loader(function(){
+ base.load(loader.images)
+ })
+ loader.preloadImages(urls)
+ }
+
+ base.load = function(images){
+ images.forEach(function(img){
+ img.width = 300
+ img.height = ~~(300 * img.naturalHeight/img.naturalWidth)
+ })
+
+ Rooms.forEach(function(room){
+ room.walls.forEach(function(wall){
+ var img = choice(images)
+ if (wall.fits(img)) {
+ var scene_img = new Scenery.image (wall, img)
+ base.images.push(scene_img)
+ scene_img.init()
+ }
+ })
+ })
+ }
+
+ return base
+}
+
diff --git a/assets/javascripts/rectangles/engine/scenery/image.js b/assets/javascripts/rectangles/engine/scenery/image.js
new file mode 100644
index 0000000..6434603
--- /dev/null
+++ b/assets/javascripts/rectangles/engine/scenery/image.js
@@ -0,0 +1,115 @@
+Scenery.image = function (wall, img) {
+
+ var base = this
+ var center
+ var x = 0, y = 0, z = 0, bounds
+ var dragging = false
+
+ // should be proportional to distance from wall
+ var cursor_amp = 1.5
+
+ base.init = function(){
+ base.build()
+ base.bind()
+ }
+
+ base.build = function(){
+ center = wall.center_for(img)
+ base.mx_img = new MX.Image({
+ src: img.src,
+ x: center.a,
+ y: Rooms.list[wall.room].height/2 - img.height/2 - 20,
+ z: center.b,
+ scale: 300/img.naturalWidth,
+ rotationY: wall_rotation[ wall.side ],
+ backface: false,
+ })
+ scene.add( base.mx_img )
+ }
+
+ base.bind = function(){
+ Scenery.mouse.bind_el(base.mx_img.el)
+ Scenery.mouse.on("down", down)
+ Scenery.mouse.on("enter", switch_wall)
+ Scenery.mouse.on("drag", drag)
+ Scenery.mouse.on("up", up)
+ }
+
+ function down (e, cursor){
+ if (e.target != base.mx_img.el) return;
+ dragging = true
+ x = base.mx_img.x
+ y = base.mx_img.y
+ z = base.mx_img.z
+ bounds = wall.bounds_for(img)
+ document.body.classList.add("dragging")
+ }
+
+ function switch_wall (e, new_wall, cursor){
+ if (! dragging) return
+ if (new_wall.uid == wall.uid) return
+ if (! new_wall.fits(img)) return
+
+ bounds = new_wall.bounds_for(img)
+ center = new_wall.center_for(img)
+
+ x = center.a
+ z = center.b
+
+ var wall_group = wall.side | new_wall.side
+
+ if (wall.side !== new_wall.side && wall_group !== FRONT_BACK && wall_group !== LEFT_RIGHT) {
+ switch (wall.side) {
+ case FRONT:
+ z = bounds.x.a
+ break
+ case BACK:
+ z = bounds.x.b
+ break
+ case LEFT:
+ x = bounds.x.a
+ break
+ case RIGHT:
+ x = bounds.x.b
+ break
+ }
+ }
+
+ cursor.x.a = cursor.x.b
+
+ base.mx_img.move({
+ x: x,
+ z: z,
+ rotationY: wall_rotation[ new_wall.side ]
+ })
+
+ wall = new_wall
+ }
+
+ function drag (e, cursor){
+ if (! dragging) return
+
+ base.mx_img.y = bounds.y.clamp( y - cursor.y.magnitude()*cursor_amp )
+ switch (wall.side) {
+ case FRONT:
+ base.mx_img.x = bounds.x.clamp( x - cursor.x.magnitude()*cursor_amp )
+ break
+ case BACK:
+ base.mx_img.x = bounds.x.clamp( x + cursor.x.magnitude()*cursor_amp )
+ break
+ case LEFT:
+ base.mx_img.z = bounds.x.clamp( z + cursor.x.magnitude()*cursor_amp )
+ break
+ case RIGHT:
+ base.mx_img.z = bounds.x.clamp( z - cursor.x.magnitude()*cursor_amp )
+ break
+ }
+ }
+
+ function up (e, cursor){
+ dragging = false
+ document.body.classList.remove("dragging")
+ }
+
+ return base
+}