PDA

View Full Version : How implement resize of 2D bitmap texture?



EdOfTheMountain
06-19-2009, 11:25 AM
I am a Linux/OpenGL newbie trying to convert my GLUT application that draws video frames as 2-D bitmap textures to use QT4 QGLWidget.

How can I implement the OpenGL equivalent of glutDisplayFunc(&paintGL) for the QT4 GLWidget::resizeGL() method?

I tried simply calling paintGL() from GLWidget::resizeGL(). What am I missing?

Thanks in advance for any tips or suggestions,

-Ed

// Using QT 4
// GLWidget is derived from QGLWidget
class GLWidget : public QGLWidget{};

void GLWidget::resizeGL(int width, int height)
{
// ToDo: Under glut, glutDisplayFunc(&paintGL) worked
// Under QT what is the equivalent?
}

void GLWidget::initializeGL()
{
glEnable(GL_DOUBLE);
glEnable(GL_DEPTH);
glEnable(GL_RGB);

m_pBitmap = BitmapHelper::LoadBitMap("splash.bmp");
glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); // Black background
m_width = m_pBitmap->ptrHeaderBitMapInfo.width;
m_height = m_pBitmap->ptrHeaderBitMapInfo.height;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, m_texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, m_width, m_height, 0, GL_BGR, GL_UNSIGNED_BYTE, (GLvoid*)m_pBitmap->pData);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR);
}

void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the window with current clearing color
glShadeModel(GL_SMOOTH);
glEnable(GL_NORMALIZE);
glPushMatrix();
{
glDisable(GL_LIGHTING); // Draw plane that the cube rests on
glEnable(GL_TEXTURE_2D); // should use shader, but for an example fixed pipeline is ok ;\)
glBindTexture(GL_TEXTURE_2D, m_texture[0]);
glBegin(GL_TRIANGLE_STRIP); // draw something with the texture on
{
glTexCoord2f(0.0, 0.0);
glVertex2f(-1.0, -1.0);

glTexCoord2f(1.0, 0.0);
glVertex2f(1.0, -1.0);

glTexCoord2f(0.0, 1.0);
glVertex2f(-1.0, 1.0);

glTexCoord2f(1.0, 1.0);
glVertex2f(1.0, 1.0);
}
glEnd();
}
glPopMatrix();
swapBuffers(); // Flush drawing commands
}

EdOfTheMountain
06-19-2009, 05:58 PM
This works for me. I just need to figure out how to maintain the aspect ration of the GLWidget.

void GLWidget::resizeGL(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);;
}