예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }