МИН 61fba4e174
Some checks failed
CI / Lint + Format (push) Failing after 32s
CI / Build (push) Failing after 37s
CI / Secret scan (push) Failing after 37s
CI / PR size check (push) Has been skipped
fix: починка билда + studio.rublox.pro инфра
Большой консолидирующий коммит после поднятия 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>
2026-05-28 05:01:13 +03:00
..

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

Папка содержит legacy воксельный движок ландшафта — тот, что сейчас работает в продакшене студии. Постепенно заменяется на новый chunks-based из ../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 (приватный).

Почему legacy

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

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