raycast.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright (c) 2012-2014 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "raycast.h"
  6. #include "actor.h"
  7. #include "array.h"
  8. #include "string_utils.h"
  9. #include "PxRigidActor.h"
  10. using physx::PxRigidActor;
  11. namespace crown
  12. {
  13. Raycast::Raycast(PxScene* scene, CollisionMode::Enum mode, CollisionType::Enum type)
  14. : m_scene(scene)
  15. , m_buffer(m_hits, CE_MAX_RAY_INTERSECTIONS)
  16. , m_mode(mode)
  17. , m_type(type)
  18. {
  19. switch (m_type)
  20. {
  21. case CollisionType::BOTH: break;
  22. case CollisionType::STATIC: m_fd.flags = PxQueryFlag::eSTATIC; break;
  23. case CollisionType::DYNAMIC: m_fd.flags = PxQueryFlag::eDYNAMIC; break;
  24. }
  25. switch (m_mode)
  26. {
  27. case CollisionMode::CLOSEST: break;
  28. case CollisionMode::ANY: m_fd.flags |= PxQueryFlag::eANY_HIT; break;
  29. case CollisionMode::ALL: break;
  30. }
  31. }
  32. void Raycast::cast(const Vector3& from, const Vector3& dir, const float length, Array<RaycastHit>& hits)
  33. {
  34. m_scene->raycast(PxVec3(from.x, from.y, from.z), PxVec3(dir.x, dir.y, dir.z), length, m_buffer, PxHitFlags(PxHitFlag::eDEFAULT), m_fd);
  35. for (uint32_t i = 0; i < m_buffer.getNbAnyHits(); i++)
  36. {
  37. PxRaycastHit rh = m_buffer.getAnyHit(i);
  38. RaycastHit hit;
  39. hit.position.x = rh.position.x;
  40. hit.position.y = rh.position.y;
  41. hit.position.z = rh.position.z;
  42. hit.distance = rh.distance;
  43. hit.normal.x = rh.normal.x;
  44. hit.normal.y = rh.normal.y;
  45. hit.normal.z = rh.normal.z;
  46. hit.actor = (Actor*)(rh.actor->userData);
  47. array::push_back(hits, hit);
  48. }
  49. }
  50. CollisionMode::Enum Raycast::mode() const
  51. {
  52. return m_mode;
  53. }
  54. CollisionType::Enum Raycast::type() const
  55. {
  56. return m_type;
  57. }
  58. } // namespace crown