// Copyright 2020-2024 CesiumGS, Inc. and Contributors #pragma once #include "Components/ActorComponent.h" #include "Containers/Array.h" #include "Containers/UnrealString.h" #include "Misc/Guid.h" #if WITH_EDITOR #include "Materials/MaterialFunctionMaterialLayer.h" #endif #include "CesiumEncodedMetadataComponent.generated.h" PRAGMA_DISABLE_DEPRECATION_WARNINGS /** * @brief The GPU component type to coerce this property to. * */ UENUM() enum class ECesiumPropertyComponentType_DEPRECATED : uint8 { Uint8_DEPRECATED, Float_DEPRECATED }; /** * @brief The property type. */ UENUM() enum class ECesiumPropertyType_DEPRECATED : uint8 { Scalar_DEPRECATED, Vec2_DEPRECATED, Vec3_DEPRECATED, Vec4_DEPRECATED }; /** * @brief Describes how this feature table is accessed. Either through feature * id textures, feature id attributes, mixed, or neither. */ UENUM() enum class ECesiumFeatureTableAccessType_DEPRECATED : uint8 { Unknown_DEPRECATED, Texture_DEPRECATED, Attribute_DEPRECATED, Mixed_DEPRECATED }; // Note that these don't exhaustively cover the possibilities of glTF metadata // classes, they only cover the subset that can be encoded into textures. For // example, arbitrary size arrays and enums are excluded. Other un-encoded // types like strings will be coerced. struct UE_DEPRECATED( 5.0, "CesiumEncodedMetadataComponent and its related description properties have been deprecated. Use CesiumEncodedFeaturesMetadata instead.") FPropertyDescription; /** * @brief Description of a feature table property that should be encoded for * access on the GPU. */ USTRUCT() struct CESIUMRUNTIME_API FPropertyDescription { GENERATED_USTRUCT_BODY() /** * @brief The name of this property as it will be referenced in the * material. */ UPROPERTY(EditAnywhere, Category = "Cesium") FString Name; /** * @brief The GPU component type to coerce this property to. * */ UPROPERTY(EditAnywhere, Category = "Cesium") ECesiumPropertyComponentType_DEPRECATED ComponentType = ECesiumPropertyComponentType_DEPRECATED::Float_DEPRECATED; /** * @brief The property type. */ UPROPERTY(EditAnywhere, Category = "Cesium") ECesiumPropertyType_DEPRECATED Type = ECesiumPropertyType_DEPRECATED::Scalar_DEPRECATED; /** * @brief If ComponentType==Uint8, this indicates whether to normalize into a * [0-1] range before accessing on the GPU. */ UPROPERTY( EditAnywhere, Category = "Cesium", Meta = (EditCondition = "ComponentType==ECesiumPropertyComponentType_DEPRECATED::Uint8_DEPRECATED")) bool Normalized = false; }; struct UE_DEPRECATED( 5.0, "CesiumEncodedMetadataComponent and its related description properties have been deprecated. Use CesiumEncodedFeaturesMetadata instead.") FFeatureTableDescription; /** * @brief Description of a feature table containing properties to be encoded * for access on the GPU. */ USTRUCT() struct CESIUMRUNTIME_API FFeatureTableDescription { GENERATED_USTRUCT_BODY() /** * @brief The name of this feature table. * */ UPROPERTY(EditAnywhere, Category = "Cesium") FString Name; /** * @brief Describes how this feature table is accessed. Either through feature * id textures, feature id attributes, mixed, or neither. */ UPROPERTY(EditAnywhere, Category = "Cesium") ECesiumFeatureTableAccessType_DEPRECATED AccessType = ECesiumFeatureTableAccessType_DEPRECATED::Unknown_DEPRECATED; /** * @brief If the AccessType==Texture, this string represents the channel of * the feature id texture that will be used to index into this feature table. */ UPROPERTY( EditAnywhere, Category = "Cesium", Meta = (EditCondition = "AccessType==ECesiumFeatureTableAccessType_DEPRECATED::Texture_DEPRECATED")) FString Channel; /** * @brief Descriptions of the properties to upload to the GPU. */ UPROPERTY(EditAnywhere, Category = "Cesium", Meta = (TitleProperty = "Name")) TArray Properties; }; struct UE_DEPRECATED( 5.0, "CesiumEncodedMetadataComponent and its related properties have been deprecated. Use CesiumEncodedFeaturesMetadata instead.") FFeatureTexturePropertyDescription; /** * @brief Description of a feature texture property that should be uploaded to * the GPU. */ USTRUCT() struct CESIUMRUNTIME_API FFeatureTexturePropertyDescription { GENERATED_USTRUCT_BODY() /** * @brief The name of this property as it will be referenced in the * material. */ UPROPERTY(EditAnywhere, Category = "Cesium") FString Name; // For now, always assumes it is Uint8 /* UPROPERTY(EditAnywhere, Category = "Cesium") ECesiumPropertyComponentType ComponentType = ECesiumPropertyComponentType::Uint8;*/ /** * @brief The property type. */ UPROPERTY(EditAnywhere, Category = "Cesium") ECesiumPropertyType_DEPRECATED Type = ECesiumPropertyType_DEPRECATED::Scalar_DEPRECATED; /** * @brief If ComponentType==Uint8, this indicates whether to normalize into a * [0-1] range before accessing on the GPU. */ UPROPERTY(EditAnywhere, Category = "Cesium") bool Normalized = false; /** * @brief This string describes the channel order of the incoming feature * texture property (e.g., "rgb", "bgra", etc.). This helps us fix the * channel order when accessing on the GPU. */ UPROPERTY(EditAnywhere, Category = "Cesium") FString Swizzle; }; struct UE_DEPRECATED( 5.0, "CesiumEncodedMetadataComponent and its related description properties have been deprecated. Use CesiumEncodedFeaturesMetadata instead.") FFeatureTextureDescription; /** * @brief Description of a feature texture with properties that should be * uploaded to the GPU. */ USTRUCT() struct CESIUMRUNTIME_API FFeatureTextureDescription { GENERATED_USTRUCT_BODY() /** * @brief The name of this feature texture. */ UPROPERTY(EditAnywhere, Category = "Cesium") FString Name; /** * @brief Descriptions of the properties to upload to the GPU. */ UPROPERTY(EditAnywhere, Category = "Cesium", Meta = (TitleProperty = "Name")) TArray Properties; }; struct UE_DEPRECATED( 5.0, "CesiumEncodedMetadataComponent and its related description properties have been deprecated. Use CesiumEncodedFeaturesMetadata instead.") FMetadataDescription; struct UE_DEPRECATED( 5.0, "CesiumEncodedMetadataComponent and its related description properties have been deprecated. Use CesiumEncodedFeaturesMetadata instead.") FMetadataDescription; /** * @brief Description of metadata from a glTF that should be uploaded to the * GPU for access in materials. */ USTRUCT() struct CESIUMRUNTIME_API FMetadataDescription { GENERATED_USTRUCT_BODY() /** * @brief Descriptions of feature tables to upload to the GPU. */ UPROPERTY( EditAnywhere, Category = "EncodeMetadata", Meta = (TitleProperty = "Name")) TArray FeatureTables; /** * @brief Descriptions of feature textures to upload to the GPU. */ UPROPERTY( EditAnywhere, Category = "EncodeMetadata", Meta = (TitleProperty = "Name")) TArray FeatureTextures; }; /** * @brief An actor component that can be added to Cesium3DTileset actors to * dictate what metadata to encode for access on the GPU. The selection can be * automatically populated based on available metadata by clicking the * "Auto Fill" button. Once a selection of desired metadata is made, the * boiler-plate material code to access the selected properties can be * auto-generated using the "Generate Material" button. * @deprecated Use UCesiumFeaturesMetadataComponent instead. */ UCLASS(Deprecated) class CESIUMRUNTIME_API UDEPRECATED_CesiumEncodedMetadataComponent : public UActorComponent { GENERATED_BODY() public: #if WITH_EDITORONLY_DATA /** * @brief This is the target UMaterialFunctionMaterialLayer that the * boiler-plate material generation will use. When pressing * "Generate Material", nodes will be added to this material to enable access * to the requested metadata. If this is left blank, a new material layer * will be created in the /Game/ folder. */ UPROPERTY( EditAnywhere, Category = "EncodeMetadata", Meta = (DeprecatedProperty, DeprecationMessage = "CesiumEncodedMetadataComponent is deprecated. Use CesiumFeaturesMetadataComponent instead.")) UMaterialFunctionMaterialLayer* TargetMaterialLayer = nullptr; #endif // Note: Here, we avoid wrapping the feature tables and feature textures // inside a FMetadataDescription to avoid further complicating the details // panel UI for editing the hierarchy. /** * @brief Descriptions of feature tables to upload to the GPU. */ UPROPERTY( EditAnywhere, Category = "EncodeMetadata", Meta = (TitleProperty = "Name", DeprecatedProperty, DeprecationMessage = "CesiumEncodedMetadataComponent is deprecated. Use CesiumFeaturesMetadataComponent instead.")) TArray FeatureTables; /** * @brief Descriptions of feature textures to upload to the GPU. */ UPROPERTY( EditAnywhere, Category = "EncodeMetadata", Meta = (TitleProperty = "Name", DeprecatedProperty, DeprecationMessage = "CesiumEncodedMetadataComponent is deprecated. Use CesiumFeaturesMetadataComponent instead.")) TArray FeatureTextures; // virtual void Serialize(FArchive& Ar) override; }; PRAGMA_ENABLE_DEPRECATION_WARNINGS