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.ruler() 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" ]) 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" ]) draw.mouse(map.ui.mouse.cursor) draw.coords() scene && draw.camera(scene.camera) } ctx.restore() } draw.render = function(){ ctx.save() 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"]) draw.mouse(map.ui.mouse.cursor) scene && draw.camera(scene.camera) ctx.restore() } draw.clear = function(){ ctx.fillStyle = "rgba(255,255,255,0.98)" ctx.clearRect(0, 0, map.dimensions.a, map.dimensions.b) ctx.fillRect(0, 0, map.dimensions.a, map.dimensions.b) } draw.ruler = function (){ ctx.strokeStyle = "rgba(80,80,80,0.5)" ctx.lineWidth = 1 var len = 5 for (var i = 0.5; i < map.dimensions.a; i += 10) { line(i, 0, i, len) line(0, i, len, i) } } draw.regions = function(regions, colors){ for (var i = 0; i < regions.length; i++) { if (regions[i].dupe) continue ctx.fillStyle = colors[i % colors.length] ctx.strokeStyle = "#000" ctx.lineWidth = (1 / map.zoom) fill_region(regions[i]) 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() } }