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
| #include "viewer.h"
#include <QQuickWindow>
#include <QOpenGLFunctions>
#include <QOpenGLContext>
#include <iostream>
// Most of the following code is inspired from
// <http://qt-project.org/doc/qt-5/qtquick-scenegraph-openglunderqml-example.html>
Viewer::Viewer(QQuickItem *parent) :
QQuickItem(parent),
mutable_members(),
copied_members(mutable_members),
vbufferOIdx(0),
{
//Cette ligne foire avec une segmentation fault.
//Faire un héritage n'a guère plus de succès, il signale juste que qu'une assertion foire*: context in file opengl/qopenglfunctions.cpp
QOpenGLFunctions* const glfcts = window()->openglContext()->functions();
glfcts->glGenBuffers(1, &vbufferOIdx);
glfcts->glBindBuffer(GL_ARRAY_BUFFER, vbufferOIdx);
glfcts->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); //done by above line
glfcts->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glfcts->glEnableVertexAttribArray(vbufferOIdx);
connect( this, SIGNAL(windowChanged(QQuickWindow*)), this, SLOT(on_windowChanged(QQuickWindow*)) );
}
Viewer::~Viewer()
{
QOpenGLFunctions* const glfcts = window()->openglContext()->functions();
glfcts->glDeleteBuffers(1, &vbufferOIdx);
}
void Viewer::on_windowChanged(QQuickWindow *self)
{
if(self)
{
connect( self, SIGNAL(beforeSynchronazing()), this, SLOT(prerender()), Qt::DirectConnection );
connect( self, SIGNAL(beforeRendering()), this, SLOT(render()), Qt::DirectConnection );
self->setClearBeforeRendering(false);
}
}
void Viewer::prerender()
{
copied_members = mutable_members;
}
void Viewer::render()
{
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
}
void Viewer::cleanRender()
{
//nothing to do so far
}
void Viewer::setT(qreal t)
{
if (t == mutable_members.t)
return;
mutable_members.t = t;
emit tChanged();
if (window())
window()->update();
} |
Partager