Skip to content

Commit 030464f

Browse files
zaucyKelwan
authored andcommitted
feat: ecsact codegen plugin for optimization
1 parent 0defb9e commit 030464f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+4281
-3289
lines changed

.vscode/launch.json

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
1-
{
2-
"version": "0.2.0",
3-
"configurations": [
4-
{
5-
"name": "test //runtime/test:test",
6-
"request": "launch",
7-
"program": "${workspaceFolder}/bazel-bin/runtime/test/test",
8-
"cwd": "${workspaceFolder}",
9-
"args": [
10-
"--gtest_catch_exceptions",
11-
"--gtest_break_on_failure"
12-
],
13-
"type": "cppdbg",
14-
"windows": {
15-
"type": "cppvsdbg",
16-
"program": "${workspaceFolder}/bazel-bin/runtime/test/test.exe"
17-
},
18-
"preLaunchTask": "build //runtime/test:test",
19-
"sourceFileMap": {
20-
"E:/.cache/bazel/output_base/execroot/ecsact_rt_entt": "${workspaceFolder}"
21-
}
22-
}
23-
],
24-
"compounds": []
25-
}
1+
{
2+
"version": "0.2.0",
3+
"configurations": [
4+
{
5+
"name": "test //runtime/test:test",
6+
"request": "launch",
7+
"program": "${workspaceFolder}/bazel-bin/runtime/test/test",
8+
"cwd": "${workspaceFolder}",
9+
"args": [
10+
"--gtest_catch_exceptions",
11+
// "--gtest_break_on_failure",
12+
],
13+
"type": "cppvsdbg",
14+
"windows": {
15+
"type": "cppvsdbg",
16+
"program": "${workspaceFolder}/bazel-bin/runtime/test/test.exe"
17+
},
18+
"preLaunchTask": "build //runtime/test:test",
19+
"sourceFileMap": {
20+
"C:/users/austin/_bazel_austin/ohk2m3f2/execroot/ecsact_rt_entt": "${workspaceFolder}"
21+
}
22+
}
23+
],
24+
"compounds": []
25+
}

