# Воксельный ландшафт (legacy)

Папка содержит **legacy воксельный движок ландшафта** — тот, что сейчас работает в продакшене студии. Постепенно заменяется на новый chunks-based из [../voxel/](../voxel/).

## Файлы

| Файл | Что делает |
|---|---|
| `VoxelGrid.js` | Хранение вокселей в `Uint8Array`. Ключ позиции = `(x * SIZE + y) * SIZE + z`. Размер мира 256×128×256 = 8 МБ. |
| `GreedyMesher.js` | Greedy meshing — объединяет соседние одинаковые воксели в большие прямоугольники. Без него 50 тыс вокселей = 50 тыс кубов и 5 FPS. |
| `TerrainMesh.js` | Babylon-меш из выхода `GreedyMesher`. Один меш на материал (grass/stone/sand/snow). При изменении воксели — пересоздаём затронутые fragment'ы, не весь меш. |

## Связь со сценой

`TerrainManager` (в папке выше) — фасад. Он хранит `VoxelGrid`, при изменении вызывает `GreedyMesher.mesh()` → создаёт `TerrainMesh`-объекты и кидает на сцену.

```
User красит кисть
  ↓
TerrainManager.paintVoxel(pos, material)
  ↓ обновляет VoxelGrid
  ↓ помечает chunk dirty (16×16×16 кусок)
  ↓
В next render tick:
  GreedyMesher.mesh(dirtyChunk) → возвращает массив прямоугольников
  TerrainMesh.rebuild(chunk) → пересоздаёт Babylon Mesh для этого chunk
```

## Размер chunk: 16×16×16

Меньше → много draw calls. Больше → пересборка большой области при мелком изменении.

## Plant-кисти (трава, цветы)

Это **не вокселы**, а GLB-модели поверх terrain. См. `DecoManager.js` в папке выше — он использует VoxelGrid для нахождения surface-точек ландшафта, потом кладёт мелкие модели через `paintDeco()`.

## Архитектурный документ

Полный план движка — [reference_kubikon_terrain_voxel_architecture.md](../../../../disaster-recovery/) (приватный).

## Почему legacy

- Один глобальный `Uint8Array` 8 МБ — невозможно стримить из сети для multiplayer.
- Нет LOD — далёкие чанки рендерятся в полном разрешении.
- Greedy meshing на main thread — лагает 500мс на большую кисть.

Новый движок ([../voxel/](../voxel/)) решает всё это.
