Never expected a simple 8 value direction struct’s code to be this long XD
BTW feel free to use this code in your projects
USTRUCT()
struct FDirection8
{
GENERATED_USTRUCT_BODY();
UPROPERTY()
EDirection8 Direction;
FDirection8()
{
}
FDirection8(EDirection8 NewDirection)
{
Direction = NewDirection;
}
FDirection8(EDirection4 NewDirection)
{
FromEDirection4(NewDirection);
}
void FromEDirection4(EDirection4 NewDirection)
{
if (NewDirection == EDirection4::Forward) Direction = EDirection8::Forward;
else if (NewDirection == EDirection4::Right) Direction = EDirection8::Right;
else if (NewDirection == EDirection4::Backward) Direction = EDirection8::Backward;
else if (NewDirection == EDirection4::Left) Direction = EDirection8::Left;
else Direction = EDirection8::None;
}
void AddDirection(EDirection4 Value)
{
if (Direction != EDirection8::None)
{
if (Value == EDirection4::Forward)
{
if (Direction == EDirection8::Right) Direction = EDirection8::ForwardRight;
else if (Direction == EDirection8::Left) Direction = EDirection8::ForwardLeft;
}
else if (Value == EDirection4::Right)
{
if (Direction == EDirection8::Forward) Direction = EDirection8::ForwardRight;
else if (Direction == EDirection8::Backward) Direction = EDirection8::BackwardRight;
}
else if (Value == EDirection4::Backward)
{
if (Direction == EDirection8::Right) Direction = EDirection8::BackwardRight;
else if (Direction == EDirection8::Left) Direction = EDirection8::BackwardLeft;
}
else if (Value == EDirection4::Left)
{
if (Direction == EDirection8::Forward) Direction = EDirection8::ForwardLeft;
else if (Direction == EDirection8::Backward) Direction = EDirection8::BackwardLeft;
}
}
else FromEDirection4(Value);
}
void AddDirection(EDirection4 Value, bool bOverrideOpposing)
{
if (bOverrideOpposing == NULL) bOverrideOpposing = false;
if (Direction != EDirection8::None)
{
if (Value == EDirection4::Forward)
{
if (Direction == EDirection8::Right) Direction = EDirection8::ForwardRight;
else if (Direction == EDirection8::Left) Direction = EDirection8::ForwardLeft;
else if (Direction == EDirection8::Backward && bOverrideOpposing) Direction = EDirection8::Forward;
}
else if (Value == EDirection4::Right)
{
if (Direction == EDirection8::Forward) Direction = EDirection8::ForwardRight;
else if (Direction == EDirection8::Backward) Direction = EDirection8::BackwardRight;
else if (Direction == EDirection8::Left && bOverrideOpposing) Direction = EDirection8::Right;
}
else if (Value == EDirection4::Backward)
{
if (Direction == EDirection8::Right) Direction = EDirection8::BackwardRight;
else if (Direction == EDirection8::Left) Direction = EDirection8::BackwardLeft;
else if (Direction == EDirection8::Forward && bOverrideOpposing) Direction = EDirection8::Backward;
}
else if (Value == EDirection4::Left)
{
if (Direction == EDirection8::Forward) Direction = EDirection8::ForwardLeft;
else if (Direction == EDirection8::Backward) Direction = EDirection8::BackwardLeft;
else if (Direction == EDirection8::Right && bOverrideOpposing) Direction = EDirection8::Left;
}
}
else FromEDirection4(Value);
}
// Do not use EAxis::Z
void ZeroOutAxis(EAxis::Type Value)
{
if (Value == EAxis::X)
{
if (Direction == EDirection8::Forward || Direction == EDirection8::Backward) Direction = EDirection8::None;
else if (Direction == EDirection8::ForwardRight || Direction == EDirection8::BackwardRight) Direction = EDirection8::Right;
else if (Direction == EDirection8::ForwardLeft || Direction == EDirection8::BackwardLeft) Direction = EDirection8::Left;
// Else direction does not need to be modified
}
else if (Value == EAxis::Y)
{
if (Direction == EDirection8::Right || Direction == EDirection8::Left) Direction = EDirection8::None;
else if (Direction == EDirection8::ForwardRight || Direction == EDirection8::ForwardLeft) Direction = EDirection8::Forward;
else if (Direction == EDirection8::BackwardRight || Direction == EDirection8::BackwardLeft) Direction = EDirection8::Backward;
// Else direction does not need to be modified
}
}
};