Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд Как найти ViewMatrix + Реализацию WorldToScreen

Пользователь
Пользователь
Статус
Оффлайн
Регистрация
2 Ноя 2024
Сообщения
263
Реакции
31
Народ, кто плотно ковырял кс 1.6 поймут.
Реверсим hw.dll.
Далее переходим по адресу "aSoftwareValveS_3" или "aHalfLife_0".
Выше мы видим какой то класс получается и его функции.
Нас интересует "dd offset sub_893D0"
Вот пример того что там находится
1777392484444.png

Далее, заходим в эту функцию, что нас встречает:
1777392558947.png

Это функция, которая просто возвращает World_To_Screen.
Код:
Expand Collapse Copy
BOOL __cdecl sub_893D0(float *a1, float *a2)
{
  return sub_7E080(a1, a2);
}
Это ее псевдо.
Заходим в функцию которую она возвращает "sub_7E080"

Внимание, псевдо:
псевдо:
Expand Collapse Copy
BOOL __cdecl sub_7E080(float *a1, float *a2)
{
  double v3; // st7
  double v4; // st6
  double v5; // st7
  double v6; // st6
  float v8; // [esp+0h] [ebp-4h]
  float v9; // [esp+Ch] [ebp+8h]
  float v10; // [esp+10h] [ebp+Ch]

  v8 = flt_EC9780 * *a1 + flt_EC97A0 * a1[2] + flt_EC9790 * a1[1] + flt_EC97B0;
  v3 = flt_EC9784 * *a1;
  v4 = flt_EC97A4 * a1[2];
  *a2 = v8;
  v10 = v3 + v4 + flt_EC9794 * a1[1] + flt_EC97B4;
  v5 = flt_EC978C * *a1;
  v6 = flt_EC97AC * a1[2];
  a2[1] = v10;
  v9 = v5 + v6 + flt_EC979C * a1[1] + flt_EC97BC;
  if ( v9 != 0.0 )
  {
    v9 = 1.0 / v9;
    *a2 = v8 * v9;
    a2[1] = v10 * v9;
  }
  return v9 <= 0.0;
}

Оу май, тут мы видим ЦЕЛУЮ РЕАЛИЗАЦИЮ World To Screen`a А так же оффсет на матрицу, конкретно он тут в "EC9780" (Самый первый).
Я бы понял валв, но меня очень смутило то что они для каждого флоата матрицы сделали отдельный адрес... ну и похуй.
Теперь у вас есть ViewMatrix и точный World To Screen.
Вот читаемая версия WorldToScreen.

Читаема:
Expand Collapse Copy
bool WorldToScreen(const float* world_position, float* screen_position)
{
    const float* matrix = view_matrix; // глобальная матрица 4x4

    float x = matrix[0] * world_position[0] + matrix[4] * world_position[2] + matrix[8] * world_position[1] + matrix[12];
    float y = matrix[1] * world_position[0] + matrix[5] * world_position[2] + matrix[9] * world_position[1] + matrix[13];
    float z = matrix[2] * world_position[0] + matrix[6] * world_position[2] + matrix[10] * world_position[1] + matrix[14];

    screen_position[0] = x;
    screen_position[1] = y;

    if (z == 0.0f)
    {
        return false;
    }

    float inv_z = 1.0f / z;
    screen_position[0] = x * inv_z;
    screen_position[1] = y * inv_z;

    return z > 0.0f;
}
 
Назад
Сверху Снизу