#pragma once #include "CoreMinimal.h" /** * @struct FMPCookEdlArc * @brief Represents a single EDL dependency arc (e.g., "Create X before Serialize Y") reported by a worker. * Object paths are stored as FNames for efficiency. */ struct FCookEdlArc { FName DepObjectPath; bool bDepIsSerialize = false; FName ExportObjectPath; bool bExportIsSerialize = false; friend FArchive& operator<<(FArchive& Ar, FCookEdlArc& Arc) { Ar << Arc.DepObjectPath; Ar << Arc.bDepIsSerialize; Ar << Arc.ExportObjectPath; Ar << Arc.bExportIsSerialize; return Ar; } }; struct FCookEDImport { FName Path; FName Package; friend FArchive& operator<<(FArchive& Ar, FCookEDImport& Arc) { Ar << Arc.Path; Ar << Arc.Package; return Ar; } }; /** * @struct FMPCookPackageSideEffects * @brief Encapsulates all the "side-effect" data generated when a worker cooks a single package. * This data is sent back to the Director along with the standard cook result. */ struct FCookSideEffects { // --- EDL (Event-Driven Loader) Data --- // Objects that were AddImport()ed by this package. TArray EdlImports; // Objects that were AddExport()ed from this package. TArray EdlExports; // Dependency arcs that were AddArc()ed for objects in this package. TArray EdlArcs; void Reset() { EdlImports.Reset(); EdlExports.Reset(); EdlArcs.Reset(); } friend FArchive& operator<<(FArchive& Ar, FCookSideEffects& Data) { Ar << Data.EdlImports; Ar << Data.EdlExports; Ar << Data.EdlArcs; return Ar; } }; /** * Interface for collecting side effects during SavePackage (Worker side) * and applying them to the global state (Director side). */ class ICookSideEffectCollector { public: typedef ICookSideEffectCollector* (*FFactoryFunction)(); virtual ~ICookSideEffectCollector() {} // --- Worker Side Implementation --- virtual void AddExport(UObject* Export) = 0; virtual void AddImport(UObject* Import, UPackage* ImportingPackage) = 0; virtual void AddArc(UObject* DepObject, bool bDepIsSerialize, UObject* Export, bool bExportIsSerialize) = 0; // --- Static Global Access (For Hooks in SavePackage) --- static COREUOBJECT_API void SetFactory(FFactoryFunction InFactory); static COREUOBJECT_API void SetInstance(ICookSideEffectCollector* InInstance); static COREUOBJECT_API ICookSideEffectCollector* GetInstance(); // --- Director Side Routing (Applying remote data) --- // These static methods act as a bridge to FEDLCookChecker and AssetRegistry static COREUOBJECT_API void HandleCookSideEffects(FCookSideEffects& CookPackageSideEffects); };