예제 #1
0
파일: GLBuffer.cs 프로젝트: Vengarioth/XUI
 internal GLBuffer(int bufferHandle, BufferTarget bufferTarget, BufferUsageHint bufferUsageHint, int size)
 {
     Handle = bufferHandle;
     Target = bufferTarget;
     UsageHint = bufferUsageHint;
     Size = size;
 }
예제 #2
0
        public void SetData(TriangleBuffer triangles, BufferUsageHint usageHint)
        {
            _indexCount = triangles.IndexCount;
            if (_indexCount % 3 != 0) throw new IndexOutOfRangeException("Number of index entries must be divisible by 3.");

            if (_indexCount == 0)
            {
                Dispose();
                return;
            }

            if (_vertexArray == 0)
            {
                _vertexArray = GL.GenVertexArray();
                _elementArrayBuffer = GL.GenBuffer();
                _arrayBuffer = GL.GenBuffer();

                GL.BindVertexArray(_vertexArray);
                GL.BindBuffer(BufferTarget.ElementArrayBuffer, _elementArrayBuffer);
                GL.BindBuffer(BufferTarget.ArrayBuffer, _arrayBuffer);
                _specification.Bind();
            }
            else
            {
                GL.BindBuffer(BufferTarget.ElementArrayBuffer, _elementArrayBuffer);
                GL.BindBuffer(BufferTarget.ArrayBuffer, _arrayBuffer);
            }

            triangles.UploadData(usageHint);
        }
        public VertexBuffer(IGraphicsContext context, BufferUsageHint hint)
        {
            this.GraphicsContext = context;
            this.hint = hint;

            this.GraphicsContext.GenBuffers(1, out Handle);
        }
예제 #4
0
 public static IBuffer Buffer(this IContextObjectFactory factory, BufferTarget creationTarget, int sizeInBytes, BufferUsageHint usageHint, Array initialData)
 {
     var handle = GCHandle.Alloc(initialData, GCHandleType.Pinned);
      var result = factory.Buffer(creationTarget, sizeInBytes, usageHint, handle.AddrOfPinnedObject());
      handle.Free();
      return result;
 }
예제 #5
0
파일: GlHelper.cs 프로젝트: makesj/vienna
 public static int CreateBuffer(ushort[] data, BufferTarget target = BufferTarget.ArrayBuffer, BufferUsageHint hint = BufferUsageHint.StaticDraw)
 {
     var buffer = GenBuffer(target);
     var size = data.Length * sizeof(ushort);
     GL.BufferData(target, new IntPtr(size), data, hint);
     return buffer;
 }
예제 #6
0
파일: GlHelper.cs 프로젝트: makesj/vienna
 public static int CreateBuffer(Vertex[] data, BufferTarget target = BufferTarget.ArrayBuffer, BufferUsageHint hint = BufferUsageHint.StaticDraw)
 {
     var buffer = GenBuffer(target);
     var size = data.Length * Vertex.SizeInBytes;
     GL.BufferData(target, new IntPtr(size), data, hint);
     return buffer;
 }
예제 #7
0
        public VertexBufferObject(VertexBufferType type, VertexBufferUsageHint hint)
        {
            GL.GenBuffers(1, out buffer_id);

            buffer_target = (BufferTarget)type;

            buffer_hint = (BufferUsageHint)hint;
        }
예제 #8
0
        public static GLBuffer Allocate(BufferTarget bufferTarget, BufferUsageHint bufferUsageHint, byte[] data)
        {
            int handle = GL.GenBuffer();
            GL.BindBuffer(bufferTarget, handle);
            GL.BufferData(bufferTarget, (IntPtr)data.Length, data, bufferUsageHint);
            GL.BindBuffer(bufferTarget, 0);

            return new GLBuffer(handle, bufferTarget, bufferUsageHint, data.Length);
        }
