Skip to content

Commit

Permalink
changes from rendergraph
Browse files Browse the repository at this point in the history
  • Loading branch information
m0dB authored and acolombier committed Oct 20, 2024
1 parent 46c087f commit a3bac1e
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 28 deletions.
61 changes: 40 additions & 21 deletions src/waveform/renderers/allshader/waveformrendermark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,18 +97,30 @@ allshader::WaveformRenderMark::WaveformRenderMark(
m_isSlipRenderer(type == ::WaveformRendererAbstract::Slip),
m_playPosHeight(0.f),
m_playPosDevicePixelRatio(0.f) {
appendChildNode(std::make_unique<Node>());
m_pRangeNodesParent = lastChild();
{
auto pNode = std::make_unique<Node>();
m_pRangeNodesParent = pNode.get();
appendChildNode(std::move(pNode));
}

appendChildNode(std::make_unique<Node>());
m_pMarkNodesParent = lastChild();
{
auto pNode = std::make_unique<Node>();
m_pMarkNodesParent = pNode.get();
appendChildNode(std::move(pNode));
}

appendChildNode(std::make_unique<DigitsRenderNode>());
m_pDigitsRenderNode = static_cast<DigitsRenderNode*>(lastChild());
{
auto pNode = std::make_unique<DigitsRenderNode>();
m_pDigitsRenderNode = pNode.get();
appendChildNode(std::move(pNode));
}

appendChildNode(std::make_unique<GeometryNode>());
m_pPlayPosNode = static_cast<GeometryNode*>(lastChild());
m_pPlayPosNode->initForRectangles<TextureMaterial>(1);
{
auto pNode = std::make_unique<GeometryNode>();
m_pPlayPosNode = pNode.get();
m_pPlayPosNode->initForRectangles<TextureMaterial>(1);
appendChildNode(std::move(pNode));
}
}

void allshader::WaveformRenderMark::draw(QPainter* painter, QPaintEvent* event) {
Expand Down Expand Up @@ -151,6 +163,16 @@ bool allshader::WaveformRenderMark::isSubtreeBlocked() const {
return m_isSlipRenderer && !m_waveformRenderer->isSlipActive();
}

namespace {
template<class T>
std::unique_ptr<T> castToUniquePtr(std::unique_ptr<rendergraph::BaseNode>&& pNode) {
if (dynamic_cast<T*>(pNode.get())) {
return std::unique_ptr<T>(dynamic_cast<T*>(pNode.release()));
}
return std::unique_ptr<T>();
}
} // namespace

void allshader::WaveformRenderMark::update() {
if (isSubtreeBlocked()) {
return;
Expand All @@ -166,14 +188,12 @@ void allshader::WaveformRenderMark::update() {
// (transferring ownership). Later in this function we move the
// visible nodes back to m_pMarkNodesParent children.
while (auto pChild = m_pMarkNodesParent->firstChild()) {
// Pop child from front of m_pMarkNodesParent
auto pRemoved = m_pMarkNodesParent->removeChildNode(pChild);
auto pNode = castToUniquePtr<WaveformMarkNode>(m_pMarkNodesParent->detachChildNode(pChild));
// Determine its WaveformMark
auto pMarkNode = static_cast<WaveformMarkNode*>(pRemoved.get());
auto pMark = pMarkNode->m_pOwner;
auto pMark = pNode->m_pOwner;
auto pGraphics = static_cast<WaveformMarkNodeGraphics*>(pMark->m_pGraphics.get());
// Store the node with the WaveformMark
pGraphics->setNode(std::move(pRemoved));
pGraphics->setNode(std::move(pNode));
}

auto positionType = m_isSlipRenderer ? ::WaveformRendererAbstract::Slip
Expand Down Expand Up @@ -271,12 +291,12 @@ void allshader::WaveformRenderMark::update() {
// Reuse, or create new when needed
if (!pRangeChild) {
auto pNode = std::make_unique<GeometryNode>();
pNode->initForRectangles<RGBAMaterial>(2);
pRangeChild = pNode.get();
pRangeChild->initForRectangles<RGBAMaterial>(2);
m_pRangeNodesParent->appendChildNode(std::move(pNode));
}

updateRangeNode(static_cast<GeometryNode*>(pRangeChild),
updateRangeNode(pRangeChild,
QRectF(QPointF(currentMarkPoint, 0),
QPointF(currentMarkEndPoint,
m_waveformRenderer->getBreadth())),
Expand All @@ -295,11 +315,10 @@ void allshader::WaveformRenderMark::update() {
}

// Remove unused nodes
// while (pRangeChild) {
// auto pNext = static_cast<GeometryNode*>(pRangeChild->nextSibling());
// m_pRangeNodesParent->removeChildNode(pRangeChild);
// pRangeChild = pNext;
//}
while (pRangeChild) {
auto pNode = m_pRangeNodesParent->detachChildNode(pRangeChild);
pRangeChild = static_cast<GeometryNode*>(pRangeChild->nextSibling());
}

m_waveformRenderer->setMarkPositions(marksOnScreen);

Expand Down
5 changes: 2 additions & 3 deletions src/waveform/renderers/allshader/waveformrendermark.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

#include <QColor>

#include "rendergraph/geometrynode.h"
#include "rendergraph/node.h"
#include "waveform/renderers/waveformrendermarkbase.h"

Expand Down Expand Up @@ -71,8 +70,8 @@ class allshader::WaveformRenderMark : public ::WaveformRenderMarkBase,

bool m_isSlipRenderer;

rendergraph::TreeNode* m_pRangeNodesParent{};
rendergraph::TreeNode* m_pMarkNodesParent{};
rendergraph::Node* m_pRangeNodesParent{};
rendergraph::Node* m_pMarkNodesParent{};

rendergraph::GeometryNode* m_pPlayPosNode;
float m_playPosHeight;
Expand Down
7 changes: 3 additions & 4 deletions src/waveform/renderers/allshader/waveformrendermarkrange.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ using namespace rendergraph;
namespace allshader {

WaveformRenderMarkRange::WaveformRenderMarkRange(WaveformWidgetRenderer* waveformWidget)
: ::WaveformRendererAbstract(waveformWidget) {
: ::WaveformRendererAbstract(waveformWidget) {
}

void WaveformRenderMarkRange::setup(const QDomNode& node, const SkinContext& skinContext) {
Expand Down Expand Up @@ -88,9 +88,8 @@ void WaveformRenderMarkRange::update() {
pChild = static_cast<GeometryNode*>(pChild->nextSibling());
}
while (pChild) {
auto pNext = static_cast<GeometryNode*>(pChild->nextSibling());
removeChildNode(pChild);
pChild = pNext;
auto pNode = detachChildNode(pChild);
pChild = static_cast<GeometryNode*>(pChild->nextSibling());
}
}

Expand Down

0 comments on commit a3bac1e

Please sign in to comment.