Skip to content

Commit

Permalink
WIP - fix legacy UI
Browse files Browse the repository at this point in the history
  • Loading branch information
acolombier committed Oct 20, 2024
1 parent f2c9001 commit 343f7b2
Show file tree
Hide file tree
Showing 12 changed files with 105 additions and 185 deletions.
3 changes: 0 additions & 3 deletions src/qml/qmlwaveformdisplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() +

Check warning on line 138 in src/qml/qmlwaveformdisplay.cpp

View workflow job for this annotation

GitHub Actions / clazy

unused QRectF [-Wclazy-unused-non-trivial-variable]
Expand Down
2 changes: 1 addition & 1 deletion src/rendergraph/common/rendergraph/material.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
107 changes: 81 additions & 26 deletions src/waveform/renderers/allshader/waveformrendermark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,33 +18,88 @@

using namespace rendergraph;

allshader::WaveformMarkNode::WaveformMarkNode(WaveformMark* pOwner, rendergraph::Context* pContext, const QImage& image)
: m_pOwner(pOwner) {
initForRectangles<TextureMaterial>(1);
updateTexture(pContext, image);
}

void allshader::WaveformMarkNode::updateTexture(rendergraph::Context* pContext, const QImage& image) {
dynamic_cast<TextureMaterial&>(material())
.setTexture(std::make_unique<Texture>(pContext, image));
m_textureWidth = image.width();
m_textureHeight = image.height();
}
void allshader::WaveformMarkNode::update(float x, float y, float devicePixelRatio) {
TexturedVertexUpdater vertexUpdater{
geometry().vertexDataAs<Geometry::TexturedPoint2D>()};
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<WaveformMarkNode>(
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<TextureMaterial>(1);
updateTexture(pContext, image);
}
void updateTexture(rendergraph::Context* pContext, const QImage& image) {
dynamic_cast<TextureMaterial&>(material())
.setTexture(std::make_unique<Texture>(pContext, image));
m_textureWidth = image.width();
m_textureHeight = image.height();
}
void update(float x, float y, float devicePixelRatio) {
TexturedVertexUpdater vertexUpdater{
geometry().vertexDataAs<Geometry::TexturedPoint2D>()};
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<WaveformMarkNode>(
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<WaveformMarkNode>&& pNode) {
m_pNode = std::move(pNode);
}
void moveNodeToChildrenOf(rendergraph::Node* pParent) {
pParent->appendChildNode(std::move(m_pNode));
}

private:
WaveformMarkNode* waveformMarkNode() const {
return static_cast<WaveformMarkNode*>(m_pNode.get());
}

std::unique_ptr<WaveformMarkNode> m_pNode;
};
} // namespace

// Both allshader::WaveformRenderMark and the non-GL ::WaveformRenderMark derive
// from WaveformRenderMarkBase. The base-class takes care of updating the marks
Expand Down
64 changes: 0 additions & 64 deletions src/waveform/renderers/allshader/waveformrendermark.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
#include "waveform/renderers/waveformrendermarkbase.h"

class QDomNode;
class SkinContext;

namespace rendergraph {
class GeometryNode;
Expand All @@ -17,8 +16,6 @@ class Context;
namespace allshader {
class DigitsRenderNode;
class WaveformRenderMark;
class WaveformMarkNode;
class WaveformMarkNodeGraphics;
} // namespace allshader

class allshader::WaveformRenderMark : public ::WaveformRenderMarkBase,
Expand Down Expand Up @@ -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<WaveformMarkNode>&& pNode) {
m_pNode = std::move(pNode);
}
void moveNodeToChildrenOf(rendergraph::Node* pParent) {
pParent->appendChildNode(std::move(m_pNode));
}

private:
WaveformMarkNode* waveformMarkNode() const {
return static_cast<WaveformMarkNode*>(m_pNode.get());
}

std::unique_ptr<WaveformMarkNode> m_pNode;
};
10 changes: 7 additions & 3 deletions src/waveform/renderers/waveformrendermarkbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
38 changes: 4 additions & 34 deletions src/waveform/renderers/waveformwidgetrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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;
// }
// }
40 changes: 5 additions & 35 deletions src/waveform/renderers/waveformwidgetrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<int>(m_rect.height());
return m_height;
}
int getWidth() const {
return static_cast<int>(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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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};

Check failure on line 253 in src/waveform/renderers/waveformwidgetrenderer.h

View workflow job for this annotation

GitHub Actions / Ubuntu 22.04

‘WaveformWidgetRenderer::m_pContext’ will be initialized after [-Werror=reorder]

Check warning on line 253 in src/waveform/renderers/waveformwidgetrenderer.h

View workflow job for this annotation

GitHub Actions / coverage

‘WaveformWidgetRenderer::m_pContext’ will be initialized after [-Wreorder]

#ifdef WAVEFORMWIDGETRENDERER_DEBUG
PerformanceTimer* m_timer;
Expand Down
1 change: 0 additions & 1 deletion src/waveform/visualplayposition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#include "util/cmdlineargs.h"
#include "util/math.h"
#include "waveform/isynctimeprovider.h"
#include "waveform/vsyncthread.h"

//static
QMap<QString, QWeakPointer<VisualPlayPosition>> VisualPlayPosition::m_listVisualPlayPosition;
Expand Down
4 changes: 2 additions & 2 deletions src/waveform/waveformwidgetfactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -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();
Expand Down
Loading

0 comments on commit 343f7b2

Please sign in to comment.