/* * 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 Positions; UPROPERTY() TArray Indices; UPROPERTY() TArray Normals; UPROPERTY() TArray Tangents; UPROPERTY() TArray Binormals; UPROPERTY() TArray Colors; //UPROPERTY() //TArray> UVs; //TArray EdgeHardnesses; UPROPERTY() TArray FaceSmoothingMasks; UPROPERTY() TArray LightMapResolutions; UPROPERTY() TArray MaterialIndices; UPROPERTY() TArray 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 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 AllMeshSockets; // Cache of this HGPO split data //TArray SplitCache; };