diff --git a/Source/Engine/Networking/NetworkReplicationHierarchy.cpp b/Source/Engine/Networking/NetworkReplicationHierarchy.cpp
index 32b7978d0..5097b6a26 100644
--- a/Source/Engine/Networking/NetworkReplicationHierarchy.cpp
+++ b/Source/Engine/Networking/NetworkReplicationHierarchy.cpp
@@ -63,6 +63,17 @@ bool NetworkReplicationNode::RemoveObject(ScriptingObject* obj)
return !Objects.Remove(obj);
}
+bool NetworkReplicationNode::GetObject(ScriptingObject* obj, NetworkReplicationHierarchyObject& result)
+{
+ const int32 index = Objects.Find(obj);
+ if (index != -1)
+ {
+ result = Objects[index];
+ return true;
+ }
+ return false;
+}
+
bool NetworkReplicationNode::DirtyObject(ScriptingObject* obj)
{
const int32 index = Objects.Find(obj);
@@ -156,6 +167,7 @@ void NetworkReplicationGridNode::AddObject(NetworkReplicationHierarchyObject obj
cell->MinCullDistance = obj.CullDistance;
}
cell->Node->AddObject(obj);
+ _objectToCell[obj.Object] = coord;
// Cache minimum culling distance for a whole cell to skip it at once
cell->MinCullDistance = Math::Min(cell->MinCullDistance, obj.CullDistance);
@@ -163,14 +175,35 @@ void NetworkReplicationGridNode::AddObject(NetworkReplicationHierarchyObject obj
bool NetworkReplicationGridNode::RemoveObject(ScriptingObject* obj)
{
- for (const auto& e : _children)
+ Int3 coord;
+
+ if (!_objectToCell.TryGet(obj, coord))
{
- if (e.Value.Node->RemoveObject(obj))
- {
- // TODO: remove empty cells?
- // TODO: update MinCullDistance for cell?
- return true;
- }
+ return false;
+ }
+
+ if (_children[coord].Node->RemoveObject(obj))
+ {
+ _objectToCell.Remove(obj);
+ // TODO: remove empty cells?
+ // TODO: update MinCullDistance for cell?
+ return true;
+ }
+ return false;
+}
+
+bool NetworkReplicationGridNode::GetObject(ScriptingObject* obj, NetworkReplicationHierarchyObject& result)
+{
+ Int3 coord;
+
+ if (!_objectToCell.TryGet(obj, coord))
+ {
+ return false;
+ }
+
+ if (_children[coord].Node->GetObject(obj, result))
+ {
+ return true;
}
return false;
}
diff --git a/Source/Engine/Networking/NetworkReplicationHierarchy.h b/Source/Engine/Networking/NetworkReplicationHierarchy.h
index 36701c15d..b054de453 100644
--- a/Source/Engine/Networking/NetworkReplicationHierarchy.h
+++ b/Source/Engine/Networking/NetworkReplicationHierarchy.h
@@ -200,6 +200,14 @@ API_CLASS(Abstract, Namespace = "FlaxEngine.Networking") class FLAXENGINE_API Ne
/// True on successful removal, otherwise false.
API_FUNCTION() virtual bool RemoveObject(ScriptingObject* obj);
+ ///
+ /// Gets object from the hierarchy.
+ ///
+ /// The object to get.
+ /// The hierarchy object to retrieve.
+ /// True on successful retrieval, otherwise false.
+ API_FUNCTION() virtual bool GetObject(ScriptingObject* obj, NetworkReplicationHierarchyObject& result);
+
///
/// Force replicates the object during the next update. Resets any internal tracking state to force the synchronization.
///
@@ -238,6 +246,7 @@ private:
};
Dictionary _children;
+ Dictionary _objectToCell;
public:
///
@@ -247,6 +256,7 @@ public:
void AddObject(NetworkReplicationHierarchyObject obj) override;
bool RemoveObject(ScriptingObject* obj) override;
+ bool GetObject(ScriptingObject* obj, NetworkReplicationHierarchyObject& result) override;
void Update(NetworkReplicationHierarchyUpdateResult* result) override;
};