Skip to content

feat: lazy systems #94

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Apr 8, 2024
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ user.bazelrc
compile_commands.json
external
.cache
/test/codegen_test
4 changes: 2 additions & 2 deletions MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ bazel_dep(name = "rules_cc", version = "0.0.9")
bazel_dep(name = "bazel_skylib", version = "1.5.0")
bazel_dep(name = "rules_ecsact", version = "0.5.0")
bazel_dep(name = "ecsact_runtime", version = "0.6.1")
bazel_dep(name = "ecsact_lang_cpp", version = "0.4.0")
bazel_dep(name = "ecsact_lang_cpp", version = "0.4.1")
bazel_dep(name = "boost.mp11", version = "1.83.0.bzl.1")
bazel_dep(name = "entt", version = "3.12.2")
bazel_dep(name = "ecsact_codegen", version = "0.2.0")
bazel_dep(name = "ecsact_cli", version = "0.3.4")
bazel_dep(name = "xxhash", version = "0.8.2")

bazel_dep(name = "toolchains_llvm", version = "1.0.0", dev_dependency = True)
bazel_dep(name = "hedron_compile_commands", dev_dependency = True)

git_override(
module_name = "hedron_compile_commands",
commit = "204aa593e002cbd177d30f11f54cff3559110bb9",
Expand Down
44 changes: 37 additions & 7 deletions MODULE.bazel.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

104 changes: 104 additions & 0 deletions ecsact/entt/detail/bytes.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
#pragma once

#include <concepts>
#include <array>
#include <bit>
#include <type_traits>
#include <cstddef>

namespace ecsact::entt::detail {

template<typename T>
requires(std::integral<T> || std::floating_point<T>)
constexpr auto bytes_sizeof() -> int {
using value_type = std::remove_cvref_t<T>;

if constexpr(std::is_same_v<value_type, bool>) {
return 1;
} else {
return sizeof(value_type);
}
}

template<typename T>
struct unsigned_bit_size_equivalent;

template<typename T>
requires(bytes_sizeof<T>() == 1)
struct unsigned_bit_size_equivalent<T> : std::type_identity<uint8_t> {};

template<typename T>
requires(bytes_sizeof<T>() == 2)
struct unsigned_bit_size_equivalent<T> : std::type_identity<uint16_t> {};

template<typename T>
requires(bytes_sizeof<T>() == 4)
struct unsigned_bit_size_equivalent<T> : std::type_identity<uint32_t> {};

template<typename T>
requires(bytes_sizeof<T>() == 8)
struct unsigned_bit_size_equivalent<T> : std::type_identity<uint64_t> {};

template<typename T>
using unsigned_bit_size_equivalent_t = unsigned_bit_size_equivalent<T>::type;

template<typename T>
requires(std::integral<T> || std::floating_point<T>)
auto bytes_copy_into( //
T v,
auto& out_bytes,
auto& out_bytes_offset = 0
) -> void {
using value_type = std::remove_cvref_t<T>;
constexpr auto value_size = bytes_sizeof<T>();

auto v_bits = std::bit_cast<unsigned_bit_size_equivalent_t<T>>(v);

if constexpr(std::is_same_v<value_type, bool>) {
out_bytes[out_bytes_offset++] = static_cast<std::byte>(v_bits ? 1 : 0);
} else if constexpr(value_size == 1) {
out_bytes[out_bytes_offset++] = static_cast<std::byte>(v_bits);
} else if constexpr(value_size == 2) {
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 8) & 0xFF);
out_bytes[out_bytes_offset++] = static_cast<std::byte>(v_bits & 0xFF);
} else if constexpr(value_size == 4) {
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 24) & 0xFF);
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 16) & 0xFF);
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 8) & 0xFF);
out_bytes[out_bytes_offset++] = static_cast<std::byte>(v_bits & 0xFF);
} else if constexpr(value_size == 8) {
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 56) & 0xFF);
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 48) & 0xFF);
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 40) & 0xFF);
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 32) & 0xFF);
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 24) & 0xFF);
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 16) & 0xFF);
out_bytes[out_bytes_offset++] =
static_cast<std::byte>((v_bits >> 8) & 0xFF);
out_bytes[out_bytes_offset++] = static_cast<std::byte>(v_bits & 0xFF);
}

static_assert(value_size <= 8);
}

template<typename... T>
auto bytes_copy( //
T... values
) -> std::array<std::byte, (0 + ... + bytes_sizeof<T>())> {
auto result = std::array<std::byte, (0 + ... + bytes_sizeof<T>())>{};
auto offset = 0;
(bytes_copy_into(values, result, offset), ...);
return result;
}

} // namespace ecsact::entt::detail
18 changes: 18 additions & 0 deletions ecsact/entt/detail/hash.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once

#include <cstdint>
#include <cstddef>

namespace ecsact::entt::detail {
/**
* Opaque hash algorithm used by the Ecsact EnTT Runtime
*
* @param data bytes to hash
* @param data_length length of @p data
* @returns hash value
*/
auto bytes_hash( //
std::byte* data,
int data_length
) -> std::uint64_t;
} // namespace ecsact::entt::detail
6 changes: 6 additions & 0 deletions ecsact/entt/detail/internal_markers.hh
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,10 @@ struct created_entity {

struct destroyed_entity {};

template<typename S>
struct system_sorted;

template<typename S>
struct pending_lazy_execution {};

} // namespace ecsact::entt::detail
1 change: 1 addition & 0 deletions rt_entt_codegen/core/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ _CORE_CODEGEN_METHODS = {
],
"check_error_template_specializations": [],
"execution_options": [],
"sorting_components": [],
}

[cc_library(
Expand Down
5 changes: 5 additions & 0 deletions rt_entt_codegen/core/core.hh
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,9 @@ auto print_cleanup_ecsact_component_events( //
const ecsact_entt_details& details
) -> void;

auto print_entity_sorting_components( //
codegen_plugin_context& ctx,
const ecsact_entt_details& details
) -> void;

} // namespace ecsact::rt_entt_codegen::core
12 changes: 0 additions & 12 deletions rt_entt_codegen/core/create_registry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,6 @@ auto ecsact::rt_entt_codegen::core::print_create_registry( //
.return_type("ecsact_registry_id");

ctx.write("auto&& [registry_id, reg] = ecsact::entt::create_registry();\n\n");

if(!details.group_systems.empty()) {
ctx.write(
"// These groups were automatically selected based on the input ecsact "
"files\n"
);
for(auto sys_id : details.group_systems) {
auto decl_name = ecsact::meta::decl_full_name(sys_id);
}
}

ctx.write("ecsact_init_registry_storage(registry_id);\n");

ctx.write("\nreturn registry_id;");
}
Loading