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