mirror of
https://github.com/SFML/SFML.git
synced 2024-11-28 22:31:09 +08:00
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()
|
||||
{
|
||||
// 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<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);
|
||||
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();
|
||||
|
||||
|
@ -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<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
|
||||
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();
|
||||
|
Loading…
Reference in New Issue
Block a user