View difference between Paste ID: 6vpXev6F and 4mwHt93x
SHOW: | | - or go back to the newest paste.
1
#include "curveglwidget.h"
2
3
CurveGLWidget::CurveGLWidget(QWidget* parent):QOpenGLWidget(parent), m_vao(this)
4
{
5
    m_drawMode = GL_LINE_STRIP;
6
}
7
8
CurveGLWidget::~CurveGLWidget()
9
{
10
11
}
12
13
void CurveGLWidget::initializeGL()
14
{
15
    initializeOpenGLFunctions();
16
    loadShaders();
17
    initialize();
18
}
19
20
void CurveGLWidget::initialize()
21
{
22
    m_vao.create();
23
    m_vbo.create();
24
    m_vbo.setUsagePattern(QOpenGLBuffer::StreamDraw);
25
}
26
27
28
void CurveGLWidget::updateVertices()
29
{
30
    m_vao.bind();
31
    m_vbo.bind();
32
33
    m_vbo.allocate(vertices.size() * sizeof(Vertex));
34
    m_vbo.write(0, &vertices.begin(), vertices.size() * sizeof(Vertex));
35
36
    m_program.enableAttributeArray("position");
37
    m_program.setAttributeBuffer("position", GL_FLOAT, 0, 2, sizeof(Vertex));
38
39
    m_program.enableAttributeArray("color");
40
    m_program.setAttributeBuffer("color", GL_FLOAT, sizeof(glm::vec2), 4, sizeof(Vertex));
41
42
    m_vao.release();
43
    m_vbo.release();
44
}
45
46
47
48
void CurveGLWidget::loadShaders()
49
{
50
    if (!m_program.addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSrc)) {
51
        qDebug() << "Error binding vertex shader: " << m_program.log();
52
    }
53
54
    if (!m_program.addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSrc)) {
55
        qDebug() << "Error binding fragment shader: " << m_program.log();
56
    }
57
58
    if (!m_program.link()) {
59
        qDebug() << "Could not link program: " << m_program.log();
60
    }
61
62
    m_program.attributeLocation("position");
63
    m_program.attributeLocation("color");
64
}
65
66
void CurveGLWidget::resizeGL(int w, int h)
67
{
68
    glViewport(0, 0, w, h);
69
}
70
71
void CurveGLWidget::setClearColor(glm::vec4 color)
72
{
73
    m_clearColor = color;
74
    update();
75
}
76
77
void CurveGLWidget::setDrawMode(GLenum mode)
78
{
79
    m_drawMode = mode;
80
    update();
81
}
82
83-
    void CurveGLWidget::paintGL()
83+
void CurveGLWidget::paintGL()
84-
    {
84+
85-
        if (vertices.size() < 2) {
85+
    if (vertices.size() < 2) {
86-
            return;
86+
        return;
87-
        }
87+
88-
        updateVertices();
88+
89-
        glClearColor(m_clearColor.r, m_clearColor.g, m_clearColor.b, m_clearColor.a);
89+
    glClearColor(m_clearColor.r, m_clearColor.g, m_clearColor.b, m_clearColor.a);
90
91-
        qDebug() << "----------";
91+
    qDebug() << "----------";
92-
        for (int i = 0; i < vertices.size(); i++) {
92+
    for (int i = 0; i < vertices.size(); i++) {
93-
            qDebug() << "Vertex[" << i << "] = [" << vertices[i].position.x << "," << vertices[i].position.y << "]";
93+
        qDebug() << "Vertex[" << i << "] = [" << vertices[i].position.x << "," << vertices[i].position.y << "]";
94-
        }
94+
95-
        qDebug() << "----------";
95+
    qDebug() << "----------";
96
97-
        glPointSize(5.0);
97+
    glPointSize(5.0);
98-
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
98+
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
99-
        m_program.bind();
99+
    m_program.bind();
100-
        m_vao.bind();
100+
101-
        glDrawArrays(GL_LINE_STRIP, 0, vertices.size());
101+
    glDrawArrays(GL_LINE_STRIP, 0, vertices.size());
102-
        m_vao.release();
102+
103-
        m_program.release();
103+
    m_program.release();
104
}
105
106
void CurveGLWidget::onDrawModeChanged()
107
{
108
109
}
110
111
void CurveGLWidget::mousePressEvent(QMouseEvent* e)
112
{
113
114
    float glX = scale(0, width(), -1, 1, e->x());
115
    float glY = scale(0, height(), -1, 1, e->y());
116
117
    Vertex v;
118
    v.position.x = glX;
119
    v.position.y = glY;
120
    v.color.r    = 1.0f;
121
    v.color.g    = 1.0f;
122
    v.color.b    = 1.0f;
123
    v.color.a    = 1.0f;
124
125
126
    vertices.push_back(v);
127
128
129
130
    updateVertices();
131
132
    update();
133
}
134
135
136
float CurveGLWidget::scale(float domainStart, float domainEnd, float  rangeStart, float rangeEnd, float value)
137
{
138
139
    float rangeInterval  = abs(rangeEnd - rangeStart);
140
    float domainInterval = abs(domainEnd - domainStart);
141
    float u              = (value - domainStart) / domainInterval;
142
143
144
    return rangeStart + u * rangeInterval;
145
}