mirror of
https://github.com/BlackMATov/ecs.hpp.git
synced 2025-12-16 14:11:14 +07:00
add filter and require options to for_each
This commit is contained in:
@@ -42,6 +42,21 @@ namespace ecs_hpp
|
|||||||
class system;
|
class system;
|
||||||
class registry;
|
class registry;
|
||||||
|
|
||||||
|
template < typename... Ts >
|
||||||
|
class filter_any;
|
||||||
|
template < typename... Ts >
|
||||||
|
class filter_all;
|
||||||
|
|
||||||
|
template < typename... Ts >
|
||||||
|
class require_any;
|
||||||
|
template < typename... Ts >
|
||||||
|
class require_all;
|
||||||
|
|
||||||
|
template < typename... Ts >
|
||||||
|
using filter = filter_any<Ts...>;
|
||||||
|
template < typename... Ts >
|
||||||
|
using require = require_all<Ts...>;
|
||||||
|
|
||||||
class entity_filler;
|
class entity_filler;
|
||||||
class registry_filler;
|
class registry_filler;
|
||||||
|
|
||||||
@@ -656,11 +671,11 @@ namespace ecs_hpp
|
|||||||
template < typename... Args >
|
template < typename... Args >
|
||||||
T& assign(entity_id id, Args&&... args) {
|
T& assign(entity_id id, Args&&... args) {
|
||||||
if ( T* value = components_.find(id) ) {
|
if ( T* value = components_.find(id) ) {
|
||||||
*value = T(std::forward<Args>(args)...);
|
*value = T{std::forward<Args>(args)...};
|
||||||
return *value;
|
return *value;
|
||||||
}
|
}
|
||||||
assert(!components_locker_.is_locked());
|
assert(!components_locker_.is_locked());
|
||||||
return *components_.insert(id, T(std::forward<Args>(args)...)).first;
|
return *components_.insert(id, T{std::forward<Args>(args)...}).first;
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename... Args >
|
template < typename... Args >
|
||||||
@@ -669,7 +684,7 @@ namespace ecs_hpp
|
|||||||
return *value;
|
return *value;
|
||||||
}
|
}
|
||||||
assert(!components_locker_.is_locked());
|
assert(!components_locker_.is_locked());
|
||||||
return *components_.insert(id, T(std::forward<Args>(args)...)).first;
|
return *components_.insert(id, T{std::forward<Args>(args)...}).first;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool exists(entity_id id) const noexcept {
|
bool exists(entity_id id) const noexcept {
|
||||||
@@ -1330,20 +1345,20 @@ namespace ecs_hpp
|
|||||||
std::size_t entity_count() const noexcept;
|
std::size_t entity_count() const noexcept;
|
||||||
std::size_t entity_component_count(const const_uentity& ent) const noexcept;
|
std::size_t entity_component_count(const const_uentity& ent) const noexcept;
|
||||||
|
|
||||||
template < typename F >
|
template < typename F, typename... Opts >
|
||||||
void for_each_entity(F&& f);
|
void for_each_entity(F&& f, Opts&&... opts);
|
||||||
template < typename F >
|
template < typename F, typename... Opts >
|
||||||
void for_each_entity(F&& f) const;
|
void for_each_entity(F&& f, Opts&&... opts) const;
|
||||||
|
|
||||||
template < typename T, typename F >
|
template < typename T, typename F, typename... Opts >
|
||||||
void for_each_component(F&& f);
|
void for_each_component(F&& f, Opts&&... opts);
|
||||||
template < typename T, typename F >
|
template < typename T, typename F, typename... Opts >
|
||||||
void for_each_component(F&& f) const;
|
void for_each_component(F&& f, Opts&&... opts) const;
|
||||||
|
|
||||||
template < typename... Ts, typename F >
|
template < typename... Ts, typename F, typename... Opts >
|
||||||
void for_joined_components(F&& f);
|
void for_joined_components(F&& f, Opts&&... opts);
|
||||||
template < typename... Ts, typename F >
|
template < typename... Ts, typename F, typename... Opts >
|
||||||
void for_joined_components(F&& f) const;
|
void for_joined_components(F&& f, Opts&&... opts) const;
|
||||||
|
|
||||||
template < typename T, typename... Args >
|
template < typename T, typename... Args >
|
||||||
void add_system(priority_t priority, Args&&... args);
|
void add_system(priority_t priority, Args&&... args);
|
||||||
@@ -1374,20 +1389,24 @@ namespace ecs_hpp
|
|||||||
template < typename T
|
template < typename T
|
||||||
, typename... Ts
|
, typename... Ts
|
||||||
, typename F
|
, typename F
|
||||||
|
, typename... Opts
|
||||||
, std::size_t I
|
, std::size_t I
|
||||||
, std::size_t... Is >
|
, std::size_t... Is >
|
||||||
void for_joined_components_impl_(
|
void for_joined_components_impl_(
|
||||||
std::index_sequence<I, Is...>,
|
std::index_sequence<I, Is...>,
|
||||||
F&& f);
|
F&& f,
|
||||||
|
Opts&&... opts);
|
||||||
|
|
||||||
template < typename T
|
template < typename T
|
||||||
, typename... Ts
|
, typename... Ts
|
||||||
, typename F
|
, typename F
|
||||||
|
, typename... Opts
|
||||||
, std::size_t I
|
, std::size_t I
|
||||||
, std::size_t... Is >
|
, std::size_t... Is >
|
||||||
void for_joined_components_impl_(
|
void for_joined_components_impl_(
|
||||||
std::index_sequence<I, Is...>,
|
std::index_sequence<I, Is...>,
|
||||||
F&& f) const;
|
F&& f,
|
||||||
|
Opts&&... opts) const;
|
||||||
|
|
||||||
template < typename T
|
template < typename T
|
||||||
, typename... Ts
|
, typename... Ts
|
||||||
@@ -1438,6 +1457,56 @@ namespace ecs_hpp
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// filter
|
||||||
|
//
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace ecs_hpp
|
||||||
|
{
|
||||||
|
template < typename... Ts >
|
||||||
|
class filter_any final {
|
||||||
|
public:
|
||||||
|
bool operator()(const const_entity& e) const noexcept {
|
||||||
|
return !(... || e.exists_component<Ts>());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template < typename... Ts >
|
||||||
|
class filter_all final {
|
||||||
|
public:
|
||||||
|
bool operator()(const const_entity& e) const noexcept {
|
||||||
|
return !(... && e.exists_component<Ts>());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// require
|
||||||
|
//
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace ecs_hpp
|
||||||
|
{
|
||||||
|
template < typename... Ts >
|
||||||
|
class require_any final {
|
||||||
|
public:
|
||||||
|
bool operator()(const const_entity& e) const noexcept {
|
||||||
|
return (... || e.exists_component<Ts>());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template < typename... Ts >
|
||||||
|
class require_all final {
|
||||||
|
public:
|
||||||
|
bool operator()(const const_entity& e) const noexcept {
|
||||||
|
return (... && e.exists_component<Ts>());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// fillers
|
// fillers
|
||||||
@@ -1925,7 +1994,7 @@ namespace ecs_hpp
|
|||||||
template < typename T, typename... Args >
|
template < typename T, typename... Args >
|
||||||
void typed_applier_with_args<T, Args...>::apply_to_component(T& component) const {
|
void typed_applier_with_args<T, Args...>::apply_to_component(T& component) const {
|
||||||
std::apply([&component](const Args&... args){
|
std::apply([&component](const Args&... args){
|
||||||
component = T(args...);
|
component = T{args...};
|
||||||
}, args_);
|
}, args_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2355,52 +2424,62 @@ namespace ecs_hpp
|
|||||||
return component_count;
|
return component_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename F >
|
template < typename F, typename... Opts >
|
||||||
void registry::for_each_entity(F&& f) {
|
void registry::for_each_entity(F&& f, Opts&&... opts) {
|
||||||
detail::incremental_lock_guard lock(entity_ids_locker_);
|
detail::incremental_lock_guard lock(entity_ids_locker_);
|
||||||
for ( const auto id : entity_ids_ ) {
|
for ( const auto e : entity_ids_ ) {
|
||||||
f({*this, id});
|
if ( uentity ent{*this, e}; (... && opts(ent)) ) {
|
||||||
|
f(ent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename F >
|
template < typename F, typename... Opts >
|
||||||
void registry::for_each_entity(F&& f) const {
|
void registry::for_each_entity(F&& f, Opts&&... opts) const {
|
||||||
detail::incremental_lock_guard lock(entity_ids_locker_);
|
detail::incremental_lock_guard lock(entity_ids_locker_);
|
||||||
for ( const auto id : entity_ids_ ) {
|
for ( const auto e : entity_ids_ ) {
|
||||||
f({*this, id});
|
if ( const_uentity ent{*this, e}; (... && opts(ent)) ) {
|
||||||
|
f(ent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T, typename F >
|
template < typename T, typename F, typename... Opts >
|
||||||
void registry::for_each_component(F&& f) {
|
void registry::for_each_component(F&& f, Opts&&... opts) {
|
||||||
if ( detail::component_storage<T>* storage = find_storage_<T>() ) {
|
if ( detail::component_storage<T>* storage = find_storage_<T>() ) {
|
||||||
storage->for_each_component([this, &f](const entity_id e, T& t){
|
storage->for_each_component([this, &f, &opts...](const entity_id e, T& t){
|
||||||
f(uentity{*this, e}, t);
|
if ( uentity ent{*this, e}; (... && opts(ent)) ) {
|
||||||
|
f(ent, t);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T, typename F >
|
template < typename T, typename F, typename... Opts >
|
||||||
void registry::for_each_component(F&& f) const {
|
void registry::for_each_component(F&& f, Opts&&... opts) const {
|
||||||
if ( const detail::component_storage<T>* storage = find_storage_<T>() ) {
|
if ( const detail::component_storage<T>* storage = find_storage_<T>() ) {
|
||||||
storage->for_each_component([this, &f](const entity_id e, const T& t){
|
storage->for_each_component([this, &f, &opts...](const entity_id e, const T& t){
|
||||||
f(const_uentity{*this, e}, t);
|
if ( const_uentity ent{*this, e}; (... && opts(ent)) ) {
|
||||||
|
f(ent, t);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename... Ts, typename F >
|
template < typename... Ts, typename F, typename... Opts >
|
||||||
void registry::for_joined_components(F&& f) {
|
void registry::for_joined_components(F&& f, Opts&&... opts) {
|
||||||
for_joined_components_impl_<Ts...>(
|
for_joined_components_impl_<Ts...>(
|
||||||
std::make_index_sequence<sizeof...(Ts)>(),
|
std::make_index_sequence<sizeof...(Ts)>(),
|
||||||
std::forward<F>(f));
|
std::forward<F>(f),
|
||||||
|
std::forward<Opts>(opts)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename... Ts, typename F >
|
template < typename... Ts, typename F, typename... Opts >
|
||||||
void registry::for_joined_components(F&& f) const {
|
void registry::for_joined_components(F&& f, Opts&&... opts) const {
|
||||||
for_joined_components_impl_<Ts...>(
|
for_joined_components_impl_<Ts...>(
|
||||||
std::make_index_sequence<sizeof...(Ts)>(),
|
std::make_index_sequence<sizeof...(Ts)>(),
|
||||||
std::forward<F>(f));
|
std::forward<F>(f),
|
||||||
|
std::forward<Opts>(opts)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T, typename... Args >
|
template < typename T, typename... Args >
|
||||||
@@ -2498,11 +2577,13 @@ namespace ecs_hpp
|
|||||||
template < typename T
|
template < typename T
|
||||||
, typename... Ts
|
, typename... Ts
|
||||||
, typename F
|
, typename F
|
||||||
|
, typename... Opts
|
||||||
, std::size_t I
|
, std::size_t I
|
||||||
, std::size_t... Is >
|
, std::size_t... Is >
|
||||||
void registry::for_joined_components_impl_(
|
void registry::for_joined_components_impl_(
|
||||||
std::index_sequence<I, Is...>,
|
std::index_sequence<I, Is...>,
|
||||||
F&& f)
|
F&& f,
|
||||||
|
Opts&&... opts)
|
||||||
{
|
{
|
||||||
const auto ss = std::make_tuple(find_storage_<Ts>()...);
|
const auto ss = std::make_tuple(find_storage_<Ts>()...);
|
||||||
if ( detail::tuple_contains(ss, nullptr) ) {
|
if ( detail::tuple_contains(ss, nullptr) ) {
|
||||||
@@ -2510,17 +2591,19 @@ namespace ecs_hpp
|
|||||||
}
|
}
|
||||||
for_each_component<T>([this, &f, &ss](const uentity& e, T& t) {
|
for_each_component<T>([this, &f, &ss](const uentity& e, T& t) {
|
||||||
for_joined_components_impl_<Ts...>(e, f, ss, t);
|
for_joined_components_impl_<Ts...>(e, f, ss, t);
|
||||||
});
|
}, std::forward<Opts>(opts)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T
|
template < typename T
|
||||||
, typename... Ts
|
, typename... Ts
|
||||||
, typename F
|
, typename F
|
||||||
|
, typename... Opts
|
||||||
, std::size_t I
|
, std::size_t I
|
||||||
, std::size_t... Is >
|
, std::size_t... Is >
|
||||||
void registry::for_joined_components_impl_(
|
void registry::for_joined_components_impl_(
|
||||||
std::index_sequence<I, Is...>,
|
std::index_sequence<I, Is...>,
|
||||||
F&& f) const
|
F&& f,
|
||||||
|
Opts&&... opts) const
|
||||||
{
|
{
|
||||||
const auto ss = std::make_tuple(find_storage_<Ts>()...);
|
const auto ss = std::make_tuple(find_storage_<Ts>()...);
|
||||||
if ( detail::tuple_contains(ss, nullptr) ) {
|
if ( detail::tuple_contains(ss, nullptr) ) {
|
||||||
@@ -2528,7 +2611,7 @@ namespace ecs_hpp
|
|||||||
}
|
}
|
||||||
for_each_component<T>([this, &f, &ss](const const_uentity& e, const T& t) {
|
for_each_component<T>([this, &f, &ss](const const_uentity& e, const T& t) {
|
||||||
std::as_const(*this).for_joined_components_impl_<Ts...>(e, f, ss, t);
|
std::as_const(*this).for_joined_components_impl_<Ts...>(e, f, ss, t);
|
||||||
});
|
}, std::forward<Opts>(opts)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T
|
template < typename T
|
||||||
|
|||||||
@@ -27,9 +27,11 @@ namespace
|
|||||||
velocity_c(int nx, int ny) : x(nx), y(ny) {}
|
velocity_c(int nx, int ny) : x(nx), y(ny) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct movable_c {
|
struct movable_c{};
|
||||||
};
|
struct disabled_c{};
|
||||||
|
|
||||||
static_assert(std::is_empty_v<movable_c>, "!!!");
|
static_assert(std::is_empty_v<movable_c>, "!!!");
|
||||||
|
static_assert(std::is_empty_v<disabled_c>, "!!!");
|
||||||
|
|
||||||
bool operator==(const position_c& l, const position_c& r) noexcept {
|
bool operator==(const position_c& l, const position_c& r) noexcept {
|
||||||
return l.x == r.x
|
return l.x == r.x
|
||||||
@@ -1174,6 +1176,179 @@ TEST_CASE("registry") {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SECTION("options") {
|
||||||
|
{
|
||||||
|
ecs::registry w;
|
||||||
|
|
||||||
|
auto e = w.create_entity();
|
||||||
|
|
||||||
|
REQUIRE(ecs::filter<>{}(e));
|
||||||
|
REQUIRE(ecs::filter<position_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter<velocity_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE(ecs::filter_any<>{}(e));
|
||||||
|
REQUIRE(ecs::filter_any<position_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter_any<velocity_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter_any<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE_FALSE(ecs::filter_all<>{}(e));
|
||||||
|
REQUIRE(ecs::filter_all<position_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter_all<velocity_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter_all<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
e.assign_component<position_c>();
|
||||||
|
|
||||||
|
REQUIRE(ecs::filter<>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter<position_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE(ecs::filter_any<>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter_any<position_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter_any<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter_any<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE_FALSE(ecs::filter_all<>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter_all<position_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter_all<velocity_c>{}(e));
|
||||||
|
REQUIRE(ecs::filter_all<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
e.assign_component<velocity_c>();
|
||||||
|
|
||||||
|
REQUIRE(ecs::filter<>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter<position_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE(ecs::filter_any<>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter_any<position_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter_any<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter_any<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE_FALSE(ecs::filter_all<>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter_all<position_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter_all<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::filter_all<position_c, velocity_c>{}(e));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ecs::registry w;
|
||||||
|
|
||||||
|
auto e = w.create_entity();
|
||||||
|
|
||||||
|
REQUIRE(ecs::require<>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require<position_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE_FALSE(ecs::require_any<>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require_any<position_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require_any<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require_any<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE(ecs::require_all<>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require_all<position_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require_all<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require_all<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
e.assign_component<position_c>();
|
||||||
|
|
||||||
|
REQUIRE(ecs::require<>{}(e));
|
||||||
|
REQUIRE(ecs::require<position_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE_FALSE(ecs::require_any<>{}(e));
|
||||||
|
REQUIRE(ecs::require_any<position_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require_any<velocity_c>{}(e));
|
||||||
|
REQUIRE(ecs::require_any<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE(ecs::require_all<>{}(e));
|
||||||
|
REQUIRE(ecs::require_all<position_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require_all<velocity_c>{}(e));
|
||||||
|
REQUIRE_FALSE(ecs::require_all<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
e.assign_component<velocity_c>();
|
||||||
|
|
||||||
|
REQUIRE(ecs::require<>{}(e));
|
||||||
|
REQUIRE(ecs::require<position_c>{}(e));
|
||||||
|
REQUIRE(ecs::require<velocity_c>{}(e));
|
||||||
|
REQUIRE(ecs::require<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE_FALSE(ecs::require_any<>{}(e));
|
||||||
|
REQUIRE(ecs::require_any<position_c>{}(e));
|
||||||
|
REQUIRE(ecs::require_any<velocity_c>{}(e));
|
||||||
|
REQUIRE(ecs::require_any<position_c, velocity_c>{}(e));
|
||||||
|
|
||||||
|
REQUIRE(ecs::require_all<>{}(e));
|
||||||
|
REQUIRE(ecs::require_all<position_c>{}(e));
|
||||||
|
REQUIRE(ecs::require_all<velocity_c>{}(e));
|
||||||
|
REQUIRE(ecs::require_all<position_c, velocity_c>{}(e));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ecs::registry w;
|
||||||
|
|
||||||
|
auto e1 = w.create_entity();
|
||||||
|
e1.assign_component<movable_c>();
|
||||||
|
e1.assign_component<position_c>(0,0);
|
||||||
|
e1.assign_component<velocity_c>(1,2);
|
||||||
|
|
||||||
|
auto e2 = w.create_entity();
|
||||||
|
e2.assign_component<position_c>(0,0);
|
||||||
|
e2.assign_component<velocity_c>(1,2);
|
||||||
|
|
||||||
|
w.for_each_component<position_c>([
|
||||||
|
](ecs::entity, position_c& p){
|
||||||
|
p = position_c{5,5};
|
||||||
|
}, ecs::require<movable_c>{});
|
||||||
|
|
||||||
|
REQUIRE(e1.get_component<position_c>() == position_c(5,5));
|
||||||
|
REQUIRE(e2.get_component<position_c>() == position_c(0,0));
|
||||||
|
|
||||||
|
w.for_joined_components<position_c, velocity_c>([
|
||||||
|
](ecs::entity, position_c& p, const velocity_c& v){
|
||||||
|
p.x += v.x;
|
||||||
|
p.y += v.y;
|
||||||
|
}, ecs::filter<movable_c>{});
|
||||||
|
|
||||||
|
REQUIRE(e1.get_component<position_c>() == position_c(5,5));
|
||||||
|
REQUIRE(e2.get_component<position_c>() == position_c(1,2));
|
||||||
|
|
||||||
|
e1.assign_component<disabled_c>();
|
||||||
|
e2.assign_component<movable_c>();
|
||||||
|
|
||||||
|
w.for_joined_components<position_c, velocity_c>([
|
||||||
|
](ecs::entity, position_c& p, const velocity_c& v){
|
||||||
|
p.x += v.x;
|
||||||
|
p.y += v.y;
|
||||||
|
}, ecs::require<movable_c>{}, ecs::filter<disabled_c>{});
|
||||||
|
|
||||||
|
REQUIRE(e1.get_component<position_c>() == position_c(5,5));
|
||||||
|
REQUIRE(e2.get_component<position_c>() == position_c(2,4));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ecs::registry w;
|
||||||
|
|
||||||
|
auto e1 = w.create_entity();
|
||||||
|
e1.assign_component<position_c>(0,0);
|
||||||
|
e1.assign_component<velocity_c>(1,2);
|
||||||
|
|
||||||
|
auto e2 = w.create_entity();
|
||||||
|
e2.assign_component<disabled_c>();
|
||||||
|
e2.assign_component<position_c>(0,0);
|
||||||
|
e2.assign_component<velocity_c>(1,2);
|
||||||
|
|
||||||
|
w.for_each_entity([](ecs::entity e){
|
||||||
|
position_c& p = e.get_component<position_c>();
|
||||||
|
const velocity_c& v = e.get_component<velocity_c>();
|
||||||
|
p.x += v.x;
|
||||||
|
p.y += v.y;
|
||||||
|
}, ecs::filter<disabled_c>{}, ecs::require<position_c, velocity_c>{});
|
||||||
|
|
||||||
|
REQUIRE(e1.get_component<position_c>() == position_c(1,2));
|
||||||
|
REQUIRE(e2.get_component<position_c>() == position_c(0,0));
|
||||||
|
}
|
||||||
|
}
|
||||||
SECTION("systems") {
|
SECTION("systems") {
|
||||||
{
|
{
|
||||||
class movement_system : public ecs::system {
|
class movement_system : public ecs::system {
|
||||||
|
|||||||
Reference in New Issue
Block a user