1 #ifndef MSP_GL_VERTEXBUILDER_H_
2 #define MSP_GL_VERTEXBUILDER_H_
8 #include "vertexformat.h"
14 Base class for classes that build vertices from a series of function calls.
15 The operating model closely follows that of OpenGL immediate mode: vertex
16 attributes can be specified at any time, and when a vertex() function is
17 called, a vertex is created with the active attribute values.
19 A derived class must overload the 4-argument vertex_() function to process the
20 data. Attributes can be read from protected member variables.
32 PushMatrix(VertexBuilder &b): bld(b), mtx(bld.mtx) { }
33 ~PushMatrix() { bld.mtx = mtx; }
40 std::map<unsigned, Vector4> texc;
41 std::map<unsigned, Vector4> attr;
44 VertexBuilder(): nor(0, 0, 1) { }
46 virtual ~VertexBuilder() { }
48 void set_matrix(const Matrix &m)
51 void transform(const Matrix &m)
54 const Matrix &get_matrix() const
57 void vertex(float x, float y)
58 { vertex(x, y, 0, 1); }
60 void vertex(float x, float y, float z)
61 { vertex(x, y, z, 1); }
63 void vertex(float x, float y, float z, float w)
64 { vertex(Vector4(x, y, z, w)); }
66 void vertex(const Vector3 &v)
67 { vertex(Vector4(v.x, v.y, v.z, 1)); }
69 void vertex(const Vector4 &v)
73 virtual void vertex_(const Vector4 &) = 0;
76 void normal(float x, float y, float z)
77 { normal(Vector3(x, y, z)); }
79 void normal(const Vector3 &n)
81 Vector4 tn = mtx*Vector4(n.x, n.y, n.z, 0);
82 nor = Vector3(tn.x, tn.y, tn.z);
85 void tangent(float x, float y, float z)
86 { tangent(Vector3(x, y, z)); }
88 void tangent(const Vector3 &t)
90 Vector4 tt = mtx*Vector4(t.x, t.y, t.z, 0);
91 attrib(get_component_type(TANGENT3), tt);
94 void binormal(float x, float y, float z)
95 { binormal(Vector3(x, y, z)); }
97 void binormal(const Vector3 &b)
99 Vector4 tb = mtx*Vector4(b.x, b.y, b.z, 0);
100 attrib(get_component_type(BINORMAL3), tb);
103 void texcoord(float s)
104 { texcoord(s, 0, 0, 1); }
106 void texcoord(float s, float t)
107 { texcoord(s, t, 0, 1); }
109 void texcoord(float s, float t, float r)
110 { texcoord(s, t, r, 1); }
112 void texcoord(float s, float t, float r, float q)
113 { texcoord(Vector4(s, t, r, q)); }
115 void texcoord(const Vector4 &t)
116 { multitexcoord(0, t); }
118 void multitexcoord(unsigned i, float s)
119 { multitexcoord(i, s, 0, 0, 1); }
121 void multitexcoord(unsigned i, float s, float t)
122 { multitexcoord(i, s, t, 0, 1); }
124 void multitexcoord(unsigned i, float s, float t, float r)
125 { multitexcoord(i, s, t, r, 1); }
127 void multitexcoord(unsigned i, float s, float t, float r, float q)
128 { multitexcoord(i, Vector4(s, t, r, q)); }
130 void multitexcoord(unsigned i, const Vector4 &t)
133 void color(unsigned char r, unsigned char g, unsigned char b)
134 { color(r, g, b, 255); }
136 void color(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
137 { color(r/255.f, g/255.f, b/255.f, a/255.f); }
139 void color(float r, float g, float b)
140 { color(r, g, b, 1); }
142 void color(float r, float g, float b, float a)
143 { color(Color(r, g, b, a)); }
145 void color(const Color &c)
148 void attrib(unsigned i, float x)
149 { attrib(i, x, 0, 0, 1); }
151 void attrib(unsigned i, float x, float y)
152 { attrib(i, x, y, 0, 1); }
154 void attrib(unsigned i, float x, float y, float z)
155 { attrib(i, x, y, z, 1); }
157 void attrib(unsigned i, float x, float y, float z, float w)
158 { attrib(i, Vector4(x, y, z, w)); }
160 void attrib(unsigned i, const Vector4 &a)