Skip to content

Commit e55f455

Browse files
committed
Use EnttObserver to replace entt::observer
1 parent 73628f9 commit e55f455

8 files changed

Lines changed: 88 additions & 119 deletions

File tree

include/ClientLib/Systems/NetworkMovementInterpolationSystem.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88
#define TSOM_CLIENTLIB_SYSTEMS_NETWORKMOVEMENTINTERPOLATIONSYSTEM_HPP
99

1010
#include <ClientLib/Export.hpp>
11+
#include <Nazara/Core/EnttObserver.hpp>
1112
#include <Nazara/Core/Time.hpp>
1213
#include <NazaraUtils/TypeList.hpp>
1314
#include <entt/entt.hpp>
1415

1516
namespace Nz
1617
{
18+
class DisabledComponent;
1719
class NodeComponent;
1820
}
1921

@@ -29,16 +31,16 @@ namespace tsom
2931
NetworkMovementInterpolationSystem(entt::registry& registry, Nz::Time movementTickDuration, std::size_t targetMovementPoints = 4);
3032
NetworkMovementInterpolationSystem(const NetworkMovementInterpolationSystem&) = delete;
3133
NetworkMovementInterpolationSystem(NetworkMovementInterpolationSystem&&) = delete;
32-
~NetworkMovementInterpolationSystem();
34+
~NetworkMovementInterpolationSystem() = default;
3335

3436
void Update(Nz::Time elapsedTime);
3537

3638
NetworkMovementInterpolationSystem& operator=(const NetworkMovementInterpolationSystem&) = delete;
3739
NetworkMovementInterpolationSystem& operator=(NetworkMovementInterpolationSystem&&) = delete;
3840

3941
private:
40-
entt::observer m_interpolatedObserver;
4142
std::size_t m_targetMovementPoints;
43+
Nz::EnttObserver<Nz::TypeList<Nz::NodeComponent, class NetworkInterpolationComponent>, Nz::TypeList<Nz::DisabledComponent>> m_interpolatedObserver;
4244
Nz::Time m_movementTickDuration;
4345
entt::registry& m_registry;
4446
};

include/ServerLib/Systems/EnvironmentProxySystem.hpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define TSOM_SERVERLIB_SYSTEMS_ENVIRONMENTPROXYSYSTEM_HPP
99

1010
#include <ServerLib/Export.hpp>
11+
#include <Nazara/Core/EnttObserver.hpp>
1112
#include <Nazara/Core/Time.hpp>
1213
#include <NazaraUtils/TypeList.hpp>
1314
#include <entt/entt.hpp>
@@ -32,17 +33,15 @@ namespace tsom
3233
EnvironmentProxySystem(entt::registry& registry);
3334
EnvironmentProxySystem(const EnvironmentProxySystem&) = delete;
3435
EnvironmentProxySystem(EnvironmentProxySystem&&) = delete;
35-
~EnvironmentProxySystem();
36+
~EnvironmentProxySystem() = default;
3637

3738
void AddEnvironmentRecursively(ServerPlayer* player);
3839

39-
void Update(Nz::Time elapsedTime);
40-
4140
EnvironmentProxySystem& operator=(const EnvironmentProxySystem&) = delete;
4241
EnvironmentProxySystem& operator=(EnvironmentProxySystem&&) = delete;
4342

4443
private:
45-
entt::observer m_observer;
44+
Nz::EnttObserver<Nz::TypeList<Nz::NodeComponent, class EnvironmentProxyComponent>> m_observer;
4645
entt::registry& m_registry;
4746
};
4847
}

include/ServerLib/Systems/NetworkedEntitiesSystem.hpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,19 @@
1010
#include <ServerLib/Export.hpp>
1111
#include <CommonLib/Components/ClassInstanceComponent.hpp>
1212
#include <ServerLib/SessionVisibilityHandler.hpp>
13+
#include <Nazara/Core/EnttObserver.hpp>
1314
#include <Nazara/Core/Time.hpp>
1415
#include <NazaraUtils/FunctionRef.hpp>
1516
#include <NazaraUtils/TypeList.hpp>
1617
#include <entt/entt.hpp>
1718
#include <tsl/hopscotch_map.h>
1819
#include <tsl/hopscotch_set.h>
1920

