summaryrefslogtreecommitdiff
path: root/main.lua
blob: 872499b2194aca52cc24e2fc4c12b6628cd8585f (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
require "globals"

local Transform = require 'Transform'
local Drawable = require 'Drawable'
local Input = require 'Input'
local Camera = require 'Camera'
local Bolvis = require 'Bolvis'
local Sprite = require 'Sprite'
local world = require 'world'

local level
local camera

function love.load()
	love.setDeprecationOutput(false)

	love.mouse.setRelativeMode(true)
	level = world()

	local bolvis = level:object(Transform {pos = {960, 540}}, Bolvis())
	camera = bolvis[Bolvis].i.camera[Camera]

	level:object(Transform {pos = {400, 540}}, Sprite {name = 'utah-teapot'})
	level:object(Transform {pos = {600, 540}}, Sprite {name = 'apioform'})
	level:object(Transform {pos = {960, 300}}, Sprite {name = 'test'})
	level:object(Transform {pos = {960, 700}}, Sprite {name = 'test'})
	level:object(Transform {pos = {430, 700}}, Sprite {name = 'test'})
	level:object(Transform {pos = {1490, 700}}, Sprite {name = 'test'})
end

local function screen_transform()
	local ww, wh = love.graphics.getDimensions()
	local sw, sh = 1920, 1080
	local scalex, scaley = ww / sw, wh / sh
	local scale
	if scalex * sh < wh then
		scale = scalex
	else
		scale = scaley
	end
	local dimx, dimy = sw * scale, sh * scale
	local x, y = ww / 2 - dimx / 2, wh / 2 - dimy / 2
	return love.math.newTransform(x, y, 0, scale, scale)
end

local function call(ct, method, ...)
	for o in level:iterate(ct) do
		o:call(method, ...)
	end
end

function love.draw()
	love.graphics.applyTransform(screen_transform())
	camera:use()
	local to_draw = {}
	for o in level:iterate(Drawable) do
		table.insert(to_draw, o)
	end
	table.sort(to_draw, function(a, b)
		return a:get(Drawable).i.z < b:get(Drawable).i.z
	end)
	for _, o in ipairs(to_draw) do
		love.graphics.push()
		local cmps = {}
		for c in o:all_components() do
			table.insert(cmps, c)
		end
		table.sort(cmps, function(a, b)
			return (a.i.z or 0) < (b.i.z or 0)
		end)
		for _, c in ipairs(cmps) do
			if c.draw then c:draw() end
		end
		love.graphics.pop()
	end
end

function love.update(dt)
	-- physics.world:update(dt, 20, 20)
	call(nil, 'update', dt)
end

function love.mousemoved(...) 
	call(Input, 'mousemoved', ...)
end

function love.mousepressed(...)
	love.mouse.setRelativeMode(true)
	call(Input, 'mousepressed', ...)
end

function love.mousereleased(...)
	call(Input, 'mousereleased', ...)
end

function love.keypressed(key, ...)
	if key == 'tab' and
		(love.keyboard.isDown 'ralt' or love.keyboard.isDown 'lalt') then
		love.mouse.setRelativeMode(false)
	end
	call(Input, 'keypressed', key, ...)
end

function love.keyreleased(...)
	call(Input, 'keyreleased', ...)
end