Ejemplo n.º 1
0
        private void TransferStagedQueueDataToGpu(QueueWrap wrapped, IDrawStageBuffers buffers)
        {
            var v0 = wrapped.BufferPositionOfFirstVertex;
            var vN = wrapped.Queue.Data.NumVerticesUsed;

            buffers.CopyVertexBufferSegmentToGpu(v0, vN);

            var i0 = wrapped.BufferPositionOfFirstIndex;
            var iN = wrapped.Queue.Data.NumIndicesUsed;

            buffers.CopyIndexBufferSegmentToGpu(i0, iN);
        }
Ejemplo n.º 2
0
        public DrawQueueGroup(IIdGenerator idGenerator,
                              IDrawQueueFactory queueFactory,
                              IDrawStageBuffers buffers,
                              IQueueToBufferBlitter blitter,
                              bool skipDrawQueueSortingByDepthsAndLayers)
        {
            Buffers       = buffers;
            _idGenerator  = idGenerator;
            _queueFactory = queueFactory;
            _blitter      = blitter;

            _skipDrawQueueSortingByDepthsAndLayers = skipDrawQueueSortingByDepthsAndLayers;

            DynamicQueue = new QueueWrap
            {
                Id    = 0UL,
                Queue = _queueFactory.Create(_skipDrawQueueSortingByDepthsAndLayers),
                BufferPositionOfFirstVertex = 0,
                BufferPositionOfFirstIndex  = 0
            };

            PersistentQueues = new List <QueueWrap>(); //List not dictionary keyed with id so can be confident about order when iterating (dic probably fine...)
        }
Ejemplo n.º 3
0
        public void UnpackAndTransferToGpu(QueueWrap wrappedQueue, IDrawStageBuffers buffers)
        {
            UnpackQueueDataIntoStagingArrays(wrappedQueue, buffers);

            TransferStagedQueueDataToGpu(wrappedQueue, buffers);
        }
Ejemplo n.º 4
0
        private void UnpackQueueDataIntoStagingArrays(QueueWrap wrappedQueue, IDrawStageBuffers buffers)
        {
            var queue = wrappedQueue.Queue.Data;

            var minRequiredSizeOfVertexBuffer = wrappedQueue.BufferPositionOfFirstVertex + queue.NumVerticesUsed;
            var minRequiredSizeOfIndexBuffer  = wrappedQueue.BufferPositionOfFirstIndex + queue.NumIndicesUsed;

            buffers.EnsureVertexBufferIsLargeEnough(minRequiredSizeOfVertexBuffer, true);
            buffers.EnsureIndexBufferIsLargeEnough(minRequiredSizeOfIndexBuffer, true);

            var posVertex = wrappedQueue.BufferPositionOfFirstVertex;
            var posIndex  = wrappedQueue.BufferPositionOfFirstIndex;

            for (var req = 0; req < queue.NumRequests; req++)
            {
                var r = queue.Ordering[req];

                var isWorld     = queue.Targets[r] == CoordinateSpace.World;
                var textureType = queue.Types[r] == FillType.Coloured ? 0 : queue.Types[r] == FillType.Textured ? 1 : 2;
                var baseColour  = queue.BaseColours[r];

                var nV = queue.NumVertices[r];
                var v0 = queue.FirstVertexPosition[r];

                var layer = queue.Layers[r];
                var depth = queue.Depths[r];

                var firstVertex = posVertex;

                for (var v = 0; v < nV; v++)
                {
                    var qPos = v0 + v;

                    var vert = queue.Vertices[qPos];

                    var mixedColour = MixColour(baseColour, vert.Colour);

                    buffers.CopyAVertexToStagingArray(posVertex,
                                                      isWorld,
                                                      textureType,
                                                      vert.Position,
                                                      layer,
                                                      depth,
                                                      mixedColour,
                                                      vert.TexCoord0,
                                                      vert.TexCoord1,
                                                      vert.TexWeighting,
                                                      false);
                    posVertex++;
                }

                var nI = queue.NumIndices[r];
                var i0 = queue.FirstIndexPosition[r];

                for (var i = 0; i < nI; i++)
                {
                    var qPos = i0 + i;

                    var index = (uint)(queue.Indices[qPos] + firstVertex);

                    var pos = (uint)posIndex;

                    //Stopped using ref overload, originally as had trouble testing with nsub, but then realised copy for ints is fine here)
                    buffers.CopyAnIndexToStagingArray(pos, index, false);

                    posIndex++;
                }
            }
        }