]> git.tdb.fi Git - libs/gl.git/blob - source/core/vertexarray.cpp
30bc9bcc6588ae9233fe7491cc30f49dcf403124
[libs/gl.git] / source / core / vertexarray.cpp
1 #include "error.h"
2 #include "vertexarray.h"
3
4 using namespace std;
5
6 namespace Msp {
7 namespace GL {
8
9 VertexArray::VertexArray():
10         stride(0)
11 { }
12
13 VertexArray::VertexArray(const VertexFormat &f)
14 {
15         set_format(f);
16 }
17
18 void VertexArray::set_format(const VertexFormat &f)
19 {
20         if(!format.empty())
21                 throw invalid_operation("VertexArray::set_format");
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         if(format.empty())
34                 throw invalid_operation("VertexArray::reserve");
35         data.reserve(n*stride);
36 }
37
38 char *VertexArray::append()
39 {
40         if(format.empty())
41                 throw invalid_operation("VertexArray::append");
42         data.insert(data.end(), stride, 0.0f);
43         update_offset();
44         dirty = true;
45         return &*(data.end()-stride);
46 }
47
48 char *VertexArray::modify(unsigned i)
49 {
50         if(format.empty())
51                 throw invalid_operation("VertexArray::modify");
52         dirty = true;
53         return &data[0]+i*stride;
54 }
55
56 unsigned VertexArray::get_data_size() const
57 {
58         return data.size();
59 }
60
61
62 VertexArray::Loader::Loader(VertexArray &a):
63         VertexArrayBuilder(a)
64 {
65         add("vertex", static_cast<void (Loader::*)(float, float)>(&Loader::vertex));
66         add("vertex", static_cast<void (Loader::*)(float, float, float)>(&Loader::vertex));
67         add("vertex", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::vertex));
68         add("normal", static_cast<void (Loader::*)(float, float, float)>(&Loader::normal));
69         add("tangent", static_cast<void (Loader::*)(float, float, float)>(&Loader::tangent));
70         add("texcoord", static_cast<void (Loader::*)(float)>(&Loader::texcoord));
71         add("texcoord", static_cast<void (Loader::*)(float, float)>(&Loader::texcoord));
72         add("texcoord", static_cast<void (Loader::*)(float, float, float)>(&Loader::texcoord));
73         add("texcoord", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::texcoord));
74         add("multitexcoord", static_cast<void (Loader::*)(unsigned, float)>(&Loader::multitexcoord));
75         add("multitexcoord", static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::multitexcoord));
76         add("multitexcoord", static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::multitexcoord));
77         add("multitexcoord", static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::multitexcoord));
78         add("color", static_cast<void (Loader::*)(float, float, float)>(&Loader::color));
79         add("color", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::color));
80         add("generic", static_cast<void (Loader::*)(unsigned, float)>(&Loader::generic));
81         add("generic", static_cast<void (Loader::*)(unsigned, float, float)>(&Loader::generic));
82         add("generic", static_cast<void (Loader::*)(unsigned, float, float, float)>(&Loader::generic));
83         add("generic", static_cast<void (Loader::*)(unsigned, float, float, float, float)>(&Loader::generic));
84         add("group", static_cast<void (Loader::*)(int)>(&Loader::group));
85         add("group", static_cast<void (Loader::*)(int, int)>(&Loader::group));
86         add("group", static_cast<void (Loader::*)(int, int, int)>(&Loader::group));
87         add("group", static_cast<void (Loader::*)(int, int, int, int)>(&Loader::group));
88         add("weight", static_cast<void (Loader::*)(float)>(&Loader::weight));
89         add("weight", static_cast<void (Loader::*)(float, float)>(&Loader::weight));
90         add("weight", static_cast<void (Loader::*)(float, float, float)>(&Loader::weight));
91         add("weight", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::weight));
92 }
93
94 } // namespace GL
95 } // namespace Msp