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-
1713namespace libprojectM {
1814namespace MilkdropPreset {
1915
2016Waveform::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
3922void 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
0 commit comments