main.lua 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. local random = lovr.math.random
  2. local boxes = {}
  3. local selectedBox = nil
  4. local hitpoint = lovr.math.newVec3()
  5. local red = { 1, .5, .5 }
  6. local green = { .5, 1, .5 }
  7. function lovr.load()
  8. lovr.graphics.setBackgroundColor(.2, .2, .22)
  9. world = lovr.physics.newWorld(0, 0, 0)
  10. -- Make a bunch of random spinning boxes XD
  11. for x = -3, 3 do
  12. for z = 1, 10 do
  13. local y = .5 + lovr.math.randomNormal(.1)
  14. local box = world:newBoxCollider(x, y, -z, .28)
  15. box:setOrientation(random(2 * math.pi), random(), random(), random())
  16. box:setAngularVelocity(random(), random(), random())
  17. table.insert(boxes, box)
  18. end
  19. end
  20. end
  21. function lovr.update(dt)
  22. selectedBox = nil
  23. world:update(dt)
  24. local ox, oy, oz = lovr.headset.getPosition('hand/left/point')
  25. local dx, dy, dz = quat(lovr.headset.getOrientation('hand/left/point')):direction():mul(50):unpack()
  26. local collider, shape, x, y, z = world:raycast(ox, oy, oz, ox + dx, oy + dy, oz + dz)
  27. if collider then
  28. selectedBox = collider
  29. hitpoint:set(x, y, z)
  30. end
  31. end
  32. function lovr.draw(pass)
  33. -- Boxes
  34. for i, box in ipairs(boxes) do
  35. pass:setColor(box == selectedBox and green or red)
  36. pass:cube(vec3(box:getPosition()), .28, quat(box:getOrientation()))
  37. end
  38. -- Dot
  39. if selectedBox then
  40. pass:setColor(0, 0, 1)
  41. pass:sphere(hitpoint, .01)
  42. end
  43. -- Laser pointer
  44. local hand = vec3(lovr.headset.getPosition('hand/left/point'))
  45. local direction = quat(lovr.headset.getOrientation('hand/left/point')):direction()
  46. pass:setColor(1, 1, 1)
  47. pass:line(hand, selectedBox and hitpoint or (hand + direction * 50))
  48. end