/* 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_ATTRIBUTE_H__
#define __VERTEX_ATTRIBUTE_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "opengl.h"
#include "vector.h"
#ifdef __cplusplus
namespace ftgl {
#endif
/**
* @file vertex-attribute.h
* @author Nicolas Rougier (Nicolas.Rougier@inria.fr)
*
* @defgroup vertex-attribut Vertex attribute
*
* Besides the required vertex position, vertices can have several other
* numeric attributes. Each is specified in the format string with a letter,
* the number of components and the data type.
*
* Each of the attributes is described in the table below with the set of valid
* format strings written as a regular expression (for example, "v[234][if]"
* means "v2f", "v3i", "v4f", etc. are all valid formats).
*
* Some attributes have a "recommended" format string, which is the most
* efficient form for the video driver as it requires less conversion.
*
*
*
* Attribute |
* Formats |
* Recommended |
*
*
* Vertex position |
* "v[234][sifd]" |
* "v[234]f" |
*
*
* Color |
* "c[34][bBsSiIfd]" |
* "c[34]B" |
*
*
* Edge flag |
* "e1[bB]" |
* |
*
*
* Fog coordinate |
* "f[1234][bBsSiIfd]" |
* |
*
*
* Normal |
* "n3[bsifd]" |
* "n3f" |
*
*
* Secondary color |
* "s[34][bBsSiIfd]" |
* "s[34]B" |
*
*
* Texture coordinate |
* "t[234][sifd]" |
* "t[234]f" |
*
*
* Generic attribute |
* "[0-15]g(n)?[1234][bBsSiIfd]" |
* |
*
*
*
* The possible data types that can be specified in the format string are described below.
*
*
*
* Format |
* Type |
* GL Type |
*
*
* "b" |
* Signed byte |
* GL_BYTE |
*
*
* "B" |
* Unsigned byte |
* GL_UNSIGNED_BYTE |
*
*
* "s" |
* Signed short |
* GL_SHORT |
*
*
* "S" |
* Unsigned short |
* GL_UNSIGNED_SHORT |
*
*
* "i" |
* Signed int |
* GL_INT |
*
*
* "I" |
* Unsigned int |
* GL_UNSIGNED_INT |
*
*
* "f" |
* Float |
* GL_FLOAT |
*
*
* "d" |
* Double |
* GL_DOUBLE T |
*
*
*
* The following attributes are normalised to the range [0, 1]. The value is
* used as-is if the data type is floating-point. If the data type is byte,
* short or int, the value is divided by the maximum value representable by
* that type. For example, unsigned bytes are divided by 255 to get the
* normalised value.
*
* - Color
* - Secondary color
* - Generic attributes with the "n" format given.
*
* Up to 16 generic attributes can be specified per vertex, and can be used by
* shader programs for any purpose (they are ignored in the fixed-function
* pipeline). For the other attributes, consult the OpenGL programming guide
* for details on their effects.
*
* When using the draw and related functions, attribute data is specified
* alongside the vertex position data. The following example reproduces the two
* points from the previous page, except that the first point is blue and the
* second green:
*
* It is an error to provide more than one set of data for any attribute, or to
* mismatch the size of the initial data with the number of vertices specified
* in the first argument.
*
* @{
*/
/**
* Maximum number of attributes per vertex
*
* @private
*/
#define MAX_VERTEX_ATTRIBUTE 16
/**
* Generic vertex attribute.
*/
typedef struct vertex_attribute_t
{
/**
* atribute name
*/
GLchar * name;
/**
* index of the generic vertex attribute to be modified.
*/
GLuint index;
/**
* Number of components per generic vertex attribute.
*
* Must be 1, 2, 3, or 4. The initial value is 4.
*/
GLint size;
/**
* data type of each component in the array.
*
* Symbolic constants GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,
* GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT, or GL_DOUBLE are
* accepted. The initial value is GL_FLOAT.
*/
GLenum type;
/**
* whether fixed-point data values should be normalized (GL_TRUE) or
* converted directly as fixed-point values (GL_FALSE) when they are
* accessed.
*/
GLboolean normalized;
/**
* byte offset between consecutive generic vertex attributes.
*
* If stride is 0, the generic vertex attributes are understood to be
* tightly packed in the array. The initial value is 0.
*/
GLsizei stride;
/**
* pointer to the first component of the first attribute element in the
* array.
*/
GLvoid * pointer;
/**
* pointer to the function that enable this attribute.
*/
void ( * enable )(void *);
} vertex_attribute_t;
/**
* Create an attribute from the given parameters.
*
* @param size number of component
* @param type data type
* @param normalized Whether fixed-point data values should be normalized
(GL_TRUE) or converted directly as fixed-point values
(GL_FALSE) when they are accessed.
* @param stride byte offset between consecutive attributes.
* @param pointer pointer to the first component of the first attribute
* element in the array.
* @return a new initialized vertex attribute.
*
* @private
*/
vertex_attribute_t *
vertex_attribute_new( GLchar * name,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
GLvoid *pointer );
/**
* Delete a vertex attribute.
*
* @param self a vertex attribute
*
*/
void
vertex_attribute_delete( vertex_attribute_t * self );
/**
* Create an attribute from the given description.
*
* @param format Format string specifies the format of a vertex attribute.
* @return an initialized vertex attribute
*
* @private
*/
vertex_attribute_t *
vertex_attribute_parse( char *format );
/**
* Enable a vertex attribute.
*
* @param attr a vertex attribute
*
* @private
*/
void
vertex_attribute_enable( vertex_attribute_t *attr );
/** @} */
#ifdef __cplusplus
}
}
#endif
#endif /* __VERTEX_ATTRIBUTE_H__ */