main.lua 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. function lovr.load()
  2. -- shadow shader
  3. shadowVertex = 'unlit'
  4. shadowFragment = [[
  5. Constants {
  6. vec4 left;
  7. vec4 right;
  8. vec4 head;
  9. };
  10. vec4 lovrmain() {
  11. vec4 shadowColor;
  12. if (
  13. (length( left.xz - PositionWorld.xz) < left.w && left.y > PositionWorld.y) ||
  14. (length(right.xz - PositionWorld.xz) < right.w && right.y > PositionWorld.y) ||
  15. (length( head.xz - PositionWorld.xz) < head.w && head.y > PositionWorld.y)
  16. ) {
  17. shadowColor = vec4(.25, .625, 1, 1);
  18. } else {
  19. shadowColor = vec4(1, 1, 1, 1);
  20. }
  21. return shadowColor * Color * getPixel(ColorTexture, UV);
  22. }
  23. ]]
  24. shadowShader = lovr.graphics.newShader(shadowVertex, shadowFragment)
  25. -- grass texture
  26. grassTextureWidth = 256
  27. grassImage = lovr.data.newImage(grassTextureWidth, grassTextureWidth)
  28. for x = 0, grassTextureWidth - 1 do
  29. for y = 0, grassTextureWidth - 1 do
  30. grassImage:setPixel(x, y,
  31. lovr.math.noise(x + .5, y + .5 + 0) / 2,
  32. lovr.math.noise(x + .5, y + .5 + 16) / 2 + .5,
  33. lovr.math.noise(x + .5, y + .5 + 32) / 2
  34. )
  35. end
  36. end
  37. grassTexture = lovr.graphics.newTexture(grassImage)
  38. -- boxes
  39. boxes = {}
  40. for i = 1, 5 do
  41. table.insert(boxes, {
  42. x = lovr.math.random() / 2,
  43. y = lovr.math.random() / 2 + .5,
  44. z = lovr.math.random() / 2,
  45. width = lovr.math.random() / 3,
  46. height = lovr.math.random() / 3,
  47. depth = lovr.math.random() / 3,
  48. r = lovr.math.random(),
  49. g = lovr.math.random(),
  50. b = lovr.math.random()
  51. })
  52. end
  53. -- sky
  54. lovr.graphics.setBackgroundColor(0,.5,1)
  55. end
  56. function lovr.update()
  57. left = vector(lovr.headset.getPosition('left'))
  58. right = vector(lovr.headset.getPosition('right'))
  59. local rotation = quaternion(lovr.headset.getOrientation('head'))
  60. head = vector(lovr.headset.getPose('head')) + vector(0, -.1, -.1):rotate(rotation)
  61. end
  62. function lovr.draw(pass)
  63. -- grass
  64. pass:setShader(shadowShader)
  65. pass:send('left', { left.x, left.y, left.z, .05}) -- x, y, z, radius
  66. pass:send('right', {right.x, right.y, right.z, .05})
  67. pass:send('head', { head.x, head.y, head.z, .1 })
  68. pass:setMaterial(grassTexture)
  69. pass:setSampler('nearest')
  70. pass:box(0, 0, 0, 10, 1, 10)
  71. pass:setMaterial()
  72. pass:setSampler()
  73. pass:setShader()
  74. -- boxes
  75. pass:setShader(shadowShader)
  76. pass:send('left', { left.x, left.y, left.z, .05}) -- x, y, z, radius
  77. pass:send('right', {right.x, right.y, right.z, .05})
  78. pass:send('head', { head.x, head.y, head.z, .1 })
  79. for _, box in pairs(boxes) do
  80. pass:setColor(box.r, box.g, box.b)
  81. pass:box(box.x, box.y, box.z, box.width, box.height, box.depth)
  82. end
  83. pass:setShader()
  84. -- hands
  85. pass:setColor(.9, .7, .1)
  86. pass:sphere(vector(lovr.headset.getPosition('left')), .05)
  87. pass:sphere(vector(lovr.headset.getPosition('right')), .05)
  88. end