Model Hot-Reloading (#4304)

* Added a ModelReloader class that handles reloading the hierarchy of assets in the correct order. A ModelReloaderSystem that is used to make sure there is only one ModelReloader at a time for a given asset. Modified the Model, ModelLodAsset, and Buffer assets to not automatically reload, and instead handle reloads manually via AssetCatalog events. Modified the MeshLoader to kick off a reload via the ModelReloaderSystem whenever a model asset is added or changed.

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Comment updates

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Minor naming and comment updates based on PR feedback

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Correcting previous commit. I flipped == to != when switching from count to find, when it should have stayed ==

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Updating RenderCommon header

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Removing unneeded headers

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Reverting RayTracingFeatureProcessor change following Doug's guidance. This logic was tricky to get right initially, and leads to TDR when incorrect, so leaving as is.

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Removing a tab

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Added missing #include for AssetId

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Adding missing RTTI header

Signed-off-by: amzn-tommy <waltont@amazon.com>

* Include ModelAsset definition intead of forward declaring it to avoid a static assert on Linux

Signed-off-by: amzn-tommy <waltont@amazon.com>
This commit is contained in:
Tommy Walton
2021-10-05 09:59:13 -07:00
committed by GitHub
parent aef1f01de2
commit 256564a3e0
15 changed files with 532 additions and 8 deletions
@@ -31,6 +31,28 @@ namespace AZ
modelAsset);
}
void Model::TEMPOrphanFromDatabase(const Data::Asset<ModelAsset>& modelAsset)
{
for (auto& modelLodAsset : modelAsset->GetLodAssets())
{
for(auto& mesh : modelLodAsset->GetMeshes())
{
for (auto& streamBufferInfo : mesh.GetStreamBufferInfoList())
{
Data::InstanceDatabase<Buffer>::Instance().TEMPOrphan(
Data::InstanceId::CreateFromAssetId(streamBufferInfo.m_bufferAssetView.GetBufferAsset().GetId()));
}
Data::InstanceDatabase<Buffer>::Instance().TEMPOrphan(
Data::InstanceId::CreateFromAssetId(mesh.GetIndexBufferAssetView().GetBufferAsset().GetId()));
}
Data::InstanceDatabase<ModelLod>::Instance().TEMPOrphan(Data::InstanceId::CreateFromAssetId(modelLodAsset.GetId()));
}
Data::InstanceDatabase<Model>::Instance().TEMPOrphan(
Data::InstanceId::CreateFromAssetId(modelAsset.GetId()));
}
size_t Model::GetLodCount() const
{
return m_lods.size();