Skip to content

Commit 33d82ef

Browse files
committed
Adding flags endpoint type flags pt.1
1 parent 9aefa19 commit 33d82ef

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

Source/PCGExElementsClipper2/Private/Core/PCGExClipper2Processor.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ namespace PCGExClipper2
181181
UPCGExClipper2ProcessorSettings::UPCGExClipper2ProcessorSettings(const FObjectInitializer& ObjectInitializer)
182182
: Super(ObjectInitializer)
183183
{
184+
if (const UEnum* EnumClass = StaticEnum<EPCGExClipper2EndpointType>())
185+
{
186+
const int32 NumEnums = EnumClass->NumEnums() - 1; // Skip _MAX
187+
for (int32 i = 0; i < NumEnums; ++i) { EndpointTypeValueMapping.Add(static_cast<EPCGExClipper2EndpointType>(EnumClass->GetValueByIndex(i)), i); }
188+
}
184189
}
185190

186191
bool UPCGExClipper2ProcessorSettings::IsPinUsedByNodeExecution(const UPCGPin* InPin) const
@@ -755,6 +760,40 @@ void FPCGExClipper2ProcessorContext::OutputPaths64(
755760
Blender->MergeSingle(i, WeightedPoints, Trackers);
756761
}
757762

763+
// -- Flag writing (after blending, before WriteFastest) --
764+
TSharedPtr<PCGExData::TBuffer<bool>> IntersectionWriter;
765+
TSharedPtr<PCGExData::TBuffer<int32>> EndpointWriter;
766+
767+
if (Settings->bFlagIntersections)
768+
{
769+
IntersectionWriter = OutputFacade->GetWritable<bool>(Settings->IntersectionFlagName, false, true, PCGExData::EBufferInit::New);
770+
}
771+
if (Settings->bFlagEndpoints)
772+
{
773+
EndpointWriter = OutputFacade->GetWritable<int32>(Settings->EndpointFlagName, Settings->EndpointTypeValueMapping[EPCGExClipper2EndpointType::None], true, PCGExData::EBufferInit::New);
774+
}
775+
776+
if (IntersectionWriter || EndpointWriter)
777+
{
778+
for (int32 i = 0; i < NumPoints; i++)
779+
{
780+
if (IntersectionWriter)
781+
{
782+
const PCGExClipper2Lib::Point64& FlagPt = Path[i];
783+
uint32 FlagPtIdx, FlagSrcIdx;
784+
PCGEx::H64(static_cast<uint64>(FlagPt.z), FlagPtIdx, FlagSrcIdx);
785+
IntersectionWriter->SetValue(i, FlagPtIdx == PCGExClipper2::INTERSECTION_MARKER);
786+
}
787+
if (EndpointWriter)
788+
{
789+
EPCGExClipper2EndpointType Type = EPCGExClipper2EndpointType::None;
790+
if (i == 0) { Type = EPCGExClipper2EndpointType::Start; }
791+
else if (i == NumPoints - 1) { Type = EPCGExClipper2EndpointType::End; }
792+
EndpointWriter->SetValue(i, Settings->EndpointTypeValueMapping[Type]);
793+
}
794+
}
795+
}
796+
758797
OutputFacade->WriteFastest(GetTaskManager());
759798
}
760799

Source/PCGExElementsClipper2/Public/Core/PCGExClipper2Processor.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ struct FPCGExBlendingDetails;
1818
struct FPCGExCarryOverDetails;
1919

2020

21+
UENUM(BlueprintType)
22+
enum class EPCGExClipper2EndpointType : uint8
23+
{
24+
None = 0 UMETA(DisplayName = "None"),
25+
Start = 1 UMETA(DisplayName = "Start"),
26+
End = 2 UMETA(DisplayName = "End"),
27+
};
28+
2129
UENUM(BlueprintType)
2230
enum class EPCGExClipper2JoinType : uint8
2331
{
@@ -277,6 +285,26 @@ class PCGEXELEMENTSCLIPPER2_API UPCGExClipper2ProcessorSettings : public UPCGExP
277285
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Tagging", meta=(EditCondition="bTagHoles"))
278286
FString HoleTag = TEXT("Hole");
279287

288+
/** Write a flag marking intersection points (points created by Clipper2 at path crossings). */
289+
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Flags", meta = (PCG_Overridable, InlineEditConditionToggle))
290+
bool bFlagIntersections = false;
291+
292+
/** Name of the boolean attribute for intersection points */
293+
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Flags", meta = (PCG_Overridable, EditCondition="bFlagIntersections"))
294+
FName IntersectionFlagName = "IsIntersection";
295+
296+
/** Write a flag marking path endpoint (start/end) points. */
297+
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Flags", meta = (PCG_Overridable, InlineEditConditionToggle))
298+
bool bFlagEndpoints = false;
299+
300+
/** Name of the int32 attribute for path endpoint type */
301+
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Flags", meta = (PCG_Overridable, EditCondition="bFlagEndpoints"))
302+
FName EndpointFlagName = "EndpointType";
303+
304+
/** Pick which value will be written for each endpoint type. */
305+
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Flags", EditFixedSize, meta = (ReadOnlyKeys, DisplayName=" └─ Mapping", EditCondition="bFlagEndpoints", HideEditConditionToggle))
306+
TMap<EPCGExClipper2EndpointType, int32> EndpointTypeValueMapping;
307+
280308
/** (DEBUG) If enabled, performs a union of all paths in the group before proceeding to the operation */
281309
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Settings, meta = (PCG_NotOverridable), AdvancedDisplay)
282310
bool bUnionGroupBeforeOperation = false;

0 commit comments

Comments
 (0)