summaryrefslogtreecommitdiff
path: root/cmd/viewer.lua
diff options
context:
space:
mode:
authorcitrons <citrons@mondecitronne.com>2025-08-01 21:08:00 -0500
committercitrons <citrons@mondecitronne.com>2025-08-01 21:08:00 -0500
commit97e0ca7f099fedfd7ee41c2f0ad4f5a443b70579 (patch)
tree45b5745c030c42999de198e3bc9300c237af4990 /cmd/viewer.lua
initial commitHEADmaster
Diffstat (limited to 'cmd/viewer.lua')
-rw-r--r--cmd/viewer.lua114
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