diff --git a/src/SlatedGameToolkit.Commons/Loaders/TextureLoader.cs b/src/SlatedGameToolkit.Commons/Loaders/TextureLoader.cs index 47e73b4..b4d427e 100644 --- a/src/SlatedGameToolkit.Commons/Loaders/TextureLoader.cs +++ b/src/SlatedGameToolkit.Commons/Loaders/TextureLoader.cs @@ -1,38 +1,27 @@ -using System; -using System.Runtime.InteropServices; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; -using SlatedGameToolkit.Framework.Exceptions; +using System.IO; using SlatedGameToolkit.Framework.Graphics.OpenGL; using SlatedGameToolkit.Framework.Graphics.Textures; +using StbImageSharp; namespace SlatedGameToolkit.Commons.Loaders { public static class TextureLoader { /// - /// Loads a texture using SDL2's image library. - /// Therefore, technically, this function should be able to laod any format SDL2 Image can load. + /// Loads a texture using StbImage library. + /// Any format supported by StbImage is therefore supported. /// /// The path of the texture to load. - /// The OpenGL context the texture is to be associated with. May be null. - /// An OpenGL Texture associated with the given context. - public static Texture LoadTexture(string path, GLContext glContext) + /// The OpenGL context to associate the texture with. + /// A texture. + public static Texture Load2DTexture(string path, GLContext glContext = null) { - TextureData textureData; - using (Image image = Image.Load(path)) + using (Stream stream = File.OpenRead(path)) { - byte[] pixelData; - Span pixelDataSpan; - if (image.TryGetSinglePixelSpan(out pixelDataSpan)) { - pixelData = MemoryMarshal.AsBytes(pixelDataSpan).ToArray(); - } else { - throw new FrameworkUsageException("Image too large!"); - } - textureData = new TextureData(image.Width, image.Height, pixelData); + ImageResult image = ImageResult.FromStream(stream, ColorComponents.RedGreenBlueAlpha); + TextureData textureData = new TextureData(image.Width, image.Height, image.Data); + return new Texture(textureData, glContext); } - - return new Texture(textureData, glContext); } } } diff --git a/src/SlatedGameToolkit.Commons/SlatedGameToolkit.Commons.csproj b/src/SlatedGameToolkit.Commons/SlatedGameToolkit.Commons.csproj index cd9d73f..099bc47 100644 --- a/src/SlatedGameToolkit.Commons/SlatedGameToolkit.Commons.csproj +++ b/src/SlatedGameToolkit.Commons/SlatedGameToolkit.Commons.csproj @@ -1,15 +1,16 @@ - netstandard2.1 + netcoreapp3.1 + true - - - - - + + + + + diff --git a/src/SlatedGameToolkit.Framework/Graphics/Render/VertexArrayBuffers.cs b/src/SlatedGameToolkit.Framework/Graphics/Render/VertexArrayBuffers.cs index 0fe0d79..4a54bb9 100644 --- a/src/SlatedGameToolkit.Framework/Graphics/Render/VertexArrayBuffers.cs +++ b/src/SlatedGameToolkit.Framework/Graphics/Render/VertexArrayBuffers.cs @@ -8,9 +8,17 @@ namespace SlatedGameToolkit.Framework.Graphics.Render /// A set of two buffers, one for the vertices, and one for the indices. Also defines an vertex array that defines the attributes of the buffers. /// public class VertexArrayBuffers : IDisposable { + private uint vertexBufferLength, indexBufferLength; private GLContext glContext; private bool disposed; private uint vertexBufferHandle, vertexArrayHandle, indexBufferHandle; + + /// + /// Create a vertex array, a elements buffer, and an vertice array buffer. + /// + /// Automatically checks if resizing the buffers are nessecary. + /// + /// public VertexArrayBuffers(GLContext context) { this.glContext = context ?? WindowContextsManager.CurrentGL; @@ -33,15 +41,27 @@ namespace SlatedGameToolkit.Framework.Graphics.Render public unsafe void BufferVertices(float[] data, bool dynamic) { Use(); + uint requiredLength = (uint) (sizeof(float) * data.Length); fixed (void* pointer = &data[0]) { - glContext.BufferData(OpenGL.BufferTargetARB.ArrayBuffer, (uint) (sizeof(float) * data.Length), new IntPtr(pointer), dynamic ? OpenGL.BufferUsageARB.DynamicDraw : OpenGL.BufferUsageARB.StaticDraw); + if (requiredLength > vertexBufferLength) { + glContext.BufferData(BufferTargetARB.ArrayBuffer, requiredLength, new IntPtr(pointer), dynamic ? OpenGL.BufferUsageARB.DynamicDraw : OpenGL.BufferUsageARB.StaticDraw); + vertexBufferLength = requiredLength; + } else { + glContext.BufferSubData(BufferTargetARB.ArrayBuffer, IntPtr.Zero, new IntPtr(requiredLength), new IntPtr(pointer)); + } } } public unsafe void BufferIndices(uint[] data, bool dynamic) { Use(); + uint requiredLength = (uint) (sizeof(uint) * data.Length); fixed (void* pointer = &data[0]) { - glContext.BufferData(OpenGL.BufferTargetARB.ElementArrayBuffer, (uint) (sizeof(uint) * data.Length), new IntPtr(pointer), dynamic ? OpenGL.BufferUsageARB.DynamicDraw : OpenGL.BufferUsageARB.StaticDraw); + if (requiredLength > indexBufferLength) { + glContext.BufferData(OpenGL.BufferTargetARB.ElementArrayBuffer, requiredLength, new IntPtr(pointer), dynamic ? OpenGL.BufferUsageARB.DynamicDraw : OpenGL.BufferUsageARB.StaticDraw); + indexBufferLength = requiredLength; + } else { + glContext.BufferSubData(BufferTargetARB.ElementArrayBuffer, IntPtr.Zero, new IntPtr(requiredLength), new IntPtr(pointer)); + } } } diff --git a/src/SlatedGameToolkit.Framework/SlatedGameToolkit.Framework.csproj b/src/SlatedGameToolkit.Framework/SlatedGameToolkit.Framework.csproj index ba806ab..9087452 100644 --- a/src/SlatedGameToolkit.Framework/SlatedGameToolkit.Framework.csproj +++ b/src/SlatedGameToolkit.Framework/SlatedGameToolkit.Framework.csproj @@ -6,6 +6,7 @@ + diff --git a/src/SlatedGameToolkit.Tools/Utilities/Playground/MainState.cs b/src/SlatedGameToolkit.Tools/Utilities/Playground/MainState.cs index 12a5b71..f7b61c7 100644 --- a/src/SlatedGameToolkit.Tools/Utilities/Playground/MainState.cs +++ b/src/SlatedGameToolkit.Tools/Utilities/Playground/MainState.cs @@ -51,7 +51,7 @@ namespace SlatedGameToolkit.Tools.Utilities.Playground camera = new Camera2D(2, 2); renderer = new MeshBatch(camera); - logoTexture = TextureLoader.LoadTexture("Resources/Playground/yhdnbgnc.png", null); + logoTexture = TextureLoader.Load2DTexture("Resources/Playground/yhdnbgnc.png", null); logo = new RectangleMesh(logoTexture, Color.White); logo.Width = 0.5f; logo.Height = 0.5f; @@ -59,7 +59,7 @@ namespace SlatedGameToolkit.Tools.Utilities.Playground logo.Y = -0.25f; - fillerTexture = TextureLoader.LoadTexture("Resources/Playground/filler.png", null); + fillerTexture = TextureLoader.Load2DTexture("Resources/Playground/filler.png", null); textureTester = new RectangleMesh(fillerTexture, Color.White); textureTester.Width = 0.15f; textureTester.Height = 0.15f;