Files

408 lines
15 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 "IHoudiniEngineEditor.h"
#include "ComponentVisualizer.h"
#include "Styling/SlateStyle.h"
#include "EditorUndoClient.h"
#include "Framework/MultiBox/MultiBoxExtender.h"
#include "HoudiniRuntimeSettings.h"
#include "Framework/Commands/Commands.h"
#include "HAPI.h"
class IAssetTools;
class IAssetTypeActions;
class IComponentAssetBroker;
class UHoudiniAssetComponent;
class FMenuBuilder;
struct FSlateBrush;
struct FHoudiniToolDescription;
struct FHoudiniTool
{
FHoudiniTool()
: HoudiniAsset( nullptr)
, Name()
, ToolTipText()
, Icon()
, HelpURL()
, Type(EHoudiniToolType::HTOOLTYPE_OPERATOR_SINGLE)
, DefaultTool(false)
, SelectionType(EHoudiniToolSelectionType::HTOOL_SELECTION_ALL)
, SourceAssetPath()
, ToolDirectory()
, JSONFile()
{
}
FHoudiniTool(
TSoftObjectPtr < class UHoudiniAsset > InHoudiniAsset, const FText& InName,
const EHoudiniToolType& InType, const EHoudiniToolSelectionType& InSelType,
const FText& InToolTipText, const FSlateBrush* InIcon, const FString& InHelpURL,
const bool& isDefault, const FFilePath& InAssetPath, const FHoudiniToolDirectory& InToolDirectory,
const FString& InJSONFile )
: HoudiniAsset( InHoudiniAsset )
, Name( InName )
, ToolTipText( InToolTipText )
, Icon( InIcon )
, HelpURL( InHelpURL )
, Type( InType )
, DefaultTool( isDefault )
, SelectionType( InSelType )
, SourceAssetPath( InAssetPath )
, ToolDirectory( InToolDirectory )
, JSONFile( InJSONFile )
{
}
/** The Houdini Asset used by the tool **/
TSoftObjectPtr < class UHoudiniAsset > HoudiniAsset;
/** The name to be displayed */
FText Name;
/** The name to be displayed */
FText ToolTipText;
/** The icon to be displayed */
const FSlateBrush* Icon;
/** The help URL for this tool */
FString HelpURL;
/** The type of tool, this will change how the asset handles the current selection **/
EHoudiniToolType Type;
/** Indicate this is one of the default tools **/
bool DefaultTool;
/** Indicate what the tool should consider for selection **/
EHoudiniToolSelectionType SelectionType;
/** Path to the Asset used **/
FFilePath SourceAssetPath;
/** Directory containing the tool **/
FHoudiniToolDirectory ToolDirectory;
/** Name of the JSON containing the tool's description **/
FString JSONFile;
/** Returns the file path to the JSOn file containing the tool's description **/
FString GetJSonFilePath() { return ToolDirectory.Path.Path / JSONFile; };
};
class FHoudiniEngineStyle
{
public:
static void Initialize();
static void Shutdown();
static TSharedPtr<class ISlateStyle> Get();
static FName GetStyleSetName();
private:
//static FString InContent(const FString &RelativePath, const ANSICHAR *Extension);
static TSharedPtr<class FSlateStyleSet> StyleSet;
};
class FHoudiniEngineEditor : public IHoudiniEngineEditor, public FEditorUndoClient
{
public:
FHoudiniEngineEditor();
/** IModuleInterface methods. **/
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override;
/** IHoudiniEngineEditor methods. **/
public:
virtual void RegisterComponentVisualizers() override;
virtual void UnregisterComponentVisualizers() override;
virtual void RegisterDetails() override;
virtual void UnregisterDetails() override;
virtual void RegisterAssetTypeActions() override;
virtual void UnregisterAssetTypeActions() override;
virtual void RegisterAssetBrokers() override;
virtual void UnregisterAssetBrokers() override;
virtual void RegisterActorFactories() override;
virtual void ExtendMenu() override;
virtual void RegisterForUndo() override;
virtual void UnregisterForUndo() override;
virtual void RegisterPlacementModeExtensions() override;
virtual void UnregisterPlacementModeExtensions() override;
/** FEditorUndoClient methods. **/
public:
virtual bool MatchesContext(const FTransactionContext& InContext, const TArray<TPair<UObject*, FTransactionObjectEvent>>& TransactionObjects) const override;
virtual void PostUndo( bool bSuccess ) override;
virtual void PostRedo( bool bSuccess ) override;
public:
/** App identifier string. **/
static const FName HoudiniEngineEditorAppIdentifier;
/** Selected Houdini Tool Dir **/
int32 CurrentHoudiniToolDirIndex;
public:
/** Return singleton instance of Houdini Engine Editor, used internally. **/
static FHoudiniEngineEditor & Get();
/** Return true if singleton instance has been created. **/
static bool IsInitialized();
public:
/** Menu action called to save a HIP file. **/
void SaveHIPFile();
/** Helper delegate used to determine if HIP file save can be executed. **/
bool CanSaveHIPFile() const;
/** Menu action called to report a bug. **/
void ReportBug();
/** Helper delegate used to determine if report a bug can be executed. **/
bool CanReportBug() const;
/** Menu action called to open the current scene in Houdini. **/
void OpenInHoudini();
/** Helper delegate used to determine if open in Houdini can be executed. **/
bool CanOpenInHoudini() const;
/** Menu action called to clean up all unused files in the cook temp folder **/
void CleanUpTempFolder();
/** Helper delegate used to determine if Clean up temp can be executed. **/
bool CanCleanUpTempFolder() const;
/** Menu action to bake/replace all current Houdini Assets with blueprints **/
void BakeAllAssets();
/** Helper function for baking/replacing the current select Houdini Assets with blueprints **/
void BakeSelection();
/** Helper delegate used to determine if BakeAllAssets can be executed. **/
bool CanBakeAllAssets() const;
/** Helper function for restarting the current Houdini Engine session. **/
void RestartSession();
/** Helper delegate used to determine if RestartSession can be executed. **/
bool CanRestartSession() const;
/** Returns the plugin's directory **/
static FString GetHoudiniEnginePluginDir();
/** Returns the Default Icon to be used by Houdini Tools**/
static FString GetDefaultHoudiniToolIcon();
/** Returns the HoudiniTools currently available for the shelf **/
const TArray< TSharedPtr<FHoudiniTool> >& GetHoudiniTools() { return HoudiniTools; }
/** Reads the Houdini Tool Description from a JSON file **/
bool GetHoudiniToolDescriptionFromJSON(
const FString& JsonFilePath,
FString& OutName, EHoudiniToolType& OutType, EHoudiniToolSelectionType& OutSelectionType,
FString& OutToolTip, FFilePath& OutIconPath, FFilePath& OutAssetPath, FString& OutHelpURL );
bool WriteJSONFromHoudiniTool(const FHoudiniTool& Tool);
/** Returns the HoudiniTools array **/
TArray< TSharedPtr<FHoudiniTool> >* GetHoudiniToolsForWrite() { return &HoudiniTools; }
/** Menu action to pause cooking for all Houdini Assets **/
void PauseAssetCooking();
/** Helper delegate used to determine if PauseAssetCooking can be executed. **/
bool CanPauseAssetCooking();
/** Helper delegate used to get the current state of PauseAssetCooking. **/
bool IsAssetCookingPaused();
/** Helper function for recooking all assets in the current level **/
void RecookAllAssets();
/** Helper function for rebuilding all assets in the current level **/
void RebuildAllAssets();
/** Helper function for recooking selected assets **/
void RecookSelection();
/** Helper function for rebuilding selected assets **/
void RebuildSelection();
/** Helper function for rebuilding selected assets **/
void RecentreSelection();
/** Helper function for accessing the current CB selection **/
static int32 GetContentBrowserSelection( TArray< UObject* >& ContentBrowserSelection );
/** Helper function for accessing the current world selection **/
static int32 GetWorldSelection( TArray< UObject* >& WorldSelection, bool bHoudiniAssetActorsOnly = false );
/** Helper function for retrieving an HoudiniTool in the Editor list **/
bool FindHoudiniTool( const FHoudiniTool& Tool, int32& FoundIndex, bool& IsDefault );
/** Helper function for retrieving an HoudiniTool in the Houdini Runtime Settings list **/
bool FindHoudiniToolInHoudiniSettings( const FHoudiniTool& Tool, int32& FoundIndex );
/** Rebuild the editor's Houdini Tool list **/
void UpdateHoudiniToolList(int32 SelectedDir = -1);
/** Rebuild the editor's Houdini Tool list for a directory **/
void UpdateHoudiniToolList(const FHoudiniToolDirectory& HoudiniToolsDirectory, const bool& isDefault );
/** Return all the directories where we should look for houdini tools**/
void GetAllHoudiniToolDirectories(TArray<FHoudiniToolDirectory>& HoudiniToolsDirectoryArray) const;
/** Return the directories where we should look for houdini tools**/
void GetHoudiniToolDirectories(const int32& SelectedIndex, TArray<FHoudiniToolDirectory>& HoudiniToolsDirectoryArray) const;
protected:
/** Register AssetType action. **/
void RegisterAssetTypeAction( IAssetTools & AssetTools, TSharedRef< IAssetTypeActions > Action );
/** Binds the menu extension's UICommands to their corresponding functions **/
void BindMenuCommands();
/** Add menu extension for our module. **/
void AddHoudiniMenuExtension( FMenuBuilder & MenuBuilder );
/** Add the default Houdini Tools to the Houdini Engine Shelft tool **/
void AddDefaultHoudiniToolToArray( TArray< FHoudiniToolDescription >& ToolArray );
/** Adds the custom Houdini Engine console commands **/
void RegisterConsoleCommands();
/** Adds the custom Houdini Engine commands to the world outliner context menu **/
void AddLevelViewportMenuExtender();
/** Removes the custom Houdini Engine commands from the world outliner context menu **/
void RemoveLevelViewportMenuExtender();
/** Return all the custom Houdini Engine commands for the world outliner context menu **/
TSharedRef<FExtender> GetLevelViewportContextMenuExtender(
const TSharedRef<FUICommandList> CommandList, const TArray<AActor*> InActors );
private:
/** Singleton instance of Houdini Engine Editor. **/
static FHoudiniEngineEditor * HoudiniEngineEditorInstance;
private:
/** AssetType actions associated with Houdini asset. **/
TArray< TSharedPtr< IAssetTypeActions > > AssetTypeActions;
/** Visualizer for our spline component. **/
TSharedPtr< FComponentVisualizer > HandleComponentVisualizer;
/** Visualizer for our spline component. **/
TSharedPtr< FComponentVisualizer > SplineComponentVisualizer;
/** Broker associated with Houdini asset. **/
TSharedPtr< IComponentAssetBroker > HoudiniAssetBroker;
/** The extender to pass to the level editor to extend it's window menu. **/
TSharedPtr< FExtender > MainMenuExtender;
/** Stored last used Houdini component which was involved in undo. **/
mutable UHoudiniAssetComponent * LastHoudiniAssetComponentUndoObject;
TArray< TSharedPtr<FHoudiniTool> > HoudiniTools;
TSharedPtr<class FUICommandList> HEngineCommands;
FDelegateHandle LevelViewportExtenderHandle;
};
/**
* Class containing commands for Houdini Engine actions
*/
class FHoudiniEngineCommands : public TCommands<FHoudiniEngineCommands>
{
public:
FHoudiniEngineCommands()
: TCommands<FHoudiniEngineCommands>
(
TEXT("HoudiniEngine"), // Context name for fast lookup
NSLOCTEXT("Contexts", "HoudiniEngine", "Houdini Engine Plugin"), // Localized context name for displaying
NAME_None, // Parent context name.
FHoudiniEngineStyle::GetStyleSetName() // Icon Style Set
)
{
}
// TCommand<> interface
virtual void RegisterCommands() override;
/** Menu action called to save a HIP file. **/
TSharedPtr<FUICommandInfo> SaveHIPFile;
/** Menu action called to report a bug. **/
TSharedPtr<FUICommandInfo> ReportBug;
/** Menu action called to open the current scene in Houdini. **/
TSharedPtr<FUICommandInfo> OpenInHoudini;
/** Menu action called to clean up all unused files in the cook temp folder **/
TSharedPtr<FUICommandInfo> CleanUpTempFolder;
/** Menu action to bake/replace all current Houdini Assets with blueprints **/
TSharedPtr<FUICommandInfo> BakeAllAssets;
/** Menu action to pause cooking for all Houdini Assets **/
TSharedPtr<FUICommandInfo> PauseAssetCooking;
/** UI Action to recook the current world selection **/
TSharedPtr<FUICommandInfo> CookSelec;
/** UI Action to rebuild the current world selection **/
TSharedPtr<FUICommandInfo> RebuildSelec;
/** UI Action to bake and replace the current world selection **/
TSharedPtr<FUICommandInfo> BakeSelec;
/** UI Action to restart the current Houdini Engine Session **/
TSharedPtr<FUICommandInfo> RestartSession;
/** UI Action to recentre the current selection **/
TSharedPtr<FUICommandInfo> RecentreSelec;
};