Improve StaticModel to register for Scene Rendering once the model has any LOD streamed-in

This commit is contained in:
Wojciech Figat
2022-04-21 12:39:27 +02:00
parent 5345d1f685
commit b3d18f3b0e
4 changed files with 67 additions and 4 deletions

View File

@@ -163,20 +163,46 @@ void StaticModel::RemoveVertexColors()
void StaticModel::OnModelChanged()
{
if (_residencyChangedModel)
{
_residencyChangedModel = nullptr;
Model->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
}
RemoveVertexColors();
Entries.Release();
if (Model && !Model->IsLoaded())
{
UpdateBounds();
}
else if (!Model && _sceneRenderingKey != -1)
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
}
void StaticModel::OnModelLoaded()
{
Entries.SetupIfInvalid(Model);
UpdateBounds();
if (_sceneRenderingKey == -1 && _scene)
{
// Register for rendering but once the model has any LOD loaded
if (Model->GetLoadedLODs() == 0)
{
_residencyChangedModel = Model;
Model->ResidencyChanged.Bind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
}
else
{
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
}
}
}
void StaticModel::OnModelResidencyChanged()
{
if (_sceneRenderingKey == -1 && _scene && Model && Model->GetLoadedLODs() > 0)
{
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
_residencyChangedModel = nullptr;
Model->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
}
}
void StaticModel::UpdateBounds()
@@ -488,3 +514,28 @@ void StaticModel::OnTransformChanged()
_transform.GetWorld(_world);
UpdateBounds();
}
void StaticModel::OnEnable()
{
if (_scene && Model && Model->IsLoaded() && Model->GetLoadedLODs() > 0 && _sceneRenderingKey == -1)
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
// Skip ModelInstanceActor (add to SceneRendering manually)
Actor::OnEnable();
}
void StaticModel::OnDisable()
{
// Skip ModelInstanceActor (add to SceneRendering manually)
Actor::OnDisable();
if (_sceneRenderingKey != -1)
{
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
}
else if (_residencyChangedModel)
{
_residencyChangedModel = nullptr;
Model->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
}
}

View File

@@ -25,6 +25,7 @@ private:
byte _vertexColorsCount;
Array<Color32> _vertexColorsData[MODEL_MAX_LODS];
GPUBuffer* _vertexColorsBuffer[MODEL_MAX_LODS];
Model* _residencyChangedModel = nullptr;
public:
@@ -182,6 +183,7 @@ private:
void OnModelChanged();
void OnModelLoaded();
void OnModelResidencyChanged();
void UpdateBounds();
public:
@@ -199,4 +201,6 @@ protected:
// [ModelInstanceActor]
void OnTransformChanged() override;
void OnEnable() override;
void OnDisable() override;
};

View File

@@ -6,6 +6,7 @@
#include "Engine/Graphics/RenderTask.h"
#include "Engine/Graphics/RenderView.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Threading/Threading.h"
#if SCENE_RENDERING_USE_PROFILER
#include "Engine/Profiler/ProfilerCPU.h"
#endif
@@ -29,6 +30,7 @@ void ISceneRenderingListener::ListenSceneRendering(SceneRendering* scene)
void SceneRendering::Draw(RenderContext& renderContext)
{
ScopeLock lock(Locker);
auto& view = renderContext.View;
const BoundingFrustum frustum = view.CullingFrustum;
renderContext.List->Scenes.Add(this);
@@ -90,6 +92,7 @@ void SceneRendering::CollectPostFxVolumes(RenderContext& renderContext)
void SceneRendering::Clear()
{
ScopeLock lock(Locker);
for (auto* listener : _listeners)
{
listener->OnSceneRenderingClear(this);
@@ -104,6 +107,7 @@ void SceneRendering::Clear()
int32 SceneRendering::AddActor(Actor* a)
{
ScopeLock lock(Locker);
int32 key = 0;
// TODO: track removedCount and skip searching for free entry if there is none
for (; key < Actors.Count(); key++)
@@ -125,6 +129,7 @@ int32 SceneRendering::AddActor(Actor* a)
void SceneRendering::UpdateActor(Actor* a, int32 key)
{
ScopeLock lock(Locker);
if (Actors.IsEmpty())
return;
auto& e = Actors[key];
@@ -137,6 +142,7 @@ void SceneRendering::UpdateActor(Actor* a, int32 key)
void SceneRendering::RemoveActor(Actor* a, int32& key)
{
ScopeLock lock(Locker);
if (Actors.HasItems())
{
auto& e = Actors[key];

View File

@@ -6,6 +6,7 @@
#include "Engine/Core/Collections/Array.h"
#include "Engine/Core/Math/BoundingSphere.h"
#include "Engine/Level/Actor.h"
#include "Engine/Platform/CriticalSection.h"
class SceneRenderTask;
class SceneRendering;
@@ -75,6 +76,7 @@ public:
Array<DrawActor> Actors;
Array<IPostFxSettingsProvider*> PostFxProviders;
CriticalSection Locker;
private:
#if USE_EDITOR