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/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();
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user