// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #ifdef USE_OPENMODEL #include "OpenModelUtils.h" #include "IWireInterface.h" #include "Templates/SharedPointer.h" class AlDagNode; class AlLayer; class AlMesh; class AlShader; class AlShaderNode; class IDatasmithActorElement; class IDatasmithBaseMaterialElement; class IDatasmithMaterialIDElement; class IDatasmithUEPbrMaterialElement; struct FMeshDescription; namespace CADLibrary { struct FMeshParameters; class ICADModelConverter; } namespace UE_DATASMITHWIRETRANSLATOR_NAMESPACE { class FBodyData; struct FDagNodeInfo; class FWireTranslatorImpl : public IWireInterface { public: FWireTranslatorImpl() {} ~FWireTranslatorImpl(); /** Begin IWrieInterface */ virtual bool Initialize(const TCHAR* InSceneFullName) override; virtual bool Load(TSharedPtr InScene) override; virtual void SetImportSettings(const FWireSettings& Options) override; virtual void SetOutputPath(const FString& Path) { OutputPath = Path; } bool LoadStaticMesh(const TSharedPtr MeshElement, FDatasmithMeshElementPayload& OutMeshPayload, const FDatasmithTessellationOptions& InTessellationOptions); /** End IWrieInterface */ private: /** Model traversal */ bool TraverseModel(); TSharedPtr TraverseDag(const FAlDagNodePtr& DagNode); TSharedPtr ProcessGeometryNode(const FAlDagNodePtr& GeomNode, const TAlObjectPtr& ParentLayer = TAlObjectPtr()); TSharedPtr TraverseGroupNode(const FAlDagNodePtr& GroupNode, const TAlObjectPtr& ParentLayer = TAlObjectPtr()); TSharedPtr ProcessGroupNode(const FAlDagNodePtr& GroupNode, const TAlObjectPtr& ParentLayer = TAlObjectPtr()); TSharedPtr ProcessBodyNode(TSharedPtr& BodyNode, const FAlDagNodePtr& GroupNode, const TAlObjectPtr& ParentLayer = TAlObjectPtr()); TSharedPtr ProcessPatchMesh(TSharedPtr& PatchMesh, const FAlDagNodePtr& GroupNode, const TAlObjectPtr& ParentLayer = TAlObjectPtr()); TSharedPtr FindOrAddLayerActor(const TAlObjectPtr& Layer); TSharedPtr FindOrAddMeshElement(const FAlDagNodePtr& GeomNode); TSharedPtr FindOrAddMeshElement(TSharedPtr& BodyNode); TSharedPtr FindOrAddMeshElement(TSharedPtr& PatchMesh); /** Material creation */ bool IsTransparent(FColor& TransparencyColor) { float Opacity = 1.0f - ((float)(TransparencyColor.R + TransparencyColor.G + TransparencyColor.B)) / 765.0f; return !FMath::IsNearlyEqual(Opacity, 1.0f); } bool GetCommonParameters(int32 Field, double Value, FColor& Color, FColor& TransparencyColor, FColor& IncandescenceColor, double GlowIntensity); void AddAlBlinnParameters(const TAlObjectPtr& Shader, TSharedPtr MaterialElement); void AddAlLambertParameters(const TAlObjectPtr& Shader, TSharedPtr MaterialElement); void AddAlLightSourceParameters(const TAlObjectPtr& Shader, TSharedPtr MaterialElement); void AddAlPhongParameters(const TAlObjectPtr& Shader, TSharedPtr MaterialElement); TSharedPtr FindOrAddMaterial(const TAlObjectPtr& Shader); /** Geometry retrieval */ TOptional GetMeshDescription(TSharedPtr MeshElement, CADLibrary::FMeshParameters& OutMeshParameters); TSharedPtr GetModelConverter() const; TOptional GetMeshDescriptionFromBodyNode(TSharedPtr& BodyNode, TSharedPtr MeshElement, CADLibrary::FMeshParameters& MeshParameters); TOptional GetMeshDescriptionFromPatchMesh(TSharedPtr& PatchMesh, TSharedPtr MeshElement, CADLibrary::FMeshParameters& MeshParameters); TOptional GetMeshDescriptionFromParametricNode(const FAlDagNodePtr& DagNode, TSharedPtr MeshElement, CADLibrary::FMeshParameters& MeshParameters); TOptional GetMeshDescriptionFromMeshNode(const FAlDagNodePtr& MeshNode, TSharedPtr MeshElement, CADLibrary::FMeshParameters& MeshParameters); FAlDagNodePtr FindOrAddDagNode(AlDagNode* InDagNode) { if (!InDagNode) { return FAlDagNodePtr(); } if (FAlDagNodePtr* DagNodePtr = EncounteredNodes.Find(InDagNode)) { #if WIRE_MEMORY_CHECK ensure(false); #endif return *DagNodePtr; } FAlDagNodePtr& NewDagNode = EncounteredNodes.Add(InDagNode); NewDagNode = InDagNode; return NewDagNode; } private: TSharedPtr DatasmithScene; FString OutputPath; FString SceneFullPath; FString SceneVersion; FWireSettings WireSettings; TSharedPtr CADModelConverter; bool bSceneLoaded = false; TMap> ShaderNameToMaterial; TMap> GeomNodeToMeshElement; TMap, FAlDagNodePtr> MeshElementToParametricNode; TMap, FAlDagNodePtr> MeshElementToMeshNode; TMap> BodyNodeToMeshElement; TMap, TSharedPtr> MeshElementToBodyNode; TMap> PatchMeshToMeshElement; TMap, TSharedPtr> MeshElementToPatchMesh; TMap EncounteredNodes; TMap> LayerToActor; // #cad_debug bool bTrackMesh = false; }; } // namespace #endif