]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/vertexformat.h
Rearrange soucre files into subdirectories
[libs/gl.git] / source / core / vertexformat.h
diff --git a/source/core/vertexformat.h b/source/core/vertexformat.h
new file mode 100644 (file)
index 0000000..3561292
--- /dev/null
@@ -0,0 +1,79 @@
+#ifndef MSP_GL_VERTEXFORMAT_H_
+#define MSP_GL_VERTEXFORMAT_H_
+
+#include <msp/strings/lexicalcast.h>
+
+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