Jump to content

Input.SetMouseCursorCustom resets cursor when called frequently


photo

Recommended Posts

Здравствуйте! Заметил такую проблему, что при частом вызове функции Input.SetMouseCursorCustom, курсор в какой-то момент сбрасывается до стандартного и больше не меняется при вызове функции. Есть какое-то конкретное ограничение? UNIGINE 2 Community 2.17.0.1.

Link to comment

Какого-то явного ограниченя нет.

Хотелось бы глянуть на код, чтобы у нас была возможность повторить такое же поведения на нашей стороне и понять что происходит. Сходу повторить не получилось.

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

Link to comment
4 hours ago, silent said:

Какого-то явного ограниченя нет.

Хотелось бы глянуть на код, чтобы у нас была возможность повторить такое же поведения на нашей стороне и понять что происходит. Сходу повторить не получилось.

Сейчас в отладке заметил, что проблема скорей в экземпляре Image, но приложение сразу же вылетает, как только я пытаюсь узнать его содержимое.

image.jpeg.bb50538c794179ced2d661f9ce7a9150.jpeg

При этом код может довольно долго работать корректно (около 20 секунд если постоянно водить курсором над разными объектами).

public void SetCursor(Image cursorImage, PixelCoordinate activePoint)
		{
			cursorsParameters.Add(cursorImage, activePoint);
			usedCursors.Add(cursorImage);
			Input.SetMouseCursorCustom(cursorImage, activePoint.X, activePoint.Y);
			Input.MouseCursorSystem = true;
		}
public void ResetCursor(Image cursorImage)
		{
			if (usedCursors.Remove(cursorImage))
			{
				cursorsParameters.Remove(cursorImage);
				if (cursorsParameters.Count > 0)
				{
					Image lastKey = usedCursors.Last();
					Input.SetMouseCursorCustom(lastKey, cursorsParameters[lastKey].X, cursorsParameters[lastKey].Y);
				}
				else
					SetDefaultCursor();
			}
		}

Вызывающий код выглядит так, вызывается при попадании рейкаста из курсора на любой объект с подходящей маской. В данном случае мне нужны виджеты:

		void OnGUIMeshHover(Object target, WorldIntersection intersection)
		{
			ObjectGui newObjGui = target as ObjectGui;

			if (newObjGui is not null)
			{
				vec3 mouseCoordinate = intersection.Point;

				vec3 source = vec3.ZERO;
				vec3 direction = vec3.ZERO;
				vec3 newDistance = vec3.ZERO;
				vec3 mouseDirection = vec3.ZERO;

				if (PC_VRBaseInput.Name == VRInput.CurrentName)
				{
					source = _PCsource.WorldPosition;
					direction = mouseCoordinate - source;
					newDistance = direction * 1.5f;
					mouseDirection = source + newDistance;
				}

				newObjGui.SetMouse(in source, in mouseDirection, _isMouseDown ? 1 : 0, false);

				Widget selectedWidget = newObjGui.GetGui().GetUnderCursorWidget();

				_ = selectedWidget switch
				{
					WidgetButton => SetCursor(CursorType.hand),
					WidgetEditLine => SetCursor(CursorType.iBeam),
					WidgetEditText => SetCursor(CursorType.iBeam),
					_ => SetCursor(CursorType.arrow)
				};
				_lastObjGui = newObjGui;
			}
			else
			{
				if (_lastObjGui is not null)
					SetCursor(CursorType.arrow);
				_lastObjGui = null;
			}
		}
bool SetCursor(CursorType cursorType)
		{
			switch (cursorType)
			{
				case CursorType.hand:
					if (_currentCursor is not null)
						_pointer.ResetCursor(_currentCursor);
					_currentCursor = _handCursorImage;
					_pointer.SetCursor(_handCursorImage, _handActivePoint);
					break;
				case CursorType.iBeam:
					if (_currentCursor is not null)
						_pointer.ResetCursor(_currentCursor);
					_currentCursor = _iBeamCursorImage;
					_pointer.SetCursor(_iBeamCursorImage, _iBeamActivePoint);
					break;
				case CursorType.arrow:
				default:
					if (_currentCursor is not null)
					{
						_pointer.ResetCursor(_currentCursor);
						_currentCursor = null;
					}
					break;
			}
			return true;
		}

 

Link to comment

А что у вас за текстурка используется? Попробуйте при импорте текстуры курсора в редактор использовать unchanged опцию, чтобы для неё не создавался сжатый рантайм. Возможно, это и является причиной падений.

При использовании несжатых RGB8 / RGBA8 текстур падение повторить не удалось.

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

Link to comment
4 hours ago, silent said:

А что у вас за текстурка используется? Попробуйте при импорте текстуры курсора в редактор использовать unchanged опцию, чтобы для неё не создавался сжатый рантайм. Возможно, это и является причиной падений.

При использовании несжатых RGB8 / RGBA8 текстур падение повторить не удалось.

К сожалению, включение опции Uncahnged не помогло. Так же пробовал сконвертировать .png в .texture, но это тоже не дало результата. Параметры текстуры были следующие:

  image.png.b797743285fb404a29d674dd40961ea9.png

Так же заметил, что такая проблема появляется только при попытке менять курсор при наведении на виджеты. Пробовал запускать отдельно скрипт, который меняет курсор при наведении на объекты сцены и с ним такого не случалось.

Еще заметил, что после отключения курсора при отладке экземпляр Image ломается еще до вызова метода:

 public void SetCursor(Image cursorImage, PixelCoordinate activePoint)

 

Link to comment

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

Можете скинуть небольшой тестовый проект с вашей иконкой курсора и виджетами с которыми происходит поиск пересечения? Чтобы был полный код который нужен для воспроизведения именно падения.

Спасибо.

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

Link to comment
23 hours ago, silent said:

 Удалось воспроизвести только случай с тем, что после какого-то периода времени курсор сбрасывается в стандартный и больше не меняется

Да. Это оно и есть. Только после того как пропал курсор, нужно поставить breakpoint где-нибудь рядом с вызовом метода SetCursor и подключиться отладчиком. Когда точка останова сработает, навестись курсором на переменную типа Image и приложение упадет... Ну у меня оно во всяком случае падает.

Высылаю проект для тестирования. 

Widget_test.rar

  • Thanks 1
Link to comment

Глянули проект, спасибо. Получается что падает только при попытке глянуть в Image у курсора, но если он пропадает, то там остается ссылка на какую-то битую память и всё падает.

Если не пытаться просмотреть в бряке этот Image, то и падений не будет. Есть подозрение, что после починки бага с курсором в движке, брейкпоинт на этот Image тоже не будет падать, т.к. тут сам дебаггер завершает процесс движка.

К сожалению, каких-то путей обхода этого бага ни в 2.17, ни в 2.19 найти не удалось.

  • Thanks 1

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

Link to comment
×
×
  • Create New...