Set multiple components at once
This commit is contained in:
parent
672d27a6a3
commit
6861e87c61
2 changed files with 62 additions and 24 deletions
|
@ -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));
|
||||||
|
|
83
zecsy.hpp
83
zecsy.hpp
|
@ -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,8 +62,20 @@ 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);
|
||||||
private:
|
private:
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -231,17 +245,23 @@ 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), ...);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue