示例#1
0
        public override void Issue(DeviceManager manager)
        {
            if (Count > 0)
            {
                using (manager.ApplyMaterial(Material)) {
                    var hwb = _SoftwareBuffer.HardwareBuffer;
                    if (hwb == null)
                    {
                        throw new ThreadStateException("Could not get a hardware buffer for this batch");
                    }

                    hwb.SetActive(manager.Device);
                    foreach (var da in _DrawArguments)
                    {
                        manager.Device.DrawIndexedPrimitives(da.PrimitiveType, 0, da.VertexOffset, da.VertexCount, da.IndexOffset, da.PrimitiveCount);
                    }
                    hwb.SetInactive(manager.Device);
                }
            }

            _DrawArgumentsListPool.Release(ref _DrawArguments);
            _SoftwareBuffer = null;

            base.Issue(manager);
        }
示例#2
0
            public NativeBatch(ISoftwareBuffer softwareBuffer, TextureSet textureSet, int localIndexOffset, int localVertexOffset, int vertexCount)
            {
                SoftwareBuffer = softwareBuffer;
                TextureSet     = textureSet;

                LocalIndexOffset  = localIndexOffset;
                LocalVertexOffset = localVertexOffset;
                VertexCount       = vertexCount;
            }
        public override void Prepare()
        {
            if (Count > 0)
            {
#if PSM
                _BufferGenerator = Container.RenderManager.GetBufferGenerator <PSMBufferGenerator <GeometryVertex> >();
#else
                _BufferGenerator = Container.RenderManager.GetBufferGenerator <XNABufferGenerator <GeometryVertex> >();
#endif

                _DrawArguments = _DrawArgumentsListPool.Allocate(null);
                var swb = _BufferGenerator.Allocate(VertexCount, IndexCount, true);
                _SoftwareBuffer = swb;

                var vb = new Internal.VertexBuffer <GeometryVertex>(swb.Vertices);
                var ib = new Internal.IndexBuffer(swb.Indices);
                int vertexOffset = 0, indexOffset = 0;

                foreach (var kvp in Lists)
                {
                    var l = kvp.Value;
                    var c = l.Count;

#if PSM
                    l.Timsort(_DrawCallSorter);
#else
                    l.Sort(_DrawCallSorter);
#endif

                    int vertexCount = vb.Count, indexCount = ib.Count;

                    var _l = l.GetBuffer();
                    for (int i = 0; i < c; i++)
                    {
                        var dc = _l[i];
                        dc.Preparer(ref vb, ref ib, ref dc);
                    }

                    vertexCount = vb.Count - vertexCount;
                    indexCount  = ib.Count - indexCount;

                    MakeDrawArguments(kvp.Key, ref vb, ref ib, ref vertexOffset, ref indexOffset, vertexCount, indexCount);
                }

                int done = 0;
                done = 1;
            }
        }
示例#4
0
        protected override void Prepare(PrepareManager manager)
        {
            if (Count > 0)
            {
                _BufferGenerator = Container.RenderManager.GetBufferGenerator <BufferGenerator <GeometryVertex> >();

                _DrawArguments = _DrawArgumentsListPool.Allocate(null);
                var swb = _BufferGenerator.Allocate(VertexCount, IndexCount, true);
                _SoftwareBuffer = swb;

                var vb = new Internal.VertexBuffer <GeometryVertex>(swb.Vertices);
                var ib = new Internal.IndexBuffer(swb.Indices);
                int vertexOffset = 0, indexOffset = 0;
                int totalPrimCount = 0;

                foreach (var kvp in Lists)
                {
                    var l = kvp.Value;
                    var c = l.Count;

                    l.FastCLRSort(_DrawCallSorter);

                    int vertexCount = vb.Count, indexCount = ib.Count;

                    var _l = l.GetBuffer();
                    for (int i = 0; i < c; i++)
                    {
                        var dc = _l[i];
                        dc.Preparer(ref vb, ref ib, ref dc);
                    }

                    vertexCount = vb.Count - vertexCount;
                    indexCount  = ib.Count - indexCount;

                    int primCount;
                    MakeDrawArguments(kvp.Key, ref vb, ref ib, ref vertexOffset, ref indexOffset, out primCount, vertexCount, indexCount);

                    totalPrimCount += primCount;
                }

                NativeBatch.RecordPrimitives(totalPrimCount);
            }
        }