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/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();

View File

@@ -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)

View File

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

View File

@@ -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;

View File

@@ -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()

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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;
};

View File

@@ -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();

View File

@@ -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();

View File

@@ -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

View File

@@ -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
{

View File

@@ -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);
}

View File

@@ -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)

View File

@@ -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;
};

View File

@@ -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();

View File

@@ -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

View File

@@ -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;
};

View File

@@ -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();

View File

@@ -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()

View File

@@ -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()

View File

@@ -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;
};

View File

@@ -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)
{

View File

@@ -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];

View File

@@ -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)
{

View File

@@ -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()