X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexformat.h;h=4c343c99e60f2def0d13571213d71da5ddef132b;hb=8e9d872c2ba8dc633d29a673ba93adf38d262a5c;hp=3a0eb718f5a5937b1dcca4e5b786f241bdf8ff45;hpb=85facfb688035b5bbc9a3a87d080582fbf34930b;p=libs%2Fgl.git diff --git a/source/vertexformat.h b/source/vertexformat.h index 3a0eb718..4c343c99 100644 --- a/source/vertexformat.h +++ b/source/vertexformat.h @@ -1,38 +1,75 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_GL_VERTEXFORMAT_H_ #define MSP_GL_VERTEXFORMAT_H_ -#include -#include "types.h" +#include namespace Msp { namespace GL { -enum VertexFormat +/** A single vertex component. Nvidia drivers have aliasing between the +fixed-functions and generic vertex attributes, despite the standard not +allowing it. We use the same attribute indices here to avoid problems. */ +enum VertexComponent { - NODATA=0, - VERTEX2=1, + VERTEX2 = 1, VERTEX3, VERTEX4, - NORMAL3=6, - TEXCOORD1=8, + NORMAL3 = 10, + COLOR4_UBYTE = 12, + COLOR3_FLOAT = 14, + COLOR4_FLOAT, + TANGENT3 = 18, + BINORMAL3 = 22, + TEXCOORD1 = 32, TEXCOORD2, TEXCOORD3, TEXCOORD4, - COLOR4_UBYTE=12, - COLOR3_FLOAT=14, - COLOR4_FLOAT, + ATTRIB1 = 64, + ATTRIB2, + ATTRIB3, + ATTRIB4 +}; + +class VertexFormat +{ +private: + unsigned char *data; + +public: + VertexFormat(); + VertexFormat(VertexComponent); + VertexFormat(const VertexFormat &); + VertexFormat &operator=(const VertexFormat &); + ~VertexFormat(); + + VertexFormat operator,(VertexComponent c) const; + VertexFormat operator,(unsigned i) const; + + bool empty() const { return !data || !data[0]; } + const unsigned char *begin() const { return data ? data+1 : 0; } + const unsigned char *end() const { return data ? data+1+data[0] : 0; } + unsigned stride() const; + int offset(VertexComponent) const; }; -inline VertexFormat operator,(VertexFormat a, VertexFormat b) { return VertexFormat(a<<4 | b); } -uint get_stride(VertexFormat); -std::istream &operator>>(std::istream &, VertexFormat &); +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