Files
2025-05-18 13:04:45 +08:00

164 lines
4.3 KiB
C++

// 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<IDatasmithActorElement> DatasmithActorElement;
TSharedPtr<IDatasmithMeshActorElement> DatasmithMeshActor;
};
class FMeshConverted
{
public:
TSharedPtr<IDatasmithMeshElement> DatasmithMeshElement;
[[nodiscard]] TSharedPtr<IDatasmithMeshElement> GetDatasmithMeshElement() const
{
return DatasmithMeshElement;
}
TSet<uint16> SupportedChannels;
TMap<int32, int32> 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<FMeshConverted> 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;
};
}