public void SetVertexBufferBinding(VertexBufferBinding binding,
int numberOfInstances, bool useGlobalInstancingVertexBufferIsAvailable, bool indexesUsed)
{
if ( useGlobalInstancingVertexBufferIsAvailable )
{
numberOfInstances *= GlobalNumberOfInstances;
}
var globalInstanceVertexBuffer = GlobalInstanceVertexBuffer;
var globalVertexDeclaration = GlobalInstanceVertexBufferVertexDeclaration;
var hasInstanceData = useGlobalInstancingVertexBufferIsAvailable &&
globalInstanceVertexBuffer != null && globalVertexDeclaration != null
|| binding.HasInstanceData;
// TODO: attempt to detect duplicates
var binds = binding.Bindings;
var source = -1;
foreach ( var i in binds )
{
source++;
var d3D9Buf = (D3DHardwareVertexBuffer)i.Value;
//D3D9HardwareVertexBuffer* d3d9buf =
// static_cast<D3D9HardwareVertexBuffer*>(i->second.get());
// Unbind gap sources
for ( ; source < i.Key; ++source )
{
ActiveD3D9Device.SetStreamSource( source, null, 0, 0 );
}
ActiveD3D9Device.SetStreamSource(source, d3D9Buf.D3DVertexBuffer, 0, d3D9Buf.VertexSize);
// SetStreamSourceFreq
if ( hasInstanceData )
{
if ( d3D9Buf.IsInstanceData )
{
ActiveD3D9Device.SetStreamSourceFrequency(source, d3D9Buf.InstanceDataStepRate, StreamSource.InstanceData);
}
else
{
if ( !indexesUsed )
{
throw new AxiomException( "Instance data used without index data." );
}
ActiveD3D9Device.SetStreamSourceFrequency(source, numberOfInstances, StreamSource.InstanceData);
}
}
else
{
// SlimDX workaround see http://www.gamedev.net/topic/564376-solved-slimdx---instancing-problem/
ActiveD3D9Device.ResetStreamSourceFrequency(source);
//device.SetStreamSourceFrequency( source, 1, StreamSource.IndexedData );
}
}
if ( useGlobalInstancingVertexBufferIsAvailable )
{
// bind global instance buffer if exist
if ( globalInstanceVertexBuffer != null )
{
if ( !indexesUsed )
{
throw new AxiomException( "Instance data used without index data." );
}
var d3D9Buf = (D3DHardwareVertexBuffer)globalInstanceVertexBuffer;
ActiveD3D9Device.SetStreamSource(source, d3D9Buf.D3DVertexBuffer, 0, d3D9Buf.VertexSize);
ActiveD3D9Device.SetStreamSourceFrequency(source, d3D9Buf.InstanceDataStepRate, StreamSource.InstanceData);
}
}
// Unbind any unused sources
for ( var unused = source; unused < _lastVertexSourceCount; ++unused )
{
ActiveD3D9Device.SetStreamSource(unused, null, 0, 0);
ActiveD3D9Device.SetStreamSourceFrequency(source, 1, StreamSource.IndexedData);
}
_lastVertexSourceCount = source;
}