public VertexBuffer GetVertexBuffer(DrawState state) { if (_vertexBuffer == null) { int size = 32; if (_buffer.CountKnown) { size = _buffer.Count; } if (size == 0) { throw new ArgumentException(string.Format("Vertices<{0}> data size is zero", typeof(TVertexType).Name)); } _vertexBuffer = new VertexBuffer(Context, _buffer.Stride * size, Usage.WriteOnly, VertexFormat.None, Pool.Managed); if ((_usage & Usage.Dynamic) != Usage.Dynamic) { _buffer.ClearBuffer(); } } if (_buffer.IsDirty) { _buffer.UpdateDirtyRegions(state, _vertexBuffer); } return(_vertexBuffer); }
VertexBuffer IDeviceVertexBuffer.GetVertexBuffer(DrawState state) { GraphicsDevice device = state.graphics; if (vb == null) { int size = 32; if (buffer.CountKnown) { size = buffer.Count; } if (size == 0) { throw new ArgumentException(string.Format("Vertices<{0}> data size is zero", typeof(VertexType).Name)); } if ((usage & ResourceUsage.Dynamic) == ResourceUsage.Dynamic) { vb = new DynamicVertexBuffer(device, buffer.Stride * size, Usage); } else { vb = new VertexBuffer(device, buffer.Stride * size, Usage); } if ((ResourceUsage & ResourceUsage.DynamicSequential) != ResourceUsage.DynamicSequential) { int written = buffer.WriteBuffer(state, 0, size * buffer.Stride, vb, this); if (written < buffer.Count) { vb.Dispose(); if ((usage & ResourceUsage.Dynamic) == ResourceUsage.Dynamic) { vb = new DynamicVertexBuffer(device, buffer.Stride * buffer.Count, Usage); } else { vb = new VertexBuffer(device, buffer.Stride * buffer.Count, Usage); } buffer.WriteBuffer(state, 0, buffer.Count * buffer.Stride, vb, this); } this.buffer.ClearDirtyRange(); } if ((usage & ResourceUsage.Dynamic) != ResourceUsage.Dynamic) { buffer.ClearBuffer(); } } if ((usage & ResourceUsage.Dynamic) == ResourceUsage.Dynamic && vb != null && ((DynamicVertexBuffer)vb).IsContentLost) { SetDirty(); } if (this.buffer.IsDirty) { this.buffer.UpdateDirtyRegions(state, this.vb, this); } return(vb); }
IndexBuffer IDeviceIndexBuffer.GetIndexBuffer(DrawState state) { GraphicsDevice device = state.graphics; ValidateDisposed(); if (this.ib == null) { int size = 32; if (buffer.CountKnown) { size = buffer.Count; } Type indexType = BufferIndexType; int instanceCount = 1; #if XBOX360 instanceCount = Math.Max(1, this.buffer.instancingCount); #endif if (size == 0) { throw new ArgumentException(string.Format("Indices<{0}> data size is zero", typeof(IndexType).Name)); } if ((usage & ResourceUsage.Dynamic) == ResourceUsage.Dynamic) { ib = new DynamicIndexBuffer(device, indexType, size * instanceCount, Usage); } else { ib = new IndexBuffer(device, indexType, size * instanceCount, Usage); } if ((ResourceUsage & ResourceUsage.DynamicSequential) != ResourceUsage.DynamicSequential) { int written = buffer.WriteBuffer(state, 0, size * buffer.Stride, ib, this); if (written < buffer.Count) { ib.Dispose(); if ((usage & ResourceUsage.Dynamic) == ResourceUsage.Dynamic) { ib = new DynamicIndexBuffer(device, indexType, buffer.Count * instanceCount, Usage); } else { ib = new IndexBuffer(device, indexType, buffer.Count * instanceCount, Usage); } buffer.WriteBuffer(state, 0, buffer.Count * buffer.Stride, ib, this); } this.buffer.ClearDirtyRange(); } if ((usage & ResourceUsage.Dynamic) != ResourceUsage.Dynamic) { buffer.ClearBuffer(); } } if ((usage & ResourceUsage.Dynamic) == ResourceUsage.Dynamic && ib != null && ((DynamicIndexBuffer)ib).IsContentLost) { SetDirty(); } if (this.buffer.IsDirty) { this.buffer.UpdateDirtyRegions(state, this.ib, this); } return(ib); }