Merge remote-tracking branch 'origin/master' into 1.10

This commit is contained in:
Wojtek Figat
2024-10-03 10:23:13 +02:00
59 changed files with 254 additions and 148 deletions

View File

@@ -444,7 +444,6 @@ BehaviorUpdateResult BehaviorTreeMoveToNode::Update(const BehaviorUpdateContext&
else
goalLocation = TargetLocation.Get(context.Knowledge);
repath |= Vector3::Distance(goalLocation, state->GoalLocation) > TargetGoalUpdateTolerance;
state->GoalLocation = goalLocation;
}
if (repath)
@@ -490,6 +489,7 @@ BehaviorUpdateResult BehaviorTreeMoveToNode::Update(const BehaviorUpdateContext&
state->HasPath = true;
state->TargetPathIndex = 1;
state->Result = BehaviorUpdateResult::Running;
state->GoalLocation = goalLocation;
// TODO: add path debugging in Editor (eg. via BT window)

View File

@@ -775,7 +775,7 @@ void Foliage::OnFoliageTypeModelLoaded(int32 index)
}
BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Bounds);
}
{
PROFILE_CPU_NAMED("Create Clusters");
@@ -912,7 +912,7 @@ void Foliage::RebuildClusters()
_box = totalBounds;
BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Bounds);
}
// Insert all instances to the clusters
@@ -986,6 +986,12 @@ void Foliage::UpdateCullDistance()
#endif
}
void Foliage::RemoveAllInstances()
{
Instances.Clear();
RebuildClusters();
}
static float GlobalDensityScale = 1.0f;
float Foliage::GetGlobalDensityScale()
@@ -1441,7 +1447,7 @@ void Foliage::Deserialize(DeserializeStream& stream, ISerializeModifier* modifie
void Foliage::OnLayerChanged()
{
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Layer);
}
void Foliage::OnEnable()

View File

@@ -134,6 +134,11 @@ public:
/// </summary>
API_FUNCTION() void UpdateCullDistance();
/// <summary>
/// Clears all foliage instances. Preserves the foliage types and other properties.
/// </summary>
API_FUNCTION() void RemoveAllInstances();
public:
/// <summary>
/// Gets the global density scale for all foliage instances. The default value is 1. Use values from range 0-1. Lower values decrease amount of foliage instances in-game. Use it to tweak game performance for slower devices.

View File

@@ -87,6 +87,7 @@ void IMaterial::BindParameters::BindViewData()
void IMaterial::BindParameters::BindDrawData()
{
// Write draw call to the object buffer
ASSERT(DrawCall);
auto& objectBuffer = RenderContext.List->TempObjectBuffer;
objectBuffer.Clear();
ShaderObjectData objData;

View File

@@ -758,7 +758,7 @@ void AnimatedModel::UpdateBounds()
}
BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Bounds);
}
void AnimatedModel::UpdateSockets()

View File

@@ -64,7 +64,7 @@ BoundingBox Decal::GetEditorBox() const
void Decal::OnLayerChanged()
{
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Layer);
}
void Decal::Draw(RenderContext& renderContext)

View File

@@ -166,7 +166,7 @@ void EnvironmentProbe::UpdateBounds()
_sphere = BoundingSphere(GetPosition(), GetScaledRadius());
BoundingBox::FromSphere(_sphere, _box);
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Bounds);
}
void EnvironmentProbe::Draw(RenderContext& renderContext)
@@ -220,7 +220,7 @@ void EnvironmentProbe::OnDebugDrawSelected()
void EnvironmentProbe::OnLayerChanged()
{
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Layer);
}
void EnvironmentProbe::Serialize(SerializeStream& stream, const void* otherObj)

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);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Visual);
}
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);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Visual);
}
MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32 entryIndex)
@@ -44,7 +44,7 @@ MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32
MaterialInstance* result = material->CreateVirtualInstance();
Entries[entryIndex].Material = result;
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Visual);
return result;
}
@@ -55,7 +55,13 @@ void ModelInstanceActor::WaitForModelLoad()
void ModelInstanceActor::OnLayerChanged()
{
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Layer);
}
void ModelInstanceActor::OnStaticFlagsChanged()
{
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::StaticFlags);
}
void ModelInstanceActor::OnTransformChanged()

