Refactor WorldPos, WindowsPos done

This commit is contained in:
Jan Mrna
2025-10-04 16:54:29 +02:00
committed by Mrna
parent 47977d9979
commit 8a49c12909
13 changed files with 89 additions and 61 deletions

View File

@@ -17,23 +17,24 @@ Map::Map(int rows, int cols) : m_Cols(cols), m_Rows(rows) {
}
WorldPos Map::TileToWorld(TilePos p) const {
return WorldPos{(p.x + 0.5) * TILE_SIZE, (p.y + 0.5) * TILE_SIZE};
return WorldPos{(p.x() + 0.5f) * TILE_SIZE, (p.y() + 0.5f) * TILE_SIZE};
}
WorldPos Map::TileEdgeToWorld(TilePos p) const {
return WorldPos{p.x * TILE_SIZE, p.y * TILE_SIZE};
return WorldPos{p.x() * TILE_SIZE, p.y() * TILE_SIZE};
}
TilePos Map::WorldToTile(WorldPos p) const {
return TilePos{p.x / TILE_SIZE, p.y / TILE_SIZE};
return TilePos{static_cast<int32_t>(p.x() / TILE_SIZE), static_cast<int32_t>(p.y() / TILE_SIZE)};
}
// TODO this should probably use something like WorldSize or WorldVec to make the distinction clear
WorldPos Map::GetTileSize() const { return WorldPos{TILE_SIZE, TILE_SIZE}; }
const Tile *Map::GetTileAt(TilePos p) const {
assert(IsTilePosValid(p));
size_t row = p.x;
size_t col = p.y;
size_t row = p.x();
size_t col = p.y();
return m_Tiles[row][col];
}
@@ -43,10 +44,10 @@ const Tile *Map::GetTileAt(WorldPos p) const {
}
bool Map::IsTilePosValid(TilePos p) const {
if (p.x < 0 || p.y < 0)
if (p.x() < 0 || p.y() < 0)
return false;
size_t row = static_cast<size_t>(p.x);
size_t col = static_cast<size_t>(p.y);
size_t row = static_cast<size_t>(p.x());
size_t col = static_cast<size_t>(p.y());
return row < m_Tiles.size() && col < m_Tiles[0].size();
}
@@ -75,14 +76,14 @@ std::vector<TilePos> Map::GetNeighbors(TilePos center) const
void Map::PaintCircle(TilePos center, unsigned radius, TileType tile_type)
{
// get rectangle that wraps the circle
TilePos corner1 = TilePos{center.x - radius, center.y - radius};
TilePos corner2 = TilePos{center.x + radius, center.y + radius};
TilePos corner1 = TilePos{center.x() - static_cast<int32_t>(radius), center.y() - static_cast<int32_t>(radius)};
TilePos corner2 = TilePos{center.x() + static_cast<int32_t>(radius), center.y() + static_cast<int32_t>(radius)};
// iterate through all valid points, setting the type
const unsigned radius_squared = radius * radius;
for (int x = corner1.x; x < corner2.x; x++) {
for (int y = corner1.y; y < corner2.y; y++) {
for (int x = corner1.x(); x < corner2.x(); x++) {
for (int y = corner1.y(); y < corner2.y(); y++) {
TilePos current_tile = {x, y};
unsigned distance_squared = center.distance_squared(current_tile);
unsigned distance_squared = static_cast<unsigned>(center.DistanceTo(current_tile) * center.DistanceTo(current_tile));
if (IsTilePosValid(current_tile) && distance_squared < radius_squared)
{
// y is row, x is col
@@ -94,19 +95,20 @@ void Map::PaintCircle(TilePos center, unsigned radius, TileType tile_type)
void Map::PaintLine(TilePos start_tile, TilePos stop_tile, double width, TileType tile_type)
{
const Vec2D<double> start(start_tile);
const Vec2D<double> stop(stop_tile);
const double line_length = start.distance(stop);
const Vec2D<double> step((stop-start)/line_length);
const Vec2D<double> ortho = step.orthogonal();
const vec<double, 2> start{static_cast<double>(start_tile.x()), static_cast<double>(start_tile.y())};
const vec<double, 2> stop{static_cast<double>(stop_tile.x()), static_cast<double>(stop_tile.y())};
const double line_length = start.DistanceTo(stop);
const vec<double, 2> step = (stop - start) / line_length;
const vec<double, 2> ortho = step.GetOrthogonal();
LOG_DEBUG("step = ", step, " ortho = ", ortho);
for (double t = 0; t < line_length; t += 1.0) {
for (double ortho_t = 0; ortho_t < width; ortho_t += 0.1) {
auto tile_pos = start + step * t + ortho * ortho_t;
if (IsTilePosValid(tile_pos)) {
size_t row = static_cast<size_t>(tile_pos.x);
size_t col = static_cast<size_t>(tile_pos.y);
TilePos tile_pos_int{static_cast<int32_t>(tile_pos.x()), static_cast<int32_t>(tile_pos.y())};
if (IsTilePosValid(tile_pos_int)) {
size_t row = static_cast<size_t>(tile_pos.x());
size_t col = static_cast<size_t>(tile_pos.y());
m_Tiles[row][col] = &tile_types.at(tile_type);
}
}
@@ -116,15 +118,15 @@ void Map::PaintLine(TilePos start_tile, TilePos stop_tile, double width, TileTyp
void Map::PaintRectangle(TilePos first_corner, TilePos second_corner, TileType tile_type)
{
std::initializer_list<int> xvals = {first_corner.x, second_corner.x};
std::initializer_list<int> yvals = {first_corner.y, second_corner.y};
std::initializer_list<int> xvals = {first_corner.x(), second_corner.x()};
std::initializer_list<int> yvals = {first_corner.y(), second_corner.y()};
for (int x = std::min(xvals); x < std::max(xvals); x++) {
for (int y = std::min(yvals); y < std::max(yvals); y++) {
TilePos tile_pos{x,y};
LOG_DEBUG("tile_pos = ", tile_pos);
if (IsTilePosValid(tile_pos)) {
size_t row = static_cast<size_t>(tile_pos.x);
size_t col = static_cast<size_t>(tile_pos.y);
size_t row = static_cast<size_t>(tile_pos.x());
size_t col = static_cast<size_t>(tile_pos.y());
m_Tiles[row][col] = &tile_types.at(tile_type);
}
}