]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/vertexarray.cpp
Rearrange soucre files into subdirectories
[libs/gl.git] / source / core / vertexarray.cpp
diff --git a/source/core/vertexarray.cpp b/source/core/vertexarray.cpp
new file mode 100644 (file)
index 0000000..e3aef7a
--- /dev/null
@@ -0,0 +1,103 @@
+#include <msp/gl/extensions/arb_multitexture.h>
+#include <msp/gl/extensions/arb_vertex_shader.h>
+#include "buffer.h"
+#include "error.h"
+#include "gl.h"
+#include "mesh.h"
+#include "vertexarray.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+VertexArray::VertexArray(const VertexFormat &f)
+{
+       reset(f);
+}
+
+void VertexArray::reset(const VertexFormat &f)
+{
+       clear();
+       format = f;
+       stride = get_stride(format);
+}
+
+void VertexArray::clear()
+{
+       data.clear();
+}
+
+void VertexArray::reserve(unsigned n)
+{
+       data.reserve(n*stride);
+}
+
+float *VertexArray::append()
+{
+       data.insert(data.end(), stride, 0.0f);
+       update_offset();
+       dirty = true;
+       return &*(data.end()-stride);
+}
+
+float *VertexArray::modify(unsigned i)
+{
+       dirty = true;
+       return &data[0]+i*stride;
+}
+
+unsigned VertexArray::get_data_size() const
+{
+       return data.size()*sizeof(float);
+}
+
+
+VertexArray::Loader::Loader(VertexArray &a):
+       VertexArrayBuilder(a)
+{
+       add("vertex", static_cast<void (Loader::*)(float, float)>(&Loader::vertex));
+       add("vertex", static_cast<void (Loader::*)(float, float, float)>(&Loader::vertex));
+       add("vertex", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::vertex));
+       add("normal", static_cast<void (Loader::*)(float, float, float)>(&Loader::normal));
+       add("texcoord", static_cast<void (Loader::*)(float)>(&Loader::texcoord));
+       add("texcoord", static_cast<void (Loader::*)(float, float)>(&Loader::texcoord));
+       add("texcoord", static_cast<void (Loader::*)(float, float, float)>(&Loader::texcoord));
+       add("texcoord", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::texcoord));
+       add("multitexcoord", static_cast<void (Loader::*)(unsigned, float)>(&Loader::multitexcoord));
+       add("multitexcoord", static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::multitexcoord));
+       add("multitexcoord", static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::multitexcoord));
+       add("multitexcoord", static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::multitexcoord));
+       add("color", static_cast<void (Loader::*)(float, float, float)>(&Loader::color));
+       add("color", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::color));
+       add("attrib", static_cast<void (Loader::*)(unsigned, float)>(&Loader::attrib));
+       add("attrib", static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::attrib));
+       add("attrib", static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::attrib));
+       add("attrib", static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::attrib));
+       add("tangent", static_cast<void (Loader::*)(float, float, float)>(&Loader::tangent));
+       add("binormal", static_cast<void (Loader::*)(float, float, float)>(&Loader::binormal));
+
+       add("vertex2",   static_cast<void (Loader::*)(float, float)>(&Loader::vertex));
+       add("vertex3",   static_cast<void (Loader::*)(float, float, float)>(&Loader::vertex));
+       add("vertex4",   static_cast<void (Loader::*)(float, float, float, float)>(&Loader::vertex));
+       add("normal3",   static_cast<void (Loader::*)(float, float, float)>(&Loader::normal));
+       add("texcoord1", static_cast<void (Loader::*)(float)>(&Loader::texcoord));
+       add("texcoord2", static_cast<void (Loader::*)(float, float)>(&Loader::texcoord));
+       add("texcoord3", static_cast<void (Loader::*)(float, float, float)>(&Loader::texcoord));
+       add("texcoord4", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::texcoord));
+       add("multitexcoord1", static_cast<void (Loader::*)(unsigned, float)>(&Loader::multitexcoord));
+       add("multitexcoord2", static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::multitexcoord));
+       add("multitexcoord3", static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::multitexcoord));
+       add("multitexcoord4", static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::multitexcoord));
+       add("color3",    static_cast<void (Loader::*)(float, float, float)>(&Loader::color));
+       add("color4",    static_cast<void (Loader::*)(float, float, float, float)>(&Loader::color));
+       add("attrib1",   static_cast<void (Loader::*)(unsigned, float)>(&Loader::attrib));
+       add("attrib2",   static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::attrib));
+       add("attrib3",   static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::attrib));
+       add("attrib4",   static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::attrib));
+       add("tangent3",  static_cast<void (Loader::*)(float, float, float)>(&Loader::tangent));
+       add("binormal3", static_cast<void (Loader::*)(float, float, float)>(&Loader::binormal));
+}
+
+} // namespace GL
+} // namespace Msp