main.lua 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. -- Surround yourself with monkeys, efficiently
  2. function lovr.load()
  3. MONKEYS = 500
  4. -- Create some random transforms
  5. local transforms = {}
  6. local random, randomNormal = lovr.math.random, lovr.math.randomNormal
  7. for i = 1, MONKEYS do
  8. local position = vec3(randomNormal(8), randomNormal(8), randomNormal(8))
  9. local orientation = quat(random(2 * math.pi), random(), random(), random())
  10. local scale = vec3(.75)
  11. transforms[i] = mat4(position, scale, orientation)
  12. end
  13. transformBuffer = lovr.graphics.newBuffer(transforms, 'mat4')
  14. shader = lovr.graphics.newShader([[
  15. layout(set = 2, binding = 0) uniform Transforms {
  16. mat4 transforms[500];
  17. };
  18. vec4 lovrmain() {
  19. return Projection * View * transforms[InstanceIndex] * VertexPosition;
  20. }
  21. ]], [[
  22. vec4 lovrmain() {
  23. return vec4(Normal * .5 + .5, 1.);
  24. }
  25. ]])
  26. monkey = lovr.graphics.newModel('monkey.obj')
  27. end
  28. -- Draw many copies of the model with 1 draw, taking transforms from the buffer
  29. function lovr.draw(pass)
  30. pass:setBlendMode()
  31. pass:setCullMode('back')
  32. pass:setShader(shader)
  33. pass:send('Transforms', transformBuffer)
  34. pass:draw(monkey, mat4(), nil, nil, MONKEYS)
  35. end