X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fvertexformat.h;fp=source%2Fcore%2Fvertexformat.h;h=3561292245fc640deb2859629cbf8f39c1776e5b;hp=0000000000000000000000000000000000000000;hb=7aaec9a70b8d7733429bec043f8e33e02956f266;hpb=bec07999d95b76f4b47cffcc564d0cd0afc0435e diff --git a/source/core/vertexformat.h b/source/core/vertexformat.h new file mode 100644 index 00000000..35612922 --- /dev/null +++ b/source/core/vertexformat.h @@ -0,0 +1,79 @@ +#ifndef MSP_GL_VERTEXFORMAT_H_ +#define MSP_GL_VERTEXFORMAT_H_ + +#include + +namespace Msp { +namespace GL { + +/** A single vertex component. Symbolic names are provided for commonly used +attributes. These are aliased with with generic attributes, so be careful when +picking your attribute indices. */ +enum VertexComponent +{ + VERTEX2 = 1, + VERTEX3, + VERTEX4, + NORMAL3 = 10, + COLOR4_UBYTE = 12, + COLOR3_FLOAT = 14, + COLOR4_FLOAT, + TANGENT3 = 18, + BINORMAL3 = 22, + TEXCOORD1 = 32, + TEXCOORD2, + TEXCOORD3, + TEXCOORD4, + ATTRIB1 = 64, + ATTRIB2, + ATTRIB3, + ATTRIB4 +}; + +class VertexFormat +{ +private: + enum { MAX_COMPONENTS = 15 }; + + unsigned char count; + unsigned char components[MAX_COMPONENTS]; + +public: + VertexFormat(); + VertexFormat(VertexComponent); + + VertexFormat operator,(VertexComponent c) const; + VertexFormat operator,(unsigned i) const; + bool operator==(const VertexFormat &) const; + bool operator!=(const VertexFormat &other) const { return !(*this==other); } + + bool empty() const { return !count; } + const unsigned char *begin() const { return components; } + const unsigned char *end() const { return components+count; } + unsigned stride() const; + int offset(VertexComponent) const; +}; + +inline VertexFormat operator,(VertexComponent c1, VertexComponent c2) +{ return (VertexFormat(c1), c2); } + +inline VertexFormat operator,(VertexComponent c, unsigned i) +{ return (VertexFormat(c), i); } + +VertexComponent make_indexed_component(VertexComponent, unsigned); + +inline unsigned get_component_type(unsigned char c) +{ return c>>2; } + +inline unsigned get_component_size(unsigned char c) +{ return (c&3)+1; } + +inline unsigned get_stride(const VertexFormat &f) +{ return f.stride(); } + +void operator>>(const LexicalConverter &, VertexComponent &); + +} // namespace GL +} // namespace Msp + +#endif