Моя C++ либа для 2D-игр: scene graph, HTML-UI, свет и запеченный Spine
Короче, здорово, аноны. Давно собирался показать, какую хуйню я пилю в свободное время, когда не надо впахивать на галере. Это кастомная библиотека для 2D-игр на плюсах. Из фич: древовидный scene graph, рендер через один батч-конвейер, HTML-рендерер для UI (чтобы не ебаться с рантайм-версткой), нормальный свет и, сука, запеченные Spine-анимации. Код выкачу в ближайшее время под MIT — вместе с демкой, из которой надергал примеры ниже.
[SceneGraph]
Каждый объект — это CContainer. Внутри зашито всё: позиция, скейл, поворот, пивот, альфа, tint, скролл-бокс, твины и дочерние элементы. Трансформа наследуется по дереву, рендер хуярит строго в порядке детей, а z-order — это просто их индекс в массиве. Спрайт, лейбл, HTML-документ, партиклы, Spine, диалог — всё это ноды одного дерева с единым интерфейсом.
auto ptrHero = std::make_shared
ptrHero->addChild(ptrShadow);
ptrHero->addChild(ptrBody); // тень под телом
// z-order — просто порядок детей
ptrHero->swapChildren(ptrShadow, ptrBody);
ptrHero->bringChildToFront(ptrBody);
dialog->bringChildUnderForeground(ptrPanel);
// вспышка удара: твин тинта
ptrBody->addSelfTween(eTweenProp::BLACKEN, 1.f, 0.2f, 0.1f, Easing::linear);
ptrBody->addSelfTween(eTweenProp::BLACKEN, 0.f, 1.0f, 0.6f, Easing::outQuad, 0.1f);
Если надо, чтобы лейбл намертво привязался к спине персонажа и двигался вместе с ним — делаешь addChild() и вообще не паришь мозг, он будет кататься, крутиться и скейлиться за родителем. Из коробки завез каскадную упаковку детей с переносом строк и выравниванием, drag & drop и таймеры через тот же твинер, чтоб не городить велосипеды.
_ptrParticlesDemo->packChildrenCascade(maxCx, maxCy, 7.f, true);
btnsCont->alignChildren(eChildrenAlign::HORIZONTAL, 20.f, getDialogCx());
// drag & drop
ptrFace->setInteractive(true);
ptrFace->setDragable({}, [](CContainerPtr, float, float) { return true; });
ph->setInteractive(true);
ph->setOnDragDropAccept([](CContainerPtr dropped) { return true; });
ph->setOnDragDropped([](float x, float y, CContainerPtr dropped)
{
dropped->setPos(0, 0);
ph->addChild(dropped); // карта стала ребёнком слота
});
------------------------------
[Диалоговая_система]
BaseDialog — нода дерева со стеком модальных окон, стилями закрытия и жизненным циклом.
auto dlg = std::make_shared
dlg->setTitle("Настройки", ptrTitleSprite, 113, 113);
dlg->createCloseButton(ptrNormal, ptrPressed, ptrHover, ptrDisabled);
dlg->createFgLayer(ptrFg, 60, 60, 46, 46); // рамка поверх контента
// модально: захватывает ввод, скрывает предыдущее окно стека
dlg->open(this { refreshHud(); }); // колбэк после закрытия
Режимы жизни: open() — модальное окно со стеком; showAsPanel() — панель внутри родительского диалога, ввод не блокирует; закрытие по крестику, по колбэку или CLICK_ANYWHERE — когда кликаешь мимо окна. На коленке собран встроенный скролл: скроллбар, тени, физика флинга с «оттяжкой» за краем и возвратом обратно, колесо мыши и drag-скролл — работает сразу без допила напильником.
------------------------------
[HTML_внутри_сцены]
UI — это просто HTML-документ, который прикидывается нодой дерева. Таблицы, ссылки, чекбоксы, слайдеры, прогрессбары, комбобоксы с выпадашкой, nine/three-slice, картинки с дефолтными эффектами (glare, glitch, пикселизация…) и даже тег
_ptrAboutDemo->init(R"HTML(....)HTML", cx - 40, cy, shared_from_this());
// клик по ссылке копирует в буфер (через Emscripten)
auto* dom = HTMLDom::getInstance();
dom->setOnClick(dom->findNodeIdByAttr(0, "id", "tg_link"),
[](unsigned long long, float x, float y, int)
{
copyToClipboard("@ubgamez");
showCopyToast(x, y);
});
------------------------------
[Запеченный Spine: в десятки раз быстрее]
Если выкатить дефолтный Runtime-Spine на сотню юнитов, он просто трахнет CPU в кашу из-за костей, мешей и клатчинга. Поэтому анимации можно запечь оффлайн в компактный бинарник — позиции жмутся в int16, UV в uint16, альфа и blend — в один байт. В рантайме движок просто один раз проходится по статическому буферу с интерполяцией кадров:
ptrSpine->loadPackedAnimation(0, "BBB/barbarian_idle.panm", 1, true, ptrTex);
ptrSpine->setAnimationByTag(1);
Никакой тяжелой костной математики в кадре — можно спавнить десятки спинов на сцене, fps не просядет. При этом Runtime-режим никуда не делся: если нужны события анимации и хитбоксы — дергаешь обычный API. Оба режима спокойно уживаются вместе.
------------------------------
[Свет прибитый к Spine]
Движок держит до 204 источников в uniform-блоке на кадр, куллинг слоев идет прямо в шейдере. Но самая сочная фича — привязка света к самому скелету:
// аттачмент сам светит: фонарь из картинки фонаря
_ptrLamp->setLightAttachment("light", true);
_ptrLamp->setLightAttachment("lightspot", true);
// радиальный свет на кости
ptrHero->addRadialLight(300.f, "hand_bone", "torch_slot", 1.5f);
Для отмеченного аттачмента рендерер каждый кадр строит квад спрайта в экранных координатах и кидает в световую таблицу — фрагмент шейпится UV аттачмента, яркость умножается на альфу слота. Факел машет — пятно света гуляет по стенам ровно так, как его нарисовал аниматор. Светят и runtime-, и запеченные спины.
На том же конвейере крутятся bloom, виньетка, «капли на стекле», зерно, аберрация и fish-eye. Если интенсивность эффекта на нуле — ветка в шейдере полностью отключается, так что на слабом говне мамонта тяжелые постэффекты не будут жрать ресурсы.
сейчас привожу исходники в божеский вид.
скоро залию на гитхаб под MIT лицухой.
если чо спрашивайте.
и да, если есть возможность, гляньте с говна
минимальное требование - webgl 2
тестировал на хоноре 2016 ого года полет норм.
Анончик, я зашёл посмотрел
Непонятно вот что: что тут нового? В чём новизна?
Просто ещё один движок?
Хоть бы какую-нибудь проективную что ли реализовал
Я тоже пишу свой движок, 3D, с удобным управлением конвеером, для компоновки ежей с ужами бесшовной
>Анончик, я зашёл посмотрел
две чаечки тебе, анонче
>Непонятно вот что: что тут нового? В чём новизна?
простота использования + скорость на слабых девайсах
граф и диалоговая система с поддержкой HTML рендера - 'это просто спасение для мобило, где тонны интерфейса.
Запеченные Spine анимашки - вообще отрыв башки, производительно буквально в 20 раз выше обычно спайна, там где спайн пукнет на 10 инстансах, тут можно наспавни сотни и оно будет работать приемлемо даже на слабом устройстве.
>проективную
каво?
>Я тоже пишу свой движок, 3D, с удобным управлением конвеером, для компоновки ежей с ужами бесшовной
@ьанкей потек походу
>>Непонятно вот что: что тут нового? В чём новизна?
>простота использования + скорость на слабых девайсах
Простота имеет обратную сторону, а 2D любые "слабые" девайсы тянут сейчас (ебанись ты слабым называешь вращение текстуры, нихуя себе!)
>граф и диалоговая система с поддержкой HTML рендера - 'это просто спасение для мобило, где тонны интерфейса.
Тупик: всех HTML-ёбов порешает webasm. И опять см. ремарку про слабые девайсы
>Запеченные Spine анимашки - вообще отрыв башки, производительно буквально в 20 раз выше обычно спайна, там где спайн пукнет на 10 инстансах, тут можно наспавни сотни и оно будет работать приемлемо даже на слабом устройстве.
Чудеса, не верю. Откуда выигрыш? Я ковырял рендер сплайна в С++, даже багу там пофиксил - нету там принципиальных проблем сперформансом
>>проективную
>каво?
спроси у дипсика что такое "проективная геометрия", ёпта
>>Я тоже пишу свой движок, 3D, с удобным управлением конвеером, для компоновки ежей с ужами бесшовной
>@ьанкей потек походу
Не, но я не дам ссылок потому что дианон
>ты слабым называешь вращение текстуры
купи себе нормальную нейронку уже.
>Тупик: всех HTML-ёбов порешает webasm
каво? HTML именно рендерится, понимаешь? нет ?
>не верю
верю, не верю, открывай демку да смотри, йопт. открывается прямо в браузере
ну да, свой, я на нем релиз еще до гпт.
чего в этом необычного?
ты не можешь 2д двиг сделать без нейронки ?
АНАНАСИКИ, ЕСЛИ ВЫ ИЩИТЕ ПЕРФУ
ТУТ ОНА НА УРОВНЕ.
ОСОБЕННО ЭТО КАСАЕТСЯ ЗАПЕЧЕННОГО SPINE
ПОСМОТРЕТЬ МОЖНО В "ВОЗМОЖНОСТИ ДВИЖКА" пункт "Baked Spine"
Если хочется поделиться, пости скриншоты в субшоте или движкосраче. Например, в духе "мои анимации spine в 10 раз быстрее годота!", чтобы годоти злились.
1280x720, 0:21
>>ты слабым называешь вращение текстуры
>купи себе нормальную нейронку уже.
>>Тупик: всех HTML-ёбов порешает webasm
>каво? HTML именно рендерится, понимаешь? нет ?
>>не верю
>верю, не верю, открывай демку да смотри, йопт. открывается прямо в браузере
Тебе лет 20 что ли? будто детский сад
слабость железа имелась ввиду. слабая была NES, например - там плавучки не было
>Двиг
>Либа
Так что в конечном итоге? Либадвиг? Или больше двиголиба?
>>09825
>я на нем релиз еще до гпт.
Покажи по брацки, хотябы видосик какой
>ОСОБЕННО ЭТО КАСАЕТСЯ ЗАПЕЧЕННОГО SPINE
ПОСМОТРЕТЬ МОЖНО В "ВОЗМОЖНОСТИ ДВИЖКА
Маловато. Хороший вопрос, много ли вообще анонов на борде которые спайн хотябы трогали
1920x1080, 1:36
>Так что в конечном итоге?
ну скорее либа. от двигла ждут редактора, у меня его нет, но можно спайн использовать в качестве редактора.
>Покажи по брацки, хотябы видосик какой
Ну вот такую хуйню релизили на ок, заработали 89 рублей
Разработка шла в донейронные времена, поэтому потратили несколько лет (рисовка, анимации, код, 20+ героев)
>Ну вот такую хуйню релизили на ок, заработали 89 рублей
>Разработка шла в донейронные времена, поэтому потратили несколько лет (рисовка, анимации, код, 20+ героев)
Пиздец
Ты тот... мясокубик?.. кубомясик?
Почему не дал ссылку на тред?
Вот же твой тред: >>1091333 (OP)
Молодец... что тут ещё скажешь.
>много ли вообще анонов на борде которые спайн хотябы трогали
Как-то заинтересовался и хотел потрогать, но узнал, что он платный.
Почему весь софт для 2D анимаций либо платно, либо заброшенный?
Где Blender 2D?
>Почему весь софт для 2D анимаций либо платно, либо заброшенный?
Ну мохнатый пиратится изично, да и в юнити и в годоте есть более менее приличный костевой аниматор
>пиратится
Только если ты не планируешь никуда релизиться.
>в годоте есть более менее приличный костевой аниматор
Да... с ручным созданием всех внутренних треугольников...
>Только если ты не планируешь никуда релизиться.
Я говорю за moho - он экспортит считай 3д модели с ригами. Там нечего детектить на пиратство
>Ты тот... мясокубик?.. кубомясик?
да, ананасик, итс ми.
лень искать было
>Молодец... что тут ещё скажешь.
спасибо на добром слове.
>но узнал, что он платный.
Библиотеки-плееры бесплатные и открытые
>Почему весь софт для 2D анимаций либо платно, либо заброшенный?
Потому что 2D это частный случай от 3D, которое сейчас прямо в шейдерах эту анимацию разворачивает и всё
ты меня со своим ебырем перепутал.
я не из твоей гомотусовочки и ваш лгбт-френдли слэнг понимать не обязан. так что за забирай свою "плавучку" и не забудь завалить ебучку.
Ананасик, реально хз про что ты.
Про флоты чтоль? Дак фпу дохуя где не было , не только на nes. Да и вообще не понятно почему ты про nes заговорил. У тебя точно все в порядке?
>Да и вообще не понятно почему ты про nes заговорил. У тебя точно все в порядке?
да это фалько, местный шиз, не обращай внимание.