Fix invalid navmesh build for triggers
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user