sityrax Posted November 7 Posted November 7 Здравствуйте! Заметил такую проблему, что при частом вызове функции Input.SetMouseCursorCustom, курсор в какой-то момент сбрасывается до стандартного и больше не меняется при вызове функции. Есть какое-то конкретное ограничение? UNIGINE 2 Community 2.17.0.1.
silent Posted November 8 Posted November 8 Какого-то явного ограниченя нет. Хотелось бы глянуть на код, чтобы у нас была возможность повторить такое же поведения на нашей стороне и понять что происходит. Сходу повторить не получилось. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN
sityrax Posted November 8 Author Posted November 8 4 hours ago, silent said: Какого-то явного ограниченя нет. Хотелось бы глянуть на код, чтобы у нас была возможность повторить такое же поведения на нашей стороне и понять что происходит. Сходу повторить не получилось. Сейчас в отладке заметил, что проблема скорей в экземпляре Image, но приложение сразу же вылетает, как только я пытаюсь узнать его содержимое. При этом код может довольно долго работать корректно (около 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; }
silent Posted November 11 Posted November 11 А что у вас за текстурка используется? Попробуйте при импорте текстуры курсора в редактор использовать unchanged опцию, чтобы для неё не создавался сжатый рантайм. Возможно, это и является причиной падений. При использовании несжатых RGB8 / RGBA8 текстур падение повторить не удалось. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN
sityrax Posted November 11 Author Posted November 11 4 hours ago, silent said: А что у вас за текстурка используется? Попробуйте при импорте текстуры курсора в редактор использовать unchanged опцию, чтобы для неё не создавался сжатый рантайм. Возможно, это и является причиной падений. При использовании несжатых RGB8 / RGBA8 текстур падение повторить не удалось. К сожалению, включение опции Uncahnged не помогло. Так же пробовал сконвертировать .png в .texture, но это тоже не дало результата. Параметры текстуры были следующие: Так же заметил, что такая проблема появляется только при попытке менять курсор при наведении на виджеты. Пробовал запускать отдельно скрипт, который меняет курсор при наведении на объекты сцены и с ним такого не случалось. Еще заметил, что после отключения курсора при отладке экземпляр Image ломается еще до вызова метода: public void SetCursor(Image cursorImage, PixelCoordinate activePoint)
silent Posted November 12 Posted November 12 К сожалению, на своей стороне мы не можем повторить падения (ни на 2.17 ни на 2.19). Удалось воспроизвести только случай с тем, что после какого-то периода времени курсор сбрасывается в стандартный и больше не меняется (похоже просто на баг). Можете скинуть небольшой тестовый проект с вашей иконкой курсора и виджетами с которыми происходит поиск пересечения? Чтобы был полный код который нужен для воспроизведения именно падения. Спасибо. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN
sityrax Posted November 13 Author Posted November 13 23 hours ago, silent said: Удалось воспроизвести только случай с тем, что после какого-то периода времени курсор сбрасывается в стандартный и больше не меняется Да. Это оно и есть. Только после того как пропал курсор, нужно поставить breakpoint где-нибудь рядом с вызовом метода SetCursor и подключиться отладчиком. Когда точка останова сработает, навестись курсором на переменную типа Image и приложение упадет... Ну у меня оно во всяком случае падает. Высылаю проект для тестирования. Widget_test.rar 1
silent Posted November 14 Posted November 14 Глянули проект, спасибо. Получается что падает только при попытке глянуть в Image у курсора, но если он пропадает, то там остается ссылка на какую-то битую память и всё падает. Если не пытаться просмотреть в бряке этот Image, то и падений не будет. Есть подозрение, что после починки бага с курсором в движке, брейкпоинт на этот Image тоже не будет падать, т.к. тут сам дебаггер завершает процесс движка. К сожалению, каких-то путей обхода этого бага ни в 2.17, ни в 2.19 найти не удалось. 1 How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN
Recommended Posts