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