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
|
#include "mmscene.h"
#include "glpoint.h"
#include "glcolorrgba.h"
MMScene::MMScene(QQuickItem *parent)
: GLItem(parent)
{
// Initialize with NULL
m_cube = NULL;
m_vertexShaderFilename = ":/shaders/vshader.vsh";
m_eye = 20.0 * v_XYZ;
m_lightingEnabled = true;
m_colorArrayEnabled = false;
}
MMScene::~MMScene()
{
if (m_cube != NULL)
{
delete m_cube;
m_cube = NULL;
}
}
void MMScene::paintUnderQmlScene()
{
m_renderer->pushMvMatrix();
// drawAxes(2.5);
drawTriangles();
m_renderer->popMvMatrix();
}
void MMScene::paintOnTopOfQmlScene()
{
m_renderer->pushMvMatrix();
drawAxes(10.0);
//drawTriangles();
//drawF(5.0);
m_cube->draw(m_renderer);
m_renderer->popMvMatrix();
}
void MMScene::setupGeometry()
{
createCube(QVector3D(0.0, 0.0, 0.0), QVector3D(1.0, 1.0, 1.0));
//createF(5.0);
//m_colorArrayEnabled = true;
m_geometryIsValid = true;
}
void MMScene::drawTriangles()
{
renderer()->setLightingEnabled(m_lightingEnabled);
renderer()->setColorArrayEnabled(m_colorArrayEnabled);
renderer()->setTextureEnabled(false);
//enable required arrays
int stride = sizeof(GLPoint);
renderer()->activateAttributeArray(GLESRenderer::VERTEX_LOCATION,
m_points[0].vertexPointer(), stride);
renderer()->activateAttributeArray(GLESRenderer::NORMAL_LOCATION,
m_points[0].normalPointer(), stride);
renderer()->activateAttributeArray(GLESRenderer::TEXCOORD_LOCATION,
m_points[0].texCoordPointer(), stride);
renderer()->activateAttributeArray(GLESRenderer::COLOR_LOCATION,
m_points[0].colorPointer(), stride);
glDrawArrays(GL_TRIANGLES, 0, 36);
renderer()->disableAttributeArrays();
}
void MMScene::createCube(const QVector3D &lbb, const QVector3D &rtf)
{
m_cube = new GLCube();
m_cube->setDrawingMode(GL_TRIANGLES);
m_cube->makeSurface(&m_points, &m_indices);
}
void MMScene::createF(double height)
{
float stdLength = height / 5.0;
createCube(QVector3D(0.0, 0.0, 0.0), QVector3D(stdLength, height, stdLength));
createCube(QVector3D(stdLength, height, 0.0), QVector3D(3.0 * stdLength,
height - 1.0 * stdLength, stdLength));
createCube(QVector3D(stdLength, height - 2.0 * stdLength, 0.0),
QVector3D(2.0 * stdLength, height - 3.0 * stdLength, stdLength));
}
void MMScene::drawF(double height)
{
m_renderer->pushMvMatrix(); // Pretransform for height
m_renderer->scale(QVector3D(height / 5.0, height / 5.0, height / 5.0));
m_renderer->pushMvMatrix();
m_renderer->scale(QVector3D(1.0, 5.0, 1.0));
drawTriangles();
m_renderer->popMvMatrix();
m_renderer->pushMvMatrix();
m_renderer->translate(QVector3D(1.0, 4.0, 0.0));
m_renderer->scale(QVector3D(2.0, 1.0, 1.0));
drawTriangles();
m_renderer->popMvMatrix();
m_renderer->pushMvMatrix();
m_renderer->translate(QVector3D(1.0, 2.0, 0.0));
drawTriangles();
m_renderer->popMvMatrix();
m_renderer->popMvMatrix(); // Reset height transformation
}
|