From 536a7d66fcbe762b53d065daa291453885be24ed Mon Sep 17 00:00:00 2001 From: "SND\\AstrorEnales_cp" Date: Wed, 2 Nov 2011 21:46:57 +0000 Subject: [PATCH] working on gl index and vertex buffer --- ANX.Framework.Windows.GL3/IndexBufferGL3.cs | 69 ++++++++++++++++---- ANX.Framework.Windows.GL3/VertexBufferGL3.cs | 66 +++++++++++++++++-- 2 files changed, 118 insertions(+), 17 deletions(-) diff --git a/ANX.Framework.Windows.GL3/IndexBufferGL3.cs b/ANX.Framework.Windows.GL3/IndexBufferGL3.cs index 9ed5e572..28502ee1 100644 --- a/ANX.Framework.Windows.GL3/IndexBufferGL3.cs +++ b/ANX.Framework.Windows.GL3/IndexBufferGL3.cs @@ -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(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(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(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[] 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 diff --git a/ANX.Framework.Windows.GL3/VertexBufferGL3.cs b/ANX.Framework.Windows.GL3/VertexBufferGL3.cs index f03fc171..a77f0768 100644 --- a/ANX.Framework.Windows.GL3/VertexBufferGL3.cs +++ b/ANX.Framework.Windows.GL3/VertexBufferGL3.cs @@ -64,34 +64,92 @@ namespace ANX.Framework.Windows.GL3 /// Native vertex buffer handle. /// private int bufferHandle; + + private VertexDeclaration vertexDeclaration; + + private BufferUsage usage; + + private int vertexCount; + + private BufferUsageHint usageHint; #endregion #region Constructor /// /// Create a new Vertex Buffer object. /// - 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(GraphicsDevice graphicsDevice, T[] data) where T : struct { - GL.BindBuffer(BufferTarget.ArrayBuffer, bufferHandle); + BufferData(data, 0); } + #endregion + #region SetData public void SetData(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(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[] 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