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