View File

@@ -142,6 +142,7 @@ protected:
public:
// [Actor]
void OnLayerChanged() override;
void OnStaticFlagsChanged() override;
void OnTransformChanged() override;
protected:

View File

@@ -67,7 +67,7 @@ void PointLight::UpdateBounds()
BoundingBox::FromSphere(_sphere, _box);
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Bounds);
}
void PointLight::OnTransformChanged()
@@ -163,7 +163,7 @@ void PointLight::DrawLightsDebug(RenderView& view)
void PointLight::OnLayerChanged()
{
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Layer);
}
void PointLight::Serialize(SerializeStream& stream, const void* otherObj)

View File

@@ -101,7 +101,7 @@ void SkyLight::UpdateBounds()
_sphere = BoundingSphere(GetPosition(), GetScaledRadius());
BoundingBox::FromSphere(_sphere, _box);
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Bounds);
}
void SkyLight::Draw(RenderContext& renderContext)

View File

@@ -115,7 +115,7 @@ void SpotLight::UpdateBounds()
BoundingBox::FromSphere(_sphere, _box);
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Bounds);
}
void SpotLight::OnTransformChanged()

View File

@@ -283,7 +283,7 @@ void StaticModel::UpdateBounds()
}
BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Bounds);
}
void StaticModel::FlushVertexColors()

View File

@@ -162,7 +162,7 @@ void SceneRendering::AddActor(Actor* a, int32& key)
listener->OnSceneRenderingAddActor(a);
}
void SceneRendering::UpdateActor(Actor* a, int32& key)
void SceneRendering::UpdateActor(Actor* a, int32& key, ISceneRenderingListener::UpdateFlags flags)
{
const int32 category = a->_drawCategory;
ScopeLock lock(Locker);
@@ -173,9 +173,11 @@ void SceneRendering::UpdateActor(Actor* a, int32& key)
if (e.Actor == a)
{
for (auto* listener : _listeners)
listener->OnSceneRenderingUpdateActor(a, e.Bounds);
e.LayerMask = a->GetLayerMask();
e.Bounds = a->GetSphere();
listener->OnSceneRenderingUpdateActor(a, e.Bounds, flags);
if (flags & ISceneRenderingListener::Layer)
e.LayerMask = a->GetLayerMask();
if (flags & ISceneRenderingListener::Bounds)
e.Bounds = a->GetSphere();
}
}

View File

@@ -48,12 +48,22 @@ private:
public:
~ISceneRenderingListener();
// Actor properties that were modified.
enum UpdateFlags
{
Visual = 1,
Bounds = 2,
Layer = 4,
StaticFlags = 8,
Auto = Visual | Bounds | Layer,
};
// Starts listening to the scene rendering events.
void ListenSceneRendering(SceneRendering* scene);
// Events called by Scene Rendering
virtual void OnSceneRenderingAddActor(Actor* a) = 0;
virtual void OnSceneRenderingUpdateActor(Actor* a, const BoundingSphere& prevBounds) = 0;
virtual void OnSceneRenderingUpdateActor(Actor* a, const BoundingSphere& prevBounds, UpdateFlags flags = Auto) = 0;
virtual void OnSceneRenderingRemoveActor(Actor* a) = 0;
virtual void OnSceneRenderingClear(SceneRendering* scene) = 0;
};
@@ -125,7 +135,7 @@ public:
public:
void AddActor(Actor* a, int32& key);
void UpdateActor(Actor* a, int32& key);
void UpdateActor(Actor* a, int32& key, ISceneRenderingListener::UpdateFlags flags = ISceneRenderingListener::Auto);
void RemoveActor(Actor* a, int32& key);
FORCE_INLINE void AddPostFxProvider(IPostFxSettingsProvider* obj)

View File

@@ -132,9 +132,10 @@ void NetworkLagDriver::SendMessage(const NetworkChannelType channelType, const N
auto& msg = _messages.AddOne();
msg.Lag = (double)Lag;
msg.ChannelType = channelType;
msg.Type = 0;
msg.Message = message;
msg.MessageData.Set(message.Buffer, message.Length);
msg.MessageLength = message.Length;
}
void NetworkLagDriver::SendMessage(NetworkChannelType channelType, const NetworkMessage& message, NetworkConnection target)
@@ -147,10 +148,11 @@ void NetworkLagDriver::SendMessage(NetworkChannelType channelType, const Network
auto& msg = _messages.AddOne();
msg.Lag = (double)Lag;
msg.ChannelType = channelType;
msg.Type = 1;
msg.Message = message;
msg.Target = target;
msg.MessageData.Set(message.Buffer, message.Length);
msg.MessageLength = message.Length;
}
void NetworkLagDriver::SendMessage(const NetworkChannelType channelType, const NetworkMessage& message, const Array<NetworkConnection, HeapAllocation>& targets)
@@ -163,10 +165,11 @@ void NetworkLagDriver::SendMessage(const NetworkChannelType channelType, const N
auto& msg = _messages.AddOne();
msg.Lag = (double)Lag;
msg.ChannelType = channelType;
msg.Type = 2;
msg.Message = message;
msg.Targets = targets;
msg.MessageData.Set(message.Buffer, message.Length);
msg.MessageLength = message.Length;
}
NetworkDriverStats NetworkLagDriver::GetStats()
@@ -197,19 +200,21 @@ void NetworkLagDriver::OnUpdate()
if (msg.Lag > 0.0)
continue;
// Fix message to point to the current buffer
msg.Message.Buffer = msg.MessageData.Get();
// Use this helper message as a container to send the stored data and length to the ENet driver
NetworkMessage message;
message.Buffer = msg.MessageData.Get();
message.Length = msg.MessageLength;
switch (msg.Type)
{
case 0:
_driver->SendMessage(msg.ChannelType, msg.Message);
_driver->SendMessage(msg.ChannelType, message);
break;
case 1:
_driver->SendMessage(msg.ChannelType, msg.Message, msg.Target);
_driver->SendMessage(msg.ChannelType, message, msg.Target);
break;
case 2:
_driver->SendMessage(msg.ChannelType, msg.Message, msg.Targets);
_driver->SendMessage(msg.ChannelType, message, msg.Targets);
break;
}
_messages.RemoveAt(i);

View File

@@ -22,10 +22,10 @@ private:
double Lag;
int32 Type;
NetworkChannelType ChannelType;
NetworkMessage Message;
NetworkConnection Target;
Array<NetworkConnection> Targets;
Array<byte> MessageData; // TODO: use message buffers cache (of size config.MessageSize) to reduce dynamic memory allocations
uint32 MessageLength;
};
struct LagEvent

View File

