Map.Draw = function(map, opt){ opt = defaults(opt, { minimap: false }) var draw = this var ctx = map.canvas.getContext("2d") draw.animate = function(){ ctx.save() draw.clear() draw.fill("rgba(255,255,255,0.98)") if (opt.minimap) { ctx.translate( map.dimensions.a * 1/2, map.dimensions.b * 1/2) ctx.scale( map.zoom, map.zoom ) ctx.translate( opt.center.x, - opt.center.z ) ctx.scale( -1, 1 ) draw.coords() draw.regions(Rooms.regions, [ "#fff" ], "#000") draw.camera(scene.camera) } else { ctx.translate( map.dimensions.a * 1/2, map.dimensions.b * 1/2) ctx.scale( map.zoom, map.zoom ) ctx.translate( map.center.a, map.center.b ) ctx.scale( -1, 1 ) draw.regions(Rooms.regions, [ "#f8f8f8" ], "#000") draw.mouse(map.ui.mouse.cursor) draw.coords() scene && draw.camera(scene.camera) } ctx.restore() } draw.render = function(){ // change the ctx temporarily var canvas = document.createElement("canvas") ctx = canvas.getContext('2d') canvas.width = map.canvas.width canvas.height = map.canvas.height draw.clear() ctx.translate( map.dimensions.a * 1/2, map.dimensions.b * 1/2) ctx.scale( map.zoom, map.zoom ) ctx.translate( map.center.a, map.center.b ) ctx.scale( -1, 1 ) draw.regions(Rooms.regions, ["#fff"], null) ctx.restore() // invert opacity var pixelData = ctx.getImageData(0, 0, canvas.width, canvas.height) var pixels = pixelData.data for (var i = 0, k, _len = pixels.length; i < _len; i++) { k = i*4 if (pixels[k+3] == 0) { pixels[k] = pixels[k+1] = pixels[k+2] = pixels[k+3] = 255 } else { pixels[k] = pixels[k+1] = pixels[k+2] = 255 pixels[k+3] = 0 } } ctx.putImageData(pixelData, 0, 0) // reset the ctx ctx = map.canvas.getContext("2d") return canvas } draw.clear = function(){ ctx.clearRect(0, 0, map.dimensions.a, map.dimensions.b) } draw.fill = function(fillStyle){ ctx.fillStyle = fillStyle ctx.fillRect(0, 0, map.dimensions.a, map.dimensions.b) } draw.regions = function(regions, colors, stroke){ if (stroke) { ctx.strokeStyle = "#000" ctx.lineWidth = (1 / map.zoom) } for (var i = 0; i < regions.length; i++) { if (regions[i].dupe) continue ctx.fillStyle = colors[i % colors.length] fill_region(regions[i]) if (stroke) { stroke_sides(regions[i]) } } } draw.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() ) } } } draw.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() } draw.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() } }