main.lua 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. local shaderCode = {[[
  2. /* VERTEX shader */
  3. out vec4 fragmentView;
  4. vec4 lovrmain() {
  5. fragmentView = ClipFromLocal * VertexPosition;
  6. return fragmentView;
  7. } ]], [[
  8. /* FRAGMENT shader */
  9. in vec4 fragmentView;
  10. Constants {
  11. vec3 fogColor;
  12. };
  13. vec4 lovrmain() {
  14. float fogAmount = atan(length(fragmentView) * 0.1) * 2.0 / PI;
  15. return vec4(mix(Color.rgb, fogColor, fogAmount), Color.a);
  16. }]]}
  17. local function grid(subdivisions)
  18. local size = 1 / math.floor(subdivisions or 1)
  19. local vertices = {}
  20. local indices = {}
  21. for y = -0.5, 0.5, size do
  22. for x = -0.5, 0.5, size do
  23. table.insert(vertices, {x, y, 0})
  24. table.insert(vertices, {x, y + size, 0})
  25. table.insert(vertices, {x + size, y, 0})
  26. table.insert(vertices, {x + size, y + size, 0})
  27. table.insert(indices, #vertices - 3)
  28. table.insert(indices, #vertices - 2)
  29. table.insert(indices, #vertices - 1)
  30. table.insert(indices, #vertices - 2)
  31. table.insert(indices, #vertices)
  32. table.insert(indices, #vertices - 1)
  33. end
  34. end
  35. return vertices, indices
  36. end
  37. function lovr.load()
  38. skyColor = {0.208, 0.208, 0.275}
  39. lovr.graphics.setBackgroundColor(skyColor)
  40. shader = lovr.graphics.newShader(unpack(shaderCode))
  41. local vertices, indices = grid(100)
  42. local offset = lovr.math.noise(0, 0) -- ensure zero height at origin
  43. for vi = 1, #vertices do
  44. local x,y,z = unpack(vertices[vi])
  45. z = (lovr.math.noise(x * 10, y * 10) - offset) / 20
  46. vertices[vi][1], vertices[vi][2], vertices[vi][3] = x, y, z
  47. end
  48. mesh = lovr.graphics.newMesh({{ 'VertexPosition', 'vec3' }}, vertices)
  49. mesh:setIndices(indices)
  50. end
  51. function lovr.draw(pass)
  52. pass:setShader(shader)
  53. pass:send('fogColor', { lovr.math.gammaToLinear(unpack(skyColor)) })
  54. pass:rotate(math.pi/2, 1, 0, 0)
  55. pass:scale(100)
  56. pass:setColor(0.565, 0.404, 0.463)
  57. pass:setDepthOffset(-10000) -- Ensure wireframe stays on top
  58. pass:draw(mesh)
  59. pass:setDepthOffset()
  60. pass:setWireframe(true)
  61. pass:setColor(0.388, 0.302, 0.412, 0.1)
  62. pass:draw(mesh)
  63. end