function lovr.load() -- shadow shader shadowVertex = 'unlit' shadowFragment = [[ Constants { vec4 left; vec4 right; vec4 head; }; vec4 lovrmain() { vec4 shadowColor; if ( (length( left.xz - PositionWorld.xz) < left.w && left.y > PositionWorld.y) || (length(right.xz - PositionWorld.xz) < right.w && right.y > PositionWorld.y) || (length( head.xz - PositionWorld.xz) < head.w && head.y > PositionWorld.y) ) { shadowColor = vec4(.25, .625, 1, 1); } else { shadowColor = vec4(1, 1, 1, 1); } return shadowColor * Color * getPixel(ColorTexture, UV); } ]] shadowShader = lovr.graphics.newShader(shadowVertex, shadowFragment) -- grass texture grassTextureWidth = 256 grassImage = lovr.data.newImage(grassTextureWidth, grassTextureWidth) for x = 0, grassTextureWidth - 1 do for y = 0, grassTextureWidth - 1 do grassImage:setPixel(x, y, lovr.math.noise(x + .5, y + .5 + 0) / 2, lovr.math.noise(x + .5, y + .5 + 16) / 2 + .5, lovr.math.noise(x + .5, y + .5 + 32) / 2 ) end end grassTexture = lovr.graphics.newTexture(grassImage) -- boxes boxes = {} for i = 1, 5 do table.insert(boxes, { x = lovr.math.random() / 2, y = lovr.math.random() / 2 + .5, z = lovr.math.random() / 2, width = lovr.math.random() / 3, height = lovr.math.random() / 3, depth = lovr.math.random() / 3, r = lovr.math.random(), g = lovr.math.random(), b = lovr.math.random() }) end -- sky lovr.graphics.setBackgroundColor(0,.5,1) end function lovr.update() left = vec3(lovr.headset.getPosition('left')) right = vec3(lovr.headset.getPosition('right')) head = vec3(mat4(lovr.headset.getPose('head')):translate(0, -.1, -.1)) end function lovr.draw(pass) -- grass pass:setShader(shadowShader) pass:send('left', { left.x, left.y, left.z, .05}) -- x, y, z, radius pass:send('right', {right.x, right.y, right.z, .05}) pass:send('head', { head.x, head.y, head.z, .1 }) pass:setMaterial(grassTexture) pass:setSampler('nearest') pass:box(0, 0, 0, 10, 1, 10) pass:setMaterial() pass:setSampler() pass:setShader() -- boxes pass:setShader(shadowShader) pass:send('left', { left.x, left.y, left.z, .05}) -- x, y, z, radius pass:send('right', {right.x, right.y, right.z, .05}) pass:send('head', { head.x, head.y, head.z, .1 }) for _, box in pairs(boxes) do pass:setColor(box.r, box.g, box.b) pass:box(box.x, box.y, box.z, box.width, box.height, box.depth) end pass:setShader() -- hands pass:setColor(.9, .7, .1) pass:sphere(vec3(lovr.headset.getPosition('left')), .05) pass:sphere(vec3(lovr.headset.getPosition('right')), .05) end