Skip to content

Commit 1b690aa

Browse files
committed
ECS almost finished
1 parent 6065868 commit 1b690aa

File tree

14 files changed

+160
-60
lines changed

14 files changed

+160
-60
lines changed

cmake/flags.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ set(CMAKE_CXX_FLAGS_DEBUG "-g -Og")
88
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffunction-sections -fdata-sections -fno-rtti -fvisibility=hidden -DNDEBUG")
99

1010
if(CMAKE_BUILD_TYPE STREQUAL "Release")
11-
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--gc-sections -Wl,--strip-all")
11+
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--gc-sections ") # -Wl,--strip-all
1212
endif()
1313

1414

src/Game.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class Game::GameImpl {
4545

4646
// Update worlds
4747
for (World* world : m_worlds) {
48-
world->updateEntities();
48+
world->updateWorld();
4949
world->update();
5050
}
5151
}

src/World/Component/Component.cpp

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#include "Component.hpp"
2+
#include "../Entity.hpp"
3+
24
#include "Transform.hpp"
35
#include "Transform2D.hpp"
46
#include "Physics.hpp"
@@ -14,14 +16,87 @@ ComponentManager::ComponentManager() {
1416
void ComponentManager::update() {
1517
TupleForwardFn<ComponentList>([&] <typename... Ts> () {
1618
([&] <typename T> () {
17-
std::vector<T>& pool = *std::get<Pool<T>>(m_componentPool);
19+
if (!m_loadedMask[getId<T>()]) return;
20+
std::vector<T>& pool = *std::get<Pool<T>>(m_pool);
1821
for (T& component : pool) {
1922
component.update();
2023
}
2124
}.template operator()<Ts>(), ...);
2225
});
2326
}
2427

28+
template<typename T>
29+
void ComponentManager::load() {
30+
m_loadedMask.set(getId<T>());
31+
auto& uniq = std::get<Pool<T>>(m_pool);
32+
uniq = std::make_unique<std::vector<T>>();
33+
uniq->reserve(32);
34+
}
35+
36+
template<typename T>
37+
void ComponentManager::unload() {
38+
m_loadedMask.reset(getId<T>());
39+
auto& uniq = std::get<Pool<T>>(m_pool);
40+
uniq.reset();
41+
}
42+
43+
template<typename T>
44+
T& ComponentManager::add(Entity& entity) {
45+
std::vector<T>& pool = *std::get<Pool<T>>(m_pool);
46+
47+
auto& c = pool.emplace_back();
48+
c.eId = entity.id;
49+
entity.setComponentKey<T>(pool.size()-1);
50+
entity.getComponentMask().set(getId<T>());
51+
c.init();
52+
return c;
53+
}
54+
55+
template<typename T>
56+
void ComponentManager::del(Entity& entity) {
57+
std::vector<T>& pool = *std::get<Pool<T>>(m_pool);
58+
T& last = pool[pool.size()-1];
59+
u32 componentKey = entity.getComponentKey<T>();
60+
T& component = pool[componentKey];
61+
component.destroy();
62+
component = std::move(last);
63+
64+
Entity& eReplaced = component.getEntity();
65+
eReplaced.setComponentKey<T>(componentKey);
66+
entity.getComponentMask().reset(getId<T>());
67+
pool.pop_back();
68+
}
69+
70+
template<typename T>
71+
Entity& ComponentManager::getEntity(u32 id) {
72+
std::vector<T>& pool = *std::get<Pool<T>>(m_pool);
73+
return pool[id].getEntity();
74+
}
75+
76+
template<typename T>
77+
T& ComponentManager::get(u32 id) {
78+
std::vector<T>& pool = *std::get<Pool<T>>(m_pool);
79+
return pool[id];
80+
}
81+
2582
ComponentManager::~ComponentManager() {
2683

84+
}
85+
86+
template<typename C, typename R, typename... P>
87+
void instance(R (C::*ptr) (P...)) {
88+
std::cout << ptr << std::endl;
89+
}
90+
91+
void instanceTemplating() {
92+
TupleForwardFn<ComponentList>([&] <typename... Ts> () {
93+
([&] <typename T> () {
94+
instance(&ComponentManager::load<T>);
95+
instance(&ComponentManager::unload<T>);
96+
instance(&ComponentManager::add<T>);
97+
instance(&ComponentManager::del<T>);
98+
instance(&ComponentManager::get<T>);
99+
instance(&ComponentManager::getEntity<T>);
100+
}.template operator()<Ts>(), ...);
101+
});
27102
}

src/World/Component/Component.hpp

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ constexpr u32 NComponents = std::tuple_size_v<ComponentList>;
1717

1818
class Entity;
1919
struct Component {
20-
u32 id;
20+
u32 eId;
2121

22-
Component(u32 eId) : id(eId) {}
22+
void init() {}
23+
void update() {}
24+
void destroy() {}
2325

2426
Entity& getEntity() {
25-
return WORLD.getEntity(id);
27+
return WORLD.getEntity(eId);
2628
}
2729
};
2830

@@ -36,49 +38,41 @@ class ComponentManager {
3638
template<typename... Ts>
3739
using MultiPool = std::tuple<Pool<Ts>...>;
3840

39-
TupleForward<ComponentList, MultiPool> m_componentPool;
41+
TupleForward<ComponentList, MultiPool> m_pool;
4042
public:
4143

4244
ComponentManager();
4345
~ComponentManager();
4446

4547
template<typename T>
46-
static consteval u32 getComponentId() {
48+
static consteval u32 getId() {
4749
return TupleGetIndex<T, ComponentList>;
4850
}
4951

5052
template<typename T>
51-
void loadComponent() {
52-
m_loadedMask.set(getComponentId<T>());
53-
54-
auto& uniq = std::get<Pool<T>>(m_componentPool);
55-
uniq = std::make_unique<std::vector<T>>();
56-
uniq->reserve(32);
53+
void load();
54+
55+
template<typename T>
56+
void unload();
57+
58+
template<typename T>
59+
Entity& getEntity(u32 id);
60+
61+
template<typename... Ts>
62+
bool isLoaded() {
63+
return (m_loadedMask[getId<Ts>] && ...);
5764
}
5865

5966
void update();
6067

61-
template<typename T, typename... Ts>
62-
u32 addComponent(Ts&&... args) {
63-
std::vector<T>& pool = *std::get<Pool<T>>(m_componentPool);
64-
pool.emplace_back(std::forward<Ts>(args)...);
65-
return pool.size();
66-
}
68+
template<typename T>
69+
T& add(Entity&);
6770

6871
template<typename T>
69-
T& getComponent(u32 id) {
70-
std::vector<T>& pool = *std::get<Pool<T>>(m_componentPool);
71-
return pool[id];
72-
}
72+
void del(Entity&);
7373

7474
template<typename T>
75-
void delComponent(u32 id) {
76-
std::vector<T>& pool = *std::get<Pool<T>>(m_componentPool);
77-
T& last = pool[pool.size()-1];
78-
T& replaced = pool[id];
79-
replaced = std::move(last);
80-
replaced.id = id;
81-
pool.pop_back();
82-
}
75+
T& get(u32 id);
76+
8377
};
8478

src/World/Component/Physics.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
2+
#include "Component.hpp"
23

3-
class Physics {
4+
class Physics : public Component {
45

56
public:
67
void update() {}

src/World/Component/Shader.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#pragma once
2+
#include "Component.hpp"
23
#include <GL.hpp>
34

4-
class Shader {
5+
class Shader : public Component {
56

67
public:
78
void update() {}

src/World/Component/Texture.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include "Transform2D.hpp"
44
#include "Transform.hpp"
55

6-
class Texture {
6+
class Texture : public Component {
77
public:
88
void update() {}
99
// GL::Texture* m_texture;

src/World/Component/Transform.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
#pragma once
22
#include <GL.hpp>
33
#include <glm/vec3.hpp>
4+
#include "Component.hpp"
45

56
#define TRANSFORM ENTITY.getComponent<Transform>()
67

7-
class Transform {
8+
class Transform : public Component {
89
public:
910
glm::mat4 model { 1.f };
1011
glm::vec3 position;

src/World/Component/Transform2D.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#pragma once
2-
//#include "Component.hpp"
2+
#include "Component.hpp"
33

44
#include <glm/vec2.hpp>
55
#include <GL.hpp>
66

7-
class Transform2D {
7+
class Transform2D : public Component {
88
public:
99
Transform2D(glm::vec2 position = {0, 0}, glm::vec2 scale = {1, 1}, float rotation = 0);
1010

src/World/Component/Triangle.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ struct TriangleLoader {
1515
TriangleLoader();
1616
};
1717

18-
struct Triangle {
19-
Triangle() {}
18+
class Triangle : public Component {
19+
public:
2020
void update() {}
2121
};
2222

0 commit comments

Comments
 (0)