Skip to content

Commit 5e27866

Browse files
Radient: rework scene state storage and dirty updates
1 parent 5183f70 commit 5e27866

6 files changed

Lines changed: 376 additions & 90 deletions

File tree

Radient/include/RadientSceneImpl.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class RadientSceneImpl final : public ObjectBase<IRadientScene>
6161
Bool& Visible) const override final;
6262

6363
virtual RADIENT_STATUS DILIGENT_CALL_TYPE GetEntityEffectiveVisibility(RadientEntityID Entity,
64-
Bool& Visible) const override final;
64+
Bool& Visible) override final;
6565

6666
virtual RADIENT_STATUS DILIGENT_CALL_TYPE GetParent(RadientEntityID Entity,
6767
RadientEntityID& Parent) const override final;
@@ -79,7 +79,7 @@ class RadientSceneImpl final : public ObjectBase<IRadientScene>
7979
RadientTransform& Transform) const override final;
8080

8181
virtual RADIENT_STATUS DILIGENT_CALL_TYPE GetWorldMatrix(RadientEntityID Entity,
82-
RadientMatrix4x4& Matrix) const override final;
82+
RadientMatrix4x4& Matrix) override final;
8383

8484
virtual RADIENT_STATUS DILIGENT_CALL_TYPE HasComponent(RadientEntityID Entity,
8585
RadientComponentTypeID ComponentType,

Radient/include/RadientSceneState.hpp

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
#include <string>
3636
#include <unordered_map>
37+
#include <unordered_set>
3738
#include <vector>
3839

3940
namespace Diligent
@@ -42,22 +43,26 @@ namespace Diligent
4243
class RadientSceneState
4344
{
4445
public:
46+
RadientSceneState();
47+
explicit RadientSceneState(const RadientSceneDesc& Desc);
48+
4549
const RadientSceneDesc& GetDesc() const;
4650

4751
RADIENT_STATUS IsEntityAlive(RadientEntityID Entity) const;
4852
RADIENT_STATUS GetEntityFlags(RadientEntityID Entity, RADIENT_ENTITY_FLAGS& Flags) const;
4953
RADIENT_STATUS GetEntityOwnVisibility(RadientEntityID Entity, Bool& Visible) const;
50-
RADIENT_STATUS GetEntityEffectiveVisibility(RadientEntityID Entity, Bool& Visible) const;
54+
RADIENT_STATUS GetEntityEffectiveVisibility(RadientEntityID Entity, Bool& Visible);
5155
RADIENT_STATUS GetParent(RadientEntityID Entity, RadientEntityID& Parent) const;
5256
RADIENT_STATUS GetChildCount(RadientEntityID Entity, Uint32& ChildCount) const;
5357
RADIENT_STATUS GetChildren(RadientEntityID Entity, Uint32 StartChild, Uint32 ChildCount, RadientEntityID* pChildren, Uint32& NumChildrenWritten) const;
5458
RADIENT_STATUS GetLocalTransform(RadientEntityID Entity, RadientTransform& Transform) const;
55-
RADIENT_STATUS GetWorldMatrix(RadientEntityID Entity, RadientMatrix4x4& Matrix) const;
59+
RADIENT_STATUS GetWorldMatrix(RadientEntityID Entity, RadientMatrix4x4& Matrix);
5660
RADIENT_STATUS HasComponent(RadientEntityID Entity, RadientComponentTypeID ComponentType, Bool& HasComponent) const;
5761
RadientRevision GetRevision() const;
5862

5963
RADIENT_STATUS CreateEntity(const RadientEntityDesc& Desc, RadientEntityID& Entity);
6064
RADIENT_STATUS DestroyEntity(RadientEntityID Entity);
65+
6166
RADIENT_STATUS SetEntityFlags(RadientEntityID Entity, RADIENT_ENTITY_FLAGS Flags);
6267
RADIENT_STATUS SetEntityOwnVisibility(RadientEntityID Entity, Bool Visible);
6368
RADIENT_STATUS SetParent(RadientEntityID Entity, RadientEntityID Parent, Bool KeepWorldTransform);
@@ -73,9 +78,15 @@ class RadientSceneState
7378
private:
7479
enum DIRTY_FLAGS : Uint32
7580
{
76-
DIRTY_FLAG_NONE = 0u,
77-
DIRTY_FLAG_TRANSFORM = 1u << 0u,
78-
DIRTY_FLAG_VISIBILITY = 1u << 1u,
81+
DIRTY_FLAG_NONE = 0u,
82+
83+
// Local transform changed; cached world transform must be recomputed.
84+
DIRTY_FLAG_TRANSFORM = 1u << 0u,
85+
86+
// Own visibility changed; cached effective visibility must be recomputed.
87+
DIRTY_FLAG_VISIBILITY = 1u << 1u,
88+
89+
// These flags affect descendants and must be propagated through the hierarchy.
7990
DIRTY_FLAGS_REQUIRING_PROPAGATION = DIRTY_FLAG_TRANSFORM | DIRTY_FLAG_VISIBILITY
8091
};
8192
DECLARE_FRIEND_FLAG_ENUM_OPERATORS(DIRTY_FLAGS);
@@ -137,23 +148,34 @@ class RadientSceneState
137148

138149
entt::entity FindEntity(RadientEntityID Entity) const;
139150
bool IsDescendant(entt::entity Entity, entt::entity PotentialAncestor) const;
151+
bool VerifyInternalEntity(entt::entity Entity) const;
140152
void DetachFromParent(entt::entity Entity);
141153
void DestroyEntitySubtree(entt::entity Entity);
142154
void RemoveCustomComponents(entt::entity Entity);
143155
DIRTY_FLAGS MarkDirty(entt::entity Entity, DIRTY_FLAGS Flags);
156+
void ClearDirtyFlags(entt::entity Entity, DIRTY_FLAGS Flags);
144157
void PropagateDirtyFlags(entt::entity Entity, DIRTY_FLAGS Flags);
158+
void MarkChildrenDirtyExcept(entt::entity Entity, DIRTY_FLAGS Flags, entt::entity ExcludedChild);
145159
void UpdateDirtyEntities();
146-
void UpdateDerivedState(entt::entity Entity);
160+
void UpdateDerivedState(entt::entity Entity, DIRTY_FLAGS Flags);
161+
void UpdateEntityDerivedState(entt::entity Entity, DIRTY_FLAGS Flags);
147162
void Touch();
148163

149-
RadientSceneDesc m_Desc;
164+
const std::string m_Name;
165+
RadientSceneDesc m_Desc;
150166

151-
mutable entt::registry m_Registry;
167+
entt::registry m_Registry;
152168
std::unordered_map<RadientEntityID, entt::entity> m_EntityMap;
153169
std::unordered_map<RadientComponentTypeID, CustomComponentStore> m_CustomComponentStores;
154-
std::vector<RadientEntityID> m_DirtyEntities;
155170
RadientEntityID m_NextEntityID = 1;
156171
RadientRevision m_Revision = 0;
172+
173+
// Entities with any dirty flag currently set. MarkDirty/ClearDirtyFlags keep this set in sync.
174+
std::unordered_set<entt::entity> m_DirtyEntities;
175+
// Reused snapshot buffer; commit cannot iterate m_DirtyEntities directly because processing mutates it.
176+
std::vector<entt::entity> m_DirtyEntityBuffer;
177+
// Reused path scratch buffer for lazy parent-to-child derived-state updates.
178+
std::vector<entt::entity> m_TmpEntityBuffer;
157179
};
158180

159181
} // namespace Diligent