예제 #9
0
        public static GLBuffer Allocate(BufferTarget bufferTarget, BufferUsageHint bufferUsageHint, int size)
        {
            int handle = GL.GenBuffer();
            GL.BindBuffer(bufferTarget, handle);
            GL.BufferData(bufferTarget, (IntPtr)size, IntPtr.Zero, bufferUsageHint);
            GL.BindBuffer(bufferTarget, 0);

            return new GLBuffer(handle, bufferTarget, bufferUsageHint, size);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="VBO"/> class.
 /// </summary>
 /// <param name="bufferTarget">Logical type of data in VBO</param>
 /// <param name="bufferUsageHint">The buffer usage hint.</param>
 /// <param name="size">The size.</param>
 internal VBO(BufferTarget bufferTarget, BufferUsageHint bufferUsageHint = BufferUsageHint.DynamicDraw, int size = 0)
 {
   GL.GenBuffers(1, out _vbo);
   _bufferTarget = bufferTarget;
   GL.BindBuffer(_bufferTarget, _vbo);
   GL.BufferData(_bufferTarget, new IntPtr(size), new IntPtr(0), bufferUsageHint);
   GL.BindBuffer(_bufferTarget, 0);
   _currentSize = size;
   _bufferUsageHint = bufferUsageHint;
 }
예제 #11
0
파일: GLBuffer.cs 프로젝트: Vengarioth/XUI
        public void SetData(ref byte[] data, BufferUsageHint usageHint)
        {
            if (Disposed)
                throw new ObjectDisposedException(ToString());

            UsageHint = usageHint;
            GL.BindBuffer(Target, Handle);
            GL.BufferData(Target, (IntPtr)data.Length, data, UsageHint);
            GL.BindBuffer(Target, 0);
        }
예제 #12
0
        /// <summary>
        /// Copies the given data into a buffer object on the GPU.
        /// </summary>
        /// <typeparam name="DataType">The value data type of each array element</typeparam>
        /// <param name="data">The data array</param>
        /// <param name="usageHint">How will this buffer object be used</param>
        public void Set <DataType>(DataType[] data, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) where DataType : struct
        {
            if (0 == data.Length)
            {
                throw new ArgumentException("Empty array");
            }
            var elementSize = Marshal.SizeOf(data[0]);
            var byteSize    = elementSize * data.Length;

            GL.NamedBufferData(Handle, byteSize, data, usageHint);             //copy data over to GPU
        }
예제 #13
0
        public Buffer(BufferTarget type, int size, IntPtr data, BufferUsageHint usageHint)
        {
            BufferType = type;
            BufferSize = size;
            BufferHint = usageHint;
            this.data  = data;

            BufferId = GL.GenBuffer();
            GL.BindBuffer(type, BufferId);
            GL.BufferData(type, (int)size, data, usageHint);
        }
예제 #14
0
 public void BufferData <T>(
     BufferTarget target,
     T[] data,
     int totalSizeInBytes,
     BufferUsageHint usageHint = BufferUsageHint.DynamicDraw)
     where T : struct
 {
     GL.BindBuffer(target, Handle);
     GL.BufferData <T>(target, new IntPtr(totalSizeInBytes), data, usageHint);
     GL.BindBuffer(target, 0);
 }
예제 #15
0
        public GLBuffer(BufferTarget target, T[] array, int stride, BufferUsageHint usageHint)
        {
            Array     = array;
            ID        = GL.GenBuffer();
            Target    = target;
            UsageHint = usageHint;
            Stride    = stride;

            GL.BindBuffer(Target, ID);
            GL.BufferData(Target, Length * Stride, Array, UsageHint);
        }
예제 #16
0
        public VertexBufferObject(T[] vertexData, int vectorLength, BufferTarget bufferTarget, BufferUsageHint bufferUsageHint)
        {
            Handle               = GL.GenBuffer();
            this.VertexData      = vertexData;
            this.vectorLength    = vectorLength;
            this.bufferUsageHint = bufferUsageHint;
            this.bufferTarget    = bufferTarget;

            BindBuffer();
            BufferData();
        }
예제 #17
0
        public void BufferData <T>([NotNull] T[] data, BufferUsageHint usage)
            where T : struct
        {
            EnsureNotDisposed();

            var dataSize = Marshal.SizeOf(typeof(T)) * data.Length;

            Activate();
            GL.BufferData(BufferTarget.ArrayBuffer, dataSize, data, usage);
            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
        }
        public VertexBufferObjectWithVAO(bool isStatic, int numVerticies, VertexAttributes attributes)
        {
            this.isStatic   = isStatic;
            this.attributes = attributes;
            this.vertices   = new float[numVerticies];

            bufferHandle = GL.GenBuffer();
            usage        = isStatic ? BufferUsageHint.StaticDraw : BufferUsageHint.DynamicDraw;

            createVAO();
        }
예제 #19
0
 public override void CreateOrUpdateMesh(BufferUsageHint bufferUsage)
 {
     if (Mesh == null)
     {
         Mesh = new VoxelMesh(bufferUsage, backMeshBuilder);
     }
     else
     {
         Mesh.Update(backMeshBuilder);
     }
 }
예제 #20
0
        /// <summary>
        /// Sets the specified data.
        /// </summary>
        /// <typeparam name="DATA_ELEMENT_TYPE">The type of the ata element type.</typeparam>
        /// <param name="data">The data.</param>
        /// <param name="usageHint">The usage hint.</param>
        public void Set <DATA_ELEMENT_TYPE>(DATA_ELEMENT_TYPE[] data, BufferUsageHint usageHint) where DATA_ELEMENT_TYPE : struct
        {
            Activate();
            int elementBytes   = Marshal.SizeOf(typeof(DATA_ELEMENT_TYPE));
            int bufferByteSize = data.Length * elementBytes;

            // set buffer data
            GL.BufferData(BufferTarget, bufferByteSize, data, usageHint);
            //cleanup state
            Deactivate();
        }
예제 #21
0
        public void Set <TDataElement>(TDataElement[] data, BufferUsageHint usageHint) where TDataElement : struct
        {
            Activate();
            int elementBytes   = Marshal.SizeOf(typeof(TDataElement));
            int bufferByteSize = data.Length * elementBytes;

            // set buffer data
            GL.BufferData(BufferTarget, (IntPtr)bufferByteSize, data, usageHint);
            //cleanup state
            Deactive();
        }
예제 #22
0
 private void Initialize()
 {
     GLTarget = GetGLBufferTarget(BufferType);
     GLUsage  = Dynamic ? BufferUsageHint.DynamicDraw : BufferUsageHint.StaticDraw;
     GLBuffer = GL.GenBuffer();
     GLHelper.CheckGLErrors();
     GL.BindBuffer(GLTarget, GLBuffer);
     GLHelper.CheckGLErrors();
     GL.BufferData(GLTarget, Size, IntPtr.Zero, GLUsage);
     GLHelper.CheckGLErrors();
     Context.InvalidateBufferBinding(BufferType);
 }
        public VertexBufferObject(EnableCap arrayType,
                                  BufferTarget target,
                                  BufferUsageHint usage,
                                  VertexPointerInfo pointer)
        {
            Buffer = new List <T>();

            this.ArrayType    = arrayType;
            this.BufferTarget = target;
            this.Pointer      = pointer;
            this.Usage        = usage;
        }
예제 #24
0
 /// <summary>
 /// Reserve a number of bytes in GPU memory for this vertex buffer.
 /// </summary>
 /// <remarks>
 /// This is useful for advanced features like transform feedback.
 /// </remarks>
 /// <param name="vertexCount">The amount of vertices reserved.</param>
 /// <param name="target">The target.</param>
 /// <param name="usageHint">The usage hin.t</param>
 /// <param name="setVertexCount">Whether to set the given vertex count as size of this vertex buffer.</param>
 public void BufferNoData(
     int vertexCount,
     BufferTarget target       = BufferTarget.ArrayBuffer,
     BufferUsageHint usageHint = BufferUsageHint.StreamDraw,
     bool setVertexCount       = false)
 {
     GL.BufferData(target, (IntPtr)(VertexSize * vertexCount), IntPtr.Zero, usageHint);
     if (setVertexCount)
     {
         Count = (ushort)vertexCount;
     }
 }
예제 #25
0
        public VertexBuffer(float[] data, BufferUsageHint usage, VertexBufferLayout layout)
        {
            Layout = layout ?? throw new ArgumentNullException(nameof(layout));

            Id = GL.GenBuffer();
            Logger.Trace("Generated buffer: {0}", Id);

            Bind();
            GL.BufferData(BufferTarget.ArrayBuffer, data.Length * sizeof(float), data, usage);
            Logger.Trace("Set buffer data: {1} bytes ({0})", usage, data.Length * sizeof(float));
            Unbind();
        }
예제 #26
0
 ///<summary>Allocate or reallocate buffer size. Call first to set buffer size. Allow for alignment in your size</summary>
 public void AllocateBytes(int bytessize, BufferUsageHint hint = BufferUsageHint.StaticDraw)
 {
     System.Diagnostics.Debug.Assert(context == GLStatics.GetContext(), "Context incorrect"); // safety
     if (bytessize > 0)                                                                       // can call twice - get fresh buffer each time
     {
         Length = bytessize;
         GL.NamedBufferData(Id, Length, (IntPtr)0, hint);                                          // set buffer size
         var err = GL.GetError();
         System.Diagnostics.Debug.Assert(err == ErrorCode.NoError, $"GL NamedBuffer error {err}"); // check for any errors, always.
         ResetPositions();
     }
 }
예제 #27
0
        public unsafe void Init(TDataType[] data, int elementCount, BufferTarget bufferType,
                                BufferUsageHint bufferUsage)
        {
            BufferType   = bufferType;
            Handle       = GL.GenBuffer();
            ElementCount = elementCount;
            int fullSize = ElementCount * sizeof(TDataType);

            Bind();
            GL.BufferData(bufferType, (IntPtr)fullSize, data, bufferUsage);
            CheckBufferSize(bufferType, fullSize);
        }
예제 #28
0
        private void GeneratePixelBufferObject(BufferTarget target, BufferUsageHint bufferUsage)
        {
            GL.GenBuffers(1, out pixelBufferObjectId);

            GL.BindBuffer(target, pixelBufferObjectId);
            if (RowPitch < 4)
            {
                GL.PixelStore(PixelStoreParameter.PackAlignment, 1);
            }
            GL.BufferData(target, (IntPtr)DepthPitch, IntPtr.Zero, bufferUsage);
            GL.BindBuffer(target, 0);
        }
예제 #29
0
        //internal void GenerateBuffer<T>() where T : struct, IVertexType
        internal void GenerateBuffer <T> () where T : struct
        {
            var vd = VertexDeclaration.FromType(_type);

            _size = vd.VertexStride * ((T[])_buffer).Length;

            BufferUsageHint bufferUsage = (_bufferUsage == BufferUsage.WriteOnly) ? BufferUsageHint.StaticDraw : BufferUsageHint.DynamicDraw;

            GL.GenBuffers(1, out _bufferStore);
            GL.BindBuffer(BufferTarget.ArrayBuffer, _bufferStore);
            GL.BufferData <T> (BufferTarget.ArrayBuffer, (IntPtr)_size, (T[])_buffer, bufferUsage);
        }
예제 #30
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="VertexData">An array containing the actual vertex coordinates and texture coordinates as X, Y, Z, U, V</param>
        /// <param name="DrawType">The hint representing how the object is to be used and therefore guides OpenGL's optimization of the object</param>
        public VertexBufferObject(LibRenderVertex[] VertexData, BufferUsageHint DrawType)
        {
            GL.GenBuffers(1, out handle);
            vertexData = VertexData;
            drawType   = DrawType;

            /*
             * Getting the size of the vertex type using marshal is slow, so cache it here
             * This allows us to meddle with the vertex contents without having to remember to update a const
             */
            vertexSize = LibRenderVertex.SizeInBytes;
        }
예제 #31
0
        public void BuildMeshFromGeometry(
            BufferUsageHint bufferUsageHint,
            NormalStyle normalStyle
            )
        {
            var attributePosition     = new Attribute(VertexUsage.Position, VertexAttribPointerType.Float, 0, 3);
            var attributeNormal       = new Attribute(VertexUsage.Normal, VertexAttribPointerType.Float, 0, 3);       /*  content normals     */
            var attributeNormalFlat   = new Attribute(VertexUsage.Normal, VertexAttribPointerType.Float, 1, 3);       /*  flat normals        */
            var attributeNormalSmooth = new Attribute(VertexUsage.Normal, VertexAttribPointerType.Float, 2, 3);       /*  smooth normals      */
            var attributeColor        = new Attribute(VertexUsage.Color, VertexAttribPointerType.Float, 0, 4);
            var attributeIdVec3       = new Attribute(VertexUsage.Id, VertexAttribPointerType.Float, 0, 3);
            var attributeIdUInt       = (RenderStack.Graphics.Configuration.useIntegerPolygonIDs)
                                        ? new Attribute(VertexUsage.Id, VertexAttribPointerType.UnsignedInt, 0, 1)
                                        : null;

            VertexFormat vertexFormat = new VertexFormat();

            vertexFormat.Add(attributePosition);
            vertexFormat.Add(attributeNormal);
            vertexFormat.Add(attributeNormalFlat);
            vertexFormat.Add(attributeNormalSmooth);

            Dictionary <Corner, Vector2> cornerTexcoords = null;
            Dictionary <Point, Vector2>  pointTexcoords  = null;

            if (Geometry.CornerAttributes.Contains <Vector2>("corner_texcoords"))
            {
                cornerTexcoords = Geometry.CornerAttributes.Find <Vector2>("corner_texcoords");
            }
            if (Geometry.PointAttributes.Contains <Vector2>("point_texcoords"))
            {
                pointTexcoords = Geometry.PointAttributes.Find <Vector2>("point_texcoords");
            }

            if (cornerTexcoords != null || pointTexcoords != null)
            {
                var attributeTexcoord = new Attribute(VertexUsage.TexCoord, VertexAttribPointerType.Float, 0, 2);
                vertexFormat.Add(attributeTexcoord);
            }
            // \todo When do we want color attribute and when we don't?
            //if(cornerColors != null || pointColors != null)
            //{
            vertexFormat.Add(attributeColor);
            //}
            vertexFormat.Add(attributeIdVec3);
            if (RenderStack.Graphics.Configuration.useIntegerPolygonIDs)
            {
                vertexFormat.Add(attributeIdUInt);
            }

            BuildMeshFromGeometry(bufferUsageHint, normalStyle, vertexFormat);
        }
예제 #32
0
        public VertexBuffer(T[] data, Action prep, BufferUsageHint bufferUsageHint = BufferUsageHint.DynamicDraw)
        {
            if (data == null)
            {
                return;
            }

            GL.GenBuffers(1, out _id);
            GL.BindBuffer(BufferTarget.ArrayBuffer, _id);
            GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(data.Length * BlittableValueType.StrideOf(data)), data, bufferUsageHint);
            Length = data.Length;
            _prep  = prep;
        }
