Большой консолидирующий коммит после поднятия studio.rublox.pro (28 мая 2026). Содержит изменения которые делались в процессе подготовки прод-окружения: Фиксы импортов после выноса из minecraftia: - Массовая замена путей ../../components → ../components (40+ файлов в src/community/, src/admin-preview/) - Замена ../KubikonEditor/ → ../editor/, ../KubikonStudio/ → ../community/, ../AdminPreview/ → ../admin-preview/ - API.js скопирован из минки целиком (было 8 экспортов, стало 312) - Добавлены PLAYER_URL, MyButton_1, недостающие компоненты - Заменены require() на статические ES-imports в BabylonScene, PrimitiveManager, GameRuntime (Vite не поддерживает CJS require) Структура ассетов: - public/kubikon-templates/ → public/assets/kubikon-templates/ - public/kubikon-learn/ → public/assets/kubikon-learn/ - (код искал в /assets/, файлы лежали без /assets/) Навигация роутов внутри студии: - /kubikon-studio/docs → /docs (90+ навигационных вызовов sed-replaced) - /kubikon-editor/X → /edit/X, /kubikon/play/X → /play/X, /kubikon/gd/X → /gd/X UI: - Новый компонент StudioHeader (61px, как в минке) + копия favicon - WithHeader wrapper в App.jsx для всех страниц кроме fullscreen-редактора/плеера - SSO ticket-flow в AuthContext (auto-redeem #ticket= при загрузке) - Тёмная тема карточек игр в ВИКИ (фон #1c2231 вместо #fff, картинка впритык) Документация: - docs/ONBOARDING.md — путь нового контрибьютора от нуля до PR - docs/TUTORIAL_ADD_SCRIPT_API.md — как добавить game.* API - API_USAGE.md — список эндпоинтов backend - README в подпапках engine/, engine/terrain/, engine/voxel/, engine/robloxterrain/, engine/types/ .gitignore: - public/wiki/ исключён (73МБ PNG, будут на CDN отдельной задачей) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
71 lines
4.0 KiB
Markdown
71 lines
4.0 KiB
Markdown
# Воксельный движок (chunks-based, новый)
|
||
|
||
Это новый движок ландшафта, который заменит [legacy terrain](../terrain/). Идея — как у Minecraft / Roblox terrain: мир разбит на чанки 16×16×16, каждый рендерится независимо, далёкие — в LOD, удалённые выгружаются.
|
||
|
||
См. [RUBLOX_VOXEL_ENGINE_PLAN.md](../../../../../RUBLOX_VOXEL_ENGINE_PLAN.md) (план на 2-3 месяца, старт 2026-05-12).
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
VoxelWorld ← фасад. setVoxel(x,y,z, type) / getVoxel.
|
||
│
|
||
├─ Map<chunkKey, VoxelChunk> ← один чанк = 16³ вокселей
|
||
│
|
||
├─ WorldGenerator ← процедурная генерация (Perlin/Simplex)
|
||
│
|
||
└─ VoxelRenderer ← Babylon-меши, LOD, frustum culling
|
||
│
|
||
└─ ChunkMesher per chunk ← greedy meshing на воркере
|
||
```
|
||
|
||
## Файлы
|
||
|
||
| Файл | Что |
|
||
|---|---|
|
||
| `VoxelWorld.js` | Главный фасад. Хранит `Map<"x|y|z", VoxelChunk>`, dirty-список чанков. |
|
||
| `VoxelChunk.js` | Один чанк 16³ + материалы + dirty-bit. Память: 4 КБ. |
|
||
| `VoxelLayer.js` | Слои воксельных типов (твёрдые / жидкие / прозрачные). |
|
||
| `ChunkMesher.js` | Greedy meshing для одного чанка → vertex/index buffers. |
|
||
| `ChunkSerializer.js` | Кодирование чанка для сохранения / multiplayer-стрима. |
|
||
| `GreedyMesher.js` | Алгоритм объединения граней одинаковых вокселей. |
|
||
| `VoxelRenderer.js` | Babylon: создаёт `Mesh` per chunk, ставит на сцену, LOD-менеджер. |
|
||
| `WorldGenerator.js` | Процедурная генерация: высота через SimplexNoise, материал по высоте. |
|
||
| `SimplexNoise.js` | Шум-функция для генерации. |
|
||
|
||
## Greedy meshing — зачем
|
||
|
||
Без него:
|
||
- 16³ = 4096 вокселей в чанке
|
||
- Каждый воксель = 6 граней = 24 576 граней в чанке
|
||
- 100 чанков = 2.4M вертекс — FPS падает
|
||
|
||
С greedy meshing соседние одинаковые грани объединяются в большие прямоугольники:
|
||
- Травяной холм 16×16×8 → ~50 граней вместо 12000
|
||
- Один чанк = 100-500 вертексов
|
||
- 100 чанков = 50К вертексов — 60 FPS
|
||
|
||
Алгоритм: для каждой оси (X,Y,Z) и направления (+/-) проходим слой за слоем, ищем прямоугольные области одинакового материала, эмитим quad.
|
||
|
||
## LOD
|
||
|
||
- **LOD0** (близко, ≤4 чанков): полное разрешение.
|
||
- **LOD1** (4-8 чанков): меш каждые 2 вокселя.
|
||
- **LOD2** (>8 чанков): меш каждые 4 вокселя.
|
||
- **>16 чанков**: чанк выгружается, рендерится только heightmap.
|
||
|
||
## Текущий статус
|
||
|
||
Voxel-движок работает **параллельно** с legacy `TerrainManager` как shadow-копия: при любом изменении ландшафта мы пишем И туда И туда. Это даёт замеры производительности и готовность к Этапу 2 (полная замена).
|
||
|
||
См. PR в репо для прогресса.
|
||
|
||
## Связанные доки
|
||
|
||
- [RUBLOX_VOXEL_ENGINE_PLAN.md](../../../../../RUBLOX_VOXEL_ENGINE_PLAN.md) — план
|
||
- [../terrain/README.md](../terrain/README.md) — legacy движок
|
||
- [../README.md](../README.md) — обзор всех менеджеров движка
|
||
|
||
## Вопросы
|
||
|
||
Канал `#разработка` в https://team.rublox.pro, отвечает МИН и команда движка.
|