@@ -74,6 +74,17 @@ bool NetworkReplicationNode::GetObject(ScriptingObject* obj, NetworkReplicationH
return false;
}
bool NetworkReplicationNode::SetObject(const NetworkReplicationHierarchyObject& value)
{
const int32 index = Objects.Find(value.Object.Get());
if (index != -1)
{
Objects[index] = value;
return true;
}
return false;
}
bool NetworkReplicationNode::DirtyObject(ScriptingObject* obj)
{
const int32 index = Objects.Find(obj);
@@ -212,11 +223,17 @@ bool NetworkReplicationGridNode::GetObject(ScriptingObject* obj, NetworkReplicat
{
return false;
}
if (_children[coord].Node->GetObject(obj, result))
return _children[coord].Node->GetObject(obj, result);
}
bool NetworkReplicationGridNode::SetObject(const NetworkReplicationHierarchyObject& value)
{
Int3 coord;
if (!_objectToCell.TryGet(value.Object.Get(), coord))
{
return true;
return false;
}
return false;
return _children[coord].Node->SetObject(value);
}
bool NetworkReplicationGridNode::DirtyObject(ScriptingObject* obj)

View File

@@ -206,7 +206,14 @@ API_CLASS(Abstract, Namespace = "FlaxEngine.Networking") class FLAXENGINE_API Ne
/// <param name="obj">The object to get.</param>
/// <param name="result">The hierarchy object to retrieve.</param>
/// <returns>True on successful retrieval, otherwise false.</returns>
API_FUNCTION() virtual bool GetObject(ScriptingObject* obj, NetworkReplicationHierarchyObject& result);
API_FUNCTION() virtual bool GetObject(ScriptingObject* obj, API_PARAM(Out) NetworkReplicationHierarchyObject& result);
/// <summary>
/// Sets object properties in the hierarchy. Can be used to modify replication settings at runtime.
/// </summary>
/// <param name="value">The object data to update.</param>
/// <returns>True on successful update, otherwise false (eg, if specific object has not been added to this node).</returns>
API_FUNCTION() virtual bool SetObject(const NetworkReplicationHierarchyObject& value);
/// <summary>
/// Force replicates the object during the next update. Resets any internal tracking state to force the synchronization.
@@ -257,6 +264,7 @@ public:
void AddObject(NetworkReplicationHierarchyObject obj) override;
bool RemoveObject(ScriptingObject* obj) override;
bool GetObject(ScriptingObject* obj, NetworkReplicationHierarchyObject& result) override;
bool SetObject(const NetworkReplicationHierarchyObject& value) override;
bool DirtyObject(ScriptingObject* obj) override;
void Update(NetworkReplicationHierarchyUpdateResult* result) override;
};

View File

