EM_Task/CoreUObject/Public/Misc/CookSideEffectCollector.h
Boshuang Zhao 5144a49c9b add
2026-02-13 16:18:33 +08:00

91 lines
2.9 KiB
C++

#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<FCookEDImport> EdlImports;
// Objects that were AddExport()ed from this package.
TArray<FName> EdlExports;
// Dependency arcs that were AddArc()ed for objects in this package.
TArray<FCookEdlArc> 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);
};