main.lua 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. -- Surround yourself with monkeys, efficiently
  2. function lovr.load()
  3. MONKEYS = 500
  4. -- Create a ShaderBlock to store positions for lots of models
  5. block = lovr.graphics.newShaderBlock('uniform', {
  6. modelTransforms = { 'mat4', MONKEYS }
  7. }, { usage = 'static' })
  8. -- Write some random transforms to the block
  9. local transforms = {}
  10. local random, randomNormal = lovr.math.random, lovr.math.randomNormal
  11. for i = 1, MONKEYS do
  12. local position = vec3(randomNormal(8), randomNormal(8), randomNormal(8))
  13. local orientation = quat(random(2 * math.pi), random(), random(), random())
  14. local scale = vec3(.75)
  15. transforms[i] = mat4(position, scale, orientation)
  16. end
  17. block:send('modelTransforms', transforms)
  18. -- Create the shader, injecting the shader code for the block
  19. shader = lovr.graphics.newShader(
  20. block:getShaderCode('ModelBlock') .. [[
  21. out vec3 vNormal;
  22. vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
  23. vNormal = lovrNormal;
  24. return projection * transform * modelTransforms[lovrInstanceID] * vertex;
  25. }
  26. ]], [[
  27. in vec3 vNormal;
  28. vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {
  29. return vec4(vNormal * .5 + .5, 1.);
  30. }
  31. ]])
  32. -- Bind the block to the shader
  33. shader:sendBlock('ModelBlock', block)
  34. model = lovr.graphics.newModel('monkey.obj')
  35. lovr.graphics.setCullingEnabled(true)
  36. lovr.graphics.setBlendMode(nil)
  37. end
  38. -- Draw many copies of the model using instancing, with transforms from the shader block
  39. function lovr.draw()
  40. lovr.graphics.setShader(shader)
  41. model:draw(mat4(), MONKEYS)
  42. lovr.graphics.setShader()
  43. end