diff options
Diffstat (limited to 'cmd/viewer.lua')
| -rw-r--r-- | cmd/viewer.lua | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/cmd/viewer.lua b/cmd/viewer.lua new file mode 100644 index 0000000..05925a5 --- /dev/null +++ b/cmd/viewer.lua @@ -0,0 +1,114 @@ +local bignum = require "bignum" +local mandelbrot = require "mandelbrot" + + +local shader = love.graphics.newShader "mandelbrot.glsl" +local canvas = love.graphics.newCanvas(love.graphics.getDimensions()) +local redraw = true + +local iter = 256 +local view_pos = {bignum.float(0), bignum.float(0)} +local zoom = 300 +local antialias = 1 + +local function draw_brot(zoom, x, y) + love.graphics.setShader(shader) + shader:send("iterations", iter) + shader:send("zoom", zoom) + shader:send("antialias", antialias) + local orbit = mandelbrot.orbit(iter, x, y) + shader:send("orbit", unpack(orbit)) + + local w, h = love.graphics.getDimensions() + local ox, oy = -w / 2 / zoom, -h / 2 / zoom + shader:send("offset", {ox, oy}) + + love.graphics.rectangle("fill", 0, 0, love.graphics.getDimensions()) + love.graphics.setShader() + +-- love.graphics.push() +-- love.graphics.translate(w / 2, h / 2) +-- love.graphics.scale(zoom) +-- love.graphics.translate(-bignum.tonumber(x), -bignum.tonumber(y)) +-- love.graphics.setLineWidth(1 / zoom) +-- love.graphics.setColor(1, 0.1, 1) +-- for i = 2, #orbit do +-- local x1, y1 = unpack(orbit[i - 1]) +-- local x2, y2 = unpack(orbit[i]) +-- love.graphics.line(x1, y1, x2, y2) +-- end +-- love.graphics.setColor(1, 1, 1) +-- love.graphics.pop() +end + +function love.draw() + local w, h = love.graphics.getDimensions() + local cw, ch = canvas:getDimensions() + if cw < w or ch < h then + canvas:release() + canvas = love.graphics.newCanvas(w, h) + end + if cw ~= w or ch ~= h then + redraw = true + end + + if redraw then + love.graphics.setCanvas(canvas) + draw_brot(zoom, unpack(view_pos)) + redraw = false + end + + love.graphics.setShader() + love.graphics.setCanvas() + love.graphics.draw(canvas) + + love.graphics.setColor(0, 0, 0, 0.5) + love.graphics.rectangle("fill", 0, 0, w, 25) + love.graphics.setColor(1, 1, 1) + local info = ("p: (%s, %s) z: %s i: %s a: %dX"):format( + view_pos[1], view_pos[2], zoom, iter, antialias * antialias) + love.graphics.print(info, 5, 5) + love.graphics.setColor(1, 1, 1) + + local x, y = unpack(view_pos) +end + +function love.mousemoved(x, y, dx, dy) + if love.mouse.isDown(1) then + view_pos[1], view_pos[2] = + view_pos[1] - dx / zoom, view_pos[2] - dy / zoom + --print("p", unpack(view_pos)) + redraw = true + end +end + +function love.wheelmoved(_, sy) + local x, y = unpack(view_pos) + local w, h = love.graphics.getDimensions() + local mx, my = love.mouse.getPosition() + mx, my = mx - w / 2, my - h / 2 + + x, y = x + mx / zoom, y + my / zoom + zoom = zoom + sy * (zoom / 15) + x, y = x - mx / zoom, y - my / zoom + view_pos[1], view_pos[2] = x, y + + redraw = true +end + +function love.keypressed(key) + if key == "up" then + if iter < 4096 then + iter = iter * 2 + redraw = true + end + elseif key == "down" then + if iter > 1 then + iter = iter / 2 + redraw = true + end + elseif key == "a" then + antialias = 1 + (antialias % 3) + redraw = true + end +end |
