function love.load() love.window.setTitle("Julia Set") love.window.setMode(1024, 576) width, height = love.graphics.getDimensions() maxIter = 120 zoom = 1.2 offsetX, offsetY = 0.0, 0.0 t = 0 paused = false shader = love.graphics.newShader[[ extern float zoom; extern float ox; extern float oy; extern float time; extern number maxIter; vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { float x = (sc.x - 512.0)/256.0 * zoom + ox; float y = (sc.y - 288.0)/256.0 * zoom + oy; float zx = x; float zy = y; float cx = 0.285 + 0.3*cos(time*0.3); float cy = 0.01 + 0.3*sin(time*0.3); int i; for(i = 0; i < int(maxIter); i++){ float xt = zx*zx - zy*zy + cx; zy = 2.0*zx*zy + cy; zx = xt; if(zx*zx + zy*zy > 4.0) break; } float v = float(i)/maxIter; vec3 col = 0.5 + 0.5*cos(6.2831*(vec3(1.0,0.5,0.2)*v + vec3(time*0.05,0.2,0.0))); return vec4(col,1.0); } ]] end function love.update(dt) if not paused then t = t + dt shader:send("time", t) shader:send("zoom", zoom) shader:send("ox", offsetX) shader:send("oy", offsetY) shader:send("maxIter", maxIter) end end function love.draw() love.graphics.setShader(shader) love.graphics.rectangle("fill", 0, 0, width, height) love.graphics.setShader() love.graphics.setColor(1, 1, 1) love.graphics.print("Julia Set", 10, 10) love.graphics.print("Zoom: "..string.format("%.2f", zoom), 10, 30) love.graphics.print("Iter: "..maxIter, 10, 50) love.graphics.print("Time: "..string.format("%.1f", t), 10, 70) love.graphics.print("[W/S]: Zoom [A/D]: Move [↑/↓]: Iter [Space]: Pause", 10, 550) end function love.keypressed(key) if key == "escape" then love.event.quit() end if key == "space" then paused = not paused end if key == "w" then zoom = zoom * 0.9 end if key == "s" then zoom = zoom / 0.9 end if key == "a" then offsetX = offsetX - 0.1*zoom end if key == "d" then offsetX = offsetX + 0.1*zoom end if key == "up" then maxIter = math.min(maxIter + 10, 500) end if key == "down" then maxIter = math.max(maxIter - 10, 20) end end