ArticyXImporter
ArticyXImporter for Unreal Engine
Loading...
Searching...
No Matches
ArticyBranchSorters.h
1//
2// Copyright (c) 2026 articy Software GmbH & Co. KG. All rights reserved.
3//
4
5#pragma once
6
7#include "ArticyBranch.h"
8#include "ArticyBuiltinTypes.h"
9#include "Interfaces/ArticyInputPinsProvider.h"
10#include "Interfaces/ArticyObjectWithPosition.h"
11
12namespace ArticyBranchSorters
13{
22 {
23
24 FORCEINLINE bool operator()(const FArticyBranch& A, const FArticyBranch& B) const
25 {
26 const IArticyObjectWithPosition* APos = Cast<IArticyObjectWithPosition>(A.GetTarget().GetInterface());
27 const IArticyObjectWithPosition* BPos = Cast<IArticyObjectWithPosition>(B.GetTarget().GetInterface());
28
29 if (APos != nullptr && BPos != nullptr)
30 {
31 return IsPositionSmaller(APos, BPos);
32 }
33
34 const UArticyInputPin* AInputPin = Cast<UArticyInputPin>(A.GetTarget().GetInterface());
35 const UArticyInputPin* BInputPin = Cast<UArticyInputPin>(B.GetTarget().GetInterface());
36
37 if (AInputPin != nullptr && BInputPin != nullptr)
38 {
39 return IsInputPinSmaller(AInputPin, BInputPin);
40 }
41
42 const UArticyOutgoingConnection* AOutgoingConnection = Cast<UArticyOutgoingConnection>(A.GetTarget().GetInterface());
43 const UArticyOutgoingConnection* BOutgoingConnection = Cast<UArticyOutgoingConnection>(B.GetTarget().GetInterface());
44
45 if (AOutgoingConnection != nullptr && BOutgoingConnection != nullptr)
46 {
47 return IsOutgoingConnectionSmaller(AOutgoingConnection, BOutgoingConnection);
48 }
49
50 return true;
51 }
52
53 FORCEINLINE static bool IsPositionSmaller(const IArticyObjectWithPosition* APosObj, const IArticyObjectWithPosition* BPosObj)
54 {
55 if (APosObj != nullptr && BPosObj != nullptr)
56 {
57 const FVector2D APos2D = APosObj->GetPosition();
58 const FVector2D BPos2D = BPosObj->GetPosition();
59
60 return APos2D.X == BPos2D.X ? APos2D.Y < BPos2D.Y : APos2D.X < BPos2D.X;
61 }
62
63 return true;
64 }
65
66 FORCEINLINE static bool IsInputPinSmaller(const UArticyInputPin* AInputPin, const UArticyInputPin* BInputPin)
67 {
68 if (AInputPin != nullptr && BInputPin != nullptr)
69 {
70 UArticyObject* AOwner = UArticyObject::FindAsset(AInputPin->Owner);
71 UArticyObject* BOwner = UArticyObject::FindAsset(BInputPin->Owner);
72
73 const IArticyObjectWithPosition* AOwnerPos = Cast<IArticyObjectWithPosition>(AOwner);
74 const IArticyObjectWithPosition* BOwnerPos = Cast<IArticyObjectWithPosition>(BOwner);
75
76 if (AOwnerPos != nullptr && BOwnerPos != nullptr && AOwnerPos != BOwnerPos)
77 {
78 return IsPositionSmaller(AOwnerPos, BOwnerPos);
79 }
80
81 const IArticyInputPinsProvider* AInputPinsProvider = Cast<IArticyInputPinsProvider>(AOwner);
82 const IArticyInputPinsProvider* BInputPinsProvider = Cast<IArticyInputPinsProvider>(BOwner);
83
84 if (AInputPinsProvider != nullptr && BInputPinsProvider != nullptr)
85 {
86 return AInputPinsProvider->GetInputPins().IndexOfByKey(AInputPin) < BInputPinsProvider->GetInputPins().IndexOfByKey(BInputPin);
87 }
88 }
89
90 return true;
91 }
92
93 FORCEINLINE static bool IsOutgoingConnectionSmaller(const UArticyOutgoingConnection* AOutgoingConnection, const UArticyOutgoingConnection* BOutgoingConnection)
94 {
95 const IArticyObjectWithPosition* APosObj = Cast<IArticyObjectWithPosition>(AOutgoingConnection->GetTarget());
96 const IArticyObjectWithPosition* BPosObj = Cast<IArticyObjectWithPosition>(BOutgoingConnection->GetTarget());
97
98 if (APosObj != nullptr && BPosObj != nullptr && APosObj != BPosObj)
99 {
100 return IsPositionSmaller(APosObj, BPosObj);
101 }
102
103 return true;
104 }
105 };
106}
Interface class for objects providing input pins.
Definition ArticyInputPinsProvider.h:30
TArray< UArticyInputPin * > GetInputPins() const
Retrieves the input pins for this object.
Definition ArticyObjectWithPosition.h:17
FArticyId Owner
Definition ArticyPins.h:32
Definition ArticyPins.h:56
Definition ArticyObject.h:19
Definition ArticyBuiltinTypes.h:54
Definition ArticyBranchSorters.h:22
Definition ArticyBranch.h:16
TScriptInterface< IArticyFlowObject > GetTarget() const
Definition ArticyFlowPlayer.cpp:20