LOD blending is also used to smoothly eliminate graphic objects that are too small to provide any meaningful contribution to the scene being rendered. This is done by using translucency to fade the object out of the rendered scene as a function of distance from the eyepoint, and then completely discarding the object from the display list at run-time.
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;
}
if ( PRO_Polygon::GetMaxBoundingBoxDimension((PRO_Polygon *)v7) > 100000.0 )
PRO_Culling_Node::fracturePolygon(v42, (struct PRO_Polygon *)v7, v41, *((_DWORD *)v41 + 1) - 1);
Users browsing this forum: No registered users and 1 guest