@@ -16,6 +16,7 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParameters(Box* box, Node* nod
switch (node->TypeID)
{
// Get
case 1:
case 2:
{
int32 paramIndex;

View File

@@ -589,7 +589,7 @@ void ParticleEffect::OnDebugDrawSelected()
void ParticleEffect::OnLayerChanged()
{
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Layer);
}
void ParticleEffect::Serialize(SerializeStream& stream, const void* otherObj)

View File

@@ -499,7 +499,7 @@ public:
{
}
void OnSceneRenderingUpdateActor(Actor* a, const BoundingSphere& prevBounds) override
void OnSceneRenderingUpdateActor(Actor* a, const BoundingSphere& prevBounds, UpdateFlags flags) override
{
// Dirty static objects to redraw when changed (eg. material modification)
if (a->HasStaticFlag(StaticFlags::Lightmap))

View File

@@ -399,7 +399,7 @@ public:
}
}
void OnSceneRenderingUpdateActor(Actor* a, const BoundingSphere& prevBounds) override
void OnSceneRenderingUpdateActor(Actor* a, const BoundingSphere& prevBounds, UpdateFlags flags) override
{
if (GLOBAL_SDF_ACTOR_IS_STATIC(a) && ObjectTypes.Contains(a->GetTypeHandle()))
{

View File

@@ -392,7 +392,7 @@ public:
DirtyStaticBounds(a->GetSphere());
}
void OnSceneRenderingUpdateActor(Actor* a, const BoundingSphere& prevBounds) override
void OnSceneRenderingUpdateActor(Actor* a, const BoundingSphere& prevBounds, UpdateFlags flags) override
{
// Dirty static objects to redraw when changed (eg. material modification)
if (a->HasStaticFlag(StaticFlags::Shadow))
@@ -400,6 +400,10 @@ public:
DirtyStaticBounds(prevBounds);
DirtyStaticBounds(a->GetSphere());
}
else if (flags & StaticFlags)
{
DirtyStaticBounds(a->GetSphere());
}
}
void OnSceneRenderingRemoveActor(Actor* a) override

View File

@@ -60,9 +60,10 @@ bool VolumetricFogPass::setupResources()
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data);
return true;
}
if (shader->GetCB(1)->GetSize() != sizeof(PerLight))
// CB1 is used for per-draw info (ObjectIndex)
if (shader->GetCB(2)->GetSize() != sizeof(PerLight))
{
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 1, PerLight);
REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 2, PerLight);
return true;
}
@@ -254,7 +255,7 @@ GPUTextureView* VolumetricFogPass::GetLocalShadowedLightScattering(RenderContext
}
template<typename T>
void VolumetricFogPass::RenderRadialLight(RenderContext& renderContext, GPUContext* context, RenderView& view, VolumetricFogOptions& options, T& light, PerLight& perLight, GPUConstantBuffer* cb1)
void VolumetricFogPass::RenderRadialLight(RenderContext& renderContext, GPUContext* context, RenderView& view, VolumetricFogOptions& options, T& light, PerLight& perLight, GPUConstantBuffer* cb2)
{
const Float3 center = light.Position;
const float radius = light.Radius;
@@ -281,8 +282,8 @@ void VolumetricFogPass::RenderRadialLight(RenderContext& renderContext, GPUConte
light.SetShaderData(perLight.LocalLight, withShadow);
// Upload data
context->UpdateCB(cb1, &perLight);
context->BindCB(1, cb1);
context->UpdateCB(cb2, &perLight);
context->BindCB(2, cb2);
// Ensure to have valid buffers created
if (_vbCircleRasterize == nullptr || _ibCircleRasterize == nullptr)
@@ -414,6 +415,8 @@ void VolumetricFogPass::Render(RenderContext& renderContext)
customData.VolumetricFogMaxDistance = cache.Data.VolumetricFogMaxDistance;
bindParams.CustomData = &customData;
bindParams.BindViewData();
bindParams.DrawCall = &renderContext.List->VolumetricFogParticles.First();
bindParams.BindDrawData();
for (auto& drawCall : renderContext.List->VolumetricFogParticles)
{
@@ -439,7 +442,7 @@ void VolumetricFogPass::Render(RenderContext& renderContext)
// Setup volumetric shader data
PerLight perLight;
auto cb1 = _shader->GetShader()->GetCB(1);
auto cb2 = _shader->GetShader()->GetCB(2);
perLight.SliceToDepth.X = cache.Data.GridSize.Z;
perLight.SliceToDepth.Y = cache.Data.VolumetricFogMaxDistance;
perLight.MinZ = volumeZBoundsMin;
@@ -447,8 +450,8 @@ void VolumetricFogPass::Render(RenderContext& renderContext)
Matrix::Transpose(renderContext.View.Projection, perLight.ViewToVolumeClip);
// Upload data
context->UpdateCB(cb1, &perLight);
context->BindCB(1, cb1);
context->UpdateCB(cb2, &perLight);
context->BindCB(2, cb2);
// Call rendering to the volume
const int32 instanceCount = volumeZBoundsMax - volumeZBoundsMin;
@@ -495,7 +498,7 @@ void VolumetricFogPass::Render(RenderContext& renderContext)
PerLight perLight;
perLight.SliceToDepth.X = cache.Data.GridSize.Z;
perLight.SliceToDepth.Y = cache.Data.VolumetricFogMaxDistance;
auto cb1 = _shader->GetShader()->GetCB(1);
auto cb2 = _shader->GetShader()->GetCB(2);
// Bind the output
context->SetRenderTarget(localShadowedLightScattering);
@@ -505,12 +508,12 @@ void VolumetricFogPass::Render(RenderContext& renderContext)
context->BindSR(0, shadowMap);
context->BindSR(1, shadowsBuffer);
for (int32 i = 0; i < pointLights.Count(); i++)
RenderRadialLight(renderContext, context, view, options, renderContext.List->PointLights[pointLights[i]], perLight, cb1);
RenderRadialLight(renderContext, context, view, options, renderContext.List->PointLights[pointLights[i]], perLight, cb2);
for (int32 i = 0; i < spotLights.Count(); i++)
RenderRadialLight(renderContext, context, view, options, renderContext.List->SpotLights[spotLights[i]], perLight, cb1);
RenderRadialLight(renderContext, context, view, options, renderContext.List->SpotLights[spotLights[i]], perLight, cb2);
// Cleanup
context->UnBindCB(1);
context->UnBindCB(2);
context->ResetRenderTarget();
context->FlushState();
}

View File

@@ -157,7 +157,7 @@ private:
GPUTextureView* GetLocalShadowedLightScattering(RenderContext& renderContext, GPUContext* context, VolumetricFogOptions& options) const;
void InitCircleBuffer();
template<typename T>
void RenderRadialLight(RenderContext& renderContext, GPUContext* context, RenderView& view, VolumetricFogOptions& options, T& light, PerLight& perLight, GPUConstantBuffer* cb1);
void RenderRadialLight(RenderContext& renderContext, GPUContext* context, RenderView& view, VolumetricFogOptions& options, T& light, PerLight& perLight, GPUConstantBuffer* cb2);
#if COMPILE_WITH_DEV_ENV
void OnShaderReloading(Asset* obj)
{

View File

@@ -52,7 +52,7 @@ void Terrain::UpdateBounds()
}
BoundingSphere::FromBox(_box, _sphere);
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Bounds);
}
void Terrain::CacheNeighbors()
@@ -905,7 +905,7 @@ void Terrain::OnLayerChanged()
UpdateLayerBits();
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Layer);
}
void Terrain::OnActiveInTreeChanged()

