75 lines
2.1 KiB
Lua
75 lines
2.1 KiB
Lua
local api = ...
|
|
local modelRenderer
|
|
|
|
modelRenderer = {
|
|
|
|
-- lovr.draw => ecs.draw (render-logic thread)
|
|
init = function(api)
|
|
local ecs = api.ecs
|
|
api.world.shader = { pbr = false }
|
|
lovr.shader = lovr.shader or {}
|
|
lovr.shader['pbr'] = modelRenderer.initShaderPBR()
|
|
|
|
renderer = ecs.processingSystem()
|
|
renderer.filter = ecs.requireAll('model')
|
|
renderer.drawthread = true -- important
|
|
function renderer:process(obj, pass)
|
|
if obj.model ~= nil and obj.root ~= nil then
|
|
pass:setMaterial()
|
|
pass:setBlendMode()
|
|
pass:setFaceCull('none') -- supposed to be defined per-mesh in GLB
|
|
pass:setCullMode('none')
|
|
pass:setShader( lovr.shader.pbr )
|
|
if api.world.environmentMap ~= nil then
|
|
pass:send('cubemap', api.world.environmentMap)
|
|
end
|
|
if api.world.sphericalHarmonics ~= nil then
|
|
pass:send('sphericalHarmonics', api.world.sphericalHarmonics)
|
|
end
|
|
pass:draw(
|
|
obj['model'],
|
|
obj.x or 0,
|
|
obj.y or 0,
|
|
obj.z or 0,
|
|
obj.scale or 1,
|
|
0, 1, 0, 0, 1)
|
|
end
|
|
end
|
|
ecs.addSystem( api.world, renderer )
|
|
end,
|
|
|
|
initShaderPBR = function()
|
|
return lovr.graphics.newShader([[
|
|
vec4 lovrmain() {
|
|
return DefaultPosition;
|
|
}
|
|
]], [[
|
|
uniform textureCube cubemap;
|
|
uniform sphericalHarmonics { vec3 sh[9]; };
|
|
|
|
vec4 lovrmain() {
|
|
Surface surface;
|
|
initSurface(surface);
|
|
|
|
vec3 color = vec3(0);
|
|
vec3 lightDirection = vec3(-1, -1, -1);
|
|
vec4 lightColorAndBrightness = vec4(1, 1, 1, 3);
|
|
float visibility = 1.;
|
|
color += getLighting(surface, lightDirection, lightColorAndBrightness, visibility);
|
|
color += getIndirectLighting(surface, cubemap, sh);
|
|
|
|
return vec4(color, 1);
|
|
}
|
|
]], {
|
|
flags = {
|
|
glow = true,
|
|
normalMap = true,
|
|
vertexTangents = false, -- DamagedHelmet doesn't have vertex tangents
|
|
tonemap = true
|
|
}
|
|
})
|
|
end
|
|
|
|
}
|
|
|
|
return modelRenderer
|