280 lines
6.7 KiB
C++
280 lines
6.7 KiB
C++
/* 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__ */
|