/* ============================================================================ * Freetype GL - A C OpenGL Freetype engine * Platform: Any * WWW: http://code.google.com/p/freetype-gl/ * ---------------------------------------------------------------------------- * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are * those of the authors and should not be interpreted as representing official * policies, either expressed or implied, of Nicolas P. Rougier. * ============================================================================ */ #ifndef __VERTEX_BUFFER_H__ #define __VERTEX_BUFFER_H__ #ifdef __cplusplus extern "C" { #endif #include "opengl.h" #include "vector.h" #include "vertex-attribute.h" /** * @file vertex-buffer.h * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) * @date April, 2012 * * @defgroup vertex-buffer Vertex buffer * * @{ */ /** * Generic vertex buffer. */ typedef struct { /** Format of the vertex buffer. */ char * format; /** Vector of vertices. */ vector_t * vertices; /** 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 * @param what attributes to be rendered */ void vertex_buffer_render_setup ( vertex_buffer_t *self, GLenum mode, const char *what ); /** * 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 * @param what attributes to be rendered */ void vertex_buffer_render ( vertex_buffer_t *self, GLenum mode, const char *what ); /** * 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, GLuint * indices, 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, void * vertices, 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, size_t index, GLuint *indices, 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, size_t index, void *vertices, 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, size_t first, 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, size_t first, 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, void * vertices, size_t vcount, GLuint * indices, 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, size_t index, void * vertices, size_t vcount, GLuint * indices, 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, size_t index ); /** @} */ #ifdef __cplusplus } #endif #endif /* __VERTEX_BUFFER_H__ */