protected List<SubMeshLodGeometryLink> DetermineGeometry( SubMesh sm )
{
// First, determine if we've already seen this submesh before
List<SubMeshLodGeometryLink> lodList;
if ( subMeshGeometryLookup.TryGetValue( sm, out lodList ) )
return lodList;
// Otherwise, we have to create a new one
lodList = new List<SubMeshLodGeometryLink>();
subMeshGeometryLookup[ sm ] = lodList;
int numLods = sm.Parent.IsLodManual ? 1 : sm.Parent.LodLevelCount;
for ( int lod = 0; lod < numLods; ++lod )
{
SubMeshLodGeometryLink geomLink = new SubMeshLodGeometryLink();
lodList.Add( geomLink );
IndexData lodIndexData = lod == 0 ? sm.indexData : 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, 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, geomLink );
}
Debug.Assert( geomLink.vertexData.vertexStart == 0,
"Cannot use vertexStart > 0 on indexed geometry due to " +
"rendersystem incompatibilities - see the docs!" );
}
return lodList;
}