diff --git a/src/qml/qmlwaveformdisplay.cpp b/src/qml/qmlwaveformdisplay.cpp index 4b15df4ac746..eab4fcd47e00 100644 --- a/src/qml/qmlwaveformdisplay.cpp +++ b/src/qml/qmlwaveformdisplay.cpp @@ -133,9 +133,6 @@ QSGNode* QmlWaveformDisplay::updatePaintNode(QSGNode* node, UpdatePaintNodeData* if (m_dirtyFlag.testFlag(DirtyFlag::Geometry)) { m_dirtyFlag.setFlag(DirtyFlag::Geometry, false); - setRect(mapRectToScene(boundingRect())); - setViewport(window()->size()); - setDevicePixelRatio(window()->devicePixelRatio()); bgNode->setRect(boundingRect()); auto rect = QRectF(boundingRect().x() + diff --git a/src/rendergraph/common/rendergraph/material.h b/src/rendergraph/common/rendergraph/material.h index ab18e89166ad..e15ef5c0f1ce 100644 --- a/src/rendergraph/common/rendergraph/material.h +++ b/src/rendergraph/common/rendergraph/material.h @@ -30,7 +30,7 @@ class rendergraph::Material : public rendergraph::BaseMaterial { pOther->m_uniformsCache.data(), m_uniformsCache.size()); if (cacheCompareResult != 0) { - return cacheCompareResult < 0 ? -1 : 1; + return cacheCompareResult; } // TODO multiple textures if (!texture(0) || !pOther->texture(0)) { diff --git a/src/waveform/renderers/allshader/waveformrendermark.cpp b/src/waveform/renderers/allshader/waveformrendermark.cpp index c1cf43a5e7ae..52693636e236 100644 --- a/src/waveform/renderers/allshader/waveformrendermark.cpp +++ b/src/waveform/renderers/allshader/waveformrendermark.cpp @@ -18,33 +18,88 @@ using namespace rendergraph; -allshader::WaveformMarkNode::WaveformMarkNode(WaveformMark* pOwner, rendergraph::Context* pContext, const QImage& image) - : m_pOwner(pOwner) { - initForRectangles(1); - updateTexture(pContext, image); -} -void allshader::WaveformMarkNode::updateTexture(rendergraph::Context* pContext, const QImage& image) { - dynamic_cast(material()) - .setTexture(std::make_unique(pContext, image)); - m_textureWidth = image.width(); - m_textureHeight = image.height(); -} -void allshader::WaveformMarkNode::update(float x, float y, float devicePixelRatio) { - TexturedVertexUpdater vertexUpdater{ - geometry().vertexDataAs()}; - vertexUpdater.addRectangle({x, y}, - {x + m_textureWidth / devicePixelRatio, - y + m_textureHeight / devicePixelRatio}, - {0.f, 0.f}, - {1.f, 1.f}); -} -allshader::WaveformMarkNodeGraphics::WaveformMarkNodeGraphics(WaveformMark* pOwner, - rendergraph::Context* pContext, - const QImage& image) - : m_pNode(std::make_unique( - pOwner, pContext, image)) { -} +namespace { +// On the use of QPainter: +// +// The renderers in this folder are optimized to use GLSL shaders and refrain +// from using QPainter on the QOpenGLWindow, which causes degredated performance. +// +// This renderer does use QPainter (indirectly, in WaveformMark::generateImage), but +// only to draw on a QImage. This is only done once when needed and the images are +// then used as textures to be drawn with a GLSL shader. + +class WaveformMarkNode : public rendergraph::GeometryNode { + public: + WaveformMark* m_pOwner{}; + + WaveformMarkNode(WaveformMark* pOwner, rendergraph::Context* pContext, const QImage& image) + : m_pOwner(pOwner) { + initForRectangles(1); + updateTexture(pContext, image); + } + void updateTexture(rendergraph::Context* pContext, const QImage& image) { + dynamic_cast(material()) + .setTexture(std::make_unique(pContext, image)); + m_textureWidth = image.width(); + m_textureHeight = image.height(); + } + void update(float x, float y, float devicePixelRatio) { + TexturedVertexUpdater vertexUpdater{ + geometry().vertexDataAs()}; + vertexUpdater.addRectangle({x, y}, + {x + m_textureWidth / devicePixelRatio, + y + m_textureHeight / devicePixelRatio}, + {0.f, 0.f}, + {1.f, 1.f}); + } + float textureWidth() const { + return m_textureWidth; + } + float textureHeight() const { + return m_textureHeight; + } + + public: + float m_textureWidth{}; + float m_textureHeight{}; +}; + +class WaveformMarkNodeGraphics : public WaveformMark::Graphics { + public: + WaveformMarkNodeGraphics(WaveformMark* pOwner, + rendergraph::Context* pContext, + const QImage& image) + : m_pNode(std::make_unique( + pOwner, pContext, image)) { + } + void updateTexture(rendergraph::Context* pContext, const QImage& image) { + waveformMarkNode()->updateTexture(pContext, image); + } + void update(float x, float y, float devicePixelRatio) { + waveformMarkNode()->update(x, y, devicePixelRatio); + } + float textureWidth() const { + return waveformMarkNode()->textureWidth(); + } + float textureHeight() const { + return waveformMarkNode()->textureHeight(); + } + void setNode(std::unique_ptr&& pNode) { + m_pNode = std::move(pNode); + } + void moveNodeToChildrenOf(rendergraph::Node* pParent) { + pParent->appendChildNode(std::move(m_pNode)); + } + + private: + WaveformMarkNode* waveformMarkNode() const { + return static_cast(m_pNode.get()); + } + + std::unique_ptr m_pNode; +}; +} // namespace // Both allshader::WaveformRenderMark and the non-GL ::WaveformRenderMark derive // from WaveformRenderMarkBase. The base-class takes care of updating the marks diff --git a/src/waveform/renderers/allshader/waveformrendermark.h b/src/waveform/renderers/allshader/waveformrendermark.h index bf2aee489be8..2f3e080907f0 100644 --- a/src/waveform/renderers/allshader/waveformrendermark.h +++ b/src/waveform/renderers/allshader/waveformrendermark.h @@ -7,7 +7,6 @@ #include "waveform/renderers/waveformrendermarkbase.h" class QDomNode; -class SkinContext; namespace rendergraph { class GeometryNode; @@ -17,8 +16,6 @@ class Context; namespace allshader { class DigitsRenderNode; class WaveformRenderMark; -class WaveformMarkNode; -class WaveformMarkNodeGraphics; } // namespace allshader class allshader::WaveformRenderMark : public ::WaveformRenderMarkBase, @@ -92,64 +89,3 @@ class allshader::WaveformRenderMark : public ::WaveformRenderMarkBase, DISALLOW_COPY_AND_ASSIGN(WaveformRenderMark); }; - - -// On the use of QPainter: -// -// The renderers in this folder are optimized to use GLSL shaders and refrain -// from using QPainter on the QOpenGLWindow, which causes degredated performance. -// -// This renderer does use QPainter (indirectly, in WaveformMark::generateImage), but -// only to draw on a QImage. This is only done once when needed and the images are -// then used as textures to be drawn with a GLSL shader. - -class allshader::WaveformMarkNode : public rendergraph::GeometryNode { - public: - WaveformMark* m_pOwner{}; - - WaveformMarkNode(WaveformMark* pOwner, rendergraph::Context* pContext, const QImage& image); - void updateTexture(rendergraph::Context* pContext, const QImage& image); - void update(float x, float y, float devicePixelRatio); - float textureWidth() const { - return m_textureWidth; - } - float textureHeight() const { - return m_textureHeight; - } - - public: - float m_textureWidth{}; - float m_textureHeight{}; -}; - -class allshader::WaveformMarkNodeGraphics : public WaveformMark::Graphics { - public: - WaveformMarkNodeGraphics(WaveformMark* pOwner, - rendergraph::Context* pContext, - const QImage& image); - void updateTexture(rendergraph::Context* pContext, const QImage& image) { - waveformMarkNode()->updateTexture(pContext, image); - } - void update(float x, float y, float devicePixelRatio) { - waveformMarkNode()->update(x, y, devicePixelRatio); - } - float textureWidth() const { - return waveformMarkNode()->textureWidth(); - } - float textureHeight() const { - return waveformMarkNode()->textureHeight(); - } - void setNode(std::unique_ptr&& pNode) { - m_pNode = std::move(pNode); - } - void moveNodeToChildrenOf(rendergraph::Node* pParent) { - pParent->appendChildNode(std::move(m_pNode)); - } - - private: - WaveformMarkNode* waveformMarkNode() const { - return static_cast(m_pNode.get()); - } - - std::unique_ptr m_pNode; -}; diff --git a/src/waveform/renderers/waveformrendermarkbase.cpp b/src/waveform/renderers/waveformrendermarkbase.cpp index 82ad404c6ae3..d14bd386bd0b 100644 --- a/src/waveform/renderers/waveformrendermarkbase.cpp +++ b/src/waveform/renderers/waveformrendermarkbase.cpp @@ -9,17 +9,21 @@ WaveformRenderMarkBase::WaveformRenderMarkBase( bool updateImagesImmediately) : WaveformRendererAbstract(pWaveformWidgetRenderer), m_updateImagesImmediately(updateImagesImmediately) { +#ifdef __RENDERGRAPH_IS_SCENEGRAPH m_marks.connectSamplePositionChanged(this, &WaveformRenderMarkBase::onMarkChanged); m_marks.connectSampleEndPositionChanged(this, &WaveformRenderMarkBase::onMarkChanged); m_marks.connectVisibleChanged(this, &WaveformRenderMarkBase::onMarkChanged); +#endif } void WaveformRenderMarkBase::setup(const QDomNode& node, const SkinContext& context) { WaveformSignalColors signalColors = *m_waveformRenderer->getWaveformSignalColors(); m_marks.setup(m_waveformRenderer->getGroup(), node, context, signalColors); - // m_marks.connectSamplePositionChanged(this, &WaveformRenderMarkBase::onMarkChanged); - // m_marks.connectSampleEndPositionChanged(this, &WaveformRenderMarkBase::onMarkChanged); - // m_marks.connectVisibleChanged(this, &WaveformRenderMarkBase::onMarkChanged); +#ifdef __RENDERGRAPH_IS_OPENGL + m_marks.connectSamplePositionChanged(this, &WaveformRenderMarkBase::onMarkChanged); + m_marks.connectSampleEndPositionChanged(this, &WaveformRenderMarkBase::onMarkChanged); + m_marks.connectVisibleChanged(this, &WaveformRenderMarkBase::onMarkChanged); +#endif } void WaveformRenderMarkBase::onSetTrack() { diff --git a/src/waveform/renderers/waveformwidgetrenderer.cpp b/src/waveform/renderers/waveformwidgetrenderer.cpp index c6509668ed2f..06876cb6b2c8 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.cpp +++ b/src/waveform/renderers/waveformwidgetrenderer.cpp @@ -26,10 +26,12 @@ WaveformWidgetRenderer::WaveformWidgetRenderer(const QString& group) : m_group(group), m_orientation(Qt::Horizontal), m_dimBrightThreshold(kDefaultDimBrightThreshold), - m_matrixNeedUpdate(false), - m_matrixChanged(false), + m_height(-1), + m_width(-1), m_devicePixelRatio(1.0f), + m_trackPixelCount(0.0), + m_zoomFactor(1.0), m_visualSamplePerPixel(1.0), m_audioSamplePerPixel(1.0), @@ -510,35 +512,3 @@ CuePointer WaveformWidgetRenderer::getCuePointerFromIndex(int cueIndex) const { } return {}; } - -// void WaveformWidgetRenderer::updateMatrix() { -// if (m_matrixNeedUpdate) { -// qDebug() << "updating matrix with" << m_rect << m_viewport << m_devicePixelRatio; - -// m_matrix = QMatrix4x4(); -// m_matrix.ortho(QRectF( -// -m_rect.x(), -// -m_rect.y(), -// m_viewport.width(), -// m_viewport.height())); -// if (getOrientation() == Qt::Vertical) { -// m_matrix.rotate(90.f, 0.0f, 0.0f, 1.0f); -// m_matrix.translate(0.f, -m_viewport.width(), 0.f); -// } -// m_matrixDevicePixelRatio = QMatrix4x4(); -// m_matrixDevicePixelRatio.ortho(QRectF( -// -m_rect.x() * m_devicePixelRatio, -// -m_rect.y() * m_devicePixelRatio, -// m_viewport.width() * m_devicePixelRatio, -// m_viewport.height() * m_devicePixelRatio)); -// if (getOrientation() == Qt::Vertical) { -// m_matrixDevicePixelRatio.rotate(90.f, 0.0f, 0.0f, 1.0f); -// m_matrixDevicePixelRatio.translate( -// 0.f, -m_viewport.width() * m_devicePixelRatio, 0.f); -// } -// m_matrixNeedUpdate = false; -// m_matrixChanged = true; -// } else { -// m_matrixChanged = false; -// } -// } diff --git a/src/waveform/renderers/waveformwidgetrenderer.h b/src/waveform/renderers/waveformwidgetrenderer.h index 96f6ef3e8a83..d96bf404c570 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.h +++ b/src/waveform/renderers/waveformwidgetrenderer.h @@ -149,44 +149,20 @@ class WaveformWidgetRenderer { virtual void resizeRenderer(int width, int height, float devicePixelRatio); - void setDevicePixelRatio(float devicePixelRatio) { - if (m_devicePixelRatio != devicePixelRatio) { - m_devicePixelRatio = devicePixelRatio; - m_matrixNeedUpdate = true; - } - } - void setViewport(const QSize& viewport) { - if (m_viewport != viewport) { - m_viewport = viewport; - m_matrixNeedUpdate = true; - } - } - void setRect(const QRectF& rect) { - if (m_rect != rect) { - m_rect = rect; - m_matrixNeedUpdate = true; - } - } - const QSize getViewport() const { - return m_viewport; - } - const QSizeF getSize() const { - return m_rect.size(); - } int getHeight() const { - return static_cast(m_rect.height()); + return m_height; } int getWidth() const { - return static_cast(m_rect.width()); + return m_width; } float getDevicePixelRatio() const { return m_devicePixelRatio; } int getLength() const { - return m_orientation == Qt::Horizontal ? getWidth() : getHeight(); + return m_orientation == Qt::Horizontal ? m_width : m_height; } int getBreadth() const { - return m_orientation == Qt::Horizontal ? getHeight() : getWidth(); + return m_orientation == Qt::Horizontal ? m_height : m_width; } Qt::Orientation getOrientation() const { return m_orientation; @@ -247,12 +223,6 @@ class WaveformWidgetRenderer { int m_dimBrightThreshold; int m_height; int m_width; - bool m_matrixNeedUpdate; - bool m_matrixChanged; - QRectF m_rect; - QSize m_viewport; - QMatrix4x4 m_matrix; - QMatrix4x4 m_matrixDevicePixelRatio; float m_devicePixelRatio; WaveformSignalColors m_colors; QColor m_passthroughLabelColor; @@ -280,7 +250,7 @@ class WaveformWidgetRenderer { double m_scaleFactor; double m_playMarkerPosition; // 0.0 - left, 0.5 - center, 1.0 - right - rendergraph::Context* m_pContext; + rendergraph::Context* m_pContext{nullptr}; #ifdef WAVEFORMWIDGETRENDERER_DEBUG PerformanceTimer* m_timer; diff --git a/src/waveform/visualplayposition.cpp b/src/waveform/visualplayposition.cpp index 41e15a8992c5..d9d96a840925 100644 --- a/src/waveform/visualplayposition.cpp +++ b/src/waveform/visualplayposition.cpp @@ -4,7 +4,6 @@ #include "util/cmdlineargs.h" #include "util/math.h" #include "waveform/isynctimeprovider.h" -#include "waveform/vsyncthread.h" //static QMap> VisualPlayPosition::m_listVisualPlayPosition; diff --git a/src/waveform/waveformwidgetfactory.cpp b/src/waveform/waveformwidgetfactory.cpp index 56c0d8b30ff1..1cd172a94db4 100644 --- a/src/waveform/waveformwidgetfactory.cpp +++ b/src/waveform/waveformwidgetfactory.cpp @@ -499,7 +499,7 @@ bool WaveformWidgetFactory::setWaveformWidget(WWaveformViewer* viewer, viewer->setZoom(m_defaultZoom); viewer->setDisplayBeatGridAlpha(m_beatGridAlpha); viewer->setPlayMarkerPosition(m_playMarkerPosition); - waveformWidget->setViewport(QSize(viewer->width(), viewer->height())); + waveformWidget->resize(viewer->width(), viewer->height()); waveformWidget->getWidget()->show(); viewer->update(); @@ -620,7 +620,7 @@ bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex, bool force) // resize() doesn't seem to get called on the widget. I think Qt skips // it since the size didn't change. //viewer->resize(viewer->size()); - widget->setViewport(QSize(viewer->width(), viewer->height())); + widget->resize(viewer->width(), viewer->height()); widget->setTrack(pTrack); widget->getWidget()->show(); viewer->update(); diff --git a/src/waveform/widgets/waveformwidgetabstract.cpp b/src/waveform/widgets/waveformwidgetabstract.cpp index 796c04f0b947..5b83ca58790c 100644 --- a/src/waveform/widgets/waveformwidgetabstract.cpp +++ b/src/waveform/widgets/waveformwidgetabstract.cpp @@ -37,7 +37,6 @@ mixxx::Duration WaveformWidgetAbstract::render() { // Time for Painter setup, unknown in this case return mixxx::Duration(); } -/* void WaveformWidgetAbstract::resize(int width, int height) { qreal devicePixelRatio = 1.0; @@ -45,7 +44,5 @@ void WaveformWidgetAbstract::resize(int width, int height) { m_widget->resize(width, height); devicePixelRatio = m_widget->devicePixelRatioF(); } - setSize(QSize(width, height)); - setDevicePixelRatio(static_cast(devicePixelRatio)); + resizeRenderer(width, height, static_cast(devicePixelRatio)); } -*/ diff --git a/src/waveform/widgets/waveformwidgetabstract.h b/src/waveform/widgets/waveformwidgetabstract.h index 0a4432d1e03d..ef5cec020713 100644 --- a/src/waveform/widgets/waveformwidgetabstract.h +++ b/src/waveform/widgets/waveformwidgetabstract.h @@ -36,12 +36,7 @@ class WaveformWidgetAbstract : public WaveformWidgetRenderer { virtual void preRender(VSyncThread* vsyncThread); virtual mixxx::Duration render(); - virtual void setViewport(const QSize&) { - } - virtual void setRect(const QRectF&) { - } - virtual void setDevicePixelRatio(float) { - } + virtual void resize(int width, int height); protected: QWidget* m_widget; diff --git a/src/widget/wwaveformviewer.cpp b/src/widget/wwaveformviewer.cpp index 265550bcaa66..f40582ced38e 100644 --- a/src/widget/wwaveformviewer.cpp +++ b/src/widget/wwaveformviewer.cpp @@ -61,9 +61,7 @@ void WWaveformViewer::resizeEvent(QResizeEvent* event) { // so this calls the method of WaveformWidgetAbstract, // note of the derived waveform widgets which are also // a QWidget, though that will be called directly. - m_waveformWidget->setViewport(QSize(width(), height())); - m_waveformWidget->setRect(QRectF(0, 0, width(), height())); - m_waveformWidget->setDevicePixelRatio(static_cast(devicePixelRatioF())); + m_waveformWidget->resize(width(), height()); } } @@ -73,9 +71,8 @@ void WWaveformViewer::showEvent(QShowEvent* event) { // We leave it up to Qt to set the size of the derived // waveform widget, but we still need to set the size // of the renderer. - m_waveformWidget->setViewport(QSize(width(), height())); - m_waveformWidget->setRect(QRectF(0, 0, width(), height())); - m_waveformWidget->setDevicePixelRatio(static_cast(devicePixelRatioF())); + m_waveformWidget->resizeRenderer( + width(), height(), static_cast(devicePixelRatioF())); } }