From 82c6753c67f924fb8e385c1234d5a6b37eb2777e Mon Sep 17 00:00:00 2001
From: KeyToon9 <zitong2000@hotmail.com>
Date: Mon, 22 May 2023 00:50:20 +0800
Subject: [PATCH] Add StaticMeshMethod and MeshBuildSettings modification
 support for ProcessHDA blueprint node

---
 .../Private/HoudiniPublicAPI.cpp              |  9 ++++
 .../Private/HoudiniPublicAPIAssetWrapper.cpp  | 46 +++++++++++++++++++
 .../HoudiniPublicAPIProcessHDANode.cpp        |  6 +++
 .../Public/HoudiniPublicAPI.h                 |  5 ++
 .../Public/HoudiniPublicAPIAssetWrapper.h     | 12 +++++
 .../Public/HoudiniPublicAPIProcessHDANode.h   | 12 +++++
 6 files changed, 90 insertions(+)

diff --git a/Source/HoudiniEngineEditor/Private/HoudiniPublicAPI.cpp b/Source/HoudiniEngineEditor/Private/HoudiniPublicAPI.cpp
index a2008e3f93..bd6c599264 100755
--- a/Source/HoudiniEngineEditor/Private/HoudiniPublicAPI.cpp
+++ b/Source/HoudiniEngineEditor/Private/HoudiniPublicAPI.cpp
@@ -32,6 +32,7 @@
 #include "HoudiniPublicAPIAssetWrapper.h"
 #include "HoudiniPublicAPIInputTypes.h"
 #include "HoudiniEngineCommands.h"
+#include "HoudiniAssetComponent.h"
 
 #include "Engine/World.h"
 
@@ -78,6 +79,8 @@ UHoudiniPublicAPI::InstantiateAsset_Implementation(
 	const bool bInEnableAutoBake,
 	const FString& InBakeDirectoryPath,
 	const EHoudiniEngineBakeOption InBakeMethod,
+	const EHoudiniStaticMeshMethod InStaticMeshMethod,
+	const FMeshBuildSettings InMeshBuildSettings,
 	const bool bInRemoveOutputAfterBake,
 	const bool bInRecenterBakedActors,
 	const bool bInReplacePreviousBake)
@@ -106,6 +109,8 @@ UHoudiniPublicAPI::InstantiateAsset_Implementation(
 				bInEnableAutoBake,
 				InBakeDirectoryPath,
 				InBakeMethod,
+				InStaticMeshMethod,
+				InMeshBuildSettings,
 				bInRemoveOutputAfterBake,
 				bInRecenterBakedActors,
 				bInReplacePreviousBake))
@@ -129,6 +134,8 @@ UHoudiniPublicAPI::InstantiateAssetWithExistingWrapper_Implementation(
 	const bool bInEnableAutoBake,
 	const FString& InBakeDirectoryPath,
 	const EHoudiniEngineBakeOption InBakeMethod,
+	const EHoudiniStaticMeshMethod InStaticMeshMethod,
+	const FMeshBuildSettings InMeshBuildSettings,
 	const bool bInRemoveOutputAfterBake,
 	const bool bInRecenterBakedActors,
 	const bool bInReplacePreviousBake)
