载入中...
搜索中...
未找到
HexMap.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
7#include "common/Result.h"
8#include "hexmap/HexCell.h"
10#include "hexmap/HexMetrics.h"
11#include "hexmap/HexNoise.h"
12
13#include <cstdint>
14#include <vector>
15
16namespace eve::hexmap {
17
19enum class HexSurface : std::int32_t {
20 Terrain = 0,
21 Water = 1,
22 River = 2,
23 Road = 3,
30 Fog = 4,
32 Wall = 5,
34 Feature = 6,
35};
36
38inline constexpr std::int32_t kHexSurfaceCount = 7;
39
47inline constexpr std::int32_t kMaxHexGridDimension = 512;
48
54
73public:
75 HexMap() = default;
76
89 [[nodiscard]] Result<void> reset(std::int32_t cellCountX, std::int32_t cellCountZ, std::uint32_t seed);
90
92 [[nodiscard]] bool empty() const noexcept { return cells_.empty(); }
94 [[nodiscard]] std::int32_t cellCountX() const noexcept { return cellCountX_; }
96 [[nodiscard]] std::int32_t cellCountZ() const noexcept { return cellCountZ_; }
98 [[nodiscard]] std::int32_t chunkCountX() const noexcept { return chunkCountX_; }
100 [[nodiscard]] std::int32_t chunkCountZ() const noexcept { return chunkCountZ_; }
102 [[nodiscard]] std::int32_t chunkCount() const noexcept { return chunkCountX_ * chunkCountZ_; }
104 [[nodiscard]] std::int32_t cellCount() const noexcept { return static_cast<std::int32_t>(cells_.size()); }
106 [[nodiscard]] std::uint32_t seed() const noexcept { return noise_.seed(); }
108 [[nodiscard]] std::uint64_t revision() const noexcept { return revision_; }
110 [[nodiscard]] const HexNoise& noise() const noexcept { return noise_; }
111
112 // --- topology -----------------------------------------------------------
113
122 [[nodiscard]] bool contains(HexCoordinates coordinates) const noexcept {
123 const std::int32_t column = coordinates.offsetX();
124 return column >= 0 && column < cellCountX_ && coordinates.z >= 0 && coordinates.z < cellCountZ_;
125 }
127 [[nodiscard]] std::int32_t indexOf(HexCoordinates coordinates) const noexcept;
129 [[nodiscard]] HexCoordinates coordinatesAt(std::int32_t index) const noexcept;
136 [[nodiscard]] const HexCellData* cell(HexCoordinates coordinates) const noexcept;
143 [[nodiscard]] const HexCellData* cellAt(std::int32_t index) const noexcept;
144
146 [[nodiscard]] bool getNeighbor(HexCoordinates coordinates, HexDirection direction,
147 HexCoordinates& out) const noexcept;
149 [[nodiscard]] HexEdgeType edgeTypeTo(HexCoordinates a, HexCoordinates b) const noexcept;
150
151 // --- chunking -----------------------------------------------------------
152
154 [[nodiscard]] std::int32_t chunkIndexOf(HexCoordinates coordinates) const noexcept;
156 [[nodiscard]] std::int32_t chunkColumnOf(std::int32_t chunkIndex) const noexcept;
158 [[nodiscard]] std::int32_t chunkRowOf(std::int32_t chunkIndex) const noexcept;
171 [[nodiscard]] HexCoordinates chunkCell(std::int32_t chunkIndex, std::int32_t column,
172 std::int32_t row) const noexcept;
174 [[nodiscard]] HexVec3 chunkCenter(std::int32_t chunkIndex) const noexcept;
176 void markAllChunksDirty() noexcept;
178 void markChunkDirtyAndNeighbors(std::int32_t chunkIndex) noexcept;
179
187 [[nodiscard]] std::int32_t takeDirtyChunk() noexcept;
189 [[nodiscard]] std::int32_t dirtyChunkCount() const noexcept {
190 return static_cast<std::int32_t>(dirtyQueue_.size());
191 }
192
193 // --- geometry -----------------------------------------------------------
194
196 [[nodiscard]] HexVec3 cellPosition(HexCoordinates coordinates) const noexcept;
198 [[nodiscard]] HexVec3 cellGroundPosition(HexCoordinates coordinates) const noexcept {
199 return HexCoordinates::toWorldPosition(coordinates);
200 }
201
212 [[nodiscard]] Result<HexCoordinates> pickCell(HexVec3 rayOrigin, HexVec3 rayDirection) const noexcept;
213
214 // --- cell queries -------------------------------------------------------
215
216 [[nodiscard]] std::int32_t elevation(HexCoordinates c) const noexcept;
217 [[nodiscard]] std::int32_t waterLevel(HexCoordinates c) const noexcept;
218 [[nodiscard]] std::int32_t terrainType(HexCoordinates c) const noexcept;
219 [[nodiscard]] std::int32_t urbanLevel(HexCoordinates c) const noexcept;
220 [[nodiscard]] std::int32_t farmLevel(HexCoordinates c) const noexcept;
221 [[nodiscard]] std::int32_t plantLevel(HexCoordinates c) const noexcept;
222 [[nodiscard]] std::int32_t specialIndex(HexCoordinates c) const noexcept;
223 [[nodiscard]] bool isUnderwater(HexCoordinates c) const noexcept;
224 [[nodiscard]] bool hasRiver(HexCoordinates c) const noexcept;
225 [[nodiscard]] bool hasRoad(HexCoordinates c) const noexcept;
226 [[nodiscard]] bool hasRiverThrough(HexCoordinates c, HexDirection d) const noexcept;
227 [[nodiscard]] bool isWalled(HexCoordinates c) const noexcept;
229 [[nodiscard]] bool isExplored(HexCoordinates c) const noexcept;
231 [[nodiscard]] bool isExplorable(HexCoordinates c) const noexcept;
233 [[nodiscard]] HexValues values(HexCoordinates c) const noexcept;
235 [[nodiscard]] HexFlags flags(HexCoordinates c) const noexcept;
236
237 // --- cell authoring -----------------------------------------------------
238
240 [[nodiscard]] Result<void> setElevation(HexCoordinates c, std::int32_t elevation);
242 [[nodiscard]] Result<void> setWaterLevel(HexCoordinates c, std::int32_t waterLevel);
244 [[nodiscard]] Result<void> setTerrainType(HexCoordinates c, std::int32_t terrainType);
246 [[nodiscard]] Result<void> setUrbanLevel(HexCoordinates c, std::int32_t level);
248 [[nodiscard]] Result<void> setFarmLevel(HexCoordinates c, std::int32_t level);
250 [[nodiscard]] Result<void> setPlantLevel(HexCoordinates c, std::int32_t level);
252 [[nodiscard]] Result<void> setSpecialIndex(HexCoordinates c, std::int32_t index);
254 [[nodiscard]] Result<void> setWalled(HexCoordinates c, bool walled);
256 [[nodiscard]] Result<void> setExplored(HexCoordinates c, bool explored);
258 [[nodiscard]] Result<void> setExplorable(HexCoordinates c, bool explorable);
274 [[nodiscard]] Result<void> setCellState(HexCoordinates c, HexValues values, HexFlags flags);
276 [[nodiscard]] Result<void> setOutgoingRiver(HexCoordinates c, HexDirection direction);
278 [[nodiscard]] Result<void> removeRiver(HexCoordinates c);
280 [[nodiscard]] Result<void> addRoad(HexCoordinates c, HexDirection direction);
282 [[nodiscard]] Result<void> removeRoads(HexCoordinates c);
283
284 // --- brush authoring ----------------------------------------------------
285
294 [[nodiscard]] Result<void> editElevation(HexCoordinates center, std::int32_t radius, std::int32_t delta);
296 [[nodiscard]] Result<void> editWaterLevel(HexCoordinates center, std::int32_t radius, std::int32_t delta);
298 [[nodiscard]] Result<void> editTerrainType(HexCoordinates center, std::int32_t radius, std::int32_t terrainType);
300 [[nodiscard]] Result<void> editFeatureLevel(HexCoordinates center, std::int32_t radius, std::int32_t feature,
301 std::int32_t delta);
302
304 void collectBrush(HexCoordinates center, std::int32_t radius, std::vector<std::int32_t>& out) const;
305
306private:
307 void markChunkDirty(std::int32_t chunkIndex) noexcept;
308 void refreshCellDependents(HexCoordinates coordinates) noexcept;
314 HexCellData* mutableCell(HexCoordinates coordinates) noexcept;
315 void validateRivers(HexCoordinates coordinates) noexcept;
316
317 std::int32_t cellCountX_ = 0;
318 std::int32_t cellCountZ_ = 0;
319 std::int32_t chunkCountX_ = 0;
320 std::int32_t chunkCountZ_ = 0;
321 std::uint64_t revision_ = 0;
322 HexNoise noise_{};
323 std::vector<HexCellData> cells_;
324 std::vector<std::uint8_t> chunkDirty_;
325 std::vector<std::int32_t> dirtyQueue_;
326};
327
328} // namespace eve::hexmap
int column
std::map< std::string, Var > values
#define EVENGINE_API_WORLD
Definition Export.h:109
Packed per-cell state records of the hex map.
Axial hex coordinates and world-space conversion.
std::int32_t waterLevel
Pointy-top hex metrics, directions and vertex helpers.
Deterministic asset-free noise for hex perturbation and generation.
std::int32_t c
float elevation
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
int level
float radius
std::uint32_t seed
Definition PointSet.cpp:807
float d
Move-only, checked operation results for the common layer.
RoadLaneDirection direction
Cell cell
uint32_t index
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Packed boolean cell state (roads, rivers, walls, exploration).
Definition HexCell.h:123
An editable, chunked, pointy-top hex map.
Definition HexMap.h:72
HexMap()=default
Hex map.
std::int32_t chunkCount() const noexcept
Total number of chunks.
Definition HexMap.h:102
bool empty() const noexcept
Whether the map holds any cell.
Definition HexMap.h:92
std::uint64_t revision() const noexcept
Monotonic counter bumped by every mutation; used to detect stale meshes.
Definition HexMap.h:108
std::uint32_t seed() const noexcept
The seed this map was built with.
Definition HexMap.h:106
std::int32_t cellCountX() const noexcept
Number of columns.
Definition HexMap.h:94
std::int32_t chunkCountX() const noexcept
Number of chunk columns.
Definition HexMap.h:98
bool contains(HexCoordinates coordinates) const noexcept
Whether coordinates address a cell inside the grid.
Definition HexMap.h:122
const HexNoise & noise() const noexcept
Deterministic noise field shared by this map's mesh builders.
Definition HexMap.h:110
std::int32_t cellCount() const noexcept
Total number of cells.
Definition HexMap.h:104
std::int32_t cellCountZ() const noexcept
Number of rows.
Definition HexMap.h:96
std::int32_t chunkCountZ() const noexcept
Number of chunk rows.
Definition HexMap.h:100
HexVec3 cellGroundPosition(HexCoordinates coordinates) const noexcept
Cell centre at y = 0 (no elevation, no perturbation).
Definition HexMap.h:198
Deterministic four-channel value noise over the XZ plane.
Definition HexNoise.h:23
Packed numeric cell state.
Definition HexCell.h:38
constexpr std::int32_t kMaxHexGridDimension
Largest grid edge, in cells, any entry point may request.
Definition HexMap.h:47
HexSurface
Surface streams a chunk mesh is generated for.
Definition HexMap.h:19
@ Feature
Urban, farm, plant and special decorations; built by buildFeatureMesh.
@ Wall
City/farm walls, wall towers and bridges; built by buildWallMesh.
@ Fog
Fog-of-war overlay of a chunk.
HexEdgeType
Relationship between two neighbouring cells of different elevation.
Definition HexMetrics.h:93
constexpr std::int32_t kHexSurfaceCount
Number of chunk surface streams.
Definition HexMap.h:38
HexDirection
Hex facing directions, counter-clockwise from north-east.
Definition HexMetrics.h:59
One cell of the hex map: packed values plus packed flags.
Definition HexCell.h:244
Axial coordinates of one hex cell.
Stable identifier of one chunk surface stream.
Definition HexMap.h:50
std::int32_t chunkIndex
Definition HexMap.h:51
Minimal 3-component float vector used by the hex mesh builders.
Definition HexMetrics.h:18