// Copyright 2020-2024 CesiumGS, Inc. and Contributors #include "CesiumMetadataEnum.h" #include "Containers/UnrealString.h" #include "Misc/Optional.h" #include #include #include #include #include /** * @brief Stores the @ref FCesiumMetadataEnumCollection constructed from a * model's structural metadata schema to avoid constructing multiple enum * collections for the same schema. */ struct ExtensionUnrealMetadataEnumCollection { static inline constexpr const char* TypeName = "ExtensionUnrealMetadataEnumCollection"; static inline constexpr const char* ExtensionName = "PRIVATE_MetadataEnumCollection_Unreal"; TSharedRef EnumCollection; ExtensionUnrealMetadataEnumCollection(const CesiumGltf::Schema& Schema) : EnumCollection(MakeShared(Schema)) {} }; FCesiumMetadataEnum::FCesiumMetadataEnum(const CesiumGltf::Enum& Enum) { this->_valueNames.Reserve(Enum.values.size()); for (const CesiumGltf::EnumValue& enumValue : Enum.values) { const FString Name(UTF8_TO_TCHAR(enumValue.name.c_str())); this->_valueNames.Add(enumValue.value, Name); } } FCesiumMetadataEnum::FCesiumMetadataEnum(const UEnum* UnrealEnum) : _valueNames() { if (UnrealEnum != nullptr) { const int32 NumEntries = UnrealEnum->NumEnums(); _valueNames.Reserve(NumEntries); for (int32 i = 0; i < NumEntries; i++) { _valueNames.Emplace( UnrealEnum->GetValueByIndex(i), UnrealEnum->GetNameStringByIndex(i)); } } } TOptional FCesiumMetadataEnum::GetName(int64_t Value) const { const FString* FoundName = this->_valueNames.Find(Value); return FoundName ? *FoundName : TOptional(); } FCesiumMetadataEnumCollection::FCesiumMetadataEnumCollection( const CesiumGltf::Schema& Schema) { this->_enumDefinitions.Reserve(Schema.enums.size()); for (const auto& [name, enumDefinition] : Schema.enums) { this->_enumDefinitions.Emplace( FString(UTF8_TO_TCHAR(name.c_str())), MakeShared(enumDefinition)); } } TSharedPtr FCesiumMetadataEnumCollection::Get(const FString& InName) const { const TSharedRef* MaybeDefinition = this->_enumDefinitions.Find(InName); if (MaybeDefinition == nullptr) { return TSharedPtr(nullptr); } return MaybeDefinition->ToSharedPtr(); } TSharedRef FCesiumMetadataEnumCollection::GetOrCreateFromSchema( CesiumGltf::Schema& Schema) { const ExtensionUnrealMetadataEnumCollection* pExtension = Schema.getExtension(); if (pExtension != nullptr) { return pExtension->EnumCollection; } ExtensionUnrealMetadataEnumCollection& NewExtension = Schema.addExtension(Schema); return NewExtension.EnumCollection; } TSharedPtr FCesiumMetadataEnumCollection::GetOrCreateFromModel( const CesiumGltf::Model& Model) { const CesiumGltf::ExtensionModelExtStructuralMetadata* pExtension = Model.getExtension(); if (pExtension == nullptr || pExtension->schema == nullptr) { return nullptr; } return FCesiumMetadataEnumCollection::GetOrCreateFromSchema( *pExtension->schema); }