bmh/FlightSimulation/Plugins/CesiumForUnreal_5.4/Source/CesiumRuntime/Public/CesiumFeatureIdAttribute.h
2025-02-07 22:52:32 +08:00

166 lines
5.5 KiB
C++

// Copyright 2020-2024 CesiumGS, Inc. and Contributors
#pragma once
#include "Kismet/BlueprintFunctionLibrary.h"
#include <CesiumGltf/AccessorUtility.h>
#include "CesiumFeatureIdAttribute.generated.h"
namespace CesiumGltf {
struct Model;
struct Accessor;
struct Node;
} // namespace CesiumGltf
/**
* @brief Reports the status of a FCesiumFeatureIdAttribute. If the feature ID
* attribute cannot be accessed, this briefly indicates why.
*/
UENUM(BlueprintType)
enum class ECesiumFeatureIdAttributeStatus : uint8 {
/* The feature ID attribute is valid. */
Valid = 0,
/* The feature ID attribute does not exist in the glTF primitive. */
ErrorInvalidAttribute,
/* The feature ID attribute uses an invalid accessor in the glTF. */
ErrorInvalidAccessor
};
/**
* @brief A blueprint-accessible wrapper for a feature ID attribute from a glTF
* model. Provides access to feature IDs which can be used with the
* corresponding {@link FCesiumPropertyTable} to access metadata. These feature
* IDs may be defined per-vertex or per-instance.
*/
USTRUCT(BlueprintType)
struct CESIUMRUNTIME_API FCesiumFeatureIdAttribute {
GENERATED_USTRUCT_BODY()
public:
/**
* @brief Constructs an empty feature ID attribute instance. Empty feature ID
* attributes can be constructed while trying to convert a FCesiumFeatureIdSet
* that is not an attribute. In this case, the status reports it is an invalid
* attribute.
*/
FCesiumFeatureIdAttribute()
: _status(ECesiumFeatureIdAttributeStatus::ErrorInvalidAttribute),
_featureIdAccessor(),
_attributeIndex(-1) {}
/**
* @brief Constructs a feature ID attribute instance.
*
* @param Model The model.
* @param Primitive The mesh primitive containing the feature ID attribute.
* @param FeatureIDAttribute The attribute index specified by the FeatureId.
* @param PropertyTableName The name of the property table this attribute
* corresponds to, if one exists, for backwards compatibility.
*/
FCesiumFeatureIdAttribute(
const CesiumGltf::Model& Model,
const CesiumGltf::MeshPrimitive& Primitive,
const int64 FeatureIDAttribute,
const FString& PropertyTableName);
/**
* @brief Constructs a feature ID attribute instance from
* EXT_instance_features data.
*
* @param Model The model.
* @param Node The node containing the feature ID attribute.
* @param FeatureIDAttribute The attribute index specified by the FeatureId.
* @param PropertyTableName The name of the property table this attribute
* corresponds to, if one exists, for backwards compatibility.
*/
FCesiumFeatureIdAttribute(
const CesiumGltf::Model& Model,
const CesiumGltf::Node& Node,
const int64 FeatureIDAttribute,
const FString& PropertyTableName);
/**
* Gets the index of this feature ID attribute in the glTF primitive.
*/
int64 getAttributeIndex() const { return this->_attributeIndex; }
private:
ECesiumFeatureIdAttributeStatus _status;
CesiumGltf::FeatureIdAccessorType _featureIdAccessor;
int64 _attributeIndex;
// For backwards compatibility.
FString _propertyTableName;
friend class UCesiumFeatureIdAttributeBlueprintLibrary;
};
UCLASS()
class CESIUMRUNTIME_API UCesiumFeatureIdAttributeBlueprintLibrary
: public UBlueprintFunctionLibrary {
GENERATED_BODY()
public:
PRAGMA_DISABLE_DEPRECATION_WARNINGS
/**
* Get the name of the feature table corresponding to this feature ID
* attribute. The name can be used to fetch the appropriate
* FCesiumFeatureTable from the FCesiumMetadataModel.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Meta =
(DeprecatedFunction,
DeprecationMessage =
"Use GetPropertyTableIndex on a CesiumFeatureIdSet instead."))
static const FString&
GetFeatureTableName(UPARAM(ref)
const FCesiumFeatureIdAttribute& FeatureIDAttribute);
PRAGMA_ENABLE_DEPRECATION_WARNINGS
/**
* Gets the status of the feature ID attribute. If this attribute is
* invalid in any way, this will briefly indicate why.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Features|FeatureIDAttribute")
static ECesiumFeatureIdAttributeStatus GetFeatureIDAttributeStatus(
UPARAM(ref) const FCesiumFeatureIdAttribute& FeatureIDAttribute);
/**
* Gets the number of elements in the attribute. This is distinct from the
* number of unique feature IDs within the attribute.
*
* For a feature ID attribute of a regular mesh, this is the number of
* vertices. For a per-instance feature ID, this is the number of instances.
*
* If the feature ID attribute is invalid, this returns 0.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Features|FeatureIDAttribute")
static int64
GetCount(UPARAM(ref) const FCesiumFeatureIdAttribute& FeatureIDAttribute);
/**
* Gets the feature ID at the given index. A feature ID can be used with a
* FCesiumPropertyTable to retrieve the metadata for that ID. If the feature
* ID attribute is invalid, this returns -1.
*
* For a feature ID attribute of a regular mesh, the provided Index is the
* index of a vertex within the mesh. For a per-instance feature ID, the
* provided Index is the index of the instance.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Features|FeatureIDAttribute")
static int64 GetFeatureID(
UPARAM(ref) const FCesiumFeatureIdAttribute& FeatureIDAttribute,
int64 Index);
};