local shaderCode = {[[ /* VERTEX shader */ out vec4 fragmentView; vec4 lovrmain() { fragmentView = ClipFromLocal * VertexPosition; return fragmentView; } ]], [[ /* FRAGMENT shader */ in vec4 fragmentView; Constants { vec3 fogColor; }; vec4 lovrmain() { float fogAmount = atan(length(fragmentView) * 0.1) * 2.0 / PI; return vec4(mix(Color.rgb, fogColor, fogAmount), Color.a); }]]} local function grid(subdivisions) local size = 1 / math.floor(subdivisions or 1) local vertices = {} local indices = {} for y = -0.5, 0.5, size do for x = -0.5, 0.5, size do table.insert(vertices, {x, y, 0}) table.insert(vertices, {x, y + size, 0}) table.insert(vertices, {x + size, y, 0}) table.insert(vertices, {x + size, y + size, 0}) table.insert(indices, #vertices - 3) table.insert(indices, #vertices - 2) table.insert(indices, #vertices - 1) table.insert(indices, #vertices - 2) table.insert(indices, #vertices) table.insert(indices, #vertices - 1) end end return vertices, indices end function lovr.load() skyColor = {0.208, 0.208, 0.275} lovr.graphics.setBackgroundColor(skyColor) shader = lovr.graphics.newShader(unpack(shaderCode)) local vertices, indices = grid(100) local offset = lovr.math.noise(0, 0) -- ensure zero height at origin for vi = 1, #vertices do local x,y,z = unpack(vertices[vi]) z = (lovr.math.noise(x * 10, y * 10) - offset) / 20 vertices[vi][1], vertices[vi][2], vertices[vi][3] = x, y, z end mesh = lovr.graphics.newMesh({{ 'VertexPosition', 'vec3' }}, vertices) mesh:setIndices(indices) end function lovr.draw(pass) pass:setShader(shader) pass:send('fogColor', { lovr.math.gammaToLinear(unpack(skyColor)) }) pass:rotate(math.pi/2, 1, 0, 0) pass:scale(100) pass:setColor(0.565, 0.404, 0.463) pass:setDepthOffset(-10000) -- Ensure wireframe stays on top pass:draw(mesh) pass:setDepthOffset() pass:setWireframe(true) pass:setColor(0.388, 0.302, 0.412, 0.1) pass:draw(mesh) end