protected:
Matrix mtx;
- Vector3 nor;
- Color col;
- std::map<unsigned, Vector4> texc;
- std::map<unsigned, Vector4> attr;
+ std::vector<Vector4> attr;
public:
- VertexBuilder(): nor(0, 0, 1) { }
+ VertexBuilder() { normal(0, 0, 1); }
virtual ~VertexBuilder() { }
virtual void vertex_(const Vector4 &) = 0;
public:
+ void attrib(unsigned i, const Vector4 &v)
+ {
+ if(i>=attr.size())
+ attr.resize(i+1);
+ attr[i] = v;
+ }
+
void normal(float x, float y, float z)
{ normal(Vector3(x, y, z)); }
void normal(const Vector3 &n)
- {
- Vector4 tn = mtx*Vector4(n.x, n.y, n.z, 0);
- nor = Vector3(tn.x, tn.y, tn.z);
- }
+ { attrib(get_attribute_semantic(NORMAL3), mtx*Vector4(n.x, n.y, n.z, 0)); }
void tangent(float x, float y, float z)
{ tangent(Vector3(x, y, z)); }
void tangent(const Vector3 &t)
- {
- Vector4 tt = mtx*Vector4(t.x, t.y, t.z, 0);
- attrib(get_component_type(TANGENT3), tt);
- }
-
- void binormal(float x, float y, float z)
- { binormal(Vector3(x, y, z)); }
-
- void binormal(const Vector3 &b)
- {
- Vector4 tb = mtx*Vector4(b.x, b.y, b.z, 0);
- attrib(get_component_type(BINORMAL3), tb);
- }
+ { attrib(get_attribute_semantic(TANGENT3), mtx*Vector4(t.x, t.y, t.z, 0)); }
void texcoord(float s)
{ texcoord(s, 0, 0, 1); }
{ multitexcoord(i, Vector4(s, t, r, q)); }
void multitexcoord(unsigned i, const Vector4 &t)
- { texc[i] = t; }
+ { attrib(get_attribute_semantic(TEXCOORD4)+i, t); }
void color(unsigned char r, unsigned char g, unsigned char b)
{ color(r, g, b, 255); }
{ color(Color(r, g, b, a)); }
void color(const Color &c)
- { col = c; }
+ { attrib(get_attribute_semantic(COLOR4), Vector4(c.r, c.g, c.b, c.a)); }
+
+ void group(int g0)
+ { group(g0, 0, 0, 0); }
+
+ void group(int g0, int g1)
+ { group(g0, g1, 0, 0); }
+
+ void group(int g0, int g1, int g2)
+ { group(g0, g1, g2, 0); }
+
+ void group(int g0, int g1, int g2, int g3)
+ { attrib(get_attribute_semantic(GROUP4), Vector4(g0, g1, g2, g3)); }
+
+ void weight(float w0)
+ { weight(w0, 0, 0, 0); }
+
+ void weight(float w0, float w1)
+ { weight(w0, w1, 0, 0); }
+
+ void weight(float w0, float w1, float w2)
+ { weight(w0, w1, w2, 0); }
+
+ void weight(float w0, float w1, float w2, float w3)
+ { attrib(get_attribute_semantic(WEIGHT4), Vector4(w0, w1, w2, w3)); }
- void attrib(unsigned i, float x)
- { attrib(i, x, 0, 0, 1); }
+ void generic(unsigned i, float x)
+ { generic(i, x, 0, 0, 1); }
- void attrib(unsigned i, float x, float y)
- { attrib(i, x, y, 0, 1); }
+ void generic(unsigned i, float x, float y)
+ { generic(i, x, y, 0, 1); }
- void attrib(unsigned i, float x, float y, float z)
- { attrib(i, x, y, z, 1); }
+ void generic(unsigned i, float x, float y, float z)
+ { generic(i, x, y, z, 1); }
- void attrib(unsigned i, float x, float y, float z, float w)
- { attrib(i, Vector4(x, y, z, w)); }
+ void generic(unsigned i, float x, float y, float z, float w)
+ { generic(i, Vector4(x, y, z, w)); }
- void attrib(unsigned i, const Vector4 &a)
- { attr[i] = a; }
+ void generic(unsigned i, const Vector4 &a)
+ { attrib(get_attribute_semantic(GENERIC4)+i, a); }
};
} // namespace GL