예제 #1
0
        public void Add(T v)
        {
            GLWrapper.SetActiveBatch(this);

            if (currentBufferIndex < VertexBuffers.Count && currentVertexIndex >= currentVertexBuffer.Size)
            {
                Draw();
                FrameStatistics.Increment(StatisticsCounterType.VBufOverflow);
            }

            // currentIndex will change after Draw() above, so this cannot be in an else-condition
            while (currentBufferIndex >= VertexBuffers.Count)
            {
                VertexBuffers.Add(CreateVertexBuffer());
            }

            if (currentVertexBuffer.SetVertex(currentVertexIndex, v))
            {
                if (changeBeginIndex == -1)
                {
                    changeBeginIndex = currentVertexIndex;
                }

                changeEndIndex = currentVertexIndex + 1;
            }

            ++currentVertexIndex;
        }
예제 #2
0
        /// <summary>
        /// Adds a vertex to this <see cref="VertexBatch{T}"/>.
        /// </summary>
        /// <param name="v">The vertex to add.</param>
        public void Add(T v)
        {
            GLWrapper.SetActiveBatch(this);

            while (currentIndex >= VertexBuffers.Count)
            {
                VertexBuffers.Add(CreateVertexBuffer());
            }

            VertexBuffer <T> vertexBuffer = currentVertexBuffer;

            if (!vertexBuffer.Vertices[currentVertex].Equals(v))
            {
                if (changeBeginIndex == -1)
                {
                    changeBeginIndex = currentVertex;
                }

                changeEndIndex = currentVertex + 1;
            }

            vertexBuffer.Vertices[currentVertex] = v;
            ++currentVertex;

            if (currentVertex >= vertexBuffer.Vertices.Length)
            {
                Draw();
                FrameStatistics.Increment(StatisticsCounterType.VBufOverflow);
                lastVertex = currentVertex = 0;
            }
        }
예제 #3
0
        public void Draw()
        {
            if (currentVertex == lastVertex)
            {
                return;
            }

            GLWrapper.SetActiveBatch(this);

            VertexBuffer <T> vertexBuffer = CurrentVertexBuffer;

            if (changeBeginIndex >= 0)
            {
                vertexBuffer.UpdateRange(changeBeginIndex, changeEndIndex);
            }

            vertexBuffer.DrawRange(lastVertex, currentVertex);

            // When using multiple buffers we advance to the next one with every draw to prevent contention on the same buffer with future vertex updates.
            currentVertexBuffer = (currentVertexBuffer + 1) % fixedBufferAmount;
            currentVertex       = 0;

            lastVertex       = currentVertex;
            changeBeginIndex = -1;
        }