summaryrefslogtreecommitdiffstats
path: root/src/mmscene.cpp
blob: 882e7810c9fee8c98b08d0df01fc8964069eb7e3 (plain)
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
}