Beispiel #1
0
        /// <summary>
        /// Метод используется, для перевалки данных из других spriterenderer в этот
        /// </summary>
        /// <param name="vertices">Вертексы</param>
        /// <param name="numVertices">длина</param>
        /// <param name="type">тип</param>
        public void DrawBatchForVertexesSpriteRendererClasses(Vertex[] vertices, int numVertices, PrimitiveType type)
        {
            RendererVertexBuffer.ActivateVertextBuffer();
            RendererVertexBuffer.SetData(vertices, numVertices);
            RendererOpenVAO();
            Context.DrawPrimitives(type, 0, numVertices);
            RendererCloseVAO();
#if DEBUG_VERTEX
            Console.WriteLine("DrawBatchForVertexesSprite SpriteRenderer" + "array:" + numVertices);
#endif
            PerfHistory.Increment("batches", 1);
        }
        public void Draw(Viewport viewport)
        {
            var cells = restrictToBounds ? viewport.VisibleCellsInsideBounds : viewport.AllVisibleCells;

            // Only draw the rows that are visible.
            var firstRow = cells.CandidateMapCoords.TopLeft.V.Clamp(0, map.MapSize.Y);
            var lastRow  = (cells.CandidateMapCoords.BottomRight.V + 1).Clamp(firstRow, map.MapSize.Y);

            Game.Renderer.Flush();

            vertexBuffer.ActivateVertextBuffer();
            // Flush any visible changes to the GPU
            for (var row = firstRow; row <= lastRow; row++)             //update changed quads if any
            {
                if (!dirtyRows.Remove(row))
                {
                    continue;
                }

                var rowOffset = TerrainFullRowLenInVertexRowsNums * row;

                unsafe
                {
                    // The compiler / language spec won't let us calculate a pointer to
                    // an offset inside a generic array T[], and so we are forced to
                    // calculate the start-of-row pointer here to pass in to SetData.

                    fixed(Vertex *vPtr = &vertices[0])
                    {
                        vertexBuffer.SetData((IntPtr)(vPtr + rowOffset), rowOffset, TerrainFullRowLenInVertexRowsNums);
                    }
                }
            }

            // Так как все вертексы хранятся плоским списком, то приходится отправлять в рендер всю ширину карты. Так как нельзя вырезать регион из плоского списка по Ширине
            // Поэтому отрезается только по высоте. А ширина учитывается полностью.
            Game.Renderer.WorldSpriteRenderer.DrawVertexBuffer(
                vertexBuffer, TerrainFullRowLenInVertexRowsNums * firstRow, TerrainFullRowLenInVertexRowsNums * (lastRow - firstRow),
                PrimitiveType.TriangleList, sheets2d, BlendMode);

            Game.Renderer.Flush();
        }