1
|
#include <Cylinder.h>
|
2
|
|
3
|
CylinderObject::CylinderObject() {
|
4
|
setTransformation(Mat::id());
|
5
|
}
|
6
|
|
7
|
void CylinderObject::setupGeometry(int _steps) {
|
8
|
steps = _steps;
|
9
|
|
10
|
m_lineColorsFromVertices = true;
|
11
|
m_triangleColorsFromVertices = true;
|
12
|
m_quadColorsFromVertices = true;
|
13
|
m_polyColorsFromVertices = true;
|
14
|
|
15
|
m_primitives.clear();
|
16
|
m_vertices.clear();
|
17
|
m_vertexColors.clear();
|
18
|
m_normals.clear();
|
19
|
|
20
|
for( int i = 0; i < steps; i++ ) {
|
21
|
int upper_center_vertex = 0;
|
22
|
int lower_center_vertex = 2*steps+1;
|
23
|
|
24
|
int upper_a_vertex = i*2+1;
|
25
|
int lower_a_vertex = i*2+2;
|
26
|
int upper_b_vertex = i*2+3;
|
27
|
int lower_b_vertex = i*2+4;
|
28
|
|
29
|
int upper_center_normal = 0;
|
30
|
int lower_center_normal = 3*steps+1;
|
31
|
|
32
|
int upper_a_normal = i*3+1;
|
33
|
int lower_a_normal = i*3+2;
|
34
|
int radius_a_normal = i*3+3;
|
35
|
|
36
|
int upper_b_normal = i*3+4;
|
37
|
int lower_b_normal = i*3+5;
|
38
|
int radius_b_normal = i*3+6;
|
39
|
|
40
|
if( i == steps-1 ) {
|
41
|
upper_b_vertex = 1;
|
42
|
lower_b_vertex = 2;
|
43
|
|
44
|
upper_b_normal = 1;
|
45
|
lower_b_normal = 2;
|
46
|
radius_b_normal = 3;
|
47
|
}
|
48
|
|
49
|
addTriangle(upper_center_vertex, upper_a_vertex, upper_b_vertex,
|
50
|
upper_center_normal, upper_a_normal, upper_b_normal,
|
51
|
GeomColor(0,100,200,255));
|
52
|
addLine(upper_a_vertex, upper_b_vertex, GeomColor(0,100,200,255));
|
53
|
|
54
|
addQuad(upper_a_vertex, lower_a_vertex, lower_b_vertex, upper_b_vertex,
|
55
|
radius_a_normal, radius_a_normal, radius_b_normal, radius_b_normal,
|
56
|
GeomColor(0,100,200,255));
|
57
|
addLine(upper_a_vertex, lower_a_vertex, GeomColor(0,100,200,255));
|
58
|
|
59
|
addTriangle(lower_center_vertex, lower_b_vertex, lower_a_vertex,
|
60
|
lower_center_normal, lower_b_normal, lower_a_normal,
|
61
|
GeomColor(0,100,200,255));
|
62
|
addLine(lower_a_vertex, lower_b_vertex, GeomColor(0,100,200,255));
|
63
|
}
|
64
|
|
65
|
m_vertices.resize(2*steps+2, Vec(0.0, 0.0, 0.0, 1.0));
|
66
|
m_vertexColors.resize(2*steps+2, GeomColor(0, 100, 200, 200));
|
67
|
m_normals.resize(3*steps+2, Vec(0.0, 0.0, 0.0, 1.0));
|
68
|
}
|
69
|
|
70
|
void CylinderObject::updateGeometry(float height, float radius, GeomColor color) {
|
71
|
|
72
|
float da = (2*M_PI)/steps;
|
73
|
height = fabs(height);
|
74
|
|
75
|
m_vertices[0][0] = 0.0;
|
76
|
m_vertices[0][1] = 0.0;
|
77
|
m_vertices[0][2] = height/2;
|
78
|
|
79
|
m_vertexColors[0][0] = color[0] / 255.0;
|
80
|
m_vertexColors[0][1] = color[1] / 255.0;
|
81
|
m_vertexColors[0][2] = color[2] / 255.0;
|
82
|
m_vertexColors[0][3] = color[3] / 255.0;
|
83
|
|
84
|
m_normals[0][0] = 0.0;
|
85
|
m_normals[0][1] = 0.0;
|
86
|
m_normals[0][2] = 1.0;
|
87
|
|
88
|
for(int i=0;i<steps;++i){
|
89
|
float a = i*da;
|
90
|
float cx = radius*cos(a);
|
91
|
float cy = radius*sin(a);
|
92
|
|
93
|
m_vertices[i*2+1][0] = cx;
|
94
|
m_vertices[i*2+1][1] = cy;
|
95
|
m_vertices[i*2+1][2] = height/2;
|
96
|
|
97
|
m_vertices[i*2+2][0] = cx;
|
98
|
m_vertices[i*2+2][1] = cy;
|
99
|
m_vertices[i*2+2][2] = -height/2;
|
100
|
|
101
|
m_vertexColors[i*2+1][0] = color[0] / 255.0;
|
102
|
m_vertexColors[i*2+1][1] = color[1] / 255.0;
|
103
|
m_vertexColors[i*2+1][2] = color[2] / 255.0;
|
104
|
m_vertexColors[i*2+1][3] = color[3] / 255.0;
|
105
|
|
106
|
m_vertexColors[i*2+2][0] = color[0] / 255.0;
|
107
|
m_vertexColors[i*2+2][1] = color[1] / 255.0;
|
108
|
m_vertexColors[i*2+2][2] = color[2] / 255.0;
|
109
|
m_vertexColors[i*2+2][3] = color[3] / 255.0;
|
110
|
|
111
|
m_normals[i*3+1][0] = 0.0;
|
112
|
m_normals[i*3+1][1] = 0.0;
|
113
|
m_normals[i*3+1][2] = 1.0;
|
114
|
|
115
|
m_normals[i*3+2][0] = 0.0;
|
116
|
m_normals[i*3+2][1] = 0.0;
|
117
|
m_normals[i*3+2][2] = -1.0;
|
118
|
|
119
|
m_normals[i*3+3][0] = cx / sqrt(cx*cx + cy*cy);
|
120
|
m_normals[i*3+3][1] = cy / sqrt(cx*cx + cy*cy);
|
121
|
m_normals[i*3+3][2] = 0.0;
|
122
|
m_normals[i*3+3][3] = 1.0;
|
123
|
}
|
124
|
|
125
|
m_vertices[2*steps+1][0] = 0.0;
|
126
|
m_vertices[2*steps+1][1] = 0.0;
|
127
|
m_vertices[2*steps+1][2] = -height/2;
|
128
|
|
129
|
m_vertexColors[2*steps+1][0] = color[0] / 255.0;
|
130
|
m_vertexColors[2*steps+1][1] = color[1] / 255.0;
|
131
|
m_vertexColors[2*steps+1][2] = color[2] / 255.0;
|
132
|
m_vertexColors[2*steps+1][3] = color[3] / 255.0;
|
133
|
|
134
|
m_normals[3*steps+1][0] = 0.0;
|
135
|
m_normals[3*steps+1][1] = 0.0;
|
136
|
m_normals[3*steps+1][2] = -1.0;
|
137
|
}
|