Jump to content

[SOLVED] EngineWindowGroup - не работает Manipulator, пока не происходит перемещение окна из группы, а после опять в нее


photo

Recommended Posts

Posted (edited)

Здравствуйте, есть группа окон, которая создается заранее. Использовал код из документации для создания Manipulator. В качестве камеры используется PlayerSpectator. При попытке переместить деталь происходит перемещение камеры в пространстве. Однако, после того как открепить окно и переместить его обратно, то все начинает работать как нужно. В чем может быть проблема?
На первых двух изображениях показано как работает перемещение если окно не откреплять (т.е. не работает, т.к. перемещается камера). На третьем открепляю окно, после этого закрепляю его обратно на то же место, затем на 4 и 5 изображениях видно, что манипулятор работает так как нужно.
image.thumb.png.2dfe3009d0f165d979c02ce5fc6909fb.pngimage.thumb.png.e4d538e66357721b769b485e448f5852.pngimage.thumb.png.abdd28f3c4d89700b5b9c1e22d819f6f.pngimage.thumb.png.7d846ea8705b5127c825206a458ba2cb.pngimage.thumb.png.a7fb316d9bb23bcb7690fdfd7bd120c2.png

Edited by moriVotum
Posted

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

К сожалению, по скриншотам невозможно понять что является причиной такого поведения. Возможно, нужно вручную захватывать мышь у конкретного окна (например, через setMouseGrab).

Если вы сможете подготовить небольшой тестовый пример на основе нового проекта или любого существующего С++ / C# сэмпла, чтобы мы могли у себя его скомпилировать и запустить для локальных тестов - это бы сильно упростило нахождение решения (также сгодится и текущий проект, который на скриншотах). Можете залить его к нам на FTP (данные для доступа у меня в подписи), или же на любой файлообменник.

Спасибо!

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

Posted (edited)
6 hours ago, silent said:

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

К сожалению, по скриншотам невозможно понять что является причиной такого поведения. Возможно, нужно вручную захватывать мышь у конкретного окна (например, через setMouseGrab).

Если вы сможете подготовить небольшой тестовый пример на основе нового проекта или любого существующего С++ / C# сэмпла, чтобы мы могли у себя его скомпилировать и запустить для локальных тестов - это бы сильно упростило нахождение решения (также сгодится и текущий проект, который на скриншотах). Можете залить его к нам на FTP (данные для доступа у меня в подписи), или же на любой файлообменник.

Спасибо!

Сделал мини пример, с двумя скриптами (для создания группы окон, и сам манипулятор), и наблюдается такое же поведение в работе как и ранее (т.е. приходится также перетаскивать окно из группы и обратно).
При этом, если запускать из Editor, то манипулятора даже не видно, пока не переместить окно от туда и обратно, если же запускать из среды разработки, то манипулятор хотя бы виден, но также не работает пока не сделать с окном тоже самое.
Также, в коде манипулятора изменил функцию получения ноды по нажатии мыши на экран, но это не влияет на его работу, т.к. проверял приложение без группы окон и там все нормально.

Ссылка на проект: https://drive.google.com/file/d/11MTK1c0-9MBZaP38nQwpWRe12H4ykCBd/view?usp=drive_link

image.thumb.png.21ec76c23b283589eab983db49405188.png

Код WindowController:

using System.Collections;
using System.Collections.Generic;
using Unigine;

[Component(PropertyGuid = "b671d02a82f79075856c66a360e6725132188a16")]
public class WindowController : Component
{
	void Init()
	{
		int width = 1280;
		int height = 720;
      
		EngineWindowViewport mainMenu = WindowManager.MainWindow;
		EngineWindowViewport modelTree = new("Model Tree", 200, 100);
		EngineWindowViewport functions = new("Functions", 100, 100);
		EngineWindowViewport slides = new("Slides", 200, 100);

		EngineWindowGroup mainGroup =
			new(EngineWindowGroup.GROUP_TYPE.HORIZONTAL, "Main Group", 100, 100);
		mainGroup.Add(modelTree);
		mainGroup.Add(mainMenu);
		mainGroup.Add(slides);

		EngineWindowGroup parentGroup =
			new(EngineWindowGroup.GROUP_TYPE.VERTICAL, "Parent Group", width, height);
		parentGroup.Add(functions);
		parentGroup.Add(mainGroup);

		parentGroup.Position = new ivec2(0, 0);
		parentGroup.Size = new ivec2(width, height);
		parentGroup.Title = "Example";

		parentGroup.UpdateGuiHierarchy();
		parentGroup.SetVerticalTabHeight(0, height / 3);
      
		mainGroup.UpdateGuiHierarchy();
		mainGroup.SetHorizontalTabWidth(1, (int)(width / 1.6));

		parentGroup.Show();

		ControlsApp.MouseHandle = Input.MOUSE_HANDLE.SOFT;
	}
	
	void Update()
	{
		
	}
}

 

Edited by moriVotum
  • Thanks 1
Posted

Здравствуйте!
Из-за того что скрипт для создания лейаута окон выполняется раньше, на момент создания окон SelftGui у MainWindow не активно, из-за этого инпут не проходит до виджета манипулятора.

При создании виджетов лучше использовать

WindowManager.MainWindow.Gui

либо вы можете вообще не указывать Gui и при добавлении виджетов в окно, им автоматически выставиться нужный Gui.

Для того чтобы все виджеты правильно работали при стаке окон и других манипуляциях с окнами, а так же были привязаны к нужному Gui, лучше добавлять их прям в окно используя метод AddChild().

// add widgets to UI
WindowManager.MainWindow.AddChild(ObjManTranslator);
WindowManager.MainWindow.AddChild(ObjManScaler);
WindowManager.MainWindow.AddChild(ObjManRotator);

После анстака и снова стака окна все начинало работать, потому что после стака окон виджеты автоматически правильно распределилсь к нужному Gui и инпут начал нормально проходить.

 

  • Like 1
Posted

Благодарю! Сейчас все работает как и должно.

  • Like 1
  • moriVotum changed the title to [SOLVED] EngineWindowGroup - не работает Manipulator, пока не происходит перемещение окна из группы, а после опять в нее
×
×
  • Create New...