From d7dd95cd9eaa223ff8b86e84e6b1b488ff79bcd5 Mon Sep 17 00:00:00 2001 From: Samuel Fadel Date: Sat, 19 Dec 2015 12:29:33 +0100 Subject: New rendering (VoronoiSplat) -- incomplete. * Added voronoi-like splatting to points: the same technique from Messias et al., (2014) * It is now possible to change the projection technique during runtime (possible, but still requires some work) --- voronoisplat.h | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 voronoisplat.h (limited to 'voronoisplat.h') 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 +#include +#include +#include +#include +#include + +#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 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 -- cgit v1.2.3