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);
}
}