Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Как сместить вниз уже отрисованное в QGLWidget



  • Ситуация! Есть класс QGLWidget. В него приходят массивы байтов. Я их сохраняю в контейнере. Если число элементов в контейнере превысило некое число, то последний элемент удаляется. И потом для каждого массива из контейнера я расчитываю и вершины и цвета:
    Передаю данные в виджет этой функцией
    [code]
    void glwindow::sendSignal(QByteArray &bd) {
    sonoL.prepend(bD); //Поместить пакет в начало контейнера
    updateGL();
    }

    void glwindow::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    int j = 50;
    foreach (QByteArray i, sonoL)
    {
    getVertexSono(i, j);
    getColorSono(i);
    drawSono(); //Функция рисования линии сонограммы
    ++j;
    }
    if (sonoL.count() > this->height()-50)
    sonoL.removeLast(); //Удалять последний
    }

    void glwindow::getVertexSono(QByteArray &bd, int y)
    {
    for (int i=0; i<bd.size(); i++)
    {
    VertexSono[i][0] = i;
    VertexSono[i][1] = y;
    }
    }

    void glwindow::getColorSono(QByteArray &bd)
    {
    for (int i=0; i<bd.size(); i++)
    {
    ColorSono[i][0] = bd.at(i);
    ColorSono[i][1] = bd.at(i);
    ColorSono[i][2] = bd.at(i);
    }
    }
    //Функция рисования
    void glwindow::drawSono() {
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_INT, 0, &VertexSono);
    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, &ColorSono);
    glDrawArrays(GL_LINE_STRIP_ADJACENCY, 0, len_view);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    }
    [/code]
    Т.е. получается некий рисунок - нарисовалась линия, ушла на 1 пиксель вниз, на ее освободившемся месте нарисовалсь новая линия, потом эти две сместились вниз и по новой.
    Каждый раз, как что-то приходит - я расчитываю все координаты вершин и цвета по новой. Дело в том что массивы которые уже отрисовались мне по-хорошему не нужно было-бы перерасчитывать, но нужно сместить уже отрисованные линии по Y вниз. А потом рассчитать новую линию и поместить ее в верх виджета. Как бы мне избавиться от перерасчета для прошлых, уже отрисованных линий? QGLBuffer для этого подойдет?


Log in to reply