summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-11-15 16:09:12 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-11-15 16:09:12 +0100
commit6b271f37e740210e5c85324f88706ad5cf4487ba (patch)
treeb04b3978926bd2915fbf71573c229907ab2b6ad0
parent2f9498dd93c1c5dde6ec19b73795631f1cb0cfa2 (diff)
src/chunk-walls: factor out common formulas
-rw-r--r--src/chunk-walls.cpp85
1 files changed, 50 insertions, 35 deletions
diff --git a/src/chunk-walls.cpp b/src/chunk-walls.cpp
index 59e0e915..3e62920e 100644
--- a/src/chunk-walls.cpp
+++ b/src/chunk-walls.cpp
@@ -45,13 +45,19 @@ using Wall::Frame;
template<typename T> using Vec2_ = VectorTypeFor<2, T>;
template<typename T> using Vec3_ = VectorTypeFor<3, T>;
+template<typename F, uint32_t N>
+struct minmax_v
+{
+ VectorTypeFor<N, F> min, max;
+};
+
template<Group_ G, bool IsWest, typename F = float>
-constexpr std::array<Vec3_<F>, 4> get_quad(F depth)
+constexpr std::array<Vec3_<F>, 4> get_quadʹ(minmax_v<F, 3> bounds, F d)
{
static_assert(G < Group_::COUNT);
- constexpr auto half_tile = Vec2_<F>(TILE_SIZE2*.5f);
- constexpr auto X = half_tile.x(), Y = half_tile.y(), Z = F(TILE_SIZE.z());
+ const auto x0 = bounds.min.x(), y0 = bounds.min.y(), z0 = bounds.min.z(),
+ x1 = bounds.max.x(), y1 = bounds.max.y(), z1 = bounds.max.z();
switch (G)
{
@@ -60,67 +66,76 @@ constexpr std::array<Vec3_<F>, 4> get_quad(F depth)
case wall:
if (!IsWest)
return {{
- { X, -Y, 0 },
- { X, -Y, Z },
- {-X, -Y, 0 },
- {-X, -Y, Z },
+ { x1, y0, z0 },
+ { x1, y0, z1 },
+ { x0, y0, z0 },
+ { x0, y0, z1 },
}};
else
return {{
- {-X, -Y, 0 },
- {-X, -Y, Z },
- {-X, Y, 0 },
- {-X, Y, Z },
+ { x0, y0, z0 },
+ { x0, y0, z1 },
+ { x0, y1, z0 },
+ { x0, y1, z1 },
}};
case side:
if (!IsWest)
return {{
- { X, -Y - depth, 0 },
- { X, -Y - depth, Z },
- { X, -Y, 0 },
- { X, -Y, Z },
+ { x1, y0 - d, z0 },
+ { x1, y0 - d, z1 },
+ { x1, y0, z0 },
+ { x1, y0, z1 },
}};
else
return {{
- { -X, Y, 0 },
- { -X, Y, Z },
- { -X - depth, Y, 0 },
- { -X - depth, Y, Z },
+ { x0, y1, z0 },
+ { x0, y1, z1 },
+ { x0 - d, y1, z0 },
+ { x0 - d, y1, z1 },
}};
case top:
if (!IsWest)
return {{
- { -X, -Y - depth, Z },
- { X, -Y - depth, Z },
- { -X, -Y, Z },
- { X, -Y, Z },
+ { x0, y0 - d, z1 },
+ { x1, y0 - d, z1 },
+ { x0, y0, z1 },
+ { x1, y0, z1 },
}};
else
return {{
- { -X, -Y, Z },
- { -X, Y, Z },
- { -X - depth, -Y, Z },
- { -X - depth, Y, Z },
+ { x0, y0, z1 },
+ { x0, y1, z1 },
+ { x0 - d, y0, z1 },
+ { x0 - d, y1, z1 },
}};
case corner:
if (!IsWest)
return {{
- {-X, -Y, 0 },
- {-X, -Y, Z },
- {-X - depth, -Y, 0 },
- {-X - depth, -Y, Z },
+ { x0, y0, z0 },
+ { x0, y0, z1 },
+ { x0 - d, y0, z0 },
+ { x0 - d, y0, z1 },
}};
else
return {{
- {-X, -Y - depth, 0 },
- {-X, -Y - depth, Z },
- {-X, -Y, 0 },
- {-X, -Y, Z },
+ { x0, y0 - d, z0 },
+ { x0, y0 - d, z1 },
+ { x0, y0, z0 },
+ { x0, y0, z1 },
}};
}
std::unreachable();
}
+template<Group_ G, bool IsWest, typename F = float>
+constexpr std::array<Vec3_<F>, 4> get_quad(F d)
+{
+ constexpr auto half_tile = Vec2_<F>(TILE_SIZE2*.5f);
+ constexpr auto X = half_tile.x(), Y = half_tile.y(), Z = F(TILE_SIZE.z());
+
+ return get_quadʹ<G, IsWest, F>({ { -X, -Y, 0, }, { X, Y, Z, }, }, d);
+}
+
template<bool IsWest>
CutResult<Int>::rect get_wall_rect(local_coords tile)
{