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

863 lines
26 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 <functional>
#include "HoudiniSplineComponent.h"
#include "HoudiniGeoPartObject.h"
#include "CoreTypes.h"
#include "Materials/MaterialInterface.h"
#include "UObject/Object.h"
#include "UObject/ObjectMacros.h"
#include "Engine/Brush.h"
#include "Engine/Polys.h"
#include "UObject/SoftObjectPtr.h"
#include "HoudiniInputObject.generated.h"
class UStaticMesh;
class USkeletalMesh;
class USceneComponent;
class UStaticMeshComponent;
class UInstancedStaticMeshComponent;
class USplineComponent;
class UHoudiniAssetComponent;
class AActor;
class ALandscapeProxy;
class ABrush;
class UHoudiniInput;
class ALandscapeProxy;
class UModel;
class UHoudiniInput;
class UCameraComponent;
UENUM()
enum class EHoudiniInputObjectType : uint8
{
Invalid,
Object,
StaticMesh,
SkeletalMesh,
SceneComponent,
StaticMeshComponent,
InstancedStaticMeshComponent,
SplineComponent,
HoudiniSplineComponent,
HoudiniAssetComponent,
Actor,
Landscape,
Brush,
CameraComponent,
DataTable,
HoudiniAssetActor,
FoliageType_InstancedStaticMesh,
};
//-----------------------------------------------------------------------------------------------------------------------------
// UObjects input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputObject : public UObject
{
GENERATED_UCLASS_BODY()
public:
// Create the proper input object
static UHoudiniInputObject * CreateTypedInputObject(UObject * InObject, UObject* InOuter, const FString& InParamName);
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
// Check whether two input objects match
virtual bool Matches(const UHoudiniInputObject& Other) const;
//
static EHoudiniInputObjectType GetInputObjectTypeFromObject(UObject* InObject);
//
virtual void Update(UObject * InObject);
// Invalidate and ask for the deletion of this input object's node
virtual void InvalidateData();
// UObject accessor
virtual UObject* GetObject() const;
// Indicates if this input has changed and should be updated
virtual bool HasChanged() const { return bHasChanged; };
// Indicates if this input has changed and should be updated
virtual bool HasTransformChanged() const { return bTransformChanged; };
// Indicates if this input needs to trigger an update
virtual bool NeedsToTriggerUpdate() const { return bNeedsToTriggerUpdate; };
virtual void MarkChanged(const bool& bInChanged) { bHasChanged = bInChanged; SetNeedsToTriggerUpdate(bInChanged); };
void MarkTransformChanged(const bool& bInChanged) { bTransformChanged = bInChanged; SetNeedsToTriggerUpdate(bInChanged); };
virtual void SetNeedsToTriggerUpdate(const bool& bInTriggersUpdate) { bNeedsToTriggerUpdate = bInTriggersUpdate; };
void SetImportAsReference(const bool& bInImportAsRef) { bImportAsReference = bInImportAsRef; };
bool GetImportAsReference() const { return bImportAsReference; };
#if WITH_EDITOR
void SwitchUniformScaleLock() { bUniformScaleLocked = !bUniformScaleLocked; };
bool IsUniformScaleLocked() const { return bUniformScaleLocked; };
void PostEditUndo() override;
#endif
virtual UHoudiniInputObject* DuplicateAndCopyState(UObject* DestOuter);
virtual void CopyStateFrom(UHoudiniInputObject* InInput, bool bCopyAllProperties);
// Set whether this object can delete Houdini nodes.
virtual void SetCanDeleteHoudiniNodes(bool bInCanDeleteNodes);
bool CanDeleteHoudiniNodes() const { return bCanDeleteHoudiniNodes; }
FGuid GetInputGuid() const { return Guid; }
protected:
virtual void BeginDestroy() override;
public:
// The object referenced by this input
// This property should be protected. Don't access this directly. Use GetObject() / Update() instead.
UPROPERTY()
TSoftObjectPtr<UObject> InputObject;
// The object's transform/transform offset
UPROPERTY()
FTransform Transform;
// The type of Object this input refers to
UPROPERTY()
EHoudiniInputObjectType Type;
// This input object's "main" (SOP) NodeId
UPROPERTY(Transient, DuplicateTransient, NonTransactional)
int32 InputNodeId;
// This input object's "container" (OBJ) NodeId
UPROPERTY(Transient, DuplicateTransient, NonTransactional)
int32 InputObjectNodeId;
// Guid that uniquely identifies this input object.
// Also useful to correlate inputs between blueprint component templates and instances.
UPROPERTY(DuplicateTransient)
FGuid Guid;
protected:
// Indicates this input object has changed
UPROPERTY(DuplicateTransient)
bool bHasChanged;
// Indicates this input object should trigger an input update/cook
UPROPERTY(DuplicateTransient)
bool bNeedsToTriggerUpdate;
// Indicates that this input transform should be updated
UPROPERTY(DuplicateTransient)
bool bTransformChanged;
UPROPERTY()
bool bImportAsReference;
// Indicates if change the scale of Transfrom Offset of this object uniformly
#if WITH_EDITORONLY_DATA
UPROPERTY(Transient, DuplicateTransient, NonTransactional)
bool bUniformScaleLocked;
#endif
UPROPERTY()
bool bCanDeleteHoudiniNodes;
};
//-----------------------------------------------------------------------------------------------------------------------------
// UStaticMesh input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputStaticMesh : public UHoudiniInputObject
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
// UHoudiniInputObject overrides
// virtual void DuplicateAndCopyState(UObject* DestOuter, UHoudiniInputObject*& OutNewObject) override;
virtual void CopyStateFrom(UHoudiniInputObject* InInput, bool bCopyAllProperties) override;
virtual void SetCanDeleteHoudiniNodes(bool bInCanDeleteNodes) override;
virtual void InvalidateData() override;
//
virtual void Update(UObject * InObject) override;
// Nothing to add for Static Meshes?
// StaticMesh accessor
virtual class UStaticMesh* GetStaticMesh() const;
// Blueprint accessor
virtual class UBlueprint* GetBlueprint() const;
// Check if this SM Input object is passed in as a BP
virtual bool bIsBlueprint() const;
// The Blueprint's Static Meshe Components that can be sent as inputs
UPROPERTY()
TArray<UHoudiniInputStaticMesh*> BlueprintStaticMeshes;
};
//-----------------------------------------------------------------------------------------------------------------------------
// USkeletalMesh input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputSkeletalMesh : public UHoudiniInputObject
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
//
virtual void Update(UObject * InObject) override;
// Nothing to add for SkeletalMesh Meshes?
// StaticMesh accessor
class USkeletalMesh* GetSkeletalMesh();
};
//-----------------------------------------------------------------------------------------------------------------------------
// USceneComponent input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputSceneComponent : public UHoudiniInputObject
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
//
virtual void Update(UObject * InObject) override;
// SceneComponent accessor
class USceneComponent* GetSceneComponent();
// Returns true if the attached actor's (parent) transform has been modified
virtual bool HasActorTransformChanged() const;
// Returns true if the attached component's transform has been modified
virtual bool HasComponentTransformChanged() const;
// Return true if the component itself has been modified
virtual bool HasComponentChanged() const;
public:
// This component's parent Actor transform
UPROPERTY()
FTransform ActorTransform = FTransform::Identity;
};
//-----------------------------------------------------------------------------------------------------------------------------
// UStaticMeshComponent input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputMeshComponent : public UHoudiniInputSceneComponent
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
//
virtual void Update(UObject * InObject) override;
// StaticMeshComponent accessor
UStaticMeshComponent* GetStaticMeshComponent();
// Get the referenced StaticMesh
UStaticMesh* GetStaticMesh();
// Returns true if the attached component's materials have been modified
bool HasComponentMaterialsChanged() const;
// Return true if SMC's static mesh has been modified
virtual bool HasComponentChanged() const override;
public:
// Keep track of the selected Static Mesh
UPROPERTY()
TSoftObjectPtr<class UStaticMesh> StaticMesh = nullptr;
// Path to the materials assigned on the SMC
UPROPERTY()
TArray<FString> MeshComponentsMaterials;
};
//-----------------------------------------------------------------------------------------------------------------------------
// UInstancedStaticMeshComponent input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputInstancedMeshComponent : public UHoudiniInputMeshComponent
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
//
virtual void Update(UObject * InObject) override;
// InstancedStaticMeshComponent accessor
UInstancedStaticMeshComponent* GetInstancedStaticMeshComponent();
// Returns true if the instances have changed
bool HasInstancesChanged() const;
// Returns true if the attached component's transform has been modified
virtual bool HasComponentTransformChanged() const override;
public:
// Array of transform for this ISMC's instances
UPROPERTY()
TArray<FTransform> InstanceTransforms;
};
//-----------------------------------------------------------------------------------------------------------------------------
// USplineComponent input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputSplineComponent : public UHoudiniInputSceneComponent
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
//
virtual void Update(UObject * InObject) override;
// USplineComponent accessor
USplineComponent* GetSplineComponent();
// Returns true if the attached spline component has been modified
bool HasSplineComponentChanged(float fCurrentSplineResolution) const;
// Returns true if the attached actor's (parent) transform has been modified
virtual bool HasActorTransformChanged() const;
// Returns true if the attached component's transform has been modified
virtual bool HasComponentTransformChanged() const;
// Return true if the component itself has been modified
virtual bool HasComponentChanged() const;
public:
// Number of CVs used by the spline component, used to detect modification
UPROPERTY()
int32 NumberOfSplineControlPoints = -1;
// Spline Length, used for fast detection of modifications of the spline..
UPROPERTY()
float SplineLength = -1.0f;
// Spline resolution used to generate the asset, used to detect setting modification
UPROPERTY()
float SplineResolution = -1.0f;
// Is the spline closed?
UPROPERTY()
bool SplineClosed = false;
// Transforms of each of the spline's control points
UPROPERTY()
TArray<FTransform> SplineControlPoints;
};
//-----------------------------------------------------------------------------------------------------------------------------
// UHoudiniSplineComponent input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputHoudiniSplineComponent : public UHoudiniInputObject
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
virtual void Update(UObject * InObject) override;
virtual UObject* GetObject() const override;
virtual void MarkChanged(const bool& bInChanged) override;
virtual void SetNeedsToTriggerUpdate(const bool& bInTriggersUpdate) override;
// Indicates if this input has changed and should be updated
virtual bool HasChanged() const override;
// Indicates if this input needs to trigger an update
virtual bool NeedsToTriggerUpdate() const override;
// UHoudiniSplineComponent accessor
UHoudiniSplineComponent* GetCurveComponent() const;
public:
// The type of curve (polygon, NURBS, bezier)
UPROPERTY()
EHoudiniCurveType CurveType = EHoudiniCurveType::Polygon;
// The curve's method (CVs, Breakpoint, Freehand)
UPROPERTY()
EHoudiniCurveMethod CurveMethod = EHoudiniCurveMethod::CVs;
UPROPERTY()
bool Reversed = false;
protected:
// NOTE: We are using this reference to the component since the component, for now,
// lives on the same actor as this input object. If we use a Soft Object Reference instead the editor
// will complain about breaking references everytime we try to delete the actor.
UPROPERTY(Instanced)
UHoudiniSplineComponent* CachedComponent;
};
//-----------------------------------------------------------------------------------------------------------------------------
// UCameraComponent input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputCameraComponent : public UHoudiniInputSceneComponent
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
//
virtual void Update(UObject * InObject) override;
// UCameraComponent accessor
UCameraComponent* GetCameraComponent();
// Return true if SMC's static mesh has been modified
virtual bool HasComponentChanged() const override;
public:
UPROPERTY()
float FOV;
UPROPERTY()
float AspectRatio;
UPROPERTY()
//TEnumAsByte<ECameraProjectionMode::Type> ProjectionType;
bool bIsOrthographic;
UPROPERTY()
float OrthoWidth;
UPROPERTY()
float OrthoNearClipPlane;
UPROPERTY()
float OrthoFarClipPlane;
};
//-----------------------------------------------------------------------------------------------------------------------------
// UHoudiniAssetComponent input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputHoudiniAsset : public UHoudiniInputObject
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
//
virtual void Update(UObject * InObject) override;
// UHoudiniAssetComponent accessor
UHoudiniAssetComponent* GetHoudiniAssetComponent();
public:
// The output index of the node that we want to use as input
UPROPERTY()
int32 AssetOutputIndex;
};
//-----------------------------------------------------------------------------------------------------------------------------
// AActor input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputActor : public UHoudiniInputObject
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
//
virtual void Update(UObject * InObject) override;
//
virtual bool HasActorTransformChanged();
// Return true if any content of this actor has possibly changed (for example geometry edits on a
// Brush or changes on procedurally generated content).
// NOTE: This is more generally applicable and could be moved to the HoudiniInputObject class.
virtual bool HasContentChanged() const;
// AActor accessor
AActor* GetActor();
const TArray<UHoudiniInputSceneComponent*>& GetActorComponents() const { return ActorComponents; }
// The number of components added with the last call to Update
int32 GetLastUpdateNumComponentsAdded() const { return LastUpdateNumComponentsAdded; }
// The number of components remove with the last call to Update
int32 GetLastUpdateNumComponentsRemoved() const { return LastUpdateNumComponentsRemoved; }
protected:
// The actor's components that can be sent as inputs
UPROPERTY()
TArray<UHoudiniInputSceneComponent*> ActorComponents;
// The USceneComponents the actor had the last time we called Update (matches the ones in ActorComponents).
UPROPERTY()
TSet<TSoftObjectPtr<UObject>> ActorSceneComponents;
// The number of components added with the last call to Update
UPROPERTY()
int32 LastUpdateNumComponentsAdded;
// The number of components remove with the last call to Update
UPROPERTY()
int32 LastUpdateNumComponentsRemoved;
};
//-----------------------------------------------------------------------------------------------------------------------------
// ALandscapeProxy input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputLandscape : public UHoudiniInputActor
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
//
virtual void Update(UObject * InObject) override;
virtual bool HasActorTransformChanged() override;
// ALandscapeProxy accessor
ALandscapeProxy* GetLandscapeProxy();
void SetLandscapeProxy(UObject* InLandscapeProxy);
// Used to restore an input landscape's transform to its original state
UPROPERTY()
FTransform CachedInputLandscapeTraqnsform;
};
//-----------------------------------------------------------------------------------------------------------------------------
// ABrush input
//-----------------------------------------------------------------------------------------------------------------------------
// Cache info for a brush in order to determine whether it has changed.
#define BRUSH_HASH_SURFACE_PROPERTIES 0
//USTRUCT()
//struct FHoudiniBrushSurfaceInfo {
// GENERATED_BODY()
//
// FVector Base;
// FVector Normal;
// FVector TextureU;
// FVector TextureV;
// TSoftObjectPtr<UMaterialInterface> Material;
//
// FHoudiniBrushSurfaceInfo(const FVector& InBase, const FVector& InNormal, const FVector& InTextureU, const FVector& InTextureV, UMaterialInterface* InMaterial)
// : Base(InBase)
// , Normal(InNormal)
// , TextureU(InTextureU)
// , TextureV(InTextureV)
// , Material(InMaterial)
// { }
//
// inline bool operator==(const FHoudiniBrushSurfaceInfo& Other) {
// return Base.Equals(Other.Base)
// && Normal.Equals(Other.Normal)
// && TextureU.Equals(Other.TextureU)
// && TextureV.Equals(Other.TextureV)
// && Material.Get() == Other.Material.Get();
// }
//
// inline bool operator==(const FPoly& Poly) {
// return Base.Equals(Poly.Base)
// && Normal.Equals(Poly.Normal)
// && TextureU.Equals(Poly.TextureU)
// && TextureV.Equals(Poly.TextureV)
// && Material.Get() == Poly.Material;
// }
//};
USTRUCT()
struct FHoudiniBrushInfo
{
GENERATED_BODY()
UPROPERTY()
TWeakObjectPtr<ABrush> BrushActor;
UPROPERTY()
FTransform CachedTransform;
UPROPERTY()
FVector CachedOrigin;
UPROPERTY()
FVector CachedExtent;
UPROPERTY()
TEnumAsByte<EBrushType> CachedBrushType;
UPROPERTY()
uint64 CachedSurfaceHash;
bool HasChanged() const;
static int32 GetNumVertexIndicesFromModel(const UModel* Model);
FHoudiniBrushInfo();
FHoudiniBrushInfo(ABrush* InBrushActor);
template <class T>
inline void HashCombine(uint64& s, const T & v) const
{
std::hash<T> h;
s^= h(v) + 0x9e3779b9 + (s<< 6) + (s>> 2);
}
inline void HashCombine(uint64& s, const FVector & V) const
{
HashCombine(s, V.X);
HashCombine(s, V.Y);
HashCombine(s, V.Z);
}
inline void CombinePolyHash(uint64& Hash, const FPoly& Poly) const
{
HashCombine(Hash, Poly.Base);
HashCombine(Hash, Poly.TextureU);
HashCombine(Hash, Poly.TextureV);
HashCombine(Hash, Poly.Normal);
// Do not add addresses to the hash, otherwise it would force a recook every unreal session!
// HashCombine(Hash, (uint64)(Poly.Material));
}
};
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputBrush : public UHoudiniInputActor
{
GENERATED_BODY()
public:
UHoudiniInputBrush();
// Factory function
static UHoudiniInputBrush* Create(UObject* InObject, UObject* InOuter, const FString& InName);
//----------------------------------------------------------------------
// UHoudiniInputActor Interface - Begin
//----------------------------------------------------------------------
virtual void Update(UObject * InObject) override;
// Indicates if this input has changed and should be updated
virtual bool HasContentChanged() const override;
// Indicates if this input has changed and should be updated
virtual bool HasChanged() const override { return (!bIgnoreInputObject) && bHasChanged; };
// Indicates if this input has changed and should be updated
virtual bool HasTransformChanged() const override { return (!bIgnoreInputObject) && bTransformChanged; };
virtual bool HasActorTransformChanged() override;
virtual bool NeedsToTriggerUpdate() const override { return (!bIgnoreInputObject) && bNeedsToTriggerUpdate; };
//----------------------------------------------------------------------
// UHoudiniInputActor Interface - End
//----------------------------------------------------------------------
// ABrush accessor
ABrush* GetBrush() const;
UModel* GetCachedModel() const;
// Check whether any of the brushes, or their transforms, used to generate this model have changed.
bool HasBrushesChanged(const TArray<ABrush*>& InBrushes) const;
// Cache the combined model as well as the input brushes.
void UpdateCachedData(UModel* InCombinedModel, const TArray<ABrush*>& InBrushes);
// Returns whether this input object should be ignored when uploading objects to Houdini.
// This mechanism could be implemented on UHoudiniInputObject.
bool ShouldIgnoreThisInput();
// Find only the subtractive brush actors that intersect with the InputObject (Brush actor) bounding box but
// excluding any selector bounds actors.
static bool FindIntersectingSubtractiveBrushes(const UHoudiniInputBrush* InputBrush, TArray<ABrush*>& OutBrushes);
protected:
UPROPERTY()
TArray<FHoudiniBrushInfo> BrushesInfo;
UPROPERTY(Transient, DuplicateTransient)
UModel* CombinedModel;
UPROPERTY()
bool bIgnoreInputObject;
UPROPERTY()
TEnumAsByte<EBrushType> CachedInputBrushType;
};
//-----------------------------------------------------------------------------------------------------------------------------
// UDataTable input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputDataTable : public UHoudiniInputObject
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
// DataTable accessor
class UDataTable* GetDataTable() const;
};
//-----------------------------------------------------------------------------------------------------------------------------
// UFoliageType_InstancedStaticMesh input
//-----------------------------------------------------------------------------------------------------------------------------
UCLASS()
class HOUDINIENGINERUNTIME_API UHoudiniInputFoliageType_InstancedStaticMesh : public UHoudiniInputStaticMesh
{
GENERATED_UCLASS_BODY()
public:
//
static UHoudiniInputObject* Create(UObject * InObject, UObject* InOuter, const FString& InName);
// UHoudiniInputObject overrides
// virtual void DuplicateAndCopyState(UObject* DestOuter, UHoudiniInputObject*& OutNewObject) override;
virtual void CopyStateFrom(UHoudiniInputObject* InInput, bool bCopyAllProperties) override;
//
virtual void Update(UObject * InObject) override;
// StaticMesh accessor
virtual class UStaticMesh* GetStaticMesh() const override;
virtual class UBlueprint* GetBlueprint() const override { return nullptr; }
virtual bool bIsBlueprint() const override { return false; }
};