working on gl index and vertex buffer

This commit is contained in:
SND\AstrorEnales_cp 2011-11-02 21:46:57 +00:00
parent 2177c31d66
commit 536a7d66fc
2 changed files with 118 additions and 17 deletions

View File

@ -68,6 +68,8 @@ namespace ANX.Framework.Windows.GL3
private IndexElementSize elementSize;
private BufferUsage usage;
private BufferUsageHint usageHint;
#endregion
#region Constructor
@ -81,36 +83,77 @@ namespace ANX.Framework.Windows.GL3
elementSize = setElementSize;
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
#region SetData (TODO)
#region SetData
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data)
where T : struct
{
// TODO: check
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);
BufferData(data, 0);
}
#endregion
#region SetData
public void SetData<T>(GraphicsDevice graphicsDevice, 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, 0);
}
else
{
BufferData(data, 0);
}
}
#endregion
#region SetData
public void SetData<T>(GraphicsDevice graphicsDevice, int offsetInBytes,
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

View File

@ -64,34 +64,92 @@ namespace ANX.Framework.Windows.GL3
/// Native vertex buffer handle.
/// </summary>
private int bufferHandle;
private VertexDeclaration vertexDeclaration;
private BufferUsage usage;
private int vertexCount;
private BufferUsageHint usageHint;
#endregion
#region Constructor
/// <summary>
/// Create a new Vertex Buffer object.
/// </summary>
internal VertexBufferGL3(VertexDeclaration vertexDeclaration,
int vertexCount, BufferUsage usage)
internal VertexBufferGL3(VertexDeclaration setVertexDeclaration,
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);
IntPtr size = (IntPtr)(vertexDeclaration.VertexStride * setVertexCount);
GL.BufferData(BufferTarget.ArrayBuffer, size, IntPtr.Zero, usageHint);
}
#endregion
#region SetData (TODO)
#region SetData
public void SetData<T>(GraphicsDevice graphicsDevice, T[] data)
where T : struct
{
GL.BindBuffer(BufferTarget.ArrayBuffer, bufferHandle);
BufferData(data, 0);
}
#endregion
#region SetData
public void SetData<T>(GraphicsDevice graphicsDevice, 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, 0);
}
else
{
BufferData(data, 0);
}
}
#endregion
#region SetData
public void SetData<T>(GraphicsDevice graphicsDevice, int offsetInBytes,
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