main.lua 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. local mirrorPose = lovr.math.newMat4(0, 1.65, -0.75)
  2. local mirrorSize = lovr.math.newVec3(0.6, 1.2, 1)
  3. local function draw_mirror(pass, outline)
  4. local pose = mat4(mirrorPose)
  5. pose:scale(mirrorSize)
  6. pass:plane(pose, outline and 'line' or 'fill')
  7. end
  8. local function draw_scene(pass)
  9. pass:setColor(0x203c56)
  10. pass:box(0, 0, 0, 4, 0.05, 4) -- floor
  11. pass:setColor(0x544e68)
  12. pass:box(0, 1, -0.5, 1, 0.1, 0.4) -- a table
  13. pass:setColor(0xffaa5e)
  14. pass:cylinder(0.2, 1.2, -0.4, .06,0.3, math.pi/2, 1,0,0, true, 0,2*math.pi, 8) -- a vase
  15. pass:setColor(0xffd4a3)
  16. pass:box(0.1, 1.1, -0.6, 0.12, 0.1, 0.12) -- a jewelry box
  17. local pose = mat4()
  18. pose:set(lovr.headset.getPose('head')):scale(0.09, 0.12, 0.11)
  19. pass:setColor(0x8d697a)
  20. pass:sphere(pose) -- head
  21. pass:setColor(0xd08159)
  22. pose:set(lovr.headset.getPose('head'))
  23. pose:translate(0, -0.02, -0.15)
  24. pose:rotate(-0.2, 1,0,0)
  25. pose:scale(0.015, 0.02, 0.03)
  26. pass:cylinder(pose) -- nose
  27. for _, handness in ipairs(lovr.headset.getHands()) do
  28. local skeleton = lovr.headset.getSkeleton(handness)
  29. if skeleton then
  30. for _, bone in ipairs(skeleton) do
  31. local x, y, z, _, angle, ax, ay, az = unpack(bone)
  32. pass:box(pose:set(x, y, z, angle, ax, ay, az):scale(0.017, 0.012, 0.019)) -- hand bone
  33. end
  34. else
  35. pose:set(lovr.headset.getPose(handness)):scale(0.03, 0.07, 0.09)
  36. pass:box(pose) -- palm
  37. end
  38. end
  39. end
  40. function lovr.load()
  41. lovr.graphics.setBackgroundColor(0x0d2b45)
  42. end
  43. function lovr.draw(pass)
  44. pass:setCullMode('back')
  45. draw_scene(pass)
  46. pass:setColor(0xffecd6)
  47. draw_mirror(pass, true) -- mirror frame
  48. pass:push()
  49. pass:setStencilWrite('replace', 1)
  50. pass:setColorWrite(false)
  51. pass:setDepthWrite(false)
  52. draw_mirror(pass)
  53. pass:setDepthWrite(true)
  54. pass:setColorWrite(true)
  55. pass:setStencilWrite()
  56. pass:setStencilTest('equal', 1)
  57. pass:transform(mirrorPose)
  58. pass:scale(1, 1, -1) -- after Z-flip all triangles will change their windings
  59. pass:transform(mat4(mirrorPose):invert())
  60. pass:setWinding('clockwise') -- invert the winding to account for the flip
  61. draw_scene(pass)
  62. pass:setWinding('counterclockwise')
  63. pass:setStencilTest()
  64. pass:pop()
  65. pass:setColor(0x000000, 0.3)
  66. draw_mirror(pass, false) -- glass tint
  67. end