public List<SubMeshLodGeometryLink> DetermineGeometry( SubMesh sm )
{
// First, determine if we've already seen this submesh before
if ( mSubMeshGeometryLookup.ContainsKey( sm ) )
{
return mSubMeshGeometryLookup[ sm ];
}
// Otherwise, we have to create a new one
List<SubMeshLodGeometryLink> lodList = new List<SubMeshLodGeometryLink>();
mSubMeshGeometryLookup[ sm ] = lodList;
int numLods = sm.Parent.IsLodManual ? 1 : sm.Parent.LodLevelCount;
lodList.Capacity = numLods;
for ( int lod = 0; lod < numLods; ++lod )
{
SubMeshLodGeometryLink geomLink = lodList[ lod ];
IndexData lodIndexData;
if ( lod == 0 )
{
lodIndexData = sm.IndexData;
}
else
{
lodIndexData = sm.LodFaceList[ lod - 1 ];
}
// Can use the original mesh geometry?
if ( sm.useSharedVertices )
{
if ( sm.Parent.SubMeshCount == 1 )
{
// Ok, this is actually our own anyway
geomLink.vertexData = sm.Parent.SharedVertexData;
geomLink.indexData = lodIndexData;
}
else
{
// We have to split it
SplitGeometry( sm.Parent.SharedVertexData,
lodIndexData, ref geomLink );
}
}
else
{
if ( lod == 0 )
{
// Ok, we can use the existing geometry; should be in full
// use by just this SubMesh
geomLink.vertexData = sm.vertexData;
geomLink.indexData = sm.indexData;
}
else
{
// We have to split it
SplitGeometry( sm.vertexData,
lodIndexData, ref geomLink );
}
}
Debug.Assert( geomLink.vertexData.vertexStart == 0, "Cannot use vertexStart > 0 on indexed geometry due to rendersystem incompatibilities - see the docs!" );
}
return lodList;
}