@SGaist
Thanks for answering.
Basically, I am separating rendering and updating to have fixed-timestep updating (for physics etc) as well as as-fast-as-possible rendering with time interpolation. (Heavily heavily inspired from Gaffer on Games article)
My code looks as follows (only slightly simplified):
... within my OpenGLContext
void GLWindow::gameLoop()
{
const double delta = 1.0 / fixedUpdatesPerSecond;
auto time = QDateTime::currentMSecsSinceEpoch();
double accumulated = 0.0;
while (! this->terminate)
{
auto newTime = QDateTime::currentMSecsSinceEpoch();
double frameExecution = tdiff(time, newTime);
time = newTime;
accumulated += frameExecution;
while (accumulated >= delta)
{
// Handle user input / system polling
//However, since Qt has event driven polling, let's just call processEvents and then handle any input events by putting their results into a map.
QCoreApplication::processEvents();
// Update our states
this->updateState(delta);
accumulated -= delta;
}
this->render(accumulated / delta);
}
}
In the same class, I have updateState and render:
void MyGL::updateState(float delta)
{
//... Bunch of commented-out code to make sure base loop works first
if(myKeys.at(Qt::Key_W)) {
cam->translateAlongForward(delta * 3.0);
cam->update();
}
}
void MyGL::render(float aheadAlphaPercent)
{
this->update();
}
void MyGL::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
lambertShader->setViewProj(cam->matrix());
// a lot of other drawing stuff
}
I know that my rendering code itself works because I initially tested it by just using a QTimer.
Instead, I now do the following:
...in main...
QApplication a(argc, argv);
QSurfaceFormat::setDefaultFormat(format);
MainWindow w;
w.show();
w.start();
//return a.exec();
// ^Dont^want^to^uncomment^this^
... MainWindow::start (MainWindow is QMainWindow subclass)...
uiElements->glWindow->gameLoop(); //glWindow is subclass of OpenGLContext
As you can see, I tried to avoid calling Qt's blocking event loop in QApplication::exec, but am still polling events. However, this doesn't work properly, as described in my first post.