Большой консолидирующий коммит после поднятия 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>
48 lines
2.8 KiB
Markdown
48 lines
2.8 KiB
Markdown
# Воксельный ландшафт (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/)) решает всё это.
|