3434
3535#include < string>
3636#include < unordered_map>
37+ #include < unordered_set>
3738#include < vector>
3839
3940namespace Diligent
@@ -42,22 +43,26 @@ namespace Diligent
4243class RadientSceneState
4344{
4445public:
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
7378private:
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
0 commit comments