xurfer/xurfer/runtime/lovr/render/model.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