public void ExtractFrom( VertexData sourceData )
{
// Release old buffer copies first
HardwareBufferManager mgr = HardwareBufferManager.Instance;
if ( destPositionBuffer != null )
{
mgr.ReleaseVertexBufferCopy( destPositionBuffer );
Debug.Assert( destPositionBuffer == null );
}
if ( destNormalBuffer != null )
{
mgr.ReleaseVertexBufferCopy( destNormalBuffer );
Debug.Assert( destNormalBuffer == null );
}
VertexDeclaration decl = sourceData.vertexDeclaration;
VertexBufferBinding bind = sourceData.vertexBufferBinding;
VertexElement posElem = decl.FindElementBySemantic( VertexElementSemantic.Position );
VertexElement normElem = decl.FindElementBySemantic( VertexElementSemantic.Normal );
VertexElement tanElem = decl.FindElementBySemantic( VertexElementSemantic.Tangent );
VertexElement binormElem = decl.FindElementBySemantic( VertexElementSemantic.Binormal );
Debug.Assert( posElem != null, "Positions are required" );
posBindIndex = posElem.Source;
srcPositionBuffer = bind.GetBuffer( posBindIndex );
if ( normElem == null )
{
posNormalShareBuffer = false;
srcNormalBuffer = null;
}
else
{
normBindIndex = normElem.Source;
if ( normBindIndex == posBindIndex )
{
posNormalShareBuffer = true;
srcNormalBuffer = null;
}
else
{
posNormalShareBuffer = false;
srcNormalBuffer = bind.GetBuffer( normBindIndex );
}
}
if ( tanElem == null )
srcTangentBuffer = null;
else
{
tanBindIndex = tanElem.Source;
srcTangentBuffer = bind.GetBuffer( tanBindIndex );
}
if ( binormElem == null )
srcBinormalBuffer = null;
else
{
binormBindIndex = binormElem.Source;
srcBinormalBuffer = bind.GetBuffer( binormBindIndex );
}
}