Files
Andron666 9c38e93fa4 part7
2022-12-05 20:31:35 +05:00

404 lines
8.3 KiB
C++

/*
* Copyright (c) <2021> Side Effects Software Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. The name of Side Effects Software may not be used to endorse or
* promote products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY SIDE EFFECTS SOFTWARE "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL SIDE EFFECTS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#include "HoudiniEngineRuntimeCommon.h"
#include "HoudiniGeoPartObject.generated.h"
UENUM()
enum class EHoudiniGeoType : uint8
{
Invalid,
Default,
Intermediate,
Input,
Curve
};
UENUM()
enum class EHoudiniPartType : uint8
{
Invalid,
Mesh,
Instancer,
Curve,
Volume
};
UENUM()
enum class EHoudiniInstancerType : uint8
{
Invalid,
ObjectInstancer,
PackedPrimitive,
AttributeInstancer,
OldSchoolAttributeInstancer
};
USTRUCT()
struct HOUDINIENGINERUNTIME_API FHoudiniObjectInfo
{
GENERATED_USTRUCT_BODY()
FString Name = TEXT("");
int32 NodeId = -1;
int32 ObjectToInstanceID = -1;
bool bHasTransformChanged = false;
bool bHaveGeosChanged = false;
bool bIsVisible = false;
bool bIsInstancer = false;
bool bIsInstanced = false;
int32 GeoCount = -1;
};
USTRUCT()
struct HOUDINIENGINERUNTIME_API FHoudiniGeoInfo
{
GENERATED_USTRUCT_BODY()
EHoudiniGeoType Type = EHoudiniGeoType::Invalid;
FString Name = TEXT("");
int32 NodeId = -1;
bool bIsEditable = false;
bool bIsTemplated = false;
bool bIsDisplayGeo = false;
bool bHasGeoChanged = false;
bool bHasMaterialChanged = false;
int32 PartCount = -1;
int32 PointGroupCount = -1;
int32 PrimitiveGroupCount = -1;
};
USTRUCT()
struct HOUDINIENGINERUNTIME_API FHoudiniPartInfo
{
GENERATED_USTRUCT_BODY()
int32 PartId = -1;
FString Name = TEXT("");
EHoudiniPartType Type = EHoudiniPartType::Invalid;
int32 FaceCount = -1;
int32 VertexCount = -1;
int32 PointCount = -1;
int32 PointAttributeCounts = -1;
int32 VertexAttributeCounts = -1;
int32 PrimitiveAttributeCounts = -1;
int32 DetailAttributeCounts = -1;
bool bIsInstanced = false;
int32 InstancedPartCount = -1;
int32 InstanceCount = -1;
bool bHasChanged = false;
};
USTRUCT()
struct HOUDINIENGINERUNTIME_API FHoudiniVolumeInfo
{
GENERATED_USTRUCT_BODY()
FString Name = TEXT("");
bool bIsVDB = false; // replaces VolumeType Type;
int32 TupleSize = -1;
bool bIsFloat = false; // replaces StorageType StorageType;
int32 TileSize = -1;
FTransform Transform = FTransform::Identity;
bool bHasTaper = false;
int32 XLength = -1;
int32 YLength = -1;
int32 ZLength = -1;
int32 MinX = -1;
int32 MinY = -1;
int32 MinZ = -1;
float XTaper = 0.0f;
float YTaper = 0.0f;
};
USTRUCT()
struct HOUDINIENGINERUNTIME_API FHoudiniCurveInfo
{
GENERATED_USTRUCT_BODY()
EHoudiniCurveType Type = EHoudiniCurveType::Invalid;
int32 CurveCount = -1;
int32 VertexCount = -1;
int32 KnotCount = -1;
bool bIsPeriodic = false;
bool bIsRational = false;
int32 Order = -1;
bool bHasKnots = false;
};
USTRUCT()
struct HOUDINIENGINERUNTIME_API FHoudiniMeshSocket
{
GENERATED_USTRUCT_BODY()
// Equality operator, used by containers
bool operator==(const FHoudiniMeshSocket& InSocket) const
{
return Transform.Equals(InSocket.Transform)
&& Name == InSocket.Name
&& Actor == InSocket.Actor
&& Tag == InSocket.Tag;
}
// Members
FTransform Transform = FTransform::Identity;
FString Name = TEXT("Socket");
FString Actor = FString();
FString Tag = FString();
};
/*
USTRUCT()
struct HOUDINIENGINERUNTIME_API FHoudiniSplitDataCache
{
GENERATED_USTRUCT_BODY()
UPROPERTY()
FString SplitName;
//UPROPERTY()
//FHoudiniOutputObjectIdentifier SplitIdentifier;
//EHoudiniSplitType SplitType;
UPROPERTY()
TArray<FVector> Positions;
UPROPERTY()
TArray<uint32> Indices;
UPROPERTY()
TArray<FVector> Normals;
UPROPERTY()
TArray<FVector> Tangents;
UPROPERTY()
TArray<FVector> Binormals;
UPROPERTY()
TArray<FVector4> Colors;
//UPROPERTY()
//TArray<TArray<FVector2D>> UVs;
//TArray<bool> EdgeHardnesses;
UPROPERTY()
TArray<int32> FaceSmoothingMasks;
UPROPERTY()
TArray<int32> LightMapResolutions;
UPROPERTY()
TArray<int32> MaterialIndices;
UPROPERTY()
TArray<UMaterialInterface*> Materials;
UPROPERTY()
float lod_screensize;
UPROPERTY()
FKAggregateGeom AggregateCollisions;
};
*/
USTRUCT()
struct HOUDINIENGINERUNTIME_API FHoudiniGeoPartObject
{
public:
GENERATED_USTRUCT_BODY()
FHoudiniGeoPartObject();
// Indicates if this HGPO is valid
bool IsValid() const;
// Equality operator, used by containers
bool operator==(const FHoudiniGeoPartObject & GeoPartObject) const;
// Checks equality, with the possibility to ignore the HGPO's splits
bool Equals(const FHoudiniGeoPartObject & GeoPartObject, const bool& bIgnoreSplit) const;
// Comparison based on object/part/split name.
bool CompareNames(const FHoudiniGeoPartObject & HoudiniGeoPartObject, const bool& bIgnoreSplit) const;
void SetCustomPartName(const FString & InName);
static FString HoudiniPartTypeToString(const EHoudiniPartType& InType);
public:
// NodeId of corresponding HAPI Asset.
UPROPERTY()
int32 AssetId;
// Name of corresponding HDA.
UPROPERTY()
FString AssetName;
// NodeId of corresponding HAPI Object.
UPROPERTY()
int32 ObjectId;
// Name of associated object.
UPROPERTY()
FString ObjectName;
// NodeId of corresponding HAPI Geo.
UPROPERTY()
int32 GeoId;
// PartId of corresponding HAPI Part.
UPROPERTY()
int32 PartId;
// Name of associated part.
UPROPERTY()
FString PartName;
UPROPERTY()
bool bHasCustomPartName;
/*
// Type of the split.
UPROPERTY()
EHoudiniSplitType SplitType;
// Index of a split. In most cases this will be 0.
UPROPERTY()
int32 SplitIndex;
// Name of group which was used for splitting, empty if there's none.
UPROPERTY()
FString SplitName;
*/
// Split groups handled by this HGPO
UPROPERTY()
TArray<FString> SplitGroups;
// Transform of this geo part object.
UPROPERTY()
FTransform TransformMatrix;
// Path to the corresponding node
UPROPERTY()
FString NodePath;
// Indicates the type of the referenced object
UPROPERTY()
EHoudiniPartType Type;
// Indicates the type of instancer
UPROPERTY()
EHoudiniInstancerType InstancerType;
//
UPROPERTY()
FString VolumeName;
//
UPROPERTY()
int32 VolumeTileIndex;
// Is set to true when referenced object is visible.
UPROPERTY()
bool bIsVisible;
// Is set to true when referenced object is editable.
UPROPERTY()
bool bIsEditable;
// Is set to true when referenced object is templated.
UPROPERTY()
bool bIsTemplated;
// Is set to true when the referenced object is instanced.
UPROPERTY()
bool bIsInstanced;
// Indicates the parent geo has changed and needs to be rebuilt
UPROPERTY()
bool bHasGeoChanged;
// Indicates the part has changed and needs to be rebuilt
UPROPERTY()
bool bHasPartChanged;
// Indicates only the transform needs to be updated
UPROPERTY()
bool bHasTransformChanged;
// Indicates only the material needs to be updated
UPROPERTY()
bool bHasMaterialsChanged;
// Indicates this object has been loaded
bool bLoaded;
// We also keep a cache of the various info objects
// That we've extracted from HAPI
// ObjectInfo cache
FHoudiniObjectInfo ObjectInfo;
// GeoInfo cache
FHoudiniGeoInfo GeoInfo;
// PartInfo cache
FHoudiniPartInfo PartInfo;
// VolumeInfo cache
FHoudiniVolumeInfo VolumeInfo;
// CurveInfo cache
FHoudiniCurveInfo CurveInfo;
// Stores the Mesh Sockets found for a given HGPO
UPROPERTY()
TArray<FHoudiniMeshSocket> AllMeshSockets;
// Cache of this HGPO split data
//TArray<FHoudiniSplitDataCache> SplitCache;
};