-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007, 2009-2010 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#ifndef MSP_GL_VERTEXBUILDER_H_
#define MSP_GL_VERTEXBUILDER_H_
#include <map>
#include "color.h"
+#include "matrix.h"
#include "vector.h"
+#include "vertexformat.h"
namespace Msp {
namespace GL {
*/
class VertexBuilder
{
+public:
+ class PushMatrix
+ {
+ private:
+ VertexBuilder &bld;
+ Matrix mtx;
+
+ public:
+ PushMatrix(VertexBuilder &b): bld(b), mtx(bld.mtx) { }
+ ~PushMatrix() { bld.mtx = mtx; }
+ };
+
+protected:
+ Matrix mtx;
+ Vector3 nor;
+ Color col;
+ std::map<unsigned, Vector4> texc;
+ std::map<unsigned, Vector4> attr;
+
public:
VertexBuilder(): nor(0, 0, 1) { }
virtual ~VertexBuilder() { }
+ void set_matrix(const Matrix &m)
+ { mtx = m; }
+
+ void transform(const Matrix &m)
+ { mtx *= m; }
+
+ const Matrix &get_matrix() const
+ { return mtx; }
+
void vertex(float x, float y)
{ vertex(x, y, 0, 1); }
{ vertex(x, y, z, 1); }
void vertex(float x, float y, float z, float w)
- { vertex_(x, y, z, w); }
+ { vertex(Vector4(x, y, z, w)); }
+
+ void vertex(const Vector3 &v)
+ { vertex(Vector4(v.x, v.y, v.z, 1)); }
void vertex(const Vector4 &v)
- { vertex(v.x, v.y, v.z, v.w); }
+ { vertex_(mtx*v); }
protected:
- virtual void vertex_(float x, float y, float z, float w) =0;
+ virtual void vertex_(const Vector4 &) = 0;
public:
void normal(float x, float y, float z)
{ normal(Vector3(x, y, z)); }
void normal(const Vector3 &n)
- { nor = n; }
+ {
+ Vector4 tn = mtx*Vector4(n.x, n.y, n.z, 0);
+ nor = Vector3(tn.x, tn.y, tn.z);
+ }
+
+ 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);
+ }
void texcoord(float s)
{ texcoord(s, 0, 0, 1); }
void attrib(unsigned i, const Vector4 &a)
{ attr[i] = a; }
-
-protected:
- Vector3 nor;
- Color col;
- std::map<unsigned, Vector4> texc;
- std::map<unsigned, Vector4> attr;
};
} // namespace GL