@@ -173,6 +180,8 @@ UHoudiniPublicAPI::InstantiateAssetWithExistingWrapper_Implementation(
 	BakeDirectoryPath.Path = InBakeDirectoryPath;
 	InWrapper->SetBakeFolder(BakeDirectoryPath);
 	InWrapper->SetBakeMethod(InBakeMethod);
+	InWrapper->SetStaticMeshMethod(InStaticMeshMethod);
+	InWrapper->SetMeshBuildSettings(InMeshBuildSettings);
 	InWrapper->SetRemoveOutputAfterBake(bInRemoveOutputAfterBake);
 	InWrapper->SetRecenterBakedActors(bInRecenterBakedActors);
 	InWrapper->SetReplacePreviousBake(bInReplacePreviousBake);
diff --git a/Source/HoudiniEngineEditor/Private/HoudiniPublicAPIAssetWrapper.cpp b/Source/HoudiniEngineEditor/Private/HoudiniPublicAPIAssetWrapper.cpp
index b3d3bbfd71..d9bd93b657 100755
--- a/Source/HoudiniEngineEditor/Private/HoudiniPublicAPIAssetWrapper.cpp
+++ b/Source/HoudiniEngineEditor/Private/HoudiniPublicAPIAssetWrapper.cpp
@@ -338,6 +338,52 @@ UHoudiniPublicAPIAssetWrapper::GetBakeMethod_Implementation(EHoudiniEngineBakeOp
 	return true;
 }
 
+bool
+UHoudiniPublicAPIAssetWrapper::SetStaticMeshMethod_Implementation(const EHoudiniStaticMeshMethod InStaticMeshMethod)
+{
+	UHoudiniAssetComponent* HAC = nullptr;
+	if (!GetValidHoudiniAssetComponentWithError(HAC))
+		return false;
+
+	HAC->StaticMeshMethod = InStaticMeshMethod;
+
+	return true;
+}
+
+bool UHoudiniPublicAPIAssetWrapper::GetStaticMeshMethod_Implementation(EHoudiniStaticMeshMethod& OutStaticMeshMethod)
+{
+	UHoudiniAssetComponent* HAC = nullptr;
+	if (!GetValidHoudiniAssetComponentWithError(HAC))
+		return false;
+
+	OutStaticMeshMethod = HAC->StaticMeshMethod;
+
+	return true;
+}
+
+bool
+UHoudiniPublicAPIAssetWrapper::SetMeshBuildSettings_Implementation(const FMeshBuildSettings InMeshBuildSettings)
+{
+	UHoudiniAssetComponent* HAC = nullptr;
+	if (!GetValidHoudiniAssetComponentWithError(HAC))
+		return false;
+
+	HAC->StaticMeshBuildSettings = InMeshBuildSettings;
+
+	return true;
+}
+
+bool UHoudiniPublicAPIAssetWrapper::GetMeshBuildSettings_Implementation(FMeshBuildSettings& OutMeshBuildSettings)
+{
+	UHoudiniAssetComponent* HAC = nullptr;
+	if (!GetValidHoudiniAssetComponentWithError(HAC))
+		return false;
+
+	OutMeshBuildSettings = HAC->StaticMeshBuildSettings;
+
+	return true;
+}
+
 bool
 UHoudiniPublicAPIAssetWrapper::SetRemoveOutputAfterBake_Implementation(const bool bInRemoveOutputAfterBake)
 {
diff --git a/Source/HoudiniEngineEditor/Private/HoudiniPublicAPIProcessHDANode.cpp b/Source/HoudiniEngineEditor/Private/HoudiniPublicAPIProcessHDANode.cpp
index b07d363fe3..6f0c88e287 100755
--- a/Source/HoudiniEngineEditor/Private/HoudiniPublicAPIProcessHDANode.cpp
+++ b/Source/HoudiniEngineEditor/Private/HoudiniPublicAPIProcessHDANode.cpp
@@ -73,6 +73,8 @@ UHoudiniPublicAPIProcessHDANode::ProcessHDA(
 	const bool bInEnableAutoBake,
 	const FString& InBakeDirectoryPath,
 	const EHoudiniEngineBakeOption InBakeMethod,
+	const EHoudiniStaticMeshMethod InStaticMeshMethod,
+	const FMeshBuildSettings InMeshBuildSettings,
 	const bool bInRemoveOutputAfterBake,
 	const bool bInRecenterBakedActors,
 	const bool bInReplacePreviousBake,
@@ -91,6 +93,8 @@ UHoudiniPublicAPIProcessHDANode::ProcessHDA(
 	Node->bEnableAutoBake = bInEnableAutoBake;
 	Node->BakeDirectoryPath = InBakeDirectoryPath;
 	Node->BakeMethod = InBakeMethod;
+	Node->StaticMeshMethod = InStaticMeshMethod;
+	Node->StaticMeshBuildSettings = InMeshBuildSettings;
 	Node->bRemoveOutputAfterBake = bInRemoveOutputAfterBake;
 	Node->bRecenterBakedActors = bInRecenterBakedActors;
 	Node->bReplacePreviousBake = bInReplacePreviousBake;
@@ -134,6 +138,8 @@ UHoudiniPublicAPIProcessHDANode::Activate()
 			bEnableAutoBake,
 			BakeDirectoryPath,
 			BakeMethod,
+			StaticMeshMethod,
+			StaticMeshBuildSettings,
 			bRemoveOutputAfterBake,
 			bRecenterBakedActors,
 			bReplacePreviousBake))
diff --git a/Source/HoudiniEngineEditor/Public/HoudiniPublicAPI.h b/Source/HoudiniEngineEditor/Public/HoudiniPublicAPI.h
index 3c4aa60ce9..903b01b73e 100755
--- a/Source/HoudiniEngineEditor/Public/HoudiniPublicAPI.h
+++ b/Source/HoudiniEngineEditor/Public/HoudiniPublicAPI.h
@@ -27,6 +27,7 @@
 #pragma once
 
 #include "CoreMinimal.h"
+#include "HoudiniAssetComponent.h"
 #include "UObject/NoExportTypes.h"
 #include "Templates/SubclassOf.h"
 
@@ -134,6 +135,8 @@ class HOUDINIENGINEEDITOR_API UHoudiniPublicAPI : public UHoudiniPublicAPIObject
 		const bool bInEnableAutoBake=false,
 		const FString& InBakeDirectoryPath="",
 		const EHoudiniEngineBakeOption InBakeMethod=EHoudiniEngineBakeOption::ToActor,
+		const EHoudiniStaticMeshMethod InStaticMeshMethod=EHoudiniStaticMeshMethod::RawMesh,
+		const FMeshBuildSettings InMeshBuildSettings = FMeshBuildSettings(),
 		const bool bInRemoveOutputAfterBake=false,
 		const bool bInRecenterBakedActors=false,
 		const bool bInReplacePreviousBake=false);
@@ -170,6 +173,8 @@ class HOUDINIENGINEEDITOR_API UHoudiniPublicAPI : public UHoudiniPublicAPIObject
 		const bool bInEnableAutoBake=false,
 		const FString& InBakeDirectoryPath="",
 		const EHoudiniEngineBakeOption InBakeMethod=EHoudiniEngineBakeOption::ToActor,
+		const EHoudiniStaticMeshMethod InStaticMeshMethod = EHoudiniStaticMeshMethod::RawMesh,
+		const FMeshBuildSettings InMeshBuildSettings = FMeshBuildSettings(),
 		const bool bInRemoveOutputAfterBake=false,
 		const bool bInRecenterBakedActors=false,
 		const bool bInReplacePreviousBake=false);
