Skip to content

Commit 58a0804

Browse files
author
Nicolas Predella
committed
Fix #16848 slip mode rendering in split stem view
1 parent 17be527 commit 58a0804

2 files changed

Lines changed: 75 additions & 26 deletions

File tree

src/waveform/renderers/allshader/waveformrenderbeat.cpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
#include <QDomNode>
44

5+
#include "engine/engine.h"
56
#include "moc_waveformrenderbeat.cpp"
67
#include "rendergraph/geometry.h"
78
#include "rendergraph/material/unicolormaterial.h"
89
#include "rendergraph/vertexupdaters/vertexupdater.h"
910
#include "skin/legacy/skincontext.h"
1011
#include "track/track.h"
1112
#include "waveform/renderers/waveformwidgetrenderer.h"
13+
#include "waveform/waveform.h"
14+
#include "waveform/waveformwidgetfactory.h"
1215
#include "widget/wskincolor.h"
1316

1417
using namespace rendergraph;
@@ -48,6 +51,11 @@ bool WaveformRenderBeat::preprocessInner() {
4851
return false;
4952
}
5053

54+
const bool isStemTrack = trackInfo && trackInfo->hasStem() &&
55+
trackInfo->getWaveform() && trackInfo->getWaveform()->hasStem();
56+
const bool splitStemTracks = isStemTrack &&
57+
WaveformWidgetFactory::instance()->isStemSplitTracks();
58+
5159
auto positionType = m_isSlipRenderer ? ::WaveformRendererAbstract::Slip
5260
: ::WaveformRendererAbstract::Play;
5361

@@ -105,11 +113,18 @@ bool WaveformRenderBeat::preprocessInner() {
105113
numBeatsInRange++;
106114
}
107115

108-
const int reserved = numBeatsInRange * numVerticesPerLine;
116+
const int numBoxesPerBeat = (m_isSlipRenderer && splitStemTracks)
117+
? mixxx::kMaxSupportedStems
118+
: 1;
119+
const int reserved = numBeatsInRange * numVerticesPerLine * numBoxesPerBeat;
109120
geometry().allocate(reserved);
110121

111122
VertexUpdater vertexUpdater{geometry().vertexDataAs<Geometry::Point2D>()};
112123

124+
const float boxBreadth = splitStemTracks
125+
? rendererBreadth / static_cast<float>(mixxx::kMaxSupportedStems)
126+
: rendererBreadth;
127+
113128
for (auto it = trackBeats->iteratorFrom(startPosition);
114129
it != trackBeats->cend() && *it <= endPosition;
115130
++it) {
@@ -123,8 +138,16 @@ bool WaveformRenderBeat::preprocessInner() {
123138
const float x1 = static_cast<float>(xBeatPoint);
124139
const float x2 = x1 + 1.f;
125140

126-
vertexUpdater.addRectangle({x1, 0.f},
127-
{x2, m_isSlipRenderer ? rendererBreadth / 2 : rendererBreadth});
141+
if (m_isSlipRenderer && splitStemTracks) {
142+
for (int stemIdx = 0; stemIdx < mixxx::kMaxSupportedStems; ++stemIdx) {
143+
const float posy1 = stemIdx * boxBreadth;
144+
const float posy2 = posy1 + boxBreadth / 2.f;
145+
vertexUpdater.addRectangle({x1, posy1}, {x2, posy2});
146+
}
147+
} else {
148+
vertexUpdater.addRectangle({x1, 0.f},
149+
{x2, m_isSlipRenderer ? rendererBreadth / 2 : rendererBreadth});
150+
}
128151
}
129152
markDirtyGeometry();
130153

src/waveform/renderers/allshader/waveformrendererslipmode.cpp

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55
#include <memory>
66

77
#include "control/controlproxy.h"
8+
#include "engine/engine.h"
89
#include "rendergraph/geometry.h"
910
#include "rendergraph/material/rgbamaterial.h"
1011
#include "rendergraph/vertexupdaters/rgbavertexupdater.h"
12+
#include "track/track.h"
1113
#include "util/colorcomponents.h"
1214
#include "waveform/renderers/waveformwidgetrenderer.h"
15+
#include "waveform/waveform.h"
1316
#include "waveform/waveformwidgetfactory.h"
1417
#include "widget/wskincolor.h"
1518

@@ -88,6 +91,12 @@ bool WaveformRendererSlipMode::preprocessInner() {
8891
return false;
8992
}
9093

94+
TrackPointer pTrack = m_waveformRenderer->getTrackInfo();
95+
const bool isStemTrack = pTrack && pTrack->hasStem() &&
96+
pTrack->getWaveform() && pTrack->getWaveform()->hasStem();
97+
const bool splitStemTracks = isStemTrack &&
98+
WaveformWidgetFactory::instance()->isStemSplitTracks();
99+
91100
const int elapsed = m_timer.elapsed().toIntegerMillis() % kBlinkingPeriodMillis;
92101

93102
const float blinkIntensity =
@@ -99,38 +108,55 @@ bool WaveformRendererSlipMode::preprocessInner() {
99108

100109
const float posx1 = 0.f;
101110
const float posx2 = m_waveformRenderer->getLength();
102-
const float posy1 = 0.f;
103-
const float posy2 = m_waveformRenderer->getBreadth() / 2.f;
111+
const float breadth = m_waveformRenderer->getBreadth();
112+
113+
const int numBoxes = splitStemTracks ? mixxx::kMaxSupportedStems : 1;
114+
const float boxBreadth = splitStemTracks
115+
? breadth / static_cast<float>(mixxx::kMaxSupportedStems)
116+
: breadth;
104117

105-
const float sideBorderOutlineSide = m_slipBorderTopOutlineSize;
118+
const float topOutlineSize = splitStemTracks
119+
? m_slipBorderTopOutlineSize / static_cast<float>(mixxx::kMaxSupportedStems)
120+
: m_slipBorderTopOutlineSize;
121+
const float bottomOutlineSize = splitStemTracks
122+
? m_slipBorderBottomOutlineSize / static_cast<float>(mixxx::kMaxSupportedStems)
123+
: m_slipBorderBottomOutlineSize;
124+
const float sideBorderOutlineSide = topOutlineSize;
106125

107126
const QVector4D bgColor{0.f, 0.f, 0.f, 1.f};
108127
const QVector4D borderColor{m_color.redF(), m_color.greenF(), m_color.blueF(), alpha};
109128
const QVector4D borderColor0{m_color.redF(), m_color.greenF(), m_color.blueF(), 0.f};
110129

111-
const int numVerticesPerLine = 6; // 2 triangles
112-
geometry().allocate(numVerticesPerLine * 5); // border on 4 sides + bgColor filler in center
130+
const int numVerticesPerLine = 6; // 2 triangles
131+
geometry().allocate(numVerticesPerLine * 5 *
132+
numBoxes); // border on 4 sides + bgColor filler in center
113133

114134
RGBAVertexUpdater vertexUpdater{geometry().vertexDataAs<Geometry::RGBAColoredPoint2D>()};
115135

116-
vertexUpdater.addRectangle(
117-
{posx1, posy1},
118-
{posx2, posy2},
119-
bgColor);
120-
121-
vertexUpdater.addRectangle(
122-
{posx1, posy1}, {posx2, posy1 + m_slipBorderTopOutlineSize}, borderColor);
123-
vertexUpdater.addRectangle({posx1, posy1 + m_slipBorderTopOutlineSize},
124-
{posx1 + sideBorderOutlineSide,
125-
posy2},
126-
borderColor);
127-
vertexUpdater.addRectangle({posx2 - sideBorderOutlineSide, posy1 + m_slipBorderTopOutlineSize},
128-
{posx2, posy2},
129-
borderColor);
130-
vertexUpdater.addRectangleVGradient({posx1, posy2},
131-
{posx2, posy2 + m_slipBorderBottomOutlineSize},
132-
borderColor,
133-
borderColor0);
136+
for (int boxIdx = 0; boxIdx < numBoxes; ++boxIdx) {
137+
const float posy1 = boxIdx * boxBreadth;
138+
const float posy2 = posy1 + boxBreadth / 2.f;
139+
140+
vertexUpdater.addRectangle(
141+
{posx1, posy1},
142+
{posx2, posy2},
143+
bgColor);
144+
145+
vertexUpdater.addRectangle(
146+
{posx1, posy1}, {posx2, posy1 + topOutlineSize}, borderColor);
147+
vertexUpdater.addRectangle({posx1, posy1 + topOutlineSize},
148+
{posx1 + sideBorderOutlineSide,
149+
posy2},
150+
borderColor);
151+
vertexUpdater.addRectangle({posx2 - sideBorderOutlineSide, posy1 + topOutlineSize},
152+
{posx2, posy2},
153+
borderColor);
154+
vertexUpdater.addRectangleVGradient({posx1, posy2},
155+
{posx2, posy2 + bottomOutlineSize},
156+
borderColor,
157+
borderColor0);
158+
}
159+
134160
markDirtyGeometry();
135161
markDirtyMaterial();
136162

0 commit comments

Comments
 (0)