Axiom.RenderSystems.DirectX9.D3DRenderSystem.SetVertexBufferBinding C# (CSharp) Метод

SetVertexBufferBinding() приватный метод

private SetVertexBufferBinding ( VertexBufferBinding binding, int numberOfInstances, bool useGlobalInstancingVertexBufferIsAvailable, bool indexesUsed ) : void
binding Axiom.Graphics.VertexBufferBinding
numberOfInstances int
useGlobalInstancingVertexBufferIsAvailable bool
indexesUsed bool
Результат void
        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;
        }
D3DRenderSystem