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; };