Wrapper and GLObject each have one logger instance - all globjects and wrappers use that logger

This commit is contained in:
2017-03-01 15:25:50 -05:00
parent b64f2a030c
commit e4081ea662
12 changed files with 70 additions and 56 deletions

View File

@@ -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<T> Empty<T>(BufferTarget target, BufferUsageHint usage = BufferUsageHint.StaticDraw,
string name = null) where T : struct
internal static Buffer<T> Empty(BufferTarget target, BufferUsageHint usage, string name)
{
var wrapper = new BufferWrap(target, usage);
var service = new Buffer<T>(wrapper, name);
@@ -74,15 +70,23 @@ namespace Diamond.Buffers
return service;
}
public static Buffer<T> FromData<T>(T[] data, BufferTarget target,
BufferUsageHint usage = BufferUsageHint.StaticDraw,
string name = null) where T : struct
internal static Buffer<T> FromData(T[] data, BufferTarget target, BufferUsageHint usage, string name = null)
{
var service = Empty<T>(target, usage, name);
var service = Empty(target, usage, name);
service?.Data(data);
return service;
}
}
public static class Buffer
{
public static Buffer<T> Empty<T>(BufferTarget target, BufferUsageHint usage = BufferUsageHint.StaticDraw,
string name = null) where T : struct => Buffer<T>.Empty(target, usage, name);
public static Buffer<T> FromData<T>(T[] data, BufferTarget target,
BufferUsageHint usage = BufferUsageHint.StaticDraw,
string name = null) where T : struct => Buffer<T>.FromData(data, target, usage, name);
}
}

View File

@@ -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();
}

View File

@@ -2173,7 +2173,7 @@
<xs:extension base="Target">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="name" minOccurs="0" maxOccurs="1" shaderType="xs:string" />
<xs:element name="autoCreate" minOccurs="0" maxOccurs="1" shaderType="xs:boolean" />
<xs:element name="autoGLCreate" minOccurs="0" maxOccurs="1" shaderType="xs:boolean" />
<xs:element name="categoryName" minOccurs="0" maxOccurs="1" shaderType="xs:string" />
<xs:element name="counterHelp" minOccurs="0" maxOccurs="1" shaderType="xs:string" />
<xs:element name="counterName" minOccurs="0" maxOccurs="1" shaderType="xs:string" />
@@ -2187,7 +2187,7 @@
<xs:documentation>Name of the target.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="autoCreate" shaderType="xs:boolean">
<xs:attribute name="autoGLCreate" shaderType="xs:boolean">
<xs:annotation>
<xs:documentation>Indicates whether performance counter should be automatically created.</xs:documentation>
</xs:annotation>

View File

@@ -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<Shader> _shaders = new List<Shader>();
private readonly Dictionary<string, int> _uniforms = new Dictionary<string, int>();
private readonly Dictionary<string, int> _attributes = new Dictionary<string, int>();
@@ -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
}

View File

@@ -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);
}

View File

@@ -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
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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");
}