Jump to content

При создании WidgetManipulator, часть окна становиться черной


photo

Recommended Posts

Здравствуйте, при создании WidgetManipulator, часть окна становиться черной. Ниже скрин до и после добавления WidgetManipulator, а также код.

Заранее спасибо.

 

image.thumb.png.d8cca4581c23bc622eb7d353389de53d.png

image.thumb.png.f5700f8f997088e28095eb0b89aab517.png

 

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 by Marsik
Link to comment

Здравствуйте.

Тут проблема в том, что виджеты добавляются напрямую в 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

@karpych11 Спасибо.
 

Но тогда делая дальше по инструкции Using Manipulators to Transform Objects, у меня получается манипулятор в стороне от объекта. 

image.thumb.png.bf30f12a43210eda670012c7bf99b038.png

 

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 by Marsik
Link to comment

К сожалению, WidgetManipulator был написан давно и без учета многооконности, поэтому он берет не тот размер окна (общий размер всех окон, а не только текущего).

image.png

 

Поэтому пока его не получится использовать в многооконных приложениях на текущий момент.

Поправим в будущих версиях SDK (скорее всего даже в 2.18).

 

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment
×
×
  • Create New...