/* ============================================================================== CrushView.cpp Created: 16 Jan 2026 5:05:38pm Author: esca ============================================================================== */ #include #include "CrushView.h" #include "BinaryData.h" #include "OpenGLUtils.h" #include "juce_opengl/juce_opengl.h" #include "juce_opengl/opengl/juce_gl.h" //============================================================================== CrushView::CrushView() { float startingColour[4] = {128.0f, 255.0f, 255.0f, 255.0f}; waveform = generateSineWave(CRUSHVIEW_SAMPLECOUNT, 0, startingColour); distortedWaveform = waveform; vScale(distortedWaveform, 2, 0.75); vTransform(distortedWaveform, -1, 0); for(int i = 0; irelease(); shaderProgramBackground->release(); ctx.detach(); } void CrushView::distortWaveForm(int samplerate){ Vertex lastVertex; int lastMultiplier = 0; for (int i = 0; i>waveform.size(); i++){ if(floor((float)i/samplerate)>lastMultiplier){ lastMultiplier = floor((float)i/samplerate); lastVertex = waveform[i]; } distortedWaveform[i] = lastVertex; } } void CrushView::paint (juce::Graphics& g) { ctx.triggerRepaint(); } void CrushView::resized() { } //OPENGL STUFF void CrushView::newOpenGLContextCreated(){ background = juce::ImageCache::getFromMemory(BinaryData::panel_png, BinaryData::panel_pngSize); bgTexture.loadImage(background); ctx.extensions.glGenBuffers(1, &vboBackground); ctx.extensions.glGenBuffers(1, &iboBackground); ctx.extensions.glGenBuffers(1, &vbo); ctx.extensions.glGenBuffers(1, &ibo); ctx.extensions.glBindBuffer(juce::gl::GL_ARRAY_BUFFER, vboBackground); ctx.extensions.glBufferData(juce::gl::GL_ARRAY_BUFFER, sizeof(VertexTexture)*backgroundVertices.size(), backgroundVertices.data(), juce::gl::GL_STATIC_DRAW); ctx.extensions.glBindBuffer(juce::gl::GL_ELEMENT_ARRAY_BUFFER, iboBackground); ctx.extensions.glBufferData(juce::gl::GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * backgroundIndices.size(), backgroundIndices.data(), juce::gl::GL_STATIC_DRAW); ctx.extensions.glBindBuffer(juce::gl::GL_ARRAY_BUFFER, vbo); //bind vertex buffer objects ctx.extensions.glBufferData(juce::gl::GL_ARRAY_BUFFER, sizeof(Vertex)*distortedWaveform.size(), distortedWaveform.data(), juce::gl::GL_STATIC_DRAW); ctx.extensions.glBindBuffer(juce::gl::GL_ELEMENT_ARRAY_BUFFER, ibo); ctx.extensions.glBufferData(juce::gl::GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * indices.size(), indices.data(), juce::gl::GL_STATIC_DRAW); //SHADERS vertexShader = VERTEXSHADER; fragmentShader = FRAGSHADER; vertexShaderBackground = VERTEXSHADERBACKGROUND; fragmentShaderBackground = FRAGSHADERBACKGROUND; //actually render the shaders now shaderProgramBackground.reset(new juce::OpenGLShaderProgram(ctx)); shaderProgramBackground->addVertexShader(vertexShaderBackground); shaderProgramBackground->addFragmentShader(fragmentShaderBackground); shaderProgramBackground->link(); shaderProgramBackground->use(); shaderProgram.reset(new juce::OpenGLShaderProgram(ctx)); shaderProgram->addVertexShader(vertexShader); shaderProgram->addFragmentShader(fragmentShader); shaderProgram->link(); shaderProgram->use(); } void CrushView::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); 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); bgTexture.unbind(); ctx.extensions.glBindBuffer(juce::gl::GL_ARRAY_BUFFER, vbo); ctx.extensions.glBindBuffer(juce::gl::GL_ELEMENT_ARRAY_BUFFER, ibo); shaderProgram->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, indices.size(), juce::gl::GL_UNSIGNED_INT, nullptr); } void CrushView::openGLContextClosing(){ }