Updated the Window and OpenGL examples (got rid of GLU and immediate mode)
This commit is contained in:
parent
ebaad339a9
commit
8cb05fc6d0
@ -14,14 +14,16 @@
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
// Request a 32-bits depth buffer when creating the window
|
||||||
|
sf::ContextSettings contextSettings;
|
||||||
|
contextSettings.depthBits = 32;
|
||||||
|
|
||||||
// Create the main window
|
// 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);
|
window.setVerticalSyncEnabled(true);
|
||||||
|
|
||||||
// Load a font for drawing some text
|
// Make it the active window for OpenGL calls
|
||||||
sf::Font font;
|
window.setActive();
|
||||||
if (!font.loadFromFile("resources/sansation.ttf"))
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
|
|
||||||
// Create a sprite for the background
|
// Create a sprite for the background
|
||||||
sf::Texture backgroundTexture;
|
sf::Texture backgroundTexture;
|
||||||
@ -29,6 +31,14 @@ int main()
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
sf::Sprite background(backgroundTexture);
|
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.
|
// Load an OpenGL texture.
|
||||||
// We could directly use a sf::Texture as an OpenGL texture (with its Bind() member function),
|
// 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
|
// 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);
|
glDepthMask(GL_TRUE);
|
||||||
glClearDepth(1.f);
|
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
|
// Setup a perspective projection
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluPerspective(90.f, 1.f, 1.f, 500.f);
|
GLfloat ratio = static_cast<float>(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);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
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
|
// Create a clock for measuring the time elapsed
|
||||||
sf::Clock clock;
|
sf::Clock clock;
|
||||||
@ -87,11 +160,6 @@ int main()
|
|||||||
window.draw(background);
|
window.draw(background);
|
||||||
window.popGLStates();
|
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
|
// Clear the depth buffer
|
||||||
glClear(GL_DEPTH_BUFFER_BIT);
|
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() * 30.f, 0.f, 1.f, 0.f);
|
||||||
glRotatef(clock.getElapsedTime().asSeconds() * 90.f, 0.f, 0.f, 1.f);
|
glRotatef(clock.getElapsedTime().asSeconds() * 90.f, 0.f, 0.f, 1.f);
|
||||||
|
|
||||||
// Draw a cube
|
// Draw the cube
|
||||||
float size = 20.f;
|
glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||||
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 some text on top of our OpenGL object
|
// Draw some text on top of our OpenGL object
|
||||||
window.pushGLStates();
|
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.draw(text);
|
||||||
window.popGLStates();
|
window.popGLStates();
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
// Headers
|
// Headers
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
@ -14,24 +13,96 @@
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
// Create the main window
|
// Request a 32-bits depth buffer when creating the window
|
||||||
sf::Window window(sf::VideoMode(640, 480, 32), "SFML Window", sf::Style::Default, sf::ContextSettings(32));
|
sf::ContextSettings contextSettings;
|
||||||
|
contextSettings.depthBits = 32;
|
||||||
|
|
||||||
// Create a clock for measuring the time elapsed
|
// Create the main window
|
||||||
sf::Clock clock;
|
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
|
// Set the color and depth clear values
|
||||||
glClearDepth(1.f);
|
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
|
// Enable Z-buffer read and write
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glDepthMask(GL_TRUE);
|
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
|
// Setup a perspective projection
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluPerspective(90.f, 1.f, 1.f, 500.f);
|
GLfloat ratio = static_cast<float>(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
|
// Start the game loop
|
||||||
while (window.isOpen())
|
while (window.isOpen())
|
||||||
@ -40,28 +111,23 @@ int main()
|
|||||||
sf::Event event;
|
sf::Event event;
|
||||||
while (window.pollEvent(event))
|
while (window.pollEvent(event))
|
||||||
{
|
{
|
||||||
// Close window : exit
|
// Close window: exit
|
||||||
if (event.type == sf::Event::Closed)
|
if (event.type == sf::Event::Closed)
|
||||||
window.close();
|
window.close();
|
||||||
|
|
||||||
// Escape key : exit
|
// Escape key: exit
|
||||||
if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
|
if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
|
||||||
window.close();
|
window.close();
|
||||||
|
|
||||||
// Resize event : adjust viewport
|
// Resize event: adjust the viewport
|
||||||
if (event.type == sf::Event::Resized)
|
if (event.type == sf::Event::Resized)
|
||||||
glViewport(0, 0, event.size.width, event.size.height);
|
glViewport(0, 0, event.size.width, event.size.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Activate the window before using OpenGL commands.
|
// Clear the color and depth buffers
|
||||||
// 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
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
// Apply some transformations
|
// Apply some transformations to rotate the cube
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
glTranslatef(0.f, 0.f, -200.f);
|
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() * 30, 0.f, 1.f, 0.f);
|
||||||
glRotatef(clock.getElapsedTime().asSeconds() * 90, 0.f, 0.f, 1.f);
|
glRotatef(clock.getElapsedTime().asSeconds() * 90, 0.f, 0.f, 1.f);
|
||||||
|
|
||||||
// Draw a cube
|
// Draw the cube
|
||||||
glBegin(GL_QUADS);
|
glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||||
|
|
||||||
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();
|
|
||||||
|
|
||||||
// Finally, display the rendered frame on screen
|
// Finally, display the rendered frame on screen
|
||||||
window.display();
|
window.display();
|
||||||
|
Loading…
Reference in New Issue
Block a user