예제 #33
0
 /// <summary>
 ///   Sets the data for this VBO. This will take effect once the resource is first
 ///   loaded into GPU memory, or (if it's already loaded) upon the next RenderContext
 ///   resource cycle.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="data"></param>
 /// <param name="bufferUsageHint"></param>
 public void SetData <T>(T[] data, BufferUsageHint bufferUsageHint) where T : struct
 {
     // Must be captured in a closure because it's a generic type.
     _bufferAction = () =>
     {
         Bind();
         GL.BufferData(_target, (IntPtr)(Marshal.SizeOf(typeof(T)) * data.Length), data, bufferUsageHint);
     };
     if (GLHandle != -1)
     {
         RenderContext.Active.AddResourceLoadAction(_bufferAction);
     }
 }
예제 #34
0
        public void BufferData <T>(T data, BufferUsageHint usage)
            where T : struct
        {
            EnsureNotDisposed();

            var dataSize = Marshal.SizeOf(typeof(T));

            Activate();
            GL.BufferData(BufferTarget.ElementArrayBuffer, dataSize, ref data, usage);
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);

            _itemCount = 1;
        }
예제 #35
0
        public void SetData <T>(T[] data, int size, BufferUsageHint hint = BufferUsageHint.StaticDraw)
            where T : struct, IComparable
        {
            if (!_built)
            {
                BuildLayout();
            }

            GL.BindBuffer(BufferTarget.ArrayBuffer, _vbo);
            GL.BufferData(BufferTarget.ArrayBuffer, size, data, hint);

            _vtxCount = size / GetStride();
        }
