From 8cb05fc6d024cce1350bc5cb966a79d5bd11d38e Mon Sep 17 00:00:00 2001 From: Laurent Gomila Date: Tue, 21 May 2013 16:57:02 +0200 Subject: [PATCH] Updated the Window and OpenGL examples (got rid of GLU and immediate mode) --- examples/opengl/OpenGL.cpp | 134 +++++++++++++++++++++------------- examples/window/Window.cpp | 144 ++++++++++++++++++++++--------------- 2 files changed, 169 insertions(+), 109 deletions(-) diff --git a/examples/opengl/OpenGL.cpp b/examples/opengl/OpenGL.cpp index a62924eee..910830df4 100644 --- a/examples/opengl/OpenGL.cpp +++ b/examples/opengl/OpenGL.cpp @@ -14,14 +14,16 @@ //////////////////////////////////////////////////////////// int main() { + // Request a 32-bits depth buffer when creating the window + sf::ContextSettings contextSettings; + contextSettings.depthBits = 32; + // Create the main window - sf::RenderWindow window(sf::VideoMode(800, 600), "SFML OpenGL", sf::Style::Default, sf::ContextSettings(32)); + sf::RenderWindow window(sf::VideoMode(800, 600), "SFML graphics with OpenGL", sf::Style::Default, contextSettings); window.setVerticalSyncEnabled(true); - // Load a font for drawing some text - sf::Font font; - if (!font.loadFromFile("resources/sansation.ttf")) - return EXIT_FAILURE; + // Make it the active window for OpenGL calls + window.setActive(); // Create a sprite for the background sf::Texture backgroundTexture; @@ -29,6 +31,14 @@ int main() return EXIT_FAILURE; sf::Sprite background(backgroundTexture); + // Create some text to draw on top of our OpenGL object + sf::Font font; + if (!font.loadFromFile("resources/sansation.ttf")) + return EXIT_FAILURE; + sf::Text text("SFML / OpenGL demo", font); + text.setColor(sf::Color(255, 255, 255, 170)); + text.setPosition(250.f, 450.f); + // Load an OpenGL texture. // We could directly use a sf::Texture as an OpenGL texture (with its Bind() member function), // but here we want more control on it (generate mipmaps, ...) so we create a new one from an image @@ -49,15 +59,78 @@ int main() glDepthMask(GL_TRUE); glClearDepth(1.f); + // Disable lighting + glDisable(GL_LIGHTING); + + // Configure the viewport (the same size as the window) + glViewport(0, 0, window.getSize().x, window.getSize().y); + // Setup a perspective projection glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(90.f, 1.f, 1.f, 500.f); + GLfloat ratio = static_cast(window.getSize().x) / window.getSize().y; + glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f); - // Bind our texture + // Bind the texture glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); - glColor4f(1.f, 1.f, 1.f, 1.f); + + // Define a 3D cube (8 faces made of 2 triangles composed by 3 vertices) + GLfloat cube[] = + { + // positions // texture coordinates + -20, -20, -20, 0, 0, + -20, 20, -20, 1, 0, + -20, -20, 20, 0, 1, + -20, -20, 20, 0, 1, + -20, 20, -20, 1, 0, + -20, 20, 20, 1, 1, + + 20, -20, -20, 0, 0, + 20, 20, -20, 1, 0, + 20, -20, 20, 0, 1, + 20, -20, 20, 0, 1, + 20, 20, -20, 1, 0, + 20, 20, 20, 1, 1, + + -20, -20, -20, 0, 0, + 20, -20, -20, 1, 0, + -20, -20, 20, 0, 1, + -20, -20, 20, 0, 1, + 20, -20, -20, 1, 0, + 20, -20, 20, 1, 1, + + -20, 20, -20, 0, 0, + 20, 20, -20, 1, 0, + -20, 20, 20, 0, 1, + -20, 20, 20, 0, 1, + 20, 20, -20, 1, 0, + 20, 20, 20, 1, 1, + + -20, -20, -20, 0, 0, + 20, -20, -20, 1, 0, + -20, 20, -20, 0, 1, + -20, 20, -20, 0, 1, + 20, -20, -20, 1, 0, + 20, 20, -20, 1, 1, + + -20, -20, 20, 0, 0, + 20, -20, 20, 1, 0, + -20, 20, 20, 0, 1, + -20, 20, 20, 0, 1, + 20, -20, 20, 1, 0, + 20, 20, 20, 1, 1 + }; + + // Enable position and texture coordinates vertex components + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glVertexPointer(3, GL_FLOAT, 5 * sizeof(GLfloat), cube); + glTexCoordPointer(2, GL_FLOAT, 5 * sizeof(GLfloat), cube + 3); + + // Disable normal and color vertex components + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); // Create a clock for measuring the time elapsed sf::Clock clock; @@ -87,11 +160,6 @@ int main() window.draw(background); window.popGLStates(); - // Activate the window before using OpenGL commands. - // This is useless here because we have only one window which is - // always the active one, but don't forget it if you use multiple windows - window.setActive(); - // Clear the depth buffer glClear(GL_DEPTH_BUFFER_BIT); @@ -107,47 +175,11 @@ int main() glRotatef(clock.getElapsedTime().asSeconds() * 30.f, 0.f, 1.f, 0.f); glRotatef(clock.getElapsedTime().asSeconds() * 90.f, 0.f, 0.f, 1.f); - // Draw a cube - float size = 20.f; - glBegin(GL_QUADS); - - glTexCoord2f(0, 0); glVertex3f(-size, -size, -size); - glTexCoord2f(0, 1); glVertex3f(-size, size, -size); - glTexCoord2f(1, 1); glVertex3f( size, size, -size); - glTexCoord2f(1, 0); glVertex3f( size, -size, -size); - - glTexCoord2f(0, 0); glVertex3f(-size, -size, size); - glTexCoord2f(0, 1); glVertex3f(-size, size, size); - glTexCoord2f(1, 1); glVertex3f( size, size, size); - glTexCoord2f(1, 0); glVertex3f( size, -size, size); - - glTexCoord2f(0, 0); glVertex3f(-size, -size, -size); - glTexCoord2f(0, 1); glVertex3f(-size, size, -size); - glTexCoord2f(1, 1); glVertex3f(-size, size, size); - glTexCoord2f(1, 0); glVertex3f(-size, -size, size); - - glTexCoord2f(0, 0); glVertex3f(size, -size, -size); - glTexCoord2f(0, 1); glVertex3f(size, size, -size); - glTexCoord2f(1, 1); glVertex3f(size, size, size); - glTexCoord2f(1, 0); glVertex3f(size, -size, size); - - glTexCoord2f(0, 1); glVertex3f(-size, -size, size); - glTexCoord2f(0, 0); glVertex3f(-size, -size, -size); - glTexCoord2f(1, 0); glVertex3f( size, -size, -size); - glTexCoord2f(1, 1); glVertex3f( size, -size, size); - - glTexCoord2f(0, 1); glVertex3f(-size, size, size); - glTexCoord2f(0, 0); glVertex3f(-size, size, -size); - glTexCoord2f(1, 0); glVertex3f( size, size, -size); - glTexCoord2f(1, 1); glVertex3f( size, size, size); - - glEnd(); + // Draw the cube + glDrawArrays(GL_TRIANGLES, 0, 36); // Draw some text on top of our OpenGL object window.pushGLStates(); - sf::Text text("SFML / OpenGL demo", font); - text.setColor(sf::Color(255, 255, 255, 170)); - text.setPosition(250.f, 450.f); window.draw(text); window.popGLStates(); diff --git a/examples/window/Window.cpp b/examples/window/Window.cpp index 1ee4725d2..f50cea436 100644 --- a/examples/window/Window.cpp +++ b/examples/window/Window.cpp @@ -1,4 +1,3 @@ - //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// @@ -14,24 +13,96 @@ //////////////////////////////////////////////////////////// int main() { - // Create the main window - sf::Window window(sf::VideoMode(640, 480, 32), "SFML Window", sf::Style::Default, sf::ContextSettings(32)); + // Request a 32-bits depth buffer when creating the window + sf::ContextSettings contextSettings; + contextSettings.depthBits = 32; - // Create a clock for measuring the time elapsed - sf::Clock clock; + // Create the main window + sf::Window window(sf::VideoMode(640, 480), "SFML window with OpenGL", sf::Style::Default, contextSettings); + + // Make it the active window for OpenGL calls + window.setActive(); // Set the color and depth clear values glClearDepth(1.f); - glClearColor(0.f, 0.f, 0.f, 0.f); + glClearColor(0.f, 0.f, 0.f, 1.f); // Enable Z-buffer read and write glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); + // Disable lighting and texturing + glDisable(GL_LIGHTING); + glDisable(GL_TEXTURE_2D); + + // Configure the viewport (the same size as the window) + glViewport(0, 0, window.getSize().x, window.getSize().y); + // Setup a perspective projection glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(90.f, 1.f, 1.f, 500.f); + GLfloat ratio = static_cast(window.getSize().x) / window.getSize().y; + glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f); + + // Define a 3D cube (8 faces made of 2 triangles composed by 3 vertices) + GLfloat cube[] = + { + // positions // colors (r, g, b, a) + -50, -50, -50, 0, 0, 1, 1, + -50, 50, -50, 0, 0, 1, 1, + -50, -50, 50, 0, 0, 1, 1, + -50, -50, 50, 0, 0, 1, 1, + -50, 50, -50, 0, 0, 1, 1, + -50, 50, 50, 0, 0, 1, 1, + + 50, -50, -50, 0, 1, 0, 1, + 50, 50, -50, 0, 1, 0, 1, + 50, -50, 50, 0, 1, 0, 1, + 50, -50, 50, 0, 1, 0, 1, + 50, 50, -50, 0, 1, 0, 1, + 50, 50, 50, 0, 1, 0, 1, + + -50, -50, -50, 1, 0, 0, 1, + 50, -50, -50, 1, 0, 0, 1, + -50, -50, 50, 1, 0, 0, 1, + -50, -50, 50, 1, 0, 0, 1, + 50, -50, -50, 1, 0, 0, 1, + 50, -50, 50, 1, 0, 0, 1, + + -50, 50, -50, 0, 1, 1, 1, + 50, 50, -50, 0, 1, 1, 1, + -50, 50, 50, 0, 1, 1, 1, + -50, 50, 50, 0, 1, 1, 1, + 50, 50, -50, 0, 1, 1, 1, + 50, 50, 50, 0, 1, 1, 1, + + -50, -50, -50, 1, 0, 1, 1, + 50, -50, -50, 1, 0, 1, 1, + -50, 50, -50, 1, 0, 1, 1, + -50, 50, -50, 1, 0, 1, 1, + 50, -50, -50, 1, 0, 1, 1, + 50, 50, -50, 1, 0, 1, 1, + + -50, -50, 50, 1, 1, 0, 1, + 50, -50, 50, 1, 1, 0, 1, + -50, 50, 50, 1, 1, 0, 1, + -50, 50, 50, 1, 1, 0, 1, + 50, -50, 50, 1, 1, 0, 1, + 50, 50, 50, 1, 1, 0, 1, + }; + + // Enable position and color vertex components + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glVertexPointer(3, GL_FLOAT, 7 * sizeof(GLfloat), cube); + glColorPointer(4, GL_FLOAT, 7 * sizeof(GLfloat), cube + 3); + + // Disable normal and texture coordinates vertex components + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + + // Create a clock for measuring the time elapsed + sf::Clock clock; // Start the game loop while (window.isOpen()) @@ -40,28 +111,23 @@ int main() sf::Event event; while (window.pollEvent(event)) { - // Close window : exit + // Close window: exit if (event.type == sf::Event::Closed) window.close(); - // Escape key : exit + // Escape key: exit if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)) window.close(); - // Resize event : adjust viewport + // Resize event: adjust the viewport if (event.type == sf::Event::Resized) glViewport(0, 0, event.size.width, event.size.height); - } + } - // Activate the window before using OpenGL commands. - // This is useless here because we have only one window which is - // always the active one, but don't forget it if you use multiple windows - window.setActive(); - - // Clear color and depth buffer + // Clear the color and depth buffers glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - // Apply some transformations + // Apply some transformations to rotate the cube glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.f, 0.f, -200.f); @@ -69,46 +135,8 @@ int main() glRotatef(clock.getElapsedTime().asSeconds() * 30, 0.f, 1.f, 0.f); glRotatef(clock.getElapsedTime().asSeconds() * 90, 0.f, 0.f, 1.f); - // Draw a cube - glBegin(GL_QUADS); - - glColor3f(1.f, 0.f, 0.f); - glVertex3f(-50.f, -50.f, -50.f); - glVertex3f(-50.f, 50.f, -50.f); - glVertex3f( 50.f, 50.f, -50.f); - glVertex3f( 50.f, -50.f, -50.f); - - glColor3f(1.f, 0.f, 0.f); - glVertex3f(-50.f, -50.f, 50.f); - glVertex3f(-50.f, 50.f, 50.f); - glVertex3f( 50.f, 50.f, 50.f); - glVertex3f( 50.f, -50.f, 50.f); - - glColor3f(0.f, 1.f, 0.f); - glVertex3f(-50.f, -50.f, -50.f); - glVertex3f(-50.f, 50.f, -50.f); - glVertex3f(-50.f, 50.f, 50.f); - glVertex3f(-50.f, -50.f, 50.f); - - glColor3f(0.f, 1.f, 0.f); - glVertex3f(50.f, -50.f, -50.f); - glVertex3f(50.f, 50.f, -50.f); - glVertex3f(50.f, 50.f, 50.f); - glVertex3f(50.f, -50.f, 50.f); - - glColor3f(0.f, 0.f, 1.f); - glVertex3f(-50.f, -50.f, 50.f); - glVertex3f(-50.f, -50.f, -50.f); - glVertex3f( 50.f, -50.f, -50.f); - glVertex3f( 50.f, -50.f, 50.f); - - glColor3f(0.f, 0.f, 1.f); - glVertex3f(-50.f, 50.f, 50.f); - glVertex3f(-50.f, 50.f, -50.f); - glVertex3f( 50.f, 50.f, -50.f); - glVertex3f( 50.f, 50.f, 50.f); - - glEnd(); + // Draw the cube + glDrawArrays(GL_TRIANGLES, 0, 36); // Finally, display the rendered frame on screen window.display();