Skip to content

Commit dee19f4

Browse files
committed
WIP
1 parent 33d82ef commit dee19f4

3 files changed

Lines changed: 64 additions & 23 deletions

File tree

82 Bytes
Binary file not shown.

Source/PCGExElementsClipper2/Private/Core/PCGExClipper2Processor.cpp

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,11 @@ UPCGExClipper2ProcessorSettings::UPCGExClipper2ProcessorSettings(const FObjectIn
184184
if (const UEnum* EnumClass = StaticEnum<EPCGExClipper2EndpointType>())
185185
{
186186
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); }
187+
for (int32 i = 0; i < NumEnums; ++i)
188+
{
189+
const EPCGExClipper2EndpointType Value = static_cast<EPCGExClipper2EndpointType>(EnumClass->GetValueByIndex(i));
190+
JointTypeValueMapping.Add(Value, i);
191+
}
188192
}
189193
}
190194

@@ -762,34 +766,71 @@ void FPCGExClipper2ProcessorContext::OutputPaths64(
762766

763767
// -- Flag writing (after blending, before WriteFastest) --
764768
TSharedPtr<PCGExData::TBuffer<bool>> IntersectionWriter;
765-
TSharedPtr<PCGExData::TBuffer<int32>> EndpointWriter;
769+
TSharedPtr<PCGExData::TBuffer<int32>> JointWriter;
766770

767771
if (Settings->bFlagIntersections)
768772
{
769-
IntersectionWriter = OutputFacade->GetWritable<bool>(Settings->IntersectionFlagName, false, true, PCGExData::EBufferInit::New);
773+
IntersectionWriter = OutputFacade->GetWritable<bool>(Settings->IntersectionFlagName, false, false, PCGExData::EBufferInit::New);
770774
}
771-
if (Settings->bFlagEndpoints)
775+
if (Settings->bFlagJoints)
772776
{
773-
EndpointWriter = OutputFacade->GetWritable<int32>(Settings->EndpointFlagName, Settings->EndpointTypeValueMapping[EPCGExClipper2EndpointType::None], true, PCGExData::EBufferInit::New);
777+
JointWriter = OutputFacade->GetWritable<int32>(Settings->JointFlagName, Settings->JointTypeValueMapping[EPCGExClipper2EndpointType::None], false, PCGExData::EBufferInit::New);
774778
}
775779

776-
if (IntersectionWriter || EndpointWriter)
780+
// Per-point source endpoint classification for joint arc boundary detection
781+
// 0 = not from a source endpoint, 1 = from source start (idx 0), 2 = from source end (idx N-1)
782+
TArray<int8> SourceEndpointClass;
783+
if (JointWriter) { SourceEndpointClass.SetNumZeroed(NumPoints); }
784+
785+
if (IntersectionWriter || JointWriter)
777786
{
787+
// Pass 1: write intersection flags, build joint classification
778788
for (int32 i = 0; i < NumPoints; i++)
779789
{
790+
const PCGExClipper2Lib::Point64& FlagPt = Path[i];
791+
uint32 FlagPtIdx, FlagSrcIdx;
792+
PCGEx::H64(static_cast<uint64>(FlagPt.z), FlagPtIdx, FlagSrcIdx);
793+
794+
const bool bIsIntersectionPt = (FlagPtIdx == PCGExClipper2::INTERSECTION_MARKER);
795+
780796
if (IntersectionWriter)
781797
{
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);
798+
IntersectionWriter->SetValue(i, bIsIntersectionPt);
786799
}
787-
if (EndpointWriter)
800+
if (JointWriter && !bIsIntersectionPt)
788801
{
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]);
802+
const int32 SrcArrayIdx = static_cast<int32>(FlagSrcIdx);
803+
if (SrcArrayIdx >= 0 && SrcArrayIdx < AllOpData->Facades.Num() && !AllOpData->IsClosedLoop[SrcArrayIdx])
804+
{
805+
const int32 SrcNumPts = AllOpData->Facades[SrcArrayIdx]->Source->GetNum(PCGExData::EIOSide::In);
806+
if (static_cast<int32>(FlagPtIdx) == 0) { SourceEndpointClass[i] = 1; }
807+
else if (static_cast<int32>(FlagPtIdx) == SrcNumPts - 1) { SourceEndpointClass[i] = 2; }
808+
}
809+
}
810+
}
811+
812+
// Pass 2: detect joint arc boundaries — only flag the first/last point of each arc run
813+
if (JointWriter)
814+
{
815+
for (int32 i = 0; i < NumPoints; i++)
816+
{
817+
const int8 Current = SourceEndpointClass[i];
818+
if (Current == 0) { continue; }
819+
820+
const int8 Prev = (i > 0) ? SourceEndpointClass[i - 1] : (bClosedPaths ? SourceEndpointClass[NumPoints - 1] : static_cast<int8>(0));
821+
const int8 Next = (i < NumPoints - 1) ? SourceEndpointClass[i + 1] : (bClosedPaths ? SourceEndpointClass[0] : static_cast<int8>(0));
822+
823+
const bool bIsArcStart = (Prev != Current);
824+
const bool bIsArcEnd = (Next != Current);
825+
826+
if (bIsArcStart)
827+
{
828+
JointWriter->SetValue(i, Settings->JointTypeValueMapping[EPCGExClipper2EndpointType::Start]);
829+
}
830+
else if (bIsArcEnd)
831+
{
832+
JointWriter->SetValue(i, Settings->JointTypeValueMapping[EPCGExClipper2EndpointType::End]);
833+
}
793834
}
794835
}
795836
}

Source/PCGExElementsClipper2/Public/Core/PCGExClipper2Processor.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -293,17 +293,17 @@ class PCGEXELEMENTSCLIPPER2_API UPCGExClipper2ProcessorSettings : public UPCGExP
293293
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Flags", meta = (PCG_Overridable, EditCondition="bFlagIntersections"))
294294
FName IntersectionFlagName = "IsIntersection";
295295

296-
/** Write a flag marking path endpoint (start/end) points. */
296+
/** Write a flag identifying the start/end of joint arcs at the original path's endpoints (e.g. round caps on offset/inflate). Only applies to open source paths. */
297297
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Flags", meta = (PCG_Overridable, InlineEditConditionToggle))
298-
bool bFlagEndpoints = false;
298+
bool bFlagJoints = false;
299299

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";
300+
/** Name of the int32 attribute for joint type */
301+
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Flags", meta = (PCG_Overridable, EditCondition="bFlagJoints"))
302+
FName JointFlagName = "JointType";
303303

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;
304+
/** Pick which value will be written for each joint type. */
305+
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Settings|Output|Flags", EditFixedSize, meta = (ReadOnlyKeys, DisplayName=" └─ Mapping", EditCondition="bFlagJoints", HideEditConditionToggle))
306+
TMap<EPCGExClipper2EndpointType, int32> JointTypeValueMapping;
307307

308308
/** (DEBUG) If enabled, performs a union of all paths in the group before proceeding to the operation */
309309
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Settings, meta = (PCG_NotOverridable), AdvancedDisplay)

0 commit comments

Comments
 (0)