예제 #36
0
 public void BufferSubData <T>(
     BufferTarget target,
     T[] data,
     int totalSizeInBytes,
     IntPtr offset,
     BufferUsageHint usageHint = BufferUsageHint.DynamicDraw
     )
     where T : struct
 {
     GL.BindBuffer(target, Handle);
     GL.BufferSubData <T>(target, offset, totalSizeInBytes, data);
     GL.BindBuffer(target, 0);
 }
        public unsafe GLBuffer(BufferTarget target, T[] array, BufferUsageHint usageHint)
        {
            Array     = array;
            Id        = GL.GenBuffer();
            Target    = target;
            UsageHint = usageHint;
            Stride    = sizeof(T);

            GL.BindBuffer(Target, Id);
            GL.BufferData(Target, Length * Stride, Array, UsageHint);

            GC.AddMemoryPressure(Stride * Array.Length);
        }
예제 #38
0
        private BufferStorageFlags BufferUsageToStorageFlags(BufferUsageHint hint)
        {
            switch (hint)
            {
            case BufferUsageHint.StaticCopy:
            case BufferUsageHint.StaticRead:
            case BufferUsageHint.StaticDraw:
                return(BufferStorageFlags.None);

            default:
                return(BufferStorageFlags.DynamicStorageBit);
            }
        }
예제 #39
0
        public static IBuffer Create(DrawElementsType indexType, BufferUsageHint usageHint)
        {
#if false
            if (Configuration.useOpenRL)
            {
                return(new BufferGLRL(indexType, usageHint));
            }
            else
#endif
            {
                return(new BufferGL(indexType, usageHint));
            }
        }
예제 #40
0
        public PersistentBufferObject(BufferUsageHint hint, UInt32 size)
            : base(BufferTarget.ArrayBuffer, hint)
        {
            mySize = size;
            bind();
            BufferStorageFlags flags = BufferStorageFlags.MapWriteBit | BufferStorageFlags.MapPersistentBit | BufferStorageFlags.MapCoherentBit;

            GL.BufferStorage(BufferTarget.ArrayBuffer, new IntPtr(size), IntPtr.Zero, flags);
            BufferAccessMask flags2 = BufferAccessMask.MapWriteBit | BufferAccessMask.MapPersistentBit | BufferAccessMask.MapCoherentBit;

            myPtr = GL.MapBufferRange(BufferTarget.ArrayBuffer, IntPtr.Zero, new IntPtr(size), flags2);
            unbind();
        }
