Files

200 lines
8.6 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 "HoudiniGeoPartObject.h"
#include "HoudiniCookHandler.h"
class UHoudiniAssetComponent;
struct FHoudiniCookParams;
class UStaticMesh;
class AActor;
class UStaticMeshComponent;
class UTexture2D;
struct HOUDINIENGINERUNTIME_API FHoudiniEngineBakeUtils
{
public:
/** Bake static mesh. **/
static UStaticMesh * BakeStaticMesh(
UHoudiniAssetComponent * HoudiniAssetComponent,
const FHoudiniGeoPartObject & HoudiniGeoPartObject,
UStaticMesh * StaticMesh );
/** Bake blueprint. **/
static class UBlueprint * BakeBlueprint(
UHoudiniAssetComponent * HoudiniAssetComponent );
/** Bake blueprint, instantiate and replace Houdini actor. **/
static AActor * ReplaceHoudiniActorWithBlueprint(
UHoudiniAssetComponent * HoudiniAssetComponent );
/** Create a package for given component for blueprint baking. **/
static UPackage * BakeCreateBlueprintPackageForComponent(
UHoudiniAssetComponent * HoudiniAssetComponent,
FString & BlueprintName );
/** Bake output meshes and materials to packages and create corresponding actors in the scene */
static bool BakeHoudiniActorToActors(
UHoudiniAssetComponent * HoudiniAssetComponent,
bool SelectNewActors);
/** Bake to actor, and replace Houdini actor. **/
static bool ReplaceHoudiniActorWithActors(
UHoudiniAssetComponent * HoudiniAssetComponent,
bool SelectNewActors);
/** Helper for baking static meshes to actors */
static TArray< AActor* > BakeHoudiniActorToActors_StaticMeshes(
UHoudiniAssetComponent * HoudiniAssetComponent,
TMap< const UStaticMeshComponent*, FHoudiniGeoPartObject >& SMComponentToPart );
/** Helper for baking Instanced Actors to actors */
static TArray< AActor* > BakeHoudiniActorToActors_InstancedActors(
UHoudiniAssetComponent * HoudiniAssetComponent,
TMap< const class UHoudiniInstancedActorComponent*,
FHoudiniGeoPartObject >& ComponentToPart );
/** Helper for baking MeshSplitInstancers to actors */
static TArray< AActor* > BakeHoudiniActorToActors_SplitMeshInstancers(
UHoudiniAssetComponent * HoudiniAssetComponent,
TMap<const class UHoudiniMeshSplitInstancerComponent *, FHoudiniGeoPartObject> SplitMeshInstancerComponentToPart);
/** Helper for baking an SM only if necessary */
static void CheckedBakeStaticMesh(
class UHoudiniAssetComponent* HoudiniAssetComponent,
TMap< const UStaticMesh*, UStaticMesh* >& OriginalToBakedMesh,
const FHoudiniGeoPartObject & HoudiniGeoPartObject,
UStaticMesh* OriginalSM);
/** Duplicate a given material. This will create a new package for it. This will also create necessary textures **/
/** and their corresponding packages. **/
static class UMaterial * DuplicateMaterialAndCreatePackage(
class UMaterial * Material,
FHoudiniCookParams& HoudiniCookParams,
const FString & SubMaterialName );
/** Duplicate a given texture. This will create a new package for it. **/
static UTexture2D * DuplicateTextureAndCreatePackage(
UTexture2D * Texture,
FHoudiniCookParams& HoudiniCookParams,
const FString & SubTextureName );
/** Replace duplicated texture with a new copy within a given sampling expression. **/
static void ReplaceDuplicatedMaterialTextureSample(
class UMaterialExpression * MaterialExpression,
FHoudiniCookParams& HoudiniCookParams );
/** Returns true if the supplied static mesh has unbaked (not backed by a .uasset) mesh or material */
static bool StaticMeshRequiresBake(
const UStaticMesh * StaticMesh );
/** Duplicate a given static mesh. This will create a new package for it. This will also create necessary **/
/** materials and textures and their corresponding packages. **/
static UStaticMesh * DuplicateStaticMeshAndCreatePackage(
const UStaticMesh * StaticMesh,
UHoudiniAssetComponent * Component,
const FHoudiniGeoPartObject & HoudiniGeoPartObject,
EBakeMode BakeMode );
/** Get a candidate for baking to outliner input workflow */
static class UHoudiniAssetInput* GetInputForBakeHoudiniActorToOutlinerInput(
const UHoudiniAssetComponent * HoudiniAssetComponent );
/** Returns true if the conditions are met for Bake to Input action ( 1 static mesh output and first input is world outliner with a static mesh) */
static bool CanComponentBakeToOutlinerInput(
const UHoudiniAssetComponent * HoudiniAssetComponent );
/** Return true if we can bake to foliage (we need at least 1 instancer component) **/
static bool CanComponentBakeToFoliage(
const UHoudiniAssetComponent * HoudiniAssetComponent );
/** Bakes output meshes and materials to packages and sets them on an input */
static void BakeHoudiniActorToOutlinerInput(
UHoudiniAssetComponent * HoudiniAssetComponent );
/** Bakes output instanced meshes to the level's foliage actor */
static bool BakeHoudiniActorToFoliage(
UHoudiniAssetComponent * HoudiniAssetComponent );
/** Bakes output instanced meshes to the level's foliage actor and removes the Houdini actor */
static bool ReplaceHoudiniActorWithFoliage(
UHoudiniAssetComponent * HoudiniAssetComponent);
/** Bakes landscape (detach them from the asset), if OnlyBakeThisLandscape is null, all landscapes will be baked **/
static bool BakeLandscape(
UHoudiniAssetComponent* HoudiniAssetComponent,
class ALandscapeProxy * OnlyBakeThisLandscape = nullptr );
/** Create a package for a given component for material. **/
static UPackage * BakeCreateMaterialPackageForComponent(
FHoudiniCookParams& HoudiniCookParams,
const HAPI_MaterialInfo & MaterialInfo,
FString & MaterialName );
/** Create a package for a given component for texture. **/
static UPackage * BakeCreateTexturePackageForComponent(
FHoudiniCookParams& HoudiniCookParams,
const HAPI_MaterialInfo & MaterialInfo,
const FString & TextureType,
FString & TextureName );
/** Create a package for a given component for either a texture or material **/
static UPackage * BakeCreateTextureOrMaterialPackageForComponent(
FHoudiniCookParams& HoudiniCookParams,
const FString & MaterialInfoDescriptor,
FString & MaterialName );
/** Create a package for given component for static mesh baking. **/
static UPackage * BakeCreateStaticMeshPackageForComponent(
FHoudiniCookParams& HoudiniCookParams,
const FHoudiniGeoPartObject & HoudiniGeoPartObject,
FString & MeshName,
FGuid & BakeGUID );
/** Checks the package is not referenced or marked for garbage collection **/
static bool CheckPackageSafeForBake(
UPackage* Package, FString& FoundAssetName );
/** Add Houdini meta information to package for a given object. **/
static void AddHoudiniMetaInformationToPackage(
UPackage * Package,
UObject * Object,
const TCHAR * Key,
const TCHAR * Value );
/** Retrieve item name from Houdini meta information. **/
static bool GetHoudiniGeneratedNameFromMetaInformation(
UPackage * Package,
UObject * Object,
FString & HoudiniName );
/** Used by the replace function to delete the Houdini Asset Actor after it's been baked */
static bool DeleteBakedHoudiniAssetActor(
UHoudiniAssetComponent * HoudiniAssetComponent);
};