Rendering Matrix stuff

This commit is contained in:
Matt Thorson 2020-09-22 15:54:15 -07:00
parent 0203ffbef7
commit 7603c2e795
6 changed files with 36 additions and 15 deletions

View File

@ -53,6 +53,7 @@ namespace Strawberry
Path.GetDirectoryPath(exePath, exeDir); Path.GetDirectoryPath(exePath, exeDir);
Directory.SetCurrentDirectory(exeDir); Directory.SetCurrentDirectory(exeDir);
platformLayer.UpdateScreenMatrix();
platformLayer.Init(); platformLayer.Init();
Batcher = platformLayer.CreateBatcher(); Batcher = platformLayer.CreateBatcher();

View File

@ -9,22 +9,24 @@ namespace Strawberry
public struct Batch public struct Batch
{ {
public Mat4x4 Matrix;
public int IndicesStart; public int IndicesStart;
public int IndicesCount; public int IndicesCount;
public Texture Texture; public Texture Texture;
public BatchModes Mode; public BatchModes Mode;
public this(BatchModes mode, Texture texture, int start) public this(Mat4x4 matrix, BatchModes mode, Texture texture, int start)
{ {
Matrix = matrix;
Mode = mode; Mode = mode;
Texture = texture; Texture = texture;
IndicesStart = start; IndicesStart = start;
IndicesCount = 0; IndicesCount = 0;
} }
public bool Matches(BatchModes mode, Texture texture) public bool Matches(Mat4x4 matrix, BatchModes mode, Texture texture)
{ {
return Mode == mode && Texture == texture; return Matrix == matrix && Mode == mode && Texture == texture;
} }
} }
} }

View File

@ -8,12 +8,27 @@ namespace Strawberry
protected List<Vertex> vertices = new .() ~ delete _; protected List<Vertex> vertices = new .() ~ delete _;
protected List<uint32> indices = new .() ~ delete _; protected List<uint32> indices = new .() ~ delete _;
public Mat4x4 Matrix;
public this()
{
Reset();
}
public void Reset()
{
Matrix = Game.PlatformLayer.ScreenMatrix;
batches.Clear();
vertices.Clear();
indices.Clear();
}
public abstract void Draw(); public abstract void Draw();
protected ref Batch GetBatch(BatchModes mode, Texture texture) protected ref Batch GetBatch(BatchModes mode, Texture texture)
{ {
if (batches.Count == 0 || !batches.Back.Matches(mode, texture)) if (batches.Count == 0 || !batches.Back.Matches(Matrix, mode, texture))
batches.Add(Batch(mode, texture, indices.Count)); batches.Add(Batch(Matrix, mode, texture, indices.Count));
return ref batches.Back; return ref batches.Back;
} }

View File

@ -3,6 +3,15 @@ namespace Strawberry
{ {
public abstract class PlatformLayer public abstract class PlatformLayer
{ {
public Mat4x4 ScreenMatrix { get; private set; }
public void UpdateScreenMatrix()
{
ScreenMatrix = Mat4x4.CreateOrthographic(Game.Width, Game.Height * 0.5f, 0, 1)
* Mat4x4.CreateScale(.(1, -1, 1))
* Mat4x4.CreateTranslation(.(-1, 1, 0));
}
public abstract void Init(); public abstract void Init();
public abstract bool Closed(); // Returns whether the game window has been closed public abstract bool Closed(); // Returns whether the game window has been closed

View File

@ -45,8 +45,10 @@ namespace Strawberry.SDL2
GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, indexBufferID); GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
GL.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indices.Count * sizeof(uint32), indices.Ptr, GL.GL_DYNAMIC_DRAW); GL.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indices.Count * sizeof(uint32), indices.Ptr, GL.GL_DYNAMIC_DRAW);
for (let b in batches) for (var b in batches)
{ {
GL.glUniformMatrix4fv(platformLayer.TransformMatrixLocation, 1, GL.GL_FALSE, &b.Matrix.Values);
if (b.Mode == .Shape) if (b.Mode == .Shape)
GL.glBindTexture(GL.GL_TEXTURE_2D, 0); GL.glBindTexture(GL.GL_TEXTURE_2D, 0);
else else
@ -62,9 +64,7 @@ namespace Strawberry.SDL2
GL.glBindVertexArray(0); GL.glBindVertexArray(0);
vertices.Clear(); Reset();
indices.Clear();
batches.Clear();
} }
protected override void PushQuad(BatchModes mode, Texture texture, Vertex a, Vertex b, Vertex c, Vertex d) protected override void PushQuad(BatchModes mode, Texture texture, Vertex a, Vertex b, Vertex c, Vertex d)

View File

@ -154,12 +154,6 @@ namespace Strawberry.SDL2
GL.glClearColor(Game.ClearColor.Rf, Game.ClearColor.Gf, Game.ClearColor.Bf, Game.ClearColor.Af); GL.glClearColor(Game.ClearColor.Rf, Game.ClearColor.Gf, Game.ClearColor.Bf, Game.ClearColor.Af);
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
GL.glUseProgram(glProgram); GL.glUseProgram(glProgram);
Mat4x4 mat = Mat4x4.CreateOrthographic(Game.Width, Game.Height * 0.5f, 0, 1);
mat *= Mat4x4.CreateScale(.(1, -1, 1));
mat *= Mat4x4.CreateTranslation(.(-1, 1, 0));
GL.glUniformMatrix4fv(TransformMatrixLocation, 1, GL.GL_FALSE, &mat.Values);
} }
public override void RenderEnd() public override void RenderEnd()