Marsik Posted August 21, 2023 Share Posted August 21, 2023 (edited) Здравствуйте, при создании WidgetManipulator, часть окна становиться черной. Ниже скрин до и после добавления WidgetManipulator, а также код. Заранее спасибо. int numberDisplays = Displays::getNum(); if (numberDisplays > 2) numberDisplays = 2; Math::ivec2 positionD1; Math::ivec2 resolutionD1; Math::ivec2 positionD0 = Displays::getPosition(0); Math::ivec2 resolutionD0 = Displays::getResolution(0); if (numberDisplays < 2) { resolutionD0.x /= 2; resolutionD1 = resolutionD0; positionD1.x = positionD0.x + resolutionD1.x; } else { positionD1 = Displays::getPosition(1); resolutionD1 = Displays::getResolution(1); } EngineWindowViewportPtr window_0 = nullptr; if (WindowManager::getNumWindows() > 1) window_0 = checked_ptr_cast<EngineWindowViewport>(WindowManager::getWindow(1)); else window_0 = EngineWindowViewport::create(resolutionD1); auto updateWindow = [this](EngineWindowViewportPtr window, Math::ivec2 position, Math::ivec2 resolution) { if (!window) return; window->setBordersEnabled(false); window->setPosition(position); window->setSize(resolution); window->show(); }; EngineWindowViewportPtr main_window = WindowManager::getMainWindow(); updateWindow(main_window, positionD0, resolutionD0); updateWindow(window_0, positionD1, resolutionD1); EngineWindowGroupPtr groupWindow = WindowManager::stackWindows(main_window, window_0, EngineWindowGroup::GROUP_TYPE_HORIZONTAL); groupWindow->setTitleBarEnabled(false); groupWindow->setBordersEnabled(false); if (numberDisplays > 1) groupWindow->setPosition(positionD1); else groupWindow->setPosition(positionD0); auto resolution = resolutionD0; resolution.x += resolutionD1.x; groupWindow->setResizable(true); groupWindow->setSize(resolution); groupWindow->setResizable(false); auto gui = groupWindow->getSelfGui(); auto window = WidgetWindow::create(gui, "Панель Управления", 210, 135); window->setMoveable(false); window->setPosition(0, 20); auto btExit = WidgetButton::create(gui, "Выход"); btExit->setToolTip("Выйти"); btExit->setWidth(60); btExit->setPosition(305, 10); auto mTranslator = WidgetManipulatorTranslator::create(gui); gui->addChild(window, Gui::ALIGN_OVERLAP | Gui::ALIGN_FIXED); window->addChild(btExit, Gui::ALIGN_OVERLAP | Gui::ALIGN_FIXED); gui->addChild(mTranslator); btExit->addCallback(Gui::CLICKED, (CallbackBase *)MakeCallback([]() { Engine::get()->quit();})); Edited August 21, 2023 by Marsik Link to comment
karpych11 Posted August 21, 2023 Share Posted August 21, 2023 Здравствуйте. Тут проблема в том, что виджеты добавляются напрямую в gui, который отвечает за лейаут группы. Если посмотреть на api для EngineWindowGroup, то в нём нет методов для добавления дочерних виджетов. Такое можно делать только для EngineWindowViewport. Чтобы исправить такое поведение, нужно добавить все виджеты в какое-то одно из окон. К примеру, main_window. Т.к. оно вложенное, то для получения gui используем getGui(), а не getSelfGui(). В этом случае получим gui, который отвечает за группу в самом начале иерархии. Используем этот gui для создания виджетов, а после добавляем их в окно: auto gui = main_window->getGui(); auto window = WidgetWindow::create(gui, "Панель Управления", 210, 135); window->setMoveable(false); window->setPosition(0, 20); auto btExit = WidgetButton::create(gui, "Выход"); btExit->setToolTip("Выйти"); btExit->setWidth(60); btExit->setPosition(305, 10); auto mTranslator = WidgetManipulatorTranslator::create(gui); main_window->addChild(window, Gui::ALIGN_OVERLAP | Gui::ALIGN_FIXED); window->addChild(btExit, Gui::ALIGN_OVERLAP | Gui::ALIGN_FIXED); main_window->addChild(mTranslator); Link to comment
Marsik Posted August 22, 2023 Author Share Posted August 22, 2023 (edited) @karpych11 Спасибо. Но тогда делая дальше по инструкции Using Manipulators to Transform Objects, у меня получается манипулятор в стороне от объекта. int numberDisplays = Displays::getNum(); if (numberDisplays > 2) numberDisplays = 2; Math::ivec2 positionD1; Math::ivec2 resolutionD1; Math::ivec2 positionD0 = Displays::getPosition(0); Math::ivec2 resolutionD0 = Displays::getResolution(0); if (numberDisplays < 2) { resolutionD0.x /= 2; resolutionD1 = resolutionD0; positionD1.x = positionD0.x + resolutionD1.x; } else { positionD1 = Displays::getPosition(1); resolutionD1 = Displays::getResolution(1); } EngineWindowViewportPtr window_0 = nullptr; if (WindowManager::getNumWindows() > 1) window_0 = checked_ptr_cast<EngineWindowViewport>(WindowManager::getWindow(1)); else window_0 = EngineWindowViewport::create(resolutionD1); auto updateWindow = [this](EngineWindowViewportPtr window, Math::ivec2 position, Math::ivec2 resolution) { if (!window) return; window->setBordersEnabled(false); window->setPosition(position); window->setSize(resolution); window->show(); }; EngineWindowViewportPtr main_window = WindowManager::getMainWindow(); updateWindow(main_window, positionD0, resolutionD0); updateWindow(window_0, positionD1, resolutionD1); EngineWindowGroupPtr groupWindow = WindowManager::stackWindows(main_window, window_0, EngineWindowGroup::GROUP_TYPE_HORIZONTAL); groupWindow->setTitleBarEnabled(false); groupWindow->setBordersEnabled(false); if (numberDisplays > 1) groupWindow->setPosition(positionD1); else groupWindow->setPosition(positionD0); auto resolution = resolutionD0; resolution.x += resolutionD1.x; groupWindow->setResizable(true); groupWindow->setSize(resolution); groupWindow->setResizable(false); auto gui = main_window->getGui(); auto window = WidgetWindow::create(gui, "Панель Управления", 210, 135); window->setMoveable(false); window->setPosition(0, 20); auto btExit = WidgetButton::create(gui, "Выход"); btExit->setToolTip("Выйти из тренировки"); btExit->setWidth(60); btExit->setPosition(305, 10); auto mTranslator = WidgetManipulatorTranslator::create(gui); main_window->addChild(window, Gui::ALIGN_OVERLAP | Gui::ALIGN_FIXED); window->addChild(btExit, Gui::ALIGN_OVERLAP | Gui::ALIGN_FIXED); main_window->addChild(mTranslator); btExit->addCallback(Gui::CLICKED, (CallbackBase*)MakeCallback([]() { Engine::get()->quit(); })); auto player = Game::getPlayer(); mTranslator->setTransform(test_node->getWorldTransform()); mTranslator->setProjection(player->getProjection()); mTranslator->setModelview(player->getCamera()->getModelview()); Edited August 22, 2023 by Marsik Link to comment
silent Posted August 23, 2023 Share Posted August 23, 2023 К сожалению, WidgetManipulator был написан давно и без учета многооконности, поэтому он берет не тот размер окна (общий размер всех окон, а не только текущего). Поэтому пока его не получится использовать в многооконных приложениях на текущий момент. Поправим в будущих версиях SDK (скорее всего даже в 2.18). How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Recommended Posts