protected unsafe AxisAlignedBox CalculateBounds( VertexData vertexData,
Vector3 position, Quaternion orientation,
Vector3 scale )
{
VertexElement posElem =
vertexData.vertexDeclaration.FindElementBySemantic( VertexElementSemantic.Position );
HardwareVertexBuffer vbuf = vertexData.vertexBufferBinding.GetBuffer( posElem.Source );
IntPtr src = vbuf.Lock( BufferLocking.ReadOnly );
byte* vertex = (byte*)src.ToPointer();
Vector3 min = Vector3.Zero;
Vector3 max = Vector3.Zero;
bool first = true;
for ( int j = 0; j < vertexData.vertexCount; ++j, vertex += vbuf.VertexSize )
{
float* pFloat = (float*)( vertex + posElem.Offset );
Vector3 pt = new Vector3( *pFloat++, *pFloat++, *pFloat++ );
// Transform to world (scale, rotate, translate)
pt = ( orientation * ( pt * scale ) ) + position;
if ( first )
{
min = max = pt;
first = false;
}
else
{
min.Floor( pt );
max.Ceil( pt );
}
}
vbuf.Unlock();
return new AxisAlignedBox( min, max );
}