aboutsummaryrefslogtreecommitdiff
path: root/voronoisplat.h
diff options
context:
space:
mode:
Diffstat (limited to 'voronoisplat.h')
-rw-r--r--voronoisplat.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/voronoisplat.h b/voronoisplat.h
new file mode 100644
index 0000000..ce84e74
--- /dev/null
+++ b/voronoisplat.h
@@ -0,0 +1,103 @@
+#ifndef VORONOISPLAT_H
+#define VORONOISPLAT_H
+
+#include <QQuickFramebufferObject>
+#include <QOpenGLFunctions>
+#include <QOpenGLBuffer>
+#include <QOpenGLShaderProgram>
+#include <QOpenGLVertexArrayObject>
+#include <armadillo>
+
+#include "colorscale.h"
+
+class VoronoiSplat; // defined after this class
+
+class VoronoiSplatRenderer
+ : public QQuickFramebufferObject::Renderer
+{
+public:
+ // 'size' must be square (and power of 2); item is the QQuickFBO that
+ // creates this
+ VoronoiSplatRenderer(const QSize &size);
+ ~VoronoiSplatRenderer();
+
+ void synchronize(QQuickFramebufferObject *item);
+ // 'points' should be a 2D points matrix (each point in a row)
+ void setSites(const arma::mat &points);
+ void setValues(const arma::vec &values);
+ // Set colormap data based on the given color scale;
+ void setColorMap(const ColorScale *scale);
+
+ QOpenGLFramebufferObject *createFramebufferObject(const QSize & size);
+ void render();
+
+private:
+ void setupShaders();
+ void setupTextures();
+ void copyPoints(const arma::mat &points);
+ void computeDT();
+
+ VoronoiSplat *m_item;
+ QOpenGLFunctions gl;
+ QOpenGLShaderProgram *m_program1, *m_program2;
+ GLuint m_VBOs[3];
+ GLuint m_textures[2], m_colorMapTex;
+ QOpenGLVertexArrayObject m_sitesVAO, m_2ndPassVAO;
+
+ std::vector<float> m_sites, m_values;
+ QSize m_size;
+};
+
+class VoronoiSplat
+ : public QQuickFramebufferObject
+{
+ Q_OBJECT
+public:
+ VoronoiSplat(QQuickItem *parent = 0);
+ Renderer *createRenderer() const;
+
+ const arma::mat &points() const { return m_points; }
+ const arma::vec &values() const { return m_values; }
+ const ColorScale *colorScale() const { return m_colorScale; }
+
+ bool colorScaleUpdated() const { return m_colorScaleUpdated; }
+ bool pointsUpdated() const { return m_pointsUpdated; }
+ bool valuesUpdated() const { return m_valuesUpdated; }
+
+public slots:
+ void setColorScale(const ColorScale *scale)
+ {
+ m_colorScale = scale;
+ m_colorScaleUpdated = true;
+ update();
+ }
+
+ void setPoints(const arma::mat &points)
+ {
+ m_points = points;
+ m_pointsUpdated = true;
+ update();
+ }
+
+ void setValues(const arma::vec &values)
+ {
+ m_values = values;
+ m_valuesUpdated = true;
+ update();
+ }
+
+ void setUpdated(bool updated)
+ {
+ m_colorScaleUpdated = updated;
+ m_pointsUpdated = updated;
+ m_valuesUpdated = updated;
+ }
+
+private:
+ bool m_colorScaleUpdated, m_pointsUpdated, m_valuesUpdated;
+ const ColorScale *m_colorScale;
+ arma::mat m_points;
+ arma::vec m_values;
+};
+
+#endif // VORONOISPLAT_H