Search code examples
c++winapiopenglglutwin32gui

glutpostredisplay() equivalent in winapi


I am following this article to render a video onto a texture using OpenGL and winforms using C++. I have changed the code in the renderer as follows. But the glutPostRedisplay(); is not working. The same logic works well when I am creating a OpenGL window and rendering over there. But does not seem to work well in winforms. As of what I understood is that the glutPostRedisplay is trying to refresh my main winforms window and not the OpenGL viewport. I am not sure how to Refresh my viewport.

 void OpenGLForm::COpenGL::Render(System::Void)
{   
  //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glEnable(GL_TEXTURE_2D);
  // These are necessary if using glTexImage2D instead of gluBuild2DMipmaps
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);


  // Draw a textured quad
  glBegin(GL_QUADS);
  glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
  glTexCoord2f(1.0f, 0.0f); glVertex2f(frame_width, 0.0f);
  glTexCoord2f(1.0f, 1.0f); glVertex2f(frame_width, frame_height);
  glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, frame_height);
  glEnd();

   glFlush();
 //glutSwapBuffers();

 OpenGLForm::COpenGL::SwapOpenGLBuffers();

//Get data from the camera
 uint32_t* buffer = new uint32_t[frame_width * frame_height * 4];
 if (display_mode == DISPLAY_ARGB) {
     // Pass a pointer to the texture directly into Thermal_GetImage for maximum performance
     status = Thermal_GetDisplayImage(camera, buffer, (uint32_t)frame_pixels);


   glTexImage2D(
       GL_TEXTURE_2D,
       0,
       GL_RGBA8,
       frame_width,
       frame_height,
       0,
       GL_RGBA,
       GL_UNSIGNED_BYTE,
       buffer);


    // Clean up buffer
    delete[] buffer;

   // Update display
   glutPostRedisplay();
}

void OpenGLForm::COpenGL::SwapOpenGLBuffers(System::Void)
{
   SwapBuffers(m_hDC);
}

Solution

  • glutPostRedisplay only works with a "glut"-window. (glutCreateWindow). You have to use a Win-API function to invalidate the client area of the window (e.g. InvalidateRect):

    InvalidateRect(HWND, NULL, TRUE);