You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.0 KiB
C#

using SFML.Graphics;
using System.Diagnostics;
namespace Otter {
/// <summary>
/// NOT YET SUPPORTED
/// Very WIP class, probably internal for Otter, don't use it yet.
/// </summary>
class SpriteBatch {
RenderStates renderStates = RenderStates.Default;
public int MaxSprites = 100;
public int DrawCount { get; private set; }
VertexArray vertexArray = new VertexArray(PrimitiveType.Quads);
bool drawing;
Stopwatch stopwatch;
public SpriteBatch() {
}
public void Begin() {
if (drawing == false) {
drawing = true;
vertexArray.Clear();
DrawCount = 0;
stopwatch = Stopwatch.StartNew();
}
}
public void SetTexture(Texture texture) {
}
public void SetShader(Shader shader) {
}
public void SetBlendMode(BlendMode blend) {
}
public void Draw(VertexArray vertices, RenderStates states) {
if (!drawing) return;
// Render states have changed, so flush and clear.
if (!CompareStates(renderStates, states)) {
Flush();
vertexArray.Clear();
renderStates = states;
}
// Exceeding maximum sprites, so flush and clear.
if (DrawCount >= MaxSprites) {
Flush();
DrawCount = 0;
vertexArray.Clear();
}
// Apply the transform to the four points
var transform = states.Transform;
// Append the vertices
for (uint i = 0; i < vertices.VertexCount; i++) {
var vertex = vertices[i];
var pos = transform.TransformPoint(vertex.Position.X, vertex.Position.Y);
vertex.Position.X = pos.X;
vertex.Position.Y = pos.Y;
vertexArray.Append(vertex);
}
DrawCount++;
// I think that's it?
}
bool CompareStates(RenderStates a, RenderStates b) {
if (a.Texture != b.Texture) return false;
if (a.Shader != b.Shader) return false;
if (a.BlendMode != b.BlendMode) return false;
// Dont care about transform right now.
return true;
}
public void SetRenderState(RenderStates states) {
renderStates = states;
}
public void End() {
if (drawing) {
drawing = false;
Flush();
vertexArray.Clear();
//Console.WriteLine("Spritebatch took {0}ms", stopwatch.ElapsedMilliseconds);
}
}
void Flush() {
if (vertexArray.VertexCount > 0) {
renderStates.Transform = Transform.Identity;
Otter.Draw.Spritebatch(vertexArray, renderStates);
}
}
}
}