Пользователь
- Статус
- Оффлайн
- Регистрация
- 2 Ноя 2024
- Сообщения
- 263
- Реакции
- 31
Народ, кто плотно ковырял кс 1.6 поймут.
Реверсим hw.dll.
Далее переходим по адресу "aSoftwareValveS_3" или "aHalfLife_0".
Выше мы видим какой то класс получается и его функции.
Нас интересует "dd offset sub_893D0"
Вот пример того что там находится
Далее, заходим в эту функцию, что нас встречает:
Это функция, которая просто возвращает World_To_Screen.
Это ее псевдо.
Заходим в функцию которую она возвращает "sub_7E080"
Внимание, псевдо:
Оу май, тут мы видим ЦЕЛУЮ РЕАЛИЗАЦИЮ World To Screen`a А так же оффсет на матрицу, конкретно он тут в "EC9780" (Самый первый).
Я бы понял валв, но меня очень смутило то что они для каждого флоата матрицы сделали отдельный адрес... ну и похуй.
Теперь у вас есть ViewMatrix и точный World To Screen.
Вот читаемая версия WorldToScreen.
Реверсим hw.dll.
Далее переходим по адресу "aSoftwareValveS_3" или "aHalfLife_0".
Выше мы видим какой то класс получается и его функции.
Нас интересует "dd offset sub_893D0"
Вот пример того что там находится
Далее, заходим в эту функцию, что нас встречает:
Это функция, которая просто возвращает World_To_Screen.
Код:
BOOL __cdecl sub_893D0(float *a1, float *a2)
{
return sub_7E080(a1, a2);
}
Заходим в функцию которую она возвращает "sub_7E080"
Внимание, псевдо:
псевдо:
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.
Читаема:
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;
}