예제 #41
0
        public static IBuffer Create(VertexFormat vertexFormat, BufferUsageHint usageHint)
        {
#if false
            if (Configuration.useOpenRL)
            {
                return(new BufferGLRL(vertexFormat, usageHint));
            }
            else
#endif
            {
                return(new BufferGL(vertexFormat, usageHint));
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="VAO"/> class.
 /// </summary>
 /// <param name="bufferTargets">The VBO data types.</param>
 /// <param name="VBObufferUsageHint">The VBO buffer usage hint.</param>
 /// <param name="VBOsize">The VBO size.</param>
 public VAO(BufferTarget[] bufferTargets = null, BufferUsageHint VBObufferUsageHint = BufferUsageHint.DynamicDraw,
            int VBOsize = 0)
 {
   GL.GenVertexArrays(1, out _vao);
   GL.BindVertexArray(_vao);
   if(bufferTargets != null)
   {
     foreach(var buffer in bufferTargets.Where(x => !VBOobjects.ContainsKey(x)))
     {
       VBOobjects.Add(buffer, new VBO(buffer, VBObufferUsageHint, VBOsize));
     }
   }
   GL.BindVertexArray(0);
 }
예제 #43
0
파일: Buffer.cs 프로젝트: Zulkir/ObjectGL
        public Buffer(IContext context, BufferTarget target, int sizeInBytes, BufferUsageHint usage, IntPtr initialData)
        {
            this.context = context;
            this.target = target;
            this.sizeInBytes = sizeInBytes;
            this.usage = usage;

            uint handleProxy;
            GL.GenBuffers(1, &handleProxy);
            handle = handleProxy;

            context.Bindings.Buffers.ByTarget(target).Set(this);
            GL.BufferData((int)target, (IntPtr)sizeInBytes, initialData, (int)usage);
        }
		public SentanceBlockStorageBuffer(SentanceBlock[] blocks, BufferUsageHint hint)
		{
			// Buffer for the linked list.
			BufferId = GL.GenBuffer();
			// manually set
			const int BUFFER_INDEX = 0;
			Index = BUFFER_INDEX;
			GL.BindBuffer(BufferTarget.ShaderStorageBuffer, BufferId);
			GL.BindBufferBase(BufferRangeTarget.ShaderStorageBuffer, Index, BufferId);
			var structSize = Marshal.SizeOf (typeof(SentanceBlock));

			var bufferSize = (IntPtr) (blocks.Length * structSize);
			GL.BufferData<SentanceBlock>(BufferTarget.ShaderStorageBuffer, bufferSize, blocks, hint);
			GL.BindBuffer(BufferTarget.ShaderStorageBuffer, 0);
		}
예제 #45
0
        public void UploadData(List<Vertex> vertices, BufferUsageHint usageHint)
        {
            this.size = vertices.Count;
            VBOVertex[] data = new VBOVertex[vertices.Count];
            for (int i = 0; i < vertices.Count; ++i)
            {
                if (vertices[i].Location != null)
                {
                    data[i].x = vertices[i].Location.X;
                    data[i].y = vertices[i].Location.Y;
                    data[i].z = vertices[i].Location.Z;
                }

                if (vertices[i].Normal != null)
                {
                    data[i].nx = vertices[i].Normal.X;
                    data[i].ny = vertices[i].Normal.Y;
                    data[i].nz = vertices[i].Normal.Z;
                }

                if (vertices[i].TexCoord != null)
                {
                    data[i].s0 = vertices[i].TexCoord.S;
                    data[i].t0 = vertices[i].TexCoord.T;
                }
            }

            Activate();
            {
                GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(data.Length * VBOVertex.Stride),
                   data, usageHint);
                GL.VertexPointer(3, VertexPointerType.Float, VBOVertex.Stride, 0);
                GL.NormalPointer(NormalPointerType.Float, VBOVertex.Stride, sizeof(float) * 3);
                GL.TexCoordPointer(2, TexCoordPointerType.Float, VBOVertex.Stride, sizeof(float) * 3);
            }
            Deactivate();
        }
예제 #46
0
        public SplineTubesTess(string shaderPath, TessTubeShadingStyle shadingStyle, TessTubeRenderSetting renderSettings, BufferUsageHint bufferUsageHintType, int bufferMaxElementCount, int[] nodeCount, int vertexRingCount, int vertexRingVertexCount)
            : base(renderSettings.HasFlag(TessTubeRenderSetting.ShaderBufferTypeIsSSBO) ? ShaderBufferType.SSBO : ShaderBufferType.UBO, bufferUsageHintType, bufferMaxElementCount, nodeCount, 1 + vertexRingCount / 2)
        {
            this.shadingStyle = shadingStyle;
            this.renderSettings = renderSettings;

            this.vertexRingVertexCount = vertexRingVertexCount;
            this.vertexRingCount = vertexRingCount;

            this.maxLayerId = vertexRingCount - 1;

            if (shadingStyle == TessTubeShadingStyle.HardNormalWF || shadingStyle == TessTubeShadingStyle.BlueWF)
                renderSettings |= TessTubeRenderSetting.UseGeoShader;

            if (renderSettings.HasFlag(TessTubeRenderSetting.UseCaps))
                cylIB = IndexBuffer.CreateClosedQuadCylinder(vertexRingVertexCount, vertexRingCount);
            else
                cylIB = IndexBuffer.CreateQuadCylinder(vertexRingVertexCount, vertexRingCount);

            var definesStr = shadingStyle.ToDefineString() + renderSettings.ToDefineString();
            definesStr += "#define TUBES_BUFFER_SIZE " + this.shaderBuffer.Float4BlockCount.ToString();
            definesStr += Environment.NewLine;
            definesStr += "#define VRING_VERTEX_COUNT " + vertexRingVertexCount.ToString();
            definesStr += Environment.NewLine;
            definesStr += "#define VRING_COUNT " + vertexRingCount.ToString();
            definesStr += Environment.NewLine;

            if (renderSettings.HasFlag(TessTubeRenderSetting.UseGeoShader))
            {
                shader = new Shader(
                "#version 440",
                definesStr,
                shaderPath + ".defs",
                new Shader.Desc(ShaderType.VertexShader, shaderPath + ".vs"),
                new Shader.Desc(ShaderType.TessControlShader, shaderPath + ".tc"),
                new Shader.Desc(ShaderType.TessEvaluationShader, shaderPath + ".te"),
                new Shader.Desc(ShaderType.GeometryShader, shaderPath + ".gs"),
                new Shader.Desc(ShaderType.FragmentShader, shaderPath + ".fs"));
            }
            else
            {
                shader = new Shader(
                "#version 440",
                definesStr,
                shaderPath + ".defs",
                new Shader.Desc(ShaderType.VertexShader, shaderPath + ".vs"),
                new Shader.Desc(ShaderType.TessControlShader, shaderPath + ".tc"),
                new Shader.Desc(ShaderType.TessEvaluationShader, shaderPath + ".te"),
                new Shader.Desc(ShaderType.FragmentShader, shaderPath + ".fs"));
            }
        }
예제 #47
0
 public void SetDataUint( BufferTarget Target, BufferUsageHint Hint, uint[] Data )
 {
     GL.BindBuffer( Target, ID );
     GL.BufferData( Target, (IntPtr)( Data.Length * sizeof( uint ) ), Data, Hint );
     Length = Data.Length;
 }
예제 #48
0
파일: Buffer.cs 프로젝트: feliwir/SageCS
 public void BufferData(BufferTarget target, BufferUsageHint usage, Vector3[] vertices)
 {
     Bind(target);
     GL.BufferData<Vector3>(target, new IntPtr(vertices.Length * Vector3.SizeInBytes), vertices, usage);
 }
예제 #49
0
 public void UploadData(BufferUsageHint usageHint)
 {
     GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)_indices.ByteCount, _indices.Ptr, usageHint);
     GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)_vertices.ByteCount, _vertices.Ptr, usageHint);
 }
