Пример #1
0
        public void SetBufferData(OpenGL gl, OGLBufferDataTarget target, uint[] indices, OGLModelUsage usage, bool compress)
        {
            Size   = indices.Length;
            Stride = 1;


            if (compress)
            {
                if (indices.Max() < byte.MaxValue)
                {
                    // use a byte buffer instead in order to decrease the buffer size.
                    var newIdxs = indices.Select(x => (byte)x).ToArray();
                    SetBufferData(gl, OGLBufferDataTarget.ArrayBuffer, newIdxs, OGLModelUsage.StaticCopy, Stride);
                    return;
                }
                else if (indices.Max() < ushort.MaxValue)
                {
                    // use a ushort buffer instead in order to decrease the buffer size.
                    var newIdxs = indices.Select(x => (ushort)x).ToArray();
                    SetBufferData(gl, OGLBufferDataTarget.ArrayBuffer, newIdxs, OGLModelUsage.StaticCopy, Stride);
                    return;
                }
            }


            SetBufferData(gl, SharpGLHelper.OGLBufferDataTarget.ArrayBuffer, indices, SharpGLHelper.OGLModelUsage.StaticCopy, Stride);
        }
        /// <summary>
        /// Calls the glBufferData(...). The data.Length will be used as value for Size property.
        /// </summary>
        /// <param name="gl">The gl.</param>
        /// <param name="target">The buffer data target.</param>
        /// <param name="data">The data as float.</param>
        /// <param name="usage">The usage.</param>
        /// <param name="stride">The amount of floats that form one input variable.</param>
        public virtual void SetBufferData(OpenGL gl, OGLBufferDataTarget target, float[] data, OGLModelUsage usage, int stride)
        {
            Size   = data.Length / stride;
            Stride = stride;

            BufferDataType = OGLType.Float;

            gl.BufferData((uint)target, data, (uint)usage);
        }
 public virtual void ReplaceBufferData(OpenGL gl, OGLBufferDataTarget target, int offset, int size, IntPtr newData,
                                       bool bind = false, OGLBindBufferTarget bindTarget = OGLBindBufferTarget.ArrayBuffer)
 {
     if (bind)
     {
         BindBuffer(gl, bindTarget);
     }
     gl.BufferSubData((uint)target, offset, size, newData);
 }
        /// <summary>
        /// Calls the glBufferData(...). The size will be used as value for Size property.
        /// </summary>
        /// <param name="gl">The gl.</param>
        /// <param name="target">The buffer data target.</param>
        /// <param name="size">The size of the data buffer.</param>
        /// <param name="data">The pointer to the data in memory.</param>
        /// <param name="usage">The usage.</param>
        public virtual void SetBufferData(OpenGL gl, OGLBufferDataTarget target, int size, IntPtr data, OGLModelUsage usage, int stride, OGLType bufferDataType,
                                          bool bind = false, OGLBindBufferTarget bindTarget = OGLBindBufferTarget.ArrayBuffer)
        {
            Size   = size / stride;
            Stride = stride;


            if (bind)
            {
                BindBuffer(gl, bindTarget);
            }
            gl.BufferData((uint)target, size, data, (uint)usage);
        }
        /// <summary>
        /// Calls the glBufferData(...). The data.Length will be used as value for Size property.
        /// </summary>
        /// <param name="gl">The gl.</param>
        /// <param name="target">The buffer data target.</param>
        /// <param name="data">The data as uint.</param>
        /// <param name="usage">The usage.</param>
        /// <param name="stride">The amount of uint that form one input variable.</param>
        public virtual void SetBufferData(OpenGL gl, OGLBufferDataTarget target, uint[] data, OGLModelUsage usage, int stride)
        {
            Size   = data.Length / stride;
            Stride = stride;

            BufferDataType = OGLType.UnsignedInt;

            var    dataSize   = data.Length * sizeof(uint);
            IntPtr newDataPtr = Marshal.AllocHGlobal(dataSize);
            var    intData    = new int[data.Length];

            Buffer.BlockCopy(data, 0, intData, 0, dataSize);
            Marshal.Copy(intData, 0, newDataPtr, data.Length);

            gl.BufferData((uint)target, dataSize, newDataPtr, (uint)usage);
        }
        public virtual void ReplaceBufferData(OpenGL gl, OGLBufferDataTarget target, int offset, uint[] newData,
                                              bool bind = false, OGLBindBufferTarget bindTarget = OGLBindBufferTarget.ArrayBuffer)
        {
            IntPtr newDataPtr;

            // Unsafe code.
            unsafe
            {
                // Fix the pointer to the array.
                fixed(uint *pArray = newData)
                {
                    // pArray now has the pointer to the array. You can get an IntPtr by casting to void, and passing that in.
                    newDataPtr = new IntPtr((void *)pArray);
                }
            }

            ReplaceBufferData(gl, target, offset, newData.Length, newDataPtr, bind, bindTarget);
        }
        public void SetBufferData(OpenGL gl, OGLBufferDataTarget target, uint[] indices, OGLModelUsage usage, bool compress)
        {
            Size = indices.Length;
            Stride = 1;

            if(compress)
                if (indices.Max() < byte.MaxValue)
                {
                    // use a byte buffer instead in order to decrease the buffer size.
                    var newIdxs = indices.Select(x => (byte)x).ToArray();
                    SetBufferData(gl, OGLBufferDataTarget.ArrayBuffer, newIdxs, OGLModelUsage.StaticCopy, Stride);
                    return;
                }
                else if (indices.Max() < ushort.MaxValue)
                {
                    // use a ushort buffer instead in order to decrease the buffer size.
                    var newIdxs = indices.Select(x => (ushort)x).ToArray();
                    SetBufferData(gl, OGLBufferDataTarget.ArrayBuffer, newIdxs, OGLModelUsage.StaticCopy, Stride);
                    return;
                }

            SetBufferData(gl, SharpGLHelper.OGLBufferDataTarget.ArrayBuffer, indices, SharpGLHelper.OGLModelUsage.StaticCopy, Stride);
        }
        /// <summary>
        /// Calls the glBufferData(...). The size will be used as value for Size property.
        /// </summary>
        /// <param name="gl">The gl.</param>
        /// <param name="target">The buffer data target.</param>
        /// <param name="size">The size of the data buffer.</param>
        /// <param name="data">The pointer to the data in memory.</param>
        /// <param name="usage">The usage.</param>
        public virtual void SetBufferData(OpenGL gl, OGLBufferDataTarget target, int size, IntPtr data, OGLModelUsage usage, int stride, OGLType bufferDataType,
            bool bind = false, OGLBindBufferTarget bindTarget = OGLBindBufferTarget.ArrayBuffer)
        {
            Size = size / stride;
            Stride = stride;

            if(bind)
                BindBuffer(gl, bindTarget);
            gl.BufferData((uint)target, size, data, (uint)usage);
        }
        /// <summary>
        /// Calls the glBufferData(...). The data.Length will be used as value for Size property.
        /// </summary>
        /// <param name="gl">The gl.</param>
        /// <param name="target">The buffer data target.</param>
        /// <param name="data">The data as uint.</param>
        /// <param name="usage">The usage.</param>
        /// <param name="stride">The amount of uint that form one input variable.</param>
        public virtual void SetBufferData(OpenGL gl, OGLBufferDataTarget target, uint[] data, OGLModelUsage usage, int stride)
        {
            Size = data.Length / stride;
            Stride = stride;

            BufferDataType = OGLType.UnsignedInt;

            var dataSize = data.Length * sizeof(uint);
            IntPtr newDataPtr = Marshal.AllocHGlobal(dataSize);
            var intData = new int[data.Length];
            Buffer.BlockCopy(data, 0, intData, 0, dataSize);
            Marshal.Copy(intData, 0, newDataPtr, data.Length);

            gl.BufferData((uint)target, dataSize, newDataPtr, (uint)usage);
        }
        /// <summary>
        /// Calls the glBufferData(...). The data.Length will be used as value for Size property.
        /// </summary>
        /// <param name="gl">The gl.</param>
        /// <param name="target">The buffer data target.</param>
        /// <param name="data">The data as ushort.</param>
        /// <param name="usage">The usage.</param>
        /// <param name="stride">The amount of ushorts that form one input variable.</param>
        public virtual void SetBufferData(OpenGL gl, OGLBufferDataTarget target, ushort[] data, OGLModelUsage usage, int stride)
        {
            Size = data.Length / stride;
            Stride = stride;

            BufferDataType = OGLType.UnsignedShort;

            gl.BufferData((uint)target, data, (uint)usage);
        }
 public virtual void ReplaceBufferData(OpenGL gl, OGLBufferDataTarget target, int offset, int size, IntPtr newData,
     bool bind = false, OGLBindBufferTarget bindTarget = OGLBindBufferTarget.ArrayBuffer)
 {
     if (bind)
         BindBuffer(gl, bindTarget);
     gl.BufferSubData((uint)target, offset, size, newData);
 }
        public virtual void ReplaceBufferData(OpenGL gl, OGLBufferDataTarget target, int offset, uint[] newData,
           bool bind = false, OGLBindBufferTarget bindTarget = OGLBindBufferTarget.ArrayBuffer)
        {
            IntPtr newDataPtr;
            // Unsafe code.
            unsafe
            {
                // Fix the pointer to the array.
                fixed (uint* pArray = newData)
                {
                    // pArray now has the pointer to the array. You can get an IntPtr by casting to void, and passing that in.
                    newDataPtr = new IntPtr((void*)pArray);
                }
            }

            ReplaceBufferData(gl, target, offset, newData.Length, newDataPtr, bind, bindTarget);
        }