// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "DatasmithMaxExporterDefines.h" #include "Windows/AllowWindowsPlatformTypes.h" MAX_INCLUDES_START #include "Animatable.h" MAX_INCLUDES_END #include "Windows/HideWindowsPlatformTypes.h" class IDatasmithActorElement; class IDatasmithMeshActorElement; class IDatasmithMeshElement; namespace DatasmithMaxDirectLink { class ISceneTracker; class FNodeTracker; // Identifies data for Max node converted to Datasmith class FNodeConverted: FNoncopyable { public: TSharedPtr DatasmithActorElement; TSharedPtr DatasmithMeshActor; }; class FMeshConverted { public: TSharedPtr DatasmithMeshElement; [[nodiscard]] TSharedPtr GetDatasmithMeshElement() const { return DatasmithMeshElement; } TSet SupportedChannels; TMap UVChannelsMap; void ReleaseMeshConverted() { DatasmithMeshElement.Reset(); SupportedChannels.Reset(); UVChannelsMap.Reset(); } }; class FNodeConverter: FNoncopyable { public: enum EType { Unknown, MeshNode, HismNode, LightNode, CameraNode, HelperNode, }; FNodeConverter(EType InConverterType=EType::Unknown): ConverterType(InConverterType) { } virtual ~FNodeConverter(){} virtual void Parse(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) = 0; virtual void ConvertToDatasmith(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) = 0; virtual void RemoveFromTracked(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) = 0; const EType ConverterType; }; class FMeshNodeConverter: public FNodeConverter { public: FMeshNodeConverter(): FNodeConverter(EType::MeshNode) { } virtual void Parse(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void ConvertToDatasmith(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void RemoveFromTracked(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; AnimHandle InstanceHandle = 0; // todo: rename - this is handle for object this node is instance of bool bMaterialsAssignedToStaticMesh; // This node will used materials assigned to static mesh, otherwise actor's override }; class FHismNodeConverter: public FNodeConverter { public: FHismNodeConverter(): FNodeConverter(EType::HismNode) { } virtual void RemoveFromTracked(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; TArray Meshes; }; class FRailCloneNodeConverter: public FHismNodeConverter { public: virtual void Parse(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void ConvertToDatasmith(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; }; class FForestNodeConverter: public FHismNodeConverter { public: virtual void Parse(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void ConvertToDatasmith(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; }; class FHelperNodeConverter: public FNodeConverter { public: FHelperNodeConverter(): FNodeConverter(EType::HelperNode) { } virtual void Parse(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void ConvertToDatasmith(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void RemoveFromTracked(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; }; class FLightNodeConverter: public FNodeConverter { public: FLightNodeConverter(): FNodeConverter(EType::LightNode) { } virtual void Parse(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void ConvertToDatasmith(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void RemoveFromTracked(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; void ApplyIesProfile(const TCHAR* InIesFilePath); const TCHAR* GetIesProfile(); bool IsIesProfileValid(); private: FString IesFilePath; }; class FCameraNodeConverter: public FNodeConverter { public: FCameraNodeConverter(): FNodeConverter(EType::CameraNode) { } virtual void Parse(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void ConvertToDatasmith(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; virtual void RemoveFromTracked(ISceneTracker& SceneTracker, FNodeTracker& NodeTracker) override; }; }