View File

@@ -233,7 +233,8 @@ namespace FlaxEngine.GUI
if (IsMouseOver || IsNavFocused)
backColor = BackgroundSelectedColor;
Render2D.FillRectangle(rect, backColor);
Render2D.DrawRectangle(rect, IsFocused ? BorderSelectedColor : BorderColor);
if (HasBorder)
Render2D.DrawRectangle(rect, IsFocused ? BorderSelectedColor : BorderColor, BorderThickness);
// Apply view offset and clip mask
if (ClipText)

View File

@@ -186,7 +186,7 @@ void SpriteRender::Deserialize(DeserializeStream& stream, ISerializeModifier* mo
void SpriteRender::OnLayerChanged()
{
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Layer);
}
void SpriteRender::OnEndPlay()

View File

@@ -415,7 +415,7 @@ void TextRender::OnDebugDrawSelected()
void TextRender::OnLayerChanged()
{
if (_sceneRenderingKey != -1)
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey);
GetSceneRendering()->UpdateActor(this, _sceneRenderingKey, ISceneRenderingListener::Layer);
}
bool TextRender::IntersectsItself(const Ray& ray, Real& distance, Vector3& normal)

View File

@@ -152,6 +152,18 @@ int32 VideoPlayer::GetFramesCount() const
return _player.FramesCount;
}
#if USE_EDITOR
#include "Engine/Debug/DebugDraw.h"
void VideoPlayer::OnDebugDrawSelected()
{
// Draw influence range
if (_isSpatial)
DEBUG_DRAW_WIRE_SPHERE(BoundingSphere(_transform.Translation, _minDistance), Color::CornflowerBlue, 0, true);
Actor::OnDebugDrawSelected();
}
#endif
bool VideoPlayer::IntersectsItself(const Ray& ray, Real& distance, Vector3& normal)
{
return false;

View File

@@ -221,6 +221,8 @@ public:
const Vector3 size(50);
return BoundingBox(_transform.Translation - size, _transform.Translation + size);
}
void OnDebugDrawSelected() override;
#endif
bool IntersectsItself(const Ray& ray, Real& distance, Vector3& normal) override;