Added Mesh class, removed attrib pointer management from Program, shifted to mesh. MUST use Program.UseDefault instead of GL.Use(0) to prevent crash, but meshes can't render with it anyway.
This commit is contained in:
@@ -24,8 +24,8 @@ namespace hexworld
|
||||
private Texture _stone;
|
||||
private Texture _gray;
|
||||
|
||||
private GLBuffer _tileGLBuffer;
|
||||
private GLBuffer _vertexGLBuffer;
|
||||
private GLBuffer<Tile> _tileGLBuffer;
|
||||
private GLBuffer<Vertex> _vertexGLBuffer;
|
||||
|
||||
protected override void OnClosed(EventArgs e)
|
||||
{
|
||||
@@ -33,7 +33,7 @@ namespace hexworld
|
||||
|
||||
_pgm.Dispose();
|
||||
|
||||
// _tileGLBuffer.Dispose();
|
||||
_tileGLBuffer.Dispose();
|
||||
_vertexGLBuffer.Dispose();
|
||||
|
||||
_grass.Dispose();
|
||||
@@ -50,9 +50,9 @@ namespace hexworld
|
||||
private SubArray<Tile> _stoneTiles;
|
||||
private SubArray<Tile> _grayTiles;
|
||||
|
||||
private SubArray<Vertex> _cubeVertices;
|
||||
private SubArray<Vertex> _panelVertices;
|
||||
private SubArray<Vertex> _sidesVertices;
|
||||
private Mesh<Vertex> _cubeMesh;
|
||||
private Mesh<Vertex> _panelMesh;
|
||||
private Mesh<Vertex> _sidesMesh;
|
||||
|
||||
private Tile[] _allTiles;
|
||||
private Vertex[] _allVertices;
|
||||
@@ -100,12 +100,9 @@ namespace hexworld
|
||||
}
|
||||
}
|
||||
|
||||
_cubeVertices = new SubArray<Vertex>(
|
||||
JsonConvert.DeserializeObject<Vertex[]>(File.ReadAllText(@"res\data_vert_cubes.json")));
|
||||
_panelVertices = new SubArray<Vertex>(
|
||||
JsonConvert.DeserializeObject<Vertex[]>(File.ReadAllText(@"res\data_vert_panels.json")));
|
||||
_sidesVertices = new SubArray<Vertex>(
|
||||
JsonConvert.DeserializeObject<Vertex[]>(File.ReadAllText(@"res\data_vert_sides.json")));
|
||||
_cubeMesh = Mesh.FromJson<Vertex>(File.ReadAllText(@"res\data_vert_cubes.json"));
|
||||
_panelMesh = Mesh.FromJson<Vertex>(File.ReadAllText(@"res\data_vert_panels.json"));
|
||||
_sidesMesh = Mesh.FromJson<Vertex>(File.ReadAllText(@"res\data_vert_sides.json"));
|
||||
|
||||
_grassTiles = new SubArray<Tile>(
|
||||
JsonConvert.DeserializeObject<Tile[]>(File.ReadAllText(@"res\data_tile_grass.json")));
|
||||
@@ -114,17 +111,17 @@ namespace hexworld
|
||||
_grayTiles = new SubArray<Tile>(
|
||||
JsonConvert.DeserializeObject<Tile[]>(File.ReadAllText(@"res\data_tile_gray.json")));
|
||||
|
||||
_allTiles = SubArray<Tile>.Join(_stoneTiles, _grassTiles, _grayTiles);
|
||||
_allVertices = SubArray<Vertex>.Join(_panelVertices, _cubeVertices, _sidesVertices);
|
||||
_allTiles = SubArray.Join(_stoneTiles, _grassTiles, _grayTiles);
|
||||
_allVertices = Mesh.Join(_panelMesh, _cubeMesh, _sidesMesh);
|
||||
|
||||
_tileGLBuffer = new GLBuffer(BufferTarget.ArrayBuffer, BufferUsageHint.DynamicDraw);
|
||||
_tileGLBuffer = new GLBuffer<Tile>(BufferTarget.ArrayBuffer, BufferUsageHint.DynamicDraw);
|
||||
_tileGLBuffer.Data(_allTiles);
|
||||
|
||||
_vertexGLBuffer = new GLBuffer(BufferTarget.ArrayBuffer, BufferUsageHint.StaticDraw);
|
||||
_vertexGLBuffer = new GLBuffer<Vertex>(BufferTarget.ArrayBuffer, BufferUsageHint.StaticDraw);
|
||||
_vertexGLBuffer.Data(_allVertices);
|
||||
|
||||
_pgm.SetAttribPointers(_tileGLBuffer, typeof(Tile));
|
||||
_pgm.SetAttribPointers(_vertexGLBuffer, typeof(Vertex));
|
||||
_pgm.SetAttribPointers(_tileGLBuffer);
|
||||
_pgm.SetAttribPointers(_vertexGLBuffer);
|
||||
|
||||
_grass = Texture.FromBitmap(new Bitmap(@"res\grass.png"));
|
||||
_stone = Texture.FromBitmap(new Bitmap(@"res\stone.png"));
|
||||
@@ -172,7 +169,6 @@ namespace hexworld
|
||||
GL.CullFace(CullFaceMode.Back);
|
||||
|
||||
_pgm.Use();
|
||||
_pgm.EnableAllAttribArrays();
|
||||
|
||||
_grass.Bind(0);
|
||||
_stone.Bind(1);
|
||||
@@ -182,27 +178,19 @@ namespace hexworld
|
||||
GL.UniformMatrix4(_pgm.GetUniform("view"), false, ref _view);
|
||||
GL.UniformMatrix4(_pgm.GetUniform("proj"), false, ref _proj);
|
||||
|
||||
GL.DrawArraysInstancedBaseInstance(PrimitiveType.Triangles,
|
||||
_cubeVertices.Offset, _cubeVertices.Length,
|
||||
_grassTiles.Length, _grassTiles.Offset);
|
||||
_cubeMesh.DrawInstanced(_grassTiles);
|
||||
|
||||
GL.Uniform1(_pgm.GetUniform("tex"), 1);
|
||||
GL.UniformMatrix4(_pgm.GetUniform("view"), false, ref _view);
|
||||
GL.UniformMatrix4(_pgm.GetUniform("proj"), false, ref _proj);
|
||||
|
||||
GL.DrawArraysInstancedBaseInstance(PrimitiveType.Triangles,
|
||||
_panelVertices.Offset, _panelVertices.Length,
|
||||
_stoneTiles.Length, _stoneTiles.Offset);
|
||||
_panelMesh.DrawInstanced(_stoneTiles);
|
||||
|
||||
GL.Uniform1(_pgm.GetUniform("tex"), 2);
|
||||
GL.UniformMatrix4(_pgm.GetUniform("view"), false, ref _view);
|
||||
GL.UniformMatrix4(_pgm.GetUniform("proj"), false, ref _proj);
|
||||
|
||||
GL.DrawArraysInstancedBaseInstance(PrimitiveType.Triangles,
|
||||
_sidesVertices.Offset, _sidesVertices.Length,
|
||||
_grayTiles.Length, _grayTiles.Offset);
|
||||
|
||||
_pgm.DisableAllAttribArrays();
|
||||
_sidesMesh.DrawInstanced(_grayTiles);
|
||||
|
||||
SwapBuffers();
|
||||
}
|
||||
|
||||
78
hexworld/Mesh.cs
Normal file
78
hexworld/Mesh.cs
Normal file
@@ -0,0 +1,78 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices.ComTypes;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Diamond.Buffers;
|
||||
using Diamond.Shaders;
|
||||
using Newtonsoft.Json;
|
||||
using OpenTK.Graphics.OpenGL4;
|
||||
|
||||
namespace hexworld
|
||||
{
|
||||
public class Mesh<T> where T : struct
|
||||
{
|
||||
public SubArray<T> Vertices;
|
||||
public PrimitiveType Primitive;
|
||||
|
||||
private static VertexDataInfo tVdi;
|
||||
private static List<VertexPointerAttribute> attribs;
|
||||
|
||||
static Mesh()
|
||||
{
|
||||
tVdi = VertexDataInfo.GetInfo<T>();
|
||||
}
|
||||
|
||||
public Mesh(T[] vertices, PrimitiveType primitive = PrimitiveType.Triangles)
|
||||
: this(new SubArray<T>(vertices), primitive)
|
||||
{
|
||||
}
|
||||
|
||||
public Mesh(SubArray<T> vertices, PrimitiveType primitive = PrimitiveType.Triangles)
|
||||
{
|
||||
Vertices = vertices;
|
||||
Primitive = primitive;
|
||||
}
|
||||
|
||||
public void Draw()
|
||||
{
|
||||
tVdi.EnableVertexPointers();
|
||||
|
||||
GL.DrawArrays(Primitive, Vertices.Offset, Vertices.Length);
|
||||
|
||||
tVdi.DisableVertexPointers();
|
||||
}
|
||||
|
||||
public void DrawInstanced<TI>(SubArray<TI> instanceArray) where TI : struct
|
||||
{
|
||||
var tiVdi = VertexDataInfo.GetInfo<TI>();
|
||||
|
||||
tVdi.EnableVertexPointers();
|
||||
tiVdi.EnableVertexPointers();
|
||||
|
||||
GL.DrawArraysInstancedBaseInstance(Primitive, Vertices.Offset, Vertices.Length, instanceArray.Length,
|
||||
instanceArray.Offset);
|
||||
|
||||
tVdi.DisableVertexPointers();
|
||||
tiVdi.DisableVertexPointers();
|
||||
}
|
||||
}
|
||||
|
||||
public static class Mesh
|
||||
{
|
||||
public static Mesh<T> FromJson<T>(string json) where T : struct
|
||||
{
|
||||
var vertices = JsonConvert.DeserializeObject<T[]>(json);
|
||||
return new Mesh<T>(vertices);
|
||||
}
|
||||
|
||||
|
||||
public static T[] Join<T>(params Mesh<T>[] meshes) where T : struct => Join((IEnumerable<Mesh<T>>) meshes);
|
||||
|
||||
public static T[] Join<T>(IEnumerable<Mesh<T>> meshes) where T : struct
|
||||
{
|
||||
return SubArray.Join(meshes.Select(x => x.Vertices));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,11 +4,11 @@ using OpenTK;
|
||||
|
||||
namespace hexworld
|
||||
{
|
||||
[VertexData]
|
||||
[VertexData(Divisor = 1)]
|
||||
public struct Tile
|
||||
{
|
||||
[JsonProperty("pos")]
|
||||
[VertexPointer("glbpos", 3, Divisor = 1)]
|
||||
[VertexPointer("glbpos", 3)]
|
||||
public Vector3 Position;
|
||||
|
||||
public Tile(Vector3 position)
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Mesh.cs" />
|
||||
<Compile Include="Tile.cs" />
|
||||
<Compile Include="Vertex.cs" />
|
||||
<Compile Include="HexRender.cs" />
|
||||
|
||||
Reference in New Issue
Block a user