Improve StaticModel to register for Scene Rendering once the model has any LOD streamed-in
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user