Fix static model registering for rendering after streaming in even if disabled
This commit is contained in:
@@ -1229,7 +1229,7 @@ void Foliage::OnLayerChanged()
|
||||
|
||||
void Foliage::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
|
||||
// Base
|
||||
Actor::OnEnable();
|
||||
|
||||
@@ -276,7 +276,8 @@ void AddActorToSceneRendering(SceneRendering* s, Actor* a)
|
||||
{
|
||||
if (a && a->IsActiveInHierarchy())
|
||||
{
|
||||
s->AddActor(a);
|
||||
int32 key = -1;
|
||||
s->AddActor(a, key);
|
||||
for (Actor* child : a->Children)
|
||||
AddActorToSceneRendering(s, child);
|
||||
}
|
||||
|
||||
@@ -354,7 +354,7 @@ void Camera::OnEnable()
|
||||
{
|
||||
Cameras.Add(this);
|
||||
#if USE_EDITOR
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#endif
|
||||
|
||||
// Base
|
||||
|
||||
@@ -122,7 +122,7 @@ bool Decal::IntersectsItself(const Ray& ray, float& distance, Vector3& normal)
|
||||
|
||||
void Decal::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
#endif
|
||||
|
||||
@@ -68,7 +68,7 @@ bool DirectionalLight::IntersectsItself(const Ray& ray, float& distance, Vector3
|
||||
|
||||
void DirectionalLight::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
#endif
|
||||
|
||||
@@ -202,7 +202,7 @@ bool EnvironmentProbe::IntersectsItself(const Ray& ray, float& distance, Vector3
|
||||
|
||||
void EnvironmentProbe::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
#endif
|
||||
|
||||
@@ -205,7 +205,7 @@ void ExponentialHeightFog::DrawFog(GPUContext* context, RenderContext& renderCon
|
||||
|
||||
void ExponentialHeightFog::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
#endif
|
||||
|
||||
@@ -39,7 +39,7 @@ void ModelInstanceActor::OnLayerChanged()
|
||||
|
||||
void ModelInstanceActor::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
|
||||
// Base
|
||||
Actor::OnEnable();
|
||||
|
||||
@@ -71,7 +71,7 @@ void PointLight::UpdateBounds()
|
||||
|
||||
void PointLight::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
#endif
|
||||
|
||||
@@ -239,7 +239,7 @@ void Sky::EndPlay()
|
||||
|
||||
void Sky::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
#endif
|
||||
|
||||
@@ -171,7 +171,7 @@ bool SkyLight::HasContentLoaded() const
|
||||
|
||||
void SkyLight::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
#endif
|
||||
|
||||
@@ -122,7 +122,7 @@ void Skybox::ApplySky(GPUContext* context, RenderContext& renderContext, const M
|
||||
|
||||
void Skybox::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
#endif
|
||||
|
||||
@@ -119,7 +119,7 @@ void SpotLight::UpdateBounds()
|
||||
|
||||
void SpotLight::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
#endif
|
||||
|
||||
@@ -180,28 +180,28 @@ void StaticModel::OnModelLoaded()
|
||||
{
|
||||
Entries.SetupIfInvalid(Model);
|
||||
UpdateBounds();
|
||||
if (_sceneRenderingKey == -1 && _scene)
|
||||
if (_sceneRenderingKey == -1 && _scene && _isActiveInHierarchy && _isEnabled && !_residencyChangedModel)
|
||||
{
|
||||
// Register for rendering but once the model has any LOD loaded
|
||||
if (Model->GetLoadedLODs() == 0)
|
||||
{
|
||||
_residencyChangedModel = Model;
|
||||
Model->ResidencyChanged.Bind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
|
||||
_residencyChangedModel->ResidencyChanged.Bind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void StaticModel::OnModelResidencyChanged()
|
||||
{
|
||||
if (_sceneRenderingKey == -1 && _scene && Model && Model->GetLoadedLODs() > 0)
|
||||
if (_sceneRenderingKey == -1 && _scene && Model && Model->GetLoadedLODs() > 0 && _residencyChangedModel)
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
_residencyChangedModel->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
|
||||
_residencyChangedModel = nullptr;
|
||||
Model->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -517,8 +517,10 @@ void StaticModel::OnTransformChanged()
|
||||
|
||||
void StaticModel::OnEnable()
|
||||
{
|
||||
if (_scene && Model && Model->IsLoaded() && Model->GetLoadedLODs() > 0 && _sceneRenderingKey == -1)
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
if (_scene && _sceneRenderingKey == -1 && !_residencyChangedModel && Model && Model->IsLoaded() && Model->GetLoadedLODs() != 0)
|
||||
{
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
}
|
||||
|
||||
// Skip ModelInstanceActor (add to SceneRendering manually)
|
||||
Actor::OnEnable();
|
||||
@@ -533,9 +535,9 @@ void StaticModel::OnDisable()
|
||||
{
|
||||
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
|
||||
}
|
||||
else if (_residencyChangedModel)
|
||||
if (_residencyChangedModel)
|
||||
{
|
||||
_residencyChangedModel->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
|
||||
_residencyChangedModel = nullptr;
|
||||
Model->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,26 +105,28 @@ void SceneRendering::Clear()
|
||||
#endif
|
||||
}
|
||||
|
||||
int32 SceneRendering::AddActor(Actor* a)
|
||||
void SceneRendering::AddActor(Actor* a, int32& key)
|
||||
{
|
||||
ScopeLock lock(Locker);
|
||||
int32 key = 0;
|
||||
// TODO: track removedCount and skip searching for free entry if there is none
|
||||
for (; key < Actors.Count(); key++)
|
||||
if (key == -1)
|
||||
{
|
||||
if (Actors[key].Actor == nullptr)
|
||||
break;
|
||||
// TODO: track removedCount and skip searching for free entry if there is none
|
||||
key = 0;
|
||||
for (; key < Actors.Count(); key++)
|
||||
{
|
||||
if (Actors[key].Actor == nullptr)
|
||||
break;
|
||||
}
|
||||
if (key == Actors.Count())
|
||||
Actors.AddOne();
|
||||
auto& e = Actors[key];
|
||||
e.Actor = a;
|
||||
e.LayerMask = a->GetLayerMask();
|
||||
e.Bounds = a->GetSphere();
|
||||
e.NoCulling = a->_drawNoCulling;
|
||||
for (auto* listener : _listeners)
|
||||
listener->OnSceneRenderingAddActor(a);
|
||||
}
|
||||
if (key == Actors.Count())
|
||||
Actors.AddOne();
|
||||
auto& e = Actors[key];
|
||||
e.Actor = a;
|
||||
e.LayerMask = a->GetLayerMask();
|
||||
e.Bounds = a->GetSphere();
|
||||
e.NoCulling = a->_drawNoCulling;
|
||||
for (auto* listener : _listeners)
|
||||
listener->OnSceneRenderingAddActor(a);
|
||||
return key;
|
||||
}
|
||||
|
||||
void SceneRendering::UpdateActor(Actor* a, int32 key)
|
||||
|
||||
@@ -107,7 +107,7 @@ public:
|
||||
void Clear();
|
||||
|
||||
public:
|
||||
int32 AddActor(Actor* a);
|
||||
void AddActor(Actor* a, int32& key);
|
||||
void UpdateActor(Actor* a, int32 key);
|
||||
void RemoveActor(Actor* a, int32& key);
|
||||
|
||||
|
||||
@@ -700,7 +700,7 @@ void ParticleEffect::EndPlay()
|
||||
void ParticleEffect::OnEnable()
|
||||
{
|
||||
GetScene()->Ticking.Update.AddTick<ParticleEffect, &ParticleEffect::Update>(this);
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if USE_EDITOR
|
||||
GetSceneRendering()->AddViewportIcon(this);
|
||||
GetScene()->Ticking.Update.AddTickExecuteInEditor<ParticleEffect, &ParticleEffect::UpdateExecuteInEditor>(this);
|
||||
|
||||
@@ -743,7 +743,7 @@ RigidBody* Terrain::GetAttachedRigidBody() const
|
||||
|
||||
void Terrain::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
#if TERRAIN_USE_PHYSICS_DEBUG
|
||||
GetSceneRendering()->AddPhysicsDebug<Terrain, &Terrain::DrawPhysicsDebug>(this);
|
||||
#endif
|
||||
|
||||
@@ -190,7 +190,7 @@ void SpriteRender::OnEndPlay()
|
||||
|
||||
void SpriteRender::OnEnable()
|
||||
{
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
|
||||
// Base
|
||||
Actor::OnEnable();
|
||||
|
||||
@@ -496,7 +496,7 @@ void TextRender::OnEnable()
|
||||
{
|
||||
UpdateLayout();
|
||||
}
|
||||
_sceneRenderingKey = GetSceneRendering()->AddActor(this);
|
||||
GetSceneRendering()->AddActor(this, _sceneRenderingKey);
|
||||
}
|
||||
|
||||
void TextRender::OnDisable()
|
||||
|
||||
Reference in New Issue
Block a user