21+
namespace Nz
22+
{
23+
class DisabledComponent;
24+
}
25+
2026
namespace tsom
2127
{
2228
class ServerEnvironment;
@@ -31,7 +37,7 @@ namespace tsom
3137
NetworkedEntitiesSystem(entt::registry& registry, ServerEnvironment& environment);
3238
NetworkedEntitiesSystem(const NetworkedEntitiesSystem&) = delete;
3339
NetworkedEntitiesSystem(NetworkedEntitiesSystem&&) = delete;
34-
~NetworkedEntitiesSystem();
40+
~NetworkedEntitiesSystem() = default;
3541

3642
void CreateAllEntities(SessionVisibilityHandler& visibility) const;
3743

@@ -46,19 +52,15 @@ namespace tsom
4652
private:
4753
SessionVisibilityHandler::CreateEntityData BuildCreateEntityData(entt::entity entity) const;
4854
void CreateEntity(SessionVisibilityHandler& visibility, entt::handle entity, const SessionVisibilityHandler::CreateEntityData& createData) const;
49-
void OnNetworkedDestroy(entt::registry& registry, entt::entity entity);
5055

5156
struct EntityData
5257
{
5358
NazaraSlot(ClassInstanceComponent, OnClientRpc, onClientRpc);
5459
NazaraSlot(ClassInstanceComponent, OnPropertyUpdate, onPropertyUpdate);
5560
};
5661

57-
tsl::hopscotch_map<entt::entity, EntityData> m_networkedEntities;
58-
entt::observer m_networkedConstructObserver;
59-
entt::scoped_connection m_disabledConstructConnection;
60-
entt::scoped_connection m_networkedDestroyConnection;
61-
entt::scoped_connection m_nodeDestroyConnection;
62+
entt::storage<void> m_pendingEntities;
63+
Nz::EnttObserver<Nz::TypeList<class NetworkedComponent>, Nz::TypeList<Nz::DisabledComponent>, EntityData> m_networkedEntities;
6264
entt::registry& m_registry;
6365
ServerEnvironment& m_environment;
6466
};

include/ServerLib/Systems/PlanetDatabaseSystem.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define TSOM_SERVERLIB_SYSTEMS_PLANETDATABASESYSTEM_HPP
99

1010
#include <ServerLib/Export.hpp>
11+
#include <Nazara/Core/EnttObserver.hpp>
1112
#include <Nazara/Core/Time.hpp>
1213
#include <NazaraUtils/TypeList.hpp>
1314
#include <entt/entt.hpp>
@@ -33,7 +34,7 @@ namespace tsom
3334
PlanetDatabaseSystem(entt::registry& registry, ServerDatabase& database, Nz::UInt32 databaseId);
3435
PlanetDatabaseSystem(const PlanetDatabaseSystem&) = delete;
3536
PlanetDatabaseSystem(PlanetDatabaseSystem&&) = delete;
36-
~PlanetDatabaseSystem();
37+
~PlanetDatabaseSystem() = default;
3738

3839
void Save();
3940

@@ -55,9 +56,8 @@ namespace tsom
5556
Nz::UInt32 databaseId; // Only for Update/Destroy
5657
};
5758

58-
entt::observer m_databaseObserver;
59+
Nz::EnttObserver<Nz::TypeList<Nz::NodeComponent, class DatabaseComponent, class ClassInstanceComponent>> m_databaseObserver;
5960
std::vector<DatabaseUpdate> m_pendingUpdates;
60-
tsl::hopscotch_map<entt::entity, Nz::UInt32> m_trackedEntities;
6161
entt::registry& m_registry;
6262
ServerDatabase& m_database;
6363
Nz::UInt32 m_databaseId;