예제 #50
0
파일: GL.cs 프로젝트: CNCBrasil/agg-sharp
		public static void BufferData(BufferTarget target, int size, IntPtr data, BufferUsageHint usage)
		{
#if USE_OPENGL
			if (openGlHardwareAvailable)
			{
				if(glHasBufferObjects)
				{
					OpenTK.Graphics.OpenGL.GL.BufferData((OpenTK.Graphics.OpenGL.BufferTarget)target, (IntPtr)size, data, (OpenTK.Graphics.OpenGL.BufferUsageHint)usage);
				}
				else
				{
					byte[] dataCopy = new byte[size];
					unsafe
					{
						for (int i = 0; i < size; i++)
						{
							dataCopy[i] = ((byte*)data)[i];
						}
					}

					switch (target)
					{
						case BufferTarget.ArrayBuffer:
							if(currentArrayBufferIndex == 0)
							{
								throw new Exception("You don't have a ArrayBuffer set.");
							}
							bufferData[currentArrayBufferIndex] = dataCopy;
							break;

						case BufferTarget.ElementArrayBuffer:
							if(currentElementArrayBufferIndex == 0)
							{
								throw new Exception("You don't have an EllementArrayBuffer set.");
							}
							bufferData[currentElementArrayBufferIndex] = dataCopy;
							break;

						default:
							throw new NotImplementedException();
					}
				}
			}
#else
			if (glHasBufferObjects)
			{
				OpenTK.Graphics.ES11.GL.BufferData((OpenTK.Graphics.ES11.All)target, (IntPtr)size, data, (OpenTK.Graphics.ES11.All)usage);
			}
			else
			{
				byte[] dataCopy = new byte[size];
				unsafe
				{
					for (int i = 0; i < size; i++)
					{
						dataCopy[i] = ((byte*)data)[i];
					}
				}

				switch (target)
				{
					case BufferTarget.ArrayBuffer:
						if (currentArrayBufferIndex == 0)
						{
							throw new Exception("You don't have a ArrayBuffer set.");
						}
						bufferData[currentArrayBufferIndex] = dataCopy;
						break;

					case BufferTarget.ElementArrayBuffer:
						if (currentElementArrayBufferIndex == 0)
						{
							throw new Exception("You don't have an EllementArrayBuffer set.");
						}
						bufferData[currentElementArrayBufferIndex] = dataCopy;
						break;

					default:
						throw new NotImplementedException();
				}
			}
#endif
		}
예제 #51
0
        public SplineTubesRaycast(string shaderPath, RaycastTubeShadingStyle shadingStyle, RaycastTubeRenderSetting renderSettings, BufferUsageHint bufferUsageHintType, int bufferMaxElementCount, int[] nodeCount)
            : base(renderSettings.HasFlag(RaycastTubeRenderSetting.ShaderBufferTypeIsSSBO) ? ShaderBufferType.SSBO : ShaderBufferType.UBO, bufferUsageHintType, bufferMaxElementCount, nodeCount, 1)
        {
            this.shadingStyle = shadingStyle;
            this.renderSettings = renderSettings;

            cube = new Mesh<Vector3>(
            new[]
            {
                new VertexAttribute()
                {
                    Index = 0,
                    Size = 3,
                    Type = VertexAttribPointerType.Float,
                    Normalized = false,
                    Stride = Vector3.SizeInBytes,
                    Offset = 0,
                }
            },
            new[]
            {
                new Vector3(-1f, +1f, +1f),
                new Vector3(-1f, -1f, +1f),
                new Vector3(+1f, +1f, +1f),
                new Vector3(+1f, -1f, +1f),
                new Vector3(+1f, -1f, -1f),
                new Vector3(+1f, +1f, -1f),
                new Vector3(-1f, +1f, -1f),
                new Vector3(-1f, -1f, -1f)
            },
            new uint[]
            {
                0, 1, 2,
                2, 1, 3,
                3, 4, 2,
                2, 4, 5,
                5, 4, 6,
                6, 4, 7,
                7, 1, 0,
                0, 6, 7,
                7, 4, 3,
                3, 1, 7,
                6, 0, 2,
                2, 5, 6,
            });

            if (renderSettings.HasFlag(RaycastTubeRenderSetting.SplitIn4Segments))
                qSegmentCount = 4;
            else
                qSegmentCount = 2;

            var definesStr = shadingStyle.ToDefineString() + renderSettings.ToDefineString();
            definesStr += "#define TUBES_BUFFER_SIZE " + this.shaderBuffer.Float4BlockCount.ToString();
            definesStr += Environment.NewLine;

            shader = new Shader(
                    "#version 440",
                    definesStr,
                    shaderPath + ".defs",
                    new Shader.Desc(ShaderType.VertexShader, shaderPath + ".vs"),
                    new Shader.Desc(ShaderType.FragmentShader, shaderPath + ".fs"));
        }
