9#include <unordered_set>
19 float tileWidth,
float tileHeight,
int numLayers,
22 SYSTEM_LOG <<
"CollisionMap::Initialize(" << width <<
"x" << height <<
", "
23 <<
numLayers <<
" layers, projection=" <<
static_cast<int>(projection) <<
")\n";
24 SYSTEM_LOG <<
" -> Received tile dimensions: " << tileWidth <<
"x" << tileHeight <<
" px\n";
47 for (
int layer = 0; layer <
numLayers; ++layer)
50 for (
int y = 0; y < height; ++y)
54 for (
int x = 0; x < width; ++x)
65 for (
int layer = 0; layer <
numLayers; ++layer)
67 for (
int y = 0; y < height; ++y)
69 for (
int x = 0; x < width; ++x)
81 m_layers[layer][y][x].worldX = worldX;
82 m_layers[layer][y][x].worldY = worldY;
84 #ifdef DEBUG_COLLISION_MAP_INIT
86 if (layer == 0 && y == 0 && x < 3)
88 SYSTEM_LOG <<
" [DEBUG] Tile (" << x <<
"," << y <<
") -> world ("
89 << worldX <<
", " << worldY <<
")";
101 SYSTEM_LOG <<
" -> Pre-calculated world coordinates for " << (width * height *
numLayers) <<
" tiles\n";
126 int layerIdx =
static_cast<int>(layer);
136 int layerIdx =
static_cast<int>(layer);
161 int layerIdx =
static_cast<int>(layer);
176 int layerIdx =
static_cast<int>(layer);
206 float q = (worldX * std::sqrt(3.0f) / 3.0f - worldY / 3.0f) /
m_tileWidth;
214 int rx =
static_cast<int>(std::round(x));
215 int ry =
static_cast<int>(std::round(y));
216 int rz =
static_cast<int>(std::round(z));
261 float q =
static_cast<float>(
gridX);
262 float r =
static_cast<float>(
gridY);
282 int layerIdx =
static_cast<int>(layer);
288 static const std::vector<std::vector<TileProperties>>
emptyLayer;
290 int layerIdx =
static_cast<int>(layer);
351 float tileWidth,
float tileHeight,
int numLayers)
353 SYSTEM_LOG <<
"NavigationMap::Initialize(" << width <<
"x" << height <<
", "
366 SYSTEM_LOG <<
" -> NavigationMap ready (delegates to CollisionMap)\n";
402 if (
collMap.IsValidGridPosition(x, y, layer))
413 if (
collMap.IsValidGridPosition(x, y, layer))
418 return std::numeric_limits<float>::max();
442 return static_cast<float>(std::abs(
x2 -
x1) + std::abs(
y2 -
y1));
446 return static_cast<float>(std::max(std::abs(
x2 -
x1), std::abs(
y2 -
y1)));
453 return static_cast<float>((std::abs(
dx) + std::abs(
dx +
dy) + std::abs(
dy)) / 2);
517 float worldX, worldY;
534 std::unordered_map<int, PathNode*>
allNodes;
537 auto encodePos = [
this](
int x,
int y) ->
int {
579 std::vector<std::pair<int, int>>
neighbors;
646 float worldX, worldY;
678 float angle = (
static_cast<float>(
rand()) /
static_cast<float>(
RAND_MAX)) * 2.0f * 3.14159265f;
ComponentTypeID GetComponentTypeID_Static()
void LoadSector(int sectorX, int sectorY)
std::vector< std::vector< std::vector< TileProperties > > > m_layers
static const TileProperties s_emptyTile
void GridToWorld(int gridX, int gridY, float &outWorldX, float &outWorldY) const
void SetActiveLayer(CollisionLayer layer)
const TileProperties & GetTileProperties(int x, int y) const
void RegisterSector(int sectorX, int sectorY, int width, int height)
CollisionLayer m_activeLayer
void SetCollision(int x, int y, bool hasCollision)
void UpdateTileState(int x, int y, TileUpdateFunc updateFunc)
const std::vector< std::vector< TileProperties > > & GetLayer(CollisionLayer layer) const
bool IsValidGridPosition(int x, int y) const
std::vector< Sector > m_sectors
void SetTileProperties(int x, int y, const TileProperties &props)
std::function< void(TileProperties &)> TileUpdateFunc
bool HasCollision(int x, int y) const
void Initialize(int width, int height, GridProjectionType projection, float tileWidth, float tileHeight, int numLayers=1, float tileOffsetX=0.0f, float tileOffsetY=0.0f)
GridProjectionType m_projection
void UnloadSector(int sectorX, int sectorY)
static CollisionMap & Get()
void WorldToGrid(float worldX, float worldY, int &outGridX, int &outGridY) const
bool FindPath(int startX, int startY, int goalX, int goalY, std::vector< Vector > &outPath, CollisionLayer layer=CollisionLayer::Ground, int maxIterations=10000)
void WorldToGrid(float worldX, float worldY, int &outGridX, int &outGridY) const
void SetNavigable(int x, int y, bool isNavigable, float cost=1.0f)
bool GetRandomNavigablePoint(float centerX, float centerY, float radius, int maxAttempts, float &outX, float &outY, CollisionLayer layer=CollisionLayer::Ground) const
float Heuristic(int x1, int y1, int x2, int y2) const
float GetTraversalCost(int x, int y) const
bool IsValidGridPosition(int x, int y) const
CollisionLayer m_activeLayer
void Initialize(int width, int height, GridProjectionType projection, float tileWidth, float tileHeight, int numLayers=1)
bool IsNavigable(int x, int y) const
void SetActiveLayer(CollisionLayer layer)
void GetNeighbors(int x, int y, std::vector< std::pair< int, int > > &outNeighbors) const
void GridToWorld(int gridX, int gridY, float &outWorldX, float &outWorldY) const
GridProjectionType m_projection