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()
|
void StaticModel::OnModelChanged()
|
||||||
{
|
{
|
||||||
|
if (_residencyChangedModel)
|
||||||
|
{
|
||||||
|
_residencyChangedModel = nullptr;
|
||||||
|
Model->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
|
||||||
|
}
|
||||||
RemoveVertexColors();
|
RemoveVertexColors();
|
||||||
Entries.Release();
|
Entries.Release();
|
||||||
|
|
||||||
if (Model && !Model->IsLoaded())
|
if (Model && !Model->IsLoaded())
|
||||||
{
|
|
||||||
UpdateBounds();
|
UpdateBounds();
|
||||||
}
|
else if (!Model && _sceneRenderingKey != -1)
|
||||||
|
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StaticModel::OnModelLoaded()
|
void StaticModel::OnModelLoaded()
|
||||||
{
|
{
|
||||||
Entries.SetupIfInvalid(Model);
|
Entries.SetupIfInvalid(Model);
|
||||||
|
|
||||||
UpdateBounds();
|
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()
|
void StaticModel::UpdateBounds()
|
||||||
@@ -488,3 +514,28 @@ void StaticModel::OnTransformChanged()
|
|||||||
_transform.GetWorld(_world);
|
_transform.GetWorld(_world);
|
||||||
UpdateBounds();
|
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;
|
byte _vertexColorsCount;
|
||||||
Array<Color32> _vertexColorsData[MODEL_MAX_LODS];
|
Array<Color32> _vertexColorsData[MODEL_MAX_LODS];
|
||||||
GPUBuffer* _vertexColorsBuffer[MODEL_MAX_LODS];
|
GPUBuffer* _vertexColorsBuffer[MODEL_MAX_LODS];
|
||||||
|
Model* _residencyChangedModel = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -182,6 +183,7 @@ private:
|
|||||||
|
|
||||||
void OnModelChanged();
|
void OnModelChanged();
|
||||||
void OnModelLoaded();
|
void OnModelLoaded();
|
||||||
|
void OnModelResidencyChanged();
|
||||||
void UpdateBounds();
|
void UpdateBounds();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -199,4 +201,6 @@ protected:
|
|||||||
|
|
||||||
// [ModelInstanceActor]
|
// [ModelInstanceActor]
|
||||||
void OnTransformChanged() override;
|
void OnTransformChanged() override;
|
||||||
|
void OnEnable() override;
|
||||||
|
void OnDisable() override;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "Engine/Graphics/RenderTask.h"
|
#include "Engine/Graphics/RenderTask.h"
|
||||||
#include "Engine/Graphics/RenderView.h"
|
#include "Engine/Graphics/RenderView.h"
|
||||||
#include "Engine/Renderer/RenderList.h"
|
#include "Engine/Renderer/RenderList.h"
|
||||||
|
#include "Engine/Threading/Threading.h"
|
||||||
#if SCENE_RENDERING_USE_PROFILER
|
#if SCENE_RENDERING_USE_PROFILER
|
||||||
#include "Engine/Profiler/ProfilerCPU.h"
|
#include "Engine/Profiler/ProfilerCPU.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -29,6 +30,7 @@ void ISceneRenderingListener::ListenSceneRendering(SceneRendering* scene)
|
|||||||
|
|
||||||
void SceneRendering::Draw(RenderContext& renderContext)
|
void SceneRendering::Draw(RenderContext& renderContext)
|
||||||
{
|
{
|
||||||
|
ScopeLock lock(Locker);
|
||||||
auto& view = renderContext.View;
|
auto& view = renderContext.View;
|
||||||
const BoundingFrustum frustum = view.CullingFrustum;
|
const BoundingFrustum frustum = view.CullingFrustum;
|
||||||
renderContext.List->Scenes.Add(this);
|
renderContext.List->Scenes.Add(this);
|
||||||
@@ -90,6 +92,7 @@ void SceneRendering::CollectPostFxVolumes(RenderContext& renderContext)
|
|||||||
|
|
||||||
void SceneRendering::Clear()
|
void SceneRendering::Clear()
|
||||||
{
|
{
|
||||||
|
ScopeLock lock(Locker);
|
||||||
for (auto* listener : _listeners)
|
for (auto* listener : _listeners)
|
||||||
{
|
{
|
||||||
listener->OnSceneRenderingClear(this);
|
listener->OnSceneRenderingClear(this);
|
||||||
@@ -104,6 +107,7 @@ void SceneRendering::Clear()
|
|||||||
|
|
||||||
int32 SceneRendering::AddActor(Actor* a)
|
int32 SceneRendering::AddActor(Actor* a)
|
||||||
{
|
{
|
||||||
|
ScopeLock lock(Locker);
|
||||||
int32 key = 0;
|
int32 key = 0;
|
||||||
// TODO: track removedCount and skip searching for free entry if there is none
|
// TODO: track removedCount and skip searching for free entry if there is none
|
||||||
for (; key < Actors.Count(); key++)
|
for (; key < Actors.Count(); key++)
|
||||||
@@ -125,6 +129,7 @@ int32 SceneRendering::AddActor(Actor* a)
|
|||||||
|
|
||||||
void SceneRendering::UpdateActor(Actor* a, int32 key)
|
void SceneRendering::UpdateActor(Actor* a, int32 key)
|
||||||
{
|
{
|
||||||
|
ScopeLock lock(Locker);
|
||||||
if (Actors.IsEmpty())
|
if (Actors.IsEmpty())
|
||||||
return;
|
return;
|
||||||
auto& e = Actors[key];
|
auto& e = Actors[key];
|
||||||
@@ -137,6 +142,7 @@ void SceneRendering::UpdateActor(Actor* a, int32 key)
|
|||||||
|
|
||||||
void SceneRendering::RemoveActor(Actor* a, int32& key)
|
void SceneRendering::RemoveActor(Actor* a, int32& key)
|
||||||
{
|
{
|
||||||
|
ScopeLock lock(Locker);
|
||||||
if (Actors.HasItems())
|
if (Actors.HasItems())
|
||||||
{
|
{
|
||||||
auto& e = Actors[key];
|
auto& e = Actors[key];
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "Engine/Core/Collections/Array.h"
|
#include "Engine/Core/Collections/Array.h"
|
||||||
#include "Engine/Core/Math/BoundingSphere.h"
|
#include "Engine/Core/Math/BoundingSphere.h"
|
||||||
#include "Engine/Level/Actor.h"
|
#include "Engine/Level/Actor.h"
|
||||||
|
#include "Engine/Platform/CriticalSection.h"
|
||||||
|
|
||||||
class SceneRenderTask;
|
class SceneRenderTask;
|
||||||
class SceneRendering;
|
class SceneRendering;
|
||||||
@@ -75,6 +76,7 @@ public:
|
|||||||
|
|
||||||
Array<DrawActor> Actors;
|
Array<DrawActor> Actors;
|
||||||
Array<IPostFxSettingsProvider*> PostFxProviders;
|
Array<IPostFxSettingsProvider*> PostFxProviders;
|
||||||
|
CriticalSection Locker;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#if USE_EDITOR
|
#if USE_EDITOR
|
||||||
|
|||||||
Reference in New Issue
Block a user