Yeah it does look to me they are abusing the LOD feature to do blending. But you are right, the values don't make 100% sense.
In the SDK values are specified as subtended angles, or distances
Distances are written like this ..
- Code: Select all
signed int __thiscall PRO_LOD_Table::SetRangeBlendParameters(int this, int feature_type, int lod_number, float start_range, float delete_range)
{
int v5; // edx@1
signed int result; // eax@2
float swap; // ST08_4@4
double v8; // st7@9
int v9; // edx@12
double v10; // st7@12
int v11; // edx@15
long double v12; // st7@15
double v13; // st7@17
float v14; // [sp+8h] [bp-4h]@15
v5 = feature_type;
if ( *(_DWORD *)(this + 112) > feature_type )
{
// sanity check paramaters
if ( delete_range < (double)start_range )
{
swap = start_range;
start_range = delete_range;
delete_range = swap;
}
// checking for valid floats?
if ( !(LODWORD(start_range) & 0x7FFFFFFF) )
start_range = 0.0000001;
if ( !(LODWORD(delete_range) & 0x7FFFFFFF) )
delete_range = 0.0000001;
v8 = delete_range;
v8 = 1.0 / v8;
v9 = 8 * (lod_number + 4 * v5); // calculate array address to write to
*(float *)(*(_DWORD *)(this + 28) + v9) = v8; // write start range here, although seems to be 1/delete_range ?
v10 = start_range;
v10 = 1.0 / v10;
v11 = *(_DWORD *)(this + 28) + v9;
v12 = v10 - *(float *)v11; // (1/start_range) - (1/delete_range)
v14 = v12;
if ( fabs(v12) < 0.0000001 )
v14 = 0.0000001;
v13 = v14;
v13 = 1.0 / v13; // (1 / v12)
*(float *)(v11 + 4) = v13; // write result
PRO_Culling_Data_Block::NotifyUpdate((PRO_Culling_Data_Block *)this);
result = 1;
}
else
{
result = 2;
}
return result;
}
In short it looks like
start_value = 1/delete_range
delete_value = 1 / (1/start_range - 1/delete_range)
The method that sends subtended angles look nearly identical, but with angles instead.
I don't see any code or methods to switch between using the values as angles, or using them as ranges. And the ranges produced by that method don't really make sense.
One thing I did note though from the raw data is the max distance ..
Culling nodes seem to have a distance capped at 100,000
The SDK has code that looks like this
- Code: Select all
if ( PRO_Polygon::GetMaxBoundingBoxDimension((PRO_Polygon *)v7) > 100000.0 )
PRO_Culling_Node::fracturePolygon(v42, (struct PRO_Polygon *)v7, v41, *((_DWORD *)v41 + 1) - 1);
Although the node distances can actually end up larger, if the model matrix has a scaling value