unsafe protected int CacheLightGeometry( TextureLight light, uint* pIndexes, TextureLightMap* pTexLightMaps, BspVertex* pVertices, BspStaticFaceGroup faceGroup )
{
// Skip sky always
if ( faceGroup.isSky )
return 0;
int idxStart = 0;
int numIdx = 0;
int vertexStart = 0;
if ( faceGroup.type == FaceGroup.FaceList )
{
idxStart = faceGroup.elementStart;
numIdx = faceGroup.numElements;
vertexStart = faceGroup.vertexStart;
}
else if ( faceGroup.type == FaceGroup.Patch )
{
idxStart = faceGroup.patchSurf.IndexOffset;
numIdx = faceGroup.patchSurf.CurrentIndexCount;
vertexStart = faceGroup.patchSurf.VertexOffset;
}
else
{
// Unsupported face type
return 0;
}
uint* src = (uint*)level.Indexes.Lock(
idxStart * sizeof( uint ),
numIdx * sizeof( uint ),
BufferLocking.ReadOnly );
int maxIndex = 0;
for ( int i = 0; i < numIdx; i++ )
{
int index = (int)*( src + i );
if ( index > maxIndex )
maxIndex = index;
}
Vector3[] vertexPos = new Vector3[ maxIndex + 1 ];
bool[] vertexIsStored = new bool[ maxIndex + 1 ];
for ( int i = 0; i < numIdx; i++ )
{
uint index = *( src + i );
if ( !vertexIsStored[ index ] )
{
vertexPos[ index ] = ( *( pVertices + vertexStart + index ) ).position;
vertexIsStored[ index ] = true;
}
}
Vector2[] texCoors;
ColorEx[] colors;
bool res = light.CalculateTexCoordsAndColors( faceGroup.plane, vertexPos, out texCoors, out colors );
if ( res )
{
for ( int i = 0; i <= maxIndex; i++ )
{
pTexLightMaps[ vertexStart + i ].color = Root.Instance.RenderSystem.ConvertColor( colors[ i ] );
pTexLightMaps[ vertexStart + i ].textureLightMap = texCoors[ i ];
}
// Offset the indexes here
// we have to do this now rather than up-front because the
// indexes are sometimes reused to address different vertex chunks
for ( int i = 0; i < numIdx; i++ )
*pIndexes++ = (uint)( *src++ + vertexStart );
level.Indexes.Unlock();
// return number of elements
return numIdx;
}
else
{
level.Indexes.Unlock();
return 0;
}
}