Fix rendering of custom actors lists in Editor viewports
This commit is contained in:
@@ -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<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())
|
||||
|
||||
@@ -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<FoliageCluster, FOLIAGE_CLUSTER_CHUNKS_SIZE>& 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();
|
||||
|
||||
@@ -264,12 +264,16 @@ void SceneRenderTask::OnCollectDrawCalls(RenderContextBatch& renderContextBatch,
|
||||
// Draw actors (collect draw calls)
|
||||
if ((ActorsSource & ActorsSources::CustomActors) != 0)
|
||||
{
|
||||
if (_customActorsScene == nullptr)
|
||||
_customActorsScene = New<SceneRendering>();
|
||||
else
|
||||
_customActorsScene->Clear();
|
||||
for (Actor* a : CustomActors)
|
||||
AddActorToSceneRendering(_customActorsScene, a);
|
||||
if (category == SceneRendering::DrawCategory::PreRender)
|
||||
{
|
||||
if (_customActorsScene == nullptr)
|
||||
_customActorsScene = New<SceneRendering>();
|
||||
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)
|
||||
|
||||
@@ -84,6 +84,7 @@ Actor::Actor(const SpawnParams& params)
|
||||
, HideFlags(HideFlags::None)
|
||||
{
|
||||
_drawNoCulling = 0;
|
||||
_drawCategory = 0;
|
||||
}
|
||||
|
||||
SceneRendering* Actor::GetSceneRendering() const
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -10,9 +10,6 @@
|
||||
API_CLASS() class FLAXENGINE_API DirectionalLight : public LightWithShadow
|
||||
{
|
||||
DECLARE_SCENE_OBJECT(DirectionalLight);
|
||||
private:
|
||||
int32 _sceneRenderingKey = -1;
|
||||
|
||||
public:
|
||||
/// <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.
|
||||
@@ -29,7 +26,5 @@ public:
|
||||
|
||||
protected:
|
||||
// [LightWithShadow]
|
||||
void OnEnable() override;
|
||||
void OnDisable() override;
|
||||
void OnTransformChanged() override;
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -17,6 +17,7 @@ ExponentialHeightFog::ExponentialHeightFog(const SpawnParams& params)
|
||||
: Actor(params)
|
||||
{
|
||||
_drawNoCulling = 1;
|
||||
_drawCategory = SceneRendering::PreRender;
|
||||
|
||||
// Load shader
|
||||
_shader = Content::LoadAsyncInternal<Shader>(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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
API_CLASS(Abstract) class FLAXENGINE_API Light : public Actor
|
||||
{
|
||||
DECLARE_SCENE_OBJECT_ABSTRACT(Light);
|
||||
protected:
|
||||
int32 _sceneRenderingKey = -1;
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
/// Color of the light
|
||||
@@ -55,6 +58,8 @@ protected:
|
||||
|
||||
public:
|
||||
// [Actor]
|
||||
void OnEnable() override;
|
||||
void OnDisable() override;
|
||||
#if USE_EDITOR
|
||||
BoundingBox GetEditorBox() const override
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ void ModelInstanceActor::SetEntries(const Array<ModelInstanceEntry>& 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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -15,7 +15,6 @@ API_CLASS() class FLAXENGINE_API PointLight : public LightWithShadow
|
||||
private:
|
||||
Float3 _direction;
|
||||
float _radius;
|
||||
int32 _sceneRenderingKey = -1;
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
@@ -104,7 +103,5 @@ public:
|
||||
|
||||
protected:
|
||||
// [LightWithShadow]
|
||||
void OnEnable() override;
|
||||
void OnDisable() override;
|
||||
void OnTransformChanged() override;
|
||||
};
|
||||
|
||||
@@ -32,6 +32,7 @@ Sky::Sky(const SpawnParams& params)
|
||||
, _psFog(nullptr)
|
||||
{
|
||||
_drawNoCulling = 1;
|
||||
_drawCategory = SceneRendering::PreRender;
|
||||
|
||||
// Load shader
|
||||
_shader = Content::LoadAsyncInternal<Shader>(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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -32,7 +32,6 @@ public:
|
||||
private:
|
||||
AssetReference<CubeTexture> _bakedProbe;
|
||||
float _radius;
|
||||
int32 _sceneRenderingKey = -1;
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
@@ -112,7 +111,5 @@ public:
|
||||
|
||||
protected:
|
||||
// [Light]
|
||||
void OnEnable() override;
|
||||
void OnDisable() override;
|
||||
void OnTransformChanged() override;
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
SplineModel::SplineModel(const SpawnParams& params)
|
||||
: ModelInstanceActor(params)
|
||||
{
|
||||
_drawCategory = SceneRendering::SceneDrawAsync;
|
||||
Model.Changed.Bind<SplineModel, &SplineModel::OnModelChanged>(this);
|
||||
Model.Loaded.Bind<SplineModel, &SplineModel::OnModelLoaded>(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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -20,7 +20,6 @@ private:
|
||||
float _cosOuterCone;
|
||||
float _cosInnerCone;
|
||||
float _invCosConeDifference;
|
||||
int32 _sceneRenderingKey = -1;
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
@@ -134,7 +133,5 @@ public:
|
||||
|
||||
protected:
|
||||
// [LightWithShadow]
|
||||
void OnEnable() override;
|
||||
void OnDisable() override;
|
||||
void OnTransformChanged() override;
|
||||
};
|
||||
|
||||
@@ -25,6 +25,7 @@ StaticModel::StaticModel(const SpawnParams& params)
|
||||
, _vertexColorsDirty(false)
|
||||
, _vertexColorsCount(0)
|
||||
{
|
||||
_drawCategory = SceneRendering::SceneDrawAsync;
|
||||
Model.Changed.Bind<StaticModel, &StaticModel::OnModelChanged>(this);
|
||||
Model.Loaded.Bind<StaticModel, &StaticModel::OnModelLoaded>(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<StaticModel, &StaticModel::OnModelResidencyChanged>(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)
|
||||
{
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -28,6 +28,7 @@ Terrain::Terrain(const SpawnParams& params)
|
||||
, _boundsExtent(Vector3::Zero)
|
||||
, _cachedScale(1.0f)
|
||||
{
|
||||
_drawCategory = SceneRendering::SceneDrawAsync;
|
||||
PhysicalMaterial.Changed.Bind<Terrain, &Terrain::OnPhysicalMaterialChanged>(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<Terrain, &Terrain::DrawPhysicsDebug>(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<Terrain, &Terrain::DrawPhysicsDebug>(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()
|
||||
|
||||
Reference in New Issue
Block a user