Skip to content

Commit

Permalink
added appendChildNode with templatized result as suggested by Nico, c…
Browse files Browse the repository at this point in the history
…leared up code when creating a waveformsignalrenderer, and appending it as a node
  • Loading branch information
m0dB authored and m0dB committed Jan 18, 2025
1 parent 6c21fcf commit a00d35c
Show file tree
Hide file tree
Showing 11 changed files with 69 additions and 28 deletions.
7 changes: 5 additions & 2 deletions src/rendergraph/opengl/rendergraph/nodeinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,17 @@ namespace rendergraph {
template<class T_Node>
class NodeInterface : public T_Node {
public:
void appendChildNode(std::unique_ptr<BaseNode> pNode) {
template<class T_AppendNode>
T_AppendNode* appendChildNode(std::unique_ptr<T_AppendNode> pNode) {
// Transfers ownership to this.
BaseNode* pRawNode = pNode.release();
T_AppendNode* pRawNode = pNode.release();
// Note: Ideally we would use unique_ptrs internally, but
// Qt uses raw pointers for QSGNode hierarchy. For simplicity
// we mimic this.

T_Node::appendChildNode(pRawNode);

return pRawNode;
}

std::unique_ptr<BaseNode> detachChildNode(BaseNode* pNode) {
Expand Down
6 changes: 4 additions & 2 deletions src/rendergraph/scenegraph/rendergraph/nodeinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ namespace rendergraph {
template<class T_Node>
class NodeInterface : public T_Node {
public:
void appendChildNode(std::unique_ptr<BaseNode> pNode) {
BaseNode* pRawNode = pNode.release();
template<class T_AppendNode>
T_AppendNode* appendChildNode(std::unique_ptr<T_AppendNode> pNode) {
T_AppendNode* pRawNode = pNode.release();
pRawNode->setFlag(QSGNode::OwnedByParent, true);
T_Node::appendChildNode(pRawNode);
DEBUG_ASSERT(pRawNode->flags() & QSGNode::OwnedByParent);
return pRawNode;
}
std::unique_ptr<BaseNode> detachChildNode(BaseNode* pNode) {
DEBUG_ASSERT(pNode->flags() & QSGNode::OwnedByParent);
Expand Down
4 changes: 4 additions & 0 deletions src/waveform/renderers/allshader/waveformrendererfiltered.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ class allshader::WaveformRendererFiltered final
void initializeGL() override;
void paintGL() override;

rendergraph::BaseNode* asNode() override {
return this;
}

private:
const bool m_bRgbStacked;
mixxx::UnicolorShader m_shader;
Expand Down
4 changes: 4 additions & 0 deletions src/waveform/renderers/allshader/waveformrendererhsv.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ class allshader::WaveformRendererHSV final
void initializeGL() override;
void paintGL() override;

rendergraph::BaseNode* asNode() override {
return this;
}

private:
mixxx::RGBShader m_shader;
VertexData m_vertices;
Expand Down
4 changes: 4 additions & 0 deletions src/waveform/renderers/allshader/waveformrendererrgb.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ class allshader::WaveformRendererRGB final
return true;
}

rendergraph::BaseNode* asNode() override {
return this;
}

private:
mixxx::RGBShader m_shader;
VertexData m_vertices;
Expand Down
3 changes: 3 additions & 0 deletions src/waveform/renderers/allshader/waveformrenderersignalbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <QFlags>
#include <limits>

#include "rendergraph/node.h"
#include "util/class.h"
#include "waveform/renderers/waveformrenderersignalbase.h"

Expand Down Expand Up @@ -32,5 +33,7 @@ class allshader::WaveformRendererSignalBase : public ::WaveformRendererSignalBas
return false;
}

virtual rendergraph::BaseNode* asNode() = 0;

DISALLOW_COPY_AND_ASSIGN(WaveformRendererSignalBase);
};
4 changes: 4 additions & 0 deletions src/waveform/renderers/allshader/waveformrenderersimple.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ class allshader::WaveformRendererSimple final
void initializeGL() override;
void paintGL() override;

rendergraph::BaseNode* asNode() override {
return this;
}

private:
mixxx::UnicolorShader m_shader;
VertexData m_vertices[2];
Expand Down
4 changes: 4 additions & 0 deletions src/waveform/renderers/allshader/waveformrendererstem.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ class allshader::WaveformRendererStem final
void initializeGL() override;
void paintGL() override;

rendergraph::BaseNode* asNode() override {
return this;
}

private:
mixxx::RGBAShader m_shader;
mixxx::TextureShader m_textureShader;
Expand Down
4 changes: 4 additions & 0 deletions src/waveform/renderers/allshader/waveformrenderertextured.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ class allshader::WaveformRendererTextured final : public QObject,

void onSetTrack() override;

rendergraph::BaseNode* asNode() override {
return this;
}

public slots:
void slotWaveformUpdated();

Expand Down
50 changes: 31 additions & 19 deletions src/waveform/widgets/allshader/waveformwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@

namespace allshader {

std::unique_ptr<rendergraph::BaseNode> convert(
std::unique_ptr<WaveformRendererSignalBase>&& pRenderer) {
return std::unique_ptr<rendergraph::BaseNode>(pRenderer.release()->asNode());
}

WaveformWidget::WaveformWidget(QWidget* parent,
WaveformWidgetType::Type type,
const QString& group,
Expand All @@ -34,20 +39,25 @@ WaveformWidget::WaveformWidget(QWidget* parent,
pTopNode->appendChildNode(addRendererNode<WaveformRenderBackground>());
pOpacityNode->appendChildNode(addRendererNode<WaveformRendererEndOfTrack>());
pOpacityNode->appendChildNode(addRendererNode<WaveformRendererPreroll>());
pOpacityNode->appendChildNode(addRendererNode<WaveformRenderMarkRange>());
m_pWaveformRenderMarkRange = static_cast<WaveformRenderMarkRange*>(pOpacityNode->lastChild());
m_pWaveformRenderMarkRange = pOpacityNode->appendChildNode(
addRendererNode<WaveformRenderMarkRange>());

#ifdef __STEM__
// The following two renderers work in tandem: if the rendered waveform is
// for a stem track, WaveformRendererSignalBase will skip rendering and let
// WaveformRendererStem do the rendering, and vice-versa.
pOpacityNode->appendChildNode(addRendererNode<WaveformRendererStem>());
#endif
pOpacityNode->appendChildNode(addWaveformSignalRendererNode(
type, options, ::WaveformRendererAbstract::Play));
std::unique_ptr<WaveformRendererSignalBase> pWaveformRendererSignal = addWaveformSignalRenderer(
type, options, ::WaveformRendererAbstract::Play);
m_pWaveformRendererSignal = pWaveformRendererSignal.get();
if (pWaveformRendererSignal) {
// convert std::unique_ptr<WaveformRendererSignalBase>
// to std::unique_ptr<rendergraph::BaseNode>
pOpacityNode->appendChildNode(convert(std::move(pWaveformRendererSignal)));
}
pOpacityNode->appendChildNode(addRendererNode<WaveformRenderBeat>());
pOpacityNode->appendChildNode(addRendererNode<WaveformRenderMark>());
m_pWaveformRenderMark = static_cast<WaveformRenderMark*>(pOpacityNode->lastChild());
m_pWaveformRenderMark = pOpacityNode->appendChildNode(addRendererNode<WaveformRenderMark>());

// if the added signal renderer supports slip, we add it again, now for
// slip, together with the other slip renderers
Expand All @@ -62,8 +72,11 @@ WaveformWidget::WaveformWidget(QWidget* parent,
addRendererNode<WaveformRendererStem>(
::WaveformRendererAbstract::Slip));
#endif
pOpacityNode->appendChildNode(addWaveformSignalRendererNode(
type, options, ::WaveformRendererAbstract::Slip));
std::unique_ptr<WaveformRendererSignalBase> pSlipNode = addWaveformSignalRenderer(
type, options, ::WaveformRendererAbstract::Slip);
// convert std::unique_ptr<WaveformRendererSignalBase>
// to std::unique_ptr<rendergraph::BaseNode>
pOpacityNode->appendChildNode(convert(std::move(pSlipNode)));
pOpacityNode->appendChildNode(
addRendererNode<WaveformRenderBeat>(
::WaveformRendererAbstract::Slip));
Expand All @@ -74,8 +87,7 @@ WaveformWidget::WaveformWidget(QWidget* parent,

m_initSuccess = init();

pTopNode->appendChildNode(std::move(pOpacityNode));
m_pOpacityNode = static_cast<rendergraph::OpacityNode*>(pTopNode->lastChild());
m_pOpacityNode = pTopNode->appendChildNode(std::move(pOpacityNode));

m_pEngine = std::make_unique<rendergraph::Engine>(std::move(pTopNode));
}
Expand All @@ -87,17 +99,17 @@ WaveformWidget::~WaveformWidget() {
doneCurrent();
}

std::unique_ptr<rendergraph::BaseNode>
WaveformWidget::addWaveformSignalRendererNode(WaveformWidgetType::Type type,
std::unique_ptr<WaveformRendererSignalBase>
WaveformWidget::addWaveformSignalRenderer(WaveformWidgetType::Type type,
WaveformRendererSignalBase::Options options,
::WaveformRendererAbstract::PositionSource positionSource) {
#ifndef QT_OPENGL_ES_2
if (options & allshader::WaveformRendererSignalBase::Option::HighDetail) {
if (options & WaveformRendererSignalBase::Option::HighDetail) {
switch (type) {
case ::WaveformWidgetType::RGB:
case ::WaveformWidgetType::Filtered:
case ::WaveformWidgetType::Stacked:
return addWaveformSignalRendererNode<WaveformRendererTextured>(
return addWaveformSignalRenderer<WaveformRendererTextured>(
type, positionSource, options);
default:
break;
Expand All @@ -107,15 +119,15 @@ WaveformWidget::addWaveformSignalRendererNode(WaveformWidgetType::Type type,

switch (type) {
case ::WaveformWidgetType::Simple:
return addWaveformSignalRendererNode<WaveformRendererSimple>();
return addWaveformSignalRenderer<WaveformRendererSimple>();
case ::WaveformWidgetType::RGB:
return addWaveformSignalRendererNode<WaveformRendererRGB>(positionSource, options);
return addWaveformSignalRenderer<WaveformRendererRGB>(positionSource, options);
case ::WaveformWidgetType::HSV:
return addWaveformSignalRendererNode<WaveformRendererHSV>();
return addWaveformSignalRenderer<WaveformRendererHSV>();
case ::WaveformWidgetType::Filtered:
return addWaveformSignalRendererNode<WaveformRendererFiltered>(false);
return addWaveformSignalRenderer<WaveformRendererFiltered>(false);
case ::WaveformWidgetType::Stacked:
return addWaveformSignalRendererNode<WaveformRendererFiltered>(
return addWaveformSignalRenderer<WaveformRendererFiltered>(
true); // true for RGB Stacked
default:
break;
Expand Down
7 changes: 2 additions & 5 deletions src/waveform/widgets/allshader/waveformwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,12 @@ class allshader::WaveformWidget final : public ::WGLWidget,
}

template<class T_Renderer, typename... Args>
inline std::unique_ptr<T_Renderer> addWaveformSignalRendererNode(Args&&... args) {
inline std::unique_ptr<T_Renderer> addWaveformSignalRenderer(Args&&... args) {
auto pRenderer = addRenderer<T_Renderer>(std::forward<Args>(args)...);
if (!m_pWaveformRendererSignal) {
m_pWaveformRendererSignal = pRenderer;
}
return std::unique_ptr<T_Renderer>(pRenderer);
}

std::unique_ptr<rendergraph::BaseNode> addWaveformSignalRendererNode(
std::unique_ptr<allshader::WaveformRendererSignalBase> addWaveformSignalRenderer(
WaveformWidgetType::Type type,
WaveformRendererSignalBase::Options options,
::WaveformRendererAbstract::PositionSource positionSource);
Expand Down

0 comments on commit a00d35c

Please sign in to comment.