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