예제 #52
0
        //public int GetNodeId(int bufferId, int localNodeId)
        //{
        //    return cummNodeCount[bufferId] + localNodeId;
        //}
        public SplineTubes(ShaderBufferType shaderBufferType, BufferUsageHint bufferUsageHintType, int bufferMaxElementCount, int[] nodeCount, int segmentElementCount)
        {
            Utils.Assert(bufferElementSize == 1 || bufferElementSize == 2 || bufferElementSize == 4 || bufferElementSize == 8,
                        "bufferElementSize == 1 || bufferElementSize == 2 || bufferElementSize == 4 || bufferElementSize == 8");

            Utils.Assert(nodeCount.Length > 0,
                        "nodeCount.Length > 0");

            if (shaderBufferType == ShaderBufferType.UBO)
            {
                if(bufferMaxElementCount > 0)
                    bufferMaxElementCount = Math.Min(bufferMaxElementCount, GL.GetInteger(GetPName.MaxUniformBlockSize) / sizeof(float) / bufferElementSize);
                else
                    bufferMaxElementCount = GL.GetInteger(GetPName.MaxUniformBlockSize) / sizeof(float) / bufferElementSize;
            }
            else
            {
                if (bufferMaxElementCount > 0)
                    bufferMaxElementCount = Math.Min(bufferMaxElementCount, GL.GetInteger((GetPName)All.MaxShaderStorageBlockSize) / sizeof(float) / bufferElementSize);
                else
                    bufferMaxElementCount = GL.GetInteger((GetPName)All.MaxShaderStorageBlockSize) / sizeof(float) / bufferElementSize;
            }

            //if(bufferMaxElementCount < 0)
            //{
            //    if(shaderBufferType == ShaderBufferType.UBO)
            //        bufferMaxElementCount = GL.GetInteger(GetPName.MaxUniformBlockSize) / sizeof(float) / bufferElementSize;
            //    else
            //        bufferMaxElementCount = GL.GetInteger((GetPName)All.MaxShaderStorageBlockSize) / sizeof(float) / bufferElementSize;
            //}

            this.bufferMaxElementCount = bufferMaxElementCount;
            //this.bufferElementSize = bufferElementSize;

            this.nodeElementCount = TubeNode.Size / bufferElementSize;
            this.segmentElementCount = segmentElementCount;

            Utils.Assert(bufferMaxElementCount >= (nodeElementCount + segmentElementCount) * 2,
                        "bufferMaxElementCount >= (nodeElementCount + segmentElementCount) * 2");

            this.tubeCount = nodeCount.Length;

            var nodeCountCapacity = new int[tubeCount];

            this.cummNodeCount = new int[tubeCount + 1];
            this.nodeCount = new int[tubeCount];

            for (int i = 0; i < tubeCount; ++i)
            {
                Utils.Assert(nodeCount[i] > 1,
                            "nodeCount[i] > 1");

                cummNodeCount[i] = totalNodeCount;
                totalNodeCount += nodeCount[i];

                nodeCountCapacity[i] = nodeCount[i];
                this.nodeCount[i] = nodeCount[i];
            }

            cummNodeCount[tubeCount] = totalNodeCount;

            var totalNodeCountCapacity = totalNodeCount;

            var tubeId = 0;
            var bufferId = 0;

            var bufferCapacity = bufferMaxElementCount;
            var currSegmentCount = 0;
            var currNodeCount = 0;
            var maxBufferSize = 0;
            var dublicatedNode = false;

            while (totalNodeCountCapacity > 0)
            {
                var currNodeCountCapacity = nodeCountCapacity[tubeId];

                var firstNode = currNodeCountCapacity == nodeCount[tubeId];
                var lastNode = currNodeCountCapacity == 1;
                var secondlastNode = currNodeCountCapacity == 2;

                var currElementSize = nodeElementCount;
                var nextElementSize = nodeElementCount;

                if (!lastNode)
                    currElementSize += segmentElementCount;

                if (!secondlastNode)
                    nextElementSize += segmentElementCount;

                var currFits = bufferCapacity >= currElementSize;
                var nextFits = bufferCapacity >= currElementSize + nextElementSize;

                var addNewNode = currFits && (!firstNode || nextFits);

                if (addNewNode)
                {
                    bufferCapacity -= currElementSize;

                    if (nextFits || lastNode)
                    {
                        NodeMappingData mapping;
                        mapping.BufferId = bufferId;
                        mapping.Offset = currNodeCount * nodeElementCount;// not finalized
                        mapping.SegmentOffset = -1;
                        mapping.Dublicated = dublicatedNode;
                        mapping.EndNode = lastNode;
                        mapping.StartNode = firstNode;

                        idToMemMap.Add(mapping);

                        if (!lastNode)
                            ++currSegmentCount;

                        ++currNodeCount;

                        --totalNodeCountCapacity;
                        --nodeCountCapacity[tubeId];

                        if (lastNode) ++tubeId;

                        dublicatedNode = false;
                    }
                    else
                        dublicatedNode = true;
                }

                if (!addNewNode || totalNodeCountCapacity == 0)
                {
                    var bufferSize = bufferMaxElementCount - bufferCapacity;

                    Utils.Assert(bufferSize != 0,
                                "bufferSize != 0");

                    tubesBufferContent.Add(new ShaderBufferContent(bufferSize));
                    segmentCount.Add(currSegmentCount);

                    if (bufferSize > maxBufferSize) maxBufferSize = bufferSize;

                    bufferCapacity = bufferMaxElementCount;
                    currSegmentCount = 0;
                    currNodeCount = 0;

                    ++bufferId;
                }
            }

            shaderBufferCount = tubesBufferContent.Count;

            var bId = -1;
            var bOff = 0;
            var addOffset = 0;
            for (var nId = 0; nId < totalNodeCount; ++nId)
            {
                var mapping = idToMemMap[nId];

                if (mapping.BufferId > bId)
                {
                    bId = mapping.BufferId;
                    bOff = 0;

                    addOffset = segmentCount[bId] * segmentElementCount;
                }

                mapping.Offset += addOffset;
                mapping.SegmentOffset = bOff;

                idToMemMap[nId] = mapping;

                if (!mapping.EndNode)
                {
                    tubesBufferContent[bId].Fill(bOff, 0, (float)mapping.Offset);

                    bOff += segmentElementCount;
                }
            }

            shaderBuffer = new ShaderBuffer(shaderBufferType, maxBufferSize, bufferUsageHintType);
        }
