# Воксельный ландшафт (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/)) решает всё это.