Fix usage of embree with LWC for mesh distance fields and cards

#jira UE-117476
#rb Krzysztof.Narkowicz

[CL 16624221 by Ben Ingram in ue5-main branch]
This commit is contained in:
Ben Ingram
2021-06-10 11:46:03 -04:00
parent e343df34c0
commit b569c9be59
12 changed files with 36 additions and 35 deletions

View File

@@ -31,19 +31,19 @@ bool EmbreePointQueryFunction(RTCPointQueryFunctionArguments* args)
const int32 TriangleIndex = args->primID;
check(TriangleIndex < Context->NumTriangles);
const FVector* VertexBuffer = (const FVector*)rtcGetGeometryBufferData(Context->MeshGeometry, RTC_BUFFER_TYPE_VERTEX, 0);
const FVector3f* VertexBuffer = (const FVector3f*)rtcGetGeometryBufferData(Context->MeshGeometry, RTC_BUFFER_TYPE_VERTEX, 0);
const uint32* IndexBuffer = (const uint32*)rtcGetGeometryBufferData(Context->MeshGeometry, RTC_BUFFER_TYPE_INDEX, 0);
const uint32 I0 = IndexBuffer[TriangleIndex * 3 + 0];
const uint32 I1 = IndexBuffer[TriangleIndex * 3 + 1];
const uint32 I2 = IndexBuffer[TriangleIndex * 3 + 2];
const FVector V0 = VertexBuffer[I0];
const FVector V1 = VertexBuffer[I1];
const FVector V2 = VertexBuffer[I2];
const FVector3f V0 = VertexBuffer[I0];
const FVector3f V1 = VertexBuffer[I1];
const FVector3f V2 = VertexBuffer[I2];
const FVector QueryPosition(args->query->x, args->query->y, args->query->z);
const FVector ClosestPoint = FMath::ClosestPointOnTriangleToPoint(QueryPosition, V0, V1, V2);
const FVector3f QueryPosition(args->query->x, args->query->y, args->query->z);
const FVector3f ClosestPoint = FMath::ClosestPointOnTriangleToPoint(QueryPosition, V0, V1, V2);
const float QueryDistanceSq = (ClosestPoint - QueryPosition).SizeSquared();
if (QueryDistanceSq < ClosestDistanceSq)

View File

@@ -137,11 +137,11 @@ void MeshRepresentation::SetupEmbreeScene(
const uint32 I1 = SourceMeshData.TriangleIndices[TriangleIndex * 3 + 1];
const uint32 I2 = SourceMeshData.TriangleIndices[TriangleIndex * 3 + 2];
const FVector V0 = SourceMeshData.VertexPositions[I0];
const FVector V1 = SourceMeshData.VertexPositions[I1];
const FVector V2 = SourceMeshData.VertexPositions[I2];
const FVector3f V0 = SourceMeshData.VertexPositions[I0];
const FVector3f V1 = SourceMeshData.VertexPositions[I1];
const FVector3f V2 = SourceMeshData.VertexPositions[I2];
const FVector TriangleNormal = ((V1 - V2) ^ (V0 - V2));
const FVector3f TriangleNormal = ((V1 - V2) ^ (V0 - V2));
const bool bDegenerateTriangle = TriangleNormal.SizeSquared() < SMALL_NUMBER;
if (!bDegenerateTriangle)
{
@@ -158,11 +158,11 @@ void MeshRepresentation::SetupEmbreeScene(
const uint32 I1 = Indices[TriangleIndex * 3 + 1];
const uint32 I2 = Indices[TriangleIndex * 3 + 2];
const FVector V0 = LODModel.VertexBuffers.PositionVertexBuffer.VertexPosition(I0);
const FVector V1 = LODModel.VertexBuffers.PositionVertexBuffer.VertexPosition(I1);
const FVector V2 = LODModel.VertexBuffers.PositionVertexBuffer.VertexPosition(I2);
const FVector3f V0 = LODModel.VertexBuffers.PositionVertexBuffer.VertexPosition(I0);
const FVector3f V1 = LODModel.VertexBuffers.PositionVertexBuffer.VertexPosition(I1);
const FVector3f V2 = LODModel.VertexBuffers.PositionVertexBuffer.VertexPosition(I2);
const FVector TriangleNormal = ((V1 - V2) ^ (V0 - V2));
const FVector3f TriangleNormal = ((V1 - V2) ^ (V0 - V2));
const bool bDegenerateTriangle = TriangleNormal.SizeSquared() < SMALL_NUMBER;
if (!bDegenerateTriangle)
{
@@ -199,14 +199,14 @@ void MeshRepresentation::SetupEmbreeScene(
EmbreeScene.Geometry.IndexArray.Empty(NumFilteredIndices);
EmbreeScene.Geometry.IndexArray.AddUninitialized(NumFilteredIndices);
FVector* EmbreeVertices = EmbreeScene.Geometry.VertexArray.GetData();
FVector3f* EmbreeVertices = EmbreeScene.Geometry.VertexArray.GetData();
uint32* EmbreeIndices = EmbreeScene.Geometry.IndexArray.GetData();
EmbreeScene.Geometry.TriangleDescs.Empty(FilteredTriangles.Num());
for (int32 FilteredTriangleIndex = 0; FilteredTriangleIndex < FilteredTriangles.Num(); FilteredTriangleIndex++)
{
uint32 I0, I1, I2;
FVector V0, V1, V2;
FVector3f V0, V1, V2;
const int32 TriangleIndex = FilteredTriangles[FilteredTriangleIndex];
if (SourceMeshData.IsValid())
@@ -280,7 +280,7 @@ void MeshRepresentation::SetupEmbreeScene(
RTCGeometry Geometry = rtcNewGeometry(EmbreeScene.EmbreeDevice, RTC_GEOMETRY_TYPE_TRIANGLE);
EmbreeScene.Geometry.InternalGeometry = Geometry;
rtcSetSharedGeometryBuffer(Geometry, RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, EmbreeVertices, 0, sizeof(FVector), NumVertices);
rtcSetSharedGeometryBuffer(Geometry, RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, EmbreeVertices, 0, sizeof(FVector3f), NumVertices);
rtcSetSharedGeometryBuffer(Geometry, RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT3, EmbreeIndices, 0, sizeof(uint32) * 3, FilteredTriangles.Num());
rtcSetGeometryUserData(Geometry, &EmbreeScene.Geometry);

View File

@@ -67,7 +67,7 @@ struct FEmbreeTriangleDesc
struct FEmbreeGeometry
{
TArray<uint32> IndexArray;
TArray<FVector> VertexArray;
TArray<FVector3f> VertexArray;
TArray<FEmbreeTriangleDesc> TriangleDescs; // The material ID of each triangle.
RTCGeometry InternalGeometry;
};
@@ -101,9 +101,9 @@ struct FEmbreeRay : public RTCRayHit
hit.primID = RTC_INVALID_GEOMETRY_ID;
}
FVector GetHitNormal() const
FVector3f GetHitNormal() const
{
return FVector(-hit.Ng_x, -hit.Ng_y, -hit.Ng_z).GetSafeNormal();
return FVector3f(-hit.Ng_x, -hit.Ng_y, -hit.Ng_z).GetSafeNormal();
}
bool IsHitTwoSided() const