-
Notifications
You must be signed in to change notification settings - Fork 5
/
FurGeometry.cc
97 lines (81 loc) · 2.32 KB
/
FurGeometry.cc
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
#include "FurGeometry.h"
using namespace std;
GLuint FurGeometry::initVao(GLuint buffer, ShaderProgram prog) {
GLint posAttribute = prog.getAttribute("pos");
GLint textureAttribute = prog.getAttribute("texCoord");
GLint layerAttribute = prog.getAttribute("layer");
//GLint normAttribute = prog.getAttribute("norm");
// Initialize vertex array.
GLuint array;
glGenVertexArrays(1, &array);
glBindVertexArray(array);
// Configure attributes.
glBindBuffer(GL_ARRAY_BUFFER, array);
glVertexAttribPointer(
posAttribute,
3,
GL_FLOAT,
GL_FALSE,
sizeof(struct FurAttributes),
(void*)offsetof(struct FurAttributes, xyzPosition)
);
glEnableVertexAttribArray(posAttribute);
/*
glVertexAttribPointer(
normAttribute,
3,
GL_FLOAT,
GL_FALSE,
sizeof(struct FurAttributes),
(void*)offsetof(struct FurAttributes, xyzNormal)
);
glEnableVertexAttribArray(normAttribute);
*/
glVertexAttribPointer(
textureAttribute,
2,
GL_FLOAT,
GL_FALSE,
sizeof(struct FurAttributes),
(void*)offsetof(struct FurAttributes, uvTexCoord)
);
glEnableVertexAttribArray(textureAttribute);
glVertexAttribPointer(
layerAttribute,
1,
GL_FLOAT,
GL_FALSE,
sizeof(struct FurAttributes),
(void*)offsetof(struct FurAttributes, layer)
);
glEnableVertexAttribArray(layerAttribute);
// Rebind the default state.
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
return array;
}
FurGeometry::FurGeometry(vector<FurAttributes>& geom, ShaderProgram& prog,
int layers, int maxHairLength) {
vector<FurAttributes> newGeom;
for (int i = 0; i < layers; i++) {
float layer = (float)i/(float)(layers - 1);
float layerHairLength = maxHairLength * layer;
for (FurAttributes f : geom) {
f.xyzPosition = f.xyzPosition + f.xyzNormal * layerHairLength;
f.layer = layer;
newGeom.push_back(f);
}
}
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(struct FurAttributes) * newGeom.size(),
newGeom.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
_vao = initVao(buffer, prog);
_indices = newGeom.size();
}
void FurGeometry::draw() const {
glBindVertexArray(_vao);
glDrawArrays(GL_TRIANGLES, 0, _indices);
}