Files
UnrealEngineUWP/Engine/Source/Runtime/MeshDescription/Private/MeshDescriptionBaseBulkData.cpp
ryan schmidt c4d122a5ad MeshDescription: underlying BitArray is not freeing memory on Empty() call as intended, use Reset() instead
#rb Richard.TalbotWatkin
#jira UE-141635
#preflight 62015104846dda28abff3171
#rnx

#ROBOMERGE-AUTHOR: ryan.schmidt
#ROBOMERGE-SOURCE: CL 18887910 in //UE5/Release-5.0/... via CL 18887926 via CL 18888097
#ROBOMERGE-BOT: UE5 (Release-Engine-Test -> Main) (v910-18824042)

[CL 18888133 by ryan schmidt in ue5-main branch]
2022-02-07 13:06:49 -05:00

161 lines
2.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MeshDescriptionBaseBulkData.h"
#include "MeshDescriptionBase.h"
#include "MeshDescription.h"
UMeshDescriptionBaseBulkData::UMeshDescriptionBaseBulkData()
{
#if WITH_EDITORONLY_DATA
BulkData = MakePimpl<FMeshDescriptionBulkData>();
MeshDescription = nullptr;
#endif
}
void UMeshDescriptionBaseBulkData::Serialize(FArchive& Ar)
{
#if WITH_EDITORONLY_DATA
Super::Serialize(Ar);
if (!Ar.IsFilterEditorOnly())
{
check(BulkData.IsValid());
BulkData->Serialize(Ar, GetOuter());
}
if (Ar.IsLoading() && MeshDescription != nullptr)
{
// If there was a cached mesh description, it could be out of sync with the bulk data we just serialized so re-cache it.
CacheMeshDescription();
}
#endif
}
bool UMeshDescriptionBaseBulkData::IsEditorOnly() const
{
return true;
}
bool UMeshDescriptionBaseBulkData::NeedsLoadForClient() const
{
return false;
}
bool UMeshDescriptionBaseBulkData::NeedsLoadForServer() const
{
return false;
}
bool UMeshDescriptionBaseBulkData::NeedsLoadForEditorGame() const
{
return true;
}
#if WITH_EDITORONLY_DATA
void UMeshDescriptionBaseBulkData::Empty()
{
BulkData->Empty();
}
UMeshDescriptionBase* UMeshDescriptionBaseBulkData::CreateMeshDescription()
{
if (MeshDescription == nullptr)
{
check(PreallocatedMeshDescription);
MeshDescription = PreallocatedMeshDescription;
}
// Reset the mesh description and register its attributes
// Do this instead of always creating a new UStaticMeshDescription object, to save memory and improve performance
MeshDescription->Reset();
return MeshDescription;
}
UMeshDescriptionBase* UMeshDescriptionBaseBulkData::GetMeshDescription() const
{
return MeshDescription;
}
bool UMeshDescriptionBaseBulkData::HasCachedMeshDescription() const
{
return (MeshDescription != nullptr);
}
bool UMeshDescriptionBaseBulkData::CacheMeshDescription()
{
check(MeshDescription);
if (!BulkData->IsEmpty())
{
FMeshDescription NewMeshDescription;
BulkData->LoadMeshDescription(NewMeshDescription);
MeshDescription->SetMeshDescription(MoveTemp(NewMeshDescription));
return true;
}
else
{
RemoveMeshDescription();
return false;
}
}
void UMeshDescriptionBaseBulkData::CommitMeshDescription(bool bUseHashAsGuid)
{
if (MeshDescription != nullptr)
{
BulkData->SaveMeshDescription(MeshDescription->GetMeshDescription());
if (bUseHashAsGuid)
{
BulkData->UseHashAsGuid();
}
}
else
{
BulkData->Empty();
}
}
void UMeshDescriptionBaseBulkData::RemoveMeshDescription()
{
if (MeshDescription != nullptr)
{
MeshDescription->Reset();
MeshDescription = nullptr;
}
}
bool UMeshDescriptionBaseBulkData::IsBulkDataValid() const
{
return !BulkData->IsEmpty();
}
const FMeshDescriptionBulkData& UMeshDescriptionBaseBulkData::GetBulkData() const
{
return *BulkData;
}
FMeshDescriptionBulkData& UMeshDescriptionBaseBulkData::GetBulkData()
{
return *BulkData;
}
#endif