/// <summary> /// Creates a buffer object of type T. /// </summary> /// <param name="Data">Specifies a pointer to data that will be copied into the data store for initialization.</param> /// <param name="Target">Specifies the target buffer object.</param> /// <param name="Hint">Specifies the expected usage of the data store.</param> public VBO(T[] Data, BufferTarget Target = OpenGL.BufferTarget.ArrayBuffer, BufferUsageHint Hint = BufferUsageHint.StaticDraw) { ID = Gl.CreateVBO <T>(BufferTarget = Target, Data, Hint); Size = (Data is int[] ? 1 : (Data is Vector2[] ? 2 : (Data is Vector3[] ? 3 : (Data is Vector4[] ? 4 : 0)))); PointerType = (Data is int[] ? VertexAttribPointerType.Int : VertexAttribPointerType.Float); Count = Data.Length; }
/// <summary> /// Creates a buffer object of type T with a specified length. /// </summary> /// <param name="Length">The length of the vertex buffer.</param> /// <param name="Target">Specifies the target buffer object.</param> /// <param name="Hint">Specifies the expected usage of the data store.</param> public VBO(int Length, BufferTarget Target = BufferTarget.ArrayBuffer, BufferUsageHint Hint = BufferUsageHint.StaticDraw) { ID = Gl.CreateVBO <T>(BufferTarget = Target, Hint, Length); this.Size = GetTypeComponentSize(); this.PointerType = GetAttribPointerType(); this.Count = Length; this.IsIntegralType = IsTypeIntegral(); }
/// <summary> /// Creates a buffer object of type T with a specified length. /// This allows the array T[] to be larger than the actual size necessary to buffer. /// Useful for reusing resources and avoiding unnecessary GC action. /// </summary> /// <param name="Data">An array of data of type T (which must be a struct) that will be buffered to the GPU.</param> /// <param name="Position">An offset into the Data array from which to begin buffering.</param> /// <param name="Length">The length of the valid data in the data array.</param> /// <param name="Target">Specifies the target buffer object.</param> /// <param name="Hint">Specifies the expected usage of the data store.</param> public VBO(T[] Data, int Position, int Length, BufferTarget Target = OpenGL.BufferTarget.ArrayBuffer, BufferUsageHint Hint = BufferUsageHint.StaticDraw) { Length = Math.Max(0, Math.Min(Length, Data.Length)); ID = Gl.CreateVBO <T>(BufferTarget = Target, Data, Hint, Position, Length); this.Size = (Data is int[] ? 1 : (Data is Vector2[] ? 2 : (Data is Vector3[] ? 3 : (Data is Vector4[] ? 4 : 0)))); this.PointerType = (Data is int[] ? VertexAttribPointerType.Int : VertexAttribPointerType.Float); this.Count = Length; }
/// <summary> /// Creates a buffer object of type T with a specified length. /// This allows the array T[] to be larger than the actual size necessary to buffer. /// Useful for reusing resources and avoiding unnecessary GC action. /// </summary> /// <param name="Data">An array of data of type T (which must be a struct) that will be buffered to the GPU.</param> /// <param name="Position">An offset into the Data array from which to begin buffering.</param> /// <param name="Length">The length of the valid data in the data array.</param> /// <param name="Target">Specifies the target buffer object.</param> /// <param name="Hint">Specifies the expected usage of the data store.</param> /// <param name="Divisor">Specifies the devisor when using instanced rendering</param> public VBO(T[] Data, int Position, int Length, BufferTarget Target = BufferTarget.ArrayBuffer, BufferUsageHint Hint = BufferUsageHint.StaticDraw) { Length = Math.Max(0, Math.Min(Length, Data.Length)); ID = Gl.CreateVBO <T>(BufferTarget = Target, Data, Hint, Position, Length); this.Size = GetTypeComponentSize(); this.PointerType = GetAttribPointerType(); this.Count = Length; this.IsIntegralType = IsTypeIntegral(); }