[RenderEdge] Основная версия

» опубликован

Актуальная версия v0.2.7a

Особенности

  1. Система отрисовки пользовательского интерфейса:
    • (+) Основная система;
    • (+) Управление при помощи Jass функций;
    • (+) Поддержка многострочного текста с форматированием;
    • (+) Поддержка .ttf формата шрифтов;
  1. Постобработка:
    • (-) HDR Rendering;
    • (-) Пост-эффекты;
    • (-) Управление при помощи Jass функций;
  1. Улучшенное освещение:
    • (-) Попиксельное освещение;
    • (-) Поддержка .dds/.blp2 формата текстур для .mdx/.mdl моделей;
    • (-) Поддержка пользовательских шейдеров;
    • (-) Генерация кубических карт окружения;
    • (-) Shadow Mapping;
    • (-) Поддержка карт нормалей;
  1. Совместимость:
    • (+) Поддержка Direct3D8;
    • (+) Поддержка Direct3D9;
    • (+) Поддержка широкоформатных мониторов;
  1. Прочее:
    • (+) Уменьшение задержки между приказами в игре;
    • (+) Запуск более одного экземпляра war3.exe одновременно.

Скриншоты

Custom Natives

» Дополнительные константы
// TriggerRegisterMouseEvent & TriggerRegisterKeyEvent
constant integer MB_Left = 0
constant integer MB_Middle = 1
constant integer MB_Right = 2
constant integer MB_X1 = 3
constant integer MB_X2 = 4
constant integer KEY_Any = -1
constant integer EVENT_Down = 0
constant integer EVENT_Up = 1

// CtrlSetAnchor & SetPortrait
constant integer ANCHOR_TOPLEFT = 0
constant integer ANCHOR_TOP = 1
constant integer ANCHOR_TOPRIGHT = 2
constant integer ANCHOR_LEFT = 3
constant integer ANCHOR_CENTER = 4
constant integer ANCHOR_RIGHT = 5
constant integer ANCHOR_BOTTOMLEFT = 6
constant integer ANCHOR_BOTTOM = 7
constant integer ANCHOR_BOTTOMRIGHT = 8
» Mouse API
native int GetMouseX() // Возвращает положение курсора в экранных координатах
native int GetMouseY()
native int GetMouseXRelative()
native int GetMouseYRelative()
native float GetMouseTerrainX() // Возвращает проекцию позиции курсора на ландшафт
native float GetMouseTerrainY()
native float GetMouseTerrainZ()
native bool IsMouseOverUI() // Находится ли курсор над стандартным интерфейсом или нет?
native void BlockMouse(bool bBlock) // Блокирует входные сообщения от мыши (перемещение, нажатия), передаваемые в игру
native int GetWheelDelta() // Возвращает направление/скорость вращения колёсика мыши (положительное значение указывает на то, что колесо вращается вперед)
native void SetMousePos(int x, int y) // Устанавливает положение курсора
native void TriggerRegisterMouseWheelEvent(trigger trig) // Триггер срабатывает при прокрутки колёсика мыши
native void TriggerRegisterMouseMoveEvent(trigger trig) // Триггер срабатывает при перемещении курсора
native void TriggerRegisterMouseEvent(trigger trig, int iButton, int state) // Триггер срабатывает при нажатии (state == 0) / отпуске (state == 1) кнопки iButton (поставьте iButton == -1, чтобы отлавливать все кнопки мыши)
» Keyboard API
native int GetTriggerKey() // Возвращает последнюю нажатую клавишу
native bool IsKeyDown(int iKey) // Нажата ли клавиша?
native void TriggerRegisterKeyEvent(trigger trig, int iKey, int state) // Триггер срабатывает при нажатии (state == 0) / отпуске (state == 1) клавиши iKey (поставьте iKey == -1, чтобы отлавливать любые клавиши)
» Window API
native int GetWindowWidth() // Возвращает ширину экрана в полноэкранном режиме, либо ширину окна в оконном
native int GetWindowHeight()
native int GetWindowX() // Возвращает координаты окна
native int GetWindowY()
native void TriggerRegisterWindowResizeEvent(trigger trig) // Триггер срабатывает при изменении размера окна
» GUI API
native void CtrlNew(int id, int offsetX, int offsetY, int width, int height) // Создаёт новый экземпляр элемента GUI (id >= 0)
native void CtrlSetText(int id, string text, bool bWrap) // bWrap: если текст заходит за пределы ширины, заданной при создании элемента GUI, то происходит переход на новую строку
native void CtrlSetColor(int id, int argb) // Красит элемент GUI в заданный цвет
native void CtrlSetAnchor(int id, int parentId, int anchor) // Выравнивание элемента. Установите parentId = -1, чтобы выравнивание шло относительно всего окна
native void CtrlSetTexture(int id, string filename) // Устанавливает текстуру элемента
native void CtrlSetSize(int id, int width, int height) // Устанавливает размер элемента. Функция не изменяет ширину или высоту, если установить соответствующий аргумент равным -1;
native void CtrlSetPosition(int id, int offsetX, int offsetY) // Устанавливает позицию элемента
native void CtrlShow(int id, bool isShow) // Показывает (true) / скрывает (false) элемент GUI
native void CtrlSetDepth(int id, float fDepth) // Определяет порядок поиска элементов GUI функцией CtrlGetFromMousePoint. Чем значение fDepth меньше, тем элемент расположен ближе к экрану (1.0 по умолчанию)
native void CtrlSetAngle(int id, float fAngle) // Устанавливает угол поворота элемента GUI (в радианах)
native int CtrlGetWidth(int id)
native int CtrlGetHeight(int id) // Используется, чтобы узнать высоту элемента GUI после применения функции CtrlSetText с аргументом "bWrap" == true
native int CtrlGetFromPoint(int x, int y) // Возвращает элемент, расположенный по заданным координатам (если такого нет, возвращает -1)
native bool CtrlIsText(int id) // Является ли элемент GUI текстом?
native void CtrlSetFont(int id, string fontName, int size) // Устанавливает шрифт для указанного элемента GUI (по умолчанию используется "Consolas" с размером 13)
native void GUILoadFont(string fileName) // Загружает шрифт по указанному пути в память
» Misc API
native float GetFPS() // Возвращает количество кадров в секунду
native float GetDeltaTime() // Возвращает количество времени, затрачиваемое на отрисовку одного кадра (в секундах)
native int COLOR_ARGB(int a, int r, int g, int b) // Переводит цвет из ARGB формата в шестнадцатеричное значение
native void EnableVsync(bool bEnable) // Включает/выключает вертикальную синхронизацию
native void TriggerRegisterFrameUpdateEvent(trigger trig) // Триггер срабатывает каждый кадр
native bool IsGamePaused() // Находится ли игра на паузе?
native void SetBlackBorders(float upper, float bottom) // Изменяет расположение чёрных границ по оси y (значения находятся в промежутке от 0.0 до 0.6). Значения по умолчанию - upper = -0.02, bottom = 0.13.
native void SetPortrait(int anchor, int x, int y, int width, int height) // Устанавливает расположение и ширину портрета в пикселях. Выравнивание идёт относительно всего окна.
» Lighting API
N/A
» Post-processing API
N/A

