13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

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

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

» Game Observer / Дайджест XGM 10-17 июля

Clamp's Physics Engine
Наработка сложной системы зарядов, с учетом всех законов кинематики.
Ссылка ведёт явно не туда.
13

» RenderEdge / [RenderEdge] Widescreen Fix

Обновление:
  • Добавлена поддержка патча 1.23a;
  • Фикс полосок здоровья теперь работает на всех патчах.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

Извиняюсь, забыл проверить выравнивание относительно других элементов UI. Исправлено. Также исправлено отображение неправильной версии RenderEdge (v0.2.2a) в левом верхнем углу.

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

  • Исправлено выравнивание относительно других элементов интерфейса.
Используемый код
function TestAlignment takes nothing returns nothing
    local integer parentId = 1000 // -1

    call CtrlNew(1000, 100, 200, 400, 400)
    call CtrlSetTexture(1000, "Textures\\white.blp")
    call CtrlSetColor(1000, 0xA0FFFFFF)

    call CtrlNew(1001,  0,   0,  64, 64) // TOPLEFT
    call CtrlNew(1002, -32,  0,  64, 64) // TOP
    call CtrlNew(1003, -64,  0,  64, 64) // TOPRIGHT
    call CtrlNew(1004,  0,  -32, 64, 64) // LEFT
    call CtrlNew(1005, -32, -32, 64, 64) // CENTER
    call CtrlNew(1006, -64, -32, 64, 64) // RIGHT
    call CtrlNew(1007,  0,  -64, 64, 64) // BOTTOMLEFT
    call CtrlNew(1008, -32, -64, 64, 64) // BOTTOM
    call CtrlNew(1009, -64, -64, 64, 64) // BOTTOMRIGHT

    call CtrlSetAlignment(1001, parentId, ALIGN_TOPLEFT)
    call CtrlSetAlignment(1002, parentId, ALIGN_TOP)
    call CtrlSetAlignment(1003, parentId, ALIGN_TOPRIGHT)
    call CtrlSetAlignment(1004, parentId, ALIGN_LEFT)
    call CtrlSetAlignment(1005, parentId, ALIGN_CENTER)
    call CtrlSetAlignment(1006, parentId, ALIGN_RIGHT)
    call CtrlSetAlignment(1007, parentId, ALIGN_BOTTOMLEFT)
    call CtrlSetAlignment(1008, parentId, ALIGN_BOTTOM)
    call CtrlSetAlignment(1009, parentId, ALIGN_BOTTOMRIGHT)
endfunction
13

» RenderEdge / [RenderEdge] Widescreen Fix

выступает в качестве платформы для проверки тех или иных знаний
Именно. Я начал этот проект, потому что мне это было интересно, затем я стал использовать его в качестве платформы для реализации своих знаний, для своего собственного развития.
На данный у меня есть две цели: перенести тени и пост-эффекты из экспериментальной версии в основную и реализовать полноценный фикс интерфейса для широкоформатных мониторов. После этого работа над модом будет закончена, и я выложу исходники проекта.
Сейчас я сосредоточен на модификации стандартного интерфейса варкрафта, вот что имею на данный момент:
Сначала весь интерфейс будет перенесён в левую часть экрана, а затем выровнен по центру.
А здесь полностью скрыт стандартный интерфейс (включая чёрные полосы), кроме миникарты, расположение которой было изменено:
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

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

  • Добавлена новая native функция CtrlSetSize;
  • добавлена новая native функция CtrlSetAlignment;
  • Функции CtrlSetPosition и CtrlNew теперь принимают offsetX и offsetY вместо x и y;
  • Удалена функция CtrlSetRect.
Видео - демонстрация графического интерфейса и управления камерой:

Использование функции ​Ctrl​Set​Alignment

Используемый код
private function TestAlignment takes nothing returns nothing
    call CtrlNew(1001,  0,   0,  64, 64) // TOPLEFT
    call CtrlNew(1002, -32,  0,  64, 64) // TOP
    call CtrlNew(1003, -64,  0,  64, 64) // TOPRIGHT
    call CtrlNew(1004,  0,  -32, 64, 64) // LEFT
    call CtrlNew(1005, -32, -32, 64, 64) // CENTER
    call CtrlNew(1006, -64, -32, 64, 64) // RIGHT
    call CtrlNew(1007,  0,  -64, 64, 64) // BOTTOMLEFT
    call CtrlNew(1008, -32, -64, 64, 64) // BOTTOM
    call CtrlNew(1009, -64, -64, 64, 64) // BOTTOMRIGHT

    call CtrlSetAlignment(1001, -1, ALIGN_TOPLEFT)
    call CtrlSetAlignment(1002, -1, ALIGN_TOP)
    call CtrlSetAlignment(1003, -1, ALIGN_TOPRIGHT)
    call CtrlSetAlignment(1004, -1, ALIGN_LEFT)
    call CtrlSetAlignment(1005, -1, ALIGN_CENTER)
    call CtrlSetAlignment(1006, -1, ALIGN_RIGHT)
    call CtrlSetAlignment(1007, -1, ALIGN_BOTTOMLEFT)
    call CtrlSetAlignment(1008, -1, ALIGN_BOTTOM)
    call CtrlSetAlignment(1009, -1, ALIGN_BOTTOMRIGHT)
