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
|