123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- -- Surround yourself with monkeys, efficiently
- -- This version uses a Blob instead of a table
- local ffi = require 'ffi'
- function lovr.load()
- MONKEYS = 500
- -- Write some random transforms to the block
- local transformBlob = lovr.data.newBlob(4*16*MONKEYS, "transformBlob")
- local pointer = ffi.cast("float*",transformBlob:getPointer())
- 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)
- local transform = mat4(position, scale, orientation)
- local components = {transform:unpack(true)}
- for i2,v in ipairs(components) do
- pointer[(i-1)*16 + (i2-1)] = v
- end
- end
- -- Create a Buffer to store positions for lots of models
- buffer = lovr.graphics.newBuffer('mat4', transformBlob)
- shader = lovr.graphics.newShader([[
- uniform TransformBuffer { mat4 transforms[500]; };
- vec4 lovrmain() {
- return Projection * View * Transform * transforms[InstanceIndex] * VertexPosition;
- }
- ]], 'normal')
- model = lovr.graphics.newModel('monkey.obj')
- end
- -- Draw many copies of the model using instancing, with transforms from the buffer
- function lovr.draw(pass)
- pass:setShader(shader)
- pass:setCullMode('back')
- pass:setBlendMode(nil)
- pass:send('TransformBuffer', buffer)
- pass:draw(model, mat4(), MONKEYS)
- end
|