diff --git a/src/libprojectM/Audio/AudioConstants.hpp b/src/libprojectM/Audio/AudioConstants.hpp new file mode 100644 index 000000000..7e4f18a14 --- /dev/null +++ b/src/libprojectM/Audio/AudioConstants.hpp @@ -0,0 +1,10 @@ +#pragma once + +namespace libprojectM { +namespace Audio { + +static constexpr int WaveformSamples = 576; //!< Number of waveform data samples available for rendering a frame. +static constexpr int SpectrumSamples = 512; //!< Number of spectrum analyzer samples. + +} // namespace Audio +} // namespace libprojectM diff --git a/src/libprojectM/Audio/BeatDetect.cpp b/src/libprojectM/Audio/BeatDetect.cpp index 5343116f5..68c3797bb 100755 --- a/src/libprojectM/Audio/BeatDetect.cpp +++ b/src/libprojectM/Audio/BeatDetect.cpp @@ -67,6 +67,27 @@ auto BeatDetect::GetPCMScale() const noexcept -> float } +auto BeatDetect::GetFrameAudioData() const -> FrameAudioData +{ + FrameAudioData data{}; + + pcm.GetPcm(data.waveformLeft.data(), CHANNEL_L, WaveformSamples); + pcm.GetPcm(data.waveformRight.data(), CHANNEL_R, WaveformSamples); + pcm.GetSpectrum(data.spectrumLeft.data(), CHANNEL_L, SpectrumSamples); + + data.vol = vol; + data.volAtt = volAtt; + + data.bass = bass; + data.bassAtt = bassAtt; + data.mid = mid; + data.midAtt = midAtt; + data.treb = treb; + data.trebAtt = trebAtt; + + return data; +} + auto BeatDetect::CalculateBeatStatistics() -> void { volOld = vol; @@ -115,6 +136,7 @@ auto BeatDetect::CalculateBeatStatistics() -> void } + auto BeatDetect::LowPassFilter::Update(float nextValue) noexcept -> void { m_current -= m_buffer[m_bufferPos] / bufferLength; diff --git a/src/libprojectM/Audio/BeatDetect.hpp b/src/libprojectM/Audio/BeatDetect.hpp index ff1ba5647..c0a8bef61 100755 --- a/src/libprojectM/Audio/BeatDetect.hpp +++ b/src/libprojectM/Audio/BeatDetect.hpp @@ -23,6 +23,7 @@ */ #pragma once +#include "FrameAudioData.hpp" #include "PCM.hpp" #include @@ -50,6 +51,13 @@ public: [[nodiscard]] auto GetPCMScale() const noexcept -> float; + /** + * @brief Returns a filled FrameAudioData structure for the current frame. + * @return A FrameAudioData structure with waveform, spectrum beat detection data. + */ + [[nodiscard]] + auto GetFrameAudioData() const -> FrameAudioData; + float beatSensitivity{1.f}; float treb{0.f}; diff --git a/src/libprojectM/Audio/FrameAudioData.hpp b/src/libprojectM/Audio/FrameAudioData.hpp index 28c786735..0cd56e2be 100644 --- a/src/libprojectM/Audio/FrameAudioData.hpp +++ b/src/libprojectM/Audio/FrameAudioData.hpp @@ -6,7 +6,7 @@ */ #pragma once -#include "Constants.hpp" +#include "AudioConstants.hpp" #include diff --git a/src/libprojectM/CMakeLists.txt b/src/libprojectM/CMakeLists.txt index 124d10a35..4d066a685 100644 --- a/src/libprojectM/CMakeLists.txt +++ b/src/libprojectM/CMakeLists.txt @@ -47,7 +47,7 @@ add_library(projectM_main OBJECT resource.h wipemalloc.cpp wipemalloc.h - ) + Audio/AudioConstants.hpp) target_link_libraries(projectM_main PUBLIC diff --git a/src/libprojectM/MilkdropPreset/BlurTexture.cpp b/src/libprojectM/MilkdropPreset/BlurTexture.cpp index b4b8a18d2..0075892c6 100644 --- a/src/libprojectM/MilkdropPreset/BlurTexture.cpp +++ b/src/libprojectM/MilkdropPreset/BlurTexture.cpp @@ -1,6 +1,6 @@ #include "BlurTexture.hpp" -#include +#include #include diff --git a/src/libprojectM/MilkdropPreset/Border.cpp b/src/libprojectM/MilkdropPreset/Border.cpp index 3d888c1d9..e43f8a0e2 100644 --- a/src/libprojectM/MilkdropPreset/Border.cpp +++ b/src/libprojectM/MilkdropPreset/Border.cpp @@ -2,8 +2,9 @@ #include -Border::Border() +Border::Border(PresetState& presetState) : RenderItem() + , m_presetState(presetState) { RenderItem::Init(); } @@ -11,54 +12,60 @@ Border::Border() void Border::InitVertexAttrib() { glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*) 0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr); glDisableVertexAttribArray(1); } -void Border::Draw(RenderContext& context) +void Border::Draw(const PerFrameContext& presetPerFrameContext) { - //Draw Borders - float of = outer_size * .5; - float iff = inner_size * .5; - float texof = 1.0 - of; + // Draw Borders + float const outerBorderSize = static_cast(*presetPerFrameContext.ob_size) * .5f; + float const innerBorderSize = static_cast(*presetPerFrameContext.ib_size) * .5f; + float const texelOffset = 1.0f - outerBorderSize; - float points[40] = { + std::array, 10> const points = {{ // Outer - 0, 0, of, 0, - 0, 1, of, texof, - 1, 1, texof, texof, - 1, 0, texof, of, - of, 0, of, of, + {0.0f, 0.0f, outerBorderSize, 0.0f}, + {0.0f, 1.0f, outerBorderSize, texelOffset}, + {1.0f, 1.0f, texelOffset, texelOffset}, + {1.0f, 0.0f, texelOffset, outerBorderSize}, + {outerBorderSize, 0.0f, outerBorderSize, outerBorderSize}, // Inner - of, of, of + iff, of, - of, texof, of + iff, texof - iff, - texof, texof, texof - iff, texof - iff, - texof, of, texof - iff, of + iff, - of + iff, of, of + iff, of + iff, - }; + {outerBorderSize, outerBorderSize, outerBorderSize + innerBorderSize, outerBorderSize}, + {outerBorderSize, texelOffset, outerBorderSize + innerBorderSize, texelOffset - innerBorderSize}, + {texelOffset, texelOffset, texelOffset - innerBorderSize, texelOffset - innerBorderSize}, + {texelOffset, outerBorderSize, texelOffset - innerBorderSize, outerBorderSize + innerBorderSize}, + {outerBorderSize + innerBorderSize, outerBorderSize, outerBorderSize + innerBorderSize, outerBorderSize + innerBorderSize}, + }}; glBindBuffer(GL_ARRAY_BUFFER, m_vboID); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 40, NULL, GL_DYNAMIC_DRAW); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 40, points, GL_DYNAMIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 40, points.data(), GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); - glUseProgram(context.programID_v2f_c4f); + m_presetState.untexturedShader.Bind(); + m_presetState.untexturedShader.SetUniformMat4x4("vertex_transformation", m_presetState.orthogonalProjection); - glUniformMatrix4fv(context.uniform_v2f_c4f_vertex_transformation, 1, GL_FALSE, glm::value_ptr(context.mat_ortho)); + glVertexAttrib4f(1, + static_cast(*presetPerFrameContext.ob_r), + static_cast(*presetPerFrameContext.ob_g), + static_cast(*presetPerFrameContext.ob_b), + static_cast(*presetPerFrameContext.ob_a)); - glVertexAttrib4f(1, outer_r, outer_g, outer_b, outer_a * masterAlpha); - - //no additive drawing for borders + // No additive drawing for borders glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBindVertexArray(m_vaoID); glDrawArrays(GL_TRIANGLE_STRIP, 0, 10); - glVertexAttrib4f(1, inner_r, inner_g, inner_b, inner_a * masterAlpha); + glVertexAttrib4f(1, + static_cast(*presetPerFrameContext.ib_r), + static_cast(*presetPerFrameContext.ib_g), + static_cast(*presetPerFrameContext.ib_b), + static_cast(*presetPerFrameContext.ib_a)); // 1st pass for inner glDrawArrays(GL_TRIANGLE_STRIP, 10, 10); diff --git a/src/libprojectM/MilkdropPreset/Border.hpp b/src/libprojectM/MilkdropPreset/Border.hpp index c27f2f2d4..e71ab532f 100644 --- a/src/libprojectM/MilkdropPreset/Border.hpp +++ b/src/libprojectM/MilkdropPreset/Border.hpp @@ -1,5 +1,8 @@ #pragma once +#include "PerFrameContext.hpp" +#include "PresetState.hpp" + #include "Renderer/RenderItem.hpp" /** @@ -8,29 +11,18 @@ class Border : public RenderItem { public: + Border() = delete; - /** - * Constructor. Initializes the required OpenGL data structures. - */ - Border(); + explicit Border(PresetState& presetState); - void InitVertexAttrib(); + void InitVertexAttrib() override; /** * Draws the border. - * @param context The render context data. + * @param presetPerFrameContext The per-frame context variables. */ - void Draw(RenderContext &context); + void Draw(const PerFrameContext& presetPerFrameContext); - float outer_size{ 0.0 }; //!< Outer border width - float outer_r{ 0.0 }; //!< Outer border color, red channel. - float outer_g{ 0.0 }; //!< Outer border color, green channel. - float outer_b{ 0.0 }; //!< Outer border color, blue channel. - float outer_a{ 0.0 }; //!< Outer border color, alpha channel. - - float inner_size{ 0.0 }; //!< Inner border width - float inner_r{ 0.0 }; //!< Inner border color, red channel. - float inner_g{ 0.0 }; //!< Inner border color, green channel. - float inner_b{ 0.0 }; //!< Inner border color, blue channel. - float inner_a{ 0.0 }; //!< Inner border color, alpha channel. +private: + PresetState& m_presetState; //!< The global preset state. }; diff --git a/src/libprojectM/MilkdropPreset/Constants.hpp b/src/libprojectM/MilkdropPreset/Constants.hpp index ee121b7d5..0229601f1 100644 --- a/src/libprojectM/MilkdropPreset/Constants.hpp +++ b/src/libprojectM/MilkdropPreset/Constants.hpp @@ -4,14 +4,13 @@ */ #pragma once +#include