9#include "ArticyPluginSettings.h"
10#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >0
11#include "AssetRegistry/AssetRegistryModule.h"
13#include "AssetRegistryModule.h"
15#include "Dom/JsonValue.h"
16#include "Dom/JsonObject.h"
17#include "ArticyTextExtension.h"
18#include "ArticyRuntimeModule.h"
19#include "ArticyLocalizerSystem.h"
21namespace ArticyHelpers
24#define STRINGIFY(x) #x
26#define JSON_SECTION_SETTINGS TEXT("Settings")
27#define JSON_SECTION_PROJECT TEXT("Project")
28#define JSON_SECTION_LANGUAGES TEXT("Languages")
29#define JSON_SECTION_GLOBALVARS TEXT("GlobalVariables")
30#define JSON_SECTION_SCRIPTMEETHODS TEXT("ScriptMethods")
31#define JSON_SECTION_OBJECTDEFS TEXT("ObjectDefinitions")
32#define JSON_SECTION_PACKAGES TEXT("Packages")
33#define JSON_SECTION_HIERARCHY TEXT("Hierarchy")
35#define JSON_SUBSECTION_TYPES TEXT("Types")
36#define JSON_SUBSECTION_TEXTS TEXT("Texts")
37#define JSON_SUBSECTION_OBJECTS TEXT("Objects")
40#define JSON_OBJECT(json, x) TSharedPtr<FJsonObject> x = json->GetObjectField(TEXT(#x))
42#define JSON_TRY_OBJECT(json, x, body) static_assert(!std::is_const<decltype(x)>::value, #x " is const!"); \
43 { const TSharedPtr<FJsonObject> *obj; \
44 if(json->TryGetObjectField(TEXT(#x), obj)) \
48#define JSON_TRY_BOOL(json, x) static_assert(!std::is_const<decltype(x)>::value, #x " is const!"); \
49 json->TryGetBoolField(TEXT(#x), x)
52#define JSON_TRY_STRING(json, x) static_assert(!std::is_const<decltype(x)>::value, #x " is const!"); \
53 json->TryGetStringField(TEXT(#x), x)
55#define JSON_TRY_FNAME(json, x) { FString str; if(json->TryGetStringField(TEXT(#x), str)) x = *str; }
57#define JSON_TRY_TEXT(json, x) { FString str; if(json->TryGetStringField(TEXT(#x), str)) x = FText::FromString(str); }
60#define JSON_TRY_HEX_ID(json, x) static_assert(std::is_same<decltype(x), FArticyId>::value, #x " is not a uint64!"); \
62 json->TryGetStringField(TEXT(#x), hex); \
63 x = ArticyHelpers::HexToUint64(hex); }
66#define JSON_TRY_ARRAY(json, x, loopBody) \
67 static_assert(!std::is_const<decltype(x)>::value, #x " is const!"); \
68 { const TArray<TSharedPtr<FJsonValue>>* items; \
69 if(json->TryGetArrayField(TEXT(#x), items)) \
70 for(const auto& item : *items) \
73#define JSON_TRY_STRING_ARRAY(json, x) JSON_TRY_ARRAY(json, x, x.Add(item->AsString()); )
76#define JSON_TRY_INT(json, x) json->TryGetNumberField(TEXT(#x), x)
79#define JSON_TRY_FLOAT(json, x) { double d##x; json->TryGetNumberField(TEXT(#x), d##x); x = d##x; }
82#define JSON_TRY_ENUM(json, x) int val; if(json->TryGetNumberField(TEXT(#x), val)) x = static_cast<decltype(x)>(val);
87 inline FString GetArticyFolder()
89 return GetDefault<UArticyPluginSettings>()->ArticyDirectory;
92 inline FString GetArticyResourcesFolder()
94 return GetArticyFolder() / TEXT(
"ArticyContent") / TEXT(
"Resources");
97 inline FString GetArticyGeneratedFolder()
99 return GetArticyFolder() / TEXT(
"ArticyContent") / TEXT(
"Generated");
102 inline uint64 HexToUint64(FString str) {
return FCString::Strtoui64(*str,
nullptr, 16); }
103 inline FString Uint64ToHex(uint64
id)
105 std::stringstream stream;
106 stream <<
"0x" << std::hex << id;
107 return UTF8_TO_TCHAR(stream.str().c_str());
110 inline FString Uint64ToObjectString(uint64
id)
112 std::ostringstream stream;
113 stream <<
id <<
"_0";
114 return UTF8_TO_TCHAR(stream.str().c_str());
117 inline FVector2D ParseFVector2DFromJson(
const TSharedPtr<FJsonValue> Json)
119 if(!Json.IsValid() || !ensure(Json->Type == EJson::Object))
124 auto obj = Json->AsObject();
125 obj->TryGetNumberField(TEXT(
"x"), X);
126 obj->TryGetNumberField(TEXT(
"y"), Y);
128 return FVector2D{
static_cast<float>(X),
static_cast<float>(Y) };
131 inline FMatrix ParseFMatrixFromJson(
const TSharedPtr<FJsonValue> Json)
133 if (!Json.IsValid() || !ensure(Json->Type == EJson::Array))
134 return FMatrix::Identity;
136 auto JsonArray = Json->AsArray();
137 if (!ensure(JsonArray.Num() == 9))
138 return FMatrix::Identity;
140 TArray< float > FloatArray = TArray<float>();
141 for (
auto& JsonFloatValue : JsonArray)
143 FloatArray.Add(
static_cast<float>(JsonFloatValue->AsNumber()));
148 FPlane{FloatArray[0], FloatArray[1], FloatArray[2], 0.f},
149 FPlane{FloatArray[3], FloatArray[4], FloatArray[5], 0.f},
150 FPlane{0.f, 0.f, FloatArray[8], 0.f},
152 FPlane{FloatArray[6], FloatArray[7], 0.f, 1.f},
156 inline FLinearColor ParseColorFromJson(
const TSharedPtr<FJsonValue> Json)
158 if(!Json.IsValid() || !ensure(Json->Type == EJson::Object))
159 return FLinearColor{};
161 double R, G, B, A = 1.0;
163 auto obj = Json->AsObject();
164 obj->TryGetNumberField(TEXT(
"r"), R);
165 obj->TryGetNumberField(TEXT(
"g"), G);
166 obj->TryGetNumberField(TEXT(
"b"), B);
167 obj->TryGetNumberField(TEXT(
"a"), A);
169 return FLinearColor{
static_cast<float>(R),
static_cast<float>(G),
static_cast<float>(B),
static_cast<float>(A) };
172 inline FText ResolveText(UObject* Outer,
const FText* SourceText)
174 UArticyLocalizerSystem* ArticyLocalizerSystem = UArticyLocalizerSystem::Get();
175 return ArticyLocalizerSystem->ResolveText(Outer, SourceText);
178 inline FText LocalizeString(UObject* Outer,
const FText& Key,
bool ResolveTextExtension =
true,
const FText* BackupText =
nullptr)
180 UArticyLocalizerSystem* ArticyLocalizerSystem = UArticyLocalizerSystem::Get();
181 return ArticyLocalizerSystem->LocalizeString(Outer, Key, ResolveTextExtension, BackupText);