1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-02 12:33:52 +00:00
lovr/src/resources/boot.lua

232 lines
6.1 KiB
Lua
Raw Normal View History

2017-12-19 00:01:12 +00:00
local conf = {
modules = {
audio = true,
2018-01-16 07:13:26 +00:00
data = true,
2017-12-19 00:01:12 +00:00
event = true,
graphics = true,
headset = true,
math = true,
physics = true,
2018-02-12 04:34:32 +00:00
thread = true,
2017-12-19 00:01:12 +00:00
timer = true
},
gammacorrect = false,
headset = {
drivers = { 'openvr', 'webvr', 'fake' },
mirror = true,
offset = 1.7
},
window = {
width = 800,
height = 600,
fullscreen = false,
msaa = 0,
title = 'LÖVR',
icon = nil
}
}
local function applyHeadsetOffset()
lovr.graphics.translate('view', 0, -conf.headset.offset, 0)
end
function lovr.errhand(message)
message = 'Error:\n' .. message:gsub('\n[^\n]+$', ''):gsub('\t', ''):gsub('stack traceback', '\nStack')
print(message)
if not lovr.graphics then return end
lovr.graphics.reset()
lovr.graphics.setBackgroundColor(.105, .098, .137)
lovr.graphics.setColor(.863, .863, .863)
if lovr.headset then
lovr.headset.setMirrored(false)
end
local font = lovr.graphics.getFont()
local pixelDensity = font:getPixelDensity()
local width = font:getWidth(message, .55 * pixelDensity)
local function render()
lovr.graphics.print(message, -width / 2, conf.headset.offset, -20, 1, 0, 0, 0, 0, .55 * pixelDensity, 'left')
end
local function headsetRender()
if lovr.headset.getOriginType() == 'head' then
applyHeadsetOffset()
end
render()
end
while true do
lovr.event.pump()
for name in lovr.event.poll() do
if name == 'quit' then return end
end
lovr.graphics.clear()
lovr.graphics.origin()
if lovr.headset and lovr.headset.isPresent() and lovr.getOS() ~= 'Web' then
lovr.headset.renderTo(headsetRender)
end
applyHeadsetOffset()
render()
lovr.graphics.present()
lovr.timer.sleep((lovr.headset and lovr.headset.isPresent()) and .001 or .1)
end
end
lovr.filesystem = require('lovr.filesystem')
local runnable = lovr.filesystem.isFile('conf.lua') or lovr.filesystem.isFile('main.lua')
if not lovr.filesystem.getSource() or not runnable then
function lovr.conf(t)
t.modules.audio = false
t.modules.math = false
t.modules.physics = false
end
local logo, controllers
function lovr.load()
local texture = lovr.graphics.newTexture(lovr.data.newBlob(lovr._logo, 'logo.png'))
2017-12-19 00:01:12 +00:00
logo = lovr.graphics.newMaterial(texture)
lovr.graphics.setBackgroundColor(.960, .988, 1.0)
refreshControllers()
end
function lovr.draw()
lovr.graphics.setColor(1.0, 1.0, 1.0)
for controller, model in pairs(controllers) do
local x, y, z = controller:getPosition()
model:draw(x, y, z, 1, controller:getOrientation())
end
local padding = .1
local font = lovr.graphics.getFont()
local fade = .315 + .685 * math.abs(math.sin(lovr.timer.getTime() * 2))
local titlePosition = 1.3 - padding
local subtitlePosition = titlePosition - font:getHeight() * .25 - padding
lovr.graphics.plane(logo, 0, 1.8, -3, 1, 0, 0, 1)
lovr.graphics.setColor(.059, .059, .059)
lovr.graphics.print('LÖVR', -.01, titlePosition, -3, .25, 0, 0, 1, 0, nil, 'center', 'top')
lovr.graphics.setColor(.059, .059, .059, fade)
lovr.graphics.print('No game :(', -.01, subtitlePosition, -3, .15, 0, 0, 1, 0, nil, 'center', 'top')
end
function refreshControllers()
controllers = {}
if not lovr.headset then return end
for _, controller in pairs(lovr.headset.getControllers()) do
controllers[controller] = controller:newModel()
end
end
lovr.controlleradded = refreshControllers
lovr.controllerremoved = refreshControllers
end
local confOk, confError
if lovr.filesystem.isFile('conf.lua') then
confOk, confError = pcall(require, 'conf')
if lovr.conf then
confOk, confError = pcall(lovr.conf, conf)
end
2017-12-19 00:01:12 +00:00
end
lovr._setConf(conf)
lovr.filesystem.setIdentity(conf.identity)
2018-02-12 04:34:32 +00:00
local modules = { 'audio', 'data', 'event', 'graphics', 'headset', 'math', 'physics', 'thread', 'timer' }
2017-12-19 00:01:12 +00:00
for _, module in ipairs(modules) do
if conf.modules[module] then
lovr[module] = require('lovr.' .. module)
end
end
-- Error after window is created
if confError then
error(confError)
2017-12-19 00:01:12 +00:00
end
lovr.handlers = setmetatable({
quit = function() end,
focus = function(f)
if lovr.focus then lovr.focus(f) end
end,
2018-02-17 17:49:24 +00:00
threaderror = function(t, e)
if lovr.threaderror then lovr.threaderror(t, e) end
end,
2017-12-19 00:01:12 +00:00
controlleradded = function(c)
if lovr.controlleradded then lovr.controlleradded(c) end
end,
controllerremoved = function(c)
if lovr.controllerremoved then lovr.controllerremoved(c) end
end,
controllerpressed = function(c, b)
if lovr.controllerpressed then lovr.controllerpressed(c, b) end
end,
controllerreleased = function(c, b)
if lovr.controllerreleased then lovr.controllerreleased(c, b) end
end
}, {
__index = function(self, event)
error('Unknown event: ' .. tostring(event))
end
})
2018-01-09 02:33:51 +00:00
local function headsetRenderCallback(eye)
2017-12-19 00:01:12 +00:00
if lovr.headset.getOriginType() == 'head' then
applyHeadsetOffset()
end
2018-01-09 02:33:51 +00:00
lovr.draw(eye)
2017-12-19 00:01:12 +00:00
end
function lovr.step()
lovr.event.pump()
for name, a, b, c, d in lovr.event.poll() do
if name == 'quit' and (not lovr.quit or not lovr.quit()) then
return a
end
lovr.handlers[name](a, b, c, d)
end
local dt = lovr.timer.step()
if lovr.headset then
lovr.headset.update(dt)
end
if lovr.audio then
lovr.audio.update()
if lovr.headset and lovr.headset.isPresent() then
lovr.audio.setOrientation(lovr.headset.getOrientation())
lovr.audio.setPosition(lovr.headset.getPosition())
lovr.audio.setVelocity(lovr.headset.getVelocity())
end
end
if lovr.update then lovr.update(dt) end
if lovr.graphics then
lovr.graphics.clear()
lovr.graphics.origin()
if lovr.draw then
if lovr.headset and lovr.headset.isPresent() then
lovr.headset.renderTo(headsetRenderCallback)
else
applyHeadsetOffset()
lovr.draw()
end
end
lovr.graphics.present()
end
lovr.timer.sleep(.001)
end
function lovr.run()
lovr.timer.step()
2017-12-19 00:01:12 +00:00
if lovr.load then lovr.load() end
while true do
local exit = lovr.step()
if exit then return exit end
end
end
if lovr.filesystem.isFile('main.lua') then
require('main')
end