-
Notifications
You must be signed in to change notification settings - Fork 0
/
wrgvOpslag.h
128 lines (100 loc) · 4.89 KB
/
wrgvOpslag.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#pragma once
#include "helpers.h"
#include <map>
#include <list>
#include <vector>
#include <algorithm>
//GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, and GL_UNSIGNED_INT
template <typename FT> inline GLenum krijgGLType () { return GL_FLOAT; }
template <> inline GLenum krijgGLType<char > () { return GL_BYTE; }
template <> inline GLenum krijgGLType<short > () { return GL_SHORT; }
template <> inline GLenum krijgGLType<uint8_t > () { return GL_UNSIGNED_BYTE; }
template <> inline GLenum krijgGLType<int32_t > () { return GL_INT; }
template <> inline GLenum krijgGLType<uint16_t > () { return GL_UNSIGNED_SHORT; }
template <> inline GLenum krijgGLType<uint32_t > () { return GL_UNSIGNED_INT; }
template <typename FT> inline uint32_t glHappen () { return 4; }
template <> inline uint32_t glHappen< char > () { return 1; }
template <> inline uint32_t glHappen< short > () { return 2; }
template <> inline uint32_t glHappen< uint8_t > () { return 1; }
template <> inline uint32_t glHappen< int32_t > () { return 4; }
template <> inline uint32_t glHappen< uint16_t > () { return 2; }
template <> inline uint32_t glHappen< uint32_t > () { return 4; }
///Bevat de benodigde informatie voor een punt-eigenschap-plek (vertex attribute location) binnen een puntreeks (vertex array)
struct puntEigenschapPlekInfo
{
puntEigenschapPlekInfo(GLuint reeksOpslag = 0, GLuint puntEigenschapPlek = 0, GLuint aantalVelden = 0) :
reeksOpslag (reeksOpslag),
puntEigenschapPlek (puntEigenschapPlek),
aantalVelden (aantalVelden)
{}
GLuint reeksOpslag, puntEigenschapPlek, aantalVelden;
};
///Stap is in het engels ook wel stride, wijzer pointer en plek in dit specifieke geval een Vertrex Attribute Location
struct stapWijzer
{
stapWijzer(GLuint plek = 0, size_t stap = 0, size_t wijzer = 0)
: plek(plek), stap(stap), wijzer(wijzer) {}
GLuint plek;
size_t stap,
wijzer;
};
class wrgvOpslag
{
public:
wrgvOpslag()
{
glCreateVertexArrays(1, &_reeksOpslag);
glErrorToConsole("glCreateVertexArrays: ");
}
GLuint reeksBufferVoorPlek(GLuint plek) { return _plekInfos.at(plek).reeksOpslag; }
template <typename veldType> GLuint reeksOpslagErbij(int aantalVelden, std::vector<veldType> & ggvns, std::vector<stapWijzer> stapWijzers)
{
bindPuntReeks();
GLuint reeksOpslag;
glCreateBuffers( 1, & reeksOpslag);
glBindBuffer( GL_ARRAY_BUFFER, reeksOpslag);
glBufferData( GL_ARRAY_BUFFER, ggvns.size() * glHappen<veldType>(), (void *)ggvns.data(), GL_DYNAMIC_DRAW);
glErrorToConsole("glBufferData: ");
for(const stapWijzer & stapW : stapWijzers)
{
//Volgende werkt onder de aanname dat ik altijd floats gebruik als ik float wil
if(krijgGLType<veldType>() == GL_FLOAT) glVertexAttribPointer( stapW.plek, aantalVelden, krijgGLType<veldType>(), false, stapW.stap * glHappen<veldType>(), (GLvoid *) (stapW.wijzer * glHappen<veldType>()));
else glVertexAttribIPointer( stapW.plek, aantalVelden, krijgGLType<veldType>(), stapW.stap * glHappen<veldType>(), (GLvoid *) (stapW.wijzer * glHappen<veldType>()));
glErrorToConsole("reeksOpslagErbij glVertexAttribPointer: ");
glEnableVertexAttribArray(stapW.plek);
glErrorToConsole("reeksOpslagErbij glEnableVertexAttribArray: ");
_plekInfos[stapW.plek] = puntEigenschapPlekInfo(reeksOpslag, stapW.plek, aantalVelden);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
return reeksOpslag;
}
template <typename veldType> GLuint reeksOpslagErbij(int aantalVelden, std::vector<veldType> & ggvns, GLuint puntEigenschapPlek)
{
return reeksOpslagErbij(aantalVelden, ggvns, { stapWijzer(puntEigenschapPlek) } );
}
template <typename veldType> void koppelNieuweGegevens(int plek, std::vector<veldType> & ggvns)
{
bindPuntReeks();
glErrorToConsole("koppelNieuweGegevens bindPuntReeks: ");
glBindBuffer(GL_ARRAY_BUFFER, _plekInfos[plek].reeksOpslag);
glErrorToConsole("koppelNieuweGegevens glBindBuffer: ");
glBufferData( GL_ARRAY_BUFFER, ggvns.size() * glHappen<veldType>(), (void *)ggvns.data(), GL_DYNAMIC_DRAW);
//Volgende werkt onder de aanname dat ik altijd floats gebruik als ik float wil
if(krijgGLType<veldType>() == GL_FLOAT) glVertexAttribPointer( _plekInfos[plek].puntEigenschapPlek, _plekInfos[plek].aantalVelden, krijgGLType<veldType>(), false, 0, 0);
else glVertexAttribIPointer( _plekInfos[plek].puntEigenschapPlek, _plekInfos[plek].aantalVelden, krijgGLType<veldType>(), 0, 0);
glEnableVertexAttribArray(_plekInfos[plek].puntEigenschapPlek);
glErrorToConsole("koppelNieuweGegevens glBufferData: ");
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
void bindPuntReeks()
{
glBindVertexArray(_reeksOpslag);
glErrorToConsole("wrgvOpslag::bindPuntReeks(): ");
}
private:
/// puntEigenschapPlekken -> puntEigenschapPlekInfo
std::map<GLuint, puntEigenschapPlekInfo> _plekInfos;
GLuint _reeksOpslag;
};