19 using Value = std::variant<bool, int, unsigned int, float, glm::vec3, glm::ivec3>;
23 template <
typename T,
typename Variant>
24 struct is_variant_member;
26 template <
typename T,
typename... Types>
27 struct is_variant_member<T, std::variant<Types...>>
28 : std::disjunction<std::is_same<T, Types>...> {};
31 static constexpr bool is_value_type_v = is_variant_member<T, Value>::value;
34 static BlockState makeRotation(glm::vec3 facing);
37 const glm::vec3& facing()
const {
return m_facing; }
43 requires is_value_type_v<T>
44 void set(
const std::string& name,
const T& value) {
45 m_properties[name] = value;
49 requires is_value_type_v<T>
50 std::optional<T> get(
const std::string& name)
const {
51 auto it = m_properties.find(name);
52 if (it == m_properties.end()) {
55 return std::get<T>(it->second);
58 void serialize(std::ostream& out)
const override;
59 void deserialize(std::istream& in)
override;
66 std::unordered_map<std::string, Value> m_properties;