#pragma once #include #include "VisualiserSettings.h" #include "../audio/SampleRateManager.h" struct Texture { GLuint id; int width; int height; }; class VisualiserOpenGLComponent : public juce::Component, public juce::OpenGLRenderer { public: VisualiserOpenGLComponent(VisualiserSettings& settings, SampleRateManager& sampleRateManager); ~VisualiserOpenGLComponent() override; void newOpenGLContextCreated() override; void renderOpenGL() override; void openGLContextClosing() override; void resized() override; void updateBuffer(std::vector& buffer); private: juce::OpenGLContext openGLContext; float renderScale = 1.0f; GLuint quadIndexBuffer = 0; GLuint vertexIndexBuffer = 0; GLuint vertexBuffer = 0; int nPoints = 0; int nEdges = 0; juce::CriticalSection samplesLock; bool needsReattach = true; std::vector samples = std::vector(2); std::vector scratchVertices; std::vector fullScreenQuad; GLuint frameBuffer = 0; Texture lineTexture; Texture blur1Texture; Texture blur2Texture; Texture blur3Texture; Texture blur4Texture; juce::OpenGLTexture screenOpenGLTexture; Texture screenTexture; std::optional targetTexture = std::nullopt; std::unique_ptr simpleShader; std::unique_ptr texturedShader; std::unique_ptr blurShader; std::unique_ptr lineShader; std::unique_ptr outputShader; juce::OpenGLShaderProgram* currentShader; VisualiserSettings& settings; SampleRateManager& sampleRateManager; float fadeAmount; Texture makeTexture(int width, int height); void setupArrays(int num_points); void setupTextures(); void drawLineTexture(std::vector& points); void saveTextureToFile(GLuint textureID, int width, int height, const juce::File& file); void activateTargetTexture(std::optional texture); void setShader(juce::OpenGLShaderProgram* program); void drawTexture(std::optional texture0, std::optional texture1 = std::nullopt, std::optional texture2 = std::nullopt, std::optional texture3 = std::nullopt); void setAdditiveBlending(); void setNormalBlending(); void drawLine(std::vector& points); void fade(); void drawCRT(); void checkGLErrors(const juce::String& location); void viewportChanged(); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VisualiserOpenGLComponent) };