Radient/interface/RadientScene.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ DILIGENT_BEGIN_INTERFACE(IRadientScene, IObject)
268268
/// Gets effective entity visibility, accounting for parent visibility.
269269
VIRTUAL RADIENT_STATUS METHOD(GetEntityEffectiveVisibility)(THIS_
270270
RadientEntityID Entity,
271-
Bool REF Visible) CONST PURE;
271+
Bool REF Visible) PURE;
272272

273273
/// Gets the entity parent, or InvalidRadientEntityID for a root entity.
274274
VIRTUAL RADIENT_STATUS METHOD(GetParent)(THIS_
@@ -296,7 +296,7 @@ DILIGENT_BEGIN_INTERFACE(IRadientScene, IObject)
296296
/// Gets world transform matrix.
297297
VIRTUAL RADIENT_STATUS METHOD(GetWorldMatrix)(THIS_
298298
RadientEntityID Entity,
299-
RadientMatrix4x4 REF Matrix) CONST PURE;
299+
RadientMatrix4x4 REF Matrix) PURE;
300300

301301
/// Checks if the entity has the requested component.
302302
VIRTUAL RADIENT_STATUS METHOD(HasComponent)(THIS_

Radient/src/RadientSceneImpl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ RADIENT_STATUS RadientSceneImpl::GetEntityOwnVisibility(RadientEntityID Entity,
6565
return m_pState->GetEntityOwnVisibility(Entity, Visible);
6666
}
6767

68-
RADIENT_STATUS RadientSceneImpl::GetEntityEffectiveVisibility(RadientEntityID Entity, Bool& Visible) const
68+
RADIENT_STATUS RadientSceneImpl::GetEntityEffectiveVisibility(RadientEntityID Entity, Bool& Visible)
6969
{
7070
return m_pState->GetEntityEffectiveVisibility(Entity, Visible);
7171
}
@@ -90,7 +90,7 @@ RADIENT_STATUS RadientSceneImpl::GetLocalTransform(RadientEntityID Entity, Radie
9090
return m_pState->GetLocalTransform(Entity, Transform);
9191
}
9292

93-
RADIENT_STATUS RadientSceneImpl::GetWorldMatrix(RadientEntityID Entity, RadientMatrix4x4& Matrix) const
93+
RADIENT_STATUS RadientSceneImpl::GetWorldMatrix(RadientEntityID Entity, RadientMatrix4x4& Matrix)
9494
{
9595
return m_pState->GetWorldMatrix(Entity, Matrix);
9696
}

0 commit comments

Comments
 (0)