载入中...
搜索中...
未找到
TileLayer.cpp
浏览该文件的文档.
1#include "map/TileLayer.h"
2#include "map/TileConfig.h"
4
5#include "graphics/Canvas.h"
6#include "graphics/Texture.h"
7
8#include <algorithm>
9
10namespace eve::map {
11
12TileLayer *TileLayer::createLayer(int mapW, int mapH, float tileW, float tileH) {
13 TileLayer *e = TileLayer::create();
14 e->config()->entity = e;
15 e->resize(mapW, mapH);
17 auto ts = e->tileset();
18 ts->tileW = int(tileW > 0.f ? tileW : 32.f);
19 ts->tileH = int(tileH > 0.f ? tileH : 32.f);
20 (void)e->draw();
21 (void)e->resource();
22 return e;
23}
24
25void TileLayer::setOrigin(float x, float y) {
26 config()->originX = x;
27 config()->originY = y;
28}
29
30float TileLayer::getX() { return config()->originX; }
31float TileLayer::getY() { return config()->originY; }
32
33int TileLayer::getMapWidth() { return config()->mapW; }
34int TileLayer::getMapHeight() { return config()->mapH; }
35float TileLayer::getTileWidth() { return config()->tileW; }
36float TileLayer::getTileHeight() { return config()->tileH; }
37
39 auto c = config();
40 c->tileW = tileW > 0.f ? tileW : 1.f;
41 c->tileH = tileH > 0.f ? tileH : 1.f;
42}
43
44void TileLayer::resize(int mapW, int mapH) {
45 auto c = config();
46 c->mapW = mapW > 0 ? mapW : 0;
47 c->mapH = mapH > 0 ? mapH : 0;
48 const size_t n = size_t(std::max(0, c->mapW) * std::max(0, c->mapH));
49 tiles()->gids.assign(n, 0u);
50}
51
52void TileLayer::setTile(int tx, int ty, int gid) {
53 auto c = config();
54 if (tx < 0 || ty < 0 || tx >= c->mapW || ty >= c->mapH) return;
55 tiles()->gids[size_t(ty * c->mapW + tx)] = uint32_t(gid < 0 ? 0 : gid);
56}
57
58int TileLayer::getTile(int tx, int ty) {
59 auto c = config();
60 if (tx < 0 || ty < 0 || tx >= c->mapW || ty >= c->mapH) return 0;
61 return int(tiles()->gids[size_t(ty * c->mapW + tx)]);
62}
63
64void TileLayer::fill(int gid) {
65 const uint32_t g = uint32_t(gid < 0 ? 0 : gid);
66 for (auto &v : tiles()->gids) v = g;
67}
68
69void TileLayer::clear() { fill(0); }
70
72 int spacing) {
73 auto ts = tileset();
74 ts->texture = texture;
75 ts->firstGid = firstGid > 0 ? firstGid : 1;
76 ts->columns = columns > 0 ? columns : 1;
77 ts->margin = margin > 0 ? margin : 0;
78 ts->spacing = spacing > 0 ? spacing : 0;
79 if (texture) {
80 // Default atlas tile size from Config when not set yet.
81 if (ts->tileW <= 0) ts->tileW = int(config()->tileW);
82 if (ts->tileH <= 0) ts->tileH = int(config()->tileH);
83 }
84}
85
87 auto ts = tileset();
88 ts->tileW = tileW > 0 ? tileW : 1;
89 ts->tileH = tileH > 0 ? tileH : 1;
90}
91
92graphics::Texture *TileLayer::getTilesetTexture() { return tileset()->texture; }
93int TileLayer::getTilesetFirstGid() { return tileset()->firstGid; }
94int TileLayer::getTilesetColumns() { return tileset()->columns; }
95
96void TileLayer::setCanvas(graphics::Canvas *canvas) { draw()->canvas = canvas; }
97void TileLayer::setCamera(graphics::Camera2D *camera) { draw()->camera = camera; }
98
99void TileLayer::setLayer(int layer) { draw()->layer = layer; }
100int TileLayer::getLayer() { return draw()->layer; }
101
102void TileLayer::setVisible(bool visible) { draw()->visible = visible; }
103bool TileLayer::isVisible() { return draw()->visible; }
104
105void TileLayer::setTint(float r, float g, float b, float a) {
106 draw()->tint = Color{r, g, b, a};
107}
108
109bool TileLayer::applyConfig(const std::string &json) { return applyConfigText(this, json, nullptr); }
110
111bool TileLayer::loadConfig(const std::string &path) { return loadConfigFile(this, path, nullptr); }
112
113bool TileLayer::reloadConfig() { return reloadConfigFile(this, nullptr); }
114
115void TileLayer::setAutoReload(bool enable) { resource()->autoReload = enable; }
116bool TileLayer::getAutoReload() { return resource()->autoReload; }
117std::string TileLayer::getConfigPath() { return resource()->path; }
118
119void TileLayer::tileToWorld(int tx, int ty, float &wx, float &wy) {
120 eve::map::tileToWorld(*config(), tx, ty, wx, wy);
121}
122
123float TileLayer::depthY(int tx, int ty) { return tileToDepthY(*config(), tx, ty); }
124
125void TileLayer::worldToTile(float wx, float wy, int &tx, int &ty) {
126 eve::map::worldToTile(*config(), wx, wy, tx, ty);
127}
128
129float TileLayer::tileToWorldX(int tx, int ty) {
130 float wx = 0.f, wy = 0.f;
131 tileToWorld(tx, ty, wx, wy);
132 return wx;
133}
134
135float TileLayer::tileToWorldY(int tx, int ty) {
136 float wx = 0.f, wy = 0.f;
137 tileToWorld(tx, ty, wx, wy);
138 return wy;
139}
140
141float TileLayer::depthYAt(int tx, int ty) { return depthY(tx, ty); }
142
143int TileLayer::worldToTileX(float wx, float wy) {
144 int tx = 0, ty = 0;
145 worldToTile(wx, wy, tx, ty);
146 return tx;
147}
148
149int TileLayer::worldToTileY(float wx, float wy) {
150 int tx = 0, ty = 0;
151 worldToTile(wx, wy, tx, ty);
152 return ty;
153}
154
155} // namespace eve::map
int y
Definition Grass.cpp:135
float u
Definition Grass.cpp:234
int x
Definition Grass.cpp:135
glm::vec3 n
Definition Grass.cpp:64
uint32_t a
uint32_t b
uint32_t c
TileLayer * layer
int v
int spacing
int firstGid
int columns
int tileW
int margin
int tileH
std::vector< WfcTile > tiles
Definition WfcSimple.cpp:22
Declarative 2D camera (viewport center + zoom).
GPU texture created via Graphics::newTexture. Owns GPU resources through an opaque backend handle.
Definition Texture.h:17
ECS tile layer entity. Script mutates tile GIDs / tileset / draw; TileRenderSystem batch-draws atlas ...
Definition TileLayer.h:30
std::string getConfigPath()
Path of the bound config file.
void clear()
Clears the layer to empty.
Definition TileLayer.cpp:69
float getTileWidth()
Tile size in pixels.
Definition TileLayer.cpp:35
graphics::Texture * getTilesetTexture()
Bound tileset accessors.
Definition TileLayer.cpp:92
void setOrigin(float x, float y)
World origin of the layer (pixels).
Definition TileLayer.cpp:25
bool loadConfig(const std::string &path)
Loads a config file and binds it for hot reload.
int worldToTileX(float wx, float wy)
void setTile(int tx, int ty, int gid)
Tile GID access; 0 = empty.
Definition TileLayer.cpp:52
void setAutoReload(bool enable)
Enables/disables automatic config hot reload.
void setTileset(graphics::Texture *texture, int firstGid, int columns, int margin=0, int spacing=0)
Binds the atlas texture and tile table.
Definition TileLayer.cpp:71
void resize(int mapW, int mapH)
Resizes the tile grid (existing GIDs preserved where possible).
Definition TileLayer.cpp:44
bool applyConfig(const std::string &json)
Applies a map JSON config (Config + Tiles + Tileset + Draw).
void setTilesetTileSize(int tileW, int tileH)
Tile size in pixels of the bound tileset.
Definition TileLayer.cpp:86
void setLayer(int layer)
Draw order layer / visibility / tint.
Definition TileLayer.cpp:99
int worldToTileY(float wx, float wy)
void setCamera(graphics::Camera2D *camera)
Definition TileLayer.cpp:97
int getTile(int tx, int ty)
Definition TileLayer.cpp:58
bool reloadConfig()
Re-reads the bound config file (hot reload).
static TileLayer * createLayer(int mapW, int mapH, float tileW=32.f, float tileH=32.f)
Definition TileLayer.cpp:12
float tileToWorldX(int tx, int ty)
Scalar conversion helpers.
float depthY(int tx, int ty)
Painter's-algorithm depth for 2.5D draw ordering.
void worldToTile(float wx, float wy, int &tx, int &ty)
float depthYAt(int tx, int ty)
void setTileSize(float tileW, float tileH)
Definition TileLayer.cpp:38
void tileToWorld(int tx, int ty, float &wx, float &wy)
Tile-index ↔ world-pixel conversions (per layer orientation).
void setCanvas(graphics::Canvas *canvas)
Draw target canvas / camera.
Definition TileLayer.cpp:96
void setVisible(bool visible)
float tileToWorldY(int tx, int ty)
void fill(int gid)
Fills the whole layer with one GID.
Definition TileLayer.cpp:64
int getMapWidth()
Map dimensions in tiles.
Definition TileLayer.cpp:33
void setTint(float r, float g, float b, float a=1.f)
放置世界:格子占用(多通道)+ 地形语义 + 已放置建筑实例。 行为由 PlacementSystem 提供;本类暴露便于脚本绑定的薄封装方法。 坐标换算统一走 eve::grid(支持 rectang...
void tileToWorld(const TileLayer::Config &cfg, int tx, int ty, float &wx, float &wy)
Converts a tile index to world pixels using the layer's projection.
bool reloadConfigFile(TileLayer *layer, std::string *error)
bool applyConfigText(TileLayer *layer, const std::string &json, std::string *error)
Parse JSON text and apply onto one layer.
void worldToTile(const TileLayer::Config &cfg, float wx, float wy, int &tx, int &ty)
Converts world pixels back to the containing tile index.
float tileToDepthY(const TileLayer::Config &cfg, int tx, int ty)
Painter's-algorithm depth for the tile under the layer's projection.
bool loadConfigFile(TileLayer *layer, const std::string &path, std::string *error)
Read path via Filesystem, apply onto layer, bind Resource.path + modtime for hot reload....