diff --git a/Diamond/Render/RenderGroup.cs b/Diamond/Render/RenderGroup.cs index 121783f..0e2bd0f 100644 --- a/Diamond/Render/RenderGroup.cs +++ b/Diamond/Render/RenderGroup.cs @@ -1,5 +1,4 @@ -using System; -using Diamond.Buffers; +using Diamond.Buffers; using Diamond.Shaders; using Diamond.Textures; using Diamond.Util; @@ -7,25 +6,55 @@ using OpenTK.Graphics.OpenGL4; namespace Diamond.Render { - public class RenderGroup + /// + /// Manage a group of buffers, ranges, and uniforms to render + /// + /// The type of data to use as Instance information + /// The type of data to use as Vertex information + public class RenderGroup where TInstance : struct where TVertex : struct { - public SubArray Tiles; - public Mesh Mesh; + /// + /// The range of instance values to render + /// + public SubArray Instances; + /// + /// The range of vertex values to render + /// + public Mesh Vertices; - public Buffer TileBuffer; - public Buffer MeshBuffer; + /// + /// The buffer to use for instance data + /// + public Buffer InstanceBuffer; + /// + /// The buffer to use for instance data + /// + public Buffer VertexBuffer; + /// + /// The program to use to render this Rendergroup + /// public Program Program; + + /// + /// The Texture to use for this Rendergroup + /// public Texture Texture; + /// + /// View and Projection information for this Rendergroup + /// public Camera Camera; + /// + /// Draw this rendergroup using the predefined settings. + /// public void Draw() { Program.Use(); - TileBuffer.PointTo(Program); - MeshBuffer.PointTo(Program); + InstanceBuffer.PointTo(Program); + VertexBuffer.PointTo(Program); Texture.Bind(0); @@ -40,7 +69,7 @@ namespace Diamond.Render if (projLoc.HasValue) GL.UniformMatrix4(projLoc.Value, false, ref Camera.Projection); - Mesh.DrawInstanced(Tiles); + Vertices.DrawInstanced(Instances); } } } \ No newline at end of file diff --git a/Diamond/Util/Mesh.cs b/Diamond/Util/Mesh.cs index 112960c..2b81c1b 100644 --- a/Diamond/Util/Mesh.cs +++ b/Diamond/Util/Mesh.cs @@ -2,6 +2,7 @@ using System.IO; using System.Linq; using Diamond.Buffers; +using NLog; using OpenTK; using OpenTK.Graphics.OpenGL4; @@ -9,6 +10,8 @@ namespace Diamond.Util { public class Mesh where T : struct { + private static readonly Logger Logger = LogManager.GetLogger("Mesh"); + public SubArray Vertices; public PrimitiveType Primitive; @@ -45,6 +48,11 @@ namespace Diamond.Util { var tiVdi = VertexDataInfo.GetInfo(); + if (tiVdi.Divisor == 0) + { + Logger.Error("Cannot render mesh with instances of type {0} - Divisor is 0", typeof(TI).Name); + } + tVdi.EnableVertexPointers(); tiVdi.EnableVertexPointers(); diff --git a/hexworld/HexRender.cs b/hexworld/HexRender.cs index 061be22..2e75920 100644 --- a/hexworld/HexRender.cs +++ b/hexworld/HexRender.cs @@ -28,7 +28,7 @@ namespace hexworld private Buffer _meshBuffer; private Buffer _tileBuffer; - private RenderGroup _renderGroup; + private RenderGroup _renderGroup; protected override void OnClosed(EventArgs e) { @@ -105,15 +105,15 @@ namespace hexworld _camera = new Camera(); - _renderGroup = new RenderGroup() + _renderGroup = new RenderGroup() { Camera = _camera, - Mesh = _cubeMesh, - MeshBuffer = _meshBuffer, + Vertices = _cubeMesh, + VertexBuffer = _meshBuffer, Program = _texPgm, Texture = _grassTex, - TileBuffer = _tileBuffer, - Tiles = _floorTiles + InstanceBuffer = _tileBuffer, + Instances = _floorTiles }; }