Set multiple components at once

This commit is contained in:
NukeBird 2025-02-15 01:47:12 +03:00
parent 672d27a6a3
commit 6861e87c61
2 changed files with 62 additions and 24 deletions

View file

@ -172,8 +172,7 @@ TEST_CASE("Attach multiple components to an entity and verify all are correctly
world w; world w;
auto e = w.make_entity(); auto e = w.make_entity();
e.set(ChoosenOne{}); e.set(ChoosenOne{}, Name{"zecsy"});
e.set(Name{"zecsy"});
REQUIRE(e.has<ChoosenOne, Name>()); REQUIRE(e.has<ChoosenOne, Name>());
REQUIRE(w.has<ChoosenOne, Name>(e)); REQUIRE(w.has<ChoosenOne, Name>(e));

View file

@ -23,10 +23,6 @@ namespace zecsy
entity(class world* w, entity_id id); entity(class world* w, entity_id id);
entity() = default; entity() = default;
entity(const entity &) = default;
entity(entity &&) = default;
entity &operator=(const entity &) = default;
entity &operator=(entity &&) = default;
operator entity_id() const; operator entity_id() const;
bool is_alive() const; bool is_alive() const;
@ -37,8 +33,11 @@ namespace zecsy
template<typename T> template<typename T>
T& get(); T& get();
template<typename T> template<typename... T>
void set(const T& comp = T{}); void set();
template<typename... T>
void set(const T&... comps);
template<typename T> template<typename T>
void remove(); void remove();
@ -63,7 +62,19 @@ namespace zecsy
T& get(entity_id e); T& get(entity_id e);
template<typename T> template<typename T>
void set(entity_id e, const T& comp = T{}); void set(entity_id e);
template<typename T>
void set(entity_id e, const T& comp);
template<typename First, typename Second, typename... Rest>
requires(sizeof...(Rest) >= 0)
void set(entity_id e);
template<typename First, typename Second, typename... Rest>
requires(sizeof...(Rest) >= 0)
void set(entity_id e, const First& comp0, const Second& comp1,
const Rest&... rest_comps);
template<typename T> template<typename T>
void remove(entity_id e); void remove(entity_id e);
@ -90,12 +101,6 @@ namespace zecsy
class world final class world final
{ {
public: public:
world() = default;
world(const world &) = default;
world(world &&) = default;
world &operator=(const world &) = default;
world &operator=(world &&) = default;
entity make_entity(); entity make_entity();
void destroy_entity(entity_id e); void destroy_entity(entity_id e);
bool is_alive(entity_id e) const; bool is_alive(entity_id e) const;
@ -106,8 +111,11 @@ namespace zecsy
template<typename T> template<typename T>
T& get(entity_id e); T& get(entity_id e);
template<typename T> template<typename... T>
void set(entity_id e, const T& comp = T{}); void set(entity_id e);
template<typename... T>
void set(entity_id e, const T&... comps);
template<typename T> template<typename T>
void remove(entity_id e); void remove(entity_id e);
@ -201,6 +209,12 @@ namespace zecsy
return w->get<T>(id); return w->get<T>(id);
} }
template<typename... T>
inline void entity::set()
{
(set(T{}), ...);
}
template<typename T> template<typename T>
inline void component_storage::set(entity_id e, const T& comp) inline void component_storage::set(entity_id e, const T& comp)
{ {
@ -232,16 +246,22 @@ namespace zecsy
entity_dict[typeid(T)][e] = index; entity_dict[typeid(T)][e] = index;
} }
template<typename T> template<typename... T>
inline void world::set(entity_id e, const T& comp) inline void world::set(entity_id e)
{ {
storage.set(e, comp); storage.set<T...>(e);
} }
template<typename T> template<typename... T>
inline void entity::set(const T& comp) inline void world::set(entity_id e, const T&... comps)
{ {
w->set(id, comp); storage.set(e, comps...);
}
template<typename... T>
inline void entity::set(const T&... comps)
{
w->set(id, comps...);
} }
template<typename T> template<typename T>
@ -281,4 +301,23 @@ namespace zecsy
{ {
return has<First>(e) && has<Second>(e) && (has<Rest>(e) && ...); return has<First>(e) && has<Second>(e) && (has<Rest>(e) && ...);
} }
template<typename First, typename Second, typename... Rest>
requires(sizeof...(Rest) >= 0)
inline void component_storage::set(entity_id e)
{
set(e, First{});
set(e, Second{});
(set(e, Rest{}), ...);
}
template<typename First, typename Second, typename... Rest>
requires(sizeof...(Rest) >= 0)
inline void component_storage::set(entity_id e, const First& comp0, const Second& comp1,
const Rest&... rest_comps)
{
set(e, comp0);
set(e, comp1);
(set(e, rest_comps), ...);
}
}; };