/* Freetype GL - A C OpenGL Freetype engine * * Distributed under the OSI-approved BSD 2-Clause License. See accompanying * file `LICENSE` for more details. */ #ifndef __VERTEX_BUFFER_H__ #define __VERTEX_BUFFER_H__ #ifdef __cplusplus extern "C" { #endif #include "opengl.h" #include "vector.h" #include "vertex-attribute.h" #ifdef __cplusplus namespace ftgl { #endif /** * @file vertex-buffer.h * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) * @date April, 2012 * * @defgroup vertex-buffer Vertex buffer * * @{ */ /** * Generic vertex buffer. */ typedef struct vertex_buffer_t { /** Format of the vertex buffer. */ char *format; /** Vector of vertices. */ vector_t *vertices; #ifdef FREETYPE_GL_USE_VAO /** GL identity of the Vertex Array Object */ GLuint VAO_id; #endif /** GL identity of the vertices buffer. */ GLuint vertices_id; /** Vector of indices. */ vector_t *indices; /** GL identity of the indices buffer. */ GLuint indices_id; /** Current size of the vertices buffer in GPU */ size_t GPU_vsize; /** Current size of the indices buffer in GPU*/ size_t GPU_isize; /** GL primitives to render. */ GLenum mode; /** Whether the vertex buffer needs to be uploaded to GPU memory. */ char state; /** Individual items */ vector_t *items; /** Array of attributes. */ vertex_attribute_t *attributes[MAX_VERTEX_ATTRIBUTE]; } vertex_buffer_t; /** * Creates an empty vertex buffer. * * @param format a string describing vertex format. * @return an empty vertex buffer. */ vertex_buffer_t *vertex_buffer_new(const char *format); /** * Deletes vertex buffer and releases GPU memory. * * @param self a vertex buffer */ void vertex_buffer_delete(vertex_buffer_t *self); /** * Returns the number of items in the vertex buffer * * @param self a vertex buffer * @return number of items */ size_t vertex_buffer_size(const vertex_buffer_t *self); /** * Returns vertex format * * @param self a vertex buffer * @return vertex format */ const char *vertex_buffer_format(const vertex_buffer_t *self); /** * Print information about a vertex buffer * * @param self a vertex buffer */ void vertex_buffer_print(vertex_buffer_t *self); /** * Prepare vertex buffer for render. * * @param self a vertex buffer * @param mode render mode */ void vertex_buffer_render_setup(vertex_buffer_t *self, GLenum mode); /** * Finish rendering by setting back modified states * * @param self a vertex buffer */ void vertex_buffer_render_finish(vertex_buffer_t *self); /** * Render vertex buffer. * * @param self a vertex buffer * @param mode render mode */ void vertex_buffer_render(vertex_buffer_t *self, GLenum mode); /** * Render a specified item from the vertex buffer. * * @param self a vertex buffer * @param index index of the item to be rendered */ void vertex_buffer_render_item(vertex_buffer_t *self, size_t index); /** * Upload buffer to GPU memory. * * @param self a vertex buffer */ void vertex_buffer_upload(vertex_buffer_t *self); /** * Clear all items. * * @param self a vertex buffer */ void vertex_buffer_clear(vertex_buffer_t *self); /** * Appends indices at the end of the buffer. * * @param self a vertex buffer * @param indices indices to be appended * @param icount number of indices to be appended * * @private */ void vertex_buffer_push_back_indices(vertex_buffer_t *self, const GLuint *indices, const size_t icount); /** * Appends vertices at the end of the buffer. * * @note Internal use * * @param self a vertex buffer * @param vertices vertices to be appended * @param vcount number of vertices to be appended * * @private */ void vertex_buffer_push_back_vertices(vertex_buffer_t *self, const void *vertices, const size_t vcount); /** * Insert indices in the buffer. * * @param self a vertex buffer * @param index location before which to insert indices * @param indices indices to be appended * @param icount number of indices to be appended * * @private */ void vertex_buffer_insert_indices(vertex_buffer_t *self, const size_t index, const GLuint *indices, const size_t icount); /** * Insert vertices in the buffer. * * @param self a vertex buffer * @param index location before which to insert vertices * @param vertices vertices to be appended * @param vcount number of vertices to be appended * * @private */ void vertex_buffer_insert_vertices(vertex_buffer_t *self, const size_t index, const void *vertices, const size_t vcount); /** * Erase indices in the buffer. * * @param self a vertex buffer * @param first the index of the first index to be erased * @param last the index of the last index to be erased * * @private */ void vertex_buffer_erase_indices(vertex_buffer_t *self, const size_t first, const size_t last); /** * Erase vertices in the buffer. * * @param self a vertex buffer * @param first the index of the first vertex to be erased * @param last the index of the last vertex to be erased * * @private */ void vertex_buffer_erase_vertices(vertex_buffer_t *self, const size_t first, const size_t last); /** * Append a new item to the collection. * * @param self a vertex buffer * @param vcount number of vertices * @param vertices raw vertices data * @param icount number of indices * @param indices raw indices data */ size_t vertex_buffer_push_back(vertex_buffer_t *self, const void *vertices, const size_t vcount, const GLuint *indices, const size_t icount); /** * Insert a new item into the vertex buffer. * * @param self a vertex buffer * @param index location before which to insert item * @param vertices raw vertices data * @param vcount number of vertices * @param indices raw indices data * @param icount number of indices */ size_t vertex_buffer_insert(vertex_buffer_t *self, const size_t index, const void *vertices, const size_t vcount, const GLuint *indices, const size_t icount); /** * Erase an item from the vertex buffer. * * @param self a vertex buffer * @param index index of the item to be deleted */ void vertex_buffer_erase(vertex_buffer_t *self, const size_t index); /** @} */ #ifdef __cplusplus } } #endif #endif /* __VERTEX_BUFFER_H__ */