summaryrefslogtreecommitdiff
path: root/main.lua
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2022-12-21 00:13:49 -0600
committerthe lemons <citrons@mondecitronne.com>2022-12-21 00:13:49 -0600
commit619c46c37731df55bd2f50b7bb126c016734796e (patch)
treeb785914b5b8f82ad16610382afc75603cea85483 /main.lua
parent15b1b3127e636a8a63ff9cdb11dbac68f5218ffe (diff)
chunk-based rendering
Diffstat (limited to 'main.lua')
-rw-r--r--main.lua65
1 files changed, 54 insertions, 11 deletions
diff --git a/main.lua b/main.lua
index 84fb787..ebef333 100644
--- a/main.lua
+++ b/main.lua
@@ -4,11 +4,11 @@ local obj = require "obj"
obj.load_types()
line = love.graphics.line
set_color = love.graphics.setColor
-love.graphics.setLineWidth(0.5)
+line_width = 0.4
local cam = {
x = 0, y = 0,
- scale = 256,
+ scale = 1.1,
panning = false,
}
@@ -19,25 +19,64 @@ for i = 1, 100 do
})
end
-local function view_scale()
+obj.new("test", {0, 0})
+
+local function window_scale()
local w, h = love.graphics.getDimensions()
- return cam.scale / math.min(w, h)
+ return 256 / math.min(w, h)
end
-local function view_transform()
+local function view_scale()
+ return window_scale() / cam.scale
+end
+
+local function view_dimensions()
+ local w, h = love.graphics.getDimensions()
local scale = view_scale()
+ return w * scale, h * scale
+end
+
+local function window_transform()
+ local scale = window_scale()
local trans = love.math.newTransform(0, 0, 0, 1/scale, 1/scale)
- trans:translate(cam.x, cam.y)
+ return trans
+end
+
+local function view_transform()
+ local w, h = view_dimensions()
+ local trans = window_transform()
+ trans:scale(cam.scale, cam.scale)
+ trans:translate(-cam.x + w/2, -cam.y + h/2)
return trans
end
function love.draw()
- love.graphics.clear(0,0,0)
+ love.graphics.clear(0, 0, 0)
+ local w, h = view_dimensions()
+ local cx1, cy1 = cam.x - w/2, cam.y - h/2
+ local cx2, cy2 = cam.x + w/2, cam.y + h/2
+
love.graphics.applyTransform(view_transform())
- for _, o in pairs(world.objects) do
- love.graphics.setColor(1, 1, 1)
+ -- the line thickness will scale according to the zoom amount. counteract this.
+ love.graphics.setLineWidth(line_width / cam.scale)
+ -- draw a grid
+ set_color(0.1, 0.1, 0.1)
+ for x = cx1 - cx1%64, cx2, 64 do
+ for y = cy1 - cy1%64, cy2, 64 do
+ line(x, y, x + world.chunk_size, y)
+ line(x, y, x, y + world.chunk_size)
+ end
+ end
+ -- draw all possibly visible objects
+ for o in world.iterate(cx1 - 20, cy1 - 20, cx2 + 20, cy2 + 20) do
+ set_color(1, 1, 1)
o:draw()
end
+ love.graphics.origin()
+
+ love.graphics.applyTransform(window_transform())
+ love.graphics.setLineWidth(line_width)
+ set_color(1, 1, 1)
end
function love.update()
@@ -62,7 +101,11 @@ function love.mousemoved(_, _, dx, dy)
if cam.panning then
local scale = view_scale()
dx, dy = dx * scale, dy * scale
- cam.x = cam.x + dx
- cam.y = cam.y + dy
+ cam.x = cam.x - dx
+ cam.y = cam.y - dy
end
end
+
+function love.wheelmoved(_, y)
+ cam.scale = math.min(math.max(cam.scale + (y * 0.1), 0.25), 4)
+end