Fix rendering of custom actors lists in Editor viewports

This commit is contained in:
Wojtek Figat
2022-11-16 09:57:17 +01:00
parent 20661fc902
commit 16ebc72099
26 changed files with 118 additions and 178 deletions

View File

@@ -22,13 +22,6 @@
#include "Engine/Serialization/Serialization.h" #include "Engine/Serialization/Serialization.h"
#include "Engine/Utilities/Encryption.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<DrawPass>(type.DrawModes & renderContext.View.Pass & (int32)renderContext.View.GetShadowsDrawPassMask(type.ShadowsMode)) #define FOLIAGE_GET_DRAW_MODES(renderContext, type) static_cast<DrawPass>(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()) #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) : Actor(params)
{ {
_disableFoliageTypeEvents = false; _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<FoliageCluster, FOLIAGE_CLUSTER_CHUNKS_SIZE>& clusters, FoliageCluster* cluster, FoliageInstance& instance) void Foliage::AddToCluster(ChunkedArray<FoliageCluster, FOLIAGE_CLUSTER_CHUNKS_SIZE>& clusters, FoliageCluster* cluster, FoliageInstance& instance)
@@ -795,7 +795,7 @@ void Foliage::OnFoliageTypeModelLoaded(int32 index)
} }
BoundingSphere::FromBox(_box, _sphere); BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
{ {
PROFILE_CPU_NAMED("Create Clusters"); PROFILE_CPU_NAMED("Create Clusters");
@@ -842,7 +842,7 @@ void Foliage::RebuildClusters()
_box = BoundingBox(_transform.Translation, _transform.Translation); _box = BoundingBox(_transform.Translation, _transform.Translation);
_sphere = BoundingSphere(_transform.Translation, 0.0f); _sphere = BoundingSphere(_transform.Translation, 0.0f);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
return; return;
} }
@@ -932,7 +932,7 @@ void Foliage::RebuildClusters()
_box = totalBounds; _box = totalBounds;
BoundingSphere::FromBox(_box, _sphere); BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
// Insert all instances to the clusters // Insert all instances to the clusters
@@ -1459,12 +1459,12 @@ void Foliage::Deserialize(DeserializeStream& stream, ISerializeModifier* modifie
void Foliage::OnLayerChanged() void Foliage::OnLayerChanged()
{ {
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void Foliage::OnEnable() void Foliage::OnEnable()
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
// Base // Base
Actor::OnEnable(); Actor::OnEnable();
@@ -1472,7 +1472,7 @@ void Foliage::OnEnable()
void Foliage::OnDisable() void Foliage::OnDisable()
{ {
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, FOLIAGE_SCENE_DRAW_CATEGORY); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
// Base // Base
Actor::OnDisable(); Actor::OnDisable();

View File

@@ -264,12 +264,16 @@ void SceneRenderTask::OnCollectDrawCalls(RenderContextBatch& renderContextBatch,
// Draw actors (collect draw calls) // Draw actors (collect draw calls)
if ((ActorsSource & ActorsSources::CustomActors) != 0) if ((ActorsSource & ActorsSources::CustomActors) != 0)
{ {
if (_customActorsScene == nullptr) if (category == SceneRendering::DrawCategory::PreRender)
_customActorsScene = New<SceneRendering>(); {
else if (_customActorsScene == nullptr)
_customActorsScene->Clear(); _customActorsScene = New<SceneRendering>();
for (Actor* a : CustomActors) else
AddActorToSceneRendering(_customActorsScene, a); _customActorsScene->Clear();
for (Actor* a : CustomActors)
AddActorToSceneRendering(_customActorsScene, a);
}
ASSERT_LOW_LAYER(_customActorsScene);
_customActorsScene->Draw(renderContextBatch, (SceneRendering::DrawCategory)category); _customActorsScene->Draw(renderContextBatch, (SceneRendering::DrawCategory)category);
} }
if ((ActorsSource & ActorsSources::Scenes) != 0) if ((ActorsSource & ActorsSources::Scenes) != 0)

View File

@@ -84,6 +84,7 @@ Actor::Actor(const SpawnParams& params)
, HideFlags(HideFlags::None) , HideFlags(HideFlags::None)
{ {
_drawNoCulling = 0; _drawNoCulling = 0;
_drawCategory = 0;
} }
SceneRendering* Actor::GetSceneRendering() const SceneRendering* Actor::GetSceneRendering() const

View File

@@ -36,11 +36,12 @@ API_CLASS(Abstract) class FLAXENGINE_API Actor : public SceneObject
friend PrefabInstanceData; friend PrefabInstanceData;
protected: protected:
int8 _isActive : 1; int16 _isActive : 1;
int8 _isActiveInHierarchy : 1; int16 _isActiveInHierarchy : 1;
int8 _isPrefabRoot : 1; int16 _isPrefabRoot : 1;
int8 _isEnabled : 1; int16 _isEnabled : 1;
int8 _drawNoCulling : 1; int16 _drawNoCulling : 1;
int16 _drawCategory : 4;
byte _layer; byte _layer;
byte _tag; byte _tag;
StaticFlags _staticFlags; StaticFlags _staticFlags;

View File

@@ -22,6 +22,7 @@ AnimatedModel::AnimatedModel(const SpawnParams& params)
, _lastMinDstSqr(MAX_Real) , _lastMinDstSqr(MAX_Real)
, _lastUpdateFrame(0) , _lastUpdateFrame(0)
{ {
_drawCategory = SceneRendering::SceneDrawAsync;
GraphInstance.Object = this; GraphInstance.Object = this;
_box = _boxLocal = BoundingBox(Vector3::Zero); _box = _boxLocal = BoundingBox(Vector3::Zero);
_sphere = BoundingSphere(Vector3::Zero, 0.0f); _sphere = BoundingSphere(Vector3::Zero, 0.0f);
@@ -555,7 +556,7 @@ void AnimatedModel::UpdateBounds()
BoundingBox::Transform(_boxLocal, _transform, _box); BoundingBox::Transform(_boxLocal, _transform, _box);
BoundingSphere::FromBox(_box, _sphere); BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void AnimatedModel::UpdateSockets() void AnimatedModel::UpdateSockets()
@@ -960,7 +961,7 @@ void AnimatedModel::OnTransformChanged()
BoundingBox::Transform(_boxLocal, _transform, _box); BoundingBox::Transform(_boxLocal, _transform, _box);
BoundingSphere::FromBox(_box, _sphere); BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void AnimatedModel::WaitForModelLoad() void AnimatedModel::WaitForModelLoad()

View File

@@ -13,6 +13,7 @@ Decal::Decal(const SpawnParams& params)
: Actor(params) : Actor(params)
, _size(100.0f) , _size(100.0f)
{ {
_drawCategory = SceneRendering::PreRender;
_bounds.Extents = _size * 0.5f; _bounds.Extents = _size * 0.5f;
_bounds.Transformation = _transform; _bounds.Transformation = _transform;
_bounds.GetBoundingBox(_box); _bounds.GetBoundingBox(_box);
@@ -63,7 +64,7 @@ BoundingBox Decal::GetEditorBox() const
void Decal::OnLayerChanged() void Decal::OnLayerChanged()
{ {
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void Decal::Draw(RenderContext& renderContext) void Decal::Draw(RenderContext& renderContext)
@@ -118,7 +119,7 @@ bool Decal::IntersectsItself(const Ray& ray, Real& distance, Vector3& normal)
void Decal::OnEnable() void Decal::OnEnable()
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->AddViewportIcon(this); GetSceneRendering()->AddViewportIcon(this);
#endif #endif
@@ -132,7 +133,7 @@ void Decal::OnDisable()
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->RemoveViewportIcon(this); GetSceneRendering()->RemoveViewportIcon(this);
#endif #endif
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
// Base // Base
Actor::OnDisable(); Actor::OnDisable();
@@ -148,5 +149,5 @@ void Decal::OnTransformChanged()
BoundingSphere::FromBox(_box, _sphere); BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }

View File

@@ -71,28 +71,6 @@ bool DirectionalLight::IntersectsItself(const Ray& ray, Real& distance, Vector3&
return false; 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() void DirectionalLight::OnTransformChanged()
{ {
// Base // Base

View File

@@ -10,9 +10,6 @@
API_CLASS() class FLAXENGINE_API DirectionalLight : public LightWithShadow API_CLASS() class FLAXENGINE_API DirectionalLight : public LightWithShadow
{ {
DECLARE_SCENE_OBJECT(DirectionalLight); DECLARE_SCENE_OBJECT(DirectionalLight);
private:
int32 _sceneRenderingKey = -1;
public: public:
/// <summary> /// <summary>
/// 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. /// 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: protected:
// [LightWithShadow] // [LightWithShadow]
void OnEnable() override;
void OnDisable() override;
void OnTransformChanged() override; void OnTransformChanged() override;
}; };

View File

@@ -20,6 +20,7 @@ EnvironmentProbe::EnvironmentProbe(const SpawnParams& params)
, _radius(3000.0f) , _radius(3000.0f)
, _isUsingCustomProbe(false) , _isUsingCustomProbe(false)
{ {
_drawCategory = SceneRendering::PreRender;
_sphere = BoundingSphere(Vector3::Zero, _radius); _sphere = BoundingSphere(Vector3::Zero, _radius);
BoundingBox::FromSphere(_sphere, _box); BoundingBox::FromSphere(_sphere, _box);
} }
@@ -170,7 +171,7 @@ void EnvironmentProbe::UpdateBounds()
_sphere = BoundingSphere(GetPosition(), GetScaledRadius()); _sphere = BoundingSphere(GetPosition(), GetScaledRadius());
BoundingBox::FromSphere(_sphere, _box); BoundingBox::FromSphere(_sphere, _box);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void EnvironmentProbe::Draw(RenderContext& renderContext) void EnvironmentProbe::Draw(RenderContext& renderContext)
@@ -206,7 +207,7 @@ void EnvironmentProbe::OnDebugDrawSelected()
void EnvironmentProbe::OnLayerChanged() void EnvironmentProbe::OnLayerChanged()
{ {
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void EnvironmentProbe::Serialize(SerializeStream& stream, const void* otherObj) void EnvironmentProbe::Serialize(SerializeStream& stream, const void* otherObj)
@@ -259,7 +260,7 @@ bool EnvironmentProbe::IntersectsItself(const Ray& ray, Real& distance, Vector3&
void EnvironmentProbe::OnEnable() void EnvironmentProbe::OnEnable()
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->AddViewportIcon(this); GetSceneRendering()->AddViewportIcon(this);
#endif #endif
@@ -273,7 +274,7 @@ void EnvironmentProbe::OnDisable()
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->RemoveViewportIcon(this); GetSceneRendering()->RemoveViewportIcon(this);
#endif #endif
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
// Base // Base
Actor::OnDisable(); Actor::OnDisable();

View File

@@ -17,6 +17,7 @@ ExponentialHeightFog::ExponentialHeightFog(const SpawnParams& params)
: Actor(params) : Actor(params)
{ {
_drawNoCulling = 1; _drawNoCulling = 1;
_drawCategory = SceneRendering::PreRender;
// Load shader // Load shader
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/Fog")); _shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/Fog"));
@@ -209,7 +210,7 @@ void ExponentialHeightFog::DrawFog(GPUContext* context, RenderContext& renderCon
void ExponentialHeightFog::OnEnable() void ExponentialHeightFog::OnEnable()
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->AddViewportIcon(this); GetSceneRendering()->AddViewportIcon(this);
#endif #endif
@@ -223,7 +224,7 @@ void ExponentialHeightFog::OnDisable()
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->RemoveViewportIcon(this); GetSceneRendering()->RemoveViewportIcon(this);
#endif #endif
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
// Base // Base
Actor::OnDisable(); Actor::OnDisable();

View File

@@ -10,6 +10,7 @@
Light::Light(const SpawnParams& params) Light::Light(const SpawnParams& params)
: Actor(params) : Actor(params)
{ {
_drawCategory = SceneRendering::PreRender;
} }
void Light::AdjustBrightness(const RenderView& view, float& brightness) const void Light::AdjustBrightness(const RenderView& view, float& brightness) const
@@ -20,6 +21,28 @@ void Light::AdjustBrightness(const RenderView& view, float& brightness) const
#endif #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) void Light::Serialize(SerializeStream& stream, const void* otherObj)
{ {
// Base // Base

View File

@@ -12,6 +12,9 @@
API_CLASS(Abstract) class FLAXENGINE_API Light : public Actor API_CLASS(Abstract) class FLAXENGINE_API Light : public Actor
{ {
DECLARE_SCENE_OBJECT_ABSTRACT(Light); DECLARE_SCENE_OBJECT_ABSTRACT(Light);
protected:
int32 _sceneRenderingKey = -1;
public: public:
/// <summary> /// <summary>
/// Color of the light /// Color of the light
@@ -55,6 +58,8 @@ protected:
public: public:
// [Actor] // [Actor]
void OnEnable() override;
void OnDisable() override;
#if USE_EDITOR #if USE_EDITOR
BoundingBox GetEditorBox() const override BoundingBox GetEditorBox() const override
{ {

View File

@@ -20,7 +20,7 @@ void ModelInstanceActor::SetEntries(const Array<ModelInstanceEntry>& value)
Entries[i] = value[i]; Entries[i] = value[i];
} }
if (anyChanged && _sceneRenderingKey != -1) if (anyChanged && _sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void ModelInstanceActor::SetMaterial(int32 entryIndex, MaterialBase* material) void ModelInstanceActor::SetMaterial(int32 entryIndex, MaterialBase* material)
@@ -33,7 +33,7 @@ void ModelInstanceActor::SetMaterial(int32 entryIndex, MaterialBase* material)
return; return;
Entries[entryIndex].Material = material; Entries[entryIndex].Material = material;
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32 entryIndex) MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32 entryIndex)
@@ -45,7 +45,7 @@ MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32
const auto result = material->CreateVirtualInstance(); const auto result = material->CreateVirtualInstance();
Entries[entryIndex].Material = result; Entries[entryIndex].Material = result;
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
return result; return result;
} }
@@ -56,12 +56,12 @@ void ModelInstanceActor::WaitForModelLoad()
void ModelInstanceActor::OnLayerChanged() void ModelInstanceActor::OnLayerChanged()
{ {
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void ModelInstanceActor::OnEnable() void ModelInstanceActor::OnEnable()
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
// Base // Base
Actor::OnEnable(); Actor::OnEnable();
@@ -72,5 +72,5 @@ void ModelInstanceActor::OnDisable()
// Base // Base
Actor::OnDisable(); Actor::OnDisable();
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
} }

View File

@@ -66,29 +66,7 @@ void PointLight::UpdateBounds()
BoundingBox::FromSphere(_sphere, _box); BoundingBox::FromSphere(_sphere, _box);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
}
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();
} }
void PointLight::OnTransformChanged() void PointLight::OnTransformChanged()
@@ -170,7 +148,7 @@ void PointLight::OnDebugDrawSelected()
void PointLight::OnLayerChanged() void PointLight::OnLayerChanged()
{ {
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void PointLight::Serialize(SerializeStream& stream, const void* otherObj) void PointLight::Serialize(SerializeStream& stream, const void* otherObj)

View File

@@ -15,7 +15,6 @@ API_CLASS() class FLAXENGINE_API PointLight : public LightWithShadow
private: private:
Float3 _direction; Float3 _direction;
float _radius; float _radius;
int32 _sceneRenderingKey = -1;
public: public:
/// <summary> /// <summary>
@@ -104,7 +103,5 @@ public:
protected: protected:
// [LightWithShadow] // [LightWithShadow]
void OnEnable() override;
void OnDisable() override;
void OnTransformChanged() override; void OnTransformChanged() override;
}; };

View File

@@ -32,6 +32,7 @@ Sky::Sky(const SpawnParams& params)
, _psFog(nullptr) , _psFog(nullptr)
{ {
_drawNoCulling = 1; _drawNoCulling = 1;
_drawCategory = SceneRendering::PreRender;
// Load shader // Load shader
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/Sky")); _shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/Sky"));
@@ -248,7 +249,7 @@ void Sky::EndPlay()
void Sky::OnEnable() void Sky::OnEnable()
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->AddViewportIcon(this); GetSceneRendering()->AddViewportIcon(this);
#endif #endif
@@ -262,7 +263,7 @@ void Sky::OnDisable()
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->RemoveViewportIcon(this); GetSceneRendering()->RemoveViewportIcon(this);
#endif #endif
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
// Base // Base
Actor::OnDisable(); Actor::OnDisable();

View File

@@ -179,28 +179,6 @@ bool SkyLight::HasContentLoaded() const
return true; 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() void SkyLight::OnTransformChanged()
{ {
// Base // Base

View File

@@ -32,7 +32,6 @@ public:
private: private:
AssetReference<CubeTexture> _bakedProbe; AssetReference<CubeTexture> _bakedProbe;
float _radius; float _radius;
int32 _sceneRenderingKey = -1;
public: public:
/// <summary> /// <summary>
@@ -112,7 +111,5 @@ public:
protected: protected:
// [Light] // [Light]
void OnEnable() override;
void OnDisable() override;
void OnTransformChanged() override; void OnTransformChanged() override;
}; };

View File

@@ -15,6 +15,7 @@ Skybox::Skybox(const SpawnParams& params)
: Actor(params) : Actor(params)
{ {
_drawNoCulling = 1; _drawNoCulling = 1;
_drawCategory = SceneRendering::PreRender;
} }
void Skybox::setupProxy() void Skybox::setupProxy()
@@ -127,7 +128,7 @@ void Skybox::ApplySky(GPUContext* context, RenderContext& renderContext, const M
void Skybox::OnEnable() void Skybox::OnEnable()
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->AddViewportIcon(this); GetSceneRendering()->AddViewportIcon(this);
#endif #endif
@@ -141,7 +142,7 @@ void Skybox::OnDisable()
#if USE_EDITOR #if USE_EDITOR
GetSceneRendering()->RemoveViewportIcon(this); GetSceneRendering()->RemoveViewportIcon(this);
#endif #endif
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
// Base // Base
Actor::OnDisable(); Actor::OnDisable();

View File

@@ -23,6 +23,7 @@
SplineModel::SplineModel(const SpawnParams& params) SplineModel::SplineModel(const SpawnParams& params)
: ModelInstanceActor(params) : ModelInstanceActor(params)
{ {
_drawCategory = SceneRendering::SceneDrawAsync;
Model.Changed.Bind<SplineModel, &SplineModel::OnModelChanged>(this); Model.Changed.Bind<SplineModel, &SplineModel::OnModelChanged>(this);
Model.Loaded.Bind<SplineModel, &SplineModel::OnModelLoaded>(this); Model.Loaded.Bind<SplineModel, &SplineModel::OnModelLoaded>(this);
} }
@@ -210,7 +211,7 @@ void SplineModel::OnSplineUpdated()
BoundingSphere::Merge(_sphere, _instances[i].Sphere, _sphere); BoundingSphere::Merge(_sphere, _instances[i].Sphere, _sphere);
BoundingBox::FromSphere(_sphere, _box); BoundingBox::FromSphere(_sphere, _box);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void SplineModel::UpdateDeformationBuffer() void SplineModel::UpdateDeformationBuffer()

View File

@@ -114,29 +114,7 @@ void SpotLight::UpdateBounds()
BoundingBox::FromSphere(_sphere, _box); BoundingBox::FromSphere(_sphere, _box);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::PreRender); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
}
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();
} }
void SpotLight::OnTransformChanged() void SpotLight::OnTransformChanged()

View File

@@ -20,7 +20,6 @@ private:
float _cosOuterCone; float _cosOuterCone;
float _cosInnerCone; float _cosInnerCone;
float _invCosConeDifference; float _invCosConeDifference;
int32 _sceneRenderingKey = -1;
public: public:
/// <summary> /// <summary>
@@ -134,7 +133,5 @@ public:
protected: protected:
// [LightWithShadow] // [LightWithShadow]
void OnEnable() override;
void OnDisable() override;
void OnTransformChanged() override; void OnTransformChanged() override;
}; };

View File

@@ -25,6 +25,7 @@ StaticModel::StaticModel(const SpawnParams& params)
, _vertexColorsDirty(false) , _vertexColorsDirty(false)
, _vertexColorsCount(0) , _vertexColorsCount(0)
{ {
_drawCategory = SceneRendering::SceneDrawAsync;
Model.Changed.Bind<StaticModel, &StaticModel::OnModelChanged>(this); Model.Changed.Bind<StaticModel, &StaticModel::OnModelChanged>(this);
Model.Loaded.Bind<StaticModel, &StaticModel::OnModelLoaded>(this); Model.Loaded.Bind<StaticModel, &StaticModel::OnModelLoaded>(this);
} }
@@ -173,7 +174,7 @@ void StaticModel::OnModelChanged()
if (Model && !Model->IsLoaded()) if (Model && !Model->IsLoaded())
UpdateBounds(); UpdateBounds();
else if (!Model && _sceneRenderingKey != -1) else if (!Model && _sceneRenderingKey != -1)
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
} }
void StaticModel::OnModelLoaded() void StaticModel::OnModelLoaded()
@@ -190,7 +191,7 @@ void StaticModel::OnModelLoaded()
} }
else 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) if (_sceneRenderingKey == -1 && _scene && Model && Model->GetLoadedLODs() > 0 && _residencyChangedModel)
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
_residencyChangedModel->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this); _residencyChangedModel->ResidencyChanged.Unbind<StaticModel, &StaticModel::OnModelResidencyChanged>(this);
_residencyChangedModel = nullptr; _residencyChangedModel = nullptr;
} }
@@ -219,7 +220,7 @@ void StaticModel::UpdateBounds()
} }
BoundingSphere::FromBox(_box, _sphere); BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void StaticModel::FlushVertexColors() void StaticModel::FlushVertexColors()
@@ -561,7 +562,7 @@ void StaticModel::OnEnable()
} }
else else
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
} }
} }
@@ -576,7 +577,7 @@ void StaticModel::OnDisable()
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
{ {
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
} }
if (_residencyChangedModel) if (_residencyChangedModel)
{ {

View File

@@ -51,14 +51,10 @@ void SceneRendering::Draw(RenderContextBatch& renderContextBatch, DrawCategory c
_drawBatch = &renderContextBatch; _drawBatch = &renderContextBatch;
// Setup frustum data // Setup frustum data
auto& frustumsData = _drawFrustumsData;
const int32 frustumsCount = renderContextBatch.Contexts.Count(); const int32 frustumsCount = renderContextBatch.Contexts.Count();
if (frustumsCount != 1) _drawFrustumsData.Resize(frustumsCount);
{ for (int32 i = 0; i < frustumsCount; i++)
frustumsData.Resize(frustumsCount); _drawFrustumsData.Get()[i] = renderContextBatch.Contexts.Get()[i].View.CullingFrustum;
for (int32 i = 0; i < frustumsCount; i++)
frustumsData.Get()[i] = renderContextBatch.Contexts[i].View.CullingFrustum;
}
// Draw all visual components // Draw all visual components
_drawListIndex = -1; _drawListIndex = -1;
@@ -119,12 +115,13 @@ void SceneRendering::Clear()
#endif #endif
} }
void SceneRendering::AddActor(Actor* a, int32& key, DrawCategory category) void SceneRendering::AddActor(Actor* a, int32& key)
{ {
if (key != -1) if (key != -1)
return; return;
const int32 category = a->_drawCategory;
ScopeLock lock(Locker); 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 // TODO: track removedCount and skip searching for free entry if there is none
key = 0; key = 0;
for (; key < list.Count(); key++) for (; key < list.Count(); key++)
@@ -143,10 +140,11 @@ void SceneRendering::AddActor(Actor* a, int32& key, DrawCategory category)
listener->OnSceneRenderingAddActor(a); 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); ScopeLock lock(Locker);
auto& list = Actors[(int32)category]; auto& list = Actors[category];
if (list.IsEmpty()) if (list.IsEmpty())
return; return;
auto& e = list[key]; auto& e = list[key];
@@ -157,10 +155,11 @@ void SceneRendering::UpdateActor(Actor* a, int32 key, DrawCategory category)
e.Bounds = a->GetSphere(); 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); ScopeLock lock(Locker);
auto& list = Actors[(int32)category]; auto& list = Actors[category];
if (list.HasItems()) if (list.HasItems())
{ {
auto& e = list[key]; auto& e = list[key];

View File

@@ -122,9 +122,9 @@ public:
void Clear(); void Clear();
public: public:
void AddActor(Actor* a, int32& key, DrawCategory category = SceneDraw); void AddActor(Actor* a, int32& key);
void UpdateActor(Actor* a, int32 key, DrawCategory category = SceneDraw); void UpdateActor(Actor* a, int32 key);
void RemoveActor(Actor* a, int32& key, DrawCategory category = SceneDraw); void RemoveActor(Actor* a, int32& key);
FORCE_INLINE void AddPostFxProvider(IPostFxSettingsProvider* obj) FORCE_INLINE void AddPostFxProvider(IPostFxSettingsProvider* obj)
{ {

View File

@@ -28,6 +28,7 @@ Terrain::Terrain(const SpawnParams& params)
, _boundsExtent(Vector3::Zero) , _boundsExtent(Vector3::Zero)
, _cachedScale(1.0f) , _cachedScale(1.0f)
{ {
_drawCategory = SceneRendering::SceneDrawAsync;
PhysicalMaterial.Changed.Bind<Terrain, &Terrain::OnPhysicalMaterialChanged>(this); PhysicalMaterial.Changed.Bind<Terrain, &Terrain::OnPhysicalMaterialChanged>(this);
} }
@@ -49,7 +50,7 @@ void Terrain::UpdateBounds()
} }
BoundingSphere::FromBox(_box, _sphere); BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void Terrain::CacheNeighbors() void Terrain::CacheNeighbors()
@@ -789,7 +790,7 @@ RigidBody* Terrain::GetAttachedRigidBody() const
void Terrain::OnEnable() void Terrain::OnEnable()
{ {
GetSceneRendering()->AddActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->AddActor(this, _sceneRenderingKey);
#if TERRAIN_USE_PHYSICS_DEBUG #if TERRAIN_USE_PHYSICS_DEBUG
GetSceneRendering()->AddPhysicsDebug<Terrain, &Terrain::DrawPhysicsDebug>(this); GetSceneRendering()->AddPhysicsDebug<Terrain, &Terrain::DrawPhysicsDebug>(this);
#endif #endif
@@ -800,7 +801,7 @@ void Terrain::OnEnable()
void Terrain::OnDisable() void Terrain::OnDisable()
{ {
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
#if TERRAIN_USE_PHYSICS_DEBUG #if TERRAIN_USE_PHYSICS_DEBUG
GetSceneRendering()->RemovePhysicsDebug<Terrain, &Terrain::DrawPhysicsDebug>(this); GetSceneRendering()->RemovePhysicsDebug<Terrain, &Terrain::DrawPhysicsDebug>(this);
#endif #endif
@@ -841,7 +842,7 @@ void Terrain::OnLayerChanged()
UpdateLayerBits(); UpdateLayerBits();
if (_sceneRenderingKey != -1) if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, SceneRendering::SceneDrawAsync); GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
} }
void Terrain::OnActiveInTreeChanged() void Terrain::OnActiveInTreeChanged()