diff --git a/Source/Engine/Physics/Physics.cpp b/Source/Engine/Physics/Physics.cpp index 0a0178622..9c6879c79 100644 --- a/Source/Engine/Physics/Physics.cpp +++ b/Source/Engine/Physics/Physics.cpp @@ -218,6 +218,21 @@ void Physics::FlushRequests() PhysicsBackend::FlushRequests(); } +bool Physics::LineCast(const Vector3& start, const Vector3& end, uint32 layerMask, bool hitTriggers) +{ + return DefaultScene->LineCast(start, end, layerMask, hitTriggers); +} + +bool Physics::LineCast(const Vector3& start, const Vector3& end, API_PARAM(Out)RayCastHit& hitInfo, uint32 layerMask, bool hitTriggers) +{ + return DefaultScene->LineCast(start, end, hitInfo, layerMask, hitTriggers); +} + +bool Physics::LineCastAll(const Vector3& start, const Vector3& end, API_PARAM(Out)Array& results, uint32 layerMask, bool hitTriggers) +{ + return DefaultScene->LineCastAll(start, end, results, layerMask, hitTriggers); +} + bool Physics::RayCast(const Vector3& origin, const Vector3& direction, const float maxDistance, uint32 layerMask, bool hitTriggers) { return DefaultScene->RayCast(origin, direction, maxDistance, layerMask, hitTriggers); @@ -450,6 +465,27 @@ void PhysicsScene::CollectResults() _isDuringSimulation = false; } +bool PhysicsScene::LineCast(const Vector3& start, const Vector3& end, uint32 layerMask, bool hitTriggers) +{ + float distanceToEnd = Vector3::Distance(start, end); + Vector3 directionToEnd = (end - start).GetNormalized(); + return PhysicsBackend::RayCast(_scene, start, directionToEnd, distanceToEnd, layerMask, hitTriggers); +} + +bool PhysicsScene::LineCast(const Vector3& start, const Vector3& end, API_PARAM(Out)RayCastHit& hitInfo, uint32 layerMask, bool hitTriggers) +{ + float distanceToEnd = Vector3::Distance(start, end); + Vector3 directionToEnd = (end - start).GetNormalized(); + return PhysicsBackend::RayCast(_scene, start, directionToEnd, hitInfo, distanceToEnd, layerMask, hitTriggers); +} + +bool PhysicsScene::LineCastAll(const Vector3& start, const Vector3& end, API_PARAM(Out)Array& results, uint32 layerMask, bool hitTriggers) +{ + float distanceToEnd = Vector3::Distance(start, end); + Vector3 directionToEnd = (end - start).GetNormalized(); + return PhysicsBackend::RayCastAll(_scene, start, directionToEnd, results, distanceToEnd, layerMask, hitTriggers); +} + bool PhysicsScene::RayCast(const Vector3& origin, const Vector3& direction, const float maxDistance, uint32 layerMask, bool hitTriggers) { return PhysicsBackend::RayCast(_scene, origin, direction, maxDistance, layerMask, hitTriggers); diff --git a/Source/Engine/Physics/Physics.h b/Source/Engine/Physics/Physics.h index 62344e082..3e7bff8d9 100644 --- a/Source/Engine/Physics/Physics.h +++ b/Source/Engine/Physics/Physics.h @@ -95,6 +95,38 @@ public: API_FUNCTION() static void FlushRequests(); public: + /// + /// Performs a line between two points in the scene. + /// + /// The start position of the line. + /// The end position of the line. + /// The layer mask used to filter the results. + /// If set to true triggers will be hit, otherwise will skip them. + /// True if ray hits an matching object, otherwise false. + API_FUNCTION() static bool LineCast(const Vector3& start, const Vector3& end, uint32 layerMask = MAX_uint32, bool hitTriggers = true); + + /// + /// Performs a line between two points in the scene. + /// + /// The start position of the line. + /// The end position of the line. + /// The result hit information. Valid only when method returns true. + /// The layer mask used to filter the results. + /// If set to true triggers will be hit, otherwise will skip them. + /// True if ray hits an matching object, otherwise false. + API_FUNCTION() static bool LineCast(const Vector3& start, const Vector3& end, API_PARAM(Out) RayCastHit& hitInfo, uint32 layerMask = MAX_uint32, bool hitTriggers = true); + + // + /// Performs a line between two points in the scene, returns all hitpoints infos. + /// + /// The origin of the ray. + /// The normalized direction of the ray. + /// The result hits. Valid only when method returns true. + /// The layer mask used to filter the results. + /// If set to true triggers will be hit, otherwise will skip them. + /// True if ray hits an matching object, otherwise false. + API_FUNCTION() static bool LineCastAll(const Vector3& start, const Vector3& end, API_PARAM(Out) Array& results, uint32 layerMask = MAX_uint32, bool hitTriggers = true); + /// /// Performs a raycast against objects in the scene. /// diff --git a/Source/Engine/Physics/PhysicsScene.h b/Source/Engine/Physics/PhysicsScene.h index 6b5ab41ab..683261eb8 100644 --- a/Source/Engine/Physics/PhysicsScene.h +++ b/Source/Engine/Physics/PhysicsScene.h @@ -126,6 +126,39 @@ public: API_FUNCTION() void CollectResults(); public: + + /// + /// Performs a line between two points in the scene. + /// + /// The start position of the line. + /// The end position of the line. + /// The layer mask used to filter the results. + /// If set to true triggers will be hit, otherwise will skip them. + /// True if ray hits an matching object, otherwise false. + API_FUNCTION() bool LineCast(const Vector3& start, const Vector3& end, uint32 layerMask = MAX_uint32, bool hitOnTriggers = true); + + /// + /// Performs a line between two points in the scene. + /// + /// The start position of the line. + /// The end position of the line. + /// The result hit information. Valid only when method returns true. + /// The layer mask used to filter the results. + /// If set to true triggers will be hit, otherwise will skip them. + /// True if ray hits an matching object, otherwise false. + API_FUNCTION() bool LineCast(const Vector3& start, const Vector3& end, API_PARAM(Out) RayCastHit& hitInfo, uint32 layerMask = MAX_uint32, bool hitOnTriggers = true); + + // + /// Performs a line between two points in the scene, returns all hitpoints infos. + /// + /// The origin of the ray. + /// The normalized direction of the ray. + /// The result hits. Valid only when method returns true. + /// The layer mask used to filter the results. + /// If set to true triggers will be hit, otherwise will skip them. + /// True if ray hits an matching object, otherwise false. + API_FUNCTION() bool LineCastAll(const Vector3& start, const Vector3& end, API_PARAM(Out) Array& results, uint32 layerMask = MAX_uint32, bool hitTriggers = true); + /// /// Performs a raycast against objects in the scene. ///