Cogs.Core
DynamicComponentSystem.h
1#pragma once
2
3#include <functional>
4#include <memory>
5#include <vector>
6#include <unordered_map>
7#include <unordered_set>
8
9#include "../ComponentSystem.h"
10
11#include "Components/Core/DynamicComponent.h"
12
13namespace Cogs
14{
15 namespace Core
16 {
17 class Context;
18
19 using MessageId = size_t;
20 constexpr MessageId NoMessage = static_cast<MessageId>(-1);
21
22 constexpr size_t kMaxDynamicTypes = 1024;
23 constexpr size_t kMaxDynamicMethods = 64;
24
39 class COGSCORE_DLL_API DynamicComponentSystem : public ComponentSystemBase
40 {
42 {
43 ComponentModel::ComponentPoolBase * pool = nullptr;
44 size_t messageMask = 0;
45 Reflection::TypeId typeId = Reflection::NoType;
46
47 std::vector<const Reflection::Method *> methods;
48
49 struct MessageDispatcher * dispatcher = nullptr;
50 };
51
53 {
54 std::string name;
55 };
56
59 {
62
66
67 DynamicTypeInfo * typeInfo;
68 };
69
70 public:
74
75 void initialize(Context * context) override;
76
77 void cleanup(Context * context) override;
78
80 void preUpdate(Context * context) override;
81
83 void update(Context * context) override;
84
86 void postUpdate(Context * context) override;
87
88 void instrumentedPreUpdate() override
89 {
90 CpuInstrumentationScope(SCOPE_SYSTEMS, "DynamicComponentSystem::preUpdate");
91
92 preUpdate(context);
93 }
94
95 void instrumentedUpdate() override
96 {
97 CpuInstrumentationScope(SCOPE_SYSTEMS, "DynamicComponentSystem::update");
98
99 update(context);
100 }
101
103 {
104 CpuInstrumentationScope(SCOPE_SYSTEMS, "DynamicComponentSystem::postUpdate");
105
106 postUpdate(context);
107 }
108
109 void registerType(Context * context, const Reflection::Type & type);
110 void registerType(Context * context, const StringView & name, size_t dispatchMask);
111
112 MessageId registerMessage(const StringView & messageName);
113 MessageId getMessageId(const StringView & messageName) const;
114
115 void sendMessage(Entity * entity, MessageId message);
116 void sendMessage(Entity * entity, MessageId message, void * arg);
117
118 private:
119 using ComponentSystemBase::createComponent;
120 using ComponentSystemBase::destroyComponent;
121
122 ComponentModel::ComponentHandle createComponent(DynamicTypeInfo * typeInfo);
123 void destroyComponent(DynamicTypeInfo * typeInfo, ComponentModel::ComponentHandle component);
124
126
127 std::vector<std::vector<DispatchInfo>> messageHandlers;
128 std::vector<MessageInfo> messages;
129
130 MessageId initializeMessage;
131 MessageId updateMessage;
132 MessageId postUpdateMessage;
133 MessageId cleanupMessage;
134
135 std::unordered_map<Reflection::TypeId, ComponentModel::ComponentPoolBase *> pools;
136
137 std::vector<DynamicTypeInfo> dynamicTypes;
138 };
139 }
140}
Untyped Component pool base.
Definition: ComponentPool.h:37
Container for components, providing composition of dynamic entities.
Definition: Entity.h:18
Base class for component systems.
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Definition: Context.h:83
The dynamic component system handles instances of components derived from DynamicComponent.
void instrumentedPreUpdate() override
Provided for tagged engine instrumentation.
void instrumentedPostUpdate() override
Provided for tagged engine instrumentation.
void instrumentedUpdate() override
Provided for tagged engine instrumentation.
Simple method definition.
Definition: Method.h:72
Represents a discrete type definition, describing a native type class.
Definition: Type.h:89
Provides a weakly referenced view over the contents of a string.
Definition: StringView.h:24
uint16_t TypeId
Built in type used to uniquely identify a single type instance.
Definition: Name.h:48
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
Handle to a Component instance.
Definition: Component.h:67
Defines an update aware component and the method which to call during the update phase.
ComponentModel::ComponentHandle component
Handle to the component to invoke.