View difference between Paste ID: w6dyP8yi and 6vpXev6F
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()
84
{
85
    if (vertices.size() < 2) {
86
        return;
87
    }
88
    updateVertices();
89
    glClearColor(m_clearColor.r, m_clearColor.g, m_clearColor.b, m_clearColor.a);
90
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
91-
    qDebug() << "----------";
91+
92-
    for (int i = 0; i < vertices.size(); i++) {
92+
93-
        qDebug() << "Vertex[" << i << "] = [" << vertices[i].position.x << "," << vertices[i].position.y << "]";
93+
94
    m_vao.release();
95-
    qDebug() << "----------";
95+
96
}
97-
    glPointSize(5.0);
97+
98
void CurveGLWidget::onDrawModeChanged()
99
{
100
101
}
102
103
void CurveGLWidget::mousePressEvent(QMouseEvent* e)
104
{
105
106
    float glX = scale(0, width(), -1, 1, e->x());
107
    float glY = scale(0, height(), -1, 1, e->y());
108
109
    Vertex v;
110
    v.position.x = glX;
111
    v.position.y = glY;
112
    v.color.r    = 1.0f;
113
    v.color.g    = 1.0f;
114
    v.color.b    = 1.0f;
115
    v.color.a    = 1.0f;
116
117
118
    vertices.push_back(v);
119
120
121
122
    updateVertices();
123
124
    update();
125
}
126
127
128
float CurveGLWidget::scale(float domainStart, float domainEnd, float  rangeStart, float rangeEnd, float value)
129
{
130
131
    float rangeInterval  = abs(rangeEnd - rangeStart);
132
    float domainInterval = abs(domainEnd - domainStart);
133
    float u              = (value - domainStart) / domainInterval;
134
135
136
    return rangeStart + u * rangeInterval;
137
}