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 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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user