scud fog and los position

One for Harry,
you still alive Harry ?
Thought this one might interest you since you wrote most of the fog code. Some people had noticed in the attract mode for scud in the first level, fog shows up where it doesn't on the real hardware.
ie here

and the real hardware

It's like that for the entire section
Anyway in the viewport there are some values we aren't passing out
These values are almost always zero, except for this section of scud. As soon as the fog shows where it shouldn't suddenly these values spring to life.
In the SDK I think it's this
In the decompiled lib comes out as
And
The updateLosPosition tells us the values are multiplied by 8
(float *)this + 47) * 8.0) << 16
and
(float *)this + 54) * 8.0
So we can read out this los position ?? with this code
Any idea what the hell a los position is? I guess it's related to lighting or the lens flair somehow.
you still alive Harry ?

ie here

and the real hardware

It's like that for the entire section
Anyway in the viewport there are some values we aren't passing out
- Code: Select all
0x1c: xxxxxxxx xxxxxxxx -------- -------- "lj"
-------- -------- xxxxxxxx xxxxxxxx "li"
These values are almost always zero, except for this section of scud. As soon as the fog shows where it shouldn't suddenly these values spring to life.
In the SDK I think it's this
- Code: Select all
void SetLOSPosition ( float los_position_i
, float los_position_j ) ;
In the decompiled lib comes out as
- Code: Select all
void __thiscall PRO_Viewport::SetLOSPosition(PRO_Viewport *this, float los_position_i, float los_position_j)
{
int v3; // eax@1
*((float *)this + 53) = los_position_i;
*((float *)this + 54) = los_position_j;
*((_DWORD *)this + 13) = (*((_DWORD *)g_API_Data + 343))++;
v3 = *((_DWORD *)this + 14) | 1;
*((_DWORD *)this + 14) = v3;
*((_DWORD *)this + 14) = v3 | 0x80;
PRO_Pingpong_Data_Block::NotifyUpdate(this);
}
And
- Code: Select all
void __thiscall PRO_Viewport::updateLOSPosition(PRO_Viewport *this)
{
if ( *((_DWORD *)this + 4) == 1 )
{
*(_DWORD *)(*((_DWORD *)this + 7) + 112) = *(_DWORD *)(*((_DWORD *)this + 7) + 112) & 0xFFFF | ((signed __int16)(signed __int64)(*((float *)this + 53) * *((float *)this + 47) * 8.0) << 16);
*(_DWORD *)(*((_DWORD *)this + 7) + 112) = *(_DWORD *)(*((_DWORD *)this + 7) + 112) & 0xFFFF0000 | (unsigned __int16)(signed __int64)(*((float *)this + 48) * *((float *)this + 54) * 8.0);
}
}
The updateLosPosition tells us the values are multiplied by 8
(float *)this + 47) * 8.0) << 16
and
(float *)this + 54) * 8.0
So we can read out this los position ?? with this code
- Code: Select all
float li = (vpnode[0x1c] & 0xFFFF) / 8.0f;
float lj = (vpnode[0x1c] >> 16) / 8.0f;
Any idea what the hell a los position is? I guess it's related to lighting or the lens flair somehow.