Fix invalid navmesh build for triggers

This commit is contained in:
Wojtek Figat
2021-08-19 15:00:28 +02:00
parent d30e8c4c70
commit 9ed8621621

View File

@@ -47,6 +47,11 @@ int32 BoxTrianglesIndicesCache[] =
}; };
#define NAV_MESH_TILE_MAX_EXTENT 100000000 #define NAV_MESH_TILE_MAX_EXTENT 100000000
#define NAV_MESH_BUILD_DEBUG_DRAW_GEOMETRY 0
#if NAV_MESH_BUILD_DEBUG_DRAW_GEOMETRY
#include "Engine/Debug/DebugDraw.h"
#endif
struct OffMeshLink struct OffMeshLink
{ {
@@ -108,6 +113,9 @@ struct NavigationSceneRasterization
auto v0 = vb[ib[i0++]]; auto v0 = vb[ib[i0++]];
auto v1 = vb[ib[i0++]]; auto v1 = vb[ib[i0++]];
auto v2 = vb[ib[i0++]]; auto v2 = vb[ib[i0++]];
#if NAV_MESH_BUILD_DEBUG_DRAW_GEOMETRY
DEBUG_DRAW_TRIANGLE(v0, v1, v2, Color::Orange.AlphaMultiplied(0.3f), 1.0f, true);
#endif
auto n = Vector3::Cross(v0 - v1, v0 - v2); auto n = Vector3::Cross(v0 - v1, v0 - v2);
n.Normalize(); n.Normalize();
@@ -124,6 +132,9 @@ struct NavigationSceneRasterization
auto v0 = Vector3::Transform(vb[ib[i0++]], worldToNavMesh); auto v0 = Vector3::Transform(vb[ib[i0++]], worldToNavMesh);
auto v1 = Vector3::Transform(vb[ib[i0++]], worldToNavMesh); auto v1 = Vector3::Transform(vb[ib[i0++]], worldToNavMesh);
auto v2 = Vector3::Transform(vb[ib[i0++]], worldToNavMesh); auto v2 = Vector3::Transform(vb[ib[i0++]], worldToNavMesh);
#if NAV_MESH_BUILD_DEBUG_DRAW_GEOMETRY
DEBUG_DRAW_TRIANGLE(v0, v1, v2, Color::Orange.AlphaMultiplied(0.3f), 1.0f, true);
#endif
auto n = Vector3::Cross(v0 - v1, v0 - v2); auto n = Vector3::Cross(v0 - v1, v0 - v2);
n.Normalize(); n.Normalize();
@@ -223,6 +234,8 @@ struct NavigationSceneRasterization
// Extract data from the actor // Extract data from the actor
if (const auto* boxCollider = dynamic_cast<BoxCollider*>(actor)) if (const auto* boxCollider = dynamic_cast<BoxCollider*>(actor))
{ {
if (boxCollider->GetIsTrigger())
return true;
PROFILE_CPU_NAMED("BoxCollider"); PROFILE_CPU_NAMED("BoxCollider");
const OrientedBoundingBox box = boxCollider->GetOrientedBox(); const OrientedBoundingBox box = boxCollider->GetOrientedBox();
@@ -232,6 +245,8 @@ struct NavigationSceneRasterization
} }
else if (const auto* sphereCollider = dynamic_cast<SphereCollider*>(actor)) else if (const auto* sphereCollider = dynamic_cast<SphereCollider*>(actor))
{ {
if (sphereCollider->GetIsTrigger())
return true;
PROFILE_CPU_NAMED("SphereCollider"); PROFILE_CPU_NAMED("SphereCollider");
const BoundingSphere sphere = sphereCollider->GetSphere(); const BoundingSphere sphere = sphereCollider->GetSphere();
@@ -241,6 +256,8 @@ struct NavigationSceneRasterization
} }
else if (const auto* capsuleCollider = dynamic_cast<CapsuleCollider*>(actor)) else if (const auto* capsuleCollider = dynamic_cast<CapsuleCollider*>(actor))
{ {
if (capsuleCollider->GetIsTrigger())
return true;
PROFILE_CPU_NAMED("CapsuleCollider"); PROFILE_CPU_NAMED("CapsuleCollider");
const BoundingBox box = capsuleCollider->GetBox(); const BoundingBox box = capsuleCollider->GetBox();
@@ -250,6 +267,8 @@ struct NavigationSceneRasterization
} }
else if (const auto* meshCollider = dynamic_cast<MeshCollider*>(actor)) else if (const auto* meshCollider = dynamic_cast<MeshCollider*>(actor))
{ {
if (meshCollider->GetIsTrigger())
return true;
PROFILE_CPU_NAMED("MeshCollider"); PROFILE_CPU_NAMED("MeshCollider");
auto collisionData = meshCollider->CollisionData.Get(); auto collisionData = meshCollider->CollisionData.Get();
@@ -260,13 +279,15 @@ struct NavigationSceneRasterization
Matrix meshColliderToWorld; Matrix meshColliderToWorld;
meshCollider->GetLocalToWorldMatrix(meshColliderToWorld); meshCollider->GetLocalToWorldMatrix(meshColliderToWorld);
for(auto& v : vb) for (auto& v : vb)
Vector3::Transform(v, meshColliderToWorld, v); Vector3::Transform(v, meshColliderToWorld, v);
e.RasterizeTriangles(); e.RasterizeTriangles();
} }
else if (const auto* splineCollider = dynamic_cast<SplineCollider*>(actor)) else if (const auto* splineCollider = dynamic_cast<SplineCollider*>(actor))
{ {
if (splineCollider->GetIsTrigger())
return true;
PROFILE_CPU_NAMED("SplineCollider"); PROFILE_CPU_NAMED("SplineCollider");
auto collisionData = splineCollider->CollisionData.Get(); auto collisionData = splineCollider->CollisionData.Get();