summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2022-10-08 01:34:44 +0200
committerStanislaw Halik <sthalik@misaki.pl>2022-10-08 01:34:44 +0200
commit41f4f4b6f9ba5fa20bb41967dc8ef8020081e38e (patch)
treef06241318bf19d07329b4130fc7e92d4b75dc234 /src
parentf845dbb21799d7b2879ba1ea9761fd3e68303ae8 (diff)
a
Diffstat (limited to 'src')
-rw-r--r--src/floor-mesh.cpp4
-rw-r--r--src/tile-atlas.cpp2
-rw-r--r--src/tile-iterator.cpp30
-rw-r--r--src/tile-iterator.hpp50
-rw-r--r--src/wall-mesh.cpp2
5 files changed, 42 insertions, 46 deletions
diff --git a/src/floor-mesh.cpp b/src/floor-mesh.cpp
index fdace9d8..3698bc6e 100644
--- a/src/floor-mesh.cpp
+++ b/src/floor-mesh.cpp
@@ -33,14 +33,14 @@ void floor_mesh::set_tile(quad_data& data, tile& x)
void floor_mesh::draw(tile_shader& shader, chunk& c)
{
std::array<quad_data, TILE_COUNT> data;
- for (auto [x, idx, pt] : c) {
+ for (auto& [x, idx, pt] : c) {
set_tile(data[idx], x);
}
_vertex_buffer.setSubData(0, data);
Magnum::GL::MeshView mesh{_mesh};
mesh.setCount(quad_index_count);
const tile_atlas* last_tile_atlas = nullptr;
- for (auto [x, i, pt] : c) {
+ for (auto& [x, i, pt] : c) {
if (!x.ground_image)
continue;
mesh.setIndexRange((int)(i*quad_index_count), 0, quad_index_count*TILE_COUNT - 1);
diff --git a/src/tile-atlas.cpp b/src/tile-atlas.cpp
index d086c31b..08bc2296 100644
--- a/src/tile-atlas.cpp
+++ b/src/tile-atlas.cpp
@@ -26,7 +26,7 @@ std::array<Vector2, 4> tile_atlas::texcoords_for_id(std::size_t id_) const
{
const auto sz = size_/dims_;
ASSERT(id_ < sz.product());
- const Vector2ui id = { (unsigned)id_ % dims_[0], (unsigned)id_ / dims_[0] };
+ const Vector2ui id = { (UnsignedInt)id_ % dims_[0], (UnsignedInt)id_ / dims_[0] };
const Vector2 p0(id * sz), p1(sz);
const auto x0 = p0.x(), x1 = p1.x(), y0 = p0.y(), y1 = p1.y();
return {{
diff --git a/src/tile-iterator.cpp b/src/tile-iterator.cpp
index d2dbf98d..3e7586dd 100644
--- a/src/tile-iterator.cpp
+++ b/src/tile-iterator.cpp
@@ -3,36 +3,6 @@
namespace Magnum::Examples {
-template <typename T>
-void basic_tile_iterator<T>::swap(basic_tile_iterator<T>& other)
-{
- using std::swap;
- swap(ptr, other.ptr);
- swap(pos, other.pos);
-}
-
-template <typename T>
-template <std::size_t N>
-typename std::tuple_element<N, basic_tile_iterator<T>>::type basic_tile_iterator<T>::get()
-{
- if constexpr(N == 0)
- return pos == TILE_COUNT ? ptr[0] : ptr[pos];
- else if constexpr(N == 1)
- return pos;
- else if constexpr(N == 2)
- return local_coords{pos};
- else
- return std::void_t<std::integral_constant<int, N>>();
-}
-
-template typename std::tuple_element<0, basic_tile_iterator<tile>>::type basic_tile_iterator<tile>::get<0>();
-template typename std::tuple_element<1, basic_tile_iterator<tile>>::type basic_tile_iterator<tile>::get<1>();
-template typename std::tuple_element<2, basic_tile_iterator<tile>>::type basic_tile_iterator<tile>::get<2>();
-
-template typename std::tuple_element<0, basic_tile_iterator<const tile>>::type basic_tile_iterator<const tile>::get<0>();
-template typename std::tuple_element<1, basic_tile_iterator<const tile>>::type basic_tile_iterator<const tile>::get<1>();
-template typename std::tuple_element<2, basic_tile_iterator<const tile>>::type basic_tile_iterator<const tile>::get<2>();
-
template class basic_tile_iterator<tile>;
template class basic_tile_iterator<const tile>;
diff --git a/src/tile-iterator.hpp b/src/tile-iterator.hpp
index 1439eb4f..0fa5049d 100644
--- a/src/tile-iterator.hpp
+++ b/src/tile-iterator.hpp
@@ -18,10 +18,12 @@ template<typename T>
void swap(Magnum::Examples::basic_tile_iterator<T>& lhs,
Magnum::Examples::basic_tile_iterator<T>& rhs) noexcept;
-template<typename T> struct tuple_size<Magnum::Examples::basic_tile_iterator<T>> : std::integral_constant<std::size_t, 3> {};
template<typename T> struct tuple_element<0, Magnum::Examples::basic_tile_iterator<T>> { using type = T&; };
+template<typename T> struct tuple_element<0, const Magnum::Examples::basic_tile_iterator<T>> { using type = const T&; };
+
template<typename T> struct tuple_element<1, Magnum::Examples::basic_tile_iterator<T>> { using type = std::size_t; };
template<typename T> struct tuple_element<2, Magnum::Examples::basic_tile_iterator<T>> { using type = Magnum::Examples::local_coords; };
+template<typename T> struct tuple_size<Magnum::Examples::basic_tile_iterator<T>> : std::integral_constant<std::size_t, 3> {};
} // namespace std
@@ -41,24 +43,48 @@ public:
basic_tile_iterator<T>& operator=(const basic_tile_iterator<T>&) = default;
basic_tile_iterator<T>& operator++() { pos++; return *this; }
basic_tile_iterator<T> operator++(int) { auto tmp = *this; operator++(); return tmp; }
- basic_tile_iterator<T>* operator->() { return this; }
- basic_tile_iterator<T>& operator*() { return *this; }
+ basic_tile_iterator<T>* operator->() & { return this; }
+ basic_tile_iterator<T>& operator*() & { return *this; }
+ basic_tile_iterator<T> const* operator->() const& { return this; }
+ basic_tile_iterator<T> const& operator*() const& { return *this; }
auto operator<=>(const basic_tile_iterator<T>&) const noexcept = default;
void swap(basic_tile_iterator<T>& other);
- template<std::size_t N> typename std::tuple_element<N, basic_tile_iterator<T>>::type get();
+ template<std::size_t N> typename std::tuple_element<N, basic_tile_iterator<T>>::type get() &;
+ template<std::size_t N> typename std::tuple_element<N, basic_tile_iterator<T>>::type get() const&;
};
+template <typename T>
+void basic_tile_iterator<T>::swap(basic_tile_iterator<T>& other)
+{
+ using std::swap;
+ swap(ptr, other.ptr);
+ swap(pos, other.pos);
+}
+
+template <typename T>
+template <std::size_t N>
+typename std::tuple_element<N, basic_tile_iterator<T>>::type basic_tile_iterator<T>::get() &
+{
+ if constexpr(N == 0)
+ return pos == TILE_COUNT ? ptr[0] : ptr[pos];
+ else if constexpr(N == 1)
+ return pos;
+ else if constexpr(N == 2)
+ return local_coords{pos};
+ else
+ return std::void_t<std::integral_constant<int, N>>();
+}
+
+template <typename T>
+template <std::size_t N>
+typename std::tuple_element<N, basic_tile_iterator<T>>::type basic_tile_iterator<T>::get() const&
+{
+ return const_cast<basic_tile_iterator<T>&>(*this).get<N>();
+}
+
extern template class basic_tile_iterator<tile>;
extern template class basic_tile_iterator<const tile>;
-extern template typename std::tuple_element<0, basic_tile_iterator<tile>>::type basic_tile_iterator<tile>::get<0>();
-extern template typename std::tuple_element<1, basic_tile_iterator<tile>>::type basic_tile_iterator<tile>::get<1>();
-extern template typename std::tuple_element<2, basic_tile_iterator<tile>>::type basic_tile_iterator<tile>::get<2>();
-
-extern template typename std::tuple_element<0, basic_tile_iterator<const tile>>::type basic_tile_iterator<const tile>::get<0>();
-extern template typename std::tuple_element<1, basic_tile_iterator<const tile>>::type basic_tile_iterator<const tile>::get<1>();
-extern template typename std::tuple_element<2, basic_tile_iterator<const tile>>::type basic_tile_iterator<const tile>::get<2>();
-
} // namespace Magnum::Examples
namespace std {
diff --git a/src/wall-mesh.cpp b/src/wall-mesh.cpp
index dce86dc1..d698b508 100644
--- a/src/wall-mesh.cpp
+++ b/src/wall-mesh.cpp
@@ -42,7 +42,7 @@ void wall_mesh::draw(tile_shader& shader, chunk& c)
texture_array textures = {};
{
vertex_array data;
- for (auto [x, idx, pt] : c) {
+ for (auto& [x, idx, pt] : c) {
maybe_add_tile(data, textures, x, idx);
}
_vertex_buffer.setSubData(0, data);