]> git.tdb.fi Git - libs/gl.git/blob - source/core/vertexarray.cpp
712e76e6011c2ce8aec1e70668d4e8f0ec76f21b
[libs/gl.git] / source / core / vertexarray.cpp
1 #include <msp/gl/extensions/arb_multitexture.h>
2 #include <msp/gl/extensions/arb_vertex_shader.h>
3 #include "buffer.h"
4 #include "error.h"
5 #include "gl.h"
6 #include "mesh.h"
7 #include "vertexarray.h"
8
9 using namespace std;
10
11 namespace Msp {
12 namespace GL {
13
14 VertexArray::VertexArray(const VertexFormat &f)
15 {
16         reset(f);
17 }
18
19 void VertexArray::reset(const VertexFormat &f)
20 {
21         clear();
22         format = f;
23         stride = format.stride();
24 }
25
26 void VertexArray::clear()
27 {
28         data.clear();
29 }
30
31 void VertexArray::reserve(unsigned n)
32 {
33         data.reserve(n*stride);
34 }
35
36 float *VertexArray::append()
37 {
38         data.insert(data.end(), stride, 0.0f);
39         update_offset();
40         dirty = true;
41         return &*(data.end()-stride);
42 }
43
44 float *VertexArray::modify(unsigned i)
45 {
46         dirty = true;
47         return &data[0]+i*stride;
48 }
49
50 unsigned VertexArray::get_data_size() const
51 {
52         return data.size()*sizeof(float);
53 }
54
55
56 VertexArray::Loader::Loader(VertexArray &a):
57         VertexArrayBuilder(a)
58 {
59         add("vertex", static_cast<void (Loader::*)(float, float)>(&Loader::vertex));
60         add("vertex", static_cast<void (Loader::*)(float, float, float)>(&Loader::vertex));
61         add("vertex", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::vertex));
62         add("normal", static_cast<void (Loader::*)(float, float, float)>(&Loader::normal));
63         add("texcoord", static_cast<void (Loader::*)(float)>(&Loader::texcoord));
64         add("texcoord", static_cast<void (Loader::*)(float, float)>(&Loader::texcoord));
65         add("texcoord", static_cast<void (Loader::*)(float, float, float)>(&Loader::texcoord));
66         add("texcoord", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::texcoord));
67         add("multitexcoord", static_cast<void (Loader::*)(unsigned, float)>(&Loader::multitexcoord));
68         add("multitexcoord", static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::multitexcoord));
69         add("multitexcoord", static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::multitexcoord));
70         add("multitexcoord", static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::multitexcoord));
71         add("color", static_cast<void (Loader::*)(float, float, float)>(&Loader::color));
72         add("color", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::color));
73         add("generic", static_cast<void (Loader::*)(unsigned, float)>(&Loader::generic));
74         add("generic", static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::generic));
75         add("generic", static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::generic));
76         add("generic", static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::generic));
77         add("tangent", static_cast<void (Loader::*)(float, float, float)>(&Loader::tangent));
78         add("binormal", static_cast<void (Loader::*)(float, float, float)>(&Loader::binormal));
79
80         add("vertex2",   static_cast<void (Loader::*)(float, float)>(&Loader::vertex));
81         add("vertex3",   static_cast<void (Loader::*)(float, float, float)>(&Loader::vertex));
82         add("vertex4",   static_cast<void (Loader::*)(float, float, float, float)>(&Loader::vertex));
83         add("normal3",   static_cast<void (Loader::*)(float, float, float)>(&Loader::normal));
84         add("texcoord1", static_cast<void (Loader::*)(float)>(&Loader::texcoord));
85         add("texcoord2", static_cast<void (Loader::*)(float, float)>(&Loader::texcoord));
86         add("texcoord3", static_cast<void (Loader::*)(float, float, float)>(&Loader::texcoord));
87         add("texcoord4", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::texcoord));
88         add("multitexcoord1", static_cast<void (Loader::*)(unsigned, float)>(&Loader::multitexcoord));
89         add("multitexcoord2", static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::multitexcoord));
90         add("multitexcoord3", static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::multitexcoord));
91         add("multitexcoord4", static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::multitexcoord));
92         add("color3",    static_cast<void (Loader::*)(float, float, float)>(&Loader::color));
93         add("color4",    static_cast<void (Loader::*)(float, float, float, float)>(&Loader::color));
94         add("generic1",  static_cast<void (Loader::*)(unsigned, float)>(&Loader::generic));
95         add("generic2",  static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::generic));
96         add("generic3",  static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::generic));
97         add("generic4",  static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::generic));
98         add("tangent3",  static_cast<void (Loader::*)(float, float, float)>(&Loader::tangent));
99         add("binormal3", static_cast<void (Loader::*)(float, float, float)>(&Loader::binormal));
100 }
101
102 } // namespace GL
103 } // namespace Msp