From 0e78d13146b50c19a4e528d8c3d8b9c9f79d5b34 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 12 Feb 2021 11:15:51 +0100 Subject: [PATCH] Add support for navmesh on spline collider --- Source/Engine/Navigation/NavMeshBuilder.cpp | 13 +++++++++++++ Source/Engine/Physics/Colliders/SplineCollider.cpp | 10 ++++++++++ Source/Engine/Physics/Colliders/SplineCollider.h | 11 +++++++++++ 3 files changed, 34 insertions(+) diff --git a/Source/Engine/Navigation/NavMeshBuilder.cpp b/Source/Engine/Navigation/NavMeshBuilder.cpp index fc0e9d51c..55319bb9e 100644 --- a/Source/Engine/Navigation/NavMeshBuilder.cpp +++ b/Source/Engine/Navigation/NavMeshBuilder.cpp @@ -16,6 +16,7 @@ #include "Engine/Physics/Colliders/SphereCollider.h" #include "Engine/Physics/Colliders/CapsuleCollider.h" #include "Engine/Physics/Colliders/MeshCollider.h" +#include "Engine/Physics/Colliders/SplineCollider.h" #include "Engine/Threading/ThreadPoolTask.h" #include "Engine/Terrain/TerrainPatch.h" #include "Engine/Terrain/Terrain.h" @@ -259,6 +260,18 @@ struct NavigationSceneRasterization e.RasterizeTriangles(); } + else if (const auto* splineCollider = dynamic_cast(actor)) + { + PROFILE_CPU_NAMED("SplineCollider"); + + auto collisionData = splineCollider->CollisionData.Get(); + if (!collisionData || collisionData->WaitForLoaded()) + return true; + + splineCollider->ExtractGeometry(vb, ib); + + e.RasterizeTriangles(); + } else if (const auto* terrain = dynamic_cast(actor)) { PROFILE_CPU_NAMED("Terrain"); diff --git a/Source/Engine/Physics/Colliders/SplineCollider.cpp b/Source/Engine/Physics/Colliders/SplineCollider.cpp index 6855eae69..947942fc8 100644 --- a/Source/Engine/Physics/Colliders/SplineCollider.cpp +++ b/Source/Engine/Physics/Colliders/SplineCollider.cpp @@ -35,6 +35,16 @@ void SplineCollider::SetPreRotation(const Quaternion& value) UpdateGeometry(); } +#if USE_EDITOR + +void SplineCollider::ExtractGeometry(Array& vertexBuffer, Array& indexBuffer) const +{ + vertexBuffer.Add(_vertexBuffer); + indexBuffer.Add(_indexBuffer); +} + +#endif + void SplineCollider::OnCollisionDataChanged() { // This should not be called during physics simulation, if it happened use write lock on physx scene diff --git a/Source/Engine/Physics/Colliders/SplineCollider.h b/Source/Engine/Physics/Colliders/SplineCollider.h index e7ca5a831..3bfcfacf1 100644 --- a/Source/Engine/Physics/Colliders/SplineCollider.h +++ b/Source/Engine/Physics/Colliders/SplineCollider.h @@ -42,6 +42,17 @@ public: /// API_PROPERTY() void SetPreRotation(const Quaternion& value); +#if USE_EDITOR + + /// + /// Extracts the collision data geometry into list of triangles. + /// + /// The output vertex buffer. + /// The output index buffer. + void ExtractGeometry(Array& vertexBuffer, Array& indexBuffer) const; + +#endif + private: void OnCollisionDataChanged();