Add MrGameEng.Tilemaps: code-built tile grids rendered through the batcher
CI / build-test (push) Failing after 1m4s

TileSet maps ids to texture regions with tints (0 = empty), TileGrid is a
bounds-checked dense ushort grid, and the Tilemap component places a grid
in the world per render layer. UseTilemaps() inserts TilemapRenderSystem
before the flush; it submits only the camera-visible cell range
(TilemapMath.VisibleCells), so frame cost scales with the screen, not the
grid. Demonstrated in the sample as a checkerboard floor; Tiled loading
stays on the roadmap on top of this API.
This commit is contained in:
Leonid Pershin
2026-06-11 10:24:47 +03:00
parent b318d1e795
commit b3415120c3
15 changed files with 548 additions and 6 deletions
+22 -2
View File
@@ -34,6 +34,7 @@
| `MrGameEng.Assets` | Runtime-загрузка ресурсов без Content Pipeline, кэш, `AssetRef<T>` |
| `MrGameEng.Assets.Generator` | Roslyn incremental source generator: классы с типизированными хендлами ресурсов |
| `MrGameEng.Atlases` | Текстурные атласы: офлайн-сборка из дерева картинок (`AtlasBuilder`) и рантайм-загрузка (`TextureAtlas`); CLI — `tools/MrGameEng.AtlasTool` |
| `MrGameEng.Tilemaps` | Тайловые карты, создаваемые кодом: `TileGrid` + `TileSet` + компонент `Tilemap`, отрисовка видимых клеток через батчер |
| `MrGameEng.UI` | Игровой UI на [Myra](https://github.com/rds1983/Myra): `Desktop` на сцену, виджеты, скининг |
| `MrGameEng.DevConsole` | Ингейм-консоль разработчика: логи `Log`, команды, история, автодополнение |
@@ -51,9 +52,10 @@ MrGameEng.Assets ─┘ └──► Friflo.Engine.ECS
Модули зависят **только от `Core`** и никогда друг от друга. `Core` зависит только
от MonoGame и Friflo. Если двум модулям нужен общий тип — он переезжает в `Core`.
Документированное исключение: `MrGameEng.Atlases` зависит от `Graphics`
Документированные исключения: `MrGameEng.Atlases` зависит от `Graphics`
(выдаёт `Texture2DRegion`) и от `Assets` (регистрирует загрузчик в `AssetManager`) —
атлас по своей природе склейка этих двух областей.
атлас по своей природе склейка этих двух областей; `MrGameEng.Tilemaps` зависит от
`Graphics` (рисует регионы через рендерер и слои).
`MrGameEng.Assets.Generator` — особый случай: это анализатор (netstandard2.0),
он подключается к проекту игры как `Analyzer`, в рантайме не участвует и не зависит
@@ -163,6 +165,24 @@ CLI-обёртка: `dotnet run --project tools/MrGameEng.AtlasTool -- <исто
и отдаёт регионы: `atlas.GetRegion("Things/Pawn/Animal/Fox")` → `Texture2DRegion`,
готовый для `Sprite`.
## Тайловые карты
`MrGameEng.Tilemaps` — тайловые карты, создаваемые **кодом** (загрузка Tiled — в бэклоге):
- `TileSet` — словарь тайлов: `Add(region, tint?)` возвращает id; id 0 зарезервирован
под «пусто». Регион + тинт позволяют строить тайлсеты и из текстур атласа,
и из тонированной белой текстуры.
- `TileGrid` — плотная сетка `ushort`-id с проверкой границ; заполняется генератором
мира, мутируется в рантайме (изменение видно со следующего кадра).
- Компонент `Tilemap` (`struct : IComponent`): грид + тайлсет + `Origin`, `TileSize`,
слой, `Depth`, общий тинт карты. Обычная сущность — карт может быть несколько
(земля, декор поверх).
- `scene.UseTilemaps()` (после `UseRenderer2D()`) вставляет `TilemapRenderSystem`
в Draw-фазу перед flush. Система считает видимый диапазон клеток по cull-rect
камеры (`TilemapMath.VisibleCells`) и сабмитит только его: стоимость кадра зависит
от экрана, а не от размера грида. Тайлы батчатся со спрайтами по обычному порядку
слой → depth → текстура: пол из одной текстуры атласа — один draw call.
## Рендеринг
`SpriteBatch` в движке **не используется** — в `MrGameEng.Graphics` свой батчер,
+1 -1
View File
@@ -16,7 +16,7 @@
## Бэклог
- Physics2D (выбор библиотеки: Aether.Physics2D / своя)
- Tilemap (поддержка Tiled)
- Tilemaps: загрузка карт Tiled (.tmx) поверх существующего программного API
- Particles
- UI: загрузка MML-разметки Myra через AssetManager + хендлы в кодогенераторе
- UI: рендер Myra через наш батчер (`IMyraRenderer`), если UI станет узким местом по draw call'ам