Compare commits

..

3 Commits

Author SHA1 Message Date
c32914c819 feat: интерактивные 3D-таблички (BillboardGui/SurfaceGui)
Some checks failed
CI / PR size check (pull_request) Successful in 22s
CI / Lint (pull_request) Failing after 2m17s
CI / Secret scan (pull_request) Successful in 3m21s
CI / Build (pull_request) Successful in 3m31s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Задача 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>
2026-05-29 11:58:06 +03:00
min
5518537d53 hotfix: ������� � �������� ������ �� ����������� (#13)
Some checks failed
CI / PR size check (push) Has been skipped
CI / Lint (push) Failing after 10s
CI / Secret scan (push) Successful in 3m43s
CI / Build (push) Successful in 3m59s
CI / Deploy to S1 + S2 (push) Successful in 2m28s
2026-05-29 08:50:51 +00:00
0bcbb89664 fix(scripts): пробел в Monaco-редакторе скриптов больше не блокируется
Some checks failed
CI / Lint (pull_request) Failing after 6s
CI / Build (pull_request) Failing after 9s
CI / PR size check (pull_request) Successful in 15s
CI / Secret scan (pull_request) Successful in 3m48s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
BabylonScene.onKeyDown глобально перехватывал Space (preventDefault для
прокрутки страницы при WASD-навигации камеры). isTypingTarget проверял
только input/textarea/contentEditable — но Monaco роутит keydown через
свой внутренний div, и e.target оказывается не textarea, а
.monaco-editor-container div.

Фикс: добавлена проверка target.closest('.monaco-editor') — если фокус
в Monaco, считаем что юзер печатает и не глотаем клавиши.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 11:50:09 +03:00

View File

@ -2394,6 +2394,11 @@ export class BabylonScene {
const tag = (target.tagName || '').toLowerCase(); const tag = (target.tagName || '').toLowerCase();
if (tag === 'input' || tag === 'textarea' || tag === 'select') return true; if (tag === 'input' || tag === 'textarea' || tag === 'select') return true;
if (target.isContentEditable) return true; if (target.isContentEditable) return true;
// Monaco-редактор — у его внутренних элементов tagName бывает 'div',
// фокус живёт на скрытой textarea, но в зависимости от роутинга
// событий e.target может оказаться родительским div. Проверяем
// принадлежность дереву Monaco — там точно идёт набор текста.
if (typeof target.closest === 'function' && target.closest('.monaco-editor')) return true;
return false; return false;
}; };