src/ClientLib/Systems/NetworkMovementInterpolationSystem.cpp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,23 @@
1010
namespace tsom
1111
{
1212
NetworkMovementInterpolationSystem::NetworkMovementInterpolationSystem(entt::registry& registry, Nz::Time movementTickDuration, std::size_t targetMovementPointsy) :
13-
m_interpolatedObserver(registry, entt::collector.group<Nz::NodeComponent, NetworkInterpolationComponent>(entt::exclude<Nz::DisabledComponent>)),
1413
m_targetMovementPoints(targetMovementPointsy),
14+
m_interpolatedObserver(registry),
1515
m_movementTickDuration(movementTickDuration),
1616
m_registry(registry)
1717
{
18-
}
19-
20-
NetworkMovementInterpolationSystem::~NetworkMovementInterpolationSystem()
21-
{
22-
m_interpolatedObserver.disconnect();
23-
}
24-
25-
void NetworkMovementInterpolationSystem::Update(Nz::Time elapsedTime)
26-
{
27-
// Setup new entities
28-
m_interpolatedObserver.each([&](entt::entity entity)
18+
m_interpolatedObserver.OnEntityAdded.Connect([&](entt::entity entity)
2919
{
20+
// Setup new entities
3021
auto& entityNode = m_registry.get<Nz::NodeComponent>(entity);
3122
auto& entityInterpolation = m_registry.get<NetworkInterpolationComponent>(entity);
3223

3324
entityInterpolation.Fill(m_targetMovementPoints, entityNode.GetPosition(), entityNode.GetRotation());
3425
});
26+
}
3527

28+
void NetworkMovementInterpolationSystem::Update(Nz::Time elapsedTime)
29+
{
3630
float deltaIncrement = elapsedTime.AsSeconds() / m_movementTickDuration.AsSeconds();
3731

3832
// Interpolation

src/ServerLib/Systems/EnvironmentProxySystem.cpp

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,25 @@
1212
namespace tsom
1313
{
1414
EnvironmentProxySystem::EnvironmentProxySystem(entt::registry& registry) :
15-
m_observer(registry, entt::collector.group<Nz::NodeComponent, EnvironmentProxyComponent>(entt::exclude<Nz::DisabledComponent>)),
15+
m_observer(registry),
1616
m_registry(registry)
1717
{
18-
}
18+
m_observer.OnEntityAdded.Connect([&](entt::entity entity)
19+
{
20+
ServerEnvironment* environment = ServerEnvironment::GetEnvironment(m_registry);
1921

20-
EnvironmentProxySystem::~EnvironmentProxySystem()
21-
{
22-
m_observer.disconnect();
22+
auto& envProxy = m_registry.get<EnvironmentProxyComponent>(entity);
23+
environment->ForEachPlayer([&](ServerPlayer& player)
24+
{
25+
if (player.IsInEnvironment(envProxy.targetEnvironment))
26+
return;
27+
28+
player.AddToEnvironment(envProxy.targetEnvironment, entt::handle(m_registry, entity));
29+
30+
auto& envProxySystem = envProxy.targetEnvironment->GetWorld().GetSystem<EnvironmentProxySystem>();
31+
envProxySystem.AddEnvironmentRecursively(&player);
32+
});
33+
});
2334
}
2435

2536
void EnvironmentProxySystem::AddEnvironmentRecursively(ServerPlayer* player)
@@ -39,24 +50,4 @@ namespace tsom
3950
envProxySystem.AddEnvironmentRecursively(player);
4051
}
4152
}
42-
43-
void EnvironmentProxySystem::Update(Nz::Time /*elapsedTime*/)
44-
{
45-
ServerEnvironment* environment = ServerEnvironment::GetEnvironment(m_registry);
46-
47-
m_observer.each([&](entt::entity entity)
48-
{
49-
auto& envProxy = m_registry.get<EnvironmentProxyComponent>(entity);
50-
environment->ForEachPlayer([&](ServerPlayer& player)
51-
{
52-
if (player.IsInEnvironment(envProxy.targetEnvironment))
53-
return;
54-
55-
player.AddToEnvironment(envProxy.targetEnvironment, entt::handle(m_registry, entity));
56-
57-
auto& envProxySystem = envProxy.targetEnvironment->GetWorld().GetSystem<EnvironmentProxySystem>();
58-
envProxySystem.AddEnvironmentRecursively(&player);
59-
});
60-
});
61-
}
6253
}

src/ServerLib/Systems/NetworkedEntitiesSystem.cpp

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,32 @@
1818
namespace tsom
1919
{
2020
NetworkedEntitiesSystem::NetworkedEntitiesSystem(entt::registry& registry, ServerEnvironment& environment) :
21-
m_networkedConstructObserver(registry, entt::collector.group<Nz::NodeComponent, NetworkedComponent>(entt::exclude<Nz::DisabledComponent>)),
21+
m_networkedEntities(registry),
2222
m_registry(registry),
2323
m_environment(environment)
2424
{
25-
m_disabledConstructConnection = m_registry.on_construct<Nz::DisabledComponent>().connect<&NetworkedEntitiesSystem::OnNetworkedDestroy>(this);
26-
m_networkedDestroyConnection = m_registry.on_destroy<NetworkedComponent>().connect<&NetworkedEntitiesSystem::OnNetworkedDestroy>(this);
27-
m_nodeDestroyConnection = m_registry.on_destroy<Nz::NodeComponent>().connect<&NetworkedEntitiesSystem::OnNetworkedDestroy>(this);
28-
}
25+
m_networkedEntities.OnEntityAdded.Connect([&](entt::entity entity)
26+
{
27+
// Handle entities in Update to let all components initialize themselves
28+
m_pendingEntities.emplace(entity);
29+
});
2930

30-
NetworkedEntitiesSystem::~NetworkedEntitiesSystem()
31-
{
32-
m_networkedConstructObserver.disconnect();
31+
m_networkedEntities.OnEntityRemove.Connect([&](entt::entity entity)
32+
{
33+
if (!m_pendingEntities.remove(entity))
34+
{
35+
ForEachVisibility([&](SessionVisibilityHandler& visibility)
36+
{
37+
visibility.DestroyEntity(entt::handle(m_registry, entity));
38+
});
39+
}
40+
});
3341
}
3442

3543
void NetworkedEntitiesSystem::CreateAllEntities(SessionVisibilityHandler& visibility) const
3644
{
37-
for (auto it = m_networkedEntities.begin(); it != m_networkedEntities.end(); ++it)
38-
CreateEntity(visibility, entt::handle(m_registry, it.key()), BuildCreateEntityData(it.key()));
45+
for (auto&& [entity, entityData] : m_networkedEntities.each())
46+
CreateEntity(visibility, entt::handle(m_registry, entity), BuildCreateEntityData(entity));
3947
}
4048

4149
void NetworkedEntitiesSystem::ForEachVisibility(const Nz::FunctionRef<void(SessionVisibilityHandler& visibility)>& functor)
@@ -48,15 +56,14 @@ namespace tsom
4856

4957
void NetworkedEntitiesSystem::ForgetEntity(entt::entity entity)
5058
{
51-
m_networkedEntities.erase(entity);
59+
m_networkedEntities.Remove(entity);
5260
}
5361

54-
void NetworkedEntitiesSystem::Update(Nz::Time elapsedTime)
62+
void NetworkedEntitiesSystem::Update(Nz::Time /*elapsedTime*/)
5563
{
56-
m_networkedConstructObserver.each([&](entt::entity entity)
64+
for (entt::entity entity : m_pendingEntities)
5765
{
58-
assert(!m_networkedEntities.contains(entity));
59-
EntityData& entityData = m_networkedEntities[entity];
66+
EntityData& entityData = m_networkedEntities.Get(entity);
6067

6168
if (ClassInstanceComponent* entityInstance = m_registry.try_get<ClassInstanceComponent>(entity))
6269
{
@@ -96,7 +103,8 @@ namespace tsom
96103
{
97104
CreateEntity(visibility, entt::handle(m_registry, entity), createData);
98105
});
99-
});
106+
}
107+
m_pendingEntities.clear();
100108
}
101109

102110
SessionVisibilityHandler::CreateEntityData NetworkedEntitiesSystem::BuildCreateEntityData(entt::entity entity) const
@@ -159,19 +167,4 @@ namespace tsom
159167
});
160168
}
161169
}
162-
163-
void NetworkedEntitiesSystem::OnNetworkedDestroy([[maybe_unused]] entt::registry& registry, entt::entity entity)
164-
{
165-
assert(&m_registry == &registry);
166-
167-
if (!m_networkedEntities.contains(entity))
168-
return;
169-
170-
m_networkedEntities.erase(entity);
171-
172-
ForEachVisibility([&](SessionVisibilityHandler& visibility)
173-
{
174-
visibility.DestroyEntity(entt::handle(m_registry, entity));
175-
});
176-
}
177170
}

0 commit comments

Comments
 (0)