diff --git a/Diamond/Buffers/Buffer.cs b/Diamond/Buffers/Buffer.cs index 8e386f3..aefe9be 100644 --- a/Diamond/Buffers/Buffer.cs +++ b/Diamond/Buffers/Buffer.cs @@ -42,8 +42,8 @@ namespace Diamond.Buffers { if (_vdi == null) { - var exception = new InvalidOperationException($"Cannot use type {typeof(T)} to create a VertexBuffer"); - GLBuffer.Logger.Error(exception); + var exception = new InvalidOperationException($"Cannot use type {typeof(T)} to create a Vertex Buffer"); + Logger.Error(exception); throw exception; } @@ -56,15 +56,11 @@ namespace Diamond.Buffers } } - public override string ToString() => Name == null ? $"{Target} ({Id})" : $"{Target} {Name} ({Id})"; - } + public override string ToString() => Name == null + ? $"Buffer<{typeof(T).Name}> {Target} ({Id})" + : $"Buffer<{typeof(T).Name}> {Target} {Name} ({Id})"; - public static class GLBuffer - { - internal static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - public static Buffer Empty(BufferTarget target, BufferUsageHint usage = BufferUsageHint.StaticDraw, - string name = null) where T : struct + internal static Buffer Empty(BufferTarget target, BufferUsageHint usage, string name) { var wrapper = new BufferWrap(target, usage); var service = new Buffer(wrapper, name); @@ -74,15 +70,23 @@ namespace Diamond.Buffers return service; } - public static Buffer FromData(T[] data, BufferTarget target, - BufferUsageHint usage = BufferUsageHint.StaticDraw, - string name = null) where T : struct + internal static Buffer FromData(T[] data, BufferTarget target, BufferUsageHint usage, string name = null) { - var service = Empty(target, usage, name); + var service = Empty(target, usage, name); service?.Data(data); return service; } } + + public static class Buffer + { + public static Buffer Empty(BufferTarget target, BufferUsageHint usage = BufferUsageHint.StaticDraw, + string name = null) where T : struct => Buffer.Empty(target, usage, name); + + public static Buffer FromData(T[] data, BufferTarget target, + BufferUsageHint usage = BufferUsageHint.StaticDraw, + string name = null) where T : struct => Buffer.FromData(data, target, usage, name); + } } \ No newline at end of file diff --git a/Diamond/GLObject.cs b/Diamond/GLObject.cs index 812c532..7fce728 100644 --- a/Diamond/GLObject.cs +++ b/Diamond/GLObject.cs @@ -6,7 +6,7 @@ namespace Diamond { public abstract class GLObject : IDisposable { - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + protected static readonly Logger Logger = LogManager.GetLogger("GLObject"); private bool _disposed; @@ -22,6 +22,7 @@ namespace Diamond if (disposing) { + Logger.Debug("Disposing {0}", this); Wrapper.Dispose(); } diff --git a/Diamond/NLog.xsd b/Diamond/NLog.xsd index 53a7cb6..532c73e 100644 --- a/Diamond/NLog.xsd +++ b/Diamond/NLog.xsd @@ -2173,7 +2173,7 @@ - + @@ -2187,7 +2187,7 @@ Name of the target. - + Indicates whether performance counter should be automatically created. diff --git a/Diamond/Shaders/Program.cs b/Diamond/Shaders/Program.cs index aae0a78..23e5dae 100644 --- a/Diamond/Shaders/Program.cs +++ b/Diamond/Shaders/Program.cs @@ -8,14 +8,11 @@ namespace Diamond.Shaders { public class Program : GLObject { - internal static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - internal ProgramWrap _program; + private readonly ProgramWrap _program; internal override Wrapper Wrapper => _program; public static Program Current { get; private set; } - private readonly List _shaders = new List(); private readonly Dictionary _uniforms = new Dictionary(); private readonly Dictionary _attributes = new Dictionary(); @@ -73,7 +70,6 @@ namespace Diamond.Shaders private void Attach(Shader shader) { - _shaders.Add(shader); _program.Attach((ShaderWrap) shader.Wrapper); } @@ -81,9 +77,6 @@ namespace Diamond.Shaders protected override void Dispose(bool disposing) { - foreach (var shader in _shaders) - shader.Dispose(); - base.Dispose(disposing); } @@ -143,7 +136,17 @@ namespace Diamond.Shaders return FromShaders(name, shaderList); } - public static Program FromFiles(params string[] paths) => FromShaders(paths.Select(Shader.FromFile)); + public static Program FromFiles(params string[] paths) + { + var shaders = paths.Select(Shader.FromFile).ToList(); + + var program = FromShaders(shaders); + + foreach (var shader in shaders) + shader.Dispose(); + + return program; + } #endregion } diff --git a/Diamond/Shaders/Shader.cs b/Diamond/Shaders/Shader.cs index 4d2bf53..05ebbe7 100644 --- a/Diamond/Shaders/Shader.cs +++ b/Diamond/Shaders/Shader.cs @@ -8,8 +8,6 @@ namespace Diamond.Shaders { public class Shader : GLObject { - internal static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private readonly ShaderWrap _shader; internal override Wrapper Wrapper => _shader; @@ -35,7 +33,7 @@ namespace Diamond.Shaders [".fs"] = ShaderType.FragmentShader, [".frag"] = ShaderType.FragmentShader, }; - + public static Shader FromSource(string source, ShaderType type, string name = "Shader") { var wrapper = new ShaderWrap(type); @@ -82,7 +80,6 @@ namespace Diamond.Shaders var ext = Path.GetExtension(path); var name = Path.GetFileNameWithoutExtension(path); - if (ext != null) if (!Extensions.ContainsKey(ext)) ext = Path.GetExtension(name); @@ -94,6 +91,7 @@ namespace Diamond.Shaders } var type = Extensions[ext]; + return FromFile(path, type); } diff --git a/Diamond/Textures/Texture.cs b/Diamond/Textures/Texture.cs index dacc768..cbe28d3 100644 --- a/Diamond/Textures/Texture.cs +++ b/Diamond/Textures/Texture.cs @@ -9,8 +9,6 @@ namespace Diamond.Textures { public class Texture : GLObject { - internal static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private readonly TextureWrap _texture; internal override Wrapper Wrapper => _texture; @@ -27,29 +25,33 @@ namespace Diamond.Textures public override string ToString() => Name == null ? $"{Target} ({Id})" : $"{Target} \'{Name}\' ({Id})"; + #region Factory Methods + public static Texture FromBitmap(Bitmap bmp, string name = null) { - var wrapper= new TextureWrap(TextureTarget.Texture2D); + var wrapper = new TextureWrap(TextureTarget.Texture2D); var service = new Texture(wrapper, null); - Logger.Debug("Created texture {0}", service); + Logger.Debug("Created Texture {0}", service); wrapper.Bind(); - wrapper.TexParameter(TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); - wrapper.TexParameter(TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); + wrapper.TexParameter(TextureParameterName.TextureMinFilter, (int) TextureMinFilter.Nearest); + wrapper.TexParameter(TextureParameterName.TextureMagFilter, (int) TextureMagFilter.Nearest); var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - wrapper.Image2D(PixelInternalFormat.Rgba, bmp.Width,bmp.Height,PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); + wrapper.Image2D(PixelInternalFormat.Rgba, bmp.Width, bmp.Height, PixelFormat.Bgra, PixelType.UnsignedByte, + data.Scan0); bmp.UnlockBits(data); return service; } - public static Texture FromFile(string path) { return FromBitmap(new Bitmap(path)); } + + #endregion } } \ No newline at end of file diff --git a/Diamond/Wrappers/BufferWrap.cs b/Diamond/Wrappers/BufferWrap.cs index 3621b36..98f304a 100644 --- a/Diamond/Wrappers/BufferWrap.cs +++ b/Diamond/Wrappers/BufferWrap.cs @@ -5,16 +5,16 @@ namespace Diamond.Wrappers { internal sealed class BufferWrap : Wrapper { - #region Constructor, Delete() + #region Constructor, GLDelete() internal BufferWrap(BufferTarget target, BufferUsageHint usage) + : base(GL.GenBuffer()) { - Id = GL.GenBuffer(); Target = target; Usage = usage; } - public override void Delete() => GL.DeleteBuffer(Id); + protected override void GLDelete() => GL.DeleteBuffer(Id); #endregion diff --git a/Diamond/Wrappers/ProgramWrap.cs b/Diamond/Wrappers/ProgramWrap.cs index 884e94a..6c489c9 100644 --- a/Diamond/Wrappers/ProgramWrap.cs +++ b/Diamond/Wrappers/ProgramWrap.cs @@ -5,14 +5,14 @@ namespace Diamond.Wrappers { internal sealed class ProgramWrap : Wrapper { - #region Constructor, Delete() + #region Constructor, GLDelete() internal ProgramWrap() + : base(GL.CreateProgram()) { - Id = GL.CreateProgram(); } - public override void Delete() => GL.DeleteProgram(Id); + protected override void GLDelete() => GL.DeleteProgram(Id); #endregion diff --git a/Diamond/Wrappers/ShaderWrap.cs b/Diamond/Wrappers/ShaderWrap.cs index b65f470..266b67a 100644 --- a/Diamond/Wrappers/ShaderWrap.cs +++ b/Diamond/Wrappers/ShaderWrap.cs @@ -5,15 +5,15 @@ namespace Diamond.Wrappers { internal sealed class ShaderWrap : Wrapper { - #region Constructor, Delete() + #region Constructor, GLDelete() internal ShaderWrap(ShaderType shaderType) + : base(GL.CreateShader(shaderType)) { - Id = GL.CreateShader(shaderType); ShaderType = shaderType; } - public override void Delete() => GL.DeleteShader(Id); + protected override void GLDelete() => GL.DeleteShader(Id); #endregion diff --git a/Diamond/Wrappers/TextureWrap.cs b/Diamond/Wrappers/TextureWrap.cs index 1673ffa..bd90bbe 100644 --- a/Diamond/Wrappers/TextureWrap.cs +++ b/Diamond/Wrappers/TextureWrap.cs @@ -5,15 +5,15 @@ namespace Diamond.Wrappers { internal sealed class TextureWrap : Wrapper { - #region Constructor, Delete() + #region Constructor, GLDelete() internal TextureWrap(TextureTarget target) + : base(GL.GenTexture()) { - Id = GL.GenTexture(); Target = target; } - public override void Delete() => GL.DeleteTexture(Id); + protected override void GLDelete() => GL.DeleteTexture(Id); #endregion diff --git a/Diamond/Wrappers/Wrapper.cs b/Diamond/Wrappers/Wrapper.cs index 3f09ae5..85578a2 100644 --- a/Diamond/Wrappers/Wrapper.cs +++ b/Diamond/Wrappers/Wrapper.cs @@ -6,15 +6,20 @@ namespace Diamond.Wrappers { internal abstract class Wrapper : IDisposable { - private static readonly Logger Logger = LogManager.GetLogger("OpenGL Wrapper"); + protected static readonly Logger Logger = LogManager.GetLogger("Wrapper"); - public int Id { get; protected set; } + public int Id { get; private set; } public static explicit operator int(Wrapper o) => o.Id; + protected Wrapper(int id) + { + Id = id; + } + #region IDisposable - public abstract void Delete(); + protected abstract void GLDelete(); protected virtual void Dispose(bool disposing) { @@ -26,7 +31,7 @@ namespace Diamond.Wrappers if (GraphicsContext.CurrentContext == null) Logger.Error("No graphics context, cannot delete {0}", this); else - Delete(); + GLDelete(); Id = 0; diff --git a/hexworld/HexRender.cs b/hexworld/HexRender.cs index efa06f8..4ac30d4 100644 --- a/hexworld/HexRender.cs +++ b/hexworld/HexRender.cs @@ -10,6 +10,7 @@ using Newtonsoft.Json.Linq; using OpenTK; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL4; +using Buffer = Diamond.Buffers.Buffer; namespace hexworld { @@ -96,9 +97,9 @@ namespace hexworld _cubeMesh = cubeMesh; - _tileBuffer = GLBuffer.FromData(SubArray.Join(_doorTiles, _floorTiles), BufferTarget.ArrayBuffer, + _tileBuffer = Buffer.FromData(SubArray.Join(_doorTiles, _floorTiles), BufferTarget.ArrayBuffer, BufferUsageHint.DynamicDraw, "tile"); - _meshBuffer = GLBuffer.FromData(cubeMesh.Vertices.ToArray(), BufferTarget.ArrayBuffer, + _meshBuffer = Buffer.FromData(cubeMesh.Vertices.ToArray(), BufferTarget.ArrayBuffer, BufferUsageHint.StaticDraw, "mesh"); }