mirror of
				https://github.com/MaddyThorson/StrawberryBF.git
				synced 2025-11-04 01:41:33 +08:00 
			
		
		
		
	More renderer work
This commit is contained in:
		@ -54,7 +54,7 @@ namespace Strawberry
 | 
			
		||||
			Directory.SetCurrentDirectory(exeDir);
 | 
			
		||||
 | 
			
		||||
			platformLayer.Init();
 | 
			
		||||
			Batcher = new Batcher();
 | 
			
		||||
			Batcher = platformLayer.CreateBatcher();
 | 
			
		||||
 | 
			
		||||
			VirtualInputs = new List<VirtualInput>();
 | 
			
		||||
			Input.[Friend]Init();
 | 
			
		||||
 | 
			
		||||
@ -2,108 +2,23 @@ using System.Collections;
 | 
			
		||||
 | 
			
		||||
namespace Strawberry
 | 
			
		||||
{
 | 
			
		||||
	public class Batcher
 | 
			
		||||
	public abstract class Batcher
 | 
			
		||||
	{
 | 
			
		||||
		private List<Batch> batches = new .() ~ delete _;
 | 
			
		||||
		private List<Vertex> vertices = new .() ~ delete _;
 | 
			
		||||
		private List<uint32> indices = new .() ~ delete _;
 | 
			
		||||
		protected List<Batch> batches = new .() ~ delete _;
 | 
			
		||||
		protected List<Vertex> vertices = new .() ~ delete _;
 | 
			
		||||
		protected List<uint32> indices = new .() ~ delete _;
 | 
			
		||||
 | 
			
		||||
		private uint32 vaoID;
 | 
			
		||||
		private uint32 vertexBufferID;
 | 
			
		||||
		private uint32 indexBufferID;
 | 
			
		||||
		public abstract void Draw();
 | 
			
		||||
 | 
			
		||||
		public this()
 | 
			
		||||
		{
 | 
			
		||||
			GL.glGenVertexArrays(1, &vaoID);
 | 
			
		||||
			GL.glBindVertexArray(vaoID);
 | 
			
		||||
			GL.glGenBuffers(1, &vertexBufferID);
 | 
			
		||||
			GL.glGenBuffers(1, &indexBufferID);
 | 
			
		||||
			GL.glBindVertexArray(0);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public ~this()
 | 
			
		||||
		{
 | 
			
		||||
			GL.glDeleteBuffers(1, &vertexBufferID);
 | 
			
		||||
			GL.glDeleteBuffers(1, &indexBufferID);
 | 
			
		||||
			GL.glDeleteVertexArrays(1, &vaoID);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void Draw()
 | 
			
		||||
		{
 | 
			
		||||
			GL.glDisable(GL.GL_CULL_FACE);
 | 
			
		||||
 | 
			
		||||
			GL.glBindVertexArray(vaoID);
 | 
			
		||||
 | 
			
		||||
			GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vertexBufferID);
 | 
			
		||||
			GL.glEnableVertexAttribArray(0);
 | 
			
		||||
			GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, sizeof(Vertex), (void*)0);
 | 
			
		||||
			GL.glEnableVertexAttribArray(1);
 | 
			
		||||
			GL.glVertexAttribPointer(1, 2, GL.GL_FLOAT, GL.GL_FALSE, sizeof(Vertex), (void*)8);
 | 
			
		||||
			GL.glEnableVertexAttribArray(2);
 | 
			
		||||
			GL.glVertexAttribPointer(2, 4, GL.GL_UNSIGNED_BYTE, GL.GL_TRUE, sizeof(Vertex), (void*)16);
 | 
			
		||||
			GL.glEnableVertexAttribArray(3);
 | 
			
		||||
			GL.glVertexAttribPointer(3, 3, GL.GL_UNSIGNED_BYTE, GL.GL_TRUE, sizeof(Vertex), (void*)20);
 | 
			
		||||
			GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.Count * sizeof(Vertex), vertices.Ptr, GL.GL_DYNAMIC_DRAW);
 | 
			
		||||
 | 
			
		||||
			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);
 | 
			
		||||
 | 
			
		||||
			for (let b in batches)
 | 
			
		||||
			{
 | 
			
		||||
				if (b.Mode == .Shape)
 | 
			
		||||
					GL.glBindTexture(GL.GL_TEXTURE_2D, 0);
 | 
			
		||||
				else
 | 
			
		||||
					GL.glBindTexture(GL.GL_TEXTURE_2D, b.Texture.Handle);
 | 
			
		||||
				GL.glDrawElements(GL.GL_TRIANGLES, b.IndicesCount, GL.GL_UNSIGNED_INT, (void*)(b.IndicesStart * sizeof(uint32)));
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			GL.glBindVertexArray(0);
 | 
			
		||||
 | 
			
		||||
			vertices.Clear();
 | 
			
		||||
			indices.Clear();
 | 
			
		||||
			batches.Clear();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private ref Batch GetBatch(BatchModes mode, Texture texture)
 | 
			
		||||
		protected ref Batch GetBatch(BatchModes mode, Texture texture)
 | 
			
		||||
		{
 | 
			
		||||
			if (batches.Count == 0 || !batches.Back.Matches(mode, texture))
 | 
			
		||||
				batches.Add(Batch(mode, texture, indices.Count));
 | 
			
		||||
			return ref batches.Back;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected void PushQuad(BatchModes mode, Texture texture, Vertex a, Vertex b, Vertex c, Vertex d)
 | 
			
		||||
		{
 | 
			
		||||
			GetBatch(mode, texture).IndicesCount += 6;
 | 
			
		||||
 | 
			
		||||
			uint32 count = (uint32)vertices.Count;
 | 
			
		||||
 | 
			
		||||
			vertices.Add(a);
 | 
			
		||||
			vertices.Add(b);
 | 
			
		||||
			vertices.Add(c);
 | 
			
		||||
			vertices.Add(d);
 | 
			
		||||
 | 
			
		||||
			indices.Add(count + 0);
 | 
			
		||||
			indices.Add(count + 1);
 | 
			
		||||
			indices.Add(count + 2);
 | 
			
		||||
			indices.Add(count + 0);
 | 
			
		||||
			indices.Add(count + 2);
 | 
			
		||||
			indices.Add(count + 3);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected void PushTri(BatchModes mode, Texture texture, Vertex a, Vertex b, Vertex c)
 | 
			
		||||
		{
 | 
			
		||||
			GetBatch(mode, texture).IndicesCount += 3;
 | 
			
		||||
 | 
			
		||||
			uint32 count = (uint32)vertices.Count;
 | 
			
		||||
 | 
			
		||||
			vertices.Add(a);
 | 
			
		||||
			vertices.Add(b);
 | 
			
		||||
			vertices.Add(c);
 | 
			
		||||
 | 
			
		||||
			indices.Add(count + 0);
 | 
			
		||||
			indices.Add(count + 1);
 | 
			
		||||
			indices.Add(count + 2);
 | 
			
		||||
		}
 | 
			
		||||
		protected abstract void PushQuad(BatchModes mode, Texture texture, Vertex a, Vertex b, Vertex c, Vertex d);
 | 
			
		||||
		protected abstract void PushTri(BatchModes mode, Texture texture, Vertex a, Vertex b, Vertex c);
 | 
			
		||||
 | 
			
		||||
		public void Rect(float x, float y, float w, float h, Color color)
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
@ -23,5 +23,6 @@ namespace Strawberry
 | 
			
		||||
 | 
			
		||||
		//Graphics
 | 
			
		||||
		public abstract Texture LoadTexture(String path);
 | 
			
		||||
		public abstract Batcher CreateBatcher();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										103
									
								
								src/PlatformLayer/SDL2/SDL2Batcher.bf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								src/PlatformLayer/SDL2/SDL2Batcher.bf
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,103 @@
 | 
			
		||||
namespace Strawberry.SDL2
 | 
			
		||||
{
 | 
			
		||||
	public class SDL2Batcher : Batcher
 | 
			
		||||
	{
 | 
			
		||||
		private SDL2PlatformLayer platformLayer;
 | 
			
		||||
		private uint32 vaoID;
 | 
			
		||||
		private uint32 vertexBufferID;
 | 
			
		||||
		private uint32 indexBufferID;
 | 
			
		||||
 | 
			
		||||
		public this(SDL2PlatformLayer platformLayer)
 | 
			
		||||
		{
 | 
			
		||||
			this.platformLayer = platformLayer;
 | 
			
		||||
 | 
			
		||||
			GL.glGenVertexArrays(1, &vaoID);
 | 
			
		||||
			GL.glBindVertexArray(vaoID);
 | 
			
		||||
			GL.glGenBuffers(1, &vertexBufferID);
 | 
			
		||||
			GL.glGenBuffers(1, &indexBufferID);
 | 
			
		||||
			GL.glBindVertexArray(0);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public ~this()
 | 
			
		||||
		{
 | 
			
		||||
			GL.glDeleteBuffers(1, &vertexBufferID);
 | 
			
		||||
			GL.glDeleteBuffers(1, &indexBufferID);
 | 
			
		||||
			GL.glDeleteVertexArrays(1, &vaoID);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override void Draw()
 | 
			
		||||
		{
 | 
			
		||||
			GL.glDisable(GL.GL_CULL_FACE);
 | 
			
		||||
 | 
			
		||||
			GL.glBindVertexArray(vaoID);
 | 
			
		||||
 | 
			
		||||
			GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vertexBufferID);
 | 
			
		||||
			GL.glEnableVertexAttribArray(0);
 | 
			
		||||
			GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, sizeof(Vertex), (void*)0);
 | 
			
		||||
			GL.glEnableVertexAttribArray(1);
 | 
			
		||||
			GL.glVertexAttribPointer(1, 2, GL.GL_FLOAT, GL.GL_FALSE, sizeof(Vertex), (void*)8);
 | 
			
		||||
			GL.glEnableVertexAttribArray(2);
 | 
			
		||||
			GL.glVertexAttribPointer(2, 4, GL.GL_UNSIGNED_BYTE, GL.GL_TRUE, sizeof(Vertex), (void*)16);
 | 
			
		||||
			GL.glEnableVertexAttribArray(3);
 | 
			
		||||
			GL.glVertexAttribPointer(3, 3, GL.GL_UNSIGNED_BYTE, GL.GL_TRUE, sizeof(Vertex), (void*)20);
 | 
			
		||||
			GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.Count * sizeof(Vertex), vertices.Ptr, GL.GL_DYNAMIC_DRAW);
 | 
			
		||||
 | 
			
		||||
			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);
 | 
			
		||||
 | 
			
		||||
			for (let b in batches)
 | 
			
		||||
			{
 | 
			
		||||
				if (b.Mode == .Shape)
 | 
			
		||||
					GL.glBindTexture(GL.GL_TEXTURE_2D, 0);
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					GL.glActiveTexture(GL.GL_TEXTURE0);
 | 
			
		||||
					GL.glBindTexture(GL.GL_TEXTURE_2D, b.Texture.Handle);
 | 
			
		||||
					int32 num = 0;
 | 
			
		||||
					GL.glUniform1iv(platformLayer.TextureMatrixLocation, 1, &num);
 | 
			
		||||
				}
 | 
			
		||||
				GL.glDrawElements(GL.GL_TRIANGLES, b.IndicesCount, GL.GL_UNSIGNED_INT, (void*)(b.IndicesStart * sizeof(uint32)));
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			GL.glBindVertexArray(0);
 | 
			
		||||
 | 
			
		||||
			vertices.Clear();
 | 
			
		||||
			indices.Clear();
 | 
			
		||||
			batches.Clear();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected override void PushQuad(BatchModes mode, Texture texture, Vertex a, Vertex b, Vertex c, Vertex d)
 | 
			
		||||
		{
 | 
			
		||||
			GetBatch(mode, texture).IndicesCount += 6;
 | 
			
		||||
 | 
			
		||||
			uint32 count = (uint32)vertices.Count;
 | 
			
		||||
 | 
			
		||||
			vertices.Add(a);
 | 
			
		||||
			vertices.Add(b);
 | 
			
		||||
			vertices.Add(c);
 | 
			
		||||
			vertices.Add(d);
 | 
			
		||||
 | 
			
		||||
			indices.Add(count + 0);
 | 
			
		||||
			indices.Add(count + 1);
 | 
			
		||||
			indices.Add(count + 2);
 | 
			
		||||
			indices.Add(count + 0);
 | 
			
		||||
			indices.Add(count + 2);
 | 
			
		||||
			indices.Add(count + 3);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected override void PushTri(BatchModes mode, Texture texture, Vertex a, Vertex b, Vertex c)
 | 
			
		||||
		{
 | 
			
		||||
			GetBatch(mode, texture).IndicesCount += 3;
 | 
			
		||||
 | 
			
		||||
			uint32 count = (uint32)vertices.Count;
 | 
			
		||||
 | 
			
		||||
			vertices.Add(a);
 | 
			
		||||
			vertices.Add(b);
 | 
			
		||||
			vertices.Add(c);
 | 
			
		||||
 | 
			
		||||
			indices.Add(count + 0);
 | 
			
		||||
			indices.Add(count + 1);
 | 
			
		||||
			indices.Add(count + 2);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -6,6 +6,9 @@ namespace Strawberry.SDL2
 | 
			
		||||
{
 | 
			
		||||
	public class SDL2PlatformLayer : PlatformLayer
 | 
			
		||||
	{
 | 
			
		||||
		public int TransformMatrixLocation { get; private set; }
 | 
			
		||||
		public int TextureMatrixLocation { get; private set; }
 | 
			
		||||
 | 
			
		||||
		private SDL.Window* window;
 | 
			
		||||
		private SDL.Surface* screen;
 | 
			
		||||
		private SDL.Rect screenRect;
 | 
			
		||||
@ -97,6 +100,9 @@ namespace Strawberry.SDL2
 | 
			
		||||
				GL.glAttachShader(glProgram, shader.fragmentHandle);
 | 
			
		||||
				GL.glLinkProgram(glProgram);
 | 
			
		||||
 | 
			
		||||
				TransformMatrixLocation = GL.glGetUniformLocation(glProgram, "u_matrix");
 | 
			
		||||
				TextureMatrixLocation = GL.glGetUniformLocation(glProgram, "u_texture");
 | 
			
		||||
 | 
			
		||||
				int32 logLen = 0;
 | 
			
		||||
				char8[1024] log;
 | 
			
		||||
				GL.glGetProgramInfoLog(glProgram, 1024, &logLen, &log);
 | 
			
		||||
@ -153,8 +159,7 @@ namespace Strawberry.SDL2
 | 
			
		||||
			mat *= Mat4x4.CreateScale(.(1, -1, 1));
 | 
			
		||||
			mat *= Mat4x4.CreateTranslation(.(-1, 1, 0));
 | 
			
		||||
 | 
			
		||||
			let loc = GL.glGetUniformLocation(glProgram, "u_matrix");
 | 
			
		||||
			GL.glUniformMatrix4fv(loc, 1, GL.GL_FALSE, &mat.Values);
 | 
			
		||||
			GL.glUniformMatrix4fv(TransformMatrixLocation, 1, GL.GL_FALSE, &mat.Values);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override void RenderEnd()
 | 
			
		||||
@ -164,6 +169,11 @@ namespace Strawberry.SDL2
 | 
			
		||||
			SDL.GL_SwapWindow(window);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override Batcher CreateBatcher()
 | 
			
		||||
		{
 | 
			
		||||
			return new SDL2Batcher(this);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override Texture LoadTexture(String path)
 | 
			
		||||
		{
 | 
			
		||||
			let surface = SDLImage.Load(path);
 | 
			
		||||
@ -1,3 +1,4 @@
 | 
			
		||||
using System;
 | 
			
		||||
namespace Strawberry
 | 
			
		||||
{
 | 
			
		||||
	class Shader
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user