Skip to content
Snippets Groups Projects
Commit 54205187 authored by David Gilbert's avatar David Gilbert :bug:
Browse files

- Fixed a bug in TextureRegion calculation.

- Cleaned up Material a bit.
parent 83273c63
No related branches found
No related tags found
No related merge requests found
No preview for this file type
...@@ -4,8 +4,7 @@ ...@@ -4,8 +4,7 @@
#include "GPUInstancedLineComponent.h" #include "GPUInstancedLineComponent.h"
#include "InstancedMeshLineRendering.h" // Only needed for logging #include "InstancedMeshLineRendering.h" // Only needed for logging
#include "PropertyPathHelpers.h" //#pragma optimize("", off)
#pragma optimize("", off)
UGPUInstancedLineComponent::UGPUInstancedLineComponent(const FObjectInitializer& ObjectInitializer) UGPUInstancedLineComponent::UGPUInstancedLineComponent(const FObjectInitializer& ObjectInitializer)
...@@ -159,9 +158,11 @@ FUpdateTextureRegion2D* UGPUInstancedLineComponent::CalculateTextureRegions(cons ...@@ -159,9 +158,11 @@ FUpdateTextureRegion2D* UGPUInstancedLineComponent::CalculateTextureRegions(cons
(*Regions)[0].DestY = StartIndex.Y; (*Regions)[0].DestY = StartIndex.Y;
(*Regions)[0].SrcX = 0; //InitialTextureMarker.X; (*Regions)[0].SrcX = 0; //InitialTextureMarker.X;
(*Regions)[0].SrcY = 0; // InitialTextureMarker.Y; (*Regions)[0].SrcY = 0; // InitialTextureMarker.Y;
(*Regions)[0].Width = FMath::Min(NumberOfPoints, TextureWidth); (*Regions)[0].Width = FMath::Min(NumberOfPoints, TextureWidth - static_cast<int32>((*Regions)[0].DestX));
(*Regions)[0].Height = StartIndex.X == 0 ? (NumberOfPoints / TextureWidth) : 1; (*Regions)[0].Height = StartIndex.X == 0 ? (NumberOfPoints / TextureWidth) : 1;
checkf((*Regions)[0].DestX + (*Regions)[0].Width <= (uint32)TextureWidth, TEXT("Region[0] out of bounds on X. Texture: %i, %i, %i"), (*Regions)[0].DestX, (*Regions)[0].Width, PositionTexture->GetSizeX());
RemainingPoints -= (*Regions)[0].Height == 1 ? (*Regions)[0].Width : (*Regions)[0].Width * (*Regions)[0].Height; RemainingPoints -= (*Regions)[0].Height == 1 ? (*Regions)[0].Width : (*Regions)[0].Width * (*Regions)[0].Height;
if(RemainingPoints == 0) if(RemainingPoints == 0)
{ {
...@@ -174,14 +175,17 @@ FUpdateTextureRegion2D* UGPUInstancedLineComponent::CalculateTextureRegions(cons ...@@ -174,14 +175,17 @@ FUpdateTextureRegion2D* UGPUInstancedLineComponent::CalculateTextureRegions(cons
(*Regions)[1].DestY = (*Regions)[0].DestY + (*Regions)[0].Height; (*Regions)[1].DestY = (*Regions)[0].DestY + (*Regions)[0].Height;
(*Regions)[1].SrcX = NumberOfPoints - RemainingPoints; // InitialTextureMarker.Y; (*Regions)[1].SrcX = NumberOfPoints - RemainingPoints; // InitialTextureMarker.Y;
(*Regions)[1].SrcY = 0; //InitialTextureMarker.X; (*Regions)[1].SrcY = 0; //InitialTextureMarker.X;
(*Regions)[1].Width = FMath::Min(RemainingPoints, TextureWidth); (*Regions)[1].Width = FMath::Min(RemainingPoints,TextureWidth - static_cast<int32>((*Regions)[1].DestX));
RemainingPoints -= (*Regions)[1].Width; RemainingPoints -= (*Regions)[1].Width;
(*Regions)[1].Height = RemainingPoints == 0 ? 1 : (RemainingPoints / TextureWidth); (*Regions)[1].Height = RemainingPoints == 0 ? 1 : (RemainingPoints / TextureWidth);
RemainingPoints -= (*Regions)[1].Width * ((*Regions)[1].Height - 1); RemainingPoints -= (*Regions)[1].Width * ((*Regions)[1].Height - 1);
checkf((*Regions)[1].DestX + (*Regions)[1].Width <= (uint32)TextureWidth, TEXT("Region[1] out of bounds on X. Texture: %i, %i, %i"), (*Regions)[1].DestX, (*Regions)[1].Width, PositionTexture->GetSizeX());
if (RemainingPoints == 0) if (RemainingPoints == 0)
{ {
NumberOfRegionsOut = 2; NumberOfRegionsOut = 2;
return Regions->GetData(); return Regions->GetData();
} }
else if (RemainingPoints >= TextureWidth) else if (RemainingPoints >= TextureWidth)
...@@ -192,11 +196,14 @@ FUpdateTextureRegion2D* UGPUInstancedLineComponent::CalculateTextureRegions(cons ...@@ -192,11 +196,14 @@ FUpdateTextureRegion2D* UGPUInstancedLineComponent::CalculateTextureRegions(cons
(*Regions)[2].DestY = (*Regions)[1].DestY + (*Regions)[1].Height; (*Regions)[2].DestY = (*Regions)[1].DestY + (*Regions)[1].Height;
(*Regions)[2].SrcX = NumberOfPoints - RemainingPoints; // InitialTextureMarker.Y; (*Regions)[2].SrcX = NumberOfPoints - RemainingPoints; // InitialTextureMarker.Y;
(*Regions)[2].SrcY = 0; (*Regions)[2].SrcY = 0;
(*Regions)[2].Width = FMath::Min(RemainingPoints, TextureWidth); (*Regions)[2].Width = FMath::Min(RemainingPoints, TextureWidth - static_cast<int32>((*Regions)[2].DestX));
RemainingPoints -= (*Regions)[2].Width; RemainingPoints -= (*Regions)[2].Width;
(*Regions)[2].Height = RemainingPoints == 0 ? 1 : (RemainingPoints / TextureWidth); (*Regions)[2].Height = RemainingPoints == 0 ? 1 : (RemainingPoints / TextureWidth);
RemainingPoints -= (*Regions)[2].Width * ((*Regions)[1].Height - 1); RemainingPoints -= (*Regions)[2].Width * ((*Regions)[1].Height - 1);
checkf((*Regions)[2].DestX + (*Regions)[2].Width <= (uint32)TextureWidth, TEXT("Region[2] out of bounds on X. Texture: %i, %i, %i"), (*Regions)[2].DestX, (*Regions)[2].Width, PositionTexture->GetSizeX());
if (RemainingPoints > 0) if (RemainingPoints > 0)
UE_LOG(LogLineRendering, Fatal, TEXT("UGPUInstancedLineComponent::CalculateTextureRegions : Calculation went wrong on third region, fix code!")); UE_LOG(LogLineRendering, Fatal, TEXT("UGPUInstancedLineComponent::CalculateTextureRegions : Calculation went wrong on third region, fix code!"));
...@@ -523,7 +530,7 @@ void UGPUInstancedLineComponent::InitializeLinesInBulk(int32 NumberOfLines, int3 ...@@ -523,7 +530,7 @@ void UGPUInstancedLineComponent::InitializeLinesInBulk(int32 NumberOfLines, int3
} }
LinearLineData = MoveTemp(Points); LinearLineData = MoveTemp(Points);
UpdateWholeTexture();
// Add the number of instances - sadly this requires the for loop // Add the number of instances - sadly this requires the for loop
...@@ -557,6 +564,9 @@ void UGPUInstancedLineComponent::InitializeLinesInBulk(int32 NumberOfLines, int3 ...@@ -557,6 +564,9 @@ void UGPUInstancedLineComponent::InitializeLinesInBulk(int32 NumberOfLines, int3
CurrentTextureIndex++; CurrentTextureIndex++;
NextFreeId++; NextFreeId++;
} }
UpdateWholeTexture();
} }
...@@ -620,6 +630,9 @@ int32 UGPUInstancedLineComponent::AddLine(const TArray<FVector>& Line, FLinearCo ...@@ -620,6 +630,9 @@ int32 UGPUInstancedLineComponent::AddLine(const TArray<FVector>& Line, FLinearCo
delete InRegions; delete InRegions;
}); });
//UE_LOG(LogLineRendering, Display, TEXT("Added Line #%d"), LineId); // Actually we can!
return LineId; return LineId;
} }
...@@ -1464,4 +1477,4 @@ bool UGPUInstancedLineComponent::SetSegmentWidth(int32 LineId, int32 SegmentId, ...@@ -1464,4 +1477,4 @@ bool UGPUInstancedLineComponent::SetSegmentWidth(int32 LineId, int32 SegmentId,
SetCustomDataValue(InstanceId, 3, Width, false); SetCustomDataValue(InstanceId, 3, Width, false);
return true; return true;
} }
#pragma optimize("", on) //#pragma optimize("", on)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment