- Code: Select all
void __thiscall PRO_Culling_Node::initHWCullingNode(PRO_Culling_Node *this, __int32 a2)
{
PRO_Culling_Node *v2; // esi@1
v2 = this;
if ( *((_DWORD *)this + 29) == 1 )
{
PRO_Clear(*(char **)this, 0, a2 + 32);
**(_DWORD **)v2 |= 0x200u;
**(_DWORD **)v2 |= 0x100u;
**(_DWORD **)v2 |= 0x10u;
**(_DWORD **)v2 = **(_DWORD **)v2 & 0xFFFFFFFE | 2;
*(_DWORD *)(*(_DWORD *)v2 + 24) |= 0x1000000u;
*(_DWORD *)(*(_DWORD *)v2 + 8) = PRO_GetIEEEFloat(0, 0);
*(_DWORD *)(*(_DWORD *)v2 + 12) = PRO_GetIEEEFloat(0, 0);
*(_DWORD *)(*(_DWORD *)v2 + 16) = PRO_GetIEEEFloat(0, 0);
*(_DWORD *)(*(_DWORD *)v2 + 28) = (PRO_Get16BitFloat(0x49742400) << 16) | *(_DWORD *)(*(_DWORD *)v2 + 28) & 0xFFFF;
*(_DWORD *)(*(_DWORD *)v2 + 28) = PRO_Get16BitFloat(0x49742400) & 0xFFFF | *(_DWORD *)(*(_DWORD *)v2 + 28) & 0xFFFF0000;
}
}
The blend/culling radius is some strange 16bit float format
- Code: Select all
int __cdecl PRO_Get16BitFloat(int a1)
{
return (PRO_GetHWFloat(a1) >> 15) & 0xFFFF;
}
- Code: Select all
unsigned int __cdecl PRO_GetHWFloat(int a1)
{
int v2; // [sp+Ch] [bp-1Ch]@1
int v3; // [sp+14h] [bp-14h]@1
unsigned int v4; // [sp+18h] [bp-10h]@1
int v5; // [sp+1Ch] [bp-Ch]@5
int *v6; // [sp+20h] [bp-8h]@1
v6 = &v3;
v3 = a1;
v2 = a1;
v4 = ((a1 & 0x7F800000u) >> 23) - 127;
if ( (signed int)v4 <= 31 )
{
if ( (signed int)v4 < -31 )
v4 = -31;
}
else
{
v4 = 31;
}
v4 &= 0x3Fu;
v5 = 4 * (v2 & 0x7FFFFF);
return v5 | a1 & 0x80000000 | (v4 << 25);
}
If we can figure out this strange float format? Should be able to extract usable node distances