diff --git a/Source/HoudiniEngineEditor/Public/HoudiniPublicAPIAssetWrapper.h b/Source/HoudiniEngineEditor/Public/HoudiniPublicAPIAssetWrapper.h
index 23d71e30d6..91c22393eb 100755
--- a/Source/HoudiniEngineEditor/Public/HoudiniPublicAPIAssetWrapper.h
+++ b/Source/HoudiniEngineEditor/Public/HoudiniPublicAPIAssetWrapper.h
@@ -458,6 +458,18 @@ class HOUDINIENGINEEDITOR_API UHoudiniPublicAPIAssetWrapper : public UHoudiniPub
 	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category="Houdini|Public API")
 	bool GetBakeMethod(EHoudiniEngineBakeOption& OutBakeMethod);
 
+	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category="Houdini|Public API")
+	bool SetStaticMeshMethod(const EHoudiniStaticMeshMethod InStaticMeshMethod);
+
+	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category="Houdini|Public API")
+	bool GetStaticMeshMethod(EHoudiniStaticMeshMethod& OutStaticMeshMethod);
+
+	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category="Houdini|Public API")
+	bool SetMeshBuildSettings(const FMeshBuildSettings InMeshBuildSettings);
+
+	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category="Houdini|Public API")
+	bool GetMeshBuildSettings(FMeshBuildSettings& OutMeshBuildSettings);
+
 	/**
 	 * Set the bRemoveOutputAfterBake property, that controls if temporary outputs are removed after a successful bake.
 	 * @param bInRemoveOutputAfterBake If true, then after a successful bake, the HACs outputs will be cleared and
diff --git a/Source/HoudiniEngineEditor/Public/HoudiniPublicAPIProcessHDANode.h b/Source/HoudiniEngineEditor/Public/HoudiniPublicAPIProcessHDANode.h
index efa847e26c..cd73b3014e 100755
--- a/Source/HoudiniEngineEditor/Public/HoudiniPublicAPIProcessHDANode.h
+++ b/Source/HoudiniEngineEditor/Public/HoudiniPublicAPIProcessHDANode.h
@@ -32,6 +32,8 @@
 
 #include "HoudiniPublicAPIAssetWrapper.h"
 
+#include "HoudiniAssetComponent.h"
+
 #include "HoudiniPublicAPIProcessHDANode.generated.h"
 
 
@@ -103,6 +105,8 @@ class HOUDINIENGINEEDITOR_API UHoudiniPublicAPIProcessHDANode : public UBlueprin
 		const bool bInEnableAutoBake=false,
 		const FString& InBakeDirectoryPath="",
 		const EHoudiniEngineBakeOption InBakeMethod=EHoudiniEngineBakeOption::ToActor,
+		const EHoudiniStaticMeshMethod InStaticMeshMethod=EHoudiniStaticMeshMethod::RawMesh,
+		const FMeshBuildSettings InMeshBuildSettings=FMeshBuildSettings(),
 		const bool bInRemoveOutputAfterBake=false,
 		const bool bInRecenterBakedActors=false,
 		const bool bInReplacePreviousBake=false,
@@ -223,6 +227,14 @@ class HOUDINIENGINEEDITOR_API UHoudiniPublicAPIProcessHDANode : public UBlueprin
 	UPROPERTY()
 	EHoudiniEngineBakeOption BakeMethod;
 
+	/** The static mesh generation method. */
+	UPROPERTY()
+	EHoudiniStaticMeshMethod StaticMeshMethod;
+
+	/** Build Settings to be used when generating the Static Meshes for this Houdini Asset */
+	UPROPERTY()
+	FMeshBuildSettings StaticMeshBuildSettings;
+
 	/** Remove temporary HDA output after a bake. */
 	UPROPERTY()
 	bool bRemoveOutputAfterBake;