public void Assign( QueuedSubMesh qsm )
{
queuedSubMeshes.Add( qsm );
// update lod distances
Mesh mesh = qsm.submesh.Parent;
LodStrategy lodStrategy = mesh.LodStrategy;
if ( this.lodStrategy == null )
{
this.lodStrategy = lodStrategy;
// First LOD mandatory, and always from base lod value
this.lodValues.Add( this.lodStrategy.BaseValue );
}
else
{
if ( this.lodStrategy != lodStrategy )
throw new AxiomException( "Lod strategies do not match." );
}
int lodLevels = mesh.LodLevelCount;
if ( qsm.geometryLodList.Count != lodLevels )
{
string msg = string.Format( "QueuedSubMesh '{0}' lod count of {1} does not match parent count of {2}", qsm.submesh.Name, qsm.geometryLodList.Count, lodLevels );
throw new AxiomException( msg );
}
while ( lodValues.Count < lodLevels )
{
lodValues.Add( 0.0f );
}
// Make sure LOD levels are max of all at the requested level
for ( ushort lod = 1; lod < lodLevels; ++lod )
{
MeshLodUsage meshLod = qsm.submesh.Parent.GetLodLevel( lod );
lodValues[ lod ] = Utility.Max( (float)lodValues[ lod ], meshLod.Value );
}
// update bounds
// Transform world bounds relative to our center
AxisAlignedBox localBounds = new AxisAlignedBox( qsm.worldBounds.Minimum - center, qsm.worldBounds.Maximum - center );
aabb.Merge( localBounds );
foreach ( Vector3 corner in localBounds.Corners )
{
boundingRadius = Utility.Max( boundingRadius, corner.Length );
}
}