Konctantin
12.12.2010, 17:10
Вот разбирался с ротацией ГО и дошел до упаковки данных этой структуры обратно в тип ulong, но в клиенте нашел только одну функцию, которая могла бы это сделать:
//----- (0041F2A0) --------------------------------------------------------
// PackedQuaternion
void *__thiscall sub_41F2A0(void *this, Quaternion *a2)
{
int _EDI; // edi@1
unsigned __int8 _CF; // cf@1
unsigned __int8 _ZF; // zf@1
signed int v8; // esi@2
void *result; // eax@4
float v12; // ST00_4@4
int v13; // eax@4
int v16; // ebx@4
float v17; // ST00_4@4
int v18; // ST14_4@4
signed __int64 _QAX; // qax@4
int v20; // ebx@4
__int64 _QT0; // qt0@4
int v22; // edi@4
float v23; // ST00_4@4
int v24; // eax@4
__int64 v25; // qax@4
int v26; // ebx@4
void *v27; // [sp+10h] [bp-8h]@1
__asm { xorps xmm0, xmm0 }
_EDI = (int)a2;
__asm { comiss xmm0, dword ptr [edi+0Ch] }
v27 = this;
if ( _CF | _ZF )
v8 = 1;
else
v8 = -1;
__asm
{
movss xmm0, dword ptr [edi+4]
mulss xmm0, ds:dword_AB2C64
movss [esp+18h+var_18], xmm0
}
v13 = v8 * sub_408BC0(v12);
__asm
{
movss xmm0, dword ptr [edi]
mulss xmm0, ds:dword_AB2C60
}
v13 &= 0x1FFFFFu;
v16 = v13;
__asm { movss [esp+18h+var_18], xmm0 }
v18 = (unsigned __int64)v13 >> 32;
_QAX = (signed __int64)(v8 * sub_408BC0(v17)) << 21;
v20 = _QAX | v16;
HIDWORD(_QT0) = HIDWORD(_QAX) | v18;
LODWORD(_QT0) = v20;
v22 = (unsigned __int64)(_QT0 << 21) >> 32;
LODWORD(_QAX) = a2;
__asm
{
movss xmm0, dword ptr [eax+8]
mulss xmm0, ds:dword_AB2C64
movss [esp+18h+var_18], xmm0
}
v24 = v8 * sub_408BC0(v23);
v25 = v24 & 0x1FFFFF;
v26 = v25 | (v20 << 21);
result = v27;
*((_DWORD *)v27 + 1) = HIDWORD(v25) | v22;
*(_DWORD *)v27 = v26;
return result;
}
Но не получается привести ее в читабельный вид, Не подскажите, как это сделать.
ЗЫ. если кому-то интересно - то вот сама структура:
http://paste2.org/p/1138036
//----- (0041F2A0) --------------------------------------------------------
// PackedQuaternion
void *__thiscall sub_41F2A0(void *this, Quaternion *a2)
{
int _EDI; // edi@1
unsigned __int8 _CF; // cf@1
unsigned __int8 _ZF; // zf@1
signed int v8; // esi@2
void *result; // eax@4
float v12; // ST00_4@4
int v13; // eax@4
int v16; // ebx@4
float v17; // ST00_4@4
int v18; // ST14_4@4
signed __int64 _QAX; // qax@4
int v20; // ebx@4
__int64 _QT0; // qt0@4
int v22; // edi@4
float v23; // ST00_4@4
int v24; // eax@4
__int64 v25; // qax@4
int v26; // ebx@4
void *v27; // [sp+10h] [bp-8h]@1
__asm { xorps xmm0, xmm0 }
_EDI = (int)a2;
__asm { comiss xmm0, dword ptr [edi+0Ch] }
v27 = this;
if ( _CF | _ZF )
v8 = 1;
else
v8 = -1;
__asm
{
movss xmm0, dword ptr [edi+4]
mulss xmm0, ds:dword_AB2C64
movss [esp+18h+var_18], xmm0
}
v13 = v8 * sub_408BC0(v12);
__asm
{
movss xmm0, dword ptr [edi]
mulss xmm0, ds:dword_AB2C60
}
v13 &= 0x1FFFFFu;
v16 = v13;
__asm { movss [esp+18h+var_18], xmm0 }
v18 = (unsigned __int64)v13 >> 32;
_QAX = (signed __int64)(v8 * sub_408BC0(v17)) << 21;
v20 = _QAX | v16;
HIDWORD(_QT0) = HIDWORD(_QAX) | v18;
LODWORD(_QT0) = v20;
v22 = (unsigned __int64)(_QT0 << 21) >> 32;
LODWORD(_QAX) = a2;
__asm
{
movss xmm0, dword ptr [eax+8]
mulss xmm0, ds:dword_AB2C64
movss [esp+18h+var_18], xmm0
}
v24 = v8 * sub_408BC0(v23);
v25 = v24 & 0x1FFFFF;
v26 = v25 | (v20 << 21);
result = v27;
*((_DWORD *)v27 + 1) = HIDWORD(v25) | v22;
*(_DWORD *)v27 = v26;
return result;
}
Но не получается привести ее в читабельный вид, Не подскажите, как это сделать.
ЗЫ. если кому-то интересно - то вот сама структура:
http://paste2.org/p/1138036