mirror of
https://github.com/4sval/FModel.git
synced 2026-03-22 09:44:37 -05:00
75 lines
2.2 KiB
C#
75 lines
2.2 KiB
C#
using System;
|
|
using System.Numerics;
|
|
using OpenTK.Graphics.OpenGL4;
|
|
|
|
namespace FModel.Views.Snooper.Buffers;
|
|
|
|
public class VertexArrayObject<TVertexType, TIndexType> : IDisposable where TVertexType : unmanaged where TIndexType : unmanaged
|
|
{
|
|
private readonly int _handle;
|
|
private readonly int _sizeOfVertex;
|
|
private readonly int _sizeOfIndex;
|
|
|
|
public unsafe VertexArrayObject(BufferObject<TVertexType> vbo, BufferObject<TIndexType> ebo)
|
|
{
|
|
_handle = GL.GenVertexArray();
|
|
_sizeOfVertex = sizeof(TVertexType);
|
|
_sizeOfIndex = sizeof(TIndexType);
|
|
|
|
Bind();
|
|
vbo.Bind();
|
|
ebo.Bind();
|
|
}
|
|
|
|
public void VertexAttributePointer(uint index, int count, VertexAttribPointerType type, int vertexSize, int offset)
|
|
{
|
|
switch (type)
|
|
{
|
|
case VertexAttribPointerType.Int:
|
|
GL.VertexAttribIPointer(index, count, VertexAttribIntegerType.Int, vertexSize * _sizeOfVertex, (IntPtr) (offset * _sizeOfVertex));
|
|
break;
|
|
default:
|
|
GL.VertexAttribPointer(index, count, type, false, vertexSize * _sizeOfVertex, offset * _sizeOfVertex);
|
|
break;
|
|
}
|
|
GL.EnableVertexAttribArray(index);
|
|
}
|
|
|
|
public void Bind()
|
|
{
|
|
GL.BindVertexArray(_handle);
|
|
}
|
|
|
|
public void Unbind()
|
|
{
|
|
GL.BindVertexArray(0);
|
|
}
|
|
|
|
public unsafe void BindInstancing()
|
|
{
|
|
Bind();
|
|
|
|
var size = sizeof(Vector4);
|
|
GL.EnableVertexAttribArray(9);
|
|
GL.VertexAttribPointer(9, 4, VertexAttribPointerType.Float, false, 4 * size, 0);
|
|
GL.EnableVertexAttribArray(10);
|
|
GL.VertexAttribPointer(10, 4, VertexAttribPointerType.Float, false, 4 * size, 1 * size);
|
|
GL.EnableVertexAttribArray(11);
|
|
GL.VertexAttribPointer(11, 4, VertexAttribPointerType.Float, false, 4 * size, 2 * size);
|
|
GL.EnableVertexAttribArray(12);
|
|
GL.VertexAttribPointer(12, 4, VertexAttribPointerType.Float, false, 4 * size, 3 * size);
|
|
|
|
GL.VertexAttribDivisor(9, 1);
|
|
GL.VertexAttribDivisor(10, 1);
|
|
GL.VertexAttribDivisor(11, 1);
|
|
GL.VertexAttribDivisor(12, 1);
|
|
|
|
Unbind();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
GL.DeleteVertexArray(_handle);
|
|
}
|
|
}
|