-- Surround yourself with monkeys, efficiently
function lovr.load()
MONKEYS = 500
-- Create some random transforms
local transforms = {}
local random, randomNormal = lovr.math.random, lovr.math.randomNormal
for i = 1, MONKEYS do
local position = vec3(randomNormal(8), randomNormal(8), randomNormal(8))
local orientation = quat(random(2 * math.pi), random(), random(), random())
local scale = vec3(.75)
transforms[i] = mat4(position, scale, orientation)
end
-- Put them in a buffer
transformBuffer = lovr.graphics.newBuffer('mat4', transforms)
-- Make a shader that uses transforms from a buffer
shader = lovr.graphics.newShader([[
uniform Transforms {
mat4 transforms[500];
};
vec4 lovrmain() {
return Projection * View * transforms[InstanceIndex] * VertexPosition;
}
]], 'normal')
monkey = lovr.graphics.newModel('monkey.obj')
end
-- Draw many copies of the model with 1 draw, taking transforms from the buffer
function lovr.draw(pass)
pass:setBlendMode()
pass:setCullMode('back')
pass:setShader(shader)
pass:send('Transforms', transformBuffer)
pass:draw(monkey, mat4(), MONKEYS)
end