Skip to content

Instantly share code, notes, and snippets.

@FineCutBodies
Created August 28, 2018 23:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FineCutBodies/1a39b56c8a010b1217ed705cf03012bd to your computer and use it in GitHub Desktop.
Save FineCutBodies/1a39b56c8a010b1217ed705cf03012bd to your computer and use it in GitHub Desktop.
OpenGL framerate
#include "PluginEditor.h"
//==============================================================================
OpenGlTestAudioProcessorEditor::OpenGlTestAudioProcessorEditor (OpenGlTestAudioProcessor& p)
: AudioProcessorEditor(&p), processor (p)
{
//=========================
// setup some dummy vertexdata
//=========================
m_cacheSize = 10;
m_vertexes = new GLfloat[2 * m_cacheSize];
float sign = 0.25f;
for (int i = 0; i < m_cacheSize*2; i += 2) {
m_vertexes[i + 0] = float(i) / (2 * (m_cacheSize - 1));
m_vertexes[i + 1] = 0.5f + (sign*=-1.0f);
}
//=========================
// init OpenGL
//=========================
if (auto* peer = getPeer()) peer->setCurrentRenderingEngine(0);
// Antialiasing
OpenGLPixelFormat pixelFormat;
pixelFormat.multisamplingLevel = 8;
m_glContext.setPixelFormat(pixelFormat);
m_glContext.setMultisamplingEnabled(true);
// attach
m_glContext.setRenderer(this);
m_glContext.attachTo(*getTopLevelComponent());
//=========================
// Make sure that before the constructor has finished, you've set the editor's size to whatever you need it to be.
//=========================
setSize (600, 300);
}
OpenGlTestAudioProcessorEditor::~OpenGlTestAudioProcessorEditor()
{
m_glContext.detach();
delete[] m_vertexes;
m_vertexes = nullptr;
}
//==============================================================================
void OpenGlTestAudioProcessorEditor::paint (Graphics& g) {}
void OpenGlTestAudioProcessorEditor::resized() {}
void OpenGlTestAudioProcessorEditor::newOpenGLContextCreated()
{
// start the rendering loop
m_glContext.setContinuousRepainting(true);
// V-sync
m_glContext.setSwapInterval(1);
m_shaderProgram = createShaders();
jassert(m_shaderProgram != nullptr);
m_glContext.extensions.glGenBuffers(1, &m_vertexBufferID);
m_glContext.extensions.glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferID);
m_glContext.extensions.glBufferData(GL_ARRAY_BUFFER, m_cacheSize * 2 * sizeof(GLfloat), nullptr, GL_DYNAMIC_DRAW);
}
void OpenGlTestAudioProcessorEditor::renderOpenGL()
{
//=========================
// FPS calculation (this will mostly show 60fps for me, so this function is called nicely)
//=========================
if (lastTick == 0) lastTick = Time::getHighResolutionTicks();
else {
auto fps = Time::getHighResolutionTicksPerSecond() / (Time::getHighResolutionTicks() - lastTick);
sum += fps;
if (frames < 100) frames++;
else sum -= sum / frames;
DBG("FPS: "+String(sum/frames));
lastTick = Time::getHighResolutionTicks();
}
//=========================
// dummy sawtooth drawing
//=========================
glViewport(0, 0, getWidth(), getHeight());
OpenGLHelpers::clear(Colours::grey);
m_shaderProgram->use();
OpenGLShaderProgram::Uniform color(*m_shaderProgram, "drawColor");
color.set(0.15f, 0.32f, 0.37f, 1.0f);
m_glContext.extensions.glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferID);
m_glContext.extensions.glBufferSubData(GL_ARRAY_BUFFER, 0, m_cacheSize * 2 * sizeof(GLfloat), m_vertexes);
const auto posLoc = m_glContext.extensions.glGetAttribLocation(m_shaderProgram->getProgramID(), "position");
m_glContext.extensions.glEnableVertexAttribArray(posLoc);
m_glContext.extensions.glVertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
glDrawArrays(GL_LINE_STRIP, 0, m_cacheSize);
m_glContext.extensions.glBindBuffer(GL_ARRAY_BUFFER, 0);
}
#pragma once
#include "../JuceLibraryCode/JuceHeader.h"
#include "PluginProcessor.h"
class OpenGlTestAudioProcessorEditor : public AudioProcessorEditor, public OpenGLRenderer
{
public:
OpenGlTestAudioProcessorEditor (OpenGlTestAudioProcessor&);
~OpenGlTestAudioProcessorEditor();
//==============================================================================
void paint (Graphics&) override;
void resized() override;
void newOpenGLContextCreated() override;
void renderOpenGL() override;
void openGLContextClosing() override {}
OpenGLContext m_glContext;
ScopedPointer<OpenGLShaderProgram> m_shaderProgram;
int m_cacheSize = 0;
GLfloat* m_vertexes = nullptr;
GLuint m_vertexBufferID = 0;
GLuint m_vertexArrayID = 0;
int64 lastTick = 0;
int64 frames = 1;
int64 sum = 0;
// openGL related members
OpenGLShaderProgram* createShaders() { return createShaders(m_tempVertexShaderCode, m_tempFragmentShaderCode); }
OpenGLShaderProgram* createShaders(String const& vertexShaderCode, String const& fragmentShaderCode) {
auto* shaderProgram = new OpenGLShaderProgram(m_glContext);
if (!shaderProgram->addVertexShader(OpenGLHelpers::translateVertexShaderToV3(vertexShaderCode))
|| !shaderProgram->addFragmentShader(OpenGLHelpers::translateFragmentShaderToV3(fragmentShaderCode))
|| !shaderProgram->link()) {
DBG(shaderProgram->getLastError());
delete shaderProgram;
shaderProgram = nullptr;
}
return shaderProgram;
}
// using openGL v3.0
const char* m_tempVertexShaderCode =
"#version 130\n"
"in vec4 position;\n"
"void main () {\n"
" gl_Position = vec4(2.0 * position.xyz - 1.0,position.w);\n"
"}\n";
const char* m_tempFragmentShaderCode =
"#version 130\n"
"uniform vec4 drawColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
"out vec4 out_color;\n"
"void main () {\n"
" out_color = drawColor;\n"
"}\n";
private:
OpenGlTestAudioProcessor& processor;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGlTestAudioProcessorEditor)
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment