main.lua 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. local function grid(size, subdivisions)
  2. local vertices = {}
  3. local indices = {}
  4. local step = size / (subdivisions - 1)
  5. for z = -size / 2, size / 2, step do
  6. for x = -size / 2, size / 2, step do
  7. table.insert(vertices, {x, 0, z})
  8. table.insert(vertices, {x, 0, z + step})
  9. table.insert(vertices, {x + step, 0, z})
  10. table.insert(vertices, {x, 0, z + step})
  11. table.insert(vertices, {x + step, 0, z + step})
  12. table.insert(vertices, {x + step, 0, z})
  13. end
  14. end
  15. return vertices
  16. end
  17. local function terrain_fn(x, z)
  18. return 4 * (lovr.math.noise(x * 0.05, z * 0.05) - 0.5)
  19. end
  20. function lovr.load()
  21. size = 50
  22. world = lovr.physics.newWorld(0, -9.81, 0, false)
  23. lovr.graphics.setBackgroundColor(0.208, 0.208, 0.275)
  24. local vertices, indices = grid(size, 100)
  25. for vi = 1, #vertices do
  26. local x,y,z = unpack(vertices[vi])
  27. vertices[vi][2] = terrain_fn(x, z) -- elevate grid to terrain height
  28. end
  29. mesh = lovr.graphics.newMesh(vertices)
  30. world:newTerrainCollider(size, terrain_fn) -- use callback to define elevations
  31. box_colliders = {}
  32. end
  33. function lovr.update(dt)
  34. if lovr.timer.getTime() % 1 < dt then -- spawn new box each second
  35. local collider = world:newBoxCollider(
  36. lovr.math.randomNormal(size / 10, 0),
  37. lovr.math.randomNormal(1, 20),
  38. lovr.math.randomNormal(size / 10, 0),
  39. 1)
  40. table.insert(box_colliders, collider)
  41. end
  42. world:update(dt)
  43. end
  44. function lovr.draw(pass)
  45. pass:setColor(0.925, 0.745, 0.137)
  46. for _, collider in ipairs(box_colliders) do
  47. pass:box(mat4(collider:getPose()))
  48. end
  49. pass:setColor(0.565, 0.404, 0.463)
  50. pass:draw(mesh)
  51. pass:setWireframe(true)
  52. pass:setColor(0.388, 0.302, 0.412, 0.1)
  53. pass:draw(mesh)
  54. end