diff --git a/Content/DynamicLineMaterial.uasset b/Content/DynamicLineMaterial.uasset
index 6580c535488fc33a5879a824895a47af80cb5b61..e4529ef79a4492ebb3bb941980aab51f06487134 100644
Binary files a/Content/DynamicLineMaterial.uasset and b/Content/DynamicLineMaterial.uasset differ
diff --git a/Source/InstancedMeshLineRendering/Private/GPUInstancedLineComponent.cpp b/Source/InstancedMeshLineRendering/Private/GPUInstancedLineComponent.cpp
index 3be69d7e47b585606e686ba7d5da8d1c301e4532..c48e28501c634fd9e2eacd497b268e2ea3ba17d5 100644
--- a/Source/InstancedMeshLineRendering/Private/GPUInstancedLineComponent.cpp
+++ b/Source/InstancedMeshLineRendering/Private/GPUInstancedLineComponent.cpp
@@ -4,7 +4,7 @@
#include "GPUInstancedLineComponent.h"
#include "InstancedMeshLineRendering.h" // Only needed for logging
-#pragma optimize("", off)
+//#pragma optimize("", on)
UGPUInstancedLineComponent::UGPUInstancedLineComponent(const FObjectInitializer& ObjectInitializer)
@@ -15,8 +15,8 @@ UGPUInstancedLineComponent::UGPUInstancedLineComponent(const FObjectInitializer&
CurrentTextureIndex = 0,
NextFreeId = 0;
- TextureWidth = 1024;
- TextureHeight = 1024;
+ TextureWidth = 2048;
+ TextureHeight = 2048;
//PrimaryComponentTick.bCanEverTick = true;
//bTickInEditor = true;
@@ -407,41 +407,44 @@ void UGPUInstancedLineComponent::OnUpdateTransform(EUpdateTransformFlags UpdateT
SetWorldTransform(FTransform::Identity);
}
-TStructOnScope<FActorComponentInstanceData> UGPUInstancedLineComponent::GetComponentInstanceData() const
-{
- TStructOnScope<FActorComponentInstanceData> InstanceData;
-#if WITH_EDITOR
- InstanceData.InitializeAs<FUGPUInstancedLineComponentInstanceData>(this);
- FUGPUInstancedLineComponentInstanceData* LineInstanceData = InstanceData.Cast<FUGPUInstancedLineComponentInstanceData>();
-
- //LineInstanceData->PositionTexture = PositionTexture;
- //LineInstanceData->DynamicMaterial = DynamicLineMaterial;
- //LineInstanceData->LineMap = LineMap;
-
-#endif
- return InstanceData;
-}
#endif
-void UGPUInstancedLineComponent::ApplyComponentInstanceData(FUGPUInstancedLineComponentInstanceData* ComponentInstanceData)
-{
-#if WITH_EDITOR
- //check(ComponentInstanceData);
- //if(ComponentInstanceData->PositionTexture != nullptr)
- // PositionTexture = ComponentInstanceData->PositionTexture;
- //if (ComponentInstanceData->DynamicMaterial != nullptr)
- //{
- // DynamicLineMaterial = ComponentInstanceData->DynamicMaterial;
- // DynamicLineMaterial->SetTextureParameterValue("PositionTexture", PositionTexture);
- // DynamicLineMaterial->SetScalarParameterValue("TextureWidth", TextureWidth);
- // SetMaterial(0, DynamicLineMaterial);
- //}
- //if (ComponentInstanceData->LineMap.Num() > 0)
- // LineMap = ComponentInstanceData->LineMap;
-
-#endif
-}
+//TStructOnScope<FActorComponentInstanceData> UGPUInstancedLineComponent::GetComponentInstanceData() const
+//{
+// TStructOnScope<FActorComponentInstanceData> InstanceData;
+//#if WITH_EDITOR
+// InstanceData.InitializeAs<FUGPUInstancedLineComponentInstanceData>(this);
+// FUGPUInstancedLineComponentInstanceData* LineInstanceData = InstanceData.Cast<FUGPUInstancedLineComponentInstanceData>();
+//
+// //LineInstanceData->PositionTexture = PositionTexture;
+// //LineInstanceData->DynamicMaterial = DynamicLineMaterial;
+// //LineInstanceData->LineMap = LineMap;
+//
+//#endif
+// return InstanceData;
+//}
+//#endif
+//
+//void UGPUInstancedLineComponent::ApplyComponentInstanceData(FUGPUInstancedLineComponentInstanceData* ComponentInstanceData)
+//{
+//#if WITH_EDITOR
+// //check(ComponentInstanceData);
+// //if(ComponentInstanceData->PositionTexture != nullptr)
+// // PositionTexture = ComponentInstanceData->PositionTexture;
+// //if (ComponentInstanceData->DynamicMaterial != nullptr)
+// //{
+// // DynamicLineMaterial = ComponentInstanceData->DynamicMaterial;
+// // DynamicLineMaterial->SetTextureParameterValue("PositionTexture", PositionTexture);
+// // DynamicLineMaterial->SetScalarParameterValue("TextureWidth", TextureWidth);
+// // SetMaterial(0, DynamicLineMaterial);
+// //}
+// //if (ComponentInstanceData->LineMap.Num() > 0)
+// // LineMap = ComponentInstanceData->LineMap;
+//
+//
+//#endif
+//}
// Doesn't do anything yet, just as a testing function to see execution order on Unreal startup.
void UGPUInstancedLineComponent::PostLoad()
@@ -1162,7 +1165,7 @@ bool UGPUInstancedLineComponent::UpdateLineFromEditorData(const FEditorLineData&
bool UGPUInstancedLineComponent::DrawLinesDirectly(int32 LineIdStart, TArray<FVector4>& Points)
{
- TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("UGPUInstancedLineComponent::DrawLinesDirectly"))
+ TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("UGPUInstancedLineComponent::DrawLinesDirectly - Move"))
const int32 X = LineIdStart % TextureWidth;
const int32 Y = LineIdStart / TextureWidth;
@@ -1183,6 +1186,52 @@ bool UGPUInstancedLineComponent::DrawLinesDirectly(int32 LineIdStart, TArray<FVe
return true;
}
+bool UGPUInstancedLineComponent::DrawLinesDirectly(int32 LineIdStart, const TArray<FVector4>& Points)
+{
+ TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("UGPUInstancedLineComponent::DrawLinesDirectly - Memcpy"))
+
+ TArray<FVector4> Cpy = Points;
+ return DrawLinesDirectly(LineIdStart, Cpy);
+}
+
+bool UGPUInstancedLineComponent::DrawLinesDirectly(int32 LineIdStart, TArray<FVector4>* Points)
+{
+ TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("UGPUInstancedLineComponent::DrawLinesDirectly - Ptr"))
+
+ 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;
+ });
+
+ return true;
+}
+
+bool UGPUInstancedLineComponent::DrawLinesDirectly(int32 LineIdStart, uint8* SrcData, int32 Num)
+{
+ TRACE_CPUPROFILER_EVENT_SCOPE(TEXT("UGPUInstancedLineComponent::DrawLinesDirectly - Raw Ptr"))
+
+ 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;
+ });
+
+ return true;
+}
+
// todo test this not sure if it actually works
bool UGPUInstancedLineComponent::UpdatePoint(int32 LineId, int32 PointId, const FVector& Point)
{
@@ -1499,4 +1548,4 @@ bool UGPUInstancedLineComponent::SetSegmentWidth(int32 LineId, int32 SegmentId,
SetCustomDataValue(InstanceId, 3, Width, false);
return true;
}
-#pragma optimize("", on)
+//#pragma optimize("", on)
diff --git a/Source/InstancedMeshLineRendering/Public/GPUInstancedLineComponent.h b/Source/InstancedMeshLineRendering/Public/GPUInstancedLineComponent.h
index c026ebfdfb7af0bd04ff7a55362c2a6f40ebc0d4..a7f01c49e81b66cd3b4ceaa0870565d1a4a03b3b 100644
--- a/Source/InstancedMeshLineRendering/Public/GPUInstancedLineComponent.h
+++ b/Source/InstancedMeshLineRendering/Public/GPUInstancedLineComponent.h
@@ -107,10 +107,10 @@ public:
virtual void OnUpdateTransform(EUpdateTransformFlags UpdateTransformFlags, ETeleportType Teleport = ETeleportType::None) override;
#endif
- virtual TStructOnScope<FActorComponentInstanceData> GetComponentInstanceData() const override;
+ //virtual TStructOnScope<FActorComponentInstanceData> GetComponentInstanceData() const override;
/** Applies the cached component instance data to a newly blueprint constructed component. */
- virtual void ApplyComponentInstanceData(struct FUGPUInstancedLineComponentInstanceData* ComponentInstanceData);
+ //virtual void ApplyComponentInstanceData(struct FUGPUInstancedLineComponentInstanceData* ComponentInstanceData);
virtual void PostLoad() override;
virtual void OnComponentCreated() override;
@@ -319,6 +319,13 @@ public:
* @return bool Returns true on successful update.
*/
bool DrawLinesDirectly(int32 LineIdStart, TArray<FVector4>& Points);
+
+
+ bool DrawLinesDirectly(int32 LineIdStart, const TArray<FVector4>& Points);
+
+ bool DrawLinesDirectly(int32 LineIdStart, TArray<FVector4>* Points);
+
+ bool DrawLinesDirectly(int32 LineIdStart, uint8* SrcData, int32 Num);
/**
* This function updates the location of a given point in an existing line.
@@ -481,45 +488,45 @@ public:
/** Helper class used to preserve texture pointer across blueprint reinstancing */
-USTRUCT()
-struct FUGPUInstancedLineComponentInstanceData : public FSceneComponentInstanceData
-{
- GENERATED_BODY()
-public:
- FUGPUInstancedLineComponentInstanceData() = default;
- FUGPUInstancedLineComponentInstanceData(const UGPUInstancedLineComponent* InComponent)
- : FSceneComponentInstanceData(InComponent)
- , PositionTexture(InComponent->PositionTexture), LineMap(InComponent->LineMap)
- {}
- virtual ~FUGPUInstancedLineComponentInstanceData() = default;
-
- virtual bool ContainsData() const override
- {
- return true;
- }
-
- virtual void ApplyToComponent(UActorComponent* Component, const ECacheApplyPhase CacheApplyPhase) override
- {
- Super::ApplyToComponent(Component, CacheApplyPhase);
- CastChecked<UGPUInstancedLineComponent>(Component)->ApplyComponentInstanceData(this);
- }
-
- virtual void AddReferencedObjects(FReferenceCollector& Collector) override
- {
- Super::AddReferencedObjects(Collector);
- Collector.AddReferencedObject(PositionTexture);
- }
-
-public:
-
-
-
- //UPROPERTY()
- UTexture2D* PositionTexture;
-
- //UPROPERTY()
- UMaterialInstanceDynamic* DynamicMaterial;
-
- //UPROPERTY()
- TMap<int32, FGPULineArray> LineMap;
-};
\ No newline at end of file
+//USTRUCT()
+//struct FUGPUInstancedLineComponentInstanceData : public FSceneComponentInstanceData
+//{
+// GENERATED_BODY()
+//public:
+// FUGPUInstancedLineComponentInstanceData() = default;
+// FUGPUInstancedLineComponentInstanceData(const UGPUInstancedLineComponent* InComponent)
+// : FSceneComponentInstanceData(InComponent)
+// , PositionTexture(InComponent->PositionTexture), LineMap(InComponent->LineMap)
+// {}
+// virtual ~FUGPUInstancedLineComponentInstanceData() = default;
+//
+// virtual bool ContainsData() const override
+// {
+// return true;
+// }
+//
+// virtual void ApplyToComponent(UActorComponent* Component, const ECacheApplyPhase CacheApplyPhase) override
+// {
+// Super::ApplyToComponent(Component, CacheApplyPhase);
+// CastChecked<UGPUInstancedLineComponent>(Component)->ApplyComponentInstanceData(this);
+// }
+//
+// virtual void AddReferencedObjects(FReferenceCollector& Collector) override
+// {
+// Super::AddReferencedObjects(Collector);
+// Collector.AddReferencedObject(PositionTexture);
+// }
+//
+//public:
+//
+//
+//
+// //UPROPERTY()
+// UTexture2D* PositionTexture;
+//
+// //UPROPERTY()
+// UMaterialInstanceDynamic* DynamicMaterial;
+//
+// //UPROPERTY()
+// TMap<int32, FGPULineArray> LineMap;
+//};
\ No newline at end of file