Fixed OpenGL

This commit is contained in:
Andrey Tkachenko 2014-07-28 00:04:18 +04:00
parent 826af318d3
commit 9316eff244
15 changed files with 101 additions and 140 deletions

View File

@ -24,8 +24,7 @@ SOURCES += main.cpp \
svobject.cpp \ svobject.cpp \
svpointcloud.cpp \ svpointcloud.cpp \
svkernel.cpp \ svkernel.cpp \
svpointcloudviewer.cpp \ svpointcloudviewer.cpp
svpointcloudrenderer.cpp
HEADERS += \ HEADERS += \
svimage.h \ svimage.h \
@ -40,8 +39,7 @@ HEADERS += \
svpointcloud.h \ svpointcloud.h \
svdefs.h \ svdefs.h \
svkernel.h \ svkernel.h \
svpointcloudviewer.h \ svpointcloudviewer.h
svpointcloudrenderer.h
RESOURCES += \ RESOURCES += \
resource.qrc resource.qrc

View File

@ -152,6 +152,7 @@ ApplicationWindow {
Item { Item {
anchors.fill: parent anchors.fill: parent
SvPointCloudViewer { SvPointCloudViewer {
//pointCloud: pointCloud
anchors.fill: parent anchors.fill: parent
} }
} }

View File

@ -18,7 +18,7 @@ int main(int argc, char *argv[])
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
SvImageProvider imageProvider; SvImageProvider imageProvider;
QImage imgLeft("../CSV/img/right9.png"); QImage imgLeft("../ComputerVision/img/left9.png");
QImage imgRight("../CSV/img/right1.png"); QImage imgRight("../CSV/img/right1.png");
SvImage left(imgLeft); SvImage left(imgLeft);
@ -35,10 +35,10 @@ int main(int argc, char *argv[])
engine.addImageProvider("images", &imageProvider); engine.addImageProvider("images", &imageProvider);
engine.rootContext()->setContextProperty("processor", &proc); engine.rootContext()->setContextProperty("processor", &proc);
engine.rootContext()->setContextProperty("pointCloud", &pointCloud);
engine.load(QUrl(QStringLiteral("qrc:///Main.qml"))); engine.load(QUrl(QStringLiteral("qrc:///Main.qml")));
proc.start(); proc.start();
return a.exec(); return a.exec();
} }

View File

@ -9,6 +9,17 @@ void SvCurve::addPoint(SvPoint *point)
m_points.push_back(point); m_points.push_back(point);
} }
bool SvCurve::hasPoint(SvPoint *point)
{
foreach (SvPoint *item, m_points) {
if (point == item) {
return true;
}
}
return false;
}
SvCurve *SvCurve::cut(SvPoint *point) SvCurve *SvCurve::cut(SvPoint *point)
{ {

View File

@ -23,10 +23,10 @@ private:
public: public:
SvPoint* head() {return m_points.first(); } SvPoint* head() {return m_points.first(); }
SvPoint* tail() {return m_points.last(); } SvPoint* tail() {return m_points.last(); }
SvPoint* tail() {return m_points.last(); }
void setInner(SvFigure *figure) {m_inner = figure; } void setInner(SvFigure *figure) {m_inner = figure; }
void setOuter(SvFigure *figure) {m_outer = figure; } void setOuter(SvFigure *figure) {m_outer = figure; }
void addPoint(SvPoint *point); void addPoint(SvPoint *point);
bool hasPoint(SvPoint *point);
SvCurve *cut(SvPoint *point); SvCurve *cut(SvPoint *point);
}; };

View File

