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; }
/// <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; } }
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; }