main.lua 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 = vec3(lovr.headset.getPosition('left'))
  58. right = vec3(lovr.headset.getPosition('right'))
  59. head = vec3(mat4(lovr.headset.getPose('head')):translate(0, -.1, -.1))
  60. end
  61. function lovr.draw(pass)
  62. -- grass
  63. pass:setShader(shadowShader)
  64. pass:send('left', { left.x, left.y, left.z, .05}) -- x, y, z, radius
  65. pass:send('right', {right.x, right.y, right.z, .05})
  66. pass:send('head', { head.x, head.y, head.z, .1 })
  67. pass:setMaterial(grassTexture)
  68. pass:setSampler('nearest')
  69. pass:box(0, 0, 0, 10, 1, 10)
  70. pass:setMaterial()
  71. pass:setSampler()
  72. pass:setShader()
  73. -- boxes
  74. pass:setShader(shadowShader)
  75. pass:send('left', { left.x, left.y, left.z, .05}) -- x, y, z, radius
  76. pass:send('right', {right.x, right.y, right.z, .05})
  77. pass:send('head', { head.x, head.y, head.z, .1 })
  78. for _, box in pairs(boxes) do
  79. pass:setColor(box.r, box.g, box.b)
  80. pass:box(box.x, box.y, box.z, box.width, box.height, box.depth)
  81. end
  82. pass:setShader()
  83. -- hands
  84. pass:setColor(.9, .7, .1)
  85. pass:sphere(vec3(lovr.headset.getPosition('left')), .05)
  86. pass:sphere(vec3(lovr.headset.getPosition('right')), .05)
  87. end