ArticyXImporter
ArticyXImporter for Unreal Engine
Loading...
Searching...
No Matches
ArticyHelpers.h
1//
2// Copyright (c) 2023 articy Software GmbH & Co. KG. All rights reserved.
3//
4
5#pragma once
6
7#include <sstream>
8
9#include "ArticyPluginSettings.h"
10#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >0
11#include "AssetRegistry/AssetRegistryModule.h"
12#else
13#include "AssetRegistryModule.h"
14#endif
15#include "Dom/JsonValue.h"
16#include "Dom/JsonObject.h"
17#include "ArticyTextExtension.h"
18#include "ArticyRuntimeModule.h"
19#include "ArticyLocalizerSystem.h"
20
21namespace ArticyHelpers
22{
23
24#define STRINGIFY(x) #x
25
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")
34
35#define JSON_SUBSECTION_TYPES TEXT("Types")
36#define JSON_SUBSECTION_TEXTS TEXT("Texts")
37#define JSON_SUBSECTION_OBJECTS TEXT("Objects")
38
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)) \
45 { body } }
46
48#define JSON_TRY_BOOL(json, x) static_assert(!std::is_const<decltype(x)>::value, #x " is const!"); \
49 json->TryGetBoolField(TEXT(#x), x)
50
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; }
56
57#define JSON_TRY_TEXT(json, x) { FString str; if(json->TryGetStringField(TEXT(#x), str)) x = FText::FromString(str); }
58
60#define JSON_TRY_HEX_ID(json, x) static_assert(std::is_same<decltype(x), FArticyId>::value, #x " is not a uint64!"); \
61 { FString hex; \
62 json->TryGetStringField(TEXT(#x), hex); \
63 x = ArticyHelpers::HexToUint64(hex); }
64
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) \
71 { loopBody } }
72
73#define JSON_TRY_STRING_ARRAY(json, x) JSON_TRY_ARRAY(json, x, x.Add(item->AsString()); )
74
76#define JSON_TRY_INT(json, x) json->TryGetNumberField(TEXT(#x), x)
77
79#define JSON_TRY_FLOAT(json, x) { double d##x; json->TryGetNumberField(TEXT(#x), d##x); x = d##x; }
80
82#define JSON_TRY_ENUM(json, x) int val; if(json->TryGetNumberField(TEXT(#x), val)) x = static_cast<decltype(x)>(val);
83
84//---------------------------------------------------------------------------//
85//---------------------------------------------------------------------------//
86
87 inline FString GetArticyFolder()
88 {
89 return GetDefault<UArticyPluginSettings>()->ArticyDirectory;
90 }
91
92 inline FString GetArticyResourcesFolder()
93 {
94 return GetArticyFolder() / TEXT("ArticyContent") / TEXT("Resources");
95 }
96
97 inline FString GetArticyGeneratedFolder()
98 {
99 return GetArticyFolder() / TEXT("ArticyContent") / TEXT("Generated");
100 }
101
102 inline uint64 HexToUint64(FString str) { return FCString::Strtoui64(*str, nullptr, 16); }
103 inline FString Uint64ToHex(uint64 id)
104 {
105 std::stringstream stream;
106 stream << "0x" << std::hex << id;
107 return UTF8_TO_TCHAR(stream.str().c_str());
108 }
109
110 inline FString Uint64ToObjectString(uint64 id)
111 {
112 std::ostringstream stream;
113 stream << id << "_0";
114 return UTF8_TO_TCHAR(stream.str().c_str());
115 }
116
117 inline FVector2D ParseFVector2DFromJson(const TSharedPtr<FJsonValue> Json)
118 {
119 if(!Json.IsValid() || !ensure(Json->Type == EJson::Object))
120 return FVector2D{};
121
122 double X = 0, Y = 0;
123
124 auto obj = Json->AsObject();
125 obj->TryGetNumberField(TEXT("x"), X);
126 obj->TryGetNumberField(TEXT("y"), Y);
127
128 return FVector2D{ static_cast<float>(X), static_cast<float>(Y) };
129 }
130
131 inline FMatrix ParseFMatrixFromJson(const TSharedPtr<FJsonValue> Json)
132 {
133 if (!Json.IsValid() || !ensure(Json->Type == EJson::Array))
134 return FMatrix::Identity;
135
136 auto JsonArray = Json->AsArray();
137 if (!ensure(JsonArray.Num() == 9))
138 return FMatrix::Identity;
139
140 TArray< float > FloatArray = TArray<float>();
141 for (auto& JsonFloatValue : JsonArray)
142 {
143 FloatArray.Add(static_cast<float>(JsonFloatValue->AsNumber()));
144 }
145
146 // Take the 2D 3x3 Matrix from Articy:draft and conver it to a 3D 4x4 Matrix for Unreal
147 return FMatrix{
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},
151 // Translation values need to be moved over as they're always on the last column of the matrix
152 FPlane{FloatArray[6], FloatArray[7], 0.f, 1.f},
153 };
154 }
155
156 inline FLinearColor ParseColorFromJson(const TSharedPtr<FJsonValue> Json)
157 {
158 if(!Json.IsValid() || !ensure(Json->Type == EJson::Object))
159 return FLinearColor{};
160
161 double R, G, B, A = 1.0;
162
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);
168
169 return FLinearColor{ static_cast<float>(R), static_cast<float>(G), static_cast<float>(B), static_cast<float>(A) };
170 }
171
172 inline FText ResolveText(UObject* Outer, const FText* SourceText)
173 {
174 UArticyLocalizerSystem* ArticyLocalizerSystem = UArticyLocalizerSystem::Get();
175 return ArticyLocalizerSystem->ResolveText(Outer, SourceText);
176 }
177
178 inline FText LocalizeString(UObject* Outer, const FText& Key, bool ResolveTextExtension = true, const FText* BackupText = nullptr)
179 {
180 UArticyLocalizerSystem* ArticyLocalizerSystem = UArticyLocalizerSystem::Get();
181 return ArticyLocalizerSystem->LocalizeString(Outer, Key, ResolveTextExtension, BackupText);
182 }
183
184}
185
186