endfunction
constant integer ALIGN_TOPLEFT = 0
constant integer ALIGN_TOP = 1
constant integer ALIGN_TOPRIGHT = 2
constant integer ALIGN_LEFT = 3
constant integer ALIGN_CENTER = 4
constant integer ALIGN_RIGHT = 5
constant integer ALIGN_BOTTOMLEFT = 6
constant integer ALIGN_BOTTOM = 7
constant integer ALIGN_BOTTOMRIGHT = 8

native CtrlSetAlignment takes integer id, integer parentId, integer alignment returns nothing
Чтобы выравнивание шло относительно всего окна, установите parentId равным -1.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

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

  • Добавлена новая native функция IsGamePaused;
  • Добавлена новая native функция SetBlackBorders;
  • Обновлен Jass API, исправлены некоторые баги связанные с пользовательскими нативными функциями;
  • Исправлены нативные функции, которые принимают аргументы типа boolean;
  • Исправлено повторное добавление триггеров функциями TriggerRegister#Event после перезапуска карты;
  • Функция EnableVsync теперь работает без необходимости сворачивать игру;
  • Исправлена ошибка, при которой новые элементы GUI не имели зеленой текстуры по умолчанию;
  • Улучшен debug log. Лог файл очищается, если размер превышает 100 КБ.
Теперь вы можете изменить черные границы динамически:
Чтобы скрыть чёрные полосы сверху и снизу, вызовите функцию SetBlackBorders(float upper, float bottom), где upper и bottom установите равными 0.0. Значения по умолчанию: upper = -0.02, bottom = 0.13.
13

» WarCraft 3 / какие есть способы сделать освещение в варике

Gerych, можно запекать тени в 3ds max, об этом писал Talavaj с hiveworkwhop, сейчас поищу.
Вот несколько ссылок:
На следующих страницах должно быть ещё больше описания того, как это реализовать.
13

» WarCraft 3 / какие есть способы сделать освещение в варике

Полностью динамические тени стандартными средствами сделать невозможно. Но можно использовать сторонние модификации игры:
Предупреждаю, тени работают очень плохо, оптимизации нет, игра может вылететь в произвольный момент!
13

» WarCraft 3 / Как создать программу для подключения своих mpq к Warcraft...

HMODULE address_StormBase;
uintptr_t address_OpenArchive;

template <typename ReturnType, typename FPType, typename A0, typename A1, typename A2, typename A3>
inline ReturnType std_call(FPType fp, A0 a0, A1 a1, A2 a2, A3 a3)
{
	typedef ReturnType(__stdcall *TFPAeroFunction)(A0 a0, A1 a1, A2 a2, A3 a3);
	return ((TFPAeroFunction)fp)(a0, a1, a2, a3);
}

int SFile_OpenArchive(const char* archiveName, DWORD dwPriority, DWORD dwFlags, HANDLE* pArchiveHandle)
{
	return std_call<int>(address_OpenArchive, archiveName, dwPriority, dwFlags, pArchiveHandle);
}

uint32_t mpqLoadPriority = 15;
void OpenArchive(const std::string& fileName, HANDLE* hMpq)
{
	SFile_OpenArchive(fileName.c_str(), mpqLoadPriority, 0, hMpq);
	mpqLoadPriority++;
}

void main()
{
	address_StormBase = GetModuleHandle("Storm.dll");
	address_OpenArchive = (uintptr_t)GetProcAddress(address_StormBase, "266");

	HANDLE myMpqHandle;
	OpenArchive("MyArchive.mpq", &myMpqHandle);
}
13

» WarCraft 3 / Патч 1.28.2

quq_CCCP, самое главное изменение - снизили задержку между приказами с 250 миллисекунд до 100.
13

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

Обновление 0.2.1b

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

» RenderEdge / [RenderEdge] Экспериментальная версия

Сколько объектов в кадре, сколько памяти используется?
Попробуй ещё выключить Туман Войны и стандартное освещение на вкладках Directional Light и Sky Light (Default Color, Default Direction).
13

» RenderEdge / [RenderEdge] Экспериментальная версия

