Skip to content

Commit 67ce405

Browse files
m0dBm0dB
m0dB
authored and
m0dB
committed
use geometrynode for waveformrendererpreroll
1 parent 60c2587 commit 67ce405

File tree

4 files changed

+104
-111
lines changed

4 files changed

+104
-111
lines changed
+68-80
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
#include "waveform/renderers/allshader/waveformrendererpreroll.h"
22

33
#include <QDomNode>
4-
#include <QOpenGLTexture>
54
#include <QPainterPath>
65
#include <array>
76

7+
#include "rendergraph/geometry.h"
8+
#include "rendergraph/material/patternmaterial.h"
9+
#include "rendergraph/vertexupdaters/texturedvertexupdater.h"
810
#include "skin/legacy/skincontext.h"
9-
#include "waveform/renderers/allshader/matrixforwidgetgeometry.h"
1011
#include "waveform/renderers/waveformwidgetrenderer.h"
1112
#include "widget/wskincolor.h"
1213

@@ -20,7 +21,7 @@ QImage drawPrerollImage(float markerLength,
2021
const float imageW = static_cast<float>(imagePixelW) / devicePixelRatio;
2122
const float imageH = static_cast<float>(imagePixelH) / devicePixelRatio;
2223

23-
QImage image(imagePixelW, imagePixelH, QImage::Format_ARGB32_Premultiplied);
24+
QImage image(imagePixelW, imagePixelH, QImage::Format_RGBA8888_Premultiplied);
2425
image.setDevicePixelRatio(devicePixelRatio);
2526

2627
const float penWidth = 1.5f;
@@ -47,7 +48,7 @@ QImage drawPrerollImage(float markerLength,
4748
path.lineTo(p0);
4849
path.closeSubpath();
4950
QColor fillColor = color;
50-
fillColor.setAlphaF(0.5f);
51+
fillColor.setAlphaF(0.25f);
5152
painter.fillPath(path, QBrush(fillColor));
5253

5354
painter.drawPath(path);
@@ -57,31 +58,52 @@ QImage drawPrerollImage(float markerLength,
5758
}
5859
} // anonymous namespace
5960

61+
using namespace rendergraph;
62+
6063
namespace allshader {
6164

6265
WaveformRendererPreroll::WaveformRendererPreroll(
6366
WaveformWidgetRenderer* waveformWidget,
6467
::WaveformRendererAbstract::PositionSource type)
65-
: WaveformRenderer(waveformWidget),
68+
: ::WaveformRendererAbstract(waveformWidget),
6669
m_isSlipRenderer(type == ::WaveformRendererAbstract::Slip) {
70+
setGeometry(std::make_unique<Geometry>(PatternMaterial::attributes(), 0));
71+
setMaterial(std::make_unique<PatternMaterial>());
72+
setUsePreprocess(true);
73+
geometry().setDrawingMode(Geometry::DrawingMode::Triangles);
6774
}
6875

6976
WaveformRendererPreroll::~WaveformRendererPreroll() = default;
7077

7178
void WaveformRendererPreroll::setup(
72-
const QDomNode& node, const SkinContext& context) {
73-
m_color = QColor(context.selectString(node, "SignalColor"));
79+
const QDomNode& node, const SkinContext& skinContext) {
80+
m_color = QColor(skinContext.selectString(node, "SignalColor"));
7481
m_color = WSkinColor::getCorrectColor(m_color);
7582
}
7683

77-
void WaveformRendererPreroll::initializeGL() {
78-
m_shader.init();
84+
void WaveformRendererPreroll::draw(QPainter* painter, QPaintEvent* event) {
85+
Q_UNUSED(painter);
86+
Q_UNUSED(event);
87+
DEBUG_ASSERT(false);
88+
}
89+
90+
void WaveformRendererPreroll::preprocess() {
91+
if (!preprocessInner()) {
92+
if (geometry().vertexCount() != 0) {
93+
geometry().allocate(0);
94+
markDirtyGeometry();
95+
}
96+
} else {
97+
markDirtyMaterial();
98+
markDirtyGeometry();
99+
}
79100
}
80101

81-
void WaveformRendererPreroll::paintGL() {
82-
const TrackPointer track = m_waveformRenderer->getTrackInfo();
83-
if (!track || (m_isSlipRenderer && !m_waveformRenderer->isSlipActive())) {
84-
return;
102+
bool WaveformRendererPreroll::preprocessInner() {
103+
const TrackPointer trackInfo = m_waveformRenderer->getTrackInfo();
104+
105+
if (!trackInfo || (m_isSlipRenderer && !m_waveformRenderer->isSlipActive())) {
106+
return false;
85107
}
86108

87109
auto positionType = m_isSlipRenderer ? ::WaveformRendererAbstract::Slip
@@ -95,11 +117,15 @@ void WaveformRendererPreroll::paintGL() {
95117
// to indicate the respective zones.
96118
const bool preRollVisible = firstDisplayedPosition < 0;
97119
const bool postRollVisible = lastDisplayedPosition > 1;
120+
const int numVerticesPerRectangle = 6;
98121

99-
if (!(preRollVisible || postRollVisible)) {
100-
return;
122+
if (!preRollVisible && !postRollVisible) {
123+
return false;
101124
}
102125

126+
const int reserved = (preRollVisible ? numVerticesPerRectangle : 0) +
127+
(postRollVisible ? numVerticesPerRectangle : 0);
128+
103129
const double playMarkerPosition = m_waveformRenderer->getPlayMarkerPosition();
104130
const double vSamplesPerPixel = m_waveformRenderer->getVisualSamplePerPixel();
105131
const double numberOfVSamples = m_waveformRenderer->getLength() * vSamplesPerPixel;
@@ -125,36 +151,20 @@ void WaveformRendererPreroll::paintGL() {
125151
// has changed size last time.
126152
m_markerLength = markerLength;
127153
m_markerBreadth = markerBreadth;
128-
m_texture.setData(drawPrerollImage(m_markerLength,
129-
m_markerBreadth,
130-
m_waveformRenderer->getDevicePixelRatio(),
131-
m_color));
154+
dynamic_cast<PatternMaterial&>(material())
155+
.setTexture(std::make_unique<Texture>(m_waveformRenderer->getContext(),
156+
drawPrerollImage(m_markerLength,
157+
m_markerBreadth,
158+
m_waveformRenderer->getDevicePixelRatio(),
159+
m_color)));
132160
}
133161

134-
if (!m_texture.isStorageAllocated()) {
135-
return;
136-
}
137-
138-
const int matrixLocation = m_shader.matrixLocation();
139-
const int textureLocation = m_shader.textureLocation();
140-
const int positionLocation = m_shader.positionLocation();
141-
const int texcoordLocation = m_shader.texcoordLocation();
142-
143-
// Set up the shader
144-
m_shader.bind();
145-
146-
m_shader.enableAttributeArray(positionLocation);
147-
m_shader.enableAttributeArray(texcoordLocation);
148-
149-
const QMatrix4x4 matrix = matrixForWidgetGeometry(m_waveformRenderer, false);
150-
151-
m_shader.setUniformValue(matrixLocation, matrix);
152-
m_shader.setUniformValue(textureLocation, 0);
153-
154-
m_texture.bind();
162+
geometry().allocate(reserved);
155163

156164
const float end = m_waveformRenderer->getLength();
157165

166+
TexturedVertexUpdater vertexUpdater{geometry().vertexDataAs<Geometry::TexturedPoint2D>()};
167+
158168
if (preRollVisible) {
159169
// VSample position of the right-most triangle's tip
160170
const double triangleTipVSamplePosition =
@@ -168,11 +178,14 @@ void WaveformRendererPreroll::paintGL() {
168178
x -= std::ceil((x - limit) / markerLength) * markerLength;
169179
}
170180

171-
drawPattern(x,
172-
halfBreadth - halfMarkerBreadth,
173-
0.f,
174-
m_isSlipRenderer ? halfBreadth : halfBreadth + halfMarkerBreadth,
175-
x / markerLength);
181+
const float repetitions = x / markerLength;
182+
183+
vertexUpdater.addRectangle({x, halfBreadth - halfMarkerBreadth},
184+
{0,
185+
m_isSlipRenderer ? halfBreadth
186+
: halfBreadth + halfMarkerBreadth},
187+
{0.f, 0.f},
188+
{repetitions, m_isSlipRenderer ? 0.5f : 1.f});
176189
}
177190

178191
if (postRollVisible) {
@@ -189,44 +202,19 @@ void WaveformRendererPreroll::paintGL() {
189202
x += std::ceil((limit - x) / markerLength) * markerLength;
190203
}
191204

192-
drawPattern(x,
193-
halfBreadth - halfMarkerBreadth,
194-
end,
195-
m_isSlipRenderer ? halfBreadth : halfBreadth + halfMarkerBreadth,
196-
(end - x) / markerLength);
197-
}
205+
const float repetitions = (end - x) / markerLength;
198206

199-
m_texture.release();
207+
vertexUpdater.addRectangle({x, halfBreadth - halfMarkerBreadth},
208+
{end,
209+
m_isSlipRenderer ? halfBreadth
210+
: halfBreadth + halfMarkerBreadth},
211+
{0.f, 0.f},
212+
{repetitions, m_isSlipRenderer ? 0.5f : 1.f});
213+
}
200214

201-
m_shader.disableAttributeArray(positionLocation);
202-
m_shader.disableAttributeArray(texcoordLocation);
203-
m_shader.release();
204-
}
215+
DEBUG_ASSERT(reserved == vertexUpdater.index());
205216

206-
void WaveformRendererPreroll::drawPattern(
207-
float x1, float y1, float x2, float y2, float repetitions) {
208-
// Draw a large rectangle with a repeating pattern of the texture
209-
const int repetitionsLocation = m_shader.repetitionsLocation();
210-
const int positionLocation = m_shader.positionLocation();
211-
const int texcoordLocation = m_shader.texcoordLocation();
212-
213-
const std::array<float, 8> positionArray = {x1, y1, x2, y1, x1, y2, x2, y2};
214-
const std::array<float, 8> texcoordArray = {0.f,
215-
0.f,
216-
1.f,
217-
0.f,
218-
0.f,
219-
m_isSlipRenderer ? 0.5f : 1.f,
220-
1.f,
221-
m_isSlipRenderer ? 0.5f : 1.f};
222-
m_shader.setUniformValue(repetitionsLocation, QVector2D(repetitions, 1.0));
223-
224-
m_shader.setAttributeArray(
225-
positionLocation, GL_FLOAT, positionArray.data(), 2);
226-
m_shader.setAttributeArray(
227-
texcoordLocation, GL_FLOAT, texcoordArray.data(), 2);
228-
229-
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
217+
return true;
230218
}
231219

232220
} // namespace allshader
+12-16
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,44 @@
11
#pragma once
22

33
#include <QColor>
4-
#include <QImage>
54
#include <memory>
65

7-
#include "rendergraph/openglnode.h"
8-
#include "shaders/patternshader.h"
6+
#include "rendergraph/geometrynode.h"
97
#include "util/class.h"
10-
#include "util/opengltexture2d.h"
11-
#include "waveform/renderers/allshader/vertexdata.h"
12-
#include "waveform/renderers/allshader/waveformrenderer.h"
8+
#include "waveform/renderers/waveformrendererabstract.h"
139

1410
class QDomNode;
1511
class SkinContext;
16-
class QOpenGLTexture;
1712

1813
namespace allshader {
1914
class WaveformRendererPreroll;
2015
}
2116

2217
class allshader::WaveformRendererPreroll final
23-
: public allshader::WaveformRenderer,
24-
public rendergraph::OpenGLNode {
18+
: public ::WaveformRendererAbstract,
19+
public rendergraph::GeometryNode {
2520
public:
2621
explicit WaveformRendererPreroll(
2722
WaveformWidgetRenderer* waveformWidget,
2823
::WaveformRendererAbstract::PositionSource type =
2924
::WaveformRendererAbstract::Play);
3025
~WaveformRendererPreroll() override;
3126

27+
// Pure virtual from WaveformRendererAbstract, not used
28+
void draw(QPainter* painter, QPaintEvent* event) override final;
29+
3230
void setup(const QDomNode& node, const SkinContext& skinContext) override;
33-
void paintGL() override;
34-
void initializeGL() override;
3531

36-
private:
37-
void drawPattern(float x1, float y1, float x2, float y2, float repetitions);
32+
// Virtual for rendergraph::Node
33+
void preprocess() override;
3834

39-
mixxx::PatternShader m_shader;
35+
private:
4036
QColor m_color;
4137
float m_markerBreadth{};
4238
float m_markerLength{};
43-
OpenGLTexture2D m_texture;
44-
4539
bool m_isSlipRenderer;
4640

41+
bool preprocessInner();
42+
4743
DISALLOW_COPY_AND_ASSIGN(WaveformRendererPreroll);
4844
};

Diff for: src/waveform/renderers/waveformwidgetrenderer.cpp

+6-12
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,11 @@ WaveformWidgetRenderer::WaveformWidgetRenderer(const QString& group)
3939
// Really create some to manage those;
4040
m_visualPlayPosition(nullptr),
4141
m_totalVSamples(0),
42-
m_pRateRatioCO(nullptr),
43-
m_pGainControlObject(nullptr),
4442
m_gain(1.0),
45-
m_pTrackSamplesControlObject(nullptr),
46-
m_trackSamples(0),
43+
m_trackSamples(0.0),
4744
m_scaleFactor(1.0),
4845
m_playMarkerPosition(s_defaultPlayMarkerPosition),
46+
m_pContext(nullptr),
4947
m_passthroughEnabled(false) {
5048
//qDebug() << "WaveformWidgetRenderer";
5149
for (int type = ::WaveformRendererAbstract::Play;
@@ -79,10 +77,6 @@ WaveformWidgetRenderer::~WaveformWidgetRenderer() {
7977
delete m_rendererStack[i];
8078
}
8179

82-
delete m_pRateRatioCO;
83-
delete m_pGainControlObject;
84-
delete m_pTrackSamplesControlObject;
85-
8680
#ifdef WAVEFORMWIDGETRENDERER_DEBUG
8781
delete m_timer;
8882
#endif
@@ -93,11 +87,11 @@ bool WaveformWidgetRenderer::init() {
9387

9488
m_visualPlayPosition = VisualPlayPosition::getVisualPlayPosition(m_group);
9589

96-
m_pRateRatioCO = new ControlProxy(
90+
m_pRateRatioCO = std::make_unique<ControlProxy>(
9791
m_group, "rate_ratio");
98-
m_pGainControlObject = new ControlProxy(
92+
m_pGainControlObject = std::make_unique<ControlProxy>(
9993
m_group, "total_gain");
100-
m_pTrackSamplesControlObject = new ControlProxy(
94+
m_pTrackSamplesControlObject = std::make_unique<ControlProxy>(
10195
m_group, "track_samples");
10296

10397
for (int i = 0; i < m_rendererStack.size(); ++i) {
@@ -428,7 +422,7 @@ void WaveformWidgetRenderer::selectStem(mixxx::StemChannelSelection stemMask) {
428422
void WaveformWidgetRenderer::setTrack(TrackPointer track) {
429423
m_pTrack = track;
430424
//used to postpone first display until track sample is actually available
431-
m_trackSamples = -1;
425+
m_trackSamples = -1.0;
432426

433427
for (int i = 0; i < m_rendererStack.size(); ++i) {
434428
m_rendererStack[i]->onSetTrack();

Diff for: src/waveform/renderers/waveformwidgetrenderer.h

+18-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ class VSyncThread;
1515
class QPainter;
1616
class WaveformRendererAbstract;
1717

18+
namespace rendergraph {
19+
class Context;
20+
}
21+
1822
class WaveformWidgetRenderer {
1923
public:
2024
static const double s_waveformMinZoom;
@@ -201,6 +205,14 @@ class WaveformWidgetRenderer {
201205
return m_trackSamples <= 0.0 || m_pos[::WaveformRendererAbstract::Play] == -1;
202206
}
203207

208+
void setContext(rendergraph::Context* pContext) {
209+
m_pContext = pContext;
210+
}
211+
212+
rendergraph::Context* getContext() const {
213+
return m_pContext;
214+
}
215+
204216
protected:
205217
const QString m_group;
206218
TrackPointer m_pTrack;
@@ -231,14 +243,17 @@ class WaveformWidgetRenderer {
231243
QSharedPointer<VisualPlayPosition> m_visualPlayPosition;
232244
int m_posVSample[2];
233245
int m_totalVSamples;
234-
ControlProxy* m_pRateRatioCO;
235-
ControlProxy* m_pGainControlObject;
246+
std::unique_ptr<ControlProxy> m_pRateRatioCO;
247+
std::unique_ptr<ControlProxy> m_pGainControlObject;
248+
std::unique_ptr<ControlProxy> m_pTrackSamplesControlObject;
236249
double m_gain;
237-
ControlProxy* m_pTrackSamplesControlObject;
238250
double m_trackSamples;
239251
double m_scaleFactor;
240252
double m_playMarkerPosition; // 0.0 - left, 0.5 - center, 1.0 - right
241253

254+
// used by allshader waveformrenderers when used with rendergraph nodes
255+
rendergraph::Context* m_pContext;
256+
242257
#ifdef WAVEFORMWIDGETRENDERER_DEBUG
243258
PerformanceTimer* m_timer;
244259
int m_lastFrameTime;

0 commit comments

Comments
 (0)