Terrafier/PLAN.md
loki5512344 91835402b3 Initial commit: Terrafier v0.1.0
- Core world model (World, Dimension, Tile, Terrain, Platform)
- NBT reader/writer with full tag support
- Anvil region (.mca) format reader with chunk parsing
- Block palette compression and export
- Biome database with Minecraft 1.21 biomes
- CLI commands: new, import, export, info, render
- GUI application with egui (viewport, tools, undo/redo)
- Noise-based heightmap generation and editing operations

License: GPL-3.0-or-later
2026-06-15 19:14:11 +02:00

119 lines
5.3 KiB
Markdown
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 │ │
│ └──────┴──────┴────────┴────────┘ │
├────────────────────────────────────────────────────┤
│ 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
### В работе / не реализовано
- **GPU-рендеринг (wgpu)** — ключевая фича, пока весь рендер CPU
- **Слои**: Caves, Rivers, Frost, Trees, Resources, Biome
- **Импорт .world** (WorldPainter format)
- **Плагины** (WASM)
## Стек
| Компонент | Технология |
|-----------|-----------|
| Язык | 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 команды
### Phase 3 — Operations & Layers
Инструменты (raise, erode, smooth, flatten, fill, paint)
Слои (caves, river, frost, trees, biome, resources)
Экспортёры слоёв
### Phase 4 — GUI
GPU-рендеринг через wgpu (шейдеры, 30-60 FPS)
Панорамирование, зум, оверлей кисти
Панель слоёв, инструментов, диалоги
### Phase 5 — Полировка
Бенчмарки, оптимизация, i18n, пакеты (AppImage/msi/app)
### Будущее
Импорт .world, WASM плагины, Bedrock Edition, скриптинг
## Модель данных
```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,
}
```