diff --git a/Source/Engine/Foliage/Foliage.cpp b/Source/Engine/Foliage/Foliage.cpp index c784178c6..9a855eba2 100644 --- a/Source/Engine/Foliage/Foliage.cpp +++ b/Source/Engine/Foliage/Foliage.cpp @@ -1229,7 +1229,7 @@ void Foliage::OnLayerChanged() void Foliage::OnEnable() { - _sceneRenderingKey = GetSceneRendering()->AddActor(this); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); // Base Actor::OnEnable(); diff --git a/Source/Engine/Graphics/RenderTask.cpp b/Source/Engine/Graphics/RenderTask.cpp index 5d4b09b9e..62ee24b2b 100644 --- a/Source/Engine/Graphics/RenderTask.cpp +++ b/Source/Engine/Graphics/RenderTask.cpp @@ -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); } diff --git a/Source/Engine/Level/Actors/Camera.cpp b/Source/Engine/Level/Actors/Camera.cpp index 76cb7d667..8ca4d675a 100644 --- a/Source/Engine/Level/Actors/Camera.cpp +++ b/Source/Engine/Level/Actors/Camera.cpp @@ -354,7 +354,7 @@ void Camera::OnEnable() { Cameras.Add(this); #if USE_EDITOR - _sceneRenderingKey = GetSceneRendering()->AddActor(this); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); #endif // Base diff --git a/Source/Engine/Level/Actors/Decal.cpp b/Source/Engine/Level/Actors/Decal.cpp index ebf9f7361..20df5e21b 100644 --- a/Source/Engine/Level/Actors/Decal.cpp +++ b/Source/Engine/Level/Actors/Decal.cpp @@ -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 diff --git a/Source/Engine/Level/Actors/DirectionalLight.cpp b/Source/Engine/Level/Actors/DirectionalLight.cpp index e8bcfbba4..7391691b3 100644 --- a/Source/Engine/Level/Actors/DirectionalLight.cpp +++ b/Source/Engine/Level/Actors/DirectionalLight.cpp @@ -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 diff --git a/Source/Engine/Level/Actors/EnvironmentProbe.cpp b/Source/Engine/Level/Actors/EnvironmentProbe.cpp index 6ad0c6091..51bab7cf4 100644 --- a/Source/Engine/Level/Actors/EnvironmentProbe.cpp +++ b/Source/Engine/Level/Actors/EnvironmentProbe.cpp @@ -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 diff --git a/Source/Engine/Level/Actors/ExponentialHeightFog.cpp b/Source/Engine/Level/Actors/ExponentialHeightFog.cpp index 5521b888d..712051250 100644 --- a/Source/Engine/Level/Actors/ExponentialHeightFog.cpp +++ b/Source/Engine/Level/Actors/ExponentialHeightFog.cpp @@ -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 diff --git a/Source/Engine/Level/Actors/ModelInstanceActor.cpp b/Source/Engine/Level/Actors/ModelInstanceActor.cpp index a6470b98a..8cf3a3620 100644 --- a/Source/Engine/Level/Actors/ModelInstanceActor.cpp +++ b/Source/Engine/Level/Actors/ModelInstanceActor.cpp @@ -39,7 +39,7 @@ void ModelInstanceActor::OnLayerChanged() void ModelInstanceActor::OnEnable() { - _sceneRenderingKey = GetSceneRendering()->AddActor(this); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); // Base Actor::OnEnable(); diff --git a/Source/Engine/Level/Actors/PointLight.cpp b/Source/Engine/Level/Actors/PointLight.cpp index 9c827a877..04024e480 100644 --- a/Source/Engine/Level/Actors/PointLight.cpp +++ b/Source/Engine/Level/Actors/PointLight.cpp @@ -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 diff --git a/Source/Engine/Level/Actors/Sky.cpp b/Source/Engine/Level/Actors/Sky.cpp index c5107ae0c..59d95d3f8 100644 --- a/Source/Engine/Level/Actors/Sky.cpp +++ b/Source/Engine/Level/Actors/Sky.cpp @@ -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 diff --git a/Source/Engine/Level/Actors/SkyLight.cpp b/Source/Engine/Level/Actors/SkyLight.cpp index a5d4fb0a3..d7bfa4c7b 100644 --- a/Source/Engine/Level/Actors/SkyLight.cpp +++ b/Source/Engine/Level/Actors/SkyLight.cpp @@ -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 diff --git a/Source/Engine/Level/Actors/Skybox.cpp b/Source/Engine/Level/Actors/Skybox.cpp index 580145da3..f76beff7e 100644 --- a/Source/Engine/Level/Actors/Skybox.cpp +++ b/Source/Engine/Level/Actors/Skybox.cpp @@ -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 diff --git a/Source/Engine/Level/Actors/SpotLight.cpp b/Source/Engine/Level/Actors/SpotLight.cpp index 8dbea083c..234786e3c 100644 --- a/Source/Engine/Level/Actors/SpotLight.cpp +++ b/Source/Engine/Level/Actors/SpotLight.cpp @@ -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 diff --git a/Source/Engine/Level/Actors/StaticModel.cpp b/Source/Engine/Level/Actors/StaticModel.cpp index 41cb38515..58328d223 100644 --- a/Source/Engine/Level/Actors/StaticModel.cpp +++ b/Source/Engine/Level/Actors/StaticModel.cpp @@ -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(this); + _residencyChangedModel->ResidencyChanged.Bind(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(this); _residencyChangedModel = nullptr; - Model->ResidencyChanged.Unbind(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(this); _residencyChangedModel = nullptr; - Model->ResidencyChanged.Unbind(this); } } diff --git a/Source/Engine/Level/Scene/SceneRendering.cpp b/Source/Engine/Level/Scene/SceneRendering.cpp index 3090fd798..affd8e576 100644 --- a/Source/Engine/Level/Scene/SceneRendering.cpp +++ b/Source/Engine/Level/Scene/SceneRendering.cpp @@ -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) diff --git a/Source/Engine/Level/Scene/SceneRendering.h b/Source/Engine/Level/Scene/SceneRendering.h index 9aed3e3b7..9faa8d6f5 100644 --- a/Source/Engine/Level/Scene/SceneRendering.h +++ b/Source/Engine/Level/Scene/SceneRendering.h @@ -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); diff --git a/Source/Engine/Particles/ParticleEffect.cpp b/Source/Engine/Particles/ParticleEffect.cpp index 6275509e5..078690337 100644 --- a/Source/Engine/Particles/ParticleEffect.cpp +++ b/Source/Engine/Particles/ParticleEffect.cpp @@ -700,7 +700,7 @@ void ParticleEffect::EndPlay() void ParticleEffect::OnEnable() { GetScene()->Ticking.Update.AddTick(this); - _sceneRenderingKey = GetSceneRendering()->AddActor(this); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); #if USE_EDITOR GetSceneRendering()->AddViewportIcon(this); GetScene()->Ticking.Update.AddTickExecuteInEditor(this); diff --git a/Source/Engine/Terrain/Terrain.cpp b/Source/Engine/Terrain/Terrain.cpp index 40916a095..baba38123 100644 --- a/Source/Engine/Terrain/Terrain.cpp +++ b/Source/Engine/Terrain/Terrain.cpp @@ -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(this); #endif diff --git a/Source/Engine/UI/SpriteRender.cpp b/Source/Engine/UI/SpriteRender.cpp index 3b4f9d3b8..4b4402bbc 100644 --- a/Source/Engine/UI/SpriteRender.cpp +++ b/Source/Engine/UI/SpriteRender.cpp @@ -190,7 +190,7 @@ void SpriteRender::OnEndPlay() void SpriteRender::OnEnable() { - _sceneRenderingKey = GetSceneRendering()->AddActor(this); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); // Base Actor::OnEnable(); diff --git a/Source/Engine/UI/TextRender.cpp b/Source/Engine/UI/TextRender.cpp index 93051d500..ccce0530a 100644 --- a/Source/Engine/UI/TextRender.cpp +++ b/Source/Engine/UI/TextRender.cpp @@ -496,7 +496,7 @@ void TextRender::OnEnable() { UpdateLayout(); } - _sceneRenderingKey = GetSceneRendering()->AddActor(this); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); } void TextRender::OnDisable()