Установка


Требования:

  • Архив можно извлечь в любое место;
  • При первом запуске нужно указать расположение war3.exe;
  • Индикатором того, что мод был успешно запущен, является надпись "RenderEdge" с текущей версией мода в левом верхнем углу экрана;
  • Для запуска в режиме отладки измените значение параметра "Debug" на "1" (HKEY_CURRENT_USER\SOFTWARE\RenderEdge);
  • Для подключения RenderEdge к Jass New Gen Pack (exp. 2) скачайте и замените файл wehack.lua в папке с JNGP (заменяет вкладку с RtC). Либо отредактируйте его самостоятельно:
» wehack.lua
Пример того, как выглядит wehack.lua после редактирования
-- # begin RenderEdge #
RenderEdgePath = grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "InstallPath")
haveRenderEdge = grim.exists(RenderEdgePath .. "\\RenderEdge.exe")

function toggleRenderEdgeDebug(checked)
    if checked then
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 1)
	else
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 0)
	end
end

function toggleRenderEdgeAllowLocalFiles(checked)
    if checked then
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "AllowLocalFiles", 1)
	else
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "AllowLocalFiles", 0)
	end
end

if haveRenderEdge then
	RenderEdgeMenu = wehack.addmenu("RenderEdge")
	
	RenderEdgeEnabled = TogMenuEntry:New(RenderEdgeMenu, "Run with RenderEdge", nil, true)
	
	RenderEdgeDebug = TogMenuEntry:New(RenderEdgeMenu, "Debug Mode", 
	    function(self) toggleRenderEdgeDebug(self.checked) end, false)
	if grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug") == 1 then
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 1)
	else
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 0)
	end
	
	RenderEdgeAllowLocalFiles = TogMenuEntry:New(RenderEdgeMenu, "Allow Local Files", 
	    function(self) toggleRenderEdgeAllowLocalFiles(self.checked) end, false)
	if grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "AllowLocalFiles") == 1 then
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeAllowLocalFiles, 1)
	else
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeAllowLocalFiles, 0)
	end
end
-- # end RenderEdge #

function testmap(cmdline)
	if haveRenderEdge and RenderEdgeEnabled.checked then
		local pos = string.find(cmdline, ".exe")
		cmdline = string.sub(cmdline, 5 + pos)
		cmdline = RenderEdgePath .. "RenderEdge.exe " .. cmdline
	end
	
	if wh_opengl.checked then
		cmdline = cmdline .. " -opengl"
	end
	if wh_window.checked then
		cmdline = cmdline .. " -window"
	end
	wehack.execprocess(cmdline)
end

Примеры

Карта написана на vJass и содержит демонстрацию использования всех функций RenderEdge. Карта обновляется каждый раз, при выпуске новой версии RenderEdge.
Особенности карты:
  • Система пользовательского интерфейса (виджеты: Label, Button, Dragbox, Checkbox, Horizontal Slider);
  • Редактирование стандартного интерфейса;
  • Система управления камерой.

Список изменений

v0.2.7a
  * Обновлён RenderStage Controller (улучшен перехват отрисовки стандартного интерфейса);
  * Исправлены баги в JassAPI (некорректная конвертация real <=> float);
  * Исправлены баги в функциях CtrlSetDepth и CtrlSetAngle;
  * Исправлены слайдеры и чекбоксы в карте-примере;
  * Добавлены описания .exe и .dll файлов.

v0.2.6a
  * Убран лимит на размер 512p в .blp тексурах (спасибо Karaulov`у);
  * Добавлена новая native функция CtrlSetZOrder (порядок отрисовки элементов интерфейса);
  * Добавлена новая native функция EnableAnisoFiltering (возможность установить анизотропную фильтрацию текстур);
  * Добавлена новая native функция HideInterface;
  * Добавлены новые native функции: EditMinimap, EditCommandBarButton, EditHeroBarButton, EditItemBarButton, EditMinimapButton и EditUpperButtonBarButton;
  * Изменено название функций SetPortrait и SetBlackBorders на EditPortrait и EditBlackBorders;
  * Исправлено большое количество багов в RenderEdge_loader.dll и RenderEdge.exe;
  * Исправлен некорректный перенос строки при использовании символа "|n" во wrapped тексте;
  * Исправлено большое количество багов в GUI-системе (например, баг с функцией CtrlSetTexture при перезапуске карты);
  * Оптимизирована GUI-система. Некоторые функции переписаны с нуля;
  * Оптимизированы менеджеры шрифтов и текстур;
  * Обновлены detours.lib и libjpeg.lib до последней версии;
  * Улучшен и оптимизирован debug log.

v0.2.5a
  * Добавлена новая native функция GUILoadFont;
  * Добавлена новая native функция CtrlSetFont;
  * Удалена функция GUISetFont;
  * Исправлены вылеты при установке некоторых шрифтов (например, "Times New Roman");
  * Исправлена высота однострочного текста;

v0.2.4a
  * Добавлена новая native функция SetPortrait;
  * Функция CtrlSetSize теперь не изменяет ширину или высоту, если вы установите соответствующий аргумент равным -1;
  * Изменено имя функции CtrlSetAlignment на CtrlSetAnchor;
  * Изменён способ исправления ширины полосок здоровья;
  * Исправлено выравнивание динамических элементов по отношению к другим элементам пользовательского интерфейса;
  * Исправлена высота wrapped текста;
  * Исправлена высота wrapped текста при динамическом изменении ширины;
  * Исправлены проблемы с безопасностью. Если жирный, курсивный или полужирный курсивный шрифт недоступен, используется обычный шрифт.

v0.2.3b
  * Исправлено выравнивание относительно других элементов интерфейса.

v0.2.3a
  * Добавлена новая native функция CtrlSetSize;
  * добавлена новая native функция CtrlSetAlignment;
  * Функции CtrlSetPosition и CtrlNew теперь принимают offsetX и offsetY вместо x и y;
  * Удалена функция CtrlSetRect.

v0.2.2a
  * Добавлена новая native функция IsGamePaused;
  * Добавлена новая native функция SetBlackBorders;
  * Обновлен Jass API, исправлены некоторые баги связанные с пользовательскими нативными функциями;
  * Исправлены нативные функции, которые принимают аргументы тира boolean;
  * Исправлено повторное добавление триггеров функциями TriggerRegister#Event после перезапуска карты;
  * Функция EnableVsync теперь работает без необходимости сворачивать игру;
  * Исправлена ошибка, при которой новые элементы GUI не имели зеленой текстуры по умолчанию;
  * Улучшен debug log. Лог файл очищается, если размер превышает 100 КБ.

v0.2.1b
  * Исправлены вылеты при вызове функций CtrlSetText, CtrlSetTexture и GUISetFont (проблема с конвертацией UTF-8 в ASCII);
  * Удалено нестабильное нововведение из предыдущей версии: "Убрано стандартное ограничение минимальной дистанции камеры до цели";
  * Обновлён FreeType до версии 2.8;
  * Обновлён RenderEdge_loader.dll. Теперь он ищет RenderEdge_exp.dll, если не нашёл, то запускает RenderEdge.dll;
  * Добавлен счётчик памяти, используемой варкрафтом;
  * Оптимизация GUI системы;
  * Оптимизация Widescreen fix;
  * Оптимизация debug log. Система отладки переписана с нуля.

v0.2.1a
  * Обновлён Widescreen Fix. Вертикальный угол обзора больше не зависит от ширины экрана;
  * Снято ограничение на максимальный FPS, теперь он может подниматься выше 64 с выключенным vsync (спасибо Karaulov'у);
  * Убрано стандартное ограничение минимальной дистанции камеры до цели (было 100.0, теперь можно установить до 0.01);
  * Использование более точного формата буфера глубины, если поддерживается. Используйте SetCameraField(ConvertCameraField(7), value, time), чтобы изменить ближнюю плоскость отсечения камеры (100.0 по умолчанию);
  * Добавлена новая native функция TriggerRegisterFrameUpdateEvent. Триггер срабатывает каждый кадр (задержка меньше 0.001 секунд);
  * Добавлена новая native функция EnableVsync (включено по умолчанию);
  * Добавлены новые native функции GetWindowX и GetWindowY;
  * Добавлены новые native функции GetMouseXRelative и GetMouseYRelative;
  * Функции GetMouseX и GetMouseY теперь возвращают координаты без отсечения границами окна;
  * Изменено название функции FPS на GetFPS;
  * Изменено название функции DeltaTime на GetDeltaTime;
  * Функция GetDeltaTime теперь возвращает секунды вместо миллисекунд;
  * Улучшен debug log. Лог файл очищается при превышении размера в 1 MB.

v0.2.0a
  * Поддержка Direct3D9;
  * Блокировка функции CtrlGetFromPoint, если игра на паузе;
  * Показ GUI только после загрузки карты;
  * Исправлен баг, связанный с тем, что ширина и высота текстур были перепутаны;
  * Исправлен слишком большой угол обзора при использовании Widescreen Fix;
  * Исправлена проблема, связанная с тем, что невозможно было запустить приложение с первой попытки;
  * Обновлён FreeType до версии 2.7;
  * Запуск более одного экземпляра war3.exe одновременно;
  * Оптимизация RenderEdge.dll;
  * Исправлены проблемы безопасности;
  * Обновлено лого проекта, и добавлен значок приложения;
  * Улучшен debug log;

v0.1.0a
  * Реализована поддержка широкоформатных мониторов;
  * Реализовано корректное получение информации из jass строки (поддержка всех языков, а не только английского);
  * Добавлена поддержка TTF шрифтов, используя FreeType (https://www.freetype.org/);
  * Добавлена поддержка многострочного текста и форматирования ("|n" (на новую строку), "|cAARRGGBB" (изменить цвет), "|b" (полужирный шрифт), "|i" (наклонный шрифт), "|r" (сброс к стандартному цвету текста и обычному шрифту));
  * Уменьшена задержка отдачи приказов юнитам в одиночной игре;
  * Исправлена проблема, связанная с невозможностью запустить RenderEdge после переустановки Warcraft по другому пути;
  * Изменено название функции CtrlCreateInstance на CtrlNew;
  * Изменена функция CtrlSetText(int id, bool autoResize, string text) на CtrlSetText(int id, string text, bool bWrap);
  * Изменена функция CtrlGetFromMousePoint() на CtrlGetFromPoint(int x, int y);
  * Добавлена новая native функция GUISetFont;
  * Добавлена новая native функция CtrlIsText;
  * Функция IsMouseOverUI теперь работает корректно;
  * Удалена функция CtrlSetSolidColor, вместо этого используйте белую текстуру ("Textures\\white.blp") и функцию CtrlSetColor(int argb);
  * Добавлен логотип проекта;
  * Уменьшен размер RenderEdge.mpq;
  * Улучшен debug log.

v0.0.3a
  * Реализовано чтение настроек из реестра;
  * Добавлены функции CtrlGetHeight и CtrlGetWidth для получения ширины элемента GUI после применения функции CtrlSetText с аргументом "autoResize" == true;
  * Исправлено растягивание полосок здоровья на широкоформатных экранах;
  * Отключена функция EnableDebug, теперь включение режима отладки осуществляется из редактора реестра;
  * Улучшена совместимость с JNGP;
  * Улучшен debug log.

v0.0.2b
  * Исправлена проблема, при которой не получалось запустить мод с первого раза;
  * Улучшен debug log.

v0.0.2a
  * Исправлена ошибка с загрузкой RenderEdge.mpq, теперь мод можно без проблем размещать в любой папке;
  * Исправлен баг в функции CtrlSetText, при котором все элементы GUI, использующие текстуру шрифта, имели одинаковый текст;
  * Изменена функция CtrlSetText - убран аргумент "argb", отвечающий за цвет создаваемого текста, вместо этого используйте функцию CtrlSetColor (текст по умолчанию белый);
  * Изменена функция CtrlSetDepth - тип аргумента "depth" изменён на real;
  * Добавлена новая native функция CtrlSetAngle;
  * Удалена функция CtrlSetCallback.

v0.0.1a
  * Первая стабильная версия.


Просмотров: 20 980



» Лучшие комментарии


Бордер #1 - 2 года назад 1
Разве всё это возможно без исходников движка? Надеюсь твой проект не замолчит в один прекрасный момент навсегда
Raised #2 - 2 года назад 1
native float GetMouseTerrainX()
native float GetMouseTerrainY()
native float GetMouseTerrainZ()
Это координаты проекции мыши с экрана на ланд?

native int GetWindowWidth()
native int GetWindowHeight()
Это в пикселях?

Можно ли с помощью этой штуки открутить стандартный UI и нарисовать свой?
ENAleksey #3 - 2 года назад (отредактировано ) 3
  1. Да
  2. Да
  3. Нарисовать свой поверх старого - запросто, а со скрытием стандартного - не помню точно, вроде бы, если скрыть его функцией EnableInterface, то и новый не будет рендерится, но лучше проверить (просто я сам не могу посмотреть - в поезде, на неделю в Питер еду).
Alexander12 #4 - 2 года назад 0
Круто)
Единственно, если перейдешь на ретурн баг то:
  1. Нужен микс/dll)
  2. Найти альтернативу нативкам. (Массивы ловятся тем-же ретурн багом)
Кет #5 - 2 года назад 0
Контролы создаются в экранных координатах, я так полагаю. А в каких единицах и где начало системы координат?
Raised #6 - 2 года назад (отредактировано ) 4
Кет, скорее всего верхний левый угол - (0;0) Это вроде как устоявшийся стандарт
darkowlom #7 - 2 года назад 1
GF RaiseD, это называется левосторонняя система координат
Bornikkeny #8 - 2 года назад 0
Меня всё беспокоит вопрос связанный с мультилеером. Пробовал синхронизовать данные игроков от GetMouseX,Y с помощью приказов, но нет. Всегда дизсинхронизация.
Alexander12 #9 - 2 года назад 0
Меня всё беспокоит вопрос связанный с мультилеером. Пробовал синхронизовать данные игроков от GetMouseX,Y с помощью приказов, но нет. Всегда дизсинхронизация.
приказы должно идти локально от игрока, а не стандартными функциями..
IceFog #10 - 2 года назад 0
Мод не работает.
Запускаю с правами администратора, InstallPath содержит путь к игре,
но сколько раз не перезапускай, тестовая карта не открывается.
ENAleksey #11 - 2 года назад 0
IceFog, не надо запускать от админа, если поставить соответствующую галочку в свойствах war3.exe, то при запуске RenderEdge.exe будет вылетать ошибка.
IceFog #12 - 2 года назад 0
У меня стояла галочка "запустить в режиме совместимости", которая и требовала права админа.
Убрал её и начало работать, но нестабильно. За 12 запусков успешно лишь 7.
Почему при запуске RenderEdge.exe или war3.exe с правами админа мод не работает?
ENAleksey #13 - 2 года назад (отредактировано ) 1
IceFog, сам не понимаю, но, кажется, я понял: до внедрения библиотеки нужно снимать ограничения на доступ. Это также должно решить проблему с запуском со второго раза. Сейчас не смогу проверить, через недельку посмотрю.
Bornikkeny #14 - 2 года назад 0
Alexander12, я тупой)
FistBlooD #15 - 2 года назад 0
Текст ни в какую не хочет отображаться, ни через приведенный в карте-примере GUI.Text ни самописным методом. И нативка IsMouseOverUI() всегда выдает true, независимо от того над каким гуишником находится, дефолтным либо кастомным.
ENAleksey #16 - 2 года назад (отредактировано ) 2
FistBlooD, а у меня текст создаётся:
GUI.Text(0.5, 0.5, 0.12, 0.04 * aspectRatio, "Test", 0xffffffff);
А с функцией IsMouseOverUI() действительно какая-то проблема. Хотя, если использовать её в библиотеке RenderEdge.dll, а не из игры, то всё работает правильно. И вообще что-то странное творится:
bool jNATIVE jIsMouseOverUI()
{
	return bIsMouseOverUI;
}
Что бы я не подставлял вместо bIsMouseOverUI, всегда возвращается true (даже если пишу false).
FistBlooD #17 - 2 года назад (отредактировано ) 0
ENAleksey, Может отображение текста требует каких либо редистрибутивов? На данный момент использую старенький ноут на котором пришлось обновлять семерку до SP1 для запуска RenderEdge. Соответственно редистов установлено по минимуму.
И еще заметил небольшой нюанс- GetMouseTerrainX() и его аналоги не обновляются если курсор находится над кастомным UI.
ENAleksey #18 - 2 года назад (отредактировано ) 2
Может отображение текста требует каких либо редистрибутивов?
Нет, текст рендерится точно так же, как и картинки. Скорее всего я где-то накосячил, и теперь мод не может найти и загрузить RenderEdge.mpq, в котором и лежит текстура шрифта. Решить проблему может перемещение всех файлов из папки RenderEdge в папку с варкрафтом.
FistBlooD:
GetMouseTerrainX() и его аналоги не обновляются если курсор находится над кастомным UI
Это я сделал специально для того, чтобы при нажатии на элементы кастомного гуи не выделялись юниты под ними. Чтобы это отключить, нужно найти в методах OnMouseMove, OnMouseDown и OnMouseUp функцию BlockMouse и закомментировать её.
native BlockMouse(bool bBlock) - блокирует входные сообщения от мыши (перемещение, нажатия), передаваемые в игру. Например, при наведении на иконки стандартного интерфейса, не будет появляться их описание.
FistBlooD #19 - 2 года назад 0
ENAleksey, Перемещение всего в папку с варом помогло. Теперь отображается на ура.
С мышой все понятно.
ENAleksey, Еще вопрос- текст доступен только в 1 экземпляре или я что-то делаю не так?
CtrlSetRect(texts[1].GetID(), mX + 16, mX + w, mY + 16, mY + 30)
CtrlSetText(texts[1].GetID(), false, nGetItemName(Slot[i]), nGetItemColor(Slot[i]));
            
CtrlSetRect(texts[2].GetID(), mX + 16, mX + w, mY + 32, mY + 44)
CtrlSetText(texts[2].GetID(), false, nGetItemLevel(Slot[i]), 0xFFFFFFFF);
И что из этого получается:
ENAleksey #20 - 2 года назад (отредактировано ) 2
FistBlooD, можете скинуть карту? Всё должно корректно работать, а может и нет... На данный момент текстом крайне неудобно пользоваться: нельзя изменить размер шрифта, нельзя писать на русском (хотя сам GUI поддерживает русский язык, вся проблема в преобразовании jass string в char*), нет поддержки форматирования строки.

Обновление v0.0.2a

Скачать RenderEdge.
Скачать тестовую карту.
  • Исправлена ошибка с загрузкой RenderEdge.mpq (теперь мод можно без проблем размещать в любой папке);
  • Исправлен баг в функции CtrlSetText, при котором все элементы GUI, использующие текстуру шрифта, имели одинаковый текст;
  • Изменена функция CtrlSetText - убран аргумент "argb", отвечающий за цвет создаваемого текста, вместо этого используйте функцию CtrlSetColor (текст по умолчанию белый);
  • Изменена функция CtrlSetDepth - тип аргумента "depth" изменён на real.
native void CtrlSetText(int id, bool autoResize, string text) // autoResize: если true, то элемент GUI подгоняется под введённую строку текста, иначе текст растягивается по размеру элемента GUI.
native void CtrlSetDepth(int id, float fDepth) // Определяет порядок поиска элементов GUI функцией CtrlGetFromMousePoint. Чем значение fDepth меньше, тем элемент расположен ближе к экрану (1.0 по умолчанию).
Кет #21 - 2 года назад 0
А шрифт какой используется? Вижу, что вроде не FritzQuadrata, как в варике стандартно, странное решение.
FistBlooD #22 - 2 года назад (отредактировано ) 3
ENAleksey, Проверю на работоспособность в 0.0.2а, но более чем уверен что проблема исчерпана.
За пару свободных минут перевел текст на новые функции, выглядит конечно не ахти, но допиливание внешнего вида дело времени. Главное что работает как надо. Ну и от русского текста на время придется избавиться.
ENAleksey #23 - 2 года назад (отредактировано ) 3
Кет, на данный момент использую bitmap font (название шрифта не знаю), так как чтение из него намного легче реализовать, чем писать целую систему для загрузки .ttf.
FistBlooD, да, у данного метода полно недостатков, и ситуация никак не изменится, пока я не реализую поддержку .ttf. Появилась идея использовать стандартные функции отрисовки текста, завтра буду пробовать реализовать вывод текста данным способом.

Кстати, полезна ли будет функция вращения элементов GUI? Просто я уже давно сделал такую возможность, осталось только добавить соответствующую нативку. И на данный момент контролы вращаются только относительно левой верхней вершины, надо будет исправить.

Кажется, я нашёл способ чтения русских символов из jass String, завтра проверю.
FistBlooD #24 - 2 года назад 0
ENAleksey, Думаю такая функция была бы удобна. Т.к. сейчас для каждого изображения угла и бордера используется отдельный экземпляр (верхний, нижний и т. п.) Да и в общем имела бы широкий спектр применения.
Кет #25 - 2 года назад 0
ENAleksey, тогда понятно =( Жду TTF, удачной разработки =)
ENAleksey #26 - 2 года назад (отредактировано ) 2

Обновление v0.0.2a (без изменения версии)

Скачать RenderEdge.dll
  • Добавлена новая native функция CtrlSetAngle.
native void CtrlSetAngle(int id, float fAngle) // устанавливает угол поворота элемента GUI (в радианах).
ENAleksey #27 - 2 года назад 4

Обновление v0.0.2b

Скачать RenderEdge.
Скачать тестовую карту.
  • Исправлена проблема, при которой не получалось запустить мод с первого раза;
  • Улучшен debug log.
ENAleksey #28 - 2 года назад (отредактировано ) 9
Обновил до версии v0.0.3a, скачать можно будет после утверждения новой версии ресурса. Об изменениях напишу завтра-послезавтра.
Потихоньку создаю проект на сайте, переделываю все накопившиеся ресурсы проекта.

Обновление v0.0.3a

  • Реализовано чтение настроек из реестра;
  • Добавлены функции CtrlGetHeight и CtrlGetWidth для получения ширины элемента GUI после применения функции CtrlSetText с аргументом "autoResize" == true;
  • Исправлено растягивание полосок здоровья на широкоформатных экранах;
  • Отключена функция EnableDebug, теперь включение режима отладки осуществляется из редактора реестра;
  • Улучшена совместимость с JNGP;
  • Улучшен debug log.
Tumart #29 - 2 года назад 0
ENAleksey, КРУТО! спасибо) А можно сделать чтоб курсор нормально отображался, поверх интерфейса или это в следующей версии?
ENAleksey #30 - 2 года назад (отредактировано ) 0
Tumart, курсор и так поверх интерфейса отображается. Если у вас курсор отображается под интерфейсом, скиньте, пожалуйста, скриншот с данной проблемой.
Tumart #31 - 2 года назад (отредактировано ) 0
ENAleksey, после сохранения карты в редакторе вообще перестало запускаться. Ни сохраненная карта, ни изначальная.
ENAleksey, запустил с другой папки все заработало, только вместо скрина рабочий стол..
Курсор по прежнему под нестандартным интерфейсом.
ENAleksey #32 - 2 года назад 0
Tumart, игра вылетает с ошибкой? Или что-то другое? Указали путь к war3.exe при первом запуске? Использовали ли whack.lua?
Tumart #33 - 2 года назад 0
ENAleksey, да все сделал по инструкции. Ошибок нет.
ENAleksey #34 - 2 года назад 0
Tumart, варкрафт не сможет захватит изображение, так что используйте стороннее решение, например, Fraps или ножницы Винды.
Tumart #35 - 2 года назад 0
ENAleksey, Вот
ENAleksey #36 - 2 года назад 0
Tumart, странно, такого быть точно не должно. Спасибо за то, что сообщили, буду исправлять. Позже свяжусь с вами, чтобы узнать поподробнее о том, из-за чего могла возникнуть проблема.
Пожалуйста, напишите, кто ещё пробовал запускать, есть ли у кого-нибудь такая же проблема?
Tumart #37 - 2 года назад 0
ENAleksey, низнаю я пока один пробывал.
Ige #38 - 2 года назад (отредактировано ) 0
  • Скачал RenderEdge и карту из шапки
  • Указал путь к варику при первом запуске
  • Запустил тестовую карту через варкрафт (не через редактор)
Tumart #39 - 2 года назад 0
Ige, в первый раз сделал также и все равно курсор был под интерфейсом.
Ige #40 - 2 года назад 2
Заметил вот такой небольшой баг
Навел мышку на юнита, а затем увел ее над кнопкой
ENAleksey #41 - 2 года назад 1
Ige, ну это не баг, просто, как я уже писал, я блокирую все сообщения, передаваемые в игру при наведении на элементы GUI. Если не хотите, чтобы это происходило, закомментируйте функцию BlockMouse в методе OnMouseMove. Либо при наведении на контрол нужно сначала отключить данную функцию, а затем сразу же включить, это должно исправить проблему, позже сам попробую.

Кстати, добавил описание каждой native функции.

Если после перезагрузки компьютера RenderEdge.exe снова требует указать путь к war3.exe, сообщите мне, такого быть не должно.
ENAleksey #42 - 2 года назад 0

Уезжаю отдыхать, обновлений месяц не будет.
Raised #43 - 2 года назад 0
ENAleksey, хорошо отдохнуть. Не дождался, удалился в UDK.
ScorpioT1000 #44 - 2 года назад (отредактировано ) 0
Почему не написать это как встроенную систему, нежели внешний exe/dll файл?) этот "вирус" никто не будет скачивать.
Почитай полезную информацию об эксплоите.
ENAleksey #45 - 2 года назад (отредактировано ) 0
ScorpioT1000, читал, Александр также постоянно уговаривает сделать всё внутри варкрафта, точнее карты. Но я уже решил делать всё в виде сторонней библиотеки, так как это намного легче, и не нужно тратить время на перевод всего кода на ассемблер, в коем я вообще не силён.
этот "вирус" никто не будет скачивать.
"ладно, да и я не особо рассчитывал, что моим модом кто-то будет пользоваться, всё делал ради улучшения своих навыков в программировании, компьютерной графике и reverse engineer'инге".
Почему не написать это как встроенную систему, нежели внешний exe/dll файл?)
Это уже сам Александр хотел делать, надеюсь, он поскорее возьмётся непосредственно за реализацию и доведёт дело до конца, не забросив всё на полпути.
Кристофер #46 - 2 года назад 0
этот "вирус" никто не будет скачивать.
Говори за себя. Я скачаю, когда более-менее сделают.
ScorpioT1000 #47 - 2 года назад (отредактировано ) 5
ENAleksey, я не знаю, кто такой Александр, но если дистрибьюция карт сейчас в этой игре, которой более 15 лет, почти на нуле, то у дистрибьюции твоего бинарника по сути вообще нет будущего. Либо тебе надо сделать какие-либо workaround'ы, чтобы игра (карта) могла работать и без твоих функций и это не было бы частью обязательного функционала. Например, сделать функции-обертки на jass, когда не работают wasd, использовать стрелки и т.п. Здесь надо довольно много думать.
Что касается UI, есть DGUI, я бы лучше копал в эту сторону, опять-же, можно сделать твой модуль UI как перформанс-буст для DGUI и чтобы оно продолжало работать без бинарника, но с ограничениями.
Кристофер, "Я" - в софтвейр продакшене понятие малозначительное =)
ENAleksey #48 - 2 года назад (отредактировано ) 0
я не знаю, кто такой Александр
надо сделать какие-либо workaround'ы, чтобы игра (карта) могла работать и без твоих функций и это не было бы частью обязательного функционала
Кастомные нативки и так не являются обязательными, кто хочет, тот их и использует. Я их добавил только ради удобства, основной же целью моего мода является улучшение графики игры (смотри список особенностей мода), что реализовать, используя ретурн баг, практически нереально. Также я работаю над расширенной экспериментальной версией RenderEdge, а особенности, которые в ней представлены, без сторонних расширений вообще не реализовать.
Вот все возможности двух версий RenderEdge, но они уже очень сильно устарели: www.hiveworkshop.com/threads/reverse-engineer-game-dll.268718/pa...
ScorpioT1000 #49 - 2 года назад 0
Кастомные нативки и так не являются обязательными, кто хочет, тот их и использует.
я имею ввиду, определение факта присутствия библиотеки в реальном времени
ENAleksey #50 - 2 года назад (отредактировано ) 0
ScorpioT1000, теперь понял. Но чем вас не устаревает текущий вариант? Можно конечно с помощью РБ в карте определять, установлен ли RenderEdge, и в зависимости от этого загружать в игру .dll или нет. Но зачем такие сложности? Намного легче просто запускать варкрафт через кастомный .exe файл, при этом игра не будет потреблять лишние ресурсы, если карта не использует возможности, предоставленные модом. Может я вас опять не так понял? Опишите, пожалуйста, поэтапно, как в идеале вы видите установку RenderEdge, создание карты с его использованием и её запуск.