Files
UnrealEngine/Engine/Plugins/Mutable/Source/MutableRuntime/Public/MuR/Parameters.h
2025-05-18 13:04:45 +08:00

376 lines
16 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "HAL/Platform.h"
#include "MuR/RefCounted.h"
#include "MuR/Types.h"
#include "Templates/SharedPointer.h"
#include "VectorTypes.h"
class UTexture;
class USkeletalMesh;
#define UE_API MUTABLERUNTIME_API
namespace mu
{
class FInputArchive;
class FOutputArchive;
class FParameters;
class FRangeIndex;
class FModel;
/** Model parameter types. */
enum class EParameterType : uint32
{
/** Undefined parameter type. */
None,
/** Boolean parameter type (true or false) */
Bool,
/** Integer parameter type. It usually has a limited range of possible values that can be queried in the FParameters object. */
Int,
/** Floating point value in the range of 0.0 to 1.0 */
Float,
/** Floating point RGBA colour, with each channel ranging from 0.0 to 1.0 */
Color,
/** 3D Projector type, defining a position, scale and orientation.Basically used for projected decals. */
Projector,
/** An externally provided image. */
Image,
/** An externally provided mesh. */
Mesh,
/** A text string. */
String,
/** A 4x4 matrix. */
Matrix,
/** Utility enumeration value, not really a parameter type. */
Count
};
/** Types of 3D projectors. */
enum class EProjectorType : uint32
{
/** Standard projector that uses an affine transform. */
Planar,
/** Projector that wraps the projected image around a cylinder*/
Cylindrical,
/** Smart projector that tries to follow the projected surface geometry to minimize streching. */
Wrapping,
/** Utility enumeration value, not really a projector type. */
Count
};
/** Type used to set or read multi-dimensional parameter values.
* If parameters have multiple values because of ranges, FRangeIndex can be used to specify
* what value is read or set in the methods of the Parameter class.
* FRangeIndex objects can be reused in multiple calls for the same parameter in the Parameter
* class interface even after changing the position values.
*/
class FRangeIndex
{
public:
/** Instances of this class must be obtained from a FParameters instance. */
FRangeIndex() = default;
//-----------------------------------------------------------------------------------------
// Own interface
//-----------------------------------------------------------------------------------------
//! Return the number of ranges (or dimensions) used by this index
UE_API int32 GetRangeCount() const;
//! Return the name of a range.
//! \param index Index of the range from 0 to GetRangeCount()-1
UE_API const FString& GetRangeName( int32 Index ) const;
//! Return the Guid of the parameter, resistant to parameter name changes.
//! \param index Index of the parameter from 0 to GetRangeCount()-1
UE_API const FString& GetRangeUid( int32 Index) const;
//! Set the position in one of the dimensions of the index.
//! \param index Index of the parameter from 0 to GetRangeCount()-1
UE_API void SetPosition( int32 Index, int32 Position );
//! Return the position in one of the dimensions of the index.
//! \param index Index of the parameter from 0 to GetRangeCount()-1
UE_API int32 GetPosition( int32 Index) const;
public:
friend class FParameters;
//! Run-time data
TSharedPtr<const FParameters> Parameters;
//! Index of the parameter for which we are a range index
int32 Parameter = -1;
//! Position in the several dimension of the range, as defined in Parameters
TArray<int32> Values;
};
/** This class represents the parameters of a model including description, type and
* value, and additional resources associated to the parameter.
*
* \warning Every object of this class holds a reference to the model that it was created from.
* This implies that while any instance of a FParameters object is alive, its model will not
* be freed.
*/
class FParameters : public TSharedFromThis<FParameters>
{
public:
//-----------------------------------------------------------------------------------------
// Life cycle
//-----------------------------------------------------------------------------------------
/** Instances of this class must be obtained from a Model instance. */
UE_API FParameters();
//! Serialisation
static UE_API void Serialise( const FParameters*, FOutputArchive& );
static UE_API TSharedPtr<FParameters> StaticUnserialise( FInputArchive& );
//! Deep clone this object.
UE_API TSharedPtr<FParameters> Clone() const;
/** */
UE_API ~FParameters();
//-----------------------------------------------------------------------------------------
// Own interface
//-----------------------------------------------------------------------------------------
//! Return the number of parameters
UE_API int32 GetCount() const;
//! Return the name of the parameter.
//! \param index Index of the parameter from 0 to GetCount()-1
UE_API const FString& GetName( int32 Index ) const;
//! Return the Guid of the parameter, resistant to parameter name changes.
//! \param index Index of the parameter from 0 to GetCount()-1
UE_API const FGuid& GetUid( int32 Index) const;
//! Find the parameter index by name.
//! It returns -1 if the parameter doesn't exist.
UE_API int32 Find( const FString& Name ) const;
//! Return the type of the parameter.
//! \param index Index of the parameter from 0 to GetCount()-1
UE_API EParameterType GetType( int32 Index) const;
//! Create a new FRangeIndex object to use to access a multi-dimensional parameter.
//! It will return nullptr if the parameter is not multidimensional.
UE_API TSharedPtr<FRangeIndex> NewRangeIndex( int32 ParamIndex) const;
//! Return the number of values other than the default that have been set to a specific
//! parameter.
UE_API int32 GetValueCount( int32 ParamIndex ) const;
//! Return the FRangeIndex of a value that has been set to a parameter.
//! \param paramIndex Index of the parameter from 0 to GetCount()-1
//! \param valueIndex Index of the value from 0 to GetValueCount()-1
UE_API TSharedPtr<FRangeIndex> GetValueIndex( int32 ParamIndex, int32 ValueIndex ) const;
//! Remove all the multidimensional values for a parameter. The current non-dimensional
//! value is kept.
UE_API void ClearAllValues( int32 ParamIndex);
//! Return the value of a boolean parameter.
//! \pre The parameter specified by index is a T_BOOL.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param pos Only for multidimensional parameters: relevant position to get in the ranges
UE_API bool GetBoolValue( int32 Index, const FRangeIndex* Pos =nullptr ) const;
//! Set the value of a parameter of type boolean.
//! \pre The parameter specified by index is a T_BOOL.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param value new value of the parameter
//! \param pos optional parameter to set a specific value for the given multidimensional
//! position. If null, the value is set for all possible positions.
UE_API void SetBoolValue( int32 Index, bool bValue, const FRangeIndex* Pos =nullptr );
//! Get the number of possible values for this integer parameter.
//! If the number is zero, it means any integer value is accepted.
UE_API int32 GetIntPossibleValueCount( int32 ParamIndex) const;
//! Get the value of one of the possible values for this integer.
//! The paramIndex is in the range of 0 to GetIntPossibleValueCount()-1
UE_API int32 GetIntPossibleValue( int32 ParamIndex, int32 ValueIndex) const;
//! Get the name of one of the possible values for this integer.
//! The paramIndex is in the range of 0 to GetIntPossibleValueCount()-1
UE_API const FString& GetIntPossibleValueName( int32 ParamIndex, int32 ValueIndex ) const;
//! Get the index of the value of one of the possible values for this integer.
//! The paramIndex is in the range of 0 to GetIntPossibleValueCount()-1
UE_API int32 GetIntValueIndex(int32 ParamIndex, const FString& ValueIndex) const;
//! Get the index of the value of one of the possible values for this integer.
//! The paramIndex is in the range of 0 to GetIntPossibleValueCount()-1
UE_API int32 GetIntValueIndex(int32 ParamIndex, int32 Value) const;
//! Return the value of a integer parameter.
//! \pre The parameter specified by index is a T_INT.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param pos Only for multidimensional parameters: relevant position to get in the ranges
UE_API int32 GetIntValue( int32 Index, const FRangeIndex* Pos=nullptr ) const;
//! If the parameter is of the integer type, set its value.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param value new value of the parameter. It must be in the possible values for this
//! parameter (see GetIntPossibleValue), or the method will leave the value unchanged.
//! \param pos Only for multidimensional parameters: relevant position to set in the ranges
UE_API void SetIntValue( int32 Index, int32 Value, const FRangeIndex* Pos=nullptr );
//! Return the value of a float parameter.
//! \pre The parameter specified by index is a T_FLOAT.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param pos Only for multidimensional parameters: relevant position to get in the ranges
UE_API float GetFloatValue( int32 Index, const FRangeIndex* Pos=nullptr ) const;
//! If the parameter is of the float type, set its value.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param value new value of the parameter
//! \param pos Only for multidimensional parameters: relevant position to set in the ranges
UE_API void SetFloatValue( int32 Index, float Value, const FRangeIndex* Pos=nullptr );
//! Return the value of a colour parameter.
//! \pre The parameter specified by index is a T_FLOAT.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param OutColor Values where every resulting colour channel will be stored
//! \param pos Only for multidimensional parameters: relevant position to get in the ranges
UE_API void GetColourValue( int32 Index, FVector4f& OutColor, const FRangeIndex* Pos=nullptr ) const;
//! If the parameter is of the colour type, set its value.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param r,g,b new value of the parameter
//! \param pos Only for multidimensional parameters: relevant position to set in the ranges
UE_API void SetColourValue( int32 Index, FVector4f Color, const FRangeIndex* Pos=nullptr );
//! Return the value of a projector parameter, as a 4x4 matrix. The matrix is supposed to be
//! a linear transform in column-major.
//! \pre The parameter specified by index is a T_PROJECTOR.
//! \param ParameterIndex Index of the parameter from 0 to GetCount()-1
//! \param OutPos Pointer to where the object-space position coordinates of the projector will be stored.
//! \param OutDir Pointer to where the object-space direction vector of the projector will be stored.
//! \param OutUp Pointer to where the object-space vertically up direction vector
//! of the projector will be stored. This controls the "roll" angle of the
//! projector.
//! \param OutScale Pointer to the projector-space scaling of the projector.
//! \param RangePosition Only for multidimensional parameters: relevant position to get in the ranges
UE_API void GetProjectorValue( int32 ParameterIndex,
EProjectorType* OutProjectionType,
FVector3f* OutPos,
FVector3f* OutDir,
FVector3f* OutUp,
FVector3f* OutScale,
float* OutProjectionAngle,
const FRangeIndex* RangePosition=nullptr ) const;
//! If the parameter is of the projector type, set its value.
//! \param ParameterIndex Index of the parameter from 0 to GetCount()-1
//! \param pos Object-space position coordinates of the projector.
//! \param dir Object-space direction vector of the projector.
//! \param up Object-space vertically up direction vector of the projector.
//! \param scale Projector-space scaling of the projector.
//! \param projectionAngle [only for Cylindrical projectors], the angle in radians of the
//! projection area on the cylinder surface.
//! \param RangePosition Only for multidimensional parameters: relevant position to set in the ranges
UE_API void SetProjectorValue( int32 ParameterIndex,
const FVector3f& Pos,
const FVector3f& Dir,
const FVector3f& Up,
const FVector3f& Scale,
float ProjectionAngle,
const FRangeIndex* RangePosition=nullptr );
//! Return the value of an image parameter.
//! \pre The parameter specified by index is a T_IMAGE.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param pos Only for multidimensional parameters: relevant position to set in the ranges
//! \return The externalId specified when setting the image value (\see SetImageValue)
UE_API UTexture* GetImageValue( int32 Index, const FRangeIndex* Pos = nullptr) const;
/** */
UE_API USkeletalMesh* GetMeshValue(int32 Index, const FRangeIndex* Pos = nullptr) const;
//! If the parameter is of the image type, set its value.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param externalId Application-specific id used to identify this image during replication.
//! \param pos Only for multidimensional parameters: relevant position to set in the ranges
UE_API void SetImageValue( int32 Index, UTexture* externalId, const FRangeIndex* = nullptr);
/** */
UE_API void SetMeshValue(int32 Index, USkeletalMesh* externalId, const FRangeIndex* = nullptr);
//! Return the value of a float parameter.
//! \pre The parameter specified by index is a T_FLOAT.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param pos Only for multidimensional parameters: relevant position to get in the ranges
UE_API void GetStringValue( int32 Index, FString& OutValue, const FRangeIndex* = nullptr) const;
//! If the parameter is of the float type, set its value.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param value new value of the parameter
//! \param pos Only for multidimensional parameters: relevant position to set in the ranges
UE_API void SetStringValue( int32 Index, const FString& Value, const FRangeIndex* = nullptr );
//! Return the value of a matrix parameter.
//! \pre The parameter specified by index is a T_MATRIX.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param pos Only for multidimensional parameters: relevant position to get in the ranges
UE_API void GetMatrixValue( int32 Index, FMatrix44f& OutValue, const FRangeIndex* = nullptr) const;
//! If the parameter is of the matrix type, set its value.
//! \param index Index of the parameter from 0 to GetCount()-1
//! \param value new value of the parameter
//! \param pos Only for multidimensional parameters: relevant position to set in the ranges
UE_API void SetMatrixValue( int32 Index, const FMatrix44f& Value, const FRangeIndex* Pos = nullptr );
//! Utility method to compare the values of a specific parameter with the values of another
//! FParameters object. It returns false if type or values are different.
UE_API bool HasSameValue( int32 ThisParamIndex, const TSharedPtr<const FParameters>& Other, int32 OtherParamIndex ) const;
//-----------------------------------------------------------------------------------------
// Interface pattern
//-----------------------------------------------------------------------------------------
class Private;
UE_API Private* GetPrivate() const;
private:
Private* m_pD;
};
}
#undef UE_API