예제 #53
0
        /// <summary>
        /// Generates a buffer object from the specified parameters, which can be accessed trough this object.
        /// </summary>
        /// <param name="data">The data to be stored in the VBO</param>
        /// <param name="dataSize">The amount of vertices each data block contains</param>
        /// <param name="bufferTarget">Specifies the buffer type</param>
        /// <param name="bufferUsageHint">Specifies how the buffer should be used</param>
        /// <param name="genAO">Should an Array Object be generated for this Buffer Object?</param>
        public void Generate(float[] data, int dataSize, BufferTarget bufferTarget, BufferUsageHint bufferUsageHint, bool genAO)
        {
            this.BufferTarget = bufferTarget;

            // Set up some additional local variables:
            int i = 0;
            while (UsedIds[i]) {
                i++;
            }
            UsedIds[i] = true;
            // The vertex attribute Id
            vertexAttribId = i;

            // The amount of buffer objects that should be generated
            int amount = 1;

            int var;
            if (genAO) {
                GL.GenVertexArrays(amount, out var);
                arrayObjectId = var;
                GL.BindVertexArray(arrayObjectId);
            }

            GL.GenBuffers(amount, out var);
            bufferObjectId = var;
            GL.BindBuffer(bufferTarget, bufferObjectId);
            GL.BufferData(bufferTarget, (IntPtr)(data.Length * FloatSize), data, bufferUsageHint);
            GL.VertexAttribPointer(vertexAttribId, dataSize, VertexAttribPointerType.Float, false, 0, 0);
            GL.EnableVertexAttribArray(vertexAttribId);
        }
예제 #54
0
 /// <summary>
 /// Uploads the index buffer to the GPU.
 /// </summary>
 /// <param name="target">The target.</param>
 /// <param name="usageHint">The usage hint.</param>
 public void BufferData(BufferTarget target = BufferTarget.ElementArrayBuffer, BufferUsageHint usageHint = BufferUsageHint.StreamDraw)
 {
     GL.BufferData(target, (IntPtr)(sizeof(ushort) * this.count), this.indices, usageHint);
 }
예제 #55
0
 public SSIndexBuffer(ISSVertexBuffer vbo, BufferUsageHint hint = BufferUsageHint.DynamicDraw)
 {
     m_vbo = vbo;
     m_usageHint = hint;
 }
예제 #56
0
 public SSIndexBuffer(UInt16[] indices, ISSVertexBuffer vbo, BufferUsageHint hint = BufferUsageHint.StaticDraw)
     : this(vbo, hint)
 {
     UpdateBufferData(indices);
 }
예제 #57
0
 public IBuffer Buffer(BufferTarget creationTarget, int sizeInBytes, BufferUsageHint usage, IntPtr initialData = default(IntPtr))
 {
     return new Buffer(context, creationTarget, sizeInBytes, usage, initialData);
 }
예제 #58
0
        //Methods
        //-Public
        public static int AddVBO(uint size, BufferUsageHint buh = BufferUsageHint.StaticDraw)
        {
            int itemp;
            VBODataInfo vbodinfo;

            GL.GenBuffers(1, out itemp);
            #if DEBUG
            Misc.GLError("(VBOHandler - GenBuffer)");
            #endif
            vbodinfo = new VBODataInfo(itemp, size);
            vBOs_DicIVdi.Add(itemp, vbodinfo);

            GL.BindBuffer(BufferTarget.ArrayBuffer, itemp);
            GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(vbodinfo.Size), IntPtr.Zero, buh);
            #if DEBUG
            Misc.GLError("(VBOHandler - BufferData)");
            #endif
            //GL.BindBuffer(BufferTarget.ArrayBuffer, 0); //Remove?
            currentBuffer_I = itemp; //Change to = uitemp (if previous line is removed!)

            if(defaultBuffer_I == 0) {
                defaultBuffer_I = itemp;
            #if DEBUG
                Console.WriteLine("Default VBO: " + defaultBuffer_I);
            #endif
            }

            return itemp;
        }
예제 #59
0
파일: VBO.cs 프로젝트: bosoni/csat
 public VBO(BufferUsageHint usage)
 {
     this.usage = usage;
 }
예제 #60
0
 public static Buffer CreateBuffer(this Context context, int size, IntPtr data, BufferUsageHint bufferUsage)
 {
     return new Buffer(NativeMethods.cgGLCreateBuffer(context.Handle, size, data, bufferUsage), true);
 }