main.lua 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. -- Surround yourself with monkeys, efficiently
  2. -- This version uses a Blob instead of a table
  3. local ffi = require 'ffi'
  4. function lovr.load()
  5. MONKEYS = 500
  6. -- Write some random transforms to the block
  7. local transformBlob = lovr.data.newBlob(4*16*MONKEYS, "transformBlob")
  8. local pointer = ffi.cast("float*",transformBlob:getPointer())
  9. local random, randomNormal = lovr.math.random, lovr.math.randomNormal
  10. for i = 1, MONKEYS do
  11. local position = vec3(randomNormal(8), randomNormal(8), randomNormal(8))
  12. local orientation = quat(random(2 * math.pi), random(), random(), random())
  13. local scale = vec3(.75)
  14. local transform = mat4(position, scale, orientation)
  15. local components = {transform:unpack(true)}
  16. for i2,v in ipairs(components) do
  17. pointer[(i-1)*16 + (i2-1)] = v
  18. end
  19. end
  20. -- Create a Buffer to store positions for lots of models
  21. buffer = lovr.graphics.newBuffer('mat4', transformBlob)
  22. shader = lovr.graphics.newShader([[
  23. uniform TransformBuffer { mat4 transforms[500]; };
  24. vec4 lovrmain() {
  25. return Projection * View * Transform * transforms[InstanceIndex] * VertexPosition;
  26. }
  27. ]], 'normal')
  28. model = lovr.graphics.newModel('monkey.obj')
  29. end
  30. -- Draw many copies of the model using instancing, with transforms from the buffer
  31. function lovr.draw(pass)
  32. pass:setShader(shader)
  33. pass:setCullMode('back')
  34. pass:setBlendMode(nil)
  35. pass:send('TransformBuffer', buffer)
  36. pass:draw(model, mat4(), MONKEYS)
  37. end