Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
ECSManager.cpp
Go to the documentation of this file.
1
2
4
16
23
25
26#include <ECS/SystemManager.h>
27
28namespace Divide {
29 constexpr U16 BYTE_BUFFER_VERSION = 1u;
30 constexpr U32 g_cacheMarkerByteValue[2]{ 0xBADDCAFE, 0xDEADBEEF };
31
32#define STUB_SYSTEM(Name) \
33 class Name##System final : public ECSSystem<Name##System, Name##Component> {\
34 public: explicit Name##System(ECS::ECSEngine& parentEngine) : ECSSystem(parentEngine) {}\
35 }
36
38STUB_SYSTEM(Networking);
39STUB_SYSTEM(Ragdoll);
42
44 : PlatformContextComponent(context),
45 _ecsEngine(engine)
46{
47 auto* TSys = _ecsEngine.GetSystemManager()->AddSystem<TransformSystem>(_ecsEngine, _context);
48 auto* ASys = _ecsEngine.GetSystemManager()->AddSystem<AnimationSystem>(_ecsEngine, _context);
49 auto* RSys = _ecsEngine.GetSystemManager()->AddSystem<RenderingSystem>(_ecsEngine, _context);
50 auto* BSys = _ecsEngine.GetSystemManager()->AddSystem<BoundsSystem>(_ecsEngine, _context);
51 auto* PlSys = _ecsEngine.GetSystemManager()->AddSystem<PointLightSystem>(_ecsEngine, _context);
52 auto* SlSys = _ecsEngine.GetSystemManager()->AddSystem<SpotLightSystem>(_ecsEngine, _context);
53 auto* DlSys = _ecsEngine.GetSystemManager()->AddSystem<DirectionalLightSystem>(_ecsEngine, _context);
54 auto* IKSys = _ecsEngine.GetSystemManager()->AddSystem<IKSystem>(_ecsEngine);
55 auto* NavSys = _ecsEngine.GetSystemManager()->AddSystem<NavigationSystem>(_ecsEngine, _context);
56 auto* NetSys = _ecsEngine.GetSystemManager()->AddSystem<NetworkingSystem>(_ecsEngine);
57 auto* RagSys = _ecsEngine.GetSystemManager()->AddSystem<RagdollSystem>(_ecsEngine);
58 auto* RBSys = _ecsEngine.GetSystemManager()->AddSystem<RigidBodySystem>(_ecsEngine, _context);
59 auto* ScpSys = _ecsEngine.GetSystemManager()->AddSystem<ScriptSystem>(_ecsEngine);
60 auto* SelSys = _ecsEngine.GetSystemManager()->AddSystem<SelectionSystem>(_ecsEngine, _context);
61 auto* UnitSys = _ecsEngine.GetSystemManager()->AddSystem<UnitSystem>(_ecsEngine);
62 auto* ProbeSys = _ecsEngine.GetSystemManager()->AddSystem<EnvironmentProbeSystem>(_ecsEngine, _context);
63
64 ASys->AddDependencies(TSys);
65 BSys->AddDependencies(ASys);
66 RSys->AddDependencies(TSys);
67 RSys->AddDependencies(BSys);
68 DlSys->AddDependencies(BSys);
69 PlSys->AddDependencies(DlSys);
70 SlSys->AddDependencies(PlSys);
71 IKSys->AddDependencies(ASys);
72 UnitSys->AddDependencies(TSys);
73 NavSys->AddDependencies(UnitSys);
74 RagSys->AddDependencies(ASys);
75 RBSys->AddDependencies(RagSys);
76 NetSys->AddDependencies(RBSys);
77 ScpSys->AddDependencies(UnitSys);
78 SelSys->AddDependencies(UnitSys);
79 ProbeSys->AddDependencies(UnitSys);
80
81 _ecsEngine.GetSystemManager()->UpdateSystemWorkOrder();
82}
83
84bool ECSManager::saveCache(const SceneGraphNode* sgn, ByteBuffer& outputBuffer) const {
85 outputBuffer << BYTE_BUFFER_VERSION;
86
87 const auto saveSystemCache = [sgn, &outputBuffer](ECS::ISystem* system) {
88 ECSSerializerProxy& serializer = static_cast<ECSSerializerProxy&>(system->GetSerializer());
89 if (!serializer.saveCache(sgn, outputBuffer)) {
90 Console::errorfn(LOCALE_STR("ECS_SAVE_ERROR"), system->GetSystemTypeName());
91 }
92
94 return true;
95 };
96
97
98 _ecsEngine.GetSystemManager()->ForEachSystem(saveSystemCache);
99 return true;
100}
101
102bool ECSManager::loadCache(SceneGraphNode* sgn, ByteBuffer& inputBuffer) const {
103 auto tempVer = decltype(BYTE_BUFFER_VERSION){0};
104 inputBuffer >> tempVer;
105 if (tempVer == BYTE_BUFFER_VERSION) {
106 const auto loadSystemCache = [sgn, &inputBuffer](ECS::ISystem* system) {
107 ECSSerializerProxy& serializer = static_cast<ECSSerializerProxy&>(system->GetSerializer());
108 if (!serializer.loadCache(sgn, inputBuffer)) {
109 Console::errorfn(LOCALE_STR("ECS_LOAD_ERROR"), system->GetSystemTypeName());
110 }
112 return true;
113 };
114
115 _ecsEngine.GetSystemManager()->ForEachSystem(loadSystemCache);
116 return true;
117 }
118
119 return false;
120}
121
122} //namespace Divide
#define STUB_SYSTEM(Name)
Definition: ECSManager.cpp:32
#define LOCALE_STR(X)
Definition: Localization.h:91
void readSkipToMarker(const T(&pattern)[N])
Skip (consume) everything in the buffer until we find the specified list of items....
Definition: ByteBuffer.inl:65
void addMarker(const T(&pattern)[N])
Add a specific list of items in order to mark a special point in the buffer. Can be used for skipping...
Definition: ByteBuffer.inl:56
bool saveCache(const SceneGraphNode *sgn, ByteBuffer &outputBuffer) const
Definition: ECSManager.cpp:84
ECSManager(PlatformContext &context, ECS::ECSEngine &engine)
Definition: ECSManager.cpp:43
bool loadCache(SceneGraphNode *sgn, ByteBuffer &inputBuffer) const
Definition: ECSManager.cpp:102
Unit interface.
Definition: Unit.h:68
void AddDependencies(Dependencies &&... dependencies)
Definition: System.h:82
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
constexpr U32 g_cacheMarkerByteValue[2]
Definition: ECSManager.cpp:30
constexpr U16 BYTE_BUFFER_VERSION
uint16_t U16
uint32_t U32
static NO_INLINE void errorfn(const char *format, T &&... args)
virtual bool loadCache(SceneGraphNode *sgn, ByteBuffer &inputBuffer)=0
virtual bool saveCache(const SceneGraphNode *sgn, ByteBuffer &outputBuffer)=0