working on gl index and vertex buffer
This commit is contained in:
parent
2177c31d66
commit
536a7d66fc
@ -68,6 +68,8 @@ namespace ANX.Framework.Windows.GL3
|
|||||||
private IndexElementSize elementSize;
|
private IndexElementSize elementSize;
|
||||||
|
|
||||||
private BufferUsage usage;
|
private BufferUsage usage;
|
||||||
|
|
||||||
|
private BufferUsageHint usageHint;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Constructor
|
#region Constructor
|
||||||
@ -81,36 +83,77 @@ namespace ANX.Framework.Windows.GL3
|
|||||||
elementSize = setElementSize;
|
elementSize = setElementSize;
|
||||||
usage = setUsage;
|
usage = setUsage;
|
||||||
|
|
||||||
GL.GenBuffers(1, out bufferHandle);
|
// TODO: evaluate whats best
|
||||||
|
// StaticDraw: set once, use often
|
||||||
|
// DynamicDraw: set frequently, use repeatadly
|
||||||
|
// StreamDraw: set every tick, use once
|
||||||
|
usageHint = BufferUsageHint.DynamicDraw;
|
||||||
|
|
||||||
|
GL.GenBuffers(1, out bufferHandle);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region SetData (TODO)
|
#region SetData
|
||||||
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data)
|
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data)
|
||||||
where T : struct
|
where T : struct
|
||||||
{
|
{
|
||||||
// TODO: check
|
BufferData(data, 0);
|
||||||
IntPtr size = (IntPtr)((elementSize == IndexElementSize.SixteenBits ?
|
|
||||||
16 : 32) * data.Length);
|
|
||||||
|
|
||||||
// TODO: check
|
|
||||||
BufferUsageHint usageHint = usage == BufferUsage.WriteOnly ?
|
|
||||||
BufferUsageHint.StaticDraw :
|
|
||||||
BufferUsageHint.DynamicDraw;
|
|
||||||
|
|
||||||
GL.BindBuffer(BufferTarget.ElementArrayBuffer, bufferHandle);
|
|
||||||
GL.BufferData(BufferTarget.ElementArrayBuffer, size, data, usageHint);
|
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region SetData
|
||||||
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data,
|
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data,
|
||||||
int startIndex, int elementCount) where T : struct
|
int startIndex, int elementCount) where T : struct
|
||||||
{
|
{
|
||||||
|
if (startIndex != 0 ||
|
||||||
|
elementCount != data.Length)
|
||||||
|
{
|
||||||
|
T[] subArray = new T[elementCount];
|
||||||
|
Array.Copy(data, startIndex, subArray, 0, elementCount);
|
||||||
|
BufferData(subArray, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BufferData(data, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region SetData
|
||||||
public void SetData<T>(GraphicsDevice graphicsDevice, int offsetInBytes,
|
public void SetData<T>(GraphicsDevice graphicsDevice, int offsetInBytes,
|
||||||
T[] data, int startIndex, int elementCount) where T : struct
|
T[] data, int startIndex, int elementCount) where T : struct
|
||||||
{
|
{
|
||||||
|
if (startIndex != 0 ||
|
||||||
|
elementCount != data.Length)
|
||||||
|
{
|
||||||
|
T[] subArray = new T[elementCount];
|
||||||
|
Array.Copy(data, startIndex, subArray, 0, elementCount);
|
||||||
|
BufferData(subArray, offsetInBytes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BufferData(data, offsetInBytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region BufferData (private helper)
|
||||||
|
private void BufferData<T>(T[] data, int offset) where T : struct
|
||||||
|
{
|
||||||
|
IntPtr size = (IntPtr)((elementSize == IndexElementSize.SixteenBits ?
|
||||||
|
2 : 4) * data.Length);
|
||||||
|
|
||||||
|
GL.BindBuffer(BufferTarget.ElementArrayBuffer, bufferHandle);
|
||||||
|
|
||||||
|
if (offset != 0)
|
||||||
|
{
|
||||||
|
GL.BufferData(BufferTarget.ElementArrayBuffer, size, data, usageHint);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GL.BufferSubData(BufferTarget.ElementArrayBuffer, (IntPtr)offset,
|
||||||
|
size, data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -64,34 +64,92 @@ namespace ANX.Framework.Windows.GL3
|
|||||||
/// Native vertex buffer handle.
|
/// Native vertex buffer handle.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private int bufferHandle;
|
private int bufferHandle;
|
||||||
|
|
||||||
|
private VertexDeclaration vertexDeclaration;
|
||||||
|
|
||||||
|
private BufferUsage usage;
|
||||||
|
|
||||||
|
private int vertexCount;
|
||||||
|
|
||||||
|
private BufferUsageHint usageHint;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Constructor
|
#region Constructor
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a new Vertex Buffer object.
|
/// Create a new Vertex Buffer object.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal VertexBufferGL3(VertexDeclaration vertexDeclaration,
|
internal VertexBufferGL3(VertexDeclaration setVertexDeclaration,
|
||||||
int vertexCount, BufferUsage usage)
|
int setVertexCount, BufferUsage setUsage)
|
||||||
{
|
{
|
||||||
|
vertexDeclaration = setVertexDeclaration;
|
||||||
|
usage = setUsage;
|
||||||
|
vertexCount = setVertexCount;
|
||||||
|
|
||||||
|
// TODO: evaluate whats best
|
||||||
|
// StaticDraw: set once, use often
|
||||||
|
// DynamicDraw: set frequently, use repeatadly
|
||||||
|
// StreamDraw: set every tick, use once
|
||||||
|
usageHint = BufferUsageHint.DynamicDraw;
|
||||||
|
|
||||||
GL.GenBuffers(1, out bufferHandle);
|
GL.GenBuffers(1, out bufferHandle);
|
||||||
|
IntPtr size = (IntPtr)(vertexDeclaration.VertexStride * setVertexCount);
|
||||||
|
GL.BufferData(BufferTarget.ArrayBuffer, size, IntPtr.Zero, usageHint);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region SetData (TODO)
|
#region SetData
|
||||||
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data)
|
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data)
|
||||||
where T : struct
|
where T : struct
|
||||||
{
|
{
|
||||||
GL.BindBuffer(BufferTarget.ArrayBuffer, bufferHandle);
|
BufferData(data, 0);
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region SetData
|
||||||
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data,
|
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data,
|
||||||
int startIndex, int elementCount) where T : struct
|
int startIndex, int elementCount) where T : struct
|
||||||
{
|
{
|
||||||
|
if (startIndex != 0 ||
|
||||||
|
elementCount != data.Length)
|
||||||
|
{
|
||||||
|
T[] subArray = new T[elementCount];
|
||||||
|
Array.Copy(data, startIndex, subArray, 0, elementCount);
|
||||||
|
BufferData(subArray, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BufferData(data, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region SetData
|
||||||
public void SetData<T>(GraphicsDevice graphicsDevice, int offsetInBytes,
|
public void SetData<T>(GraphicsDevice graphicsDevice, int offsetInBytes,
|
||||||
T[] data, int startIndex, int elementCount) where T : struct
|
T[] data, int startIndex, int elementCount) where T : struct
|
||||||
{
|
{
|
||||||
|
if (startIndex != 0 ||
|
||||||
|
elementCount != data.Length)
|
||||||
|
{
|
||||||
|
T[] subArray = new T[elementCount];
|
||||||
|
Array.Copy(data, startIndex, subArray, 0, elementCount);
|
||||||
|
BufferData(subArray, offsetInBytes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BufferData(data, offsetInBytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region BufferData (private helper) (TODO)
|
||||||
|
private void BufferData<T>(T[] data, int offset) where T : struct
|
||||||
|
{
|
||||||
|
IntPtr size = (IntPtr)(vertexDeclaration.VertexStride * data.Length);
|
||||||
|
|
||||||
|
GL.BindBuffer(BufferTarget.ArrayBuffer, bufferHandle);
|
||||||
|
|
||||||
|
// TODO: check the different handling with MapBuffer etc. (See link above)
|
||||||
|
//GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)offset, size, data);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user