Suslik
на каждую консоль будет по слою, клик инжектится в экранных координатах, каждый слой решает на нем ткнули или нет
Как собрать тулы?
Компилирую 2013й студией, сама либа собирается, тулы/семплы нет. Не может подключить BaseManager.h. Рендерер стоит D3D11, Freetype отключен.
Собрал вроде. Семплы собрались хуже, чем в бинарной сборке (рендеринг некоторых вещей отвалился), но работают, вроде.
Проверил с версией из master - собирается и работает с freetype и без него. Разве что дополнил совсем свежее изменение, но без него и демки не собирались.
Можно более полную ошибку?
Вывел 2 вьюпорта в одно окно в Огре, поделив его пополам. MyGui нормально переключается между ними. Но координаты курсора всегда считает по первому окну. То есть если не прятать курсор от Винды, то получается два курсора. Да и если прятать, все равно их фактически два и при перемещении курсора во второй вьюпорт он просто пропадает, так как MyGui считает его ушедшим вообще за границу окна. Насколько я понял, на ogre3d.org посоветовали рендерить через текстуру в один вьюпорт. Но рендерить через текстуру, получается, нужно всё и всегда. Не слишком ли жирное решение, делать так всего лишь из-за неверной позиции курсора?
Подскажите, раз уж тут есть представители от разработчиков:
Построил MyGUI, собрал только две либы: MyGUIEngineStatic.lib и MyGUI.DirectX11Platform.lib
Подключил в проект, скомпилировал, всё нормально. Но как только я пытаюсь дернуть любую функцию из классов MyGUI, то получаю следующие предупреждения линковщика:
2>gameState.obj : warning LNK4217: локально определенный символ ??0LogManager@MyGUI@@QAE@XZ (public: __thiscall MyGUI::LogManager::LogManager(void)) импортирован в функцию "public: __thiscall MyGUI::DirectX11Platform::DirectX11Platform(void)" (??0DirectX11Platform@MyGUI@@QAE@XZ) 2>gameState.obj : warning LNK4217: локально определенный символ ?getInstance@LogManager@MyGUI@@SAAAV12@XZ (public: static class MyGUI::LogManager & __cdecl MyGUI::LogManager::getInstance(void)) импортирован в функцию "public: void __thiscall MyGUI::DirectX11Platform::initialise(struct ID3D11Device *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?initialise@DirectX11Platform@MyGUI@@QAEXPAUID3D11Device@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 2>gameState.obj : warning LNK4217: локально определенный символ ?createDefaultSource@LogManager@MyGUI@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z (public: void __thiscall MyGUI::LogManager::createDefaultSource(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)) импортирован в функцию "public: void __thiscall MyGUI::DirectX11Platform::initialise(struct ID3D11Device *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?initialise@DirectX11Platform@MyGUI@@QAEXPAUID3D11Device@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 2>gameState.obj : warning LNK4217: локально определенный символ ??0Gui@MyGUI@@QAE@XZ (public: __thiscall MyGUI::Gui::Gui(void)) импортирован в функцию "public: __thiscall gameState::gameState(class IniWorker *)" (??0gameState@@QAE@PAVIniWorker@@@Z) 2>gameState.obj : warning LNK4217: локально определенный символ ?initialise@Gui@MyGUI@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z (public: void __thiscall MyGUI::Gui::initialise(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)) импортирован в функцию "public: __thiscall gameState::gameState(class IniWorker *)" (??0gameState@@QAE@PAVIniWorker@@@Z) 2>gameState.obj : warning LNK4217: локально определенный символ ??1Gui@MyGUI@@UAE@XZ (public: virtual __thiscall MyGUI::Gui::~Gui(void)) импортирован в функцию "public: virtual void * __thiscall MyGUI::Gui::`scalar deleting destructor'(unsigned int)" (??_GGui@MyGUI@@UAEPAXI@Z)
Еще и релизная сборка не собирается, не линкуется, если собирать без поддержки FreeType, то такая же фигня и в дебаге:
2>MyGUIEngineStatic.lib(MyGUI_ResourceTrueTypeFont.obj) : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall MyGUI::ResourceTrueTypeFont::textureInvalidate(class MyGUI::ITexture *)" (?textureInvalidate@ResourceTrueTypeFont@MyGUI@@UAEXPAVITexture@2@@Z)"
Ни одна либа нормальная без секса со сборкой не работает нормально, хватит это терпеть, ёпт.
Что делать? Гугл по ошибке не помог, у людей исчезающе редко встречается данная ошибка.
Неправильно прилинкованы библиотеки. Если MyGUI собран статически, то и при сборке вашего проекта надо иметь дефайн MYGUI_STATIC.
Прекрасно, дефайн решил проблемы. Только вот где про него простому смертному узнать? Вам бы документацию по билду внятную написать, а то та, что есть, вообще ни о чем. Как депенденси собирать - нет, какая структура там должна быть, чтобы CMake сгенерил проект - нет. Про дефайн вот тоже никак. Вы принимаете какую-нибудь помощь? Я бы вам, например, минимально возможный семпл написал, а то там не сразу в этих дебрях разберешься что же нужно, чтобы это заработало минимально, ну и немного документации по тому, как скины создавать и загружать лейауты, а то не разобрался до конца со всем этим. Вообще Getting Started заметно бы упростил вхождение в ваш UI. Сам UI очень неплохой, выглядит симпатично, несложный вроде как, но порог вхождения высоковат.
Readme отсылает на wiki: http://www.ogre3d.org/tikiwiki/MyGUI+Compiling , а там есть и про зависимости и про MYGUI_STATIC, хотя и не всё (сейчас дописал про дефайн).
Но согласен, что в целом с этим плохо. Помощь принимаем в любом удобном виде. На деле написать хорошие доки очень и очень сложно, а наличие простых примеров не помогает, т.к. их надо еще найти. Если есть идеи как это улучшить, то будем рады попробовать.
Вопрос не к авторам:
А кто-нибудь реализовывал использование mygui без FFP(OGL),т.е с шейдерами?
На ogre3d есть один шейдер под gles,но что там передают в самплер не понятно
чёто немогу вкурить, как натягивать на кнопку произвольную текстуру и динамически её менять ? в примерах не нашёл
В общем, разработчики, что я делаю не так? Скопировал из системы файл шрифта Arial Unicode MS в папку с файлом MyGUI_Fonts.xml и изменил содержание самого файла на:
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Resource" version="1.1">
<Resource type="ResourceTrueTypeFont" name="DejaVuSansFont.15">
<Property key="Source" value="MSMINCHO.TTF"/>
<Property key="Size" value="10"/>
<Codes>
<Code range="32 126"/>
<Code range="1025 1105"/>
<Code range="8470"/>
<Code hide="1026 1039"/>
<Code hide="1104"/>
</Codes>
</Resource>
</MyGUI>Шрифт вроде как поменялся, но вместо иероглифов Хираганы, я вижу только точки.
button->setCaption(_T( "かがみ"));
Результат:

Да и вообще, структура этих XML файлов для меня загадка. За что отвечает тэг Code с атрибутом range, к примеру? Есть ли документация на эту тему?
Range - это коды символов, которые попадают в текстуру.
Все стороки обязаны быть в utf8 формате, а при непопадании в range искомых символов рендерится спец символ (в большинстве шрифтов он выглядит как квадратик, но в этом шрифте видимо это черточка).
Т.е. надо:
1. Добавить диапазон дополнительных символов в xml.
2. Убедиться, что на вход подаются utf8 символы.
Писать на ascii строки в коде в целом не лучшая идея, даже для тестов, т.к. это добавляет проблем с unicode. Файл надо сохранять в utf8, иначе будет лажа.
Нет, с кодом все в порядке, проверял через функцию DX ID3DXFont.DrawText() и все отображалось как и должно, а с MyGUI не сработало. Это скорее всего из-за упомянутых диапазонов символов, включенных в текстуру. Возможно ли включить все символы из файла шрифта или есть ограничения?
EDIT:
<Code range="0 65533"/>
Да, как и предполагалось. Просто включил все символы из файла шрифта и надпись появилась.
Включить все символы у многих шрифтов возможно, но текстура будет неоправданно большой. А если там есть языки типа китайского, то она будет слишком большой и может получиться больше чем 4096 * 4096. Так что лучше явно указать необходимые диапазоны, как сейчас для кириллицы указано <Code range="1025 1105"/>
Возможно ли динамически менять эти самые диапазоны? А так же использовать встроенные шрифты из ОС, а не из файла.
Тема в архиве.