From 91ffe58622e1c75c377f93d20a96c66cf0f9093a Mon Sep 17 00:00:00 2001 From: David Gilbert <david.gilbert@rwth-aachen.de> Date: Wed, 7 Oct 2020 13:55:54 +0200 Subject: [PATCH] Started cleaning up more duplicated code and unneeded functions --- .../Private/GPUInstancedLineComponent.cpp | 128 ++++-------------- .../Public/GPUInstancedLineComponent.h | 2 + 2 files changed, 31 insertions(+), 99 deletions(-) diff --git a/Source/InstancedMeshLineRendering/Private/GPUInstancedLineComponent.cpp b/Source/InstancedMeshLineRendering/Private/GPUInstancedLineComponent.cpp index 291a0c2..2643ded 100644 --- a/Source/InstancedMeshLineRendering/Private/GPUInstancedLineComponent.cpp +++ b/Source/InstancedMeshLineRendering/Private/GPUInstancedLineComponent.cpp @@ -104,6 +104,21 @@ int32 UGPUInstancedLineComponent::AddNewSegmentInstance(const FLinearColor& Colo return InstanceId; } +void UGPUInstancedLineComponent::UpdateTexture(const FIntPoint& StartIndex, int32 NumberOfPoints, uint8* SrcData) +{ + int32 NumRegions = 0; + FUpdateTextureRegion2D* Regions = CalculateTextureRegions(StartIndex, NumberOfPoints, NumRegions); + + const uint32 Pitch = TextureWidth; + PositionTexture->UpdateTextureRegions(0, NumRegions, Regions, Pitch * sizeof(FVector4), sizeof(FVector4), SrcData, + [](auto InTextureData, auto InRegions) + { + // Clean up the copied data + delete InTextureData; + delete InRegions; + }); +} + void UGPUInstancedLineComponent::Init() { if (PositionTexture == nullptr) @@ -630,20 +645,7 @@ int32 UGPUInstancedLineComponent::AddLine(const TArray<FVector>& Line, FLinearCo // Store the points in a linear array here LinearLineData.Append(*TextureData); - int32 NumRegions = 0; - FUpdateTextureRegion2D* Regions = CalculateTextureRegions(InitialTextureMarker, Line.Num(), NumRegions); - - const uint32 Pitch = TextureWidth; - PositionTexture->UpdateTextureRegions(0, NumRegions, Regions, Pitch * sizeof(FVector4), sizeof(FVector4), (uint8*)TextureData->GetData(), - [](auto InTextureData, auto InRegions) - { - // Clean up the copied data - delete InTextureData; - delete InRegions; - }); - - //UE_LOG(LogLineRendering, Display, TEXT("Added Line #%d"), LineId); // Actually we can! - + UpdateTexture(InitialTextureMarker, Line.Num(), (uint8*)TextureData->GetData()); return LineId; } @@ -687,21 +689,7 @@ int32 UGPUInstancedLineComponent::AddLine(TArray<FVector4>& Line, FLinearColor C // Store the points in a linear array here LinearLineData.Append(*TextureData); - int32 NumRegions = 0; - FUpdateTextureRegion2D* Regions = CalculateTextureRegions(InitialTextureMarker, TextureData->Num(), NumRegions); - - const uint32 Pitch = TextureWidth; - PositionTexture->UpdateTextureRegions(0, NumRegions, Regions, Pitch * sizeof(FVector4), sizeof(FVector4), (uint8*)TextureData->GetData(), - [](auto InTextureData, auto InRegions) - { - // Clean up the copied data - delete InTextureData; - delete InRegions; - }); - - //UE_LOG(LogLineRendering, Display, TEXT("Added Line #%d"), LineId); // Actually we can! - - + UpdateTexture(InitialTextureMarker, Line.Num(), (uint8*)TextureData->GetData()); return LineId; @@ -960,19 +948,8 @@ bool UGPUInstancedLineComponent::AddPoints(int32 LineId, const TArray<FVector>& // Recreate the data on the heap to allow asynchronous texture update. TArray<FVector4>* TextureData = new TArray<FVector4>(Points); - int32 NumberOfRegions = 0; - FUpdateTextureRegion2D* Regions = CalculateTextureRegions(InitialTextureMarker, Points.Num(), NumberOfRegions); - - // Update the actual texture on the gpu - const uint32 Pitch = TextureWidth; - PositionTexture->UpdateTextureRegions(0, NumberOfRegions, Regions, Pitch * sizeof(FVector4), sizeof(FVector4), (uint8*)TextureData->GetData(), - [](auto InTextureData, auto InRegions) - { - // Clean up the copied data - delete InTextureData; - delete InRegions; - }); - + + UpdateTexture(InitialTextureMarker, Points.Num(), (uint8*)TextureData->GetData()); MarkRenderStateDirty(); return true; @@ -1117,15 +1094,7 @@ bool UGPUInstancedLineComponent::UpdateLine(int32 LineId, TArray<FVector>& Point FMemory::Memcpy(LinearLineData.GetData() + TextureIndex, TextureData->GetData(), TextureData->Num() * sizeof(FVector4)); - int32 NumberOfRegions = 0; - const FUpdateTextureRegion2D* Regions = CalculateTextureRegions(StartIndex, TextureData->Num(), NumberOfRegions); - - PositionTexture->UpdateTextureRegions(0, NumberOfRegions, Regions, TextureWidth * sizeof(FVector4), sizeof(FVector4), (uint8*)TextureData->GetData(), - [](auto InTextureData, auto InRegions) - { - delete InTextureData; - delete InRegions; - }); + UpdateTexture(StartIndex, TextureData->Num(), (uint8*)TextureData->GetData()); return true; } @@ -1149,19 +1118,8 @@ bool UGPUInstancedLineComponent::UpdateLinesDataDirectly(int32 LineIdStart, TArr TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("UGPUInstancedLineComponent::UpdateLines - MoveTemp Texture Data")) TextureData = new TArray<FVector4>(MoveTemp(Points)); } - int32 NumberOfRegions = 0; - FUpdateTextureRegion2D* Regions; - { - TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("UGPUInstancedLineComponent::UpdateLines - Calculate Texture Regions")) - Regions = CalculateTextureRegions(FIntPoint(X, Y), TextureData->Num(), NumberOfRegions); - } - PositionTexture->UpdateTextureRegions(0, NumberOfRegions, Regions, TextureWidth * sizeof(FVector4), sizeof(FVector4), (uint8*)TextureData->GetData(), - [](auto InTextureData, auto InRegions) - { - delete InTextureData; - delete InRegions; - }); - + + UpdateTexture(FIntPoint(X, Y), TextureData->Num(), (uint8*)TextureData->GetData()); return true; } @@ -1184,14 +1142,8 @@ bool UGPUInstancedLineComponent::DrawLinesDirectly(int32 LineIdStart, TArray<FVe TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("UGPUInstancedLineComponent::DrawLinesDirectly - MoveTemp Texture Data")) TextureData = new TArray<FVector4>(MoveTemp(Points)); } - int32 NumberOfRegions = 0; - FUpdateTextureRegion2D* Regions = CalculateTextureRegions(FIntPoint(X, Y), TextureData->Num(), NumberOfRegions); - PositionTexture->UpdateTextureRegions(0, NumberOfRegions, Regions, TextureWidth * sizeof(FVector4), sizeof(FVector4), (uint8*)TextureData->GetData(), - [](auto InTextureData, auto InRegions) - { - delete InTextureData; - delete InRegions; - }); + UpdateTexture(FIntPoint(X, Y), TextureData->Num(), (uint8*)TextureData->GetData()); + return true; } @@ -1211,14 +1163,7 @@ bool UGPUInstancedLineComponent::DrawLinesDirectly(int32 LineIdStart, TArray<FVe const int32 X = LineIdStart % TextureWidth; const int32 Y = LineIdStart / TextureWidth; - int32 NumberOfRegions = 0; - FUpdateTextureRegion2D* Regions = CalculateTextureRegions(FIntPoint(X, Y), Points->Num(), NumberOfRegions); - PositionTexture->UpdateTextureRegions(0, NumberOfRegions, Regions, TextureWidth * sizeof(FVector4), sizeof(FVector4), (uint8*)Points->GetData(), - [](auto InTextureData, auto InRegions) - { - delete InTextureData; - delete InRegions; - }); + UpdateTexture(FIntPoint(X, Y), Points->Num(), (uint8*)Points->GetData()); return true; } @@ -1230,14 +1175,7 @@ bool UGPUInstancedLineComponent::DrawLinesDirectly(int32 LineIdStart, uint8* Src const int32 X = LineIdStart % TextureWidth; const int32 Y = LineIdStart / TextureWidth; - int32 NumberOfRegions = 0; - FUpdateTextureRegion2D* Regions = CalculateTextureRegions(FIntPoint(X, Y), Num, NumberOfRegions); - PositionTexture->UpdateTextureRegions(0, NumberOfRegions, Regions, TextureWidth * sizeof(FVector4), sizeof(FVector4), SrcData, - [](auto InTextureData, auto InRegions) - { - delete InTextureData; - delete InRegions; - }); + UpdateTexture(FIntPoint(X, Y), Num, SrcData); return true; } @@ -1319,17 +1257,9 @@ bool UGPUInstancedLineComponent::UpdatePoints(int32 LineId, int32 StartingPointI const FIntPoint StartIndex(StartTextureIndex % TextureWidth, StartTextureIndex / TextureWidth); FMemory::Memcpy(LinearLineData.GetData() + StartTextureIndex, TextureData->GetData(), TextureData->Num() * sizeof(FVector4)); - - int32 NumberOfRegions = 0; - const FUpdateTextureRegion2D* Regions = CalculateTextureRegions(StartIndex, TextureData->Num(), NumberOfRegions); - - PositionTexture->UpdateTextureRegions(0, NumberOfRegions, Regions, TextureWidth * sizeof(FVector4), sizeof(FVector4), (uint8*)TextureData->GetData(), - [](auto InTextureData, auto InRegions) - { - delete InTextureData; - delete InRegions; - }); - + + UpdateTexture(StartIndex, TextureData->Num(), (uint8*)TextureData->GetData()); + return true; } diff --git a/Source/InstancedMeshLineRendering/Public/GPUInstancedLineComponent.h b/Source/InstancedMeshLineRendering/Public/GPUInstancedLineComponent.h index 87a7b78..d8ed335 100644 --- a/Source/InstancedMeshLineRendering/Public/GPUInstancedLineComponent.h +++ b/Source/InstancedMeshLineRendering/Public/GPUInstancedLineComponent.h @@ -147,6 +147,8 @@ public: void UpdateWholeTexture() const; int32 AddNewSegmentInstance(const FLinearColor& Color, float Width, int32 Index); + + void UpdateTexture(const FIntPoint& StartIndex, int32 NumberOfPoints, uint8* SrcData); /** * Reserves internal memory for a given amount of Lines and Segments per Line. -- GitLab