From 16ebc72099064af54f96995a9542006bda0f0b89 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 16 Nov 2022 09:57:17 +0100 Subject: [PATCH] Fix rendering of custom actors lists in Editor viewports --- Source/Engine/Foliage/Foliage.cpp | 26 +++++++++---------- Source/Engine/Graphics/RenderTask.cpp | 16 +++++++----- Source/Engine/Level/Actor.cpp | 1 + Source/Engine/Level/Actor.h | 11 ++++---- Source/Engine/Level/Actors/AnimatedModel.cpp | 5 ++-- Source/Engine/Level/Actors/Decal.cpp | 9 ++++--- .../Engine/Level/Actors/DirectionalLight.cpp | 22 ---------------- Source/Engine/Level/Actors/DirectionalLight.h | 5 ---- .../Engine/Level/Actors/EnvironmentProbe.cpp | 9 ++++--- .../Level/Actors/ExponentialHeightFog.cpp | 5 ++-- Source/Engine/Level/Actors/Light.cpp | 23 ++++++++++++++++ Source/Engine/Level/Actors/Light.h | 5 ++++ .../Level/Actors/ModelInstanceActor.cpp | 12 ++++----- Source/Engine/Level/Actors/PointLight.cpp | 26 ++----------------- Source/Engine/Level/Actors/PointLight.h | 3 --- Source/Engine/Level/Actors/Sky.cpp | 5 ++-- Source/Engine/Level/Actors/SkyLight.cpp | 22 ---------------- Source/Engine/Level/Actors/SkyLight.h | 3 --- Source/Engine/Level/Actors/Skybox.cpp | 5 ++-- Source/Engine/Level/Actors/SplineModel.cpp | 3 ++- Source/Engine/Level/Actors/SpotLight.cpp | 24 +---------------- Source/Engine/Level/Actors/SpotLight.h | 3 --- Source/Engine/Level/Actors/StaticModel.cpp | 13 +++++----- Source/Engine/Level/Scene/SceneRendering.cpp | 25 +++++++++--------- Source/Engine/Level/Scene/SceneRendering.h | 6 ++--- Source/Engine/Terrain/Terrain.cpp | 9 ++++--- 26 files changed, 118 insertions(+), 178 deletions(-) diff --git a/Source/Engine/Foliage/Foliage.cpp b/Source/Engine/Foliage/Foliage.cpp index 1fa246913..d28c26cc1 100644 --- a/Source/Engine/Foliage/Foliage.cpp +++ b/Source/Engine/Foliage/Foliage.cpp @@ -22,13 +22,6 @@ #include "Engine/Serialization/Serialization.h" #include "Engine/Utilities/Encryption.h" -// When using separate quad-tree for each foliage type we can run async job to draw them in separate, otherwise just draw whole foliage in async as one -#if FOLIAGE_USE_SINGLE_QUAD_TREE -#define FOLIAGE_SCENE_DRAW_CATEGORY SceneRendering::SceneDrawAsync -#else -#define FOLIAGE_SCENE_DRAW_CATEGORY SceneRendering::SceneDraw -#endif - #define FOLIAGE_GET_DRAW_MODES(renderContext, type) static_cast(type.DrawModes & renderContext.View.Pass & (int32)renderContext.View.GetShadowsDrawPassMask(type.ShadowsMode)) #define FOLIAGE_CAN_DRAW(renderContext, type) (type.IsReady() && FOLIAGE_GET_DRAW_MODES(renderContext, type) != DrawPass::None && type.Model->CanBeRendered()) @@ -36,6 +29,13 @@ Foliage::Foliage(const SpawnParams& params) : Actor(params) { _disableFoliageTypeEvents = false; + + // When using separate quad-tree for each foliage type we can run async job to draw them in separate, otherwise just draw whole foliage in async as one +#if FOLIAGE_USE_SINGLE_QUAD_TREE + _drawCategory = SceneRendering::SceneDrawAsync; +#else + _drawCategory = SceneRendering::SceneDraw; +#endif } void Foliage::AddToCluster(ChunkedArray& clusters, FoliageCluster* cluster, FoliageInstance& instance) @@ -795,7 +795,7 @@ void Foliage::OnFoliageTypeModelLoaded(int32 index) } BoundingSphere::FromBox(_box, _sphere); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } { PROFILE_CPU_NAMED("Create Clusters"); @@ -842,7 +842,7 @@ void Foliage::RebuildClusters() _box = BoundingBox(_transform.Translation, _transform.Translation); _sphere = BoundingSphere(_transform.Translation, 0.0f); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); return; } @@ -932,7 +932,7 @@ void Foliage::RebuildClusters() _box = totalBounds; BoundingSphere::FromBox(_box, _sphere); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } // Insert all instances to the clusters @@ -1459,12 +1459,12 @@ void Foliage::Deserialize(DeserializeStream& stream, ISerializeModifier* modifie void Foliage::OnLayerChanged() { if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void Foliage::OnEnable() { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); // Base Actor::OnEnable(); @@ -1472,7 +1472,7 @@ void Foliage::OnEnable() void Foliage::OnDisable() { - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); // Base Actor::OnDisable(); diff --git a/Source/Engine/Graphics/RenderTask.cpp b/Source/Engine/Graphics/RenderTask.cpp index c1e9fc5d5..c88837823 100644 --- a/Source/Engine/Graphics/RenderTask.cpp +++ b/Source/Engine/Graphics/RenderTask.cpp @@ -264,12 +264,16 @@ void SceneRenderTask::OnCollectDrawCalls(RenderContextBatch& renderContextBatch, // Draw actors (collect draw calls) if ((ActorsSource & ActorsSources::CustomActors) != 0) { - if (_customActorsScene == nullptr) - _customActorsScene = New(); - else - _customActorsScene->Clear(); - for (Actor* a : CustomActors) - AddActorToSceneRendering(_customActorsScene, a); + if (category == SceneRendering::DrawCategory::PreRender) + { + if (_customActorsScene == nullptr) + _customActorsScene = New(); + else + _customActorsScene->Clear(); + for (Actor* a : CustomActors) + AddActorToSceneRendering(_customActorsScene, a); + } + ASSERT_LOW_LAYER(_customActorsScene); _customActorsScene->Draw(renderContextBatch, (SceneRendering::DrawCategory)category); } if ((ActorsSource & ActorsSources::Scenes) != 0) diff --git a/Source/Engine/Level/Actor.cpp b/Source/Engine/Level/Actor.cpp index d521401d6..1c4f4a2e1 100644 --- a/Source/Engine/Level/Actor.cpp +++ b/Source/Engine/Level/Actor.cpp @@ -84,6 +84,7 @@ Actor::Actor(const SpawnParams& params) , HideFlags(HideFlags::None) { _drawNoCulling = 0; + _drawCategory = 0; } SceneRendering* Actor::GetSceneRendering() const diff --git a/Source/Engine/Level/Actor.h b/Source/Engine/Level/Actor.h index 2d78dad69..266feda70 100644 --- a/Source/Engine/Level/Actor.h +++ b/Source/Engine/Level/Actor.h @@ -36,11 +36,12 @@ API_CLASS(Abstract) class FLAXENGINE_API Actor : public SceneObject friend PrefabInstanceData; protected: - int8 _isActive : 1; - int8 _isActiveInHierarchy : 1; - int8 _isPrefabRoot : 1; - int8 _isEnabled : 1; - int8 _drawNoCulling : 1; + int16 _isActive : 1; + int16 _isActiveInHierarchy : 1; + int16 _isPrefabRoot : 1; + int16 _isEnabled : 1; + int16 _drawNoCulling : 1; + int16 _drawCategory : 4; byte _layer; byte _tag; StaticFlags _staticFlags; diff --git a/Source/Engine/Level/Actors/AnimatedModel.cpp b/Source/Engine/Level/Actors/AnimatedModel.cpp index 61243b1a3..9ee6bd511 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.cpp +++ b/Source/Engine/Level/Actors/AnimatedModel.cpp @@ -22,6 +22,7 @@ AnimatedModel::AnimatedModel(const SpawnParams& params) , _lastMinDstSqr(MAX_Real) , _lastUpdateFrame(0) { + _drawCategory = SceneRendering::SceneDrawAsync; GraphInstance.Object = this; _box = _boxLocal = BoundingBox(Vector3::Zero); _sphere = BoundingSphere(Vector3::Zero, 0.0f); @@ -555,7 +556,7 @@ void AnimatedModel::UpdateBounds() BoundingBox::Transform(_boxLocal, _transform, _box); BoundingSphere::FromBox(_box, _sphere); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void AnimatedModel::UpdateSockets() @@ -960,7 +961,7 @@ void AnimatedModel::OnTransformChanged() BoundingBox::Transform(_boxLocal, _transform, _box); BoundingSphere::FromBox(_box, _sphere); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void AnimatedModel::WaitForModelLoad() diff --git a/Source/Engine/Level/Actors/Decal.cpp b/Source/Engine/Level/Actors/Decal.cpp index ab10c8ed0..97a61c5ed 100644 --- a/Source/Engine/Level/Actors/Decal.cpp +++ b/Source/Engine/Level/Actors/Decal.cpp @@ -13,6 +13,7 @@ Decal::Decal(const SpawnParams& params) : Actor(params) , _size(100.0f) { + _drawCategory = SceneRendering::PreRender; _bounds.Extents = _size * 0.5f; _bounds.Transformation = _transform; _bounds.GetBoundingBox(_box); @@ -63,7 +64,7 @@ BoundingBox Decal::GetEditorBox() const void Decal::OnLayerChanged() { if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void Decal::Draw(RenderContext& renderContext) @@ -118,7 +119,7 @@ bool Decal::IntersectsItself(const Ray& ray, Real& distance, Vector3& normal) void Decal::OnEnable() { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); #if USE_EDITOR GetSceneRendering()->AddViewportIcon(this); #endif @@ -132,7 +133,7 @@ void Decal::OnDisable() #if USE_EDITOR GetSceneRendering()->RemoveViewportIcon(this); #endif - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); // Base Actor::OnDisable(); @@ -148,5 +149,5 @@ void Decal::OnTransformChanged() BoundingSphere::FromBox(_box, _sphere); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } diff --git a/Source/Engine/Level/Actors/DirectionalLight.cpp b/Source/Engine/Level/Actors/DirectionalLight.cpp index 38c438d4f..dafea8118 100644 --- a/Source/Engine/Level/Actors/DirectionalLight.cpp +++ b/Source/Engine/Level/Actors/DirectionalLight.cpp @@ -71,28 +71,6 @@ bool DirectionalLight::IntersectsItself(const Ray& ray, Real& distance, Vector3& return false; } -void DirectionalLight::OnEnable() -{ - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); -#if USE_EDITOR - GetSceneRendering()->AddViewportIcon(this); -#endif - - // Base - LightWithShadow::OnEnable(); -} - -void DirectionalLight::OnDisable() -{ -#if USE_EDITOR - GetSceneRendering()->RemoveViewportIcon(this); -#endif - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); - - // Base - LightWithShadow::OnDisable(); -} - void DirectionalLight::OnTransformChanged() { // Base diff --git a/Source/Engine/Level/Actors/DirectionalLight.h b/Source/Engine/Level/Actors/DirectionalLight.h index 44a400a13..1e89e7aa3 100644 --- a/Source/Engine/Level/Actors/DirectionalLight.h +++ b/Source/Engine/Level/Actors/DirectionalLight.h @@ -10,9 +10,6 @@ API_CLASS() class FLAXENGINE_API DirectionalLight : public LightWithShadow { DECLARE_SCENE_OBJECT(DirectionalLight); -private: - int32 _sceneRenderingKey = -1; - public: /// /// The number of cascades used for slicing the range of depth covered by the light. Values are 1, 2 or 4 cascades; a typical scene uses 4 cascades. @@ -29,7 +26,5 @@ public: protected: // [LightWithShadow] - void OnEnable() override; - void OnDisable() override; void OnTransformChanged() override; }; diff --git a/Source/Engine/Level/Actors/EnvironmentProbe.cpp b/Source/Engine/Level/Actors/EnvironmentProbe.cpp index 9bde5e6c6..ee2dca8cc 100644 --- a/Source/Engine/Level/Actors/EnvironmentProbe.cpp +++ b/Source/Engine/Level/Actors/EnvironmentProbe.cpp @@ -20,6 +20,7 @@ EnvironmentProbe::EnvironmentProbe(const SpawnParams& params) , _radius(3000.0f) , _isUsingCustomProbe(false) { + _drawCategory = SceneRendering::PreRender; _sphere = BoundingSphere(Vector3::Zero, _radius); BoundingBox::FromSphere(_sphere, _box); } @@ -170,7 +171,7 @@ void EnvironmentProbe::UpdateBounds() _sphere = BoundingSphere(GetPosition(), GetScaledRadius()); BoundingBox::FromSphere(_sphere, _box); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void EnvironmentProbe::Draw(RenderContext& renderContext) @@ -206,7 +207,7 @@ void EnvironmentProbe::OnDebugDrawSelected() void EnvironmentProbe::OnLayerChanged() { if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void EnvironmentProbe::Serialize(SerializeStream& stream, const void* otherObj) @@ -259,7 +260,7 @@ bool EnvironmentProbe::IntersectsItself(const Ray& ray, Real& distance, Vector3& void EnvironmentProbe::OnEnable() { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); #if USE_EDITOR GetSceneRendering()->AddViewportIcon(this); #endif @@ -273,7 +274,7 @@ void EnvironmentProbe::OnDisable() #if USE_EDITOR GetSceneRendering()->RemoveViewportIcon(this); #endif - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); // Base Actor::OnDisable(); diff --git a/Source/Engine/Level/Actors/ExponentialHeightFog.cpp b/Source/Engine/Level/Actors/ExponentialHeightFog.cpp index 6bd8bf00b..45de21532 100644 --- a/Source/Engine/Level/Actors/ExponentialHeightFog.cpp +++ b/Source/Engine/Level/Actors/ExponentialHeightFog.cpp @@ -17,6 +17,7 @@ ExponentialHeightFog::ExponentialHeightFog(const SpawnParams& params) : Actor(params) { _drawNoCulling = 1; + _drawCategory = SceneRendering::PreRender; // Load shader _shader = Content::LoadAsyncInternal(TEXT("Shaders/Fog")); @@ -209,7 +210,7 @@ void ExponentialHeightFog::DrawFog(GPUContext* context, RenderContext& renderCon void ExponentialHeightFog::OnEnable() { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); #if USE_EDITOR GetSceneRendering()->AddViewportIcon(this); #endif @@ -223,7 +224,7 @@ void ExponentialHeightFog::OnDisable() #if USE_EDITOR GetSceneRendering()->RemoveViewportIcon(this); #endif - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); // Base Actor::OnDisable(); diff --git a/Source/Engine/Level/Actors/Light.cpp b/Source/Engine/Level/Actors/Light.cpp index 6696a46e8..09c0a5d66 100644 --- a/Source/Engine/Level/Actors/Light.cpp +++ b/Source/Engine/Level/Actors/Light.cpp @@ -10,6 +10,7 @@ Light::Light(const SpawnParams& params) : Actor(params) { + _drawCategory = SceneRendering::PreRender; } void Light::AdjustBrightness(const RenderView& view, float& brightness) const @@ -20,6 +21,28 @@ void Light::AdjustBrightness(const RenderView& view, float& brightness) const #endif } +void Light::OnEnable() +{ + GetSceneRendering()->AddActor(this, _sceneRenderingKey); +#if USE_EDITOR + GetSceneRendering()->AddViewportIcon(this); +#endif + + // Base + Actor::OnEnable(); +} + +void Light::OnDisable() +{ +#if USE_EDITOR + GetSceneRendering()->RemoveViewportIcon(this); +#endif + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); + + // Base + Actor::OnDisable(); +} + void Light::Serialize(SerializeStream& stream, const void* otherObj) { // Base diff --git a/Source/Engine/Level/Actors/Light.h b/Source/Engine/Level/Actors/Light.h index 5c2491773..c07998569 100644 --- a/Source/Engine/Level/Actors/Light.h +++ b/Source/Engine/Level/Actors/Light.h @@ -12,6 +12,9 @@ API_CLASS(Abstract) class FLAXENGINE_API Light : public Actor { DECLARE_SCENE_OBJECT_ABSTRACT(Light); +protected: + int32 _sceneRenderingKey = -1; + public: /// /// Color of the light @@ -55,6 +58,8 @@ protected: public: // [Actor] + void OnEnable() override; + void OnDisable() override; #if USE_EDITOR BoundingBox GetEditorBox() const override { diff --git a/Source/Engine/Level/Actors/ModelInstanceActor.cpp b/Source/Engine/Level/Actors/ModelInstanceActor.cpp index d5199a320..a5fb15c0e 100644 --- a/Source/Engine/Level/Actors/ModelInstanceActor.cpp +++ b/Source/Engine/Level/Actors/ModelInstanceActor.cpp @@ -20,7 +20,7 @@ void ModelInstanceActor::SetEntries(const Array& value) Entries[i] = value[i]; } if (anyChanged && _sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void ModelInstanceActor::SetMaterial(int32 entryIndex, MaterialBase* material) @@ -33,7 +33,7 @@ void ModelInstanceActor::SetMaterial(int32 entryIndex, MaterialBase* material) return; Entries[entryIndex].Material = material; if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32 entryIndex) @@ -45,7 +45,7 @@ MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32 const auto result = material->CreateVirtualInstance(); Entries[entryIndex].Material = result; if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); return result; } @@ -56,12 +56,12 @@ void ModelInstanceActor::WaitForModelLoad() void ModelInstanceActor::OnLayerChanged() { if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void ModelInstanceActor::OnEnable() { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); // Base Actor::OnEnable(); @@ -72,5 +72,5 @@ void ModelInstanceActor::OnDisable() // Base Actor::OnDisable(); - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); } diff --git a/Source/Engine/Level/Actors/PointLight.cpp b/Source/Engine/Level/Actors/PointLight.cpp index 720a36a71..0aaf5366d 100644 --- a/Source/Engine/Level/Actors/PointLight.cpp +++ b/Source/Engine/Level/Actors/PointLight.cpp @@ -66,29 +66,7 @@ void PointLight::UpdateBounds() BoundingBox::FromSphere(_sphere, _box); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); -} - -void PointLight::OnEnable() -{ - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); -#if USE_EDITOR - GetSceneRendering()->AddViewportIcon(this); -#endif - - // Base - LightWithShadow::OnEnable(); -} - -void PointLight::OnDisable() -{ -#if USE_EDITOR - GetSceneRendering()->RemoveViewportIcon(this); -#endif - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); - - // Base - LightWithShadow::OnDisable(); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void PointLight::OnTransformChanged() @@ -170,7 +148,7 @@ void PointLight::OnDebugDrawSelected() void PointLight::OnLayerChanged() { if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void PointLight::Serialize(SerializeStream& stream, const void* otherObj) diff --git a/Source/Engine/Level/Actors/PointLight.h b/Source/Engine/Level/Actors/PointLight.h index d20fb4ea5..6e28b4405 100644 --- a/Source/Engine/Level/Actors/PointLight.h +++ b/Source/Engine/Level/Actors/PointLight.h @@ -15,7 +15,6 @@ API_CLASS() class FLAXENGINE_API PointLight : public LightWithShadow private: Float3 _direction; float _radius; - int32 _sceneRenderingKey = -1; public: /// @@ -104,7 +103,5 @@ public: protected: // [LightWithShadow] - void OnEnable() override; - void OnDisable() override; void OnTransformChanged() override; }; diff --git a/Source/Engine/Level/Actors/Sky.cpp b/Source/Engine/Level/Actors/Sky.cpp index 024075dda..9b4cf0e65 100644 --- a/Source/Engine/Level/Actors/Sky.cpp +++ b/Source/Engine/Level/Actors/Sky.cpp @@ -32,6 +32,7 @@ Sky::Sky(const SpawnParams& params) , _psFog(nullptr) { _drawNoCulling = 1; + _drawCategory = SceneRendering::PreRender; // Load shader _shader = Content::LoadAsyncInternal(TEXT("Shaders/Sky")); @@ -248,7 +249,7 @@ void Sky::EndPlay() void Sky::OnEnable() { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); #if USE_EDITOR GetSceneRendering()->AddViewportIcon(this); #endif @@ -262,7 +263,7 @@ void Sky::OnDisable() #if USE_EDITOR GetSceneRendering()->RemoveViewportIcon(this); #endif - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); // Base Actor::OnDisable(); diff --git a/Source/Engine/Level/Actors/SkyLight.cpp b/Source/Engine/Level/Actors/SkyLight.cpp index acfbe5df8..70a63d453 100644 --- a/Source/Engine/Level/Actors/SkyLight.cpp +++ b/Source/Engine/Level/Actors/SkyLight.cpp @@ -179,28 +179,6 @@ bool SkyLight::HasContentLoaded() const return true; } -void SkyLight::OnEnable() -{ - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); -#if USE_EDITOR - GetSceneRendering()->AddViewportIcon(this); -#endif - - // Base - Light::OnEnable(); -} - -void SkyLight::OnDisable() -{ -#if USE_EDITOR - GetSceneRendering()->RemoveViewportIcon(this); -#endif - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); - - // Base - Light::OnDisable(); -} - void SkyLight::OnTransformChanged() { // Base diff --git a/Source/Engine/Level/Actors/SkyLight.h b/Source/Engine/Level/Actors/SkyLight.h index 239cccd34..18fb22349 100644 --- a/Source/Engine/Level/Actors/SkyLight.h +++ b/Source/Engine/Level/Actors/SkyLight.h @@ -32,7 +32,6 @@ public: private: AssetReference _bakedProbe; float _radius; - int32 _sceneRenderingKey = -1; public: /// @@ -112,7 +111,5 @@ public: protected: // [Light] - void OnEnable() override; - void OnDisable() override; void OnTransformChanged() override; }; diff --git a/Source/Engine/Level/Actors/Skybox.cpp b/Source/Engine/Level/Actors/Skybox.cpp index f3d022609..162d515cc 100644 --- a/Source/Engine/Level/Actors/Skybox.cpp +++ b/Source/Engine/Level/Actors/Skybox.cpp @@ -15,6 +15,7 @@ Skybox::Skybox(const SpawnParams& params) : Actor(params) { _drawNoCulling = 1; + _drawCategory = SceneRendering::PreRender; } void Skybox::setupProxy() @@ -127,7 +128,7 @@ void Skybox::ApplySky(GPUContext* context, RenderContext& renderContext, const M void Skybox::OnEnable() { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); #if USE_EDITOR GetSceneRendering()->AddViewportIcon(this); #endif @@ -141,7 +142,7 @@ void Skybox::OnDisable() #if USE_EDITOR GetSceneRendering()->RemoveViewportIcon(this); #endif - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); // Base Actor::OnDisable(); diff --git a/Source/Engine/Level/Actors/SplineModel.cpp b/Source/Engine/Level/Actors/SplineModel.cpp index 654ba9517..67cd56f9c 100644 --- a/Source/Engine/Level/Actors/SplineModel.cpp +++ b/Source/Engine/Level/Actors/SplineModel.cpp @@ -23,6 +23,7 @@ SplineModel::SplineModel(const SpawnParams& params) : ModelInstanceActor(params) { + _drawCategory = SceneRendering::SceneDrawAsync; Model.Changed.Bind(this); Model.Loaded.Bind(this); } @@ -210,7 +211,7 @@ void SplineModel::OnSplineUpdated() BoundingSphere::Merge(_sphere, _instances[i].Sphere, _sphere); BoundingBox::FromSphere(_sphere, _box); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void SplineModel::UpdateDeformationBuffer() diff --git a/Source/Engine/Level/Actors/SpotLight.cpp b/Source/Engine/Level/Actors/SpotLight.cpp index d65bbcbe8..74338bfdb 100644 --- a/Source/Engine/Level/Actors/SpotLight.cpp +++ b/Source/Engine/Level/Actors/SpotLight.cpp @@ -114,29 +114,7 @@ void SpotLight::UpdateBounds() BoundingBox::FromSphere(_sphere, _box); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); -} - -void SpotLight::OnEnable() -{ - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); -#if USE_EDITOR - GetSceneRendering()->AddViewportIcon(this); -#endif - - // Base - LightWithShadow::OnEnable(); -} - -void SpotLight::OnDisable() -{ -#if USE_EDITOR - GetSceneRendering()->RemoveViewportIcon(this); -#endif - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); - - // Base - LightWithShadow::OnDisable(); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void SpotLight::OnTransformChanged() diff --git a/Source/Engine/Level/Actors/SpotLight.h b/Source/Engine/Level/Actors/SpotLight.h index 8e2fe0e36..aa86eff9f 100644 --- a/Source/Engine/Level/Actors/SpotLight.h +++ b/Source/Engine/Level/Actors/SpotLight.h @@ -20,7 +20,6 @@ private: float _cosOuterCone; float _cosInnerCone; float _invCosConeDifference; - int32 _sceneRenderingKey = -1; public: /// @@ -134,7 +133,5 @@ public: protected: // [LightWithShadow] - void OnEnable() override; - void OnDisable() override; void OnTransformChanged() override; }; diff --git a/Source/Engine/Level/Actors/StaticModel.cpp b/Source/Engine/Level/Actors/StaticModel.cpp index e6f8de72e..6fc9c86a3 100644 --- a/Source/Engine/Level/Actors/StaticModel.cpp +++ b/Source/Engine/Level/Actors/StaticModel.cpp @@ -25,6 +25,7 @@ StaticModel::StaticModel(const SpawnParams& params) , _vertexColorsDirty(false) , _vertexColorsCount(0) { + _drawCategory = SceneRendering::SceneDrawAsync; Model.Changed.Bind(this); Model.Loaded.Bind(this); } @@ -173,7 +174,7 @@ void StaticModel::OnModelChanged() if (Model && !Model->IsLoaded()) UpdateBounds(); else if (!Model && _sceneRenderingKey != -1) - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); } void StaticModel::OnModelLoaded() @@ -190,7 +191,7 @@ void StaticModel::OnModelLoaded() } else { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); } } } @@ -199,7 +200,7 @@ void StaticModel::OnModelResidencyChanged() { if (_sceneRenderingKey == -1 && _scene && Model && Model->GetLoadedLODs() > 0 && _residencyChangedModel) { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); _residencyChangedModel->ResidencyChanged.Unbind(this); _residencyChangedModel = nullptr; } @@ -219,7 +220,7 @@ void StaticModel::UpdateBounds() } BoundingSphere::FromBox(_box, _sphere); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void StaticModel::FlushVertexColors() @@ -561,7 +562,7 @@ void StaticModel::OnEnable() } else { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); } } @@ -576,7 +577,7 @@ void StaticModel::OnDisable() if (_sceneRenderingKey != -1) { - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); } if (_residencyChangedModel) { diff --git a/Source/Engine/Level/Scene/SceneRendering.cpp b/Source/Engine/Level/Scene/SceneRendering.cpp index 8b262ee61..4584b703e 100644 --- a/Source/Engine/Level/Scene/SceneRendering.cpp +++ b/Source/Engine/Level/Scene/SceneRendering.cpp @@ -51,14 +51,10 @@ void SceneRendering::Draw(RenderContextBatch& renderContextBatch, DrawCategory c _drawBatch = &renderContextBatch; // Setup frustum data - auto& frustumsData = _drawFrustumsData; const int32 frustumsCount = renderContextBatch.Contexts.Count(); - if (frustumsCount != 1) - { - frustumsData.Resize(frustumsCount); - for (int32 i = 0; i < frustumsCount; i++) - frustumsData.Get()[i] = renderContextBatch.Contexts[i].View.CullingFrustum; - } + _drawFrustumsData.Resize(frustumsCount); + for (int32 i = 0; i < frustumsCount; i++) + _drawFrustumsData.Get()[i] = renderContextBatch.Contexts.Get()[i].View.CullingFrustum; // Draw all visual components _drawListIndex = -1; @@ -119,12 +115,13 @@ void SceneRendering::Clear() #endif } -void SceneRendering::AddActor(Actor* a, int32& key, DrawCategory category) +void SceneRendering::AddActor(Actor* a, int32& key) { if (key != -1) return; + const int32 category = a->_drawCategory; ScopeLock lock(Locker); - auto& list = Actors[(int32)category]; + auto& list = Actors[category]; // TODO: track removedCount and skip searching for free entry if there is none key = 0; for (; key < list.Count(); key++) @@ -143,10 +140,11 @@ void SceneRendering::AddActor(Actor* a, int32& key, DrawCategory category) listener->OnSceneRenderingAddActor(a); } -void SceneRendering::UpdateActor(Actor* a, int32 key, DrawCategory category) +void SceneRendering::UpdateActor(Actor* a, int32 key) { + const int32 category = a->_drawCategory; ScopeLock lock(Locker); - auto& list = Actors[(int32)category]; + auto& list = Actors[category]; if (list.IsEmpty()) return; auto& e = list[key]; @@ -157,10 +155,11 @@ void SceneRendering::UpdateActor(Actor* a, int32 key, DrawCategory category) e.Bounds = a->GetSphere(); } -void SceneRendering::RemoveActor(Actor* a, int32& key, DrawCategory category) +void SceneRendering::RemoveActor(Actor* a, int32& key) { + const int32 category = a->_drawCategory; ScopeLock lock(Locker); - auto& list = Actors[(int32)category]; + auto& list = Actors[category]; if (list.HasItems()) { auto& e = list[key]; diff --git a/Source/Engine/Level/Scene/SceneRendering.h b/Source/Engine/Level/Scene/SceneRendering.h index a8567a642..cb6671ce9 100644 --- a/Source/Engine/Level/Scene/SceneRendering.h +++ b/Source/Engine/Level/Scene/SceneRendering.h @@ -122,9 +122,9 @@ public: void Clear(); public: - void AddActor(Actor* a, int32& key, DrawCategory category = SceneDraw); - void UpdateActor(Actor* a, int32 key, DrawCategory category = SceneDraw); - void RemoveActor(Actor* a, int32& key, DrawCategory category = SceneDraw); + void AddActor(Actor* a, int32& key); + void UpdateActor(Actor* a, int32 key); + void RemoveActor(Actor* a, int32& key); FORCE_INLINE void AddPostFxProvider(IPostFxSettingsProvider* obj) { diff --git a/Source/Engine/Terrain/Terrain.cpp b/Source/Engine/Terrain/Terrain.cpp index ec3457f03..630b53333 100644 --- a/Source/Engine/Terrain/Terrain.cpp +++ b/Source/Engine/Terrain/Terrain.cpp @@ -28,6 +28,7 @@ Terrain::Terrain(const SpawnParams& params) , _boundsExtent(Vector3::Zero) , _cachedScale(1.0f) { + _drawCategory = SceneRendering::SceneDrawAsync; PhysicalMaterial.Changed.Bind(this); } @@ -49,7 +50,7 @@ void Terrain::UpdateBounds() } BoundingSphere::FromBox(_box, _sphere); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void Terrain::CacheNeighbors() @@ -789,7 +790,7 @@ RigidBody* Terrain::GetAttachedRigidBody() const void Terrain::OnEnable() { - GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->AddActor(this, _sceneRenderingKey); #if TERRAIN_USE_PHYSICS_DEBUG GetSceneRendering()->AddPhysicsDebug(this); #endif @@ -800,7 +801,7 @@ void Terrain::OnEnable() void Terrain::OnDisable() { - GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->RemoveActor(this, _sceneRenderingKey); #if TERRAIN_USE_PHYSICS_DEBUG GetSceneRendering()->RemovePhysicsDebug(this); #endif @@ -841,7 +842,7 @@ void Terrain::OnLayerChanged() UpdateLayerBits(); if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void Terrain::OnActiveInTreeChanged()