WORKSPACE.bazel

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,25 @@ http_archive(
1818

1919
http_archive(
2020
name = "ecsact_runtime",
21-
sha256 = "dfc71e519d24b943c855d288d19f539fc9b9c65636c0376c7febb865233161b6",
22-
strip_prefix = "ecsact_runtime-0.2.0",
23-
urls = ["https://github.com/ecsact-dev/ecsact_runtime/archive/refs/tags/0.2.0.tar.gz"],
21+
sha256 = "35b03aaef0925fda5b5aefb2d6a6e2c9593f31d6414ab157091f9ca26a992da3",
22+
strip_prefix = "ecsact_runtime-0.3.0",
23+
urls = ["https://github.com/ecsact-dev/ecsact_runtime/archive/refs/tags/0.3.0.tar.gz"],
2424
)
2525

2626
http_file(
2727
name = "ecsact_cli_windows",
28-
url = "https://github.com/ecsact-dev/ecsact_cli/releases/download/0.1.0/ecsact_0.1.0_windows_x64.exe",
29-
executable = True,
3028
downloaded_file_path = "ecsact.exe",
29+
executable = True,
30+
sha256 = "b61adc4d12d571d16996db6e5c5ad5ee7b150fb203012c535d899b03e28244aa",
31+
url = "https://github.com/ecsact-dev/ecsact_cli/releases/download/0.1.1/ecsact_0.1.1_windows_x64.exe",
3132
)
3233

3334
http_file(
3435
name = "ecsact_cli_linux",
35-
url = "https://github.com/ecsact-dev/ecsact_cli/releases/download/0.1.0/ecsact_0.1.0_linux_x64",
36-
executable = True,
3736
downloaded_file_path = "ecsact",
37+
executable = True,
38+
sha256 = "b87b1e2169dfebe9777b89736d5ddac7a9ab84bc10aec9c28231eb52567a4626",
39+
url = "https://github.com/ecsact-dev/ecsact_cli/releases/download/0.1.1/ecsact_0.1.1_linux_x64",
3840
)
3941

4042
http_archive(

ecsact/entt/detail/apply_pending.hh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#pragma once
2+
3+
#include <entt/entt.hpp>
4+
#include "ecsact/entt/wrapper/core.hh"
5+
#include "ecsact/entt/detail/internal_markers.hh"
6+
7+
namespace ecsact::entt::detail {
8+
9+
template<typename C>
10+
auto apply_pending_add(::entt::registry& registry) -> void {
11+
if constexpr(std::is_empty_v<C>) {
12+
registry.view<pending_add<C>>().each([&](auto entity) {
13+
registry.emplace<C>(entity);
14+
});
15+
} else {
16+
registry.view<pending_add<C>>().each(
17+
[&](auto entity, const pending_add<C>& comp) {
18+
registry.emplace<C>(entity, comp.value);
19+
}
20+
);
21+
}
22+
registry.clear<pending_add<C>>();
23+
}
24+
25+
template<typename C>
26+
auto apply_pending_remove(::entt::registry& registry) -> void {
27+
registry.view<pending_remove<C>>().each([&](auto entity) {
28+
if constexpr(!std::is_empty_v<C>) {
29+
registry.erase<beforechange_storage<C>>(entity);
30+
}
31+
registry.erase<C>(entity);
32+
});
33+
registry.clear<pending_remove<C>>();
34+
}
35+
36+
} // namespace ecsact::entt::detail

ecsact/entt/detail/entt_util.hh

Lines changed: 0 additions & 19 deletions
This file was deleted.

ecsact/entt/detail/execution_events_collector.hh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <type_traits>
44
#include "ecsact/runtime/core.h"
55

6-
namespace ecsact_entt_rt {
6+
namespace ecsact::entt::detail {
77

88
struct execution_events_collector {
99
const ecsact_execution_events_collector* target;
@@ -123,4 +123,4 @@ struct execution_events_collector {
123123
}
124124
};
125125

126-
} // namespace ecsact_entt_rt
126+
} // namespace ecsact::entt::detail

ecsact/entt/detail/globals.hh

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
#pragma once
2+
3+
#include <unordered_map>
4+
#include <unordered_set>
5+
#include "entt/entity/registry.hpp"
6+
#include "ecsact/runtime/common.h"
7+
#include "ecsact/runtime/core.h"
8+
#include "ecsact/runtime/dynamic.h"
9+
#include "ecsact/entt/detail/system_execution_context.hh"
10+
11+
/**
12+
* A small set of globals exepected to be available the ecsact_rt_entt_codegen
13+
* generated source.
14+
*/
15+
namespace ecsact::entt::detail::globals {
16+
17+
/**
18+
* Ecsact registry ID mapped to EnTT registry instance.
19+
*/
20+
extern std::unordered_map< //
21+
ecsact_registry_id,
22+
::entt::registry>
23+
registries;
24+
25+
/**
26+
* Stored last registry ID. Used to create new registry IDs.
27+
*/
28+
extern ecsact_registry_id last_registry_id;
29+
30+
/**
31+
* System-like implementation functions set by dynamic API.
32+
*/
33+
extern std::unordered_map< //
34+
ecsact_system_like_id,
35+
ecsact_system_execution_impl>
36+
system_impls;
37+
38+
/**
39+
* All components IDs available to rt_entt
40+
*/
41+
extern const std::unordered_set<ecsact_component_id> all_component_ids;
42+
43+
/**
44+
* ecsact_add_component fn pointers
45+
*
46+
* NOTE: This gets filled in by ecsact_rt_entt_codegen
47+
*/
48+
extern const std::unordered_map< //
49+
ecsact_component_id,
50+
decltype(&ecsact_add_component)>
51+
add_component_fns;
52+
53+
/**
54+
* ecsact_get_component fn pointers
55+
*
56+
* NOTE: This gets filled in by ecsact_rt_entt_codegen
57+
*/
58+
extern const std::unordered_map< //
59+
ecsact_component_id,
60+
decltype(&ecsact_get_component)>
61+
get_component_fns;
62+
63+
/**
64+
* ecsact_update_component fn pointers
65+
*
66+
* NOTE: This gets filled in by ecsact_rt_entt_codegen
67+
*/
68+
extern const std::unordered_map< //
69+
ecsact_component_id,
70+
decltype(&ecsact_update_component)>
71+
update_component_fns;
72+
73+
/**
74+
* ecsact_remove_component fn pointers
75+
*
76+
* NOTE: This gets filled in by ecsact_rt_entt_codegen
77+
*/
78+
extern const std::unordered_map< //
79+
ecsact_component_id,
80+
decltype(&ecsact_remove_component)>
81+
remove_component_fns;
82+
83+
/**
84+
* ecsact_has_component fn pointers
85+
*
86+
* NOTE: This gets filled in by ecsact_rt_entt_codegen
87+
*/
88+
extern const std::unordered_map< //
89+
ecsact_component_id,
90+
decltype(&ecsact_has_component)>
91+
has_component_fns;
92+
93+
/**
94+
* ecsact_system_execution_context_get fn pointers
95+
*
96+
* NOTE: This gets filled in by ecsact_rt_entt_codegen
97+
*/
98+
extern const std::unordered_map< //
99+
ecsact_system_like_id,
100+
std::unordered_map<
101+
ecsact::entt::assoc_index,
102+
std::unordered_map< //
103+
ecsact_component_like_id,
104+
decltype(&ecsact_system_execution_context_get)>>>
105+
exec_ctx_get_fns;
106+
107+
/**
108+
* ecsact_system_execution_context_add fn pointers
109+
*
110+
* NOTE: This adds filled in by ecsact_rt_entt_codegen
111+
*/
112+
extern const std::unordered_map< //
113+
ecsact_system_like_id,
114+
std::unordered_map<
115+
ecsact::entt::assoc_index,
116+
std::unordered_map< //
117+
ecsact_component_like_id,
118+
decltype(&ecsact_system_execution_context_add)>>>
119+
exec_ctx_add_fns;
120+
121+
/**
122+
* ecsact_system_execution_context_update fn pointers
123+
*
124+
* NOTE: This updates filled in by ecsact_rt_entt_codegen
125+
*/
126+
extern const std::unordered_map< //
127+
ecsact_system_like_id,
128+
std::unordered_map<
129+
ecsact::entt::assoc_index,
130+
std::unordered_map< //
131+
ecsact_component_like_id,
132+
decltype(&ecsact_system_execution_context_update)>>>
133+
exec_ctx_update_fns;
134+
135+
/**
136+
* ecsact_system_execution_context_remove fn pointers
137+
*
138+
* NOTE: This removes filled in by ecsact_rt_entt_codegen
139+
*/
140+
extern const std::unordered_map< //
141+
ecsact_system_like_id,
142+
std::unordered_map<
143+
ecsact::entt::assoc_index,
144+
std::unordered_map< //
145+
ecsact_component_like_id,
146+
decltype(&ecsact_system_execution_context_remove)>>>
147+
exec_ctx_remove_fns;
148+
149+
/**
150+
* ecsact_system_execution_context_has fn pointers
151+
*
152+
* NOTE: This hass filled in by ecsact_rt_entt_codegen
153+
*/
154+
extern const std::unordered_map< //
155+
ecsact_system_like_id,
156+
std::unordered_map<
157+
ecsact::entt::assoc_index,
158+
std::unordered_map< //
159+
ecsact_component_like_id,
160+
decltype(&ecsact_system_execution_context_has)>>>
161+
exec_ctx_has_fns;
162+
163+
/**
164+
* ecsact_system_execution_context_action fn pointers
165+
*
166+
* NOTE: This hass filled in by ecsact_rt_entt_codegen
167+
*/
168+
extern const std::unordered_map<
169+
ecsact_action_id,
170+
decltype(&ecsact_system_execution_context_action)>
171+
exec_ctx_action_fns;
172+
173+
} // namespace ecsact::entt::detail::globals

ecsact/entt/detail/internal_markers.hh

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,22 @@ concept association_concept = //
2222
};
2323

2424
template<typename C>
25-
struct temp_storage;
25+
struct beforeremove_storage;
2626

2727
template<typename C>
2828
requires(std::is_empty_v<C>)
29-
struct temp_storage<C> {};
29+
struct beforeremove_storage<C> {};
3030

3131
template<typename C>
3232
requires(!std::is_empty_v<C>)
33-
struct temp_storage<C> {
33+
struct beforeremove_storage<C> {
3434
C value;
3535
};
3636

3737
template<typename C>
3838
requires(!std::is_empty_v<C>)
3939
struct beforechange_storage {
40-
C value;
41-
bool set = false;
40+
C value;
4241
};
4342

4443
template<typename C>

0 commit comments

Comments
 (0)