@ -5,7 +5,11 @@ SvFigure::SvFigure(SvCurve *curve)
addCurve(curve); addCurve(curve);
} }
SvCurve *SvFigure::findCurveByPoint() SvFigure::SvFigure()
{
}
SvCurve *SvFigure::findCurveByPoint(SvPoint *point)
{ {
foreach(SvCurve* curve, m_curves) { foreach(SvCurve* curve, m_curves) {
if (curve->hasPoint(point)) { if (curve->hasPoint(point)) {

View File

@ -1,6 +1,8 @@
#ifndef SVFIGURE_H #ifndef SVFIGURE_H
#define SVFIGURE_H #define SVFIGURE_H
#include <QColor>
#include "svpoint.h" #include "svpoint.h"
#include "svcurve.h" #include "svcurve.h"
@ -11,10 +13,11 @@ protected:
QList<SvCurve*> m_curves; QList<SvCurve*> m_curves;
public: public:
SvFigure();
SvFigure(SvCurve *curve); SvFigure(SvCurve *curve);
void addCurve(SvCurve *curve){m_curves.pop_back(curve); } void addCurve(SvCurve *curve){m_curves.push_back(curve); }
SvCurve *findCurveByPoint(); SvCurve *findCurveByPoint(SvPoint *point);
SvFigure split(SvPoint *point); SvFigure split(SvPoint *point);
}; };

View File

@ -91,8 +91,6 @@ void SvKernel::exec(SvPointCloud *pc, SvImage *image, int line)
if (value > 0) { if (value > 0) {
p.setX(x - 1); p.setX(x - 1);
p.setY(line - 1); p.setY(line - 1);
p.setHorizontalValue(value);
p.setVerticalValue(value);
pc->addPoint(p); pc->addPoint(p);
} }

View File

@ -1,61 +0,0 @@
#include "svpointcloudrenderer.h"
SvPointCloudRenderer::SvPointCloudRenderer(QObject *parent) :
QObject(parent)
{
}
void SvPointCloudRenderer::paint()
{
if (!m_program) {
m_program = new QOpenGLShaderProgram();
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute highp vec4 vertices;"
"varying highp vec2 coords;"
"void main() {"
" gl_Position = vertices;"
" coords = vertices.xy;"
"}");
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,
"uniform lowp float t;"
"varying highp vec2 coords;"
"void main() {"
" lowp float i = 1. - (pow(abs(coords.x), 4.) + pow(abs(coords.y), 4.));"
" i = smoothstep(t - 0.8, t + 0.8, i);"
" i = floor(i * 20.) / 20.;"
" gl_FragColor = vec4(coords * .5 + .5, i, i);"
"}");
m_program->bindAttributeLocation("vertices", 0);
m_program->link();
}
m_program->bind();
m_program->enableAttributeArray(0);
float values[] = {
-1, -1,
1, -1,
-1, 1,
1, 1
};
m_program->setAttributeArray(0, GL_FLOAT, values, 2);
m_program->setUniformValue("t", (float) m_t);
glViewport(0, 0, m_viewportSize.width(), m_viewportSize.height());
glDisable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
m_program->disableAttributeArray(0);
m_program->release();
}

View File

@ -1,24 +0,0 @@
#ifndef SVPOINTCLOUDRENDERER_H
#define SVPOINTCLOUDRENDERER_H
#include <QObject>
#include <QtGui/QOpenGLShaderProgram>
#include <QtGui/QOpenGLContext>
class SvPointCloudRenderer : public QObject
{
Q_OBJECT
public:
explicit SvPointCloudRenderer(QObject *parent = 0);
void setViewportSize(const QSize &size) { m_viewportSize = size; }
public slots:
void paint();
private:
QSize m_viewportSize;
qreal m_t;
QOpenGLShaderProgram *m_program;
};
#endif // SVPOINTCLOUDRENDERER_H

View File

@ -1,37 +1,70 @@
#include "svpointcloudviewer.h" #include "svpointcloudviewer.h"
#include <QtGui/QOpenGLShaderProgram>
#include <QtGui/QOpenGLContext>
SvPointCloudViewer::SvPointCloudViewer(QQuickItem *parent) : SvPointCloudViewer::SvPointCloudViewer(QQuickItem *parent) :
QQuickItem(parent) QQuickPaintedItem(parent)
{ {
setRenderTarget(QQuickPaintedItem::FramebufferObject);
} }
void SvPointCloudViewer::handleWindowChanged(QQuickWindow *win) void SvPointCloudViewer::paint(QPainter *painter)
{ {
if (win) { painter->beginNativePainting();
connect(win, &QQuickWindow::beforeSynchronizing,
this, &SvPointCloudViewer::sync, Qt::DirectConnection);
connect(win, &QQuickWindow::sceneGraphInvalidated, if (!m_program) {
this, &SvPointCloudViewer::cleanup, Qt::DirectConnection); m_program = new QOpenGLShaderProgram();
} m_program->addShaderFromSourceCode(QOpenGLShader::Vertex,
} "attribute highp vec4 vertices;"
"varying highp vec2 coords;"
"void main() {"
" gl_Position = vertices;"
" coords = vertices.xy;"
"}");
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,
"uniform lowp float t;"
"varying highp vec2 coords;"
"void main() {"
" lowp float i = 1. - (pow(abs(coords.x), 4.) + pow(abs(coords.y), 4.));"
" i = smoothstep(t - 0.8, t + 0.8, i);"
" i = floor(i * 20.) / 20.;"
" gl_FragColor = vec4(coords * .5 + .5, i, i);"
"}");
m_program->bindAttributeLocation("vertices", 0);
m_program->link();
void SvPointCloudViewer::sync()
{
if (!m_pointCloudRenderer) {
m_pointCloudRenderer = new SvPointCloudRenderer();
connect(window(), &QQuickWindow::beforeRendering,
m_pointCloudRenderer, &SvPointCloudRenderer::paint, Qt::DirectConnection);
} }
m_pointCloudRenderer->setViewportSize(window()->size() * window()->devicePixelRatio()); m_program->bind();
m_program->enableAttributeArray(0);
float values[] = {
-1, -1,
1, -1,
-1, 1,
1, 1
};
m_program->setAttributeArray(0, GL_FLOAT, values, 2);
m_program->setUniformValue("t", (float) 1);
glViewport(0, 0, width(), height());
glDisable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
m_program->disableAttributeArray(0);
m_program->release();
painter->endNativePainting();
} }
void SvPointCloudViewer::cleanup()
{
if (m_pointCloudRenderer) {
delete m_pointCloudRenderer;
m_pointCloudRenderer = 0;
}
}

View File

@ -1,41 +1,45 @@
#ifndef SVPOINTCLOUDVIEWER_H #ifndef SVPOINTCLOUDVIEWER_H
#define SVPOINTCLOUDVIEWER_H #define SVPOINTCLOUDVIEWER_H
#include <QQuickItem> #include <QQuickPaintedItem>
#include <QQuickWindow> #include <QQuickWindow>
#include <QPainter>
#include <QtGui/QOpenGLShaderProgram>
#include <QtGui/QOpenGLContext>
#include "svpointcloud.h" #include "svpointcloud.h"
#include "svpointcloudrenderer.h"
class SvPointCloudViewer : public QQuickItem class SvPointCloudViewer : public QQuickPaintedItem
{ {
Q_OBJECT Q_OBJECT
//Q_PROPERTY(QObject *pointCloud READ pointCloud WRITE setPointCloud NOTIFY pointCloudChanged)
// Q_PROPERTY(qreal cameraX READ cameraX WRITE setCameraX NOTIFY cameraXChanged) // Q_PROPERTY(qreal cameraX READ cameraX WRITE setCameraX NOTIFY cameraXChanged)
// Q_PROPERTY(qreal cameraY READ cameraY WRITE setCameraY NOTIFY cameraYChanged) // Q_PROPERTY(qreal cameraY READ cameraY WRITE setCameraY NOTIFY cameraYChanged)
// Q_PROPERTY(qreal cameraZ READ cameraZ WRITE setCameraZ NOTIFY cameraZChanged) // Q_PROPERTY(qreal cameraZ READ cameraZ WRITE setCameraZ NOTIFY cameraZChanged)
protected: protected:
SvPointCloud *pointCloud; SvPointCloud *m_pointCloud;
SvPointCloudRenderer *m_pointCloudRenderer;
qreal m_cameraX; qreal m_cameraX;
qreal m_cameraY; qreal m_cameraY;
qreal m_cameraZ; qreal m_cameraZ;
QOpenGLShaderProgram *m_program;
public: public:
explicit SvPointCloudViewer(QQuickItem *parent = 0); explicit SvPointCloudViewer(QQuickItem *parent = 0);
void paint(QPainter *painter);
void setPointCloud(SvPointCloud *pointCloud) { m_pointCloud = pointCloud; }
SvPointCloud *pointCloud() { return m_pointCloud; }
signals: signals:
void pointCloudChanged();
void cameraXChanged(); void cameraXChanged();
void cameraYChanged(); void cameraYChanged();
void cameraZChanged(); void cameraZChanged();
private slots:
void handleWindowChanged(QQuickWindow *win);
public slots: public slots:
void sync();
void cleanup();
//void resetCamera(); //void resetCamera();
//void moveCamera(qreal X, qreal Y, qreal Z); //void moveCamera(qreal X, qreal Y, qreal Z);
// void rotateCamera(qreal X, qreal Y, qreal Z); // void rotateCamera(qreal X, qreal Y, qreal Z);

View File

@ -19,6 +19,7 @@ SvProcessor::SvProcessor(int numberOfWorkers)
for (i = 0; i < m_numberOfWorkers; i++) { for (i = 0; i < m_numberOfWorkers; i++) {
m_workers[i].setId(i); m_workers[i].setId(i);
m_workers[i].setKernel(m_kernel); m_workers[i].setKernel(m_kernel);
m_workers[i].setProcessor(this);
m_workers[i].moveToThread(&m_threads[i]); m_workers[i].moveToThread(&m_threads[i]);
connect(&m_threads[i], &QThread::started, &m_workers[i], &SvWorker::start); connect(&m_threads[i], &QThread::started, &m_workers[i], &SvWorker::start);
@ -49,7 +50,7 @@ SvProcessorTask SvProcessor::nextTask()
{ {
SvProcessorTask task, *taskPtr; SvProcessorTask task, *taskPtr;
if (!m_taskQueue.size()) { if (!m_taskQueue.size()) {
throw new SvNoMoreTasks(); throw SvNoMoreTasks();
} }
m_nextTaskMutex.lock(); m_nextTaskMutex.lock();

View File

@ -6,12 +6,6 @@ SvWorker::SvWorker(QObject *parent) :
} }
SvWorker::SvWorker(SvProcessor *processor, SvKernel *kernel)
{
m_processor = processor;
m_kernel = kernel;
}
void SvWorker::stop() void SvWorker::stop()
{ {

View File

@ -21,11 +21,10 @@ protected:
public: public:
explicit SvWorker(QObject *parent = 0); explicit SvWorker(QObject *parent = 0);
SvWorker(SvProcessor *processor, SvKernel *kernel);
void setId(int id) {m_id = id;} void setId(int id) {m_id = id;}
void setKernel(SvKernel* kernel) {m_kernel = kernel;} void setKernel(SvKernel* kernel) {m_kernel = kernel;}
void setProcessor(SvProcessor* processor) {m_processor = processor;}
signals: signals:
void finished(int id); void finished(int id);