- WASM plugin host (wasmtime 46, 17 host fns) + example noisemap plugin - Rhai scripting engine (12 API fns, `terrafier run` cmd) - i18n: en/ru translations, auto-detect, t! macro - GUI: pan (click-drag) + zoom (scroll wheel) with viewport transform - cargo-dist 0.31: MSI/pkg/shell installers, both binaries - CI: .github/workflows/ci.yml + release.yml - Security: wasmtime 30→46, bincode 1.3→2.0, quick-xml CVE docs - Code review: SAFETY comments, unwrap→match cleanup - Fixes: clippy approx_constant, needless_borrows, rustfmt
127 lines
5.8 KiB
Markdown
Executable file
127 lines
5.8 KiB
Markdown
Executable file
# Terrafier
|
||
|
||
> Rust-native Minecraft world painter — быстрее, легче, современнее.
|
||
|
||
Нативная замена [WorldPainter](https://www.worldpainter.net) на Rust.
|
||
Рендеринг карт через GPU, параллельный экспорт, CLI-first архитектура.
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
┌────────────────────────────────────────────────────┐
|
||
│ terrafier-cli terrafier-gui Библиотека │
|
||
│ (clap + json) (egui + eframe) (crates.io) │
|
||
├───────────────────┬────────────────────────────────┤
|
||
│ terrafier-core │ модель мира, I/O, операции │
|
||
│ ┌──────┬──────┬──┴─────┬────────┐ │
|
||
│ │World │Tile │Export │Import │ │
|
||
│ │Model │Ops │Pipeline│Anvil │ │
|
||
│ └──────┴──────┴────────┴────────┘ │
|
||
├──────────────────────┬─────────────────────────────┤
|
||
│ wasm-host / rhai │ Плагины и скриптинг │
|
||
├──────────────────────┴─────────────────────────────┤
|
||
│ Foundation crates │
|
||
│ nbt │ fastanvil │ noise │ palette-compress │
|
||
│ biome-db │
|
||
└────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## Текущий статус (v0.1.0)
|
||
|
||
### Реализовано
|
||
- **Модель мира**: World, Dimension, Tile (128×128), Terrain (7 типов), Layer trait, Platform
|
||
- **Система координат**: явные конвертации BlockCoords → ChunkCoords → RegionCoords → TileCoords
|
||
- **NBT**: full read/write, все типы тегов, gzip support
|
||
- **Anvil**: чтение/запись .mca регионов, разбор чанков, секций, палитры
|
||
- **Экспорт**: Terrafier → Java Edition 1.18+ save (секции, block_states, биомы)
|
||
- **Импорт**: Java Edition save → Terrafier world (level.dat, регионы, surface)
|
||
- **CLI**: new, import, export, info, render (с прогресс-барами, dry-run)
|
||
- **GUI**: редактор на egui (viewport, инструменты, undo/redo)
|
||
- **Операции**: Raise, Lower, Smooth, Flatten, Paint — с MultiTile поддержкой
|
||
- **Heightmap**: noise-based генерация (OpenSimplex), flat, combined
|
||
|
||
### В работе / не реализовано
|
||
- **WASM плагины** — wasmtime-хост, ABI, загрузка .wasm файлов
|
||
- **Скриптинг** — Rhai-движок для world-генераторов
|
||
- **i18n** — локализация CLI/GUI
|
||
- **GUI polish** — pan/zoom GPU viewport, brush overlay, layer panel
|
||
|
||
## Стек
|
||
|
||
| Компонент | Технология |
|
||
|-----------|-----------|
|
||
| Язык | Rust (edition 2024) |
|
||
| GUI | egui + eframe |
|
||
| GPU | (план) wgpu |
|
||
| NBT | Самописный `nbt` crate |
|
||
| Anvil | Самописный `fastanvil` crate |
|
||
| Шум | `noise-rs` |
|
||
| Параллелизм | rayon |
|
||
| CLI | clap + indicatif |
|
||
| Изображения | `image` crate |
|
||
| Сериализация | serde + bincode |
|
||
|
||
### Почему egui, а не Tauri
|
||
|
||
egui выбран за:
|
||
- Immediate mode — нет оверхэда как у React, подходит для тулов
|
||
- Нативная интеграция с Rust (без bridge)
|
||
- wgpu-рендеринг напрямую (когда будет реализован)
|
||
- Бинарник 2–3 MB vs Tauri 5–10 MB + WebView
|
||
|
||
## Roadmap
|
||
|
||
### Phase 0 (done) — Foundation
|
||
NBT парсер, Anvil reader, workspace setup
|
||
|
||
### Phase 1 (done) — Core Model
|
||
Tile, Dimension, World, Terrain, Brush, Operation
|
||
|
||
### Phase 2 (done) — Minecraft I/O + CLI
|
||
Импорт/экспорт Java Edition, CLI команды, импорт .world
|
||
|
||
### Phase 3 (done) — Operations & Layers
|
||
Инструменты (raise, erode, smooth, flatten, fill, paint)
|
||
Слои (caves, river, frost, trees, biome, resources)
|
||
Экспортёры слоёв, фильтры, MultiTile
|
||
|
||
### Phase 4 (done) — GUI (MVP)
|
||
GPU-рендеринг через wgpu (базовый), панель инструментов
|
||
Диалоги (New World, Export), undo/redo
|
||
|
||
### Phase 5 — WASM Plugins + Scripting
|
||
WASM-хост на wasmtime, ABI для плагинов
|
||
Rhai-скриптинг для world-генераторов
|
||
Загрузка плагинов из .wasm файлов, registry
|
||
|
||
### Phase 6 — i18n + Инфраструктура
|
||
Локализация CLI/GUI (rust-i18n / Fluent)
|
||
CI/CD, cargo-dist, AppImage/msi/app
|
||
Бенчмарки, оптимизация, polish
|
||
|
||
### Будущее
|
||
Bedrock Edition, GUI pan/zoom/brush-overlay, GUI layer panel
|
||
|
||
## Модель данных
|
||
|
||
```rust
|
||
struct Tile { // 128×128 блоков
|
||
heightmap: [i16; 16384], // карта высот
|
||
terrain: [u8; 16384], // тип террейна
|
||
water_level: [u8; 16384], // уровень воды
|
||
layer_data: HashMap<u32, LayerBuffer>,
|
||
}
|
||
|
||
struct Dimension {
|
||
tiles: HashMap<(i32, i32), Tile>,
|
||
min_height, max_height: i16,
|
||
seed: u64,
|
||
}
|
||
|
||
struct World {
|
||
name: String,
|
||
dimensions: Vec<Dimension>,
|
||
platform: Platform,
|
||
seed: u64,
|
||
}
|
||
```
|