summaryrefslogtreecommitdiff
path: root/main.lua
blob: 66ef333b96d5677cdf0c7b7ab2ef443dbff764b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
local VIRTUAL_WIDTH, VIRTUAL_HEIGHT = 16*10*3, 9*10*3
local CANVAS_PADDING = 6
local CANVAS_WIDTH = VIRTUAL_WIDTH + CANVAS_PADDING
local CANVAS_HEIGHT = VIRTUAL_HEIGHT + CANVAS_PADDING
local WORLD_TO_CANVAS = 3

local scale = 1
local finalScale = 1
local offsetX, offsetY = 0, 0
local dpiScale = 1
local canvas = nil
local smoothCameraShader = nil

--TODO: separate to components
local cameraModule = require("camera")
local camera = nil
-- end

local fonts = require("fonts")


local function recalcScale(w, h)
    dpiScale = (love.window.getDPIScale and love.window.getDPIScale()) or 1
    scale = math.max(1, math.floor(math.min(w / VIRTUAL_WIDTH, h / VIRTUAL_HEIGHT) / dpiScale))
    finalScale = scale * dpiScale
    offsetX = math.floor((w - VIRTUAL_WIDTH * finalScale) / 2)
    offsetY = math.floor((h - VIRTUAL_HEIGHT * finalScale) / 2)
end

function love.load()
    camera = cameraModule:new({x = 0, y = 0, width = VIRTUAL_WIDTH, height = VIRTUAL_HEIGHT}, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, true, WORLD_TO_CANVAS)
    love.graphics.setDefaultFilter("nearest", "nearest")
    love.window.setTitle("Openformer")
    fonts.load()
    love.graphics.setFont(fonts.default)

    canvas = love.graphics.newCanvas(CANVAS_WIDTH, CANVAS_HEIGHT)
    canvas:setFilter("nearest", "nearest")

    local ok, shader = pcall(love.graphics.newShader, "shaders/smooth_camera.glsl")
    smoothCameraShader = ok and shader or nil
    if not smoothCameraShader then
        print("Warning: smooth_camera.glsl not loaded, using fallback (no sub-pixel offset)")
    end

    local w, h = love.graphics.getWidth(), love.graphics.getHeight()
    recalcScale(w, h)

end

function love.resize(w, h)
    recalcScale(w, h)
    if canvas then canvas:release() end
    canvas = love.graphics.newCanvas(CANVAS_WIDTH, CANVAS_HEIGHT)
    canvas:setFilter("nearest", "nearest")
end


function love.update(dt)
    if not camera then return end
    camera:update(dt)
end

function love.keypressed(key, scancode, isrepeat)
    if key == "f11" then
        love.window.setFullscreen(not love.window.getFullscreen(), "desktop")
    end
end

function love.draw()
    love.graphics.setCanvas(canvas)
    love.graphics.clear()
    love.graphics.push()
    if camera then
    camera:set()
    love.graphics.print("FPS: " .. love.timer.getFPS(), 10, 10)
    love.graphics.pop()

        camera:unset()
    end

    love.graphics.setCanvas()

    love.graphics.clear()
    local drawX = offsetX - (CANVAS_PADDING * finalScale) / 2
    local drawY = offsetY - (CANVAS_PADDING * finalScale) / 2
    love.graphics.draw(canvas, math.floor(drawX), math.floor(drawY), 0, finalScale, finalScale)
end

return nil