diff --git a/Diamond/NLog.config b/Diamond/NLog.config
index 5931ee4..50c2bb0 100644
--- a/Diamond/NLog.config
+++ b/Diamond/NLog.config
@@ -16,6 +16,6 @@
-
+
diff --git a/Diamond/Shaders/Program.cs b/Diamond/Shaders/Program.cs
index c7e6a6a..3ee45d6 100644
--- a/Diamond/Shaders/Program.cs
+++ b/Diamond/Shaders/Program.cs
@@ -124,7 +124,7 @@ namespace Diamond.Shaders
{
if (shaders == null)
{
- Logger.Error("Cannot create a program with no shaders.");
+ Logger.Error("Cannot create program {0} with no shaders.", name);
return null;
}
@@ -134,7 +134,16 @@ namespace Diamond.Shaders
Logger.Debug("Created {0}", service);
foreach (var shader in shaders)
+ {
+ if (shader == null)
+ {
+ Logger.Error("One or more shaders failed to compile - cannot create program {0}", name);
+ service.Dispose();
+ return null;
+ }
+
wrapper.Attach((ShaderWrapper) shader.Wrapper);
+ }
service.Link();
@@ -162,7 +171,9 @@ namespace Diamond.Shaders
return FromShaders(name, shaderList);
}
- public static Program FromFiles(string name, params string[] paths) => FromShaders(name, paths.Select(Shader.FromFile));
+ public static Program FromFiles(string name, params string[] paths) => FromShaders(name,
+ paths.Select(Shader.FromFile));
+
public static Program FromFiles(params string[] paths) => FromShaders(paths.Select(Shader.FromFile));
#endregion
diff --git a/hexworld/HexRender.cs b/hexworld/HexRender.cs
index eb2e466..69eea6c 100644
--- a/hexworld/HexRender.cs
+++ b/hexworld/HexRender.cs
@@ -73,9 +73,6 @@ namespace hexworld
_doorTex = Texture.FromFile("res/door.png");
_grassTex = Texture.FromFile("res/grass.png");
- _meshBuffer = new GLBuffer(BufferTarget.ArrayBuffer);
- _tileBuffer = new GLBuffer(BufferTarget.ArrayBuffer, BufferUsageHint.DynamicDraw);
-
var dir = "res";
var json = JObject.Parse(File.ReadAllText("res/level.json"));
@@ -93,8 +90,6 @@ namespace hexworld
_doorTiles = allTiles[0];
_floorTiles = allTiles[1];
- _tileBuffer.Data(SubArray.Join(_doorTiles, _floorTiles));
-
var cubeMesh = json["models"]
.Select(path => (string) path)
.Select(path => Path.Combine(dir, path))
@@ -104,12 +99,10 @@ namespace hexworld
_cubeMesh = cubeMesh;
- _meshBuffer.Data(cubeMesh.Vertices.ToArray());
-
- // meshes, tiles, etc
-
- // can still use JObject queries to keep it short,
- // but don't use Level. hat structure is broken
+ _tileBuffer = GLBuffer.FromData(SubArray.Join(_doorTiles, _floorTiles), BufferTarget.ArrayBuffer,
+ BufferUsageHint.DynamicDraw, "tile");
+ _meshBuffer = GLBuffer.FromData(cubeMesh.Vertices.ToArray(), BufferTarget.ArrayBuffer,
+ BufferUsageHint.StaticDraw, "mesh");
}
protected override void OnUpdateFrame(FrameEventArgs e)
@@ -137,18 +130,29 @@ namespace hexworld
GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
- _texPgm.Use();
- _texPgm.SetAttribPointers(_meshBuffer);
- _texPgm.SetAttribPointers(_tileBuffer);
+ if (_texPgm != null)
+ {
+ _texPgm.Use();
- _grassTex.Bind(0);
+ _meshBuffer.PointTo(_texPgm);
+ _tileBuffer.PointTo(_texPgm);
- GL.Uniform1(_texPgm.GetUniform("tex"), 0);
- GL.UniformMatrix4(_texPgm.GetUniform("view"), false, ref _view);
- GL.UniformMatrix4(_texPgm.GetUniform("proj"), false, ref _proj);
+ _grassTex.Bind(0);
- _cubeMesh.DrawInstanced(_floorTiles);
+ var texLoc = _texPgm.UniformLocation("tex");
+ var viewLoc = _texPgm.UniformLocation("view");
+ var projLoc = _texPgm.UniformLocation("proj");
+
+ if (texLoc.HasValue)
+ GL.Uniform1(texLoc.Value, 0);
+ if (viewLoc.HasValue)
+ GL.UniformMatrix4(viewLoc.Value, false, ref _view);
+ if (projLoc.HasValue)
+ GL.UniformMatrix4(projLoc.Value, false, ref _proj);
+
+ _cubeMesh.DrawInstanced(_floorTiles);
+ }
SwapBuffers();
}