Xin, что включено? Тени, пост-эффекты, IBL, PBS? Сколько объектов в кадре, сколько памяти используется?
Попробуй ещё выключить Туман Войны и стандартное освещение на вкладках Directional Light и Sky Light (Default Color, Default Direction).
Загруженные файлы
13

» RenderEdge / [RenderEdge] Экспериментальная версия

EfReeZe, это AntTweakBar так работает с дискретной видеокартой. У меня были такие же лаги при движении курсора, когда я случайно сбросил настройки BIOS, тем самым включив дискретную видеокарту Intel HD Graphics 4000. От этой проблемы я избавлюсь только после того, как перенесу весь функционал экспериментальной версии RenderEdge в основную, то есть откажусь от пользовательского интерфейса AntTweakBar. А пока можно просто нажать на F9, чтобы отключить AntTweakBar.

Xin, Narkranoth, пока тени жрут очень много памяти, при этом игра может вылететь при превышения определённого лимита (у меня это 2000 Мб). На данный момент для каждого объекта на сцене создаётся свои буферы вершин и индексов, они и занимают всё это место в памяти. Я так делаю из-за того, что у меня нет прямого доступа к информации об объектах на сцене, но я пытаю оптимизировать процесс перехвата данной информации. По-хорошему нужно создать только один буфер вершин и один буфер индексов, чтобы хранить в них всех юнитов, но пока у меня ничего не получается.
Также на производительность влияет и то, что я рендерю каждый объект по отдельности, то есть делаю что-то вроде этого:
for each (MESH mesh in allMeshes)
{
	g_pStandardFX->Begin();
	mesh->Render();
	g_pStandardFX->End();
}
А надо так:
g_pStandardFX->Begin();
for each (MESH mesh in allMeshes)
{
	mesh->Render();
}
g_pStandardFX->End();
И всё это из-за той же самой проблемы: "у меня нет прямого доступа к информации об объектах на сцене".
В общем, мне очень нужна помощь людей, которые разбираются в reverse engineering'е динамических библиотек. Всё, что мне нужно на данный момент - найти в game.dll структуру игровых объектов, это решит все проблемы, которые имеются на данный момент.

Xin, на какой карте происходят сильные лаги, сколько объектов находится в кадре? У меня мобильная видеокарта NVS 5200M, но на карте, которую я приложил к экспериментальной версии, выдаёт 100 FPS с включенными тенями.
13

» RenderEdge / [RenderEdge] Экспериментальная версия

PrincePhoenix, спасибо, конечно, но я не очень нуждаюсь в пожертвованиях. Публиковать кошелёк не буду, но если очень хочется поддержать, то лучше написать мне в ЛС.
13

» RenderEdge / [RenderEdge] Экспериментальная версия

Кристофер, ещё планирую сделать туман пост-эффектом. Это позволит сделать плавный переход от земли к небу, так как на данный момент туман выглядит так:
13

» WarCraft 3 / Как реализовать адекватный рикошет от клифов?

Самое главное - получить нормаль, вот некоторые функции, которые тебе пригодятся:
float3 GetNormal(float3 a, float3 b, float3 c)
{
	float wrki;
	float3 v1 = float3.create();
	float3 v2 = float3.create();
	float3 normal = float3.create();

	v1.x = a.x - b.x;
	v1.y = a.y - b.y;
	v1.z = a.z - b.z;

	v2.x = b.x - c.x;
	v2.y = b.y - c.y;
	v2.z = b.z - c.z;

	wrki = SquareRoot(sqr(v1.y * v2.z - v1.z * v2.y) + sqr(v1.z * v2.x - v1.x * v2.z) + sqr(v1.x * v2.y - v1.y * v2.x));
	normal.x = (v1.y * v2.z - v1.z * v2.y) / wrki;
	normal.y = (v1.z * v2.x - v1.x * v2.z) / wrki;
	normal.z = (v1.x * v2.y - v1.y * v2.x) / wrki;

	return normal;
}

float DotProduct(float3 v1, float3 v2)
{
	return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
}

float3 Reflect(float3 ray, float3 normal)
{
	return -2 * DotProduct(ray, normal) * normal + ray;
}
Далее в функции движения снаряда определяем столкновение с землёй, получаем нормаль и строим вектор отражения по данной нормали и текущей скорости снаряда:
float3 v1 = float3.New(curPos.x+2, curPos.y+2, GetTerrainZ(curPos.x+2, curPos.y+2));
float3 v2 = float3.New(curPos.x+2, curPos.y, GetTerrainZ(curPos.x+2, curPos.y));
float3 v3 = float3.New(curPos.x, curPos.y+2, GetTerrainZ(curPos.x, curPos.y+2));
float3 normal = GetNormal(v1, v2, v3);

float3 reflect = Reflect(curVelocity, normal);