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

333 lines
7.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MuT/ErrorLog.h"
#include "Containers/Array.h"
#include "Containers/Map.h"
#include "Containers/UnrealString.h"
#include "HAL/PlatformMath.h"
#include "HAL/UnrealMemory.h"
#include "Logging/LogCategory.h"
#include "Logging/LogMacros.h"
#include "Misc/AssertionMacros.h"
#include "MuR/Layout.h"
#include "MuR/Mesh.h"
#include "MuR/Model.h"
#include "MuR/ModelPrivate.h"
#include "MuR/MutableMath.h"
#include "MuR/Operations.h"
#include "MuR/ParametersPrivate.h"
#include "MuR/Platform.h"
#include "MuR/Skeleton.h"
#include "MuR/System.h"
#include "MuR/MutableRuntimeModule.h"
#include "Templates/Tuple.h"
#include "Trace/Detail/Channel.h"
namespace mu
{
int32 FErrorLog::GetMessageCount() const
{
return Messages.Num();
}
const FString& FErrorLog::GetMessageText( int32 Index ) const
{
if (Messages.IsValidIndex(Index))
{
return Messages[Index].Text;
}
static FString Empty;
return Empty;
}
const void* FErrorLog::GetMessageContext(int32 Index) const
{
const void* Result = 0;
if (Messages.IsValidIndex(Index))
{
Result = Messages[Index].Context;
}
return Result;
}
const void* FErrorLog::GetMessageContext2(int32 Index) const
{
const void* Result = 0;
if (Messages.IsValidIndex(Index))
{
Result = Messages[Index].Context2;
}
return Result;
}
ErrorLogMessageType FErrorLog::GetMessageType( int32 Index ) const
{
ErrorLogMessageType Result = ELMT_NONE;
if (Messages.IsValidIndex(Index))
{
Result = Messages[Index].Type;
}
return Result;
}
ErrorLogMessageSpamBin FErrorLog::GetMessageSpamBin(int32 Index) const
{
ErrorLogMessageSpamBin Result = ELMSB_ALL;
if (Messages.IsValidIndex(Index))
{
Result = Messages[Index].Spam;
}
return Result;
}
ErrorLogMessageAttachedDataView FErrorLog::GetMessageAttachedData( int32 Index ) const
{
ErrorLogMessageAttachedDataView Result;
if (Messages.IsValidIndex(Index))
{
const FMessage& message = Messages[Index];
if ( message.Data )
{
Result.UnassignedUVs = message.Data->UnassignedUVs.GetData();
Result.UnassignedUVsSize = message.Data->UnassignedUVs.Num();
}
}
return Result;
}
void FErrorLog::Add(const FString& InMessage,
ErrorLogMessageType InType,
const void* InContext,
ErrorLogMessageSpamBin InSpamBin)
{
UE::TUniqueLock Lock(MessageMutex);
FMessage& Msg = Messages.Emplace_GetRef();
Msg.Type = InType;
Msg.Spam = InSpamBin;
Msg.Text = InMessage;
Msg.Context = InContext;
}
void FErrorLog::Add(const FString& InMessage,
ErrorLogMessageType InType,
const void* InContext,
const void* InContext2,
ErrorLogMessageSpamBin InSpamBin)
{
UE::TUniqueLock Lock(MessageMutex);
FMessage& Msg = Messages.Emplace_GetRef();
Msg.Type = InType;
Msg.Spam = InSpamBin;
Msg.Text = InMessage;
Msg.Context = InContext;
Msg.Context2 = InContext2;
}
void FErrorLog::Add(const FString& InMessage,
const ErrorLogMessageAttachedDataView& InDataView,
ErrorLogMessageType InType,
const void* InContext,
ErrorLogMessageSpamBin InSpamBin)
{
UE::TUniqueLock Lock(MessageMutex);
FMessage& Msg = Messages.Emplace_GetRef();
Msg.Type = InType;
Msg.Spam = InSpamBin;
Msg.Text = InMessage;
Msg.Context = InContext;
Msg.Data = MakeShared<FErrorData>();
if ( InDataView.UnassignedUVs && InDataView.UnassignedUVsSize > 0 )
{
// \TODO: Review
Msg.Data->UnassignedUVs.Append(InDataView.UnassignedUVs, InDataView.UnassignedUVsSize);
}
}
void FErrorLog::Log() const
{
UE_LOG(LogMutableCore, Log, TEXT(" Error Log :\n"));
for ( const FMessage& msg : Messages )
{
switch ( msg.Type )
{
case ELMT_ERROR: UE_LOG(LogMutableCore, Log, TEXT(" ERR %s\n"), *msg.Text); break;
case ELMT_WARNING: UE_LOG(LogMutableCore, Log, TEXT(" WRN %s\n"), *msg.Text); break;
case ELMT_INFO: UE_LOG(LogMutableCore, Log, TEXT(" INF %s\n"), *msg.Text); break;
default: UE_LOG(LogMutableCore, Log, TEXT(" NON %s\n"), *msg.Text); break;
}
}
}
void FErrorLog::Merge( const FErrorLog* Other )
{
Messages.Append(Other->Messages);
}
// clang-format off
const TCHAR* s_opNames[] =
{
TEXT("NONE "),
TEXT("BO_CONSTANT "),
TEXT("NU_CONSTANT "),
TEXT("SC_CONSTANT "),
TEXT("CO_CONSTANT "),
TEXT("IM_CONSTANT "),
TEXT("ME_CONSTANT "),
TEXT("LA_CONSTANT "),
TEXT("PR_CONSTANT "),
TEXT("ST_CONSTANT "),
TEXT("ED_CONSTANT "),
TEXT("MA_CONSTANT "),
TEXT("BO_PARAMETER "),
TEXT("NU_PARAMETER "),
TEXT("SC_PARAMETER "),
TEXT("CO_PARAMETER "),
TEXT("PR_PARAMETER "),
TEXT("IM_PARAMETER "),
TEXT("ME_PARAMETER "),
TEXT("ST_PARAMETER "),
TEXT("MA_PARAMETER "),
TEXT("IM_REFERENCE "),
TEXT("ME_REFERENCE "),
TEXT("NU_CONDITIONAL "),
TEXT("SC_CONDITIONAL "),
TEXT("CO_CONDITIONAL "),
TEXT("IM_CONDITIONAL "),
TEXT("ME_CONDITIONAL "),
TEXT("LA_CONDITIONAL "),
TEXT("IN_CONDITIONAL "),
TEXT("ED_CONDITIONAL "),
TEXT("NU_SWITCH "),
TEXT("SC_SWITCH "),
TEXT("CO_SWITCH "),
TEXT("IM_SWITCH "),
TEXT("ME_SWITCH "),
TEXT("LA_SWITCH "),
TEXT("IN_SWITCH "),
TEXT("ED_SWITCH "),
TEXT("BO_EQUAL_SC_CONST"),
TEXT("BO_AND "),
TEXT("BO_OR "),
TEXT("BO_NOT "),
TEXT("SC_ARITHMETIC "),
TEXT("SC_CURVE "),
TEXT("CO_SAMPLEIMAGE "),
TEXT("CO_SWIZZLE "),
TEXT("CO_FROMSCALARS "),
TEXT("CO_ARITHMETIC "),
TEXT("IM_LAYER "),
TEXT("IM_LAYERCOLOUR "),
TEXT("IM_PIXELFORMAT "),
TEXT("IM_MIPMAP "),
TEXT("IM_RESIZE "),
TEXT("IM_RESIZELIKE "),
TEXT("IM_RESIZEREL "),
TEXT("IM_BLANKLAYOUT "),
TEXT("IM_COMPOSE "),
TEXT("IM_INTERPOLATE "),
TEXT("IM_SATURATE "),
TEXT("IM_LUMINANCE "),
TEXT("IM_SWIZZLE "),
TEXT("IM_COLOURMAP "),
TEXT("IM_BINARISE "),
TEXT("IM_PLAINCOLOUR "),
TEXT("IM_CROP "),
TEXT("IM_PATCH "),
TEXT("IM_RASTERMESH "),
TEXT("IM_MAKEGROWMAP "),
TEXT("IM_DISPLACE "),
TEXT("IM_MULTILAYER "),
TEXT("IM_INVERT "),
TEXT("IM_NORMAL_COMPO "),
TEXT("IM_TRANSFORM "),
TEXT("ME_APPLYLAYOUT "),
TEXT("ME_PREPARELAYOUT "),
TEXT("ME_DIFFERENCE "),
TEXT("ME_MORPH "),
TEXT("ME_MERGE "),
TEXT("ME_MASKCLIPMESH "),
TEXT("ME_MASKCLIPUVMASK"),
TEXT("ME_MASKDIFF "),
TEXT("ME_REMOVEMASK "),
TEXT("ME_FORMAT "),
TEXT("ME_EXTRACTLABLOCK"),
TEXT("ME_TRANSFORM "),
TEXT("ME_CLIPMORPHPLANE"),
TEXT("ME_CLIPWITHMESH "),
TEXT("ME_SETSKELETON "),
TEXT("ME_PROJECT "),
TEXT("ME_APPLYPOSE "),
TEXT("ME_BINDSHAPE "),
TEXT("ME_APPLYSHAPE "),
TEXT("ME_CLIPDEFORM "),
TEXT("ME_MORPHRESHAPE "),
TEXT("ME_OPTIMIZESKIN "),
TEXT("ME_ADDMETADATA "),
TEXT("ME_TRANSFORMWITHMESH"),
TEXT("IN_ADDMESH "),
TEXT("IN_ADDIMAGE "),
TEXT("IN_ADDVECTOR "),
TEXT("IN_ADDSCALAR "),
TEXT("IN_ADDSTRING "),
TEXT("IN_ADDSURFACE "),
TEXT("IN_ADDCOMPONENT "),
TEXT("IN_ADDLOD "),
TEXT("IN_ADDEXTENSIDATA"),
TEXT("IN_ADDOVERLAYMATERIAL"),
TEXT("LA_PACK "),
TEXT("LA_MERGE "),
TEXT("LA_REMOVEBLOCKS "),
TEXT("LA_FROMMESH "),
};
static_assert(UE_ARRAY_COUNT(s_opNames) == int32(EOpType::COUNT));
// clang-format on
}