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

197 lines
6.3 KiB
C++

// Copyright 2020-2024 CesiumGS, Inc. and Contributors
#pragma once
#include "CesiumFeatureIdSet.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "UObject/ObjectMacros.h"
#include <CesiumGltf/AccessorUtility.h>
#include "CesiumPrimitiveFeatures.generated.h"
namespace CesiumGltf {
struct ExtensionExtMeshFeatures;
struct ExtensionExtInstanceFeatures;
} // namespace CesiumGltf
/**
* A Blueprint-accessible wrapper for a glTF Primitive's mesh features. It holds
* views of the feature ID sets associated with this primitive. The collection
* of features in the EXT_instance_features is very similar to that in
* EXT_mesh_features, so FCesiumPrimitiveFeatures can be used to handle those
* features too.
*/
USTRUCT(BlueprintType)
struct CESIUMRUNTIME_API FCesiumPrimitiveFeatures {
GENERATED_USTRUCT_BODY()
public:
/**
* Constructs an empty primitive features instance.
*/
FCesiumPrimitiveFeatures() : _vertexCount(0) {}
/**
* Constructs a primitive features instance.
*
* @param Model The model that contains the EXT_mesh_features extension
* @param Primitive The mesh primitive that stores EXT_mesh_features
* extension
* @param Features The EXT_mesh_features of the glTF mesh primitive
*/
FCesiumPrimitiveFeatures(
const CesiumGltf::Model& Model,
const CesiumGltf::MeshPrimitive& Primitive,
const CesiumGltf::ExtensionExtMeshFeatures& Features);
/**
* Constructs an instance feature object.
*
* @param Model The model that contains the EXT_instance_features extension
* @param Node The node that stores EXT_instance_features
* extension
* @param InstanceFeatures The EXT_Instance_features of the glTF mesh
* primitive
*/
FCesiumPrimitiveFeatures(
const CesiumGltf::Model& Model,
const CesiumGltf::Node& Node,
const CesiumGltf::ExtensionExtInstanceFeatures& InstanceFeatures);
private:
TArray<FCesiumFeatureIdSet> _featureIdSets;
CesiumGltf::IndexAccessorType _indexAccessor;
// Vertex count = 0 and _primitiveMode = -1 indicates instance features
int64_t _vertexCount;
int32_t _primitiveMode;
friend class UCesiumPrimitiveFeaturesBlueprintLibrary;
};
UCLASS()
class CESIUMRUNTIME_API UCesiumPrimitiveFeaturesBlueprintLibrary
: public UBlueprintFunctionLibrary {
GENERATED_BODY()
public:
/**
* Gets the primitive features of a glTF primitive component. If `component`
* is not a Cesium glTF primitive component, the returned features are empty.
*
* @param component The component to get the features of.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Primitive|Features")
static const FCesiumPrimitiveFeatures&
GetPrimitiveFeatures(const UPrimitiveComponent* component);
/**
* Gets all the feature ID sets that are associated with the
* primitive.
*
* @param PrimitiveFeatures The primitive.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Primitive|Features")
static const TArray<FCesiumFeatureIdSet>&
GetFeatureIDSets(UPARAM(ref)
const FCesiumPrimitiveFeatures& PrimitiveFeatures);
/**
* Gets all the feature ID sets of the given type.
*
* @param PrimitiveFeatures The primitive.
* @param Type The type of feature ID set to obtain. If the primitive has no
* sets of that type, the returned array will be empty.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Primitive|Features")
static const TArray<FCesiumFeatureIdSet> GetFeatureIDSetsOfType(
UPARAM(ref) const FCesiumPrimitiveFeatures& PrimitiveFeatures,
ECesiumFeatureIdSetType Type);
/**
* Get the number of vertices in the primitive.
*
* @param PrimitiveFeatures The primitive.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Primitive|Features")
static int64
GetVertexCount(UPARAM(ref) const FCesiumPrimitiveFeatures& PrimitiveFeatures);
/**
* Gets the index of the first vertex that makes up a given face of this
* primitive.
*
* @param PrimitiveFeatures The primitive.
* @param FaceIndex The index of the face.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Primitive|Features")
static int64 GetFirstVertexFromFace(
UPARAM(ref) const FCesiumPrimitiveFeatures& PrimitiveFeatures,
int64 FaceIndex);
/**
* Gets the feature ID associated with the given face.
*
* @param PrimitiveFeatures The primitive.
* @param FaceIndex The index of the face to obtain the feature ID of.
* @param FeatureIDSetIndex A primitive may have multiple feature ID sets, so
* this allows a feature ID set to be specified by index. This value should
* index into the array of CesiumFeatureIdSets in the CesiumPrimitiveFeatures.
* If the specified feature ID set index is invalid, this returns -1.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Primitive|Features")
static int64 GetFeatureIDFromFace(
UPARAM(ref) const FCesiumPrimitiveFeatures& PrimitiveFeatures,
int64 FaceIndex,
int64 FeatureIDSetIndex = 0);
/**
* Gets the feature ID associated with the instance at the given index.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Primitive|Features")
static int64 GetFeatureIDFromInstance(
UPARAM(ref) const FCesiumPrimitiveFeatures& InstanceFeatures,
int64 InstanceIndex,
int64 FeatureIDSetIndex = 0);
/**
* Gets the feature ID from the given line trace hit, assuming it
* has hit a glTF primitive component containing this CesiumPrimitiveFeatures.
*
* @param PrimitiveFeatures The primitive.
* @param Hit The line trace hit to try to obtain a feature ID from.
* @param FeatureIDSetIndex A primitive may have multiple feature ID sets, so
* this allows a feature ID set to be specified by index. This value should
* index into the array of CesiumFeatureIdSets in the CesiumPrimitiveFeatures.
* If the specified feature ID set index is invalid, this returns -1.
*/
UFUNCTION(
BlueprintCallable,
BlueprintPure,
Category = "Cesium|Primitive|Features")
static int64 GetFeatureIDFromHit(
UPARAM(ref) const FCesiumPrimitiveFeatures& PrimitiveFeatures,
const FHitResult& Hit,
int64 FeatureIDSetIndex = 0);
};