682 lines
32 KiB
C++
682 lines
32 KiB
C++
/*
|
|
* Copyright (c) <2017> Side Effects Software Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "HoudiniAssetInput.h"
|
|
#include "HoudiniGeoPartObject.h"
|
|
#include "HoudiniCookHandler.h"
|
|
#include "Engine/StaticMesh.h"
|
|
#include "PhysicsEngine/AggregateGeom.h"
|
|
#include "Engine/StaticMeshSocket.h"
|
|
|
|
class UStaticMesh;
|
|
class UHoudiniAsset;
|
|
class ALandscapeProxy;
|
|
class AHoudiniAssetActor;
|
|
class USplineComponent;
|
|
class USkeletalMesh;
|
|
|
|
struct FRawMesh;
|
|
|
|
DECLARE_STATS_GROUP( TEXT( "HoudiniEngine" ), STATGROUP_HoudiniEngine, STATCAT_Advanced );
|
|
|
|
struct HOUDINIENGINERUNTIME_API UGenericAttribute
|
|
{
|
|
FString AttributeName;
|
|
|
|
HAPI_StorageType AttributeType;
|
|
int32 AttributeCount;
|
|
int32 AttributeTupleSize;
|
|
|
|
TArray< double > DoubleValues;
|
|
TArray< int64 > IntValues;
|
|
TArray< FString > StringValues;
|
|
|
|
double GetDoubleValue( int32 index = 0 )
|
|
{
|
|
if ( ( AttributeType == HAPI_STORAGETYPE_FLOAT ) || ( AttributeType == HAPI_STORAGETYPE_FLOAT64 ) )
|
|
{
|
|
if ( DoubleValues.IsValidIndex( index ) )
|
|
return DoubleValues[ index ];
|
|
}
|
|
else if ( ( AttributeType == HAPI_STORAGETYPE_INT ) || ( AttributeType == HAPI_STORAGETYPE_INT64 ) )
|
|
{
|
|
if ( IntValues.IsValidIndex( index ) )
|
|
return (double)IntValues[ index ];
|
|
}
|
|
else if ( AttributeType == HAPI_STORAGETYPE_STRING )
|
|
{
|
|
if ( StringValues.IsValidIndex( index ) )
|
|
return FCString::Atod( *StringValues[ index ] );
|
|
}
|
|
|
|
return 0.0f;
|
|
}
|
|
|
|
void GetDoubleTuple( TArray<double>& TupleValues, int32 index = 0 )
|
|
{
|
|
TupleValues.SetNumZeroed( AttributeTupleSize );
|
|
|
|
for ( int32 n = 0; n < AttributeTupleSize; n++ )
|
|
TupleValues[ n ] = GetDoubleValue( index * AttributeTupleSize + n );
|
|
}
|
|
|
|
int64 GetIntValue( int32 index = 0 )
|
|
{
|
|
if ( ( AttributeType == HAPI_STORAGETYPE_INT ) || ( AttributeType == HAPI_STORAGETYPE_INT64 ) )
|
|
{
|
|
if ( IntValues.IsValidIndex( index ) )
|
|
return IntValues[ index ];
|
|
}
|
|
else if ( ( AttributeType == HAPI_STORAGETYPE_FLOAT ) || ( AttributeType == HAPI_STORAGETYPE_FLOAT64 ) )
|
|
{
|
|
if ( DoubleValues.IsValidIndex( index ) )
|
|
return (int64)DoubleValues[ index ];
|
|
}
|
|
else if ( AttributeType == HAPI_STORAGETYPE_STRING )
|
|
{
|
|
if ( StringValues.IsValidIndex( index ) )
|
|
return FCString::Atoi64( *StringValues[ index ] );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void GetIntTuple( TArray<int64>& TupleValues, int32 index = 0 )
|
|
{
|
|
TupleValues.SetNumZeroed( AttributeTupleSize );
|
|
|
|
for ( int32 n = 0; n < AttributeTupleSize; n++ )
|
|
TupleValues[ n ] = GetIntValue( index * AttributeTupleSize + n );
|
|
}
|
|
|
|
FString GetStringValue( int32 index = 0 )
|
|
{
|
|
if ( AttributeType == HAPI_STORAGETYPE_STRING )
|
|
{
|
|
if ( StringValues.IsValidIndex( index ) )
|
|
return StringValues[ index ];
|
|
}
|
|
else if ( ( AttributeType == HAPI_STORAGETYPE_INT ) || ( AttributeType == HAPI_STORAGETYPE_INT64 ) )
|
|
{
|
|
if ( IntValues.IsValidIndex( index ) )
|
|
return FString::FromInt( (int32) IntValues[ index ] );
|
|
}
|
|
else if ( ( AttributeType == HAPI_STORAGETYPE_FLOAT ) || ( AttributeType == HAPI_STORAGETYPE_FLOAT64 ) )
|
|
{
|
|
if ( DoubleValues.IsValidIndex( index ) )
|
|
return FString::SanitizeFloat( DoubleValues[ index ] );
|
|
}
|
|
|
|
return FString();
|
|
}
|
|
|
|
void GetStringTuple( TArray<FString>& TupleValues, int32 index = 0 )
|
|
{
|
|
TupleValues.SetNumZeroed( AttributeTupleSize );
|
|
|
|
for ( int32 n = 0; n < AttributeTupleSize; n++ )
|
|
TupleValues[ n ] = GetStringValue( index * AttributeTupleSize + n );
|
|
}
|
|
|
|
bool GetBoolValue( int32 index = 0 )
|
|
{
|
|
if ( (AttributeType == HAPI_STORAGETYPE_FLOAT ) || ( AttributeType == HAPI_STORAGETYPE_FLOAT64 ) )
|
|
{
|
|
if ( DoubleValues.IsValidIndex( index ) )
|
|
return DoubleValues[ index ] == 0.0 ? false : true;
|
|
}
|
|
else if ( ( AttributeType == HAPI_STORAGETYPE_INT ) || ( AttributeType == HAPI_STORAGETYPE_INT64 ) )
|
|
{
|
|
if ( IntValues.IsValidIndex( index ) )
|
|
return IntValues[ index ] == 0 ? false : true;
|
|
}
|
|
else if ( AttributeType == HAPI_StorageType::HAPI_STORAGETYPE_STRING )
|
|
{
|
|
if ( StringValues.IsValidIndex( index ) )
|
|
return StringValues[ index ].Equals( TEXT( "true" ), ESearchCase::IgnoreCase ) ? true : false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void GetBoolTuple( TArray<bool>& TupleValues, int32 index = 0 )
|
|
{
|
|
TupleValues.SetNumZeroed( AttributeTupleSize );
|
|
|
|
for ( int32 n = 0; n < AttributeTupleSize; n++ )
|
|
TupleValues[ n ] = GetBoolValue( index * AttributeTupleSize + n );
|
|
}
|
|
|
|
void* GetData()
|
|
{
|
|
if ( AttributeType == HAPI_STORAGETYPE_STRING )
|
|
{
|
|
if ( StringValues.Num() > 0 )
|
|
return StringValues.GetData();
|
|
}
|
|
else if ( ( AttributeType == HAPI_STORAGETYPE_INT ) || ( AttributeType == HAPI_STORAGETYPE_INT64 ) )
|
|
{
|
|
if ( IntValues.Num() > 0 )
|
|
return IntValues.GetData();
|
|
}
|
|
else if ( ( AttributeType == HAPI_STORAGETYPE_FLOAT ) || ( AttributeType == HAPI_STORAGETYPE_FLOAT64 ) )
|
|
{
|
|
if ( DoubleValues.Num() > 0 )
|
|
return DoubleValues.GetData();
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
};
|
|
|
|
struct HOUDINIENGINERUNTIME_API FHoudiniEngineUtils
|
|
{
|
|
public:
|
|
|
|
/** Return a string description of error from a given error code. **/
|
|
static const FString GetErrorDescription( HAPI_Result Result );
|
|
|
|
/** Return a string error description. **/
|
|
static const FString GetErrorDescription();
|
|
|
|
/** Return a string indicating cook state. **/
|
|
static const FString GetCookState();
|
|
|
|
/** Return a string representing cooking result. **/
|
|
static const FString GetCookResult();
|
|
|
|
/** Return the errors, warning and message on a specified node **/
|
|
static const FString GetNodeErrorsWarningsAndMessages(const HAPI_NodeId& InNodeId);
|
|
|
|
/** Helper function for creating a temporary Slate notification. **/
|
|
static void CreateSlateNotification( const FString& NotificationString );
|
|
|
|
/** Return true if module has been properly initialized. **/
|
|
static bool IsInitialized();
|
|
|
|
/** Return type of license used. **/
|
|
static bool GetLicenseType( FString & LicenseType );
|
|
|
|
/** Return true if we are running Houdini Engine Indie license. **/
|
|
static bool IsLicenseHoudiniEngineIndie();
|
|
|
|
/** Return necessary buffer size to store preset information for a given asset. **/
|
|
static bool ComputeAssetPresetBufferLength( HAPI_NodeId AssetId, int32 & OutBufferLength );
|
|
|
|
/** Sets preset data for a given asset. **/
|
|
static bool SetAssetPreset( HAPI_NodeId AssetId, const TArray< char > & PresetBuffer );
|
|
|
|
/** Gets preset data for a given asset. **/
|
|
static bool GetAssetPreset( HAPI_NodeId AssetId, TArray< char > & PresetBuffer );
|
|
|
|
/** Return true if asset is valid. **/
|
|
static bool IsHoudiniNodeValid( const HAPI_NodeId& AssetId );
|
|
|
|
/** Destroy asset, returns the status. **/
|
|
static bool DestroyHoudiniAsset( HAPI_NodeId AssetId );
|
|
|
|
/** HAPI : Convert Unreal string to ascii one. **/
|
|
static void ConvertUnrealString( const FString & UnrealString, std::string & String );
|
|
|
|
/** HAPI : Translate HAPI transform to Unreal one. **/
|
|
static void TranslateHapiTransform( const HAPI_Transform & HapiTransform, FTransform & UnrealTransform );
|
|
|
|
/** HAPI : Translate HAPI Euler transform to Unreal one. **/
|
|
static void TranslateHapiTransform( const HAPI_TransformEuler & HapiTransformEuler, FTransform & UnrealTransform );
|
|
|
|
/** HAPI : Translate Unreal transform to HAPI one. **/
|
|
static void TranslateUnrealTransform( const FTransform & UnrealTransform, HAPI_Transform & HapiTransform );
|
|
|
|
/** HAPI : Translate Unreal transform to HAPI Euler one. **/
|
|
static void TranslateUnrealTransform( const FTransform & UnrealTransform, HAPI_TransformEuler & HapiTransformEuler );
|
|
|
|
/** HAPI : Set current HAPI time. **/
|
|
static bool SetCurrentTime( float CurrentTime );
|
|
|
|
/** Return name of Houdini asset. **/
|
|
static bool GetHoudiniAssetName( HAPI_NodeId AssetId, FString & NameString );
|
|
|
|
/** Construct static meshes for a given Houdini asset. **/
|
|
static bool CreateStaticMeshesFromHoudiniAsset(
|
|
HAPI_NodeId AssetId, FHoudiniCookParams& HoudiniCookParams,
|
|
bool ForceRebuildStaticMesh, bool ForceRecookAll,
|
|
const TMap< FHoudiniGeoPartObject, UStaticMesh * > & StaticMeshesIn,
|
|
TMap< FHoudiniGeoPartObject, UStaticMesh * > & StaticMeshesOut, FTransform & ComponentTransform );
|
|
|
|
/** Extract position information from coords string. **/
|
|
static void ExtractStringPositions( const FString & Positions, TArray< FVector > & OutPositions );
|
|
|
|
/** Create string containing positions from a given vector of positions. **/
|
|
static void CreatePositionsString( const TArray< FVector > & Positions, FString & PositionString );
|
|
|
|
/** Given raw positions incoming from HAPI, convert them to Unreal's FVector and perform necessary flipping and **/
|
|
/** scaling. **/
|
|
static void ConvertScaleAndFlipVectorData( const TArray< float > & DataRaw, TArray< FVector > & DataOut );
|
|
|
|
/** Returns platform specific name of libHAPI. **/
|
|
static FString HoudiniGetLibHAPIName();
|
|
|
|
/** Load libHAPI and return handle to it, also store location of loaded libHAPI in passed argument. **/
|
|
static void* LoadLibHAPI( FString & StoredLibHAPILocation );
|
|
|
|
/** Helper function to count number of UV sets in raw mesh. **/
|
|
static int32 CountUVSets( const FRawMesh & RawMesh );
|
|
|
|
/** Helper function to extract copied Houdini actor from clipboard. **/
|
|
static AHoudiniAssetActor * LocateClipboardActor( const AActor* IgnoreActor, const FString & ClipboardText );
|
|
|
|
/** Retrieves list of asset names contained within the HDA. **/
|
|
static bool GetAssetNames(
|
|
UHoudiniAsset * HoudiniAsset, HAPI_AssetLibraryId & AssetLibraryId,
|
|
TArray< HAPI_StringHandle > & AssetNames );
|
|
|
|
/** HAPI : Return true if given asset id is valid. **/
|
|
static bool IsValidNodeId( HAPI_NodeId AssetId );
|
|
|
|
/** HAPI : Create curve for input. **/
|
|
static bool HapiCreateCurveNode( HAPI_NodeId & CurveNodeId );
|
|
|
|
/** HAPI : Retrieve the asset node's object transform. **/
|
|
static bool HapiGetAssetTransform( HAPI_NodeId AssetId, FTransform & InTransform );
|
|
|
|
/** HAPI : Retrieve Node id from given parameters. **/
|
|
static bool HapiGetNodeId( HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId, HAPI_NodeId & NodeId );
|
|
|
|
/** HAPI: Retrieve Path to the given Node, relative to the given Node */
|
|
static bool HapiGetNodePath( HAPI_NodeId NodeId, HAPI_NodeId RelativeToNodeId, FString & OutPath );
|
|
|
|
/** HAPI : Retrieve HAPI_ObjectInfo's from given asset node id. **/
|
|
static bool HapiGetObjectInfos( HAPI_NodeId AssetId, TArray< HAPI_ObjectInfo > & ObjectInfos );
|
|
|
|
/** HAPI : Retrieve object transforms from given asset node id. **/
|
|
static bool HapiGetObjectTransforms( HAPI_NodeId AssetId, TArray< HAPI_Transform > & ObjectTransforms );
|
|
|
|
/** HAPI : Marshalling, extract landscape geometry and upload it. Return true on success. **/
|
|
static bool HapiCreateInputNodeForLandscape(
|
|
const HAPI_NodeId& HostAssetId, ALandscapeProxy * LandscapeProxy,
|
|
HAPI_NodeId & ConnectedAssetId, TArray< HAPI_NodeId >& OutCreatedNodeIds,
|
|
const bool& bExportOnlySelected, const bool& bExportCurves, const bool& bExportMaterials,
|
|
const bool& bExportAsMesh, const bool& bExportLighting, const bool& bExportNormalizedUVs,
|
|
const bool& bExportTileUVs, const FBox& AssetBounds, const bool& bExportAsHeightfield,
|
|
const bool& bAutoSelectComponents );
|
|
|
|
/** HAPI : Marshaling, extract geometry and create input asset for it - return true on success **/
|
|
static bool HapiCreateInputNodeForStaticMesh(
|
|
UStaticMesh * Mesh,
|
|
HAPI_NodeId & ConnectedAssetId,
|
|
TArray< HAPI_NodeId >& OutCreatedNodeIds,
|
|
class UStaticMeshComponent* StaticMeshComponent = nullptr,
|
|
const bool& ExportAllLODs = false,
|
|
const bool& ExportSockets = false );
|
|
|
|
/** HAPI : Marshaling, extract geometry and create input asset for it - return true on success **/
|
|
static bool HapiCreateInputNodeForObjects(
|
|
HAPI_NodeId HostAssetId,
|
|
TArray<UObject *>& InputObjects,
|
|
const TArray< FTransform >& InputTransforms,
|
|
HAPI_NodeId & ConnectedAssetId,
|
|
TArray< HAPI_NodeId >& OutCreatedNodeIds,
|
|
const bool& bExportSkeleton,
|
|
const bool& ExportAllLODs = false,
|
|
const bool& ExportSockets = false );
|
|
|
|
/** HAPI : Marshaling, extract geometry and create input asset for it - return true on success **/
|
|
static bool HapiCreateInputNodeForWorldOutliner(
|
|
HAPI_NodeId HostAssetId,
|
|
TArray< FHoudiniAssetInputOutlinerMesh > & OutlinerMeshArray,
|
|
HAPI_NodeId & ConnectedAssetId,
|
|
TArray< HAPI_NodeId >& OutCreatedNodeIds,
|
|
const float& SplineResolution = -1.0f,
|
|
const bool& ExportAllLODs = false,
|
|
const bool& ExportSockets = false );
|
|
|
|
/** HAPI : Marshaling, extract points from the Unreal Spline and create an input curve for it - return true on success **/
|
|
static bool HapiCreateInputNodeForSpline(
|
|
HAPI_NodeId HostAssetId,
|
|
USplineComponent * SplineComponent,
|
|
HAPI_NodeId & ConnectedAssetId,
|
|
FHoudiniAssetInputOutlinerMesh& OutlinerMesh,
|
|
const float& fSplineResolution = -1.0f);
|
|
|
|
static bool HapiCreateCurveInputNodeForData(
|
|
HAPI_NodeId HostAssetId,
|
|
HAPI_NodeId & ConnectedAssetId,
|
|
TArray<FVector>* Positions,
|
|
TArray<FQuat>* Rotations = nullptr,
|
|
TArray<FVector>* Scales3d = nullptr,
|
|
TArray<float>* UniformScales = nullptr,
|
|
bool ForceClose = false );
|
|
|
|
/** HAPI : Marshaling, extract geometry and skeleton and create input asset for it - return true on success **/
|
|
static bool HapiCreateInputNodeForSkeletalMesh(
|
|
HAPI_NodeId HostAssetId, USkeletalMesh * SkeletalMesh,
|
|
HAPI_NodeId & ConnectedAssetId, TArray< HAPI_NodeId >& OutCreatedNodeIds,
|
|
const bool& bExportSkeleton = true );
|
|
|
|
/** HAPI : Marshaling, extract skeleton and creates its Houdini equivalent - return true on success **/
|
|
static bool HapiCreateSkeletonFromData(
|
|
HAPI_NodeId HostAssetId,
|
|
USkeletalMesh * SkeletalMesh,
|
|
const HAPI_NodeInfo& SkelMeshNodeInfo,
|
|
TArray< HAPI_NodeId >& OutCreatedNodeIds );
|
|
|
|
/** HAPI : Marshaling, disconnect input asset from a given slot. **/
|
|
static bool HapiDisconnectAsset( HAPI_NodeId HostAssetId, int32 InputIndex );
|
|
|
|
/** HAPI : Set asset transform. **/
|
|
static bool HapiSetAssetTransform( HAPI_NodeId AssetId, const FTransform & Transform );
|
|
|
|
/** HAPI : Return all group names for a given Geo. **/
|
|
static bool HapiGetGroupNames(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId, HAPI_PartId PartId,
|
|
HAPI_GroupType GroupType, TArray< FString > & GroupNames, const bool& isPackedPrim);
|
|
|
|
/** HAPI : Retrieve group membership. **/
|
|
static bool HapiGetGroupMembership(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId, HAPI_PartId PartId,
|
|
HAPI_GroupType GroupType, const FString & GroupName, TArray< int32 > & GroupMembership );
|
|
|
|
/** HAPI : Get group count by type. **/
|
|
static int32 HapiGetGroupCountByType( HAPI_GroupType GroupType, HAPI_GeoInfo & GeoInfo );
|
|
|
|
/** HAPI : Get element count by group type. **/
|
|
static int32 HapiGetElementCountByGroupType( HAPI_GroupType GroupType, HAPI_PartInfo & PartInfo );
|
|
|
|
/** HAPI : Check if object geo part has group membership. **/
|
|
static bool HapiCheckGroupMembership(
|
|
const FHoudiniGeoPartObject & HoudiniGeoPartObject,
|
|
HAPI_GroupType GroupType, const FString & GroupName );
|
|
static bool HapiCheckGroupMembership(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId,
|
|
HAPI_PartId PartId, HAPI_GroupType GroupType, const FString & GroupName );
|
|
|
|
/** HAPI : Check if given attribute exists. **/
|
|
static bool HapiCheckAttributeExists(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId,
|
|
HAPI_PartId PartId, const char * Name, HAPI_AttributeOwner Owner );
|
|
static bool HapiCheckAttributeExists(
|
|
const FHoudiniGeoPartObject & HoudiniGeoPartObject,
|
|
const char * Name, HAPI_AttributeOwner Owner = HAPI_ATTROWNER_INVALID );
|
|
static bool HapiCheckAttributeExists(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId,
|
|
HAPI_PartId PartId, const char * Name );
|
|
|
|
/** HAPI: Returns all the attributes of a given type for a given owner **/
|
|
static int32 HapiGetAttributeOfType(
|
|
const HAPI_NodeId& AssetId, const HAPI_NodeId& ObjectId,
|
|
const HAPI_NodeId& GeoId, const HAPI_NodeId& PartId,
|
|
const HAPI_AttributeOwner& AttributeOwner,
|
|
const HAPI_AttributeTypeInfo& AttributeType,
|
|
TArray< HAPI_AttributeInfo >& MatchingAttributesInfo,
|
|
TArray< FString >& MatchingAttributesName );
|
|
|
|
/** HAPI : Get attribute data as float. **/
|
|
static bool HapiGetAttributeDataAsFloat(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId,
|
|
HAPI_PartId PartId, const char * Name, HAPI_AttributeInfo & ResultAttributeInfo, TArray< float > & Data,
|
|
int32 TupleSize = 0, HAPI_AttributeOwner Owner = HAPI_ATTROWNER_INVALID );
|
|
|
|
static bool HapiGetAttributeDataAsFloat(
|
|
const FHoudiniGeoPartObject & HoudiniGeoPartObject, const char * Name,
|
|
HAPI_AttributeInfo & ResultAttributeInfo, TArray< float > & Data, int32 TupleSize = 0, HAPI_AttributeOwner Owner = HAPI_ATTROWNER_INVALID );
|
|
|
|
/** HAPI : Get attribute data as integer. **/
|
|
static bool HapiGetAttributeDataAsInteger(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId,
|
|
HAPI_PartId PartId, const char* Name, HAPI_AttributeInfo & ResultAttributeInfo, TArray< int32 > & Data,
|
|
int32 TupleSize = 0, HAPI_AttributeOwner Owner = HAPI_ATTROWNER_INVALID );
|
|
|
|
static bool HapiGetAttributeDataAsInteger(
|
|
const FHoudiniGeoPartObject & HoudiniGeoPartObject, const char * Name,
|
|
HAPI_AttributeInfo & ResultAttributeInfo, TArray< int32 > & Data, int32 TupleSize = 0, HAPI_AttributeOwner Owner = HAPI_ATTROWNER_INVALID );
|
|
|
|
/** HAPI : Get attribute data as string. **/
|
|
static bool HapiGetAttributeDataAsString(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId,
|
|
HAPI_PartId PartId, const char * Name, HAPI_AttributeInfo & ResultAttributeInfo, TArray< FString > & Data,
|
|
int32 TupleSize = 0, HAPI_AttributeOwner Owner = HAPI_ATTROWNER_INVALID );
|
|
|
|
static bool HapiGetAttributeDataAsString(
|
|
const FHoudiniGeoPartObject & HoudiniGeoPartObject, const char * Name,
|
|
HAPI_AttributeInfo & ResultAttributeInfo, TArray< FString > & Data, int32 TupleSize = 0, HAPI_AttributeOwner Owner = HAPI_ATTROWNER_INVALID );
|
|
|
|
/** HAPI : Get parameter data as float. **/
|
|
static bool HapiGetParameterDataAsFloat(
|
|
HAPI_NodeId NodeId, const std::string ParmName, float DefaultValue, float & Value );
|
|
|
|
/** HAPI : Get parameter data as integer. **/
|
|
static bool HapiGetParameterDataAsInteger(
|
|
HAPI_NodeId NodeId, const std::string ParmName, int32 DefaultValue, int32 & Value );
|
|
|
|
/** HAPI : Get parameter data as string. **/
|
|
static bool HapiGetParameterDataAsString(
|
|
HAPI_NodeId NodeId, const std::string ParmName,
|
|
const FString & DefaultValue, FString & Value);
|
|
|
|
/** HAPI: Get a parameter's unit. **/
|
|
static bool HapiGetParameterUnit( const HAPI_NodeId& NodeId, const HAPI_ParmId& ParmId, FString& OutUnitString );
|
|
|
|
/** HAPI: Get a parameter's tag, return false if the tag doesnt exist**/
|
|
static bool HapiGetParameterTag(const HAPI_NodeId& NodeId, const HAPI_ParmId& ParmId, const FString& Tag, FString& TagValue);
|
|
|
|
/** HAPI: Get a parameter's noswap tag value. **/
|
|
static bool HapiGetParameterNoSwapTag( const HAPI_NodeId& NodeId, const HAPI_ParmId& ParmId, bool& NoSwapValue );
|
|
|
|
/** HAPI : Retrieve names of all parameters. **/
|
|
static void HapiRetrieveParameterNames( const TArray< HAPI_ParmInfo > & ParmInfos, TArray< FString > & Names );
|
|
static void HapiRetrieveParameterNames( const TArray< HAPI_ParmInfo > & ParmInfos, TArray< std::string > & Names );
|
|
|
|
/** HAPI : Look for a parameter by name or tag and returns its index. Returns -1 if not found. **/
|
|
static HAPI_ParmId HapiFindParameterByNameOrTag( const HAPI_NodeId& NodeId, const std::string ParmName );
|
|
static HAPI_ParmId HapiFindParameterByNameOrTag( const HAPI_NodeId& NodeId, const std::string ParmName, HAPI_ParmInfo& FoundParmInfo );
|
|
|
|
/** HAPI : Return a give node's parent ID, -1 if none **/
|
|
static HAPI_NodeId HapiGetParentNodeId( const HAPI_NodeId& NodeId );
|
|
#if WITH_EDITOR
|
|
|
|
/** Helper routine to check invalid lightmap faces. **/
|
|
static bool ContainsInvalidLightmapFaces( const FRawMesh & RawMesh, int32 LightmapSourceIdx );
|
|
|
|
#endif // WITH_EDITOR
|
|
|
|
/** HAPI : Retrieve instance transforms for a specified geo object. **/
|
|
static bool HapiGetInstanceTransforms(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId,
|
|
HAPI_PartId PartId, TArray< FTransform > & Transforms );
|
|
|
|
static bool HapiGetInstanceTransforms(
|
|
const FHoudiniGeoPartObject & HoudiniGeoPartObject,
|
|
TArray< FTransform > & Transforms );
|
|
|
|
/** HAPI : Given vertex list, retrieve new vertex list for a specified group. **/
|
|
/** Return number of processed valid index vertices for this split. **/
|
|
static int32 HapiGetVertexListForGroup(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId, HAPI_NodeId GeoId,
|
|
HAPI_PartId PartId, const FString & GroupName, const TArray< int32 > & FullVertexList,
|
|
TArray< int32 > & NewVertexList, TArray< int32 > & AllVertexList, TArray< int32 > & AllFaceList,
|
|
TArray< int32 > & AllCollisionFaceIndices, const bool& isPackedPrim );
|
|
|
|
/** HAPI : Retrieves the mesh sockets list for the current part **/
|
|
static int32 AddMeshSocketToList(
|
|
HAPI_NodeId AssetId, HAPI_NodeId ObjectId,
|
|
HAPI_NodeId GeoId, HAPI_PartId PartId,
|
|
TArray< FTransform >& AllSockets,
|
|
TArray< FString >& AllSocketsName,
|
|
TArray< FString >& AllSocketsActors,
|
|
TArray< FString >& AllSocketsTags,
|
|
const bool& isPackedPrim );
|
|
|
|
/** Add the mesh sockets in the list to the specified StaticMesh **/
|
|
static bool AddMeshSocketsToStaticMesh(
|
|
UStaticMesh* StaticMesh,
|
|
FHoudiniGeoPartObject& HoudiniGeoPartObject,
|
|
TArray< FTransform >& AllSockets,
|
|
TArray< FString >& AllSocketsNames,
|
|
TArray< FString >& AllSocketsActors,
|
|
TArray< FString >& AllSocketsTags );
|
|
|
|
/** Add the actor stored in the socket tag to the socket for the given static mesh component **/
|
|
static bool AddActorsToMeshSocket( UStaticMeshSocket* Socket, class UStaticMeshComponent* StaticMeshComponent );
|
|
|
|
/** Add the mesh aggregate collision geo to the specified StaticMesh **/
|
|
static bool AddAggregateCollisionGeometryToStaticMesh(
|
|
UStaticMesh* StaticMesh,
|
|
FHoudiniGeoPartObject& HoudiniGeoPartObject,
|
|
FKAggregateGeom& AggregateCollisionGeo );
|
|
|
|
/** Add convex hull to the mesh's aggregate collision geometry **/
|
|
static bool AddConvexCollisionToAggregate(
|
|
const TArray<float>& Positions, const TArray<int32>& SplitGroupVertexList,
|
|
const bool& MultiHullDecomp, FKAggregateGeom& AggregateCollisionGeo );
|
|
|
|
/** Add convex hull to the mesh's aggregate collision geometry **/
|
|
static bool AddSimpleCollision(
|
|
const FString& SplitGroupName, UStaticMesh* StaticMesh,
|
|
FHoudiniGeoPartObject& HoudiniGeoPartObject, FKAggregateGeom& AggregateCollisionGeo,
|
|
bool& bSimpleCollisionAddedToAggregate );
|
|
|
|
/** Updates all Uproperty attributes found on the given object **/
|
|
static void UpdateUPropertyAttributesOnObject(
|
|
UObject* MeshComponent, const FHoudiniGeoPartObject& HoudiniGeoPartObject );
|
|
|
|
/** Return a list with all the UProperty attributes found **/
|
|
static int32 GetUPropertyAttributeList(
|
|
const FHoudiniGeoPartObject& GeoPartObject,
|
|
TArray< UGenericAttribute >& AllUProps );
|
|
|
|
/** Return a list of all the generic attributes for a given attribute owner **/
|
|
static int32 GetGenericAttributeList(
|
|
const FHoudiniGeoPartObject& GeoPartObject,
|
|
const FString& GenericAttributePrefix,
|
|
TArray< UGenericAttribute >& AllUProps,
|
|
const HAPI_AttributeOwner& AttributeOwner,
|
|
int32 PrimitiveIndex = -1);
|
|
|
|
/** Tries to find a Uproperty by name/label on an object
|
|
FoundPropertyObject will be the object containing the uprop which may or not be ParentObject **/
|
|
static bool FindUPropertyAttributesOnObject(
|
|
UObject* ParentObject, const UGenericAttribute& UPropertiesToFind,
|
|
FProperty*& FoundProperty, UObject*& FoundPropertyObject, void*& StructContainer );
|
|
|
|
/** Modifies the value of a UProperty **/
|
|
static bool ModifyUPropertyValueOnObject(
|
|
UObject* MeshComponent, UGenericAttribute UPropertiesToFind,
|
|
FProperty* FoundProperty, void * StructContainer );
|
|
|
|
/** Tries to update values for all the UProperty attributes to apply on the object. **/
|
|
/*static void ApplyUPropertyAttributesOnObject(
|
|
UObject* MeshComponent, const TArray< UGenericAttribute >& UPropertiesToModify );*/
|
|
|
|
//static bool TryToFindInStructProperty( UObject* Object, FString UPropertyNameToFind, FStructProperty* ArrayProperty, FProperty*& FoundProperty, void*& StructContainer );
|
|
|
|
//static bool TryToFindInArrayProperty( UObject* Object, FString UPropertyNameToFind, FArrayProperty* ArrayProperty, FProperty*& FoundProperty, void*& StructContainer );
|
|
|
|
/** Helper function to extract a raw name from a given Fstring. Caller is responsible for clean up. **/
|
|
static char * ExtractRawName(const FString & Name);
|
|
|
|
/** Helper function for retrieving attribute infos and texture cooordinates of both "regular" uv attributes (uv1..uv7) and 16.5 uvs (texture type attributes) **/
|
|
static void GetAllUVAttributesInfoAndTexCoords(
|
|
const HAPI_NodeId& AssetId, const HAPI_NodeId& ObjectId,
|
|
const HAPI_NodeId& GeoId, const HAPI_NodeId& PartId,
|
|
TArray< HAPI_AttributeInfo >& AttribInfoUVs,
|
|
TArray< TArray< float > >& TextureCoordinates );
|
|
|
|
/** Helper function that will create groups or attribute for the given tag array **/
|
|
static bool CreateGroupOrAttributeFromTags(
|
|
const HAPI_NodeId& NodeId, const HAPI_PartId& PartId,
|
|
const TArray<FName>& Tags, const bool& bCreateAttributes = false );
|
|
|
|
// Helper function that extracts the unreal_tag_XX primitive attributes
|
|
static bool GetUnrealTagAttributes(
|
|
const FHoudiniGeoPartObject& HoudiniGeoPartObject, TArray<FName>& OutTags);
|
|
|
|
protected:
|
|
|
|
#if PLATFORM_WINDOWS
|
|
/** Attempt to locate libHAPI on Windows in the registry. Return handle if located and return location. **/
|
|
static void* LocateLibHAPIInRegistry(
|
|
const FString & HoudiniInstallationType, FString & StoredLibHAPILocation, bool LookIn32bitRegistry);
|
|
#endif
|
|
public:
|
|
|
|
/** Helper function to extract colors and store them in a given RawMesh. Returns number of wedges. **/
|
|
static int32 TransferRegularPointAttributesToVertices(
|
|
const TArray< int32 > & VertexList, const HAPI_AttributeInfo & AttribInfo, TArray< float > & Data );
|
|
|
|
/** Helper function to extract colors and store them in a given RawMesh. Returns number of wedges. **/
|
|
static int32 TransferRegularPointAttributesToVertices(
|
|
const TArray< int32 > & VertexList, const HAPI_AttributeInfo & AttribInfo,
|
|
const TArray< float > & Data, TArray< float >& VertexData );
|
|
|
|
#if WITH_EDITOR
|
|
|
|
/** Helper routine to check if Raw Mesh contains degenerate triangles. **/
|
|
static bool ContainsDegenerateTriangles( const FRawMesh & RawMesh );
|
|
|
|
/** Helper routine to count number of degenerate triangles. **/
|
|
static int32 CountDegenerateTriangles( const FRawMesh & RawMesh );
|
|
|
|
/** Create helper array of material names, we use it for marshalling. **/
|
|
static void CreateFaceMaterialArray(
|
|
const TArray< UMaterialInterface * >& Materials,
|
|
const TArray< int32 > & FaceMaterialIndices,
|
|
TArray< char * > & OutStaticMeshFaceMaterials );
|
|
|
|
/** Delete helper array of material names. **/
|
|
static void DeleteFaceMaterialArray( TArray< char * > & OutStaticMeshFaceMaterials );
|
|
|
|
#endif // WITH_EDITOR
|
|
|
|
/** Return a specified HAPI status string. **/
|
|
static const FString GetStatusString( HAPI_StatusType status_type, HAPI_StatusVerbosity verbosity );
|
|
|
|
/** Extract all unique material ids for all geo object parts. **/
|
|
static bool ExtractUniqueMaterialIds(
|
|
const HAPI_AssetInfo & AssetInfo, TSet< HAPI_NodeId > & MaterialIds,
|
|
TSet< HAPI_NodeId > & InstancerMaterialIds,
|
|
TMap< FHoudiniGeoPartObject, HAPI_NodeId > & InstancerMaterialMap );
|
|
|
|
/** Pick vertex color from texture mip level. **/
|
|
static FColor PickVertexColorFromTextureMip(
|
|
const uint8 * MipBytes, FVector2D & UVCoord, int32 MipWidth, int32 MipHeight );
|
|
|
|
protected:
|
|
static FString ComputeVersionString(bool ExtraDigit);
|
|
#if WITH_EDITOR
|
|
|
|
/** Reset streams used by the given RawMesh. **/
|
|
static void ResetRawMesh( FRawMesh & RawMesh );
|
|
|
|
#endif // WITH_EDITOR
|
|
|
|
public:
|
|
|
|
/** How many GUID symbols are used for package component name generation. **/
|
|
static const int32 PackageGUIDComponentNameLength;
|
|
|
|
/** How many GUID symbols are used for package item name generation. **/
|
|
static const int32 PackageGUIDItemNameLength;
|
|
};
|