1. PrimitiveManager: mat.ambientColor=(1,1,1). Теперь scene.ambientColor
("Заливка теней" слайдер) реально влияет на тени. Юзер крутит
значение и видит изменение.
2. converter.py: Roblox-Part импортируется всегда с Anchored=True
(force-anchored). Welds у нас заглушки, без них unanchored Part'ы
рассыпаются физикой. Если юзеру нужно падающее — снимет в
инспекторе вручную.
Деплой converter.py на VM 130 + systemctl restart.
В Свет и атмосфера добавлено:
- Заливка теней (scene.ambientColor) — позволяет окрасить тени в
сером тоне без пересвета diffuse материалов.
- Экспозиция (ipc.exposure 0.3-2) — общая яркость через
imageProcessingConfiguration.
- Контраст (ipc.contrast 0.5-2)
- Насыщенность (colorCurves.globalSaturation -100..+100)
Юзер крутит слайдеры до момента когда импортированная Roblox-карта
выглядит как оригинал. Дефолты: ambient 0.3, exposure 1.0, contrast
1.0, saturation 1.0.
Также убрал mat.ambientColor=цвет — теперь default (0,0,0). Освещение
управляется глобально через панель.
Состояние пока не сохраняется в проект (только сессия). Persistence
добавим в следующем шаге.
ambient=diffuse (100%) суммировался с прямым светом и
давал пересвет (особенно на дорогах/полу с #cccccc).
40% — баланс: тень окрашена (видна как цвет, не чёрная),
прямой свет = чистый diffuse без пересвета.
Прошлая итерация без ambient давала почти-чёрные грани в тени —
sun под углом + hemi только вверх = низ/бок граней получают только
скудный hemi.groundColor=(0.3,0.3,0.4) = тёмные пятна.
Roblox-look: тень это просто менее яркий вариант цвета (не чёрный).
Фикс: mat.ambientColor = mat.diffuseColor (= цвет примитива).
scene.ambientColor=(0.3) × ambient(цвет) = 30% цвета в тени.
На прямом свете diffuse доминирует — белые остаются белыми,
зелёные зелёными.
Это даёт тени окрашенные (как в Roblox), сохраняя контраст со
светом и точность цвета.
Главная причина пересвета:
1. BrickColor 151 (Earth green = трава Crossroads) ОТСУТСТВОВАЛ
в таблице. Пол получал дефолт #cccccc и выглядел белым.
После анализа карты 344 примитива использовали дефолт.
2. mat.ambientColor=(1,1,1) + scene.ambientColor=(0.3) делало белые
цвета пересветлёнными — серый выглядел белым.
Фикс:
- BRICKCOLOR_TO_HEX расширен с ~50 до ~120 цветов. Добавлены:
151 (Earth green), 26 темный, 18, 115-148, 168-301, 1021-1032 и др.
После: #cccccc дефолт 344→68 (бОльшая часть теперь правильных).
- Убран mat.ambientColor — оставлен default (0,0,0). Lambert чистый:
освещённая грань = diffuse, тень = почти чёрная (scene.ambient смягчает).
Цвета теперь точно как в diffuse, без пересвета.
Деплой: converter.py скопирован на VM 130 + systemctl restart.
emissive прибавлялся к diffuse даже на ярком свету — пересвечивал
цвета (особенно белые/серые).
Новая схема:
- emissive = 0 (всегда)
- mat.ambientColor = (1,1,1) — пропускает scene.ambientColor (0.3)
в тени, делает тени 30% яркости цвета вместо чёрных
- На прямом свете diffuse доминирует, всё как должно быть
Это должно дать Roblox-look: серый #cccccc выглядит серым, белый
выглядит белым, в тенях цвет виден но темнее.
Версия 25% emissive + 1.0 ambient дала картинку слишком плоской:
пропали тени, объём, контраст. Roblox-оригинал имеет чёткие тени
от строений и контрастные грани.
Новые значения:
- mat.ambientColor: 1.0 → 0.5 (всё ещё подмешивает scene ambient
в тени, но не убивает контраст)
- glossy emissive: 25% → 8% (цвет 'живой' но не светится)
Должно дать баланс: цвет в тени виден, при этом тени остаются тенями.
Crossroads-импорт давал тёмно-грязные цвета вместо классических
насыщенных Roblox-цветов:
- трава тёмно-зелёная вместо ярко-зелёной
- дороги серые вместо белых
- крыши приглушённо-красные
Причины:
1. mat.ambientColor=(0,0,0) default — scene.ambientColor=(0.3,0.3,0.3)
не действовал. Тени получали 0 контрибьюшна цвета.
2. material=glossy (default для Roblox Plastic) шёл в case default:
только specularColor=(0,0,0), без emissive — цвет blandный.
Фикс:
- mat.ambientColor=(1,1,1) для всех материалов: подмешивает scene
ambient в тени, цвета остаются видны.
- Для glossy/default: emissive = 25% цвета (как в studs/45%, но скромнее),
specular слабый (0.05). Roblox-look — насыщенный даже без прямого
света.
Также case 'matte' теперь отдельный (был под default).
КОРНЕВАЯ ПРИЧИНА: BabylonScene.freezeStaticPrimitives() замораживает
world matrix anchored-примитивов при Play для оптимизации.
mesh.position.set(x,y,z) после этого не обновляет рендер.
Фикс в PrimitiveManager.updateInstance: если patch содержит position/
rotation/size — расфризить world matrix прежде чем менять transform.
Корень: serialize примитивов/моделей/userModel НЕ сохранял folderId. При
Play→Stop сцена восстанавливалась из снапшота без группировки → все части
кита (светофор/шипы/дверь) вываливались из папки в общие «Примитивы».
Добавлен folderId в serialize всех 3 менеджеров + восстановление в loadFromArray
(model/userModel явно, primitive через opts.folderId).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Зона опасности / триггеры (canCollide:false) ловились camera-clamp, и камера
прыгала к игроку внутри зоны. Причина: metadata примитива НЕ содержал
canCollide, а PlayerController._clampCameraToWorld проверяет md.canCollide.
Добавлен canCollide в metadata меша (+ синк при updateInstance).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
При scale-гизмо mesh.scaling тянул faceUV → studs превращались в полосы.
Фикс: во время drag прячем studs-текстуру (плоский цвет), в dragEnd меш
пересоздаётся с правильным faceUV. _recreateMesh для studs пересоздаёт
материал заново (свежий тайлинг + восстановление текстуры).
GizmoController: + onDrag (live) колбэк для scale.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Тайлинг studs на кубе через faceUV (per-face) — кружки одного размера на
всех гранях, не растягиваются на длинной стороне (баг на брусе 10×1×1).
_studsCubeFaceUV считает UV каждой грани по её реальным размерам.
- studDensity — плотность кружков (множитель): инспектор «Размер studs»
Крупные(0.5)/Средние(1)/Мелкие(2)/Меньше(4). Для пола мелкие, для кирпича
крупные. Проброс через data/_studsDims/faceUV/_studsTiling, сериализация,
updateInstance(patch.studDensity)→пересоздание меша.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Текстура studs v4: круглые кружки с усиленным объёмом (normal strength 4.0,
запечённый блик/тень) + контактная тень от каждого кружка. Фон 0.97 — цвет
остаётся сочным. emissive 45% от цвета на примитивах (Roblox-look).
- Версионные имена файлов (studs_v4_*) — обход browser-кэша Babylon.
- Color-пикер блоков: в палитре при выборе окрашиваемого блока (studs-block)
под категориями появляется ряд из 8 лего-цветов + input «свой цвет».
BabylonScene.setActiveBlockColor → addBlock(...,color) при постановке.
- DEV-хук ?dev=<имя> (localhost): грузит /dev-<имя>.json в редактор для
локального теста без БД (на проде неактивен).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1) Билборд (Магазин апгрейдов, ID=1906): текст и иконки отрисовывались
зеркально из-за того что BILLBOARDMODE_ALL разворачивает FRONT-сторону
plane так что мы видим back-side с зеркальным UV. mesh.scaling.x=-1
игнорируется billboardMode. Решение: отключить billboardMode, вместо
него каждый кадр в onBeforeRenderObservable ставим mesh.rotation.y =
atan2(dx,dz) + PI — front смотрит на камеру → UV рисуется правильно.
2) Autosave перезаписывал реальный проект пустой стартовой сценой при
reload страницы (баг #1893, #1905 — оба перетёрты). Добавил
sceneLoadingRef guard в doSave: пока sceneLoading=true, autosave
запрещён.
3) Запрет публикации без обложки — фронт (alert + open Settings) и бэк
(400 thumbnail_required если pd.thumbnail < 100 байт).
4) Scripting API:
- шорткат: game.scene.spawn('billboard',...) вместо
'primitive:billboard' (применяется ко всем примитивам)
- проброс template/face/content/elements в scene.spawn для билбордов
- PrimitiveManager.updateInstance — поддержка billboardOpts patch'а
5) Тест-игра 'Магазин апгрейдов' ID=1906 — 4 shop-item билборда +
banner + shop-purchase кнопка 'Сбросить апгрейды' + HUD рубликов.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Задача 01 из 1 - Неделя 4/ЗАДАЧИ РУБЛОКС. P0-приоритет: без таблиц
с кнопками невозможны симуляторы, тайкуны, фермы.
Новое:
- engine/BillboardUiManager.js — 4 пресета (shop-item, shop-purchase,
banner, sign), 18 иконок, DynamicTexture-рендер, UV-hit-test
- PrimitiveTypes: новый тип 'billboard' в категории 'gameplay'
- PrimitiveManager: case billboard в _createMeshForType (Plane), init
через applyToMesh, billboardOpts в updateInstance
- BabylonScene: PointerEventTypes-handler для кликов с _isPlaying-чеком
и pointer-lock поддержкой
- GameRuntime: команды billboard.set/update/onClick, callback через
sandbox.sendEvent('billboardClick')
- ScriptSandboxWorker: пространство game.billboard.{set,update,onClick}
- BillboardEditorModal.jsx — модалка с живым canvas-превью, 8 готовых
градиентов + кастомные пикеры, дропдаун из 18 иконок
- InspectorPanel: кнопка 'Редактировать табличку…' для billboard-примитива
- KubikonEditor: проброс модалки через onEditBillboard prop
- Icon.jsx: SVG prim-billboard
Два режима ориентации: 'camera' (BillboardGui-аналог, всегда смотрит
на игрока) и 'fixed' (SurfaceGui-аналог, прикреплён к поверхности).
Клик-детекция через ray-pick → UV → пиксели текстуры → поиск кнопки
по AABB; работает с пиксельной точностью даже при повороте камеры.
Документация: RUBLOX_STUDIO_FUNCTIONS.md раздел 1.25.
Тестовая игра 'Магазин апгрейдов' (4 таблички + банер + HUD) — МИН
соберёт в студии drag-n-drop'ом.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Большой консолидирующий коммит после поднятия 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>