/* ============================================================================== FilterView.cpp Created: 16 Jan 2026 5:06:31pm Author: esca ============================================================================== */ #include #include "FilterView.h" #include "BinaryData.h" #include "OpenGLUtils.h" #include "juce_opengl/juce_opengl.h" #include "juce_opengl/opengl/juce_gl.h" //============================================================================== FilterView::FilterView() { cutoff = &tempcutoff; mix = &tempmix; //generate filter arrays for first time for(unsigned int i=0; irelease(); shaderProgramFilterFill->release(); shaderProgramBackground->release(); // ctx.detach(); //failing here } void FilterView::genFilterArrays(){ int i = 0; float yposition = *mix; for(Vertex &v : filterVertices){ float xposition = (float)i/FILTERVIEW_SAMPLECOUNT; float deltaCutoff = xposition-*cutoff; v.position[0] = xposition; if(deltaCutoff>0){ v.position[1] = yposition-5*(deltaCutoff*deltaCutoff); if(v.position[1]<0){ v.position[1]=0; } } else v.position[1] = yposition; i++; } vScale(filterVertices, 2, 2); vTransform(filterVertices, -1, -1); genFilterFillArrays(); } void FilterView::genFilterFillArrays(){ for(unsigned int i = 0; iaddVertexShader(vertexShaderBackground); shaderProgramBackground->addFragmentShader(fragmentShaderBackground); shaderProgramBackground->link(); shaderProgramBackground->use(); shaderProgramFilterFill.reset(new juce::OpenGLShaderProgram(ctx)); shaderProgramFilterFill->addVertexShader(vertexShaderFilterFill); shaderProgramFilterFill->addFragmentShader(fragmentShaderFilterFill); shaderProgramFilterFill->link(); shaderProgramFilterFill->use(); shaderProgramFilter.reset(new juce::OpenGLShaderProgram(ctx)); shaderProgramFilter->addVertexShader(vertexShaderFilter); shaderProgramFilter->addFragmentShader(fragmentShaderFilter); shaderProgramFilter->link(); shaderProgramFilter->use(); } void FilterView::renderOpenGL(){ juce::gl::glLineWidth(2.5f); juce::OpenGLHelpers::clear(juce::Colours::black); ctx.extensions.glBindBuffer(juce::gl::GL_ARRAY_BUFFER, vboBackground); ctx.extensions.glBindBuffer(juce::gl::GL_ELEMENT_ARRAY_BUFFER, iboBackground); //RENDER BACKGROUND shaderProgramBackground->use(); bgTexture.bind(); juce::gl::glEnable(juce::gl::GL_BLEND); juce::gl::glBlendFunc(juce::gl::GL_SRC_ALPHA, juce::gl::GL_ONE_MINUS_SRC_ALPHA); ctx.extensions.glVertexAttribPointer(0, 2, juce::gl::GL_FLOAT, juce::gl::GL_FALSE, sizeof(VertexTexture), nullptr); ctx.extensions.glEnableVertexAttribArray(0); ctx.extensions.glVertexAttribPointer(1, 4, juce::gl::GL_FLOAT, juce::gl::GL_FALSE, sizeof(VertexTexture), (GLvoid*)(sizeof(float)*2)); ctx.extensions.glEnableVertexAttribArray(1); ctx.extensions.glVertexAttribPointer(2, 2, juce::gl::GL_FLOAT, juce::gl::GL_FALSE, sizeof(VertexTexture), (GLvoid*)(sizeof(float)*6)); ctx.extensions.glEnableVertexAttribArray(2); juce::gl::glDrawElements(juce::gl::GL_TRIANGLES, backgroundIndices.size(), juce::gl::GL_UNSIGNED_INT, nullptr); //RENDER FILTER FILL ctx.extensions.glBindBuffer(juce::gl::GL_ARRAY_BUFFER, vboFilterFill); ctx.extensions.glBindBuffer(juce::gl::GL_ELEMENT_ARRAY_BUFFER, iboFilterFill); shaderProgramFilterFill->use(); ctx.extensions.glVertexAttribPointer(0, 2, juce::gl::GL_FLOAT, juce::gl::GL_FALSE, sizeof(Vertex), nullptr); ctx.extensions.glEnableVertexAttribArray(2); ctx.extensions.glVertexAttribPointer(1, 4, juce::gl::GL_FLOAT, juce::gl::GL_FALSE, sizeof(Vertex), (GLvoid*)(sizeof(float)*2)); ctx.extensions.glEnableVertexAttribArray(3); juce::gl::glDrawElements(juce::gl::GL_TRIANGLES, filterBackgroundIndices.size(), juce::gl::GL_UNSIGNED_INT, nullptr); //RENDER FILTER ctx.extensions.glBindBuffer(juce::gl::GL_ARRAY_BUFFER, vboFilter); ctx.extensions.glBindBuffer(juce::gl::GL_ELEMENT_ARRAY_BUFFER, iboFilter); shaderProgramFilter->use(); ctx.extensions.glVertexAttribPointer(0, 2, juce::gl::GL_FLOAT, juce::gl::GL_FALSE, sizeof(Vertex), nullptr); ctx.extensions.glEnableVertexAttribArray(2); ctx.extensions.glVertexAttribPointer(1, 4, juce::gl::GL_FLOAT, juce::gl::GL_FALSE, sizeof(Vertex), (GLvoid*)(sizeof(float)*2)); ctx.extensions.glEnableVertexAttribArray(3); juce::gl::glDrawElements(juce::gl::GL_LINE_STRIP, filterIndices.size(), juce::gl::GL_UNSIGNED_INT, nullptr); } void FilterView::openGLContextClosing(){ }