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
|
#include "glcone.h"
GLCone::GLCone(QVector3D lowerMiddlePoint, double lowerRadius, double upperRadius, double height,
int sides, GLColorRgba color, QString textureFile)
: GLDisc(lowerRadius, height, lowerMiddlePoint, sides, color, textureFile)
{
m_height = height;
m_sides = sides;
m_center = v_Z * 0.5 * m_height;
m_circleRadius = lowerRadius;
m_upperCircleRadius = upperRadius;
m_lowerMiddlePoint = lowerMiddlePoint;
}
void GLCone::makeSurface(QVector<GLPoint> *pointContainer,
QVector<GLshort> *indexContainer)
{
GLBody::makeSurface(pointContainer, indexContainer);
m_firstPoint = m_points->size();
m_points->append(GLPoint(v_Zero, -v_Z, QVector3D(0.5, 0.5, 0.0), m_color));
for (int side = 0; side < m_sides; side++)
{
QVector3D tmp = calculatePoint(side * 2 * M_PI / m_sides);
QVector3D tmpTextCoo = (0.5 * tmp) + QVector3D(0.5, 0.5, 0.0);
QVector3D topBarrel = QVector3D(m_upperCircleRadius * tmp .x(), m_upperCircleRadius * tmp .y(), m_height);
QVector3D bottomBarrel = m_circleRadius * tmp;
QVector3D tangent = QVector3D::crossProduct(bottomBarrel, v_Z);
QVector3D barrelVector = topBarrel - bottomBarrel;
QVector3D barrelNormal = QVector3D::crossProduct(barrelVector, tangent);
m_points->append(GLPoint(bottomBarrel, -v_Z, tmpTextCoo, m_color));
m_points->append(GLPoint(bottomBarrel, barrelNormal, tmpTextCoo, m_color));
m_points->append(GLPoint(topBarrel, barrelNormal,
tmpTextCoo, m_color));
m_points->append(GLPoint(topBarrel, v_Z,
tmpTextCoo, m_color));
}
m_points->append(GLPoint(m_height * v_Z, v_Z, QVector3D(0.5, 0.5, 0.0),
m_color));
m_nextPoint = m_points->size();
m_firstIndex = m_indices->size();
for (int side = 0; side < m_sides - 1; side++)
{
m_indices->append(m_firstPoint);
m_indices->append(m_firstPoint + 1 + 4 * side);
m_indices->append(m_firstPoint + 5 + 4 * side);
m_indices->append(m_firstPoint + 2 + 4 * side);
m_indices->append(m_firstPoint + 6 + 4 * side);
m_indices->append(m_firstPoint + 3 + 4 * side);
m_indices->append(m_firstPoint + 3 + 4 * side);
m_indices->append(m_firstPoint + 7 + 4 * side);
m_indices->append(m_firstPoint + 6 + 4 * side);
m_indices->append(m_firstPoint + 4 + 4 * side);
m_indices->append(m_firstPoint + 8 + 4 * side);
m_indices->append(m_nextPoint - 1);
}
m_indices->append(m_firstPoint);
m_indices->append(m_firstPoint + 1 + 4 * (m_sides - 1));
m_indices->append(m_firstPoint + 1);
m_indices->append(m_firstPoint + 2 + 4 * (m_sides - 1));
m_indices->append(m_firstPoint + 2);
m_indices->append(m_firstPoint + 3 + 4 * (m_sides - 1));
m_indices->append(m_firstPoint + 3 + 4 * (m_sides - 1));
m_indices->append(m_firstPoint + 3);
m_indices->append(m_firstPoint + 2);
m_indices->append(m_firstPoint + 4 + 4 * (m_sides - 1));
m_indices->append(m_firstPoint + 4);
m_indices->append(m_nextPoint - 1);
m_nextIndex = m_indices->size();
}
void GLCone::draw(GLESRenderer *renderer)
{
renderer->pushMvMatrix();
renderer->translate(m_lowerMiddlePoint);
GLBody::draw(renderer);
renderer->popMvMatrix();
}
|