// Copyright 2020-2024 CesiumGS, Inc. and Contributors #pragma once #include "CesiumMetadataValue.h" #include "CesiumPropertyTableProperty.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "UObject/ObjectMacros.h" #include "CesiumPropertyTable.generated.h" namespace CesiumGltf { struct Model; struct PropertyTable; } // namespace CesiumGltf /** * @brief Reports the status of a FCesiumPropertyTable. If the property table * cannot be accessed, this briefly indicates why. */ UENUM(BlueprintType) enum class ECesiumPropertyTableStatus : uint8 { /* The property table is valid. */ Valid = 0, /* The property table instance was not initialized from an actual glTF property table. */ ErrorInvalidPropertyTable, /* The property table's class could be found in the schema of the metadata extension. */ ErrorInvalidPropertyTableClass }; /** * A Blueprint-accessible wrapper for a glTF property table. A property table is * a collection of properties for the features in a mesh. It knows how to * look up the metadata values associated with a given feature ID. */ USTRUCT(BlueprintType) struct CESIUMRUNTIME_API FCesiumPropertyTable { GENERATED_USTRUCT_BODY() public: /** * Construct an empty property table instance. */ FCesiumPropertyTable() : _status(ECesiumPropertyTableStatus::ErrorInvalidPropertyTable){}; /** * Constructs a property table from a glTF Property Table. * * @param Model The model that stores EXT_structural_metadata. * @param PropertyTable The target property table. */ FCesiumPropertyTable( const CesiumGltf::Model& Model, const CesiumGltf::PropertyTable& PropertyTable); /** * Gets the name of the metadata class that this property table conforms to. */ FString getClassName() const { return _className; } private: ECesiumPropertyTableStatus _status; FString _name; FString _className; int64 _count; TMap _properties; friend class UCesiumPropertyTableBlueprintLibrary; }; UCLASS() class CESIUMRUNTIME_API UCesiumPropertyTableBlueprintLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() public: /** * Gets the status of the property table. If an error occurred while parsing * the property table from the glTF extension, this briefly conveys why. * * @param PropertyTable The property table. */ UFUNCTION( BlueprintCallable, BlueprintPure, Category = "Cesium|Metadata|PropertyTable") static ECesiumPropertyTableStatus GetPropertyTableStatus(UPARAM(ref) const FCesiumPropertyTable& PropertyTable); /** * Gets the name of the property table. If no name was specified in the glTF * extension, this returns an empty string. * * @param PropertyTable The property table. */ UFUNCTION( BlueprintCallable, BlueprintPure, Category = "Cesium|Metadata|PropertyTable") static const FString& GetPropertyTableName(UPARAM(ref) const FCesiumPropertyTable& PropertyTable); /** * Gets the number of values each property in the table is expected to have. * If an error occurred while parsing the property table, this returns zero. * * @param PropertyTable The property table. */ UFUNCTION( BlueprintCallable, BlueprintPure, Category = "Cesium|Metadata|PropertyTable") static int64 GetPropertyTableCount(UPARAM(ref) const FCesiumPropertyTable& PropertyTable); /** * Gets all the properties of the property table, mapped by property name. * * @param PropertyTable The property table. */ UFUNCTION( BlueprintCallable, BlueprintPure, Category = "Cesium|Metadata|PropertyTable") static const TMap& GetProperties(UPARAM(ref) const FCesiumPropertyTable& PropertyTable); /** * Gets the names of the properties in this property table. * * @param PropertyTable The property table. */ UFUNCTION( BlueprintCallable, BlueprintPure, Category = "Cesium|Metadata|PropertyTable") static const TArray GetPropertyNames(UPARAM(ref) const FCesiumPropertyTable& PropertyTable); /** * Retrieve a FCesiumPropertyTableProperty by name. If the property table * does not contain a property with that name, this returns an invalid * FCesiumPropertyTableProperty. * * @param PropertyTable The property table. * @param PropertyName The name of the property to find. */ UFUNCTION( BlueprintCallable, BlueprintPure, Category = "Cesium|Metadata|PropertyTable") static const FCesiumPropertyTableProperty& FindProperty( UPARAM(ref) const FCesiumPropertyTable& PropertyTable, const FString& PropertyName); /** * Gets all of the property values for a given feature, mapped by property * name. This will only include values from valid property table properties. * * If the feature ID is out-of-bounds, the returned map will be empty. * * @param PropertyTable The property table. * @param FeatureID The ID of the feature. * @return The property values mapped by property name. */ UFUNCTION( BlueprintCallable, BlueprintPure, Category = "Cesium|Metadata|PropertyTable") static TMap GetMetadataValuesForFeature( UPARAM(ref) const FCesiumPropertyTable& PropertyTable, int64 FeatureID); PRAGMA_DISABLE_DEPRECATION_WARNINGS /** * Gets all of the property values for a given feature as strings, mapped by * property name. This will only include values from valid property table * properties. * * Array properties cannot be converted to strings, so empty strings * will be returned for their values. * * If the feature ID is out-of-bounds, the returned map will be empty. * * @param PropertyTable The property table. * @param FeatureID The ID of the feature. * @return The property values as strings mapped by property name. */ UFUNCTION( BlueprintCallable, BlueprintPure, Category = "Cesium|Metadata|PropertyTable", Meta = (DeprecatedFunction, DeprecationMessage = "Use GetValuesAsStrings to convert the output of GetMetadataValuesForFeature instead.")) static TMap GetMetadataValuesForFeatureAsStrings( UPARAM(ref) const FCesiumPropertyTable& PropertyTable, int64 FeatureID); PRAGMA_ENABLE_DEPRECATION_WARNINGS };