ArticyXImporter
ArticyXImporter for Unreal Engine
Loading...
Searching...
No Matches
PredefinedTypes.h
1//
2// Copyright (c) 2023 articy Software GmbH & Co. KG. All rights reserved.
3//
4
5#pragma once
6
7#include "ArticyObject.h"
8
9//#include "PredefinedTypes.generated.h"
10
12
17#define PREDEFINE_TYPE(Type) new ArticyPredefinedTypeInfo<Type>(#Type, #Type, TEXT(""), [](PROP_SETTER_PARAMS) { return Type{ Json }; })
18 //same as PREDEFINED_TYPE, but with a custom DefaultValue and Deserializer.
19#define PREDEFINE_TYPE_EXT(Type, DefaultValue, Deserializer) new ArticyPredefinedTypeInfo<Type>(#Type, #Type, DefaultValue, Deserializer)
20//same as PREDEFINED_TYPE_EX, but creates a ArticyObjectTypeInfo, which has a default deserializer
21#define PREDEFINE_ARTICYOBJECT_TYPE(Type) new ArticyObjectTypeInfo<Type, Type*>(#Type, #Type"*")
22
23#define PROP_SETTER_PARAMS UArticyBaseObject* Model, const FString& Path, const TSharedPtr<FJsonValue> Json, const FString& PackageName
24#define ARRAY_SETTER_PARAMS UArticyBaseObject* Model, const FString& Path, const TArray<TSharedPtr<FJsonValue>> JsonArray, const FString& PackageName
25#define PROP_SETTER_ARGS Model, Path, Json, PackageName
26
27// Converts Unity rich text markup to Unreal rich text markup.
28// Amounts to just replacing all closing tags with </> as Unreal
29// does not include the tag name in the closing tag.
30//
31// Ex. "My text has <b>bold</b> words." to "My text has <b>bold</> words."
32FString ConvertUnityMarkupToUnreal(const FString& Input);
33FString DecodeHtmlEntities(const FString& Input);
34
38struct FArticyPredefinedTypeBase
39{
40 FArticyPredefinedTypeBase(const FString& TypeName, const FString& PropTypeName, const FString& DefaultValue) : CppType(TypeName), CppPropertyType(PropTypeName), CppDefaultValue(DefaultValue) { }
41 virtual ~FArticyPredefinedTypeBase() = default;
42
43 FString CppType = "";
44 FString CppPropertyType = "";
45 FString CppDefaultValue = "";
46
47 virtual void SetProp(FName Property, PROP_SETTER_PARAMS) { ensureMsgf(false, TEXT("SetProp not implemented in derived class!")); }
48 virtual void SetArray(FName ArrayProperty, ARRAY_SETTER_PARAMS) { ensureMsgf(false, TEXT("SetProp not implemented in derived class!")); }
49};
50
58template<typename Type, typename PropType = Type>
59struct ArticyPredefinedTypeInfo : FArticyPredefinedTypeBase
60{
61 ArticyPredefinedTypeInfo(const FString& TypeName, const FString& PropTypeName, const FString& DefaultValue, PropType(*Deserializer)(PROP_SETTER_PARAMS))
62 : FArticyPredefinedTypeBase(TypeName, PropTypeName, DefaultValue), Deserializer(Deserializer)
63 { }
64
65 virtual ~ArticyPredefinedTypeInfo() override = default;
66
67 typedef PropType(*TDeserializer)(PROP_SETTER_PARAMS);
69 TDeserializer Deserializer = nullptr;
70
72 virtual void SetProp(const FName Property, PROP_SETTER_PARAMS) override
73 {
74 if (ensure(Deserializer))
75 Model->SetProp<PropType>(Property, Deserializer(PROP_SETTER_ARGS));
76 }
77
79 virtual void SetArray(FName ArrayProperty, ARRAY_SETTER_PARAMS) override
80 {
81 if (!ensure(Deserializer))
82 return;
83
84 static TArray<PropType> PropArray;
85
86 PropArray.Reset(JsonArray.Num());
87 for (auto j : JsonArray)
88 PropArray.Add(Deserializer(Model, Path, j, PackageName));
89
90 Model->SetProp(ArrayProperty, PropArray);
91 }
92};
93
98template<typename Type, typename PropType = Type>
99struct ArticyObjectTypeInfo final : ArticyPredefinedTypeInfo<Type, PropType>
100{
101 ArticyObjectTypeInfo(FString TypeName, FString PropTypeName) : ArticyPredefinedTypeInfo<Type, PropType>(TypeName, PropTypeName, TEXT("nullptr"), [](PROP_SETTER_PARAMS)
102 {
103 auto Val = NewObject<Type>(Model);
104 Val->InitFromJson(Json);
105
106 UObject* Raw = Val;
107 if (const auto& Prim = Cast<UArticyPrimitive>(Raw))
108 Model->AddSubobject(Prim);
109
110 return Val;
111 }) {
112 static_assert(std::is_base_of_v<UArticyBaseObject, Type>, "ArticyObjectTypeInfo might only be used for UArticyBaseObject!");
113 }
114
115 virtual ~ArticyObjectTypeInfo() override = default;
116};
117
121struct FArticyPredefTypes
122{
123 FArticyPredefTypes();
124
125 static TMap<FName, FArticyPredefinedTypeBase*>& Get() { return StaticInstance.Types; }
126 static ArticyPredefinedTypeInfo<uint8>* GetEnum() { return StaticInstance.Enum.Get(); }
127 static bool IsPredefinedType(const FName& OriginalType);
128
129private:
130
132 TMap<FName, FArticyPredefinedTypeBase*> Types;
134 TSharedPtr<ArticyPredefinedTypeInfo<uint8>> Enum;
135
136 static FArticyPredefTypes StaticInstance;
137};
Definition ArticyImportData.h:411
Definition PredefinedTypes.h:60
virtual void SetArray(FName ArrayProperty, ARRAY_SETTER_PARAMS) override
Definition PredefinedTypes.h:79
virtual void SetProp(const FName Property, PROP_SETTER_PARAMS) override
Definition PredefinedTypes.h:72
TDeserializer Deserializer
Definition PredefinedTypes.h:69
static bool IsPredefinedType(const FName &OriginalType)
Definition PredefinedTypes.cpp:160