Skip to content

Commit 4ff86c1

Browse files
committed
Use Mesh class in Waveform effect
1 parent 62e451e commit 4ff86c1

19 files changed

+86
-90
lines changed

src/libprojectM/MilkdropPreset/Waveform.cpp

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,16 @@
77

88
#include <projectM-opengl.h>
99

10-
#include <Audio/AudioConstants.hpp>
11-
1210
#include <algorithm>
1311
#include <cmath>
1412

15-
using libprojectM::Renderer::RenderItem;
16-
1713
namespace libprojectM {
1814
namespace MilkdropPreset {
1915

2016
Waveform::Waveform(PresetState& presetState)
21-
: RenderItem()
22-
, m_presetState(presetState)
17+
: m_presetState(presetState)
18+
, m_waveMesh(Renderer::VertexBufferUsage::StreamDraw)
2319
{
24-
RenderItem::Init();
25-
}
26-
27-
void Waveform::InitVertexAttrib()
28-
{
29-
glEnableVertexAttribArray(0);
30-
glDisableVertexAttribArray(1);
31-
32-
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
33-
34-
std::vector<Point> vertexData;
35-
vertexData.resize(std::max(libprojectM::Audio::SpectrumSamples, libprojectM::Audio::WaveformSamples) * 2 + 2);
36-
glBufferData(GL_ARRAY_BUFFER, sizeof(Point) * vertexData.size(), vertexData.data(), GL_STREAM_DRAW);
3720
}
3821

3922
void Waveform::Draw(const PerFrameContext& presetPerFrameContext)
@@ -58,9 +41,6 @@ void Waveform::Draw(const PerFrameContext& presetPerFrameContext)
5841
shader->Bind();
5942
shader->SetUniformMat4x4("vertex_transformation", PresetState::orthogonalProjection);
6043

61-
glBindVertexArray(m_vaoID);
62-
glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
63-
6444
// Additive wave drawing (vice overwrite)
6545
glEnable(GL_BLEND);
6646
if (m_presetState.additiveWaves)
@@ -90,7 +70,11 @@ void Waveform::Draw(const PerFrameContext& presetPerFrameContext)
9070
const auto incrementX = 2.0f / static_cast<float>(m_presetState.renderContext.viewportSizeX);
9171
const auto incrementY = 2.0f / static_cast<float>(m_presetState.renderContext.viewportSizeY);
9272

93-
GLuint drawType = m_presetState.waveDots ? GL_POINTS : (m_waveformMath->IsLoop() ? GL_LINE_LOOP : GL_LINE_STRIP);
73+
m_waveMesh.SetRenderPrimitiveType(m_presetState.waveDots
74+
? Renderer::Mesh::PrimitiveType::Points
75+
: m_waveformMath->IsLoop()
76+
? Renderer::Mesh::PrimitiveType::LineLoop
77+
: Renderer::Mesh::PrimitiveType::LineStrip);
9478

9579
// If thick outline is used, draw the shape four times with slight offsets
9680
// (top left, top right, bottom right, bottom left).
@@ -104,35 +88,36 @@ void Waveform::Draw(const PerFrameContext& presetPerFrameContext)
10488
case 1:
10589
for (auto j = 0U; j < smoothedWave.size(); j++)
10690
{
107-
smoothedWave[j].x += incrementX;
91+
smoothedWave[j].SetX(smoothedWave[j].X() + incrementX);
10892
}
10993
break;
11094

11195
case 2:
11296
for (auto j = 0U; j < smoothedWave.size(); j++)
11397
{
114-
smoothedWave[j].y += incrementY;
98+
smoothedWave[j].SetY(smoothedWave[j].Y() + incrementY);
11599
}
116100
break;
117101

118102
case 3:
119103
for (auto j = 0U; j < smoothedWave.size(); j++)
120104
{
121-
smoothedWave[j].x -= incrementX;
105+
smoothedWave[j].SetX(smoothedWave[j].X() - incrementX);
122106
}
123107
break;
124108
}
125109

126-
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Point) * smoothedWave.size(), smoothedWave.data());
127-
glDrawArrays(drawType, 0, static_cast<GLsizei>(smoothedWave.size()));
110+
m_waveMesh.Vertices().Set(smoothedWave);
111+
m_waveMesh.Indices().Resize(smoothedWave.size());
112+
m_waveMesh.Indices().MakeContinuous();
113+
m_waveMesh.Update();
114+
m_waveMesh.Draw();
128115
}
129116
}
130117

131118
glDisable(GL_BLEND);
132119

133-
glBindBuffer(GL_ARRAY_BUFFER, 0);
134-
glBindVertexArray(0);
135-
120+
Renderer::Mesh::Unbind();
136121
Renderer::Shader::Unbind();
137122
}
138123

src/libprojectM/MilkdropPreset/Waveform.hpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
#pragma once
22

3-
#include "Constants.hpp"
43
#include "WaveformMode.hpp"
54

65
#include "Waveforms/WaveformMath.hpp"
76

8-
#include <Renderer/RenderItem.hpp>
7+
#include <Renderer/Mesh.hpp>
98

109
#include <memory>
1110
#include <vector>
@@ -16,30 +15,27 @@ namespace MilkdropPreset {
1615
class PresetState;
1716
class PerFrameContext;
1817

19-
class Waveform : public Renderer::RenderItem
18+
class Waveform
2019
{
2120
public:
2221
explicit Waveform(PresetState& presetState);
2322

2423
void Draw(const PerFrameContext& presetPerFrameContext);
2524

26-
void InitVertexAttrib() override;
27-
2825
private:
2926
void MaximizeColors(const PerFrameContext& presetPerFrameContext);
3027
void ModulateOpacityByVolume(const PerFrameContext& presetPerFrameContext);
3128

3229
PresetState& m_presetState; //!< The preset state.
3330

31+
Renderer::Mesh m_waveMesh;
32+
3433
WaveformMode m_mode{WaveformMode::Circle}; //!< Line drawing mode.
3534

3635
std::unique_ptr<Waveforms::WaveformMath> m_waveformMath; //!< The waveform vertex math implementation.
3736

3837
float m_tempAlpha{0.0f}; //!< Calculated alpha value.
3938
int m_samples{}; //!< Number of samples in the current waveform. Depends on the mode.
40-
41-
std::vector<Point> m_wave1Vertices;
42-
std::vector<Point> m_wave2Vertices;
4339
};
4440

4541
} // namespace MilkdropPreset

src/libprojectM/MilkdropPreset/Waveforms/CenteredSpiro.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ void CenteredSpiro::GenerateVertices(const PresetState&, const PerFrameContext&)
1515

1616
for (int i = 0; i < m_samples; i++)
1717
{
18-
m_wave1Vertices[i].x = m_pcmDataR[i] * m_aspectY + m_waveX;
19-
m_wave1Vertices[i].y = m_pcmDataL[i + 32] * m_aspectX + m_waveY;
18+
m_wave1Vertices[i] = {m_pcmDataR[i] * m_aspectY + m_waveX,
19+
m_pcmDataL[i + 32] * m_aspectX + m_waveY};
2020
}
2121
}
2222

src/libprojectM/MilkdropPreset/Waveforms/Circle.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@ void Circle::GenerateVertices(const PresetState& presetState,
4141
radius = radius2 * (1.0f - mix) + radius * (mix);
4242
}
4343

44-
m_wave1Vertices[i].x = radius * cosf(angle) * m_aspectY + m_waveX;
45-
m_wave1Vertices[i].y = radius * sinf(angle) * m_aspectX + m_waveY;
44+
m_wave1Vertices[i] = {
45+
radius * cosf(angle) * m_aspectY + m_waveX,
46+
radius * sinf(angle) * m_aspectX + m_waveY};
4647
}
4748
}
4849

src/libprojectM/MilkdropPreset/Waveforms/DerivativeLine.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,16 @@ void DerivativeLine::GenerateVertices(const PresetState& presetState, const PerF
3434
for (int i = 0; i < m_samples; i++)
3535
{
3636
assert((i + 25 + sampleOffset) < 512);
37-
m_wave1Vertices[i].x = -1.0f + 2.0f * (static_cast<float>(i) * inverseSamples) + m_waveX;
38-
m_wave1Vertices[i].y = m_pcmDataL[i + sampleOffset] * 0.47f + m_waveY;
39-
m_wave1Vertices[i].x += m_pcmDataR[i + 25 + sampleOffset] * 0.44f;
37+
const float x = -1.0f + 2.0f * (static_cast<float>(i) * inverseSamples) + m_waveX + m_pcmDataR[i + 25 + sampleOffset] * 0.44f;
38+
const float y = m_pcmDataL[i + sampleOffset] * 0.47f + m_waveY;
39+
m_wave1Vertices[i] = {x, y};
4040

4141
// Momentum
4242
if (i > 1)
4343
{
44-
m_wave1Vertices[i].x = m_wave1Vertices[i].x * w2 + w1 * (m_wave1Vertices[i - 1].x * 2.0f - m_wave1Vertices[i - 2].x);
45-
m_wave1Vertices[i].y = m_wave1Vertices[i].y * w2 + w1 * (m_wave1Vertices[i - 1].y * 2.0f - m_wave1Vertices[i - 2].y);
44+
m_wave1Vertices[i] = {
45+
x * w2 + w1 * (m_wave1Vertices[i - 1].X() * 2.0f - m_wave1Vertices[i - 2].X()),
46+
y * w2 + w1 * (m_wave1Vertices[i - 1].Y() * 2.0f - m_wave1Vertices[i - 2].Y())};
4647
}
4748
}
4849
}

src/libprojectM/MilkdropPreset/Waveforms/DoubleLine.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,17 @@ void DoubleLine::GenerateVertices(const PresetState& presetState, const PerFrame
2525
float const separation = powf(m_waveY * 0.5f + 0.5f, 2.0f);
2626
for (int i = 0; i < m_samples; i++)
2727
{
28-
m_wave1Vertices[i].x = m_edgeX + m_distanceX * static_cast<float>(i) +
29-
m_perpetualDX * (0.25f * m_pcmDataL[i + m_sampleOffset] + separation);
30-
m_wave1Vertices[i].y = m_edgeY + m_distanceY * static_cast<float>(i) +
31-
m_perpetualDY * (0.25f * m_pcmDataL[i + m_sampleOffset] + separation);
32-
33-
m_wave2Vertices[i].x = m_edgeX + m_distanceX * static_cast<float>(i) +
34-
m_perpetualDX * (0.25f * m_pcmDataR[i + m_sampleOffset] - separation);
35-
m_wave2Vertices[i].y = m_edgeY + m_distanceY * static_cast<float>(i) +
36-
m_perpetualDY * (0.25f * m_pcmDataR[i + m_sampleOffset] - separation);
28+
m_wave1Vertices[i] = {
29+
m_edgeX + m_distanceX * static_cast<float>(i) +
30+
m_perpetualDX * (0.25f * m_pcmDataL[i + m_sampleOffset] + separation),
31+
m_edgeY + m_distanceY * static_cast<float>(i) +
32+
m_perpetualDY * (0.25f * m_pcmDataL[i + m_sampleOffset] + separation)};
33+
34+
m_wave2Vertices[i] = {
35+
m_edgeX + m_distanceX * static_cast<float>(i) +
36+
m_perpetualDX * (0.25f * m_pcmDataR[i + m_sampleOffset] - separation),
37+
m_edgeY + m_distanceY * static_cast<float>(i) +
38+
m_perpetualDY * (0.25f * m_pcmDataR[i + m_sampleOffset] - separation)};
3739
}
3840
}
3941

src/libprojectM/MilkdropPreset/Waveforms/ExplosiveHash.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ void ExplosiveHash::GenerateVertices(const PresetState& presetState, const PerFr
2121
{
2222
const float x0 = (m_pcmDataR[i] * m_pcmDataL[i + 32] + m_pcmDataL[i] * m_pcmDataR[i + 32]);
2323
const float y0 = (m_pcmDataR[i] * m_pcmDataR[i] - m_pcmDataL[i + 32] * m_pcmDataL[i + 32]);
24-
m_wave1Vertices[i].x = ((x0 * cosineRotation - y0 * sineRotation) * m_aspectY) + m_waveX;
25-
m_wave1Vertices[i].y = ((x0 * sineRotation + y0 * cosineRotation) * m_aspectX) + m_waveY;
24+
m_wave1Vertices[i] = {
25+
(x0 * cosineRotation - y0 * sineRotation) * m_aspectY + m_waveX,
26+
(x0 * sineRotation + y0 * cosineRotation) * m_aspectX + m_waveY};
2627
}
2728
}
2829

src/libprojectM/MilkdropPreset/Waveforms/Line.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ void Line::GenerateVertices(const PresetState& presetState, const PerFrameContex
2121

2222
for (int i = 0; i < m_samples; i++)
2323
{
24-
m_wave1Vertices[i].x = m_edgeX + m_distanceX * static_cast<float>(i) + m_perpetualDX * 0.25f * m_pcmDataL[i + m_sampleOffset];
25-
m_wave1Vertices[i].y = m_edgeY + m_distanceY * static_cast<float>(i) + m_perpetualDY * 0.25f * m_pcmDataL[i + m_sampleOffset];
24+
m_wave1Vertices[i] = {
25+
m_edgeX + m_distanceX * static_cast<float>(i) + m_perpetualDX * 0.25f * m_pcmDataL[i + m_sampleOffset],
26+
m_edgeY + m_distanceY * static_cast<float>(i) + m_perpetualDY * 0.25f * m_pcmDataL[i + m_sampleOffset]};
2627
}
2728
}
2829

src/libprojectM/MilkdropPreset/Waveforms/Milkdrop2077Wave11.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ void Milkdrop2077Wave11::GenerateVertices(const PresetState& presetState, const
2323

2424
for (int i = 0; i < m_samples; i++)
2525
{
26-
m_wave1Vertices[i].x = m_edgeX - 0.45f + m_distanceX * static_cast<float>(i) + m_perpetualDX * 0.35f * m_pcmDataL[i + m_sampleOffset];
27-
m_wave1Vertices[i].y = m_edgeY + m_distanceY * static_cast<float>(i) + m_perpetualDY * 0.35f * m_pcmDataL[i + m_sampleOffset];
28-
m_wave2Vertices[i].x = m_edgeX + 0.45f + m_distanceX * static_cast<float>(i) + m_perpetualDX * 0.35f * m_pcmDataR[i + m_sampleOffset];
29-
m_wave2Vertices[i].y = m_edgeY + m_distanceY * static_cast<float>(i) + m_perpetualDY * 0.35f * m_pcmDataR[i + m_sampleOffset];
26+
m_wave1Vertices[i] = {
27+
m_edgeX - 0.45f + m_distanceX * static_cast<float>(i) + m_perpetualDX * 0.35f * m_pcmDataL[i + m_sampleOffset],
28+
m_edgeY + m_distanceY * static_cast<float>(i) + m_perpetualDY * 0.35f * m_pcmDataL[i + m_sampleOffset]};
29+
m_wave2Vertices[i] = {
30+
m_edgeX + 0.45f + m_distanceX * static_cast<float>(i) + m_perpetualDX * 0.35f * m_pcmDataR[i + m_sampleOffset],
31+
m_edgeY + m_distanceY * static_cast<float>(i) + m_perpetualDY * 0.35f * m_pcmDataR[i + m_sampleOffset]};
3032
}
3133
}
3234

src/libprojectM/MilkdropPreset/Waveforms/Milkdrop2077Wave9.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ void Milkdrop2077Wave9::GenerateVertices(const PresetState& presetState, const P
2222

2323
for (int i = 0; i < m_samples; i++)
2424
{
25-
m_wave1Vertices[i].x = m_edgeX + m_distanceX * static_cast<float>(i) + m_perpetualDX * 0.35f * m_pcmDataL[i + m_sampleOffset];
26-
m_wave1Vertices[i].y = m_edgeY + m_distanceY * static_cast<float>(i) + m_perpetualDY * 0.35f * m_pcmDataL[i + m_sampleOffset];
25+
m_wave1Vertices[i] = {
26+
m_edgeX + m_distanceX * static_cast<float>(i) + m_perpetualDX * 0.35f * m_pcmDataL[i + m_sampleOffset],
27+
m_edgeY + m_distanceY * static_cast<float>(i) + m_perpetualDY * 0.35f * m_pcmDataL[i + m_sampleOffset]};
2728
}
2829
}
2930

0 commit comments

Comments
 (0)