From d70c0ccf20f07ab291ebbe5065c4bffaafd276e3 Mon Sep 17 00:00:00 2001 From: Tiberiu Chibici Date: Tue, 6 Feb 2018 01:44:42 +0200 Subject: [PATCH] Added code --- Application.cpp | 421 +++++++++ Application.h | 64 ++ Assets/OptimusPrinceps.ttf | Bin 0 -> 41416 bytes Assets/background.tga | Bin 0 -> 1986342 bytes Domain/Array2.cpp | 77 ++ Domain/Array2.h | 37 + Domain/Piece.cpp | 45 + Domain/Piece.h | 27 + Logic/PieceGenerator.cpp | 65 ++ Logic/PieceGenerator.h | 42 + Logic/TetrisGame.cpp | 237 +++++ Logic/TetrisGame.h | 65 ++ SFML-2.4.2/cmake/Modules/FindSFML.cmake | 365 ++++++++ SFML-2.4.2/include/SFML/Audio.hpp | 56 ++ SFML-2.4.2/include/SFML/Audio/AlResource.hpp | 70 ++ SFML-2.4.2/include/SFML/Audio/Export.hpp | 48 + .../include/SFML/Audio/InputSoundFile.hpp | 256 +++++ SFML-2.4.2/include/SFML/Audio/Listener.hpp | 234 +++++ SFML-2.4.2/include/SFML/Audio/Music.hpp | 229 +++++ .../include/SFML/Audio/OutputSoundFile.hpp | 133 +++ SFML-2.4.2/include/SFML/Audio/Sound.hpp | 264 ++++++ SFML-2.4.2/include/SFML/Audio/SoundBuffer.hpp | 352 +++++++ .../SFML/Audio/SoundBufferRecorder.hpp | 144 +++ .../include/SFML/Audio/SoundFileFactory.hpp | 197 ++++ .../include/SFML/Audio/SoundFileFactory.inl | 100 ++ .../include/SFML/Audio/SoundFileReader.hpp | 164 ++++ .../include/SFML/Audio/SoundFileWriter.hpp | 125 +++ .../include/SFML/Audio/SoundRecorder.hpp | 408 ++++++++ SFML-2.4.2/include/SFML/Audio/SoundSource.hpp | 297 ++++++ SFML-2.4.2/include/SFML/Audio/SoundStream.hpp | 386 ++++++++ SFML-2.4.2/include/SFML/Config.hpp | 231 +++++ SFML-2.4.2/include/SFML/Graphics.hpp | 67 ++ .../include/SFML/Graphics/BlendMode.hpp | 215 +++++ .../include/SFML/Graphics/CircleShape.hpp | 154 +++ SFML-2.4.2/include/SFML/Graphics/Color.hpp | 275 ++++++ .../include/SFML/Graphics/ConvexShape.hpp | 153 +++ SFML-2.4.2/include/SFML/Graphics/Drawable.hpp | 126 +++ SFML-2.4.2/include/SFML/Graphics/Export.hpp | 48 + SFML-2.4.2/include/SFML/Graphics/Font.hpp | 439 +++++++++ SFML-2.4.2/include/SFML/Graphics/Glsl.hpp | 227 +++++ SFML-2.4.2/include/SFML/Graphics/Glsl.inl | 155 ++++ SFML-2.4.2/include/SFML/Graphics/Glyph.hpp | 79 ++ SFML-2.4.2/include/SFML/Graphics/Image.hpp | 327 +++++++ .../include/SFML/Graphics/PrimitiveType.hpp | 58 ++ SFML-2.4.2/include/SFML/Graphics/Rect.hpp | 254 +++++ SFML-2.4.2/include/SFML/Graphics/Rect.inl | 159 ++++ .../include/SFML/Graphics/RectangleShape.hpp | 132 +++ .../include/SFML/Graphics/RenderStates.hpp | 174 ++++ .../include/SFML/Graphics/RenderTarget.hpp | 451 +++++++++ .../include/SFML/Graphics/RenderTexture.hpp | 296 ++++++ .../include/SFML/Graphics/RenderWindow.hpp | 278 ++++++ SFML-2.4.2/include/SFML/Graphics/Shader.hpp | 875 ++++++++++++++++++ SFML-2.4.2/include/SFML/Graphics/Shape.hpp | 355 +++++++ SFML-2.4.2/include/SFML/Graphics/Sprite.hpp | 279 ++++++ SFML-2.4.2/include/SFML/Graphics/Text.hpp | 456 +++++++++ SFML-2.4.2/include/SFML/Graphics/Texture.hpp | 686 ++++++++++++++ .../include/SFML/Graphics/Transform.hpp | 450 +++++++++ .../include/SFML/Graphics/Transformable.hpp | 429 +++++++++ SFML-2.4.2/include/SFML/Graphics/Vertex.hpp | 148 +++ .../include/SFML/Graphics/VertexArray.hpp | 223 +++++ SFML-2.4.2/include/SFML/Graphics/View.hpp | 343 +++++++ SFML-2.4.2/include/SFML/Main.hpp | 43 + SFML-2.4.2/include/SFML/Network.hpp | 53 ++ SFML-2.4.2/include/SFML/Network/Export.hpp | 48 + SFML-2.4.2/include/SFML/Network/Ftp.hpp | 612 ++++++++++++ SFML-2.4.2/include/SFML/Network/Http.hpp | 482 ++++++++++ SFML-2.4.2/include/SFML/Network/IpAddress.hpp | 328 +++++++ SFML-2.4.2/include/SFML/Network/Packet.hpp | 412 +++++++++ SFML-2.4.2/include/SFML/Network/Socket.hpp | 219 +++++ .../include/SFML/Network/SocketHandle.hpp | 57 ++ .../include/SFML/Network/SocketSelector.hpp | 263 ++++++ .../include/SFML/Network/TcpListener.hpp | 164 ++++ SFML-2.4.2/include/SFML/Network/TcpSocket.hpp | 315 +++++++ SFML-2.4.2/include/SFML/Network/UdpSocket.hpp | 286 ++++++ SFML-2.4.2/include/SFML/OpenGL.hpp | 77 ++ SFML-2.4.2/include/SFML/System.hpp | 60 ++ SFML-2.4.2/include/SFML/System/Clock.hpp | 117 +++ SFML-2.4.2/include/SFML/System/Err.hpp | 80 ++ SFML-2.4.2/include/SFML/System/Export.hpp | 48 + .../include/SFML/System/FileInputStream.hpp | 169 ++++ .../include/SFML/System/InputStream.hpp | 152 +++ SFML-2.4.2/include/SFML/System/Lock.hpp | 139 +++ .../include/SFML/System/MemoryInputStream.hpp | 148 +++ SFML-2.4.2/include/SFML/System/Mutex.hpp | 148 +++ .../include/SFML/System/NativeActivity.hpp | 62 ++ .../include/SFML/System/NonCopyable.hpp | 119 +++ SFML-2.4.2/include/SFML/System/Sleep.hpp | 52 ++ SFML-2.4.2/include/SFML/System/String.hpp | 669 +++++++++++++ SFML-2.4.2/include/SFML/System/String.inl | 53 ++ SFML-2.4.2/include/SFML/System/Thread.hpp | 282 ++++++ SFML-2.4.2/include/SFML/System/Thread.inl | 90 ++ .../include/SFML/System/ThreadLocal.hpp | 103 +++ .../include/SFML/System/ThreadLocalPtr.hpp | 158 ++++ .../include/SFML/System/ThreadLocalPtr.inl | 77 ++ SFML-2.4.2/include/SFML/System/Time.hpp | 488 ++++++++++ SFML-2.4.2/include/SFML/System/Utf.hpp | 763 +++++++++++++++ SFML-2.4.2/include/SFML/System/Utf.inl | 752 +++++++++++++++ SFML-2.4.2/include/SFML/System/Vector2.hpp | 301 ++++++ SFML-2.4.2/include/SFML/System/Vector2.inl | 161 ++++ SFML-2.4.2/include/SFML/System/Vector3.hpp | 302 ++++++ SFML-2.4.2/include/SFML/System/Vector3.inl | 168 ++++ SFML-2.4.2/include/SFML/Window.hpp | 56 ++ SFML-2.4.2/include/SFML/Window/Context.hpp | 180 ++++ .../include/SFML/Window/ContextSettings.hpp | 148 +++ SFML-2.4.2/include/SFML/Window/Event.hpp | 284 ++++++ SFML-2.4.2/include/SFML/Window/Export.hpp | 48 + SFML-2.4.2/include/SFML/Window/GlResource.hpp | 103 +++ SFML-2.4.2/include/SFML/Window/Joystick.hpp | 227 +++++ SFML-2.4.2/include/SFML/Window/Keyboard.hpp | 224 +++++ SFML-2.4.2/include/SFML/Window/Mouse.hpp | 177 ++++ SFML-2.4.2/include/SFML/Window/Sensor.hpp | 150 +++ SFML-2.4.2/include/SFML/Window/Touch.hpp | 137 +++ SFML-2.4.2/include/SFML/Window/VideoMode.hpp | 228 +++++ SFML-2.4.2/include/SFML/Window/Window.hpp | 594 ++++++++++++ .../include/SFML/Window/WindowHandle.hpp | 101 ++ .../include/SFML/Window/WindowStyle.hpp | 53 ++ SFML-2.4.2/license.txt | 37 + SFML-2.4.2/readme.txt | 44 + Utils/Clamp.h | 20 + main.cpp | 21 + 120 files changed, 25302 insertions(+) create mode 100644 Application.cpp create mode 100644 Application.h create mode 100644 Assets/OptimusPrinceps.ttf create mode 100644 Assets/background.tga create mode 100644 Domain/Array2.cpp create mode 100644 Domain/Array2.h create mode 100644 Domain/Piece.cpp create mode 100644 Domain/Piece.h create mode 100644 Logic/PieceGenerator.cpp create mode 100644 Logic/PieceGenerator.h create mode 100644 Logic/TetrisGame.cpp create mode 100644 Logic/TetrisGame.h create mode 100644 SFML-2.4.2/cmake/Modules/FindSFML.cmake create mode 100644 SFML-2.4.2/include/SFML/Audio.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/AlResource.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/Export.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/InputSoundFile.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/Listener.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/Music.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/OutputSoundFile.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/Sound.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/SoundBuffer.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/SoundBufferRecorder.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/SoundFileFactory.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/SoundFileFactory.inl create mode 100644 SFML-2.4.2/include/SFML/Audio/SoundFileReader.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/SoundFileWriter.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/SoundRecorder.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/SoundSource.hpp create mode 100644 SFML-2.4.2/include/SFML/Audio/SoundStream.hpp create mode 100644 SFML-2.4.2/include/SFML/Config.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/BlendMode.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/CircleShape.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Color.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/ConvexShape.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Drawable.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Export.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Font.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Glsl.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Glsl.inl create mode 100644 SFML-2.4.2/include/SFML/Graphics/Glyph.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Image.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/PrimitiveType.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Rect.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Rect.inl create mode 100644 SFML-2.4.2/include/SFML/Graphics/RectangleShape.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/RenderStates.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/RenderTarget.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/RenderTexture.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/RenderWindow.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Shader.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Shape.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Sprite.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Text.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Texture.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Transform.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Transformable.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/Vertex.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/VertexArray.hpp create mode 100644 SFML-2.4.2/include/SFML/Graphics/View.hpp create mode 100644 SFML-2.4.2/include/SFML/Main.hpp create mode 100644 SFML-2.4.2/include/SFML/Network.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/Export.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/Ftp.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/Http.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/IpAddress.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/Packet.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/Socket.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/SocketHandle.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/SocketSelector.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/TcpListener.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/TcpSocket.hpp create mode 100644 SFML-2.4.2/include/SFML/Network/UdpSocket.hpp create mode 100644 SFML-2.4.2/include/SFML/OpenGL.hpp create mode 100644 SFML-2.4.2/include/SFML/System.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Clock.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Err.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Export.hpp create mode 100644 SFML-2.4.2/include/SFML/System/FileInputStream.hpp create mode 100644 SFML-2.4.2/include/SFML/System/InputStream.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Lock.hpp create mode 100644 SFML-2.4.2/include/SFML/System/MemoryInputStream.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Mutex.hpp create mode 100644 SFML-2.4.2/include/SFML/System/NativeActivity.hpp create mode 100644 SFML-2.4.2/include/SFML/System/NonCopyable.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Sleep.hpp create mode 100644 SFML-2.4.2/include/SFML/System/String.hpp create mode 100644 SFML-2.4.2/include/SFML/System/String.inl create mode 100644 SFML-2.4.2/include/SFML/System/Thread.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Thread.inl create mode 100644 SFML-2.4.2/include/SFML/System/ThreadLocal.hpp create mode 100644 SFML-2.4.2/include/SFML/System/ThreadLocalPtr.hpp create mode 100644 SFML-2.4.2/include/SFML/System/ThreadLocalPtr.inl create mode 100644 SFML-2.4.2/include/SFML/System/Time.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Utf.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Utf.inl create mode 100644 SFML-2.4.2/include/SFML/System/Vector2.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Vector2.inl create mode 100644 SFML-2.4.2/include/SFML/System/Vector3.hpp create mode 100644 SFML-2.4.2/include/SFML/System/Vector3.inl create mode 100644 SFML-2.4.2/include/SFML/Window.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/Context.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/ContextSettings.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/Event.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/Export.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/GlResource.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/Joystick.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/Keyboard.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/Mouse.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/Sensor.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/Touch.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/VideoMode.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/Window.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/WindowHandle.hpp create mode 100644 SFML-2.4.2/include/SFML/Window/WindowStyle.hpp create mode 100644 SFML-2.4.2/license.txt create mode 100644 SFML-2.4.2/readme.txt create mode 100644 Utils/Clamp.h create mode 100644 main.cpp diff --git a/Application.cpp b/Application.cpp new file mode 100644 index 0000000..2a65585 --- /dev/null +++ b/Application.cpp @@ -0,0 +1,421 @@ +/* + * Application.cpp + * + * Created on: May 4, 2013 + * Author: chibi_000 + */ + +#include "Application.h" +#include +#include + +const unsigned char pcols[][4] = { + {0xf0, 0xf0, 0xf0, 0xa0}, // finished line + {0xf0, 0xf0, 0xf0, 0x05}, // empty block + {0x00, 0xf0, 0xf0, 0xa0}, // line block + {0xf0, 0xa5, 0x00, 0xa0}, // L block + {0x40, 0x40, 0xf0, 0xa0}, // reverse L block + {0xf0, 0x40, 0xf0, 0xa0}, // T block + {0xf0, 0x00, 0x00, 0xa0}, // 2 block + {0x00, 0xf0, 0x00, 0xa0}, // S block + {0xf0, 0xf0, 0x00, 0xa0} // O block + }; + + +/*********************************** + * Constructor * + ***********************************/ +Application::Application() +{ + this->stop_flag = false; + this->paused = false; +} + +/*********************************** + * Initialize, dispose * + ***********************************/ +bool Application::initialize() +{ + // Load images + background_texture.loadFromFile("Assets/background.tga"); + background_texture.setSmooth(true); + + // Load font + font.loadFromFile("Assets/OptimusPrinceps.ttf"); + + // Load window + this->mainWindow.create(sf::VideoMode(100, 100), "Tetris"); + this->mainWindow.setSize(sf::Vector2u(640, 480)); + return true; +} + +void Application::onStart() +{ +} + +void Application::dispose() +{ +} + +/*********************************** + * Main loop (run) * + ***********************************/ +int Application::run() +{ + // Initialize + if (!this->initialize()) + { + this->dispose(); + return -1; + } + + sf::Clock clock; + + // Before start handler + this->onStart(); + + // Main loop + while (!this->stop_flag) + { + // Get elapsed time + sf::Time elapsed = clock.restart(); + + // Handle events + sf::Event event; + while (this->mainWindow.pollEvent(event)) + this->onMainWindowEvent(event); + + // Update logic + onLogicUpdate(elapsed); + + // Update graphics + onRender(elapsed); + } + + // Cleanup + this->dispose(); + return 0; +} + +void Application::stop() +{ + this->mainWindow.close(); + this->stop_flag = true; +} + +/*********************************** + * Event handler * + ***********************************/ +void Application::onMainWindowEvent(sf::Event& e) +{ + switch (e.type) + { + case sf::Event::Closed : + this->stop(); + break; + + case sf::Event::KeyPressed: + this->onKeyDown(e); + break; + + case sf::Event::Resized: + this->onResized(e); + break; + + default: + break; + } +} + +void Application::onKeyDown(sf::Event& e) +{ + switch(e.key.code) + { + case sf::Keyboard::R: + this->game = TetrisGame(); + break; + + case sf::Keyboard::Left: + this->game.moveLeft(); + break; + + case sf::Keyboard::Right: + this->game.moveRight(); + break; + + case sf::Keyboard::Down: + this->game.moveDown(); + break; + + case sf::Keyboard::Up: + this->game.rotate(); + break; + + case sf::Keyboard::Escape: + this->stop(); + break; + + case sf::Keyboard::T: + this->game.tick(); + break; + + case sf::Keyboard::P: + this->paused = !this->paused; + break; + + default: + break; + } +} + +void Application::onResized(sf::Event& e) +{ + sf::Vector2f center(e.size.width / 2, e.size.height / 2); + sf::Vector2f size(e.size.width, e.size.height); + sf::View view(center, size); + + this->mainWindow.setView(view); +} + + +/*********************************** + * Renderer * + ***********************************/ +void Application::onRender(sf::Time& elapsed) +{ + mainWindow.clear(sf::Color::Black); + + // Render game + this->drawBackground(); + this->drawTetrisGridBackground(); + this->drawTetrisGrid(); + this->drawNextPieceBackground(); + this->drawNextPiece(); + this->drawText(); + + // Render ui +// this->ui.render(mainWindow); + + mainWindow.display(); +} + +void Application::drawBackground() +{ + // Create sprite + sf::Sprite back(background_texture); + + // Calculate scale + sf::Vector2u img_size = this->background_texture.getSize(); + sf::Vector2f scr_size = this->mainWindow.getView().getSize(); + + float rap_x = scr_size.x / (float)(img_size.x); + float rap_y = scr_size.y / (float)(img_size.y); + + back.setScale(std::max(rap_x, rap_y), std::max(rap_x, rap_y)); + + // Draw + this->mainWindow.draw(back); +} + +void Application::drawTetrisGridBackground() +{ + // Calculate size + sf::Vector2f scr_size = this->mainWindow.getView().getSize(); + sf::Vector2f rect_size((scr_size.y - 10) * 0.6f, scr_size.y - 10); + sf::Vector2f marginrect_size = rect_size + sf::Vector2f(4, 4); + + // Calculate position + sf::Vector2f marginrect_pos = 0.5f * (scr_size - marginrect_size); + sf::Vector2f rect_pos = 0.5f * (scr_size - rect_size); + + // Create margin rectangle + sf::RectangleShape margin (marginrect_size); + margin.setPosition(marginrect_pos); + margin.setFillColor(sf::Color(0x00, 0x00, 0x00, 0x40)); + + // Create rectangle + sf::RectangleShape rect (rect_size); + rect.setPosition(rect_pos); + rect.setFillColor(sf::Color(0x02, 0x0a, 0x1a, 0x77)); + + // Draw + this->mainWindow.draw(margin); + this->mainWindow.draw(rect); +} + +void Application::drawTetrisGrid() +{ + // Calculate positions, sizes + sf::Vector2f scr_size = this->mainWindow.getView().getSize(); + sf::Vector2f container_size((scr_size.y - 10) * 0.6f - 10, scr_size.y - 20); + sf::Vector2f container_pos = 0.5f * (scr_size - container_size); + + sf::Vector2f block_margin_size (container_size.x / 10, container_size.y / 20); + sf::Vector2f block_size = block_margin_size - sf::Vector2f(2, 2); + + // Draw every block + for (int i = 0; i < 20; i++) + for (int j = 0; j < 10; j++) + { + // Get block + int val = this->game.get(j, i); + + // Calculate position + float x = container_pos.x + block_margin_size.x * j + 1; + float y = container_pos.y + block_margin_size.y * i + 1; + + // Create block shape + sf::RectangleShape shape(block_size); + shape.setFillColor(sf::Color(pcols[val+1][0], pcols[val+1][1], pcols[val+1][2], pcols[val+1][3])); + shape.setPosition(x, y); + + // Draw block + this->mainWindow.draw(shape); + } +} + +void Application::drawNextPieceBackground() +{ + // Calculate position + sf::Vector2f scr_size = this->mainWindow.getView().getSize(); + sf::Vector2f tetris_grid_size((scr_size.y - 10) * 0.6f, scr_size.y - 10); + sf::Vector2f tetris_grid_pos = 0.5f * (scr_size - tetris_grid_size); + + sf::Vector2f block_margin_size (tetris_grid_size.x / 10, tetris_grid_size.y / 20); + + sf::Vector2f next_text_pos = tetris_grid_pos + sf::Vector2f(tetris_grid_size.x + 10, 0); + sf::Vector2f next_grid_pos = next_text_pos + sf::Vector2f(0, 50); + sf::Vector2f next_grid_size = 5.0f * block_margin_size + sf::Vector2f(4, 4); + + // Draw text + sf::Text txt; + txt.setString("Next piece"); + txt.setFont(this->font); + txt.setCharacterSize(25); + txt.setColor(sf::Color::White); + txt.setPosition(next_text_pos); + mainWindow.draw(txt); + + // Draw next piece border + sf::RectangleShape rect; + rect.setPosition(next_grid_pos); + rect.setSize(next_grid_size); + rect.setFillColor(sf::Color(0x00, 0x00, 0x00, 0x40)); + mainWindow.draw(rect); + + // Draw next piece background + sf::RectangleShape rect2; + rect2.setPosition(next_grid_pos + sf::Vector2f(2, 2)); + rect2.setSize(next_grid_size - sf::Vector2f(4, 4)); + rect2.setFillColor(sf::Color(0x02, 0x0a, 0x1a, 0x77)); + mainWindow.draw(rect2); +} + +void Application::drawNextPiece() +{ + // Calculate position + sf::Vector2f scr_size = this->mainWindow.getView().getSize(); + sf::Vector2f tetris_grid_size((scr_size.y - 10) * 0.6f, scr_size.y - 10); + sf::Vector2f tetris_grid_pos = 0.5f * (scr_size - tetris_grid_size); + + sf::Vector2f block_margin_size (tetris_grid_size.x / 10, tetris_grid_size.y / 20); + sf::Vector2f block_size = block_margin_size - sf::Vector2f(2, 2); + + sf::Vector2f next_text_pos = tetris_grid_pos + sf::Vector2f(tetris_grid_size.x + 10, 0); + sf::Vector2f next_grid_pos = next_text_pos + sf::Vector2f(2, 52); + + Piece p = this->game.getNextPiece(); + + // Draw every block + for (int i = 0; i < 5; i++) + for (int j = 0; j < 5; j++) + { + // Get block + int val; + + if (i < p.getHeight() && j < p.getWidth()) + val = p.get(j, i); + else val = 0; + + // Calculate position + float x = next_grid_pos.x + block_margin_size.x * j + 1; + float y = next_grid_pos.y + block_margin_size.y * i + 1; + + // Create block shape + sf::RectangleShape shape(block_size); + shape.setFillColor(sf::Color(pcols[val+1][0], pcols[val+1][1], pcols[val+1][2], pcols[val+1][3])); + shape.setPosition(x, y); + + // Draw block + this->mainWindow.draw(shape); + } +} + +void Application::drawText() +{ + // Calculate position + sf::Vector2f scr_size = this->mainWindow.getView().getSize(); + sf::Vector2f tetris_grid_size((scr_size.y - 10) * 0.6f, scr_size.y - 10); + sf::Vector2f tetris_grid_pos = 0.5f * (scr_size - tetris_grid_size); + + sf::Vector2f score_pos = tetris_grid_pos - sf::Vector2f(150, 0); + + // Get score string + std::stringstream str; + str<<"Score: "<game.getScore()<<"\nLevel: "<game.getLevel(); + + // Draw score + sf::Text txt; + txt.setString(str.str()); + txt.setFont(this->font); + txt.setCharacterSize(25); + txt.setColor(sf::Color::White); + txt.setPosition(score_pos); + mainWindow.draw(txt); + + // Draw if game is over + if (this->game.isGameOver()) + { + sf::Text txt2; + txt2.setString("Game over!"); + txt2.setFont(this->font); + txt2.setCharacterSize(50); + txt2.setColor(sf::Color::White); + + // Set position + sf::FloatRect size = txt2.getLocalBounds(); + txt2.setPosition(0.5f * (scr_size - sf::Vector2f(size.width, size.height))); + + mainWindow.draw(txt2); + } + + else if (this->paused) + { + sf::Text txt2; + txt2.setString("Paused"); + txt2.setFont(this->font); + txt2.setCharacterSize(50); + txt2.setColor(sf::Color::White); + + sf::FloatRect size = txt2.getLocalBounds(); + txt2.setPosition(0.5f * (scr_size - sf::Vector2f(size.width, size.height))); + + mainWindow.draw(txt2); + } +} + +/*********************************** + * Game logic * + ***********************************/ +void Application::onLogicUpdate(sf::Time& elapsed) +{ + this->elapsed += elapsed; + + if (this->elapsed.asMilliseconds() > this->game.getTickTime()) + { + this->elapsed = sf::Time(); + + if (!this->paused) + this->game.tick(); + } +} diff --git a/Application.h b/Application.h new file mode 100644 index 0000000..2e6a80f --- /dev/null +++ b/Application.h @@ -0,0 +1,64 @@ +/* + * Application.hpp + * + * Created on: Aug 14, 2012 + * Author: Tibi + */ + +#ifndef APPLICATION_HPP_ +#define APPLICATION_HPP_ + +#include +#include +#include +#include "Logic/TetrisGame.h" +#include + +class Application { + +private: + + sf::RenderWindow mainWindow; + TetrisGame game; + sf::Time elapsed; + + sf::Texture background_texture; + sf::Font font; + + bool paused; + +protected: + + volatile bool stop_flag; + + // Main application parts + virtual bool initialize(); + virtual void onMainWindowEvent(sf::Event&); + virtual void onStart(); + virtual void onLogicUpdate(sf::Time&); + virtual void onRender(sf::Time&); + virtual void dispose(); + + // Events + virtual void onKeyDown(sf::Event&); + virtual void onResized(sf::Event&); + +private: + // Draw + void drawBackground(); + void drawTetrisGridBackground(); + void drawTetrisGrid(); + void drawNextPieceBackground(); + void drawNextPiece(); + void drawText(); + +public: + Application(); + + virtual int run(); + virtual void stop(); + + virtual ~Application() { } +}; + +#endif /* APPLICATION_HPP_ */ diff --git a/Assets/OptimusPrinceps.ttf b/Assets/OptimusPrinceps.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e11017f1c943dfd3cbfdafb6454d8433265aaeea GIT binary patch literal 41416 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 z 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 JbPhYt{{iFRs6GGy literal 0 HcmV?d00001 diff --git a/Assets/background.tga b/Assets/background.tga new file mode 100644 index 0000000000000000000000000000000000000000..ecffd7b90d68d53220c60376c6c508ca1bbeeb7f GIT binary patch literal 1986342 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

l$<4^&W5# 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

    vAbCj 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

    =K&4~Ck|ckiOb&mD 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

    Ip(n`piam>(+&wIUu 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

    6qj@wFACgnJF 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

    YlW|+>Ep%f~t1% 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 |KZtS!$t`reX@0j)A8Jj9eFQp;EmrzDCgoDC$gS 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%0Ad20G`7o{kpW8M+;iE8`ewGazp8Ae#A&>| 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 z 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Î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 literal 0 HcmV?d00001 diff --git a/Domain/Array2.cpp b/Domain/Array2.cpp new file mode 100644 index 0000000..e5e582b --- /dev/null +++ b/Domain/Array2.cpp @@ -0,0 +1,77 @@ +/* + * Array2.cpp + * + * Created on: May 5, 2013 + * Author: chibi_000 + */ + +#include "Array2.h" +#include + +Array2::Array2(int w, int h) +{ + this->w = w; + this->h = h; + this->data = new int[w * h]; + + memset(this->data, 0, w * h * sizeof(int)); +} + +Array2::Array2(int w, int h, const int* vals) +{ + this->w = w; + this->h = h; + this->data = new int[w * h]; + + memcpy(this->data, vals, w * h * sizeof(int)); +} + +Array2::Array2(const Array2& a) +{ + this->w = a.w; + this->h = a.h; + this->data = new int[w * h]; + + memcpy(this->data, a.data, w * h * sizeof(int)); +} + +Array2& Array2::operator= (const Array2& a) +{ + if (this != &a) + { + delete this->data; + + this->w = a.w; + this->h = a.h; + this->data = new int[w * h]; + + memcpy(this->data, a.data, w * h * sizeof(int)); + } + + return *this; +} + +Array2::~Array2() +{ + delete this->data; +} + +int Array2::get(int x, int y) const +{ + return this->data[y * this->w + x]; +} + +void Array2::set(int x, int y, int value) +{ + this->data[y * this->w + x] = value; +} + +int Array2::getWidth() const +{ + return this->w; +} + +int Array2::getHeight() const +{ + return this->h; +} diff --git a/Domain/Array2.h b/Domain/Array2.h new file mode 100644 index 0000000..6b4e3aa --- /dev/null +++ b/Domain/Array2.h @@ -0,0 +1,37 @@ +/* + * Array2.h + * + * Created on: May 5, 2013 + * Author: chibi_000 + */ + +#ifndef ARRAY2_H_ +#define ARRAY2_H_ + +class Array2 { + +private: + int* data; + int w, h; + +public: + + // Constructors + Array2(int w, int h); + Array2(int w, int h, const int* vals); + Array2(const Array2&); + virtual ~Array2(); + + // Getters + int get(int x, int y) const; + int getWidth() const; + int getHeight() const; + + // Setters + void set(int x, int y, int value); + + // Assignment operator + Array2& operator= (const Array2& a); +}; + +#endif /* ARRAY2_H_ */ diff --git a/Domain/Piece.cpp b/Domain/Piece.cpp new file mode 100644 index 0000000..94de382 --- /dev/null +++ b/Domain/Piece.cpp @@ -0,0 +1,45 @@ +/* + * Piece.cpp + * + * Created on: May 5, 2013 + * Author: chibi_000 + */ + +#include "Piece.h" + +// Constructors +Piece::Piece() : Array2(1, 1) +{ +} + +Piece::Piece(int w, int h) : Array2(w, h) +{ +} + +Piece::Piece(int w, int h, const int* vals) : Array2(w, h, vals) +{ +} + +Piece::Piece(const Piece& p) : Array2(p) +{ +} + +Piece::~Piece() +{ +} + +// Rotate +Piece Piece::rotate() const +{ + // Create a new piece + Piece dest(getHeight(), getWidth()); + + // Rotate 90 degrees + for (int x = 0; x < getWidth(); x++) + for (int y = 0; y < getHeight(); y++) + dest.set(getHeight() - y - 1, x, get(x, y)); + + // Return new piece + return dest; +} + diff --git a/Domain/Piece.h b/Domain/Piece.h new file mode 100644 index 0000000..e4d3f9d --- /dev/null +++ b/Domain/Piece.h @@ -0,0 +1,27 @@ +/* + * Piece.h + * + * Created on: May 5, 2013 + * Author: chibi_000 + */ + +#ifndef PIECE_H_ +#define PIECE_H_ + +#include "Array2.h" + +class Piece : public Array2 { +public: + + // Constructors + Piece(); + Piece(int w, int h); + Piece(int w, int h, const int* vals); + Piece(const Piece& p); + virtual ~Piece(); + + // Rotate + Piece rotate() const; +}; + +#endif /* PIECE_H_ */ diff --git a/Logic/PieceGenerator.cpp b/Logic/PieceGenerator.cpp new file mode 100644 index 0000000..edb516e --- /dev/null +++ b/Logic/PieceGenerator.cpp @@ -0,0 +1,65 @@ +/* + * PieceGenerator.cpp + * + * Created on: May 5, 2013 + * Author: chibi_000 + */ + +#include "PieceGenerator.h" +#include +#include + + +const int PieceGenerator::pieces_array[][8] = { + {4, 1, 1, 1, 1, 1, 0, 0}, + {3, 2, 2, 2, 2, 2, 0, 0}, + {3, 2, 3, 0, 0, 3, 3, 3}, + {3, 2, 0, 4, 0, 4, 4, 4}, + {3, 2, 5, 5, 0, 0, 5, 5}, + {3, 2, 0, 6, 6, 6, 6, 0}, + {2, 2, 7, 7, 7, 7, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0} +}; + +PieceGenerator::PieceGenerator() +{ + // Create pieces + this->initializePieces(); + + // Set random seed + srand(time(NULL)); +} + +PieceGenerator::~PieceGenerator() +{ +} + +void PieceGenerator::initializePieces() +{ + for (int i = 0; this->pieces_array[i][0] != 0; i++) + { + int w = this->pieces_array[i][0]; + int h = this->pieces_array[i][1]; + this->pieces.push_back(Piece(w, h, this->pieces_array[i] + 2)); + } +} + +Piece PieceGenerator::getRandomPiece() const +{ + int i = rand() % this->pieces.size(); + + return this->pieces[i]; +} + +Piece PieceGenerator::getRandomPieceRotated() const +{ + // Get random piece + Piece p = this->getRandomPiece(); + + // Rotate random times + for (int i = rand() % 4; i >= 0; i--) + p = p.rotate(); + + // Return + return p; +} diff --git a/Logic/PieceGenerator.h b/Logic/PieceGenerator.h new file mode 100644 index 0000000..1a1e017 --- /dev/null +++ b/Logic/PieceGenerator.h @@ -0,0 +1,42 @@ +/* + * PieceGenerator.h + * + * Created on: May 5, 2013 + * Author: chibi_000 + */ + +#ifndef PIECEGENERATOR_H_ +#define PIECEGENERATOR_H_ + +#include "../Domain/Piece.h" +#include + +class PieceGenerator { + +private: + + // Constants + static const int pieces_array[][8]; + + +protected: + + // Private fields + std::vector pieces; + + // Private functions + virtual void initializePieces(); + +public: + + // Constructors + PieceGenerator(); + virtual ~PieceGenerator(); + + // Getters + virtual Piece getRandomPiece() const; + virtual Piece getRandomPieceRotated() const; +}; + + +#endif /* PIECEGENERATOR_H_ */ diff --git a/Logic/TetrisGame.cpp b/Logic/TetrisGame.cpp new file mode 100644 index 0000000..5932ff7 --- /dev/null +++ b/Logic/TetrisGame.cpp @@ -0,0 +1,237 @@ +/* + * TetrisGame.cpp + * + * Created on: May 5, 2013 + * Author: chibi_000 + */ + +#include "TetrisGame.h" +#include + +TetrisGame::TetrisGame(int w, int h, const PieceGenerator& pg) + : grid(w, h), gen(pg) +{ + this->score = 0; + this->level = 1; + this->cx = 0; + this->cy = 0; + this->next = gen.getRandomPieceRotated(); + + this->pickNextPiece(); +} + +TetrisGame::~TetrisGame() +{ +} + +int TetrisGame::xToPiece(int x_g) +{ + return x_g - cx; +} + +int TetrisGame::xToGrid(int x_p) +{ + return x_p + cx; +} + +int TetrisGame::yToPiece(int y_g) +{ + return y_g - cy; +} + +int TetrisGame::yToGrid(int y_p) +{ + return y_p + cy; +} + +void TetrisGame::pickNextPiece() +{ + // Next becomes current + this->current = this->next; + + // Pick a new piece + this->next = gen.getRandomPieceRotated(); + + // Set position to middle center + this->cy = -this->current.getHeight(); + this->cx = ( grid.getWidth() - current.getWidth() ) / 2; +} + + +void TetrisGame::putPieceInGrid() +{ + for (int x = 0; x < current.getWidth(); x++) + for (int y = 0; y < current.getHeight(); y++) + grid.set( xToGrid(x), yToGrid(y), grid.get( xToGrid(x), yToGrid(y) ) + current.get(x, y) ); +} + +int TetrisGame::markFullLines() +{ + int total_rows = 0; + + // For each row + for (int y = 0; y < grid.getHeight(); y++) + { + // Count non-empty cells + int count = 0; + + for (int x = 0; x < grid.getWidth(); x++) + count += ( grid.get(x, y) > 0 ) ? 1 : 0; + + // Count equal to width = full line + if (count == grid.getWidth()) + { + total_rows++; + + for (int x = 0; x < grid.getWidth(); x++) + grid.set(x, y, -1); + } + } + + // Return found rows + return total_rows; +} + +void TetrisGame::removeFullLines() +{ + for (int yto = grid.getHeight()-1, yfrom = yto; yto >= 0; yto--, yfrom--) + { + // Skip full lines + while (grid.get(0, yfrom) == -1 && yfrom >= 0) + yfrom--; + + // Remove content + for (int x = 0; x < grid.getWidth(); x++) + if (yfrom < 0) + grid.set(x, yto, 0); + else + grid.set(x, yto, grid.get(x, yfrom)); + } +} + +bool TetrisGame::isGameOver() +{ + for (int x = 0; x < grid.getWidth(); x++) + if (grid.get(x, 0) != 0) + return true; + + return false; +} + +bool TetrisGame::collides(int cx, int cy, const Piece& p) +{ + // Check bounds + if (cx < 0 || cx + p.getWidth() > grid.getWidth()) + return true; + + if (cy + p.getHeight() > grid.getHeight()) + return true; + + // Check every piece + for (int x = 0; x < p.getWidth(); x++) + for (int y = 0; y < p.getHeight(); y++) + if ( y+cy >= 0 && p.get(x, y) != 0 && grid.get(x+cx, y+cy) != 0 ) + return true; + + return false; +} + +bool TetrisGame::collidesDown() +{ + return this->collides(cx, cy+1, current); +} + +bool TetrisGame::collidesLeft() +{ + return this->collides(cx-1, cy, current); +} + +bool TetrisGame::collidesRight() +{ + return this->collides(cx+1, cy, current); +} + +void TetrisGame::moveLeft() +{ + if (!this->collidesLeft()) + this->cx--; +} + +void TetrisGame::moveRight() +{ + if (!this->collidesRight()) + this->cx++; +} + +void TetrisGame::moveDown() +{ + while (!this->collidesDown()) + this->cy++; +} + +void TetrisGame::rotate() +{ + Piece rot = current.rotate(); + + if (!this->collides(cx, cy, rot)) + current = rot; +} + +void TetrisGame::tick() +{ + // Check if game is over + if (this->isGameOver()) + return; + + // Remove full lines + this->removeFullLines(); + + // Piece is down + if (this->collidesDown()) + { + this->putPieceInGrid(); + this->pickNextPiece(); + + int count = this->markFullLines(); + + // Calculate score + this->score += (1<<(count - 1)) * 100; + if (this->score > (1<<(level - 1)) * 5000) + this->level++; + } + + // Piece is not down, simply move it + else this->cy++; +} + +int TetrisGame::get(int x, int y) +{ + bool col = cx <= x && x < cx + current.getWidth(); + bool row = cy <= y && y < cy + current.getHeight(); + + if (col && row) + return grid.get(x, y) + current.get( xToPiece(x), yToPiece(y) ); + + return grid.get(x, y); +} + +Piece TetrisGame::getNextPiece() +{ + return next; +} + +int TetrisGame::getScore() +{ + return score; +} + +int TetrisGame::getLevel() +{ + return level; +} + +int TetrisGame::getTickTime() +{ + float l = sqrtf(this->level); + return 800 / l; +} diff --git a/Logic/TetrisGame.h b/Logic/TetrisGame.h new file mode 100644 index 0000000..e4f1775 --- /dev/null +++ b/Logic/TetrisGame.h @@ -0,0 +1,65 @@ +/* + * TetrisGame.h + * + * Created on: May 5, 2013 + * Author: chibi_000 + */ + +#ifndef TETRISGAME_H_ +#define TETRISGAME_H_ + +#include "../Domain/Array2.h" +#include "PieceGenerator.h" + +class TetrisGame { + +private: + Array2 grid; + Piece current, next; + PieceGenerator gen; + + int score, level; + int cy, cx; + + // Position convert + int xToPiece(int col_g); + int xToGrid(int col_p); + int yToPiece(int row_g); + int yToGrid(int row_p); + + // Pieces + void pickNextPiece(); + void putPieceInGrid(); + + // Lines + int markFullLines(); + void removeFullLines(); + + // Collisions + bool collides(int cx, int cy, const Piece& p); + bool collidesDown(); + bool collidesLeft(); + bool collidesRight(); + +public: + TetrisGame(int w=10, int h=20, const PieceGenerator& gen = PieceGenerator()); + virtual ~TetrisGame(); + + // Gameplay + bool isGameOver(); + void tick(); + + void moveLeft(); + void moveRight(); + void moveDown(); + void rotate(); + + // Getters + int get(int x, int y); + int getScore(); + int getLevel(); + int getTickTime(); + Piece getNextPiece(); +}; + +#endif /* TETRISGAME_H_ */ diff --git a/SFML-2.4.2/cmake/Modules/FindSFML.cmake b/SFML-2.4.2/cmake/Modules/FindSFML.cmake new file mode 100644 index 0000000..fe84c96 --- /dev/null +++ b/SFML-2.4.2/cmake/Modules/FindSFML.cmake @@ -0,0 +1,365 @@ +# This script locates the SFML library +# ------------------------------------ +# +# Usage +# ----- +# +# When you try to locate the SFML libraries, you must specify which modules you want to use (system, window, graphics, network, audio, main). +# If none is given, the SFML_LIBRARIES variable will be empty and you'll end up linking to nothing. +# example: +# find_package(SFML COMPONENTS graphics window system) # find the graphics, window and system modules +# +# You can enforce a specific version, either MAJOR.MINOR or only MAJOR. +# If nothing is specified, the version won't be checked (i.e. any version will be accepted). +# example: +# find_package(SFML COMPONENTS ...) # no specific version required +# find_package(SFML 2 COMPONENTS ...) # any 2.x version +# find_package(SFML 2.4 COMPONENTS ...) # version 2.4 or greater +# +# By default, the dynamic libraries of SFML will be found. To find the static ones instead, +# you must set the SFML_STATIC_LIBRARIES variable to TRUE before calling find_package(SFML ...). +# Since you have to link yourself all the SFML dependencies when you link it statically, the following +# additional variables are defined: SFML_XXX_DEPENDENCIES and SFML_DEPENDENCIES (see their detailed +# description below). +# In case of static linking, the SFML_STATIC macro will also be defined by this script. +# example: +# set(SFML_STATIC_LIBRARIES TRUE) +# find_package(SFML 2 COMPONENTS network system) +# +# On Mac OS X if SFML_STATIC_LIBRARIES is not set to TRUE then by default CMake will search for frameworks unless +# CMAKE_FIND_FRAMEWORK is set to "NEVER" for example. Please refer to CMake documentation for more details. +# Moreover, keep in mind that SFML frameworks are only available as release libraries unlike dylibs which +# are available for both release and debug modes. +# +# If SFML is not installed in a standard path, you can use the SFML_ROOT CMake (or environment) variable +# to tell CMake where SFML is. +# +# Output +# ------ +# +# This script defines the following variables: +# - For each specified module XXX (system, window, graphics, network, audio, main): +# - SFML_XXX_LIBRARY_DEBUG: the name of the debug library of the xxx module (set to SFML_XXX_LIBRARY_RELEASE is no debug version is found) +# - SFML_XXX_LIBRARY_RELEASE: the name of the release library of the xxx module (set to SFML_XXX_LIBRARY_DEBUG is no release version is found) +# - SFML_XXX_LIBRARY: the name of the library to link to for the xxx module (includes both debug and optimized names if necessary) +# - SFML_XXX_FOUND: true if either the debug or release library of the xxx module is found +# - SFML_XXX_DEPENDENCIES: the list of libraries the module depends on, in case of static linking +# - SFML_LIBRARIES: the list of all libraries corresponding to the required modules +# - SFML_FOUND: true if all the required modules are found +# - SFML_INCLUDE_DIR: the path where SFML headers are located (the directory containing the SFML/Config.hpp file) +# - SFML_DEPENDENCIES: the list of libraries SFML depends on, in case of static linking +# +# example: +# find_package(SFML 2 COMPONENTS system window graphics audio REQUIRED) +# include_directories(${SFML_INCLUDE_DIR}) +# add_executable(myapp ...) +# target_link_libraries(myapp ${SFML_LIBRARIES}) + +# define the SFML_STATIC macro if static build was chosen +if(SFML_STATIC_LIBRARIES) + add_definitions(-DSFML_STATIC) +endif() + +# define the list of search paths for headers and libraries +set(FIND_SFML_PATHS + ${SFML_ROOT} + $ENV{SFML_ROOT} + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt) + +# find the SFML include directory +find_path(SFML_INCLUDE_DIR SFML/Config.hpp + PATH_SUFFIXES include + PATHS ${FIND_SFML_PATHS}) + +# check the version number +set(SFML_VERSION_OK TRUE) +if(SFML_FIND_VERSION AND SFML_INCLUDE_DIR) + # extract the major and minor version numbers from SFML/Config.hpp + # we have to handle framework a little bit differently: + if("${SFML_INCLUDE_DIR}" MATCHES "SFML.framework") + set(SFML_CONFIG_HPP_INPUT "${SFML_INCLUDE_DIR}/Headers/Config.hpp") + else() + set(SFML_CONFIG_HPP_INPUT "${SFML_INCLUDE_DIR}/SFML/Config.hpp") + endif() + FILE(READ "${SFML_CONFIG_HPP_INPUT}" SFML_CONFIG_HPP_CONTENTS) + STRING(REGEX REPLACE ".*#define SFML_VERSION_MAJOR ([0-9]+).*" "\\1" SFML_VERSION_MAJOR "${SFML_CONFIG_HPP_CONTENTS}") + STRING(REGEX REPLACE ".*#define SFML_VERSION_MINOR ([0-9]+).*" "\\1" SFML_VERSION_MINOR "${SFML_CONFIG_HPP_CONTENTS}") + STRING(REGEX REPLACE ".*#define SFML_VERSION_PATCH ([0-9]+).*" "\\1" SFML_VERSION_PATCH "${SFML_CONFIG_HPP_CONTENTS}") + if (NOT "${SFML_VERSION_PATCH}" MATCHES "^[0-9]+$") + set(SFML_VERSION_PATCH 0) + endif() + math(EXPR SFML_REQUESTED_VERSION "${SFML_FIND_VERSION_MAJOR} * 10000 + ${SFML_FIND_VERSION_MINOR} * 100 + ${SFML_FIND_VERSION_PATCH}") + + # if we could extract them, compare with the requested version number + if (SFML_VERSION_MAJOR) + # transform version numbers to an integer + math(EXPR SFML_VERSION "${SFML_VERSION_MAJOR} * 10000 + ${SFML_VERSION_MINOR} * 100 + ${SFML_VERSION_PATCH}") + + # compare them + if(SFML_VERSION LESS SFML_REQUESTED_VERSION) + set(SFML_VERSION_OK FALSE) + endif() + else() + # SFML version is < 2.0 + if (SFML_REQUESTED_VERSION GREATER 10900) + set(SFML_VERSION_OK FALSE) + set(SFML_VERSION_MAJOR 1) + set(SFML_VERSION_MINOR x) + set(SFML_VERSION_PATCH x) + endif() + endif() +endif() + +# find the requested modules +set(SFML_FOUND TRUE) # will be set to false if one of the required modules is not found +foreach(FIND_SFML_COMPONENT ${SFML_FIND_COMPONENTS}) + string(TOLOWER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_LOWER) + string(TOUPPER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_UPPER) + set(FIND_SFML_COMPONENT_NAME sfml-${FIND_SFML_COMPONENT_LOWER}) + + # no suffix for sfml-main, it is always a static library + if(FIND_SFML_COMPONENT_LOWER STREQUAL "main") + # release library + find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE + NAMES ${FIND_SFML_COMPONENT_NAME} + PATH_SUFFIXES lib64 lib + PATHS ${FIND_SFML_PATHS}) + + # debug library + find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG + NAMES ${FIND_SFML_COMPONENT_NAME}-d + PATH_SUFFIXES lib64 lib + PATHS ${FIND_SFML_PATHS}) + else() + # static release library + find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_RELEASE + NAMES ${FIND_SFML_COMPONENT_NAME}-s + PATH_SUFFIXES lib64 lib + PATHS ${FIND_SFML_PATHS}) + + # static debug library + find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_DEBUG + NAMES ${FIND_SFML_COMPONENT_NAME}-s-d + PATH_SUFFIXES lib64 lib + PATHS ${FIND_SFML_PATHS}) + + # dynamic release library + find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_RELEASE + NAMES ${FIND_SFML_COMPONENT_NAME} + PATH_SUFFIXES lib64 lib + PATHS ${FIND_SFML_PATHS}) + + # dynamic debug library + find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_DEBUG + NAMES ${FIND_SFML_COMPONENT_NAME}-d + PATH_SUFFIXES lib64 lib + PATHS ${FIND_SFML_PATHS}) + + # choose the entries that fit the requested link type + if(SFML_STATIC_LIBRARIES) + if(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_RELEASE) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_RELEASE}) + endif() + if(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_DEBUG) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_DEBUG}) + endif() + else() + if(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_RELEASE) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_RELEASE}) + endif() + if(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_DEBUG) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_DEBUG}) + endif() + endif() + endif() + + if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG OR SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE) + # library found + set(SFML_${FIND_SFML_COMPONENT_UPPER}_FOUND TRUE) + + # if both are found, set SFML_XXX_LIBRARY to contain both + if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG AND SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY debug ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG} + optimized ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE}) + endif() + + # if only one debug/release variant is found, set the other to be equal to the found one + if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG AND NOT SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE) + # debug and not release + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG}) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG}) + endif() + if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE AND NOT SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG) + # release and not debug + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE}) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE}) + endif() + else() + # library not found + set(SFML_FOUND FALSE) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_FOUND FALSE) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY "") + set(FIND_SFML_MISSING "${FIND_SFML_MISSING} SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY") + endif() + + # mark as advanced + MARK_AS_ADVANCED(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY + SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE + SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG + SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_RELEASE + SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_DEBUG + SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_RELEASE + SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_DEBUG) + + # add to the global list of libraries + set(SFML_LIBRARIES ${SFML_LIBRARIES} "${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY}") +endforeach() + +# in case of static linking, we must also define the list of all the dependencies of SFML libraries +if(SFML_STATIC_LIBRARIES) + + # detect the OS + if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + set(FIND_SFML_OS_WINDOWS 1) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(FIND_SFML_OS_LINUX 1) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + set(FIND_SFML_OS_FREEBSD 1) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(FIND_SFML_OS_MACOSX 1) + endif() + + # start with an empty list + set(SFML_DEPENDENCIES) + set(FIND_SFML_DEPENDENCIES_NOTFOUND) + + # macro that searches for a 3rd-party library + macro(find_sfml_dependency output friendlyname) + # No lookup in environment variables (PATH on Windows), as they may contain wrong library versions + find_library(${output} NAMES ${ARGN} PATHS ${FIND_SFML_PATHS} PATH_SUFFIXES lib NO_SYSTEM_ENVIRONMENT_PATH) + if(${${output}} STREQUAL "${output}-NOTFOUND") + unset(output) + set(FIND_SFML_DEPENDENCIES_NOTFOUND "${FIND_SFML_DEPENDENCIES_NOTFOUND} ${friendlyname}") + endif() + endmacro() + + # sfml-system + list(FIND SFML_FIND_COMPONENTS "system" FIND_SFML_SYSTEM_COMPONENT) + if(NOT ${FIND_SFML_SYSTEM_COMPONENT} EQUAL -1) + + # update the list -- these are only system libraries, no need to find them + if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD OR FIND_SFML_OS_MACOSX) + set(SFML_SYSTEM_DEPENDENCIES "pthread") + endif() + if(FIND_SFML_OS_LINUX) + set(SFML_SYSTEM_DEPENDENCIES ${SFML_SYSTEM_DEPENDENCIES} "rt") + endif() + if(FIND_SFML_OS_WINDOWS) + set(SFML_SYSTEM_DEPENDENCIES "winmm") + endif() + set(SFML_DEPENDENCIES ${SFML_SYSTEM_DEPENDENCIES} ${SFML_DEPENDENCIES}) + endif() + + # sfml-network + list(FIND SFML_FIND_COMPONENTS "network" FIND_SFML_NETWORK_COMPONENT) + if(NOT ${FIND_SFML_NETWORK_COMPONENT} EQUAL -1) + + # update the list -- these are only system libraries, no need to find them + if(FIND_SFML_OS_WINDOWS) + set(SFML_NETWORK_DEPENDENCIES "ws2_32") + endif() + set(SFML_DEPENDENCIES ${SFML_NETWORK_DEPENDENCIES} ${SFML_DEPENDENCIES}) + endif() + + # sfml-window + list(FIND SFML_FIND_COMPONENTS "window" FIND_SFML_WINDOW_COMPONENT) + if(NOT ${FIND_SFML_WINDOW_COMPONENT} EQUAL -1) + + # find libraries + if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD) + find_sfml_dependency(X11_LIBRARY "X11" X11) + find_sfml_dependency(XRANDR_LIBRARY "Xrandr" Xrandr) + endif() + + if(FIND_SFML_OS_LINUX) + find_sfml_dependency(UDEV_LIBRARIES "UDev" udev libudev) + endif() + + # update the list + if(FIND_SFML_OS_WINDOWS) + set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "opengl32" "winmm" "gdi32") + elseif(FIND_SFML_OS_LINUX) + set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "GL" ${X11_LIBRARY} ${XRANDR_LIBRARY} ${UDEV_LIBRARIES}) + elseif(FIND_SFML_OS_FREEBSD) + set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "GL" ${X11_LIBRARY} ${XRANDR_LIBRARY} "usbhid") + elseif(FIND_SFML_OS_MACOSX) + set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "-framework OpenGL -framework Foundation -framework AppKit -framework IOKit -framework Carbon") + endif() + set(SFML_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} ${SFML_DEPENDENCIES}) + endif() + + # sfml-graphics + list(FIND SFML_FIND_COMPONENTS "graphics" FIND_SFML_GRAPHICS_COMPONENT) + if(NOT ${FIND_SFML_GRAPHICS_COMPONENT} EQUAL -1) + + # find libraries + find_sfml_dependency(FREETYPE_LIBRARY "FreeType" freetype) + find_sfml_dependency(JPEG_LIBRARY "libjpeg" jpeg) + + # update the list + set(SFML_GRAPHICS_DEPENDENCIES ${FREETYPE_LIBRARY} ${JPEG_LIBRARY}) + set(SFML_DEPENDENCIES ${SFML_GRAPHICS_DEPENDENCIES} ${SFML_DEPENDENCIES}) + endif() + + # sfml-audio + list(FIND SFML_FIND_COMPONENTS "audio" FIND_SFML_AUDIO_COMPONENT) + if(NOT ${FIND_SFML_AUDIO_COMPONENT} EQUAL -1) + + # find libraries + find_sfml_dependency(OPENAL_LIBRARY "OpenAL" openal openal32) + find_sfml_dependency(OGG_LIBRARY "Ogg" ogg) + find_sfml_dependency(VORBIS_LIBRARY "Vorbis" vorbis) + find_sfml_dependency(VORBISFILE_LIBRARY "VorbisFile" vorbisfile) + find_sfml_dependency(VORBISENC_LIBRARY "VorbisEnc" vorbisenc) + find_sfml_dependency(FLAC_LIBRARY "FLAC" FLAC) + + # update the list + set(SFML_AUDIO_DEPENDENCIES ${OPENAL_LIBRARY} ${FLAC_LIBRARY} ${VORBISENC_LIBRARY} ${VORBISFILE_LIBRARY} ${VORBIS_LIBRARY} ${OGG_LIBRARY}) + set(SFML_DEPENDENCIES ${SFML_DEPENDENCIES} ${SFML_AUDIO_DEPENDENCIES}) + endif() + +endif() + +# handle errors +if(NOT SFML_VERSION_OK) + # SFML version not ok + set(FIND_SFML_ERROR "SFML found but version too low (requested: ${SFML_FIND_VERSION}, found: ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR}.${SFML_VERSION_PATCH})") + set(SFML_FOUND FALSE) +elseif(SFML_STATIC_LIBRARIES AND FIND_SFML_DEPENDENCIES_NOTFOUND) + set(FIND_SFML_ERROR "SFML found but some of its dependencies are missing (${FIND_SFML_DEPENDENCIES_NOTFOUND})") + set(SFML_FOUND FALSE) +elseif(NOT SFML_FOUND) + # include directory or library not found + set(FIND_SFML_ERROR "Could NOT find SFML (missing: ${FIND_SFML_MISSING})") +endif() +if (NOT SFML_FOUND) + if(SFML_FIND_REQUIRED) + # fatal error + message(FATAL_ERROR ${FIND_SFML_ERROR}) + elseif(NOT SFML_FIND_QUIETLY) + # error but continue + message("${FIND_SFML_ERROR}") + endif() +endif() + +# handle success +if(SFML_FOUND AND NOT SFML_FIND_QUIETLY) + message(STATUS "Found SFML ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR}.${SFML_VERSION_PATCH} in ${SFML_INCLUDE_DIR}") +endif() diff --git a/SFML-2.4.2/include/SFML/Audio.hpp b/SFML-2.4.2/include/SFML/Audio.hpp new file mode 100644 index 0000000..2d3e5d7 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio.hpp @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_AUDIO_HPP +#define SFML_AUDIO_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#endif // SFML_AUDIO_HPP + +//////////////////////////////////////////////////////////// +/// \defgroup audio Audio module +/// +/// Sounds, streaming (musics or custom sources), recording, +/// spatialization. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/AlResource.hpp b/SFML-2.4.2/include/SFML/Audio/AlResource.hpp new file mode 100644 index 0000000..2cb48d0 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/AlResource.hpp @@ -0,0 +1,70 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_ALRESOURCE_HPP +#define SFML_ALRESOURCE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Base class for classes that require an OpenAL context +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API AlResource +{ +protected: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + AlResource(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~AlResource(); +}; + +} // namespace sf + + +#endif // SFML_ALRESOURCE_HPP + +//////////////////////////////////////////////////////////// +/// \class sf::AlResource +/// \ingroup audio +/// +/// This class is for internal use only, it must be the base +/// of every class that requires a valid OpenAL context in +/// order to work. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/Export.hpp b/SFML-2.4.2/include/SFML/Audio/Export.hpp new file mode 100644 index 0000000..31e463e --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/Export.hpp @@ -0,0 +1,48 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_AUDIO_EXPORT_HPP +#define SFML_AUDIO_EXPORT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +//////////////////////////////////////////////////////////// +// Define portable import / export macros +//////////////////////////////////////////////////////////// +#if defined(SFML_AUDIO_EXPORTS) + + #define SFML_AUDIO_API SFML_API_EXPORT + +#else + + #define SFML_AUDIO_API SFML_API_IMPORT + +#endif + + +#endif // SFML_AUDIO_EXPORT_HPP diff --git a/SFML-2.4.2/include/SFML/Audio/InputSoundFile.hpp b/SFML-2.4.2/include/SFML/Audio/InputSoundFile.hpp new file mode 100644 index 0000000..672ea43 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/InputSoundFile.hpp @@ -0,0 +1,256 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_INPUTSOUNDFILE_HPP +#define SFML_INPUTSOUNDFILE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +class InputStream; +class SoundFileReader; + +//////////////////////////////////////////////////////////// +/// \brief Provide read access to sound files +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API InputSoundFile : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + InputSoundFile(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~InputSoundFile(); + + //////////////////////////////////////////////////////////// + /// \brief Open a sound file from the disk for reading + /// + /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC. + /// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit. + /// + /// \param filename Path of the sound file to load + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + bool openFromFile(const std::string& filename); + + //////////////////////////////////////////////////////////// + /// \brief Open a sound file in memory for reading + /// + /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC. + /// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit. + /// + /// \param data Pointer to the file data in memory + /// \param sizeInBytes Size of the data to load, in bytes + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + bool openFromMemory(const void* data, std::size_t sizeInBytes); + + //////////////////////////////////////////////////////////// + /// \brief Open a sound file from a custom stream for reading + /// + /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC. + /// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit. + /// + /// \param stream Source stream to read from + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + bool openFromStream(InputStream& stream); + + //////////////////////////////////////////////////////////// + /// \brief Open the sound file from the disk for writing + /// + /// \param filename Path of the sound file to write + /// \param channelCount Number of channels in the sound + /// \param sampleRate Sample rate of the sound + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + bool openForWriting(const std::string& filename, unsigned int channelCount, unsigned int sampleRate); + + //////////////////////////////////////////////////////////// + /// \brief Get the total number of audio samples in the file + /// + /// \return Number of samples + /// + //////////////////////////////////////////////////////////// + Uint64 getSampleCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the number of channels used by the sound + /// + /// \return Number of channels (1 = mono, 2 = stereo) + /// + //////////////////////////////////////////////////////////// + unsigned int getChannelCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the sample rate of the sound + /// + /// \return Sample rate, in samples per second + /// + //////////////////////////////////////////////////////////// + unsigned int getSampleRate() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the total duration of the sound file + /// + /// This function is provided for convenience, the duration is + /// deduced from the other sound file attributes. + /// + /// \return Duration of the sound file + /// + //////////////////////////////////////////////////////////// + Time getDuration() const; + + //////////////////////////////////////////////////////////// + /// \brief Change the current read position to the given sample offset + /// + /// This function takes a sample offset to provide maximum + /// precision. If you need to jump to a given time, use the + /// other overload. + /// + /// The sample offset takes the channels into account. + /// Offsets can be calculated like this: + /// `sampleNumber * sampleRate * channelCount` + /// If the given offset exceeds to total number of samples, + /// this function jumps to the end of the sound file. + /// + /// \param sampleOffset Index of the sample to jump to, relative to the beginning + /// + //////////////////////////////////////////////////////////// + void seek(Uint64 sampleOffset); + + //////////////////////////////////////////////////////////// + /// \brief Change the current read position to the given time offset + /// + /// Using a time offset is handy but imprecise. If you need an accurate + /// result, consider using the overload which takes a sample offset. + /// + /// If the given time exceeds to total duration, this function jumps + /// to the end of the sound file. + /// + /// \param timeOffset Time to jump to, relative to the beginning + /// + //////////////////////////////////////////////////////////// + void seek(Time timeOffset); + + //////////////////////////////////////////////////////////// + /// \brief Read audio samples from the open file + /// + /// \param samples Pointer to the sample array to fill + /// \param maxCount Maximum number of samples to read + /// + /// \return Number of samples actually read (may be less than \a maxCount) + /// + //////////////////////////////////////////////////////////// + Uint64 read(Int16* samples, Uint64 maxCount); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Close the current file + /// + //////////////////////////////////////////////////////////// + void close(); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + SoundFileReader* m_reader; ///< Reader that handles I/O on the file's format + InputStream* m_stream; ///< Input stream used to access the file's data + bool m_streamOwned; ///< Is the stream internal or external? + Uint64 m_sampleCount; ///< Total number of samples in the file + unsigned int m_channelCount; ///< Number of channels of the sound + unsigned int m_sampleRate; ///< Number of samples per second +}; + +} // namespace sf + + +#endif // SFML_INPUTSOUNDFILE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::InputSoundFile +/// \ingroup audio +/// +/// This class decodes audio samples from a sound file. It is +/// used internally by higher-level classes such as sf::SoundBuffer +/// and sf::Music, but can also be useful if you want to process +/// or analyze audio files without playing them, or if you want to +/// implement your own version of sf::Music with more specific +/// features. +/// +/// Usage example: +/// \code +/// // Open a sound file +/// sf::InputSoundFile file; +/// if (!file.openFromFile("music.ogg")) +/// /* error */; +/// +/// // Print the sound attributes +/// std::cout << "duration: " << file.getDuration().asSeconds() << std::endl; +/// std::cout << "channels: " << file.getChannelCount() << std::endl; +/// std::cout << "sample rate: " << file.getSampleRate() << std::endl; +/// std::cout << "sample count: " << file.getSampleCount() << std::endl; +/// +/// // Read and process batches of samples until the end of file is reached +/// sf::Int16 samples[1024]; +/// sf::Uint64 count; +/// do +/// { +/// count = file.read(samples, 1024); +/// +/// // process, analyze, play, convert, or whatever +/// // you want to do with the samples... +/// } +/// while (count > 0); +/// \endcode +/// +/// \see sf::SoundFileReader, sf::OutputSoundFile +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/Listener.hpp b/SFML-2.4.2/include/SFML/Audio/Listener.hpp new file mode 100644 index 0000000..af83e25 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/Listener.hpp @@ -0,0 +1,234 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_LISTENER_HPP +#define SFML_LISTENER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief The audio listener is the point in the scene +/// from where all the sounds are heard +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API Listener +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Change the global volume of all the sounds and musics + /// + /// The volume is a number between 0 and 100; it is combined with + /// the individual volume of each sound / music. + /// The default value for the volume is 100 (maximum). + /// + /// \param volume New global volume, in the range [0, 100] + /// + /// \see getGlobalVolume + /// + //////////////////////////////////////////////////////////// + static void setGlobalVolume(float volume); + + //////////////////////////////////////////////////////////// + /// \brief Get the current value of the global volume + /// + /// \return Current global volume, in the range [0, 100] + /// + /// \see setGlobalVolume + /// + //////////////////////////////////////////////////////////// + static float getGlobalVolume(); + + //////////////////////////////////////////////////////////// + /// \brief Set the position of the listener in the scene + /// + /// The default listener's position is (0, 0, 0). + /// + /// \param x X coordinate of the listener's position + /// \param y Y coordinate of the listener's position + /// \param z Z coordinate of the listener's position + /// + /// \see getPosition, setDirection + /// + //////////////////////////////////////////////////////////// + static void setPosition(float x, float y, float z); + + //////////////////////////////////////////////////////////// + /// \brief Set the position of the listener in the scene + /// + /// The default listener's position is (0, 0, 0). + /// + /// \param position New listener's position + /// + /// \see getPosition, setDirection + /// + //////////////////////////////////////////////////////////// + static void setPosition(const Vector3f& position); + + //////////////////////////////////////////////////////////// + /// \brief Get the current position of the listener in the scene + /// + /// \return Listener's position + /// + /// \see setPosition + /// + //////////////////////////////////////////////////////////// + static Vector3f getPosition(); + + //////////////////////////////////////////////////////////// + /// \brief Set the forward vector of the listener in the scene + /// + /// The direction (also called "at vector") is the vector + /// pointing forward from the listener's perspective. Together + /// with the up vector, it defines the 3D orientation of the + /// listener in the scene. The direction vector doesn't + /// have to be normalized. + /// The default listener's direction is (0, 0, -1). + /// + /// \param x X coordinate of the listener's direction + /// \param y Y coordinate of the listener's direction + /// \param z Z coordinate of the listener's direction + /// + /// \see getDirection, setUpVector, setPosition + /// + //////////////////////////////////////////////////////////// + static void setDirection(float x, float y, float z); + + //////////////////////////////////////////////////////////// + /// \brief Set the forward vector of the listener in the scene + /// + /// The direction (also called "at vector") is the vector + /// pointing forward from the listener's perspective. Together + /// with the up vector, it defines the 3D orientation of the + /// listener in the scene. The direction vector doesn't + /// have to be normalized. + /// The default listener's direction is (0, 0, -1). + /// + /// \param direction New listener's direction + /// + /// \see getDirection, setUpVector, setPosition + /// + //////////////////////////////////////////////////////////// + static void setDirection(const Vector3f& direction); + + //////////////////////////////////////////////////////////// + /// \brief Get the current forward vector of the listener in the scene + /// + /// \return Listener's forward vector (not normalized) + /// + /// \see setDirection + /// + //////////////////////////////////////////////////////////// + static Vector3f getDirection(); + + //////////////////////////////////////////////////////////// + /// \brief Set the upward vector of the listener in the scene + /// + /// The up vector is the vector that points upward from the + /// listener's perspective. Together with the direction, it + /// defines the 3D orientation of the listener in the scene. + /// The up vector doesn't have to be normalized. + /// The default listener's up vector is (0, 1, 0). It is usually + /// not necessary to change it, especially in 2D scenarios. + /// + /// \param x X coordinate of the listener's up vector + /// \param y Y coordinate of the listener's up vector + /// \param z Z coordinate of the listener's up vector + /// + /// \see getUpVector, setDirection, setPosition + /// + //////////////////////////////////////////////////////////// + static void setUpVector(float x, float y, float z); + + //////////////////////////////////////////////////////////// + /// \brief Set the upward vector of the listener in the scene + /// + /// The up vector is the vector that points upward from the + /// listener's perspective. Together with the direction, it + /// defines the 3D orientation of the listener in the scene. + /// The up vector doesn't have to be normalized. + /// The default listener's up vector is (0, 1, 0). It is usually + /// not necessary to change it, especially in 2D scenarios. + /// + /// \param upVector New listener's up vector + /// + /// \see getUpVector, setDirection, setPosition + /// + //////////////////////////////////////////////////////////// + static void setUpVector(const Vector3f& upVector); + + //////////////////////////////////////////////////////////// + /// \brief Get the current upward vector of the listener in the scene + /// + /// \return Listener's upward vector (not normalized) + /// + /// \see setUpVector + /// + //////////////////////////////////////////////////////////// + static Vector3f getUpVector(); +}; + +} // namespace sf + + +#endif // SFML_LISTENER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Listener +/// \ingroup audio +/// +/// The audio listener defines the global properties of the +/// audio environment, it defines where and how sounds and musics +/// are heard. If sf::View is the eyes of the user, then sf::Listener +/// is his ears (by the way, they are often linked together -- +/// same position, orientation, etc.). +/// +/// sf::Listener is a simple interface, which allows to setup the +/// listener in the 3D audio environment (position, direction and +/// up vector), and to adjust the global volume. +/// +/// Because the listener is unique in the scene, sf::Listener only +/// contains static functions and doesn't have to be instantiated. +/// +/// Usage example: +/// \code +/// // Move the listener to the position (1, 0, -5) +/// sf::Listener::setPosition(1, 0, -5); +/// +/// // Make it face the right axis (1, 0, 0) +/// sf::Listener::setDirection(1, 0, 0); +/// +/// // Reduce the global volume +/// sf::Listener::setGlobalVolume(50); +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/Music.hpp b/SFML-2.4.2/include/SFML/Audio/Music.hpp new file mode 100644 index 0000000..8114923 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/Music.hpp @@ -0,0 +1,229 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_MUSIC_HPP +#define SFML_MUSIC_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +class InputStream; + +//////////////////////////////////////////////////////////// +/// \brief Streamed music played from an audio file +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API Music : public SoundStream +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + Music(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~Music(); + + //////////////////////////////////////////////////////////// + /// \brief Open a music from an audio file + /// + /// This function doesn't start playing the music (call play() + /// to do so). + /// See the documentation of sf::InputSoundFile for the list + /// of supported formats. + /// + /// \warning Since the music is not loaded at once but rather + /// streamed continuously, the file must remain accessible until + /// the sf::Music object loads a new music or is destroyed. + /// + /// \param filename Path of the music file to open + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see openFromMemory, openFromStream + /// + //////////////////////////////////////////////////////////// + bool openFromFile(const std::string& filename); + + //////////////////////////////////////////////////////////// + /// \brief Open a music from an audio file in memory + /// + /// This function doesn't start playing the music (call play() + /// to do so). + /// See the documentation of sf::InputSoundFile for the list + /// of supported formats. + /// + /// \warning Since the music is not loaded at once but rather streamed + /// continuously, the \a data buffer must remain accessible until + /// the sf::Music object loads a new music or is destroyed. That is, + /// you can't deallocate the buffer right after calling this function. + /// + /// \param data Pointer to the file data in memory + /// \param sizeInBytes Size of the data to load, in bytes + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see openFromFile, openFromStream + /// + //////////////////////////////////////////////////////////// + bool openFromMemory(const void* data, std::size_t sizeInBytes); + + //////////////////////////////////////////////////////////// + /// \brief Open a music from an audio file in a custom stream + /// + /// This function doesn't start playing the music (call play() + /// to do so). + /// See the documentation of sf::InputSoundFile for the list + /// of supported formats. + /// + /// \warning Since the music is not loaded at once but rather + /// streamed continuously, the \a stream must remain accessible + /// until the sf::Music object loads a new music or is destroyed. + /// + /// \param stream Source stream to read from + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see openFromFile, openFromMemory + /// + //////////////////////////////////////////////////////////// + bool openFromStream(InputStream& stream); + + //////////////////////////////////////////////////////////// + /// \brief Get the total duration of the music + /// + /// \return Music duration + /// + //////////////////////////////////////////////////////////// + Time getDuration() const; + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Request a new chunk of audio samples from the stream source + /// + /// This function fills the chunk from the next samples + /// to read from the audio file. + /// + /// \param data Chunk of data to fill + /// + /// \return True to continue playback, false to stop + /// + //////////////////////////////////////////////////////////// + virtual bool onGetData(Chunk& data); + + //////////////////////////////////////////////////////////// + /// \brief Change the current playing position in the stream source + /// + /// \param timeOffset New playing position, from the beginning of the music + /// + //////////////////////////////////////////////////////////// + virtual void onSeek(Time timeOffset); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Initialize the internal state after loading a new music + /// + //////////////////////////////////////////////////////////// + void initialize(); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + InputSoundFile m_file; ///< The streamed music file + Time m_duration; ///< Music duration + std::vector m_samples; ///< Temporary buffer of samples + Mutex m_mutex; ///< Mutex protecting the data +}; + +} // namespace sf + + +#endif // SFML_MUSIC_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Music +/// \ingroup audio +/// +/// Musics are sounds that are streamed rather than completely +/// loaded in memory. This is especially useful for compressed +/// musics that usually take hundreds of MB when they are +/// uncompressed: by streaming it instead of loading it entirely, +/// you avoid saturating the memory and have almost no loading delay. +/// This implies that the underlying resource (file, stream or +/// memory buffer) must remain valid for the lifetime of the +/// sf::Music object. +/// +/// Apart from that, a sf::Music has almost the same features as +/// the sf::SoundBuffer / sf::Sound pair: you can play/pause/stop +/// it, request its parameters (channels, sample rate), change +/// the way it is played (pitch, volume, 3D position, ...), etc. +/// +/// As a sound stream, a music is played in its own thread in order +/// not to block the rest of the program. This means that you can +/// leave the music alone after calling play(), it will manage itself +/// very well. +/// +/// Usage example: +/// \code +/// // Declare a new music +/// sf::Music music; +/// +/// // Open it from an audio file +/// if (!music.openFromFile("music.ogg")) +/// { +/// // error... +/// } +/// +/// // Change some parameters +/// music.setPosition(0, 1, 10); // change its 3D position +/// music.setPitch(2); // increase the pitch +/// music.setVolume(50); // reduce the volume +/// music.setLoop(true); // make it loop +/// +/// // Play it +/// music.play(); +/// \endcode +/// +/// \see sf::Sound, sf::SoundStream +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/OutputSoundFile.hpp b/SFML-2.4.2/include/SFML/Audio/OutputSoundFile.hpp new file mode 100644 index 0000000..325b38f --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/OutputSoundFile.hpp @@ -0,0 +1,133 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_OUTPUTSOUNDFILE_HPP +#define SFML_OUTPUTSOUNDFILE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +class SoundFileWriter; + +//////////////////////////////////////////////////////////// +/// \brief Provide write access to sound files +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API OutputSoundFile : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + OutputSoundFile(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + /// Closes the file if it was still open. + /// + //////////////////////////////////////////////////////////// + ~OutputSoundFile(); + + //////////////////////////////////////////////////////////// + /// \brief Open the sound file from the disk for writing + /// + /// The supported audio formats are: WAV, OGG/Vorbis, FLAC. + /// + /// \param filename Path of the sound file to write + /// \param sampleRate Sample rate of the sound + /// \param channelCount Number of channels in the sound + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + bool openFromFile(const std::string& filename, unsigned int sampleRate, unsigned int channelCount); + + //////////////////////////////////////////////////////////// + /// \brief Write audio samples to the file + /// + /// \param samples Pointer to the sample array to write + /// \param count Number of samples to write + /// + //////////////////////////////////////////////////////////// + void write(const Int16* samples, Uint64 count); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Close the current file + /// + //////////////////////////////////////////////////////////// + void close(); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + SoundFileWriter* m_writer; ///< Writer that handles I/O on the file's format +}; + +} // namespace sf + + +#endif // SFML_OUTPUTSOUNDFILE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::OutputSoundFile +/// \ingroup audio +/// +/// This class encodes audio samples to a sound file. It is +/// used internally by higher-level classes such as sf::SoundBuffer, +/// but can also be useful if you want to create audio files from +/// custom data sources, like generated audio samples. +/// +/// Usage example: +/// \code +/// // Create a sound file, ogg/vorbis format, 44100 Hz, stereo +/// sf::OutputSoundFile file; +/// if (!file.openFromFile("music.ogg", 44100, 2)) +/// /* error */; +/// +/// while (...) +/// { +/// // Read or generate audio samples from your custom source +/// std::vector samples = ...; +/// +/// // Write them to the file +/// file.write(samples.data(), samples.size()); +/// } +/// \endcode +/// +/// \see sf::SoundFileWriter, sf::InputSoundFile +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/Sound.hpp b/SFML-2.4.2/include/SFML/Audio/Sound.hpp new file mode 100644 index 0000000..3b20024 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/Sound.hpp @@ -0,0 +1,264 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOUND_HPP +#define SFML_SOUND_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +class SoundBuffer; + +//////////////////////////////////////////////////////////// +/// \brief Regular sound that can be played in the audio environment +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API Sound : public SoundSource +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + Sound(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the sound with a buffer + /// + /// \param buffer Sound buffer containing the audio data to play with the sound + /// + //////////////////////////////////////////////////////////// + explicit Sound(const SoundBuffer& buffer); + + //////////////////////////////////////////////////////////// + /// \brief Copy constructor + /// + /// \param copy Instance to copy + /// + //////////////////////////////////////////////////////////// + Sound(const Sound& copy); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~Sound(); + + //////////////////////////////////////////////////////////// + /// \brief Start or resume playing the sound + /// + /// This function starts the stream if it was stopped, resumes + /// it if it was paused, and restarts it from beginning if it + /// was it already playing. + /// This function uses its own thread so that it doesn't block + /// the rest of the program while the sound is played. + /// + /// \see pause, stop + /// + //////////////////////////////////////////////////////////// + void play(); + + //////////////////////////////////////////////////////////// + /// \brief Pause the sound + /// + /// This function pauses the sound if it was playing, + /// otherwise (sound already paused or stopped) it has no effect. + /// + /// \see play, stop + /// + //////////////////////////////////////////////////////////// + void pause(); + + //////////////////////////////////////////////////////////// + /// \brief stop playing the sound + /// + /// This function stops the sound if it was playing or paused, + /// and does nothing if it was already stopped. + /// It also resets the playing position (unlike pause()). + /// + /// \see play, pause + /// + //////////////////////////////////////////////////////////// + void stop(); + + //////////////////////////////////////////////////////////// + /// \brief Set the source buffer containing the audio data to play + /// + /// It is important to note that the sound buffer is not copied, + /// thus the sf::SoundBuffer instance must remain alive as long + /// as it is attached to the sound. + /// + /// \param buffer Sound buffer to attach to the sound + /// + /// \see getBuffer + /// + //////////////////////////////////////////////////////////// + void setBuffer(const SoundBuffer& buffer); + + //////////////////////////////////////////////////////////// + /// \brief Set whether or not the sound should loop after reaching the end + /// + /// If set, the sound will restart from beginning after + /// reaching the end and so on, until it is stopped or + /// setLoop(false) is called. + /// The default looping state for sound is false. + /// + /// \param loop True to play in loop, false to play once + /// + /// \see getLoop + /// + //////////////////////////////////////////////////////////// + void setLoop(bool loop); + + //////////////////////////////////////////////////////////// + /// \brief Change the current playing position of the sound + /// + /// The playing position can be changed when the sound is + /// either paused or playing. Changing the playing position + /// when the sound is stopped has no effect, since playing + /// the sound will reset its position. + /// + /// \param timeOffset New playing position, from the beginning of the sound + /// + /// \see getPlayingOffset + /// + //////////////////////////////////////////////////////////// + void setPlayingOffset(Time timeOffset); + + //////////////////////////////////////////////////////////// + /// \brief Get the audio buffer attached to the sound + /// + /// \return Sound buffer attached to the sound (can be NULL) + /// + //////////////////////////////////////////////////////////// + const SoundBuffer* getBuffer() const; + + //////////////////////////////////////////////////////////// + /// \brief Tell whether or not the sound is in loop mode + /// + /// \return True if the sound is looping, false otherwise + /// + /// \see setLoop + /// + //////////////////////////////////////////////////////////// + bool getLoop() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the current playing position of the sound + /// + /// \return Current playing position, from the beginning of the sound + /// + /// \see setPlayingOffset + /// + //////////////////////////////////////////////////////////// + Time getPlayingOffset() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the current status of the sound (stopped, paused, playing) + /// + /// \return Current status of the sound + /// + //////////////////////////////////////////////////////////// + Status getStatus() const; + + //////////////////////////////////////////////////////////// + /// \brief Overload of assignment operator + /// + /// \param right Instance to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + Sound& operator =(const Sound& right); + + //////////////////////////////////////////////////////////// + /// \brief Reset the internal buffer of the sound + /// + /// This function is for internal use only, you don't have + /// to use it. It is called by the sf::SoundBuffer that + /// this sound uses, when it is destroyed in order to prevent + /// the sound from using a dead buffer. + /// + //////////////////////////////////////////////////////////// + void resetBuffer(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + const SoundBuffer* m_buffer; ///< Sound buffer bound to the source +}; + +} // namespace sf + + +#endif // SFML_SOUND_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Sound +/// \ingroup audio +/// +/// sf::Sound is the class to use to play sounds. +/// It provides: +/// \li Control (play, pause, stop) +/// \li Ability to modify output parameters in real-time (pitch, volume, ...) +/// \li 3D spatial features (position, attenuation, ...). +/// +/// sf::Sound is perfect for playing short sounds that can +/// fit in memory and require no latency, like foot steps or +/// gun shots. For longer sounds, like background musics +/// or long speeches, rather see sf::Music (which is based +/// on streaming). +/// +/// In order to work, a sound must be given a buffer of audio +/// data to play. Audio data (samples) is stored in sf::SoundBuffer, +/// and attached to a sound with the setBuffer() function. +/// The buffer object attached to a sound must remain alive +/// as long as the sound uses it. Note that multiple sounds +/// can use the same sound buffer at the same time. +/// +/// Usage example: +/// \code +/// sf::SoundBuffer buffer; +/// buffer.loadFromFile("sound.wav"); +/// +/// sf::Sound sound; +/// sound.setBuffer(buffer); +/// sound.play(); +/// \endcode +/// +/// \see sf::SoundBuffer, sf::Music +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/SoundBuffer.hpp b/SFML-2.4.2/include/SFML/Audio/SoundBuffer.hpp new file mode 100644 index 0000000..6303cfb --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/SoundBuffer.hpp @@ -0,0 +1,352 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOUNDBUFFER_HPP +#define SFML_SOUNDBUFFER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +class Sound; +class InputSoundFile; +class InputStream; + +//////////////////////////////////////////////////////////// +/// \brief Storage for audio samples defining a sound +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API SoundBuffer : AlResource +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + SoundBuffer(); + + //////////////////////////////////////////////////////////// + /// \brief Copy constructor + /// + /// \param copy Instance to copy + /// + //////////////////////////////////////////////////////////// + SoundBuffer(const SoundBuffer& copy); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~SoundBuffer(); + + //////////////////////////////////////////////////////////// + /// \brief Load the sound buffer from a file + /// + /// See the documentation of sf::InputSoundFile for the list + /// of supported formats. + /// + /// \param filename Path of the sound file to load + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromMemory, loadFromStream, loadFromSamples, saveToFile + /// + //////////////////////////////////////////////////////////// + bool loadFromFile(const std::string& filename); + + //////////////////////////////////////////////////////////// + /// \brief Load the sound buffer from a file in memory + /// + /// See the documentation of sf::InputSoundFile for the list + /// of supported formats. + /// + /// \param data Pointer to the file data in memory + /// \param sizeInBytes Size of the data to load, in bytes + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromStream, loadFromSamples + /// + //////////////////////////////////////////////////////////// + bool loadFromMemory(const void* data, std::size_t sizeInBytes); + + //////////////////////////////////////////////////////////// + /// \brief Load the sound buffer from a custom stream + /// + /// See the documentation of sf::InputSoundFile for the list + /// of supported formats. + /// + /// \param stream Source stream to read from + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromMemory, loadFromSamples + /// + //////////////////////////////////////////////////////////// + bool loadFromStream(InputStream& stream); + + //////////////////////////////////////////////////////////// + /// \brief Load the sound buffer from an array of audio samples + /// + /// The assumed format of the audio samples is 16 bits signed integer + /// (sf::Int16). + /// + /// \param samples Pointer to the array of samples in memory + /// \param sampleCount Number of samples in the array + /// \param channelCount Number of channels (1 = mono, 2 = stereo, ...) + /// \param sampleRate Sample rate (number of samples to play per second) + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromMemory, saveToFile + /// + //////////////////////////////////////////////////////////// + bool loadFromSamples(const Int16* samples, Uint64 sampleCount, unsigned int channelCount, unsigned int sampleRate); + + //////////////////////////////////////////////////////////// + /// \brief Save the sound buffer to an audio file + /// + /// See the documentation of sf::OutputSoundFile for the list + /// of supported formats. + /// + /// \param filename Path of the sound file to write + /// + /// \return True if saving succeeded, false if it failed + /// + /// \see loadFromFile, loadFromMemory, loadFromSamples + /// + //////////////////////////////////////////////////////////// + bool saveToFile(const std::string& filename) const; + + //////////////////////////////////////////////////////////// + /// \brief Get the array of audio samples stored in the buffer + /// + /// The format of the returned samples is 16 bits signed integer + /// (sf::Int16). The total number of samples in this array + /// is given by the getSampleCount() function. + /// + /// \return Read-only pointer to the array of sound samples + /// + /// \see getSampleCount + /// + //////////////////////////////////////////////////////////// + const Int16* getSamples() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the number of samples stored in the buffer + /// + /// The array of samples can be accessed with the getSamples() + /// function. + /// + /// \return Number of samples + /// + /// \see getSamples + /// + //////////////////////////////////////////////////////////// + Uint64 getSampleCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the sample rate of the sound + /// + /// The sample rate is the number of samples played per second. + /// The higher, the better the quality (for example, 44100 + /// samples/s is CD quality). + /// + /// \return Sample rate (number of samples per second) + /// + /// \see getChannelCount, getDuration + /// + //////////////////////////////////////////////////////////// + unsigned int getSampleRate() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the number of channels used by the sound + /// + /// If the sound is mono then the number of channels will + /// be 1, 2 for stereo, etc. + /// + /// \return Number of channels + /// + /// \see getSampleRate, getDuration + /// + //////////////////////////////////////////////////////////// + unsigned int getChannelCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the total duration of the sound + /// + /// \return Sound duration + /// + /// \see getSampleRate, getChannelCount + /// + //////////////////////////////////////////////////////////// + Time getDuration() const; + + //////////////////////////////////////////////////////////// + /// \brief Overload of assignment operator + /// + /// \param right Instance to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + SoundBuffer& operator =(const SoundBuffer& right); + +private: + + friend class Sound; + + //////////////////////////////////////////////////////////// + /// \brief Initialize the internal state after loading a new sound + /// + /// \param file Sound file providing access to the new loaded sound + /// + /// \return True on successful initialization, false on failure + /// + //////////////////////////////////////////////////////////// + bool initialize(InputSoundFile& file); + + //////////////////////////////////////////////////////////// + /// \brief Update the internal buffer with the cached audio samples + /// + /// \param channelCount Number of channels + /// \param sampleRate Sample rate (number of samples per second) + /// + /// \return True on success, false if any error happened + /// + //////////////////////////////////////////////////////////// + bool update(unsigned int channelCount, unsigned int sampleRate); + + //////////////////////////////////////////////////////////// + /// \brief Add a sound to the list of sounds that use this buffer + /// + /// \param sound Sound instance to attach + /// + //////////////////////////////////////////////////////////// + void attachSound(Sound* sound) const; + + //////////////////////////////////////////////////////////// + /// \brief Remove a sound from the list of sounds that use this buffer + /// + /// \param sound Sound instance to detach + /// + //////////////////////////////////////////////////////////// + void detachSound(Sound* sound) const; + + //////////////////////////////////////////////////////////// + // Types + //////////////////////////////////////////////////////////// + typedef std::set SoundList; ///< Set of unique sound instances + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + unsigned int m_buffer; ///< OpenAL buffer identifier + std::vector m_samples; ///< Samples buffer + Time m_duration; ///< Sound duration + mutable SoundList m_sounds; ///< List of sounds that are using this buffer +}; + +} // namespace sf + + +#endif // SFML_SOUNDBUFFER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::SoundBuffer +/// \ingroup audio +/// +/// A sound buffer holds the data of a sound, which is +/// an array of audio samples. A sample is a 16 bits signed integer +/// that defines the amplitude of the sound at a given time. +/// The sound is then reconstituted by playing these samples at +/// a high rate (for example, 44100 samples per second is the +/// standard rate used for playing CDs). In short, audio samples +/// are like texture pixels, and a sf::SoundBuffer is similar to +/// a sf::Texture. +/// +/// A sound buffer can be loaded from a file (see loadFromFile() +/// for the complete list of supported formats), from memory, from +/// a custom stream (see sf::InputStream) or directly from an array +/// of samples. It can also be saved back to a file. +/// +/// Sound buffers alone are not very useful: they hold the audio data +/// but cannot be played. To do so, you need to use the sf::Sound class, +/// which provides functions to play/pause/stop the sound as well as +/// changing the way it is outputted (volume, pitch, 3D position, ...). +/// This separation allows more flexibility and better performances: +/// indeed a sf::SoundBuffer is a heavy resource, and any operation on it +/// is slow (often too slow for real-time applications). On the other +/// side, a sf::Sound is a lightweight object, which can use the audio data +/// of a sound buffer and change the way it is played without actually +/// modifying that data. Note that it is also possible to bind +/// several sf::Sound instances to the same sf::SoundBuffer. +/// +/// It is important to note that the sf::Sound instance doesn't +/// copy the buffer that it uses, it only keeps a reference to it. +/// Thus, a sf::SoundBuffer must not be destructed while it is +/// used by a sf::Sound (i.e. never write a function that +/// uses a local sf::SoundBuffer instance for loading a sound). +/// +/// Usage example: +/// \code +/// // Declare a new sound buffer +/// sf::SoundBuffer buffer; +/// +/// // Load it from a file +/// if (!buffer.loadFromFile("sound.wav")) +/// { +/// // error... +/// } +/// +/// // Create a sound source and bind it to the buffer +/// sf::Sound sound1; +/// sound1.setBuffer(buffer); +/// +/// // Play the sound +/// sound1.play(); +/// +/// // Create another sound source bound to the same buffer +/// sf::Sound sound2; +/// sound2.setBuffer(buffer); +/// +/// // Play it with a higher pitch -- the first sound remains unchanged +/// sound2.setPitch(2); +/// sound2.play(); +/// \endcode +/// +/// \see sf::Sound, sf::SoundBufferRecorder +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/SoundBufferRecorder.hpp b/SFML-2.4.2/include/SFML/Audio/SoundBufferRecorder.hpp new file mode 100644 index 0000000..b5b6436 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/SoundBufferRecorder.hpp @@ -0,0 +1,144 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOUNDBUFFERRECORDER_HPP +#define SFML_SOUNDBUFFERRECORDER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Specialized SoundRecorder which stores the captured +/// audio data into a sound buffer +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API SoundBufferRecorder : public SoundRecorder +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief destructor + /// + //////////////////////////////////////////////////////////// + ~SoundBufferRecorder(); + + //////////////////////////////////////////////////////////// + /// \brief Get the sound buffer containing the captured audio data + /// + /// The sound buffer is valid only after the capture has ended. + /// This function provides a read-only access to the internal + /// sound buffer, but it can be copied if you need to + /// make any modification to it. + /// + /// \return Read-only access to the sound buffer + /// + //////////////////////////////////////////////////////////// + const SoundBuffer& getBuffer() const; + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Start capturing audio data + /// + /// \return True to start the capture, or false to abort it + /// + //////////////////////////////////////////////////////////// + virtual bool onStart(); + + //////////////////////////////////////////////////////////// + /// \brief Process a new chunk of recorded samples + /// + /// \param samples Pointer to the new chunk of recorded samples + /// \param sampleCount Number of samples pointed by \a samples + /// + /// \return True to continue the capture, or false to stop it + /// + //////////////////////////////////////////////////////////// + virtual bool onProcessSamples(const Int16* samples, std::size_t sampleCount); + + //////////////////////////////////////////////////////////// + /// \brief Stop capturing audio data + /// + //////////////////////////////////////////////////////////// + virtual void onStop(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + std::vector m_samples; ///< Temporary sample buffer to hold the recorded data + SoundBuffer m_buffer; ///< Sound buffer that will contain the recorded data +}; + +} // namespace sf + +#endif // SFML_SOUNDBUFFERRECORDER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::SoundBufferRecorder +/// \ingroup audio +/// +/// sf::SoundBufferRecorder allows to access a recorded sound +/// through a sf::SoundBuffer, so that it can be played, saved +/// to a file, etc. +/// +/// It has the same simple interface as its base class (start(), stop()) +/// and adds a function to retrieve the recorded sound buffer +/// (getBuffer()). +/// +/// As usual, don't forget to call the isAvailable() function +/// before using this class (see sf::SoundRecorder for more details +/// about this). +/// +/// Usage example: +/// \code +/// if (sf::SoundBufferRecorder::isAvailable()) +/// { +/// // Record some audio data +/// sf::SoundBufferRecorder recorder; +/// recorder.start(); +/// ... +/// recorder.stop(); +/// +/// // Get the buffer containing the captured audio data +/// const sf::SoundBuffer& buffer = recorder.getBuffer(); +/// +/// // Save it to a file (for example...) +/// buffer.saveToFile("my_record.ogg"); +/// } +/// \endcode +/// +/// \see sf::SoundRecorder +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/SoundFileFactory.hpp b/SFML-2.4.2/include/SFML/Audio/SoundFileFactory.hpp new file mode 100644 index 0000000..b4eadf0 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/SoundFileFactory.hpp @@ -0,0 +1,197 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOUNDFILEFACTORY_HPP +#define SFML_SOUNDFILEFACTORY_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +class InputStream; +class SoundFileReader; +class SoundFileWriter; + +//////////////////////////////////////////////////////////// +/// \brief Manages and instantiates sound file readers and writers +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API SoundFileFactory +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Register a new reader + /// + /// \see unregisterReader + /// + //////////////////////////////////////////////////////////// + template + static void registerReader(); + + //////////////////////////////////////////////////////////// + /// \brief Unregister a reader + /// + /// \see registerReader + /// + //////////////////////////////////////////////////////////// + template + static void unregisterReader(); + + //////////////////////////////////////////////////////////// + /// \brief Register a new writer + /// + /// \see unregisterWriter + /// + //////////////////////////////////////////////////////////// + template + static void registerWriter(); + + //////////////////////////////////////////////////////////// + /// \brief Unregister a writer + /// + /// \see registerWriter + /// + //////////////////////////////////////////////////////////// + template + static void unregisterWriter(); + + //////////////////////////////////////////////////////////// + /// \brief Instantiate the right reader for the given file on disk + /// + /// It's up to the caller to release the returned reader + /// + /// \param filename Path of the sound file + /// + /// \return A new sound file reader that can read the given file, or null if no reader can handle it + /// + /// \see createReaderFromMemory, createReaderFromStream + /// + //////////////////////////////////////////////////////////// + static SoundFileReader* createReaderFromFilename(const std::string& filename); + + //////////////////////////////////////////////////////////// + /// \brief Instantiate the right codec for the given file in memory + /// + /// It's up to the caller to release the returned reader + /// + /// \param data Pointer to the file data in memory + /// \param sizeInBytes Total size of the file data, in bytes + /// + /// \return A new sound file codec that can read the given file, or null if no codec can handle it + /// + /// \see createReaderFromFilename, createReaderFromStream + /// + //////////////////////////////////////////////////////////// + static SoundFileReader* createReaderFromMemory(const void* data, std::size_t sizeInBytes); + + //////////////////////////////////////////////////////////// + /// \brief Instantiate the right codec for the given file in stream + /// + /// It's up to the caller to release the returned reader + /// + /// \param stream Source stream to read from + /// + /// \return A new sound file codec that can read the given file, or null if no codec can handle it + /// + /// \see createReaderFromFilename, createReaderFromMemory + /// + //////////////////////////////////////////////////////////// + static SoundFileReader* createReaderFromStream(InputStream& stream); + + //////////////////////////////////////////////////////////// + /// \brief Instantiate the right writer for the given file on disk + /// + /// It's up to the caller to release the returned writer + /// + /// \param filename Path of the sound file + /// + /// \return A new sound file writer that can write given file, or null if no writer can handle it + /// + //////////////////////////////////////////////////////////// + static SoundFileWriter* createWriterFromFilename(const std::string& filename); + +private: + + //////////////////////////////////////////////////////////// + // Types + //////////////////////////////////////////////////////////// + struct ReaderFactory + { + bool (*check)(InputStream&); + SoundFileReader* (*create)(); + }; + typedef std::vector ReaderFactoryArray; + + struct WriterFactory + { + bool (*check)(const std::string&); + SoundFileWriter* (*create)(); + }; + typedef std::vector WriterFactoryArray; + + //////////////////////////////////////////////////////////// + // Static member data + //////////////////////////////////////////////////////////// + static ReaderFactoryArray s_readers; ///< List of all registered readers + static WriterFactoryArray s_writers; ///< List of all registered writers +}; + +} // namespace sf + +#include + +#endif // SFML_SOUNDFILEFACTORY_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::SoundFileFactory +/// \ingroup audio +/// +/// This class is where all the sound file readers and writers are +/// registered. You should normally only need to use its registration +/// and unregistration functions; readers/writers creation and manipulation +/// are wrapped into the higher-level classes sf::InputSoundFile and +/// sf::OutputSoundFile. +/// +/// To register a new reader (writer) use the sf::SoundFileFactory::registerReader +/// (registerWriter) static function. You don't have to call the unregisterReader +/// (unregisterWriter) function, unless you want to unregister a format before your +/// application ends (typically, when a plugin is unloaded). +/// +/// Usage example: +/// \code +/// sf::SoundFileFactory::registerReader(); +/// sf::SoundFileFactory::registerWriter(); +/// \endcode +/// +/// \see sf::InputSoundFile, sf::OutputSoundFile, sf::SoundFileReader, sf::SoundFileWriter +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/SoundFileFactory.inl b/SFML-2.4.2/include/SFML/Audio/SoundFileFactory.inl new file mode 100644 index 0000000..a552ba8 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/SoundFileFactory.inl @@ -0,0 +1,100 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// + + +namespace sf +{ +namespace priv +{ + template SoundFileReader* createReader() {return new T;} + template SoundFileWriter* createWriter() {return new T;} +} + +//////////////////////////////////////////////////////////// +template +void SoundFileFactory::registerReader() +{ + // Make sure the same class won't be registered twice + unregisterReader(); + + // Create a new factory with the functions provided by the class + ReaderFactory factory; + factory.check = &T::check; + factory.create = &priv::createReader; + + // Add it + s_readers.push_back(factory); +} + + +//////////////////////////////////////////////////////////// +template +void SoundFileFactory::unregisterReader() +{ + // Remove the instance(s) of the reader from the array of factories + for (ReaderFactoryArray::iterator it = s_readers.begin(); it != s_readers.end(); ) + { + if (it->create == &priv::createReader) + it = s_readers.erase(it); + else + ++it; + } +} + +//////////////////////////////////////////////////////////// +template +void SoundFileFactory::registerWriter() +{ + // Make sure the same class won't be registered twice + unregisterWriter(); + + // Create a new factory with the functions provided by the class + WriterFactory factory; + factory.check = &T::check; + factory.create = &priv::createWriter; + + // Add it + s_writers.push_back(factory); +} + + +//////////////////////////////////////////////////////////// +template +void SoundFileFactory::unregisterWriter() +{ + // Remove the instance(s) of the writer from the array of factories + for (WriterFactoryArray::iterator it = s_writers.begin(); it != s_writers.end(); ) + { + if (it->create == &priv::createWriter) + it = s_writers.erase(it); + else + ++it; + } +} + +} // namespace sf diff --git a/SFML-2.4.2/include/SFML/Audio/SoundFileReader.hpp b/SFML-2.4.2/include/SFML/Audio/SoundFileReader.hpp new file mode 100644 index 0000000..006ce65 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/SoundFileReader.hpp @@ -0,0 +1,164 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOUNDFILEREADER_HPP +#define SFML_SOUNDFILEREADER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +class InputStream; + +//////////////////////////////////////////////////////////// +/// \brief Abstract base class for sound file decoding +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API SoundFileReader +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Structure holding the audio properties of a sound file + /// + //////////////////////////////////////////////////////////// + struct Info + { + Uint64 sampleCount; ///< Total number of samples in the file + unsigned int channelCount; ///< Number of channels of the sound + unsigned int sampleRate; ///< Samples rate of the sound, in samples per second + }; + + //////////////////////////////////////////////////////////// + /// \brief Virtual destructor + /// + //////////////////////////////////////////////////////////// + virtual ~SoundFileReader() {} + + //////////////////////////////////////////////////////////// + /// \brief Open a sound file for reading + /// + /// The provided stream reference is valid as long as the + /// SoundFileReader is alive, so it is safe to use/store it + /// during the whole lifetime of the reader. + /// + /// \param stream Source stream to read from + /// \param info Structure to fill with the properties of the loaded sound + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + virtual bool open(InputStream& stream, Info& info) = 0; + + //////////////////////////////////////////////////////////// + /// \brief Change the current read position to the given sample offset + /// + /// The sample offset takes the channels into account. + /// Offsets can be calculated like this: + /// `sampleNumber * sampleRate * channelCount` + /// If the given offset exceeds to total number of samples, + /// this function must jump to the end of the file. + /// + /// \param sampleOffset Index of the sample to jump to, relative to the beginning + /// + //////////////////////////////////////////////////////////// + virtual void seek(Uint64 sampleOffset) = 0; + + //////////////////////////////////////////////////////////// + /// \brief Read audio samples from the open file + /// + /// \param samples Pointer to the sample array to fill + /// \param maxCount Maximum number of samples to read + /// + /// \return Number of samples actually read (may be less than \a maxCount) + /// + //////////////////////////////////////////////////////////// + virtual Uint64 read(Int16* samples, Uint64 maxCount) = 0; +}; + +} // namespace sf + + +#endif // SFML_SOUNDFILEREADER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::SoundFileReader +/// \ingroup audio +/// +/// This class allows users to read audio file formats not natively +/// supported by SFML, and thus extend the set of supported readable +/// audio formats. +/// +/// A valid sound file reader must override the open, seek and write functions, +/// as well as providing a static check function; the latter is used by +/// SFML to find a suitable writer for a given input file. +/// +/// To register a new reader, use the sf::SoundFileFactory::registerReader +/// template function. +/// +/// Usage example: +/// \code +/// class MySoundFileReader : public sf::SoundFileReader +/// { +/// public: +/// +/// static bool check(sf::InputStream& stream) +/// { +/// // typically, read the first few header bytes and check fields that identify the format +/// // return true if the reader can handle the format +/// } +/// +/// virtual bool open(sf::InputStream& stream, Info& info) +/// { +/// // read the sound file header and fill the sound attributes +/// // (channel count, sample count and sample rate) +/// // return true on success +/// } +/// +/// virtual void seek(sf::Uint64 sampleOffset) +/// { +/// // advance to the sampleOffset-th sample from the beginning of the sound +/// } +/// +/// virtual sf::Uint64 read(sf::Int16* samples, sf::Uint64 maxCount) +/// { +/// // read up to 'maxCount' samples into the 'samples' array, +/// // convert them (for example from normalized float) if they are not stored +/// // as 16-bits signed integers in the file +/// // return the actual number of samples read +/// } +/// }; +/// +/// sf::SoundFileFactory::registerReader(); +/// \endcode +/// +/// \see sf::InputSoundFile, sf::SoundFileFactory, sf::SoundFileWriter +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/SoundFileWriter.hpp b/SFML-2.4.2/include/SFML/Audio/SoundFileWriter.hpp new file mode 100644 index 0000000..8a35a0d --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/SoundFileWriter.hpp @@ -0,0 +1,125 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOUNDFILEWRITER_HPP +#define SFML_SOUNDFILEWRITER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Abstract base class for sound file encoding +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API SoundFileWriter +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Virtual destructor + /// + //////////////////////////////////////////////////////////// + virtual ~SoundFileWriter() {} + + //////////////////////////////////////////////////////////// + /// \brief Open a sound file for writing + /// + /// \param filename Path of the file to open + /// \param sampleRate Sample rate of the sound + /// \param channelCount Number of channels of the sound + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + virtual bool open(const std::string& filename, unsigned int sampleRate, unsigned int channelCount) = 0; + + //////////////////////////////////////////////////////////// + /// \brief Write audio samples to the open file + /// + /// \param samples Pointer to the sample array to write + /// \param count Number of samples to write + /// + //////////////////////////////////////////////////////////// + virtual void write(const Int16* samples, Uint64 count) = 0; +}; + +} // namespace sf + + +#endif // SFML_SOUNDFILEWRITER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::SoundFileWriter +/// \ingroup audio +/// +/// This class allows users to write audio file formats not natively +/// supported by SFML, and thus extend the set of supported writable +/// audio formats. +/// +/// A valid sound file writer must override the open and write functions, +/// as well as providing a static check function; the latter is used by +/// SFML to find a suitable writer for a given filename. +/// +/// To register a new writer, use the sf::SoundFileFactory::registerWriter +/// template function. +/// +/// Usage example: +/// \code +/// class MySoundFileWriter : public sf::SoundFileWriter +/// { +/// public: +/// +/// static bool check(const std::string& filename) +/// { +/// // typically, check the extension +/// // return true if the writer can handle the format +/// } +/// +/// virtual bool open(const std::string& filename, unsigned int sampleRate, unsigned int channelCount) +/// { +/// // open the file 'filename' for writing, +/// // write the given sample rate and channel count to the file header +/// // return true on success +/// } +/// +/// virtual void write(const sf::Int16* samples, sf::Uint64 count) +/// { +/// // write 'count' samples stored at address 'samples', +/// // convert them (for example to normalized float) if the format requires it +/// } +/// }; +/// +/// sf::SoundFileFactory::registerWriter(); +/// \endcode +/// +/// \see sf::OutputSoundFile, sf::SoundFileFactory, sf::SoundFileReader +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/SoundRecorder.hpp b/SFML-2.4.2/include/SFML/Audio/SoundRecorder.hpp new file mode 100644 index 0000000..33c80b1 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/SoundRecorder.hpp @@ -0,0 +1,408 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOUNDRECORDER_HPP +#define SFML_SOUNDRECORDER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Abstract base class for capturing sound data +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API SoundRecorder : AlResource +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief destructor + /// + //////////////////////////////////////////////////////////// + virtual ~SoundRecorder(); + + //////////////////////////////////////////////////////////// + /// \brief Start the capture + /// + /// The \a sampleRate parameter defines the number of audio samples + /// captured per second. The higher, the better the quality + /// (for example, 44100 samples/sec is CD quality). + /// This function uses its own thread so that it doesn't block + /// the rest of the program while the capture runs. + /// Please note that only one capture can happen at the same time. + /// You can select which capture device will be used, by passing + /// the name to the setDevice() method. If none was selected + /// before, the default capture device will be used. You can get a + /// list of the names of all available capture devices by calling + /// getAvailableDevices(). + /// + /// \param sampleRate Desired capture rate, in number of samples per second + /// + /// \return True, if start of capture was successful + /// + /// \see stop, getAvailableDevices + /// + //////////////////////////////////////////////////////////// + bool start(unsigned int sampleRate = 44100); + + //////////////////////////////////////////////////////////// + /// \brief Stop the capture + /// + /// \see start + /// + //////////////////////////////////////////////////////////// + void stop(); + + //////////////////////////////////////////////////////////// + /// \brief Get the sample rate + /// + /// The sample rate defines the number of audio samples + /// captured per second. The higher, the better the quality + /// (for example, 44100 samples/sec is CD quality). + /// + /// \return Sample rate, in samples per second + /// + //////////////////////////////////////////////////////////// + unsigned int getSampleRate() const; + + //////////////////////////////////////////////////////////// + /// \brief Get a list of the names of all available audio capture devices + /// + /// This function returns a vector of strings, containing + /// the names of all available audio capture devices. + /// + /// \return A vector of strings containing the names + /// + //////////////////////////////////////////////////////////// + static std::vector getAvailableDevices(); + + //////////////////////////////////////////////////////////// + /// \brief Get the name of the default audio capture device + /// + /// This function returns the name of the default audio + /// capture device. If none is available, an empty string + /// is returned. + /// + /// \return The name of the default audio capture device + /// + //////////////////////////////////////////////////////////// + static std::string getDefaultDevice(); + + //////////////////////////////////////////////////////////// + /// \brief Set the audio capture device + /// + /// This function sets the audio capture device to the device + /// with the given \a name. It can be called on the fly (i.e: + /// while recording). If you do so while recording and + /// opening the device fails, it stops the recording. + /// + /// \param name The name of the audio capture device + /// + /// \return True, if it was able to set the requested device + /// + /// \see getAvailableDevices, getDefaultDevice + /// + //////////////////////////////////////////////////////////// + bool setDevice(const std::string& name); + + //////////////////////////////////////////////////////////// + /// \brief Get the name of the current audio capture device + /// + /// \return The name of the current audio capture device + /// + //////////////////////////////////////////////////////////// + const std::string& getDevice() const; + + //////////////////////////////////////////////////////////// + /// \brief Set the channel count of the audio capture device + /// + /// This method allows you to specify the number of channels + /// used for recording. Currently only 16-bit mono and + /// 16-bit stereo are supported. + /// + /// \param channelCount Number of channels. Currently only + /// mono (1) and stereo (2) are supported. + /// + /// \see getChannelCount + /// + //////////////////////////////////////////////////////////// + void setChannelCount(unsigned int channelCount); + + //////////////////////////////////////////////////////////// + /// \brief Get the number of channels used by this recorder + /// + /// Currently only mono and stereo are supported, so the + /// value is either 1 (for mono) or 2 (for stereo). + /// + /// \return Number of channels + /// + /// \see setChannelCount + /// + //////////////////////////////////////////////////////////// + unsigned int getChannelCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Check if the system supports audio capture + /// + /// This function should always be called before using + /// the audio capture features. If it returns false, then + /// any attempt to use sf::SoundRecorder or one of its derived + /// classes will fail. + /// + /// \return True if audio capture is supported, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isAvailable(); + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor is only meant to be called by derived classes. + /// + //////////////////////////////////////////////////////////// + SoundRecorder(); + + //////////////////////////////////////////////////////////// + /// \brief Set the processing interval + /// + /// The processing interval controls the period + /// between calls to the onProcessSamples function. You may + /// want to use a small interval if you want to process the + /// recorded data in real time, for example. + /// + /// Note: this is only a hint, the actual period may vary. + /// So don't rely on this parameter to implement precise timing. + /// + /// The default processing interval is 100 ms. + /// + /// \param interval Processing interval + /// + //////////////////////////////////////////////////////////// + void setProcessingInterval(Time interval); + + //////////////////////////////////////////////////////////// + /// \brief Start capturing audio data + /// + /// This virtual function may be overridden by a derived class + /// if something has to be done every time a new capture + /// starts. If not, this function can be ignored; the default + /// implementation does nothing. + /// + /// \return True to start the capture, or false to abort it + /// + //////////////////////////////////////////////////////////// + virtual bool onStart(); + + //////////////////////////////////////////////////////////// + /// \brief Process a new chunk of recorded samples + /// + /// This virtual function is called every time a new chunk of + /// recorded data is available. The derived class can then do + /// whatever it wants with it (storing it, playing it, sending + /// it over the network, etc.). + /// + /// \param samples Pointer to the new chunk of recorded samples + /// \param sampleCount Number of samples pointed by \a samples + /// + /// \return True to continue the capture, or false to stop it + /// + //////////////////////////////////////////////////////////// + virtual bool onProcessSamples(const Int16* samples, std::size_t sampleCount) = 0; + + //////////////////////////////////////////////////////////// + /// \brief Stop capturing audio data + /// + /// This virtual function may be overridden by a derived class + /// if something has to be done every time the capture + /// ends. If not, this function can be ignored; the default + /// implementation does nothing. + /// + //////////////////////////////////////////////////////////// + virtual void onStop(); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Function called as the entry point of the thread + /// + /// This function starts the recording loop, and returns + /// only when the capture is stopped. + /// + //////////////////////////////////////////////////////////// + void record(); + + //////////////////////////////////////////////////////////// + /// \brief Get the new available audio samples and process them + /// + /// This function is called continuously during the + /// capture loop. It retrieves the captured samples and + /// forwards them to the derived class. + /// + //////////////////////////////////////////////////////////// + void processCapturedSamples(); + + //////////////////////////////////////////////////////////// + /// \brief Clean up the recorder's internal resources + /// + /// This function is called when the capture stops. + /// + //////////////////////////////////////////////////////////// + void cleanup(); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Thread m_thread; ///< Thread running the background recording task + std::vector m_samples; ///< Buffer to store captured samples + unsigned int m_sampleRate; ///< Sample rate + Time m_processingInterval; ///< Time period between calls to onProcessSamples + bool m_isCapturing; ///< Capturing state + std::string m_deviceName; ///< Name of the audio capture device + unsigned int m_channelCount; ///< Number of recording channels +}; + +} // namespace sf + + +#endif // SFML_SOUNDRECORDER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::SoundRecorder +/// \ingroup audio +/// +/// sf::SoundBuffer provides a simple interface to access +/// the audio recording capabilities of the computer +/// (the microphone). As an abstract base class, it only cares +/// about capturing sound samples, the task of making something +/// useful with them is left to the derived class. Note that +/// SFML provides a built-in specialization for saving the +/// captured data to a sound buffer (see sf::SoundBufferRecorder). +/// +/// A derived class has only one virtual function to override: +/// \li onProcessSamples provides the new chunks of audio samples while the capture happens +/// +/// Moreover, two additional virtual functions can be overridden +/// as well if necessary: +/// \li onStart is called before the capture happens, to perform custom initializations +/// \li onStop is called after the capture ends, to perform custom cleanup +/// +/// A derived class can also control the frequency of the onProcessSamples +/// calls, with the setProcessingInterval protected function. The default +/// interval is chosen so that recording thread doesn't consume too much +/// CPU, but it can be changed to a smaller value if you need to process +/// the recorded data in real time, for example. +/// +/// The audio capture feature may not be supported or activated +/// on every platform, thus it is recommended to check its +/// availability with the isAvailable() function. If it returns +/// false, then any attempt to use an audio recorder will fail. +/// +/// If you have multiple sound input devices connected to your +/// computer (for example: microphone, external soundcard, webcam mic, ...) +/// you can get a list of all available devices through the +/// getAvailableDevices() function. You can then select a device +/// by calling setDevice() with the appropriate device. Otherwise +/// the default capturing device will be used. +/// +/// By default the recording is in 16-bit mono. Using the +/// setChannelCount method you can change the number of channels +/// used by the audio capture device to record. Note that you +/// have to decide whether you want to record in mono or stereo +/// before starting the recording. +/// +/// It is important to note that the audio capture happens in a +/// separate thread, so that it doesn't block the rest of the +/// program. In particular, the onProcessSamples virtual function +/// (but not onStart and not onStop) will be called +/// from this separate thread. It is important to keep this in +/// mind, because you may have to take care of synchronization +/// issues if you share data between threads. +/// Another thing to bear in mind is that you must call stop() +/// in the destructor of your derived class, so that the recording +/// thread finishes before your object is destroyed. +/// +/// Usage example: +/// \code +/// class CustomRecorder : public sf::SoundRecorder +/// { +/// ~CustomRecorder() +/// { +/// // Make sure to stop the recording thread +/// stop(); +/// } +/// +/// virtual bool onStart() // optional +/// { +/// // Initialize whatever has to be done before the capture starts +/// ... +/// +/// // Return true to start playing +/// return true; +/// } +/// +/// virtual bool onProcessSamples(const Int16* samples, std::size_t sampleCount) +/// { +/// // Do something with the new chunk of samples (store them, send them, ...) +/// ... +/// +/// // Return true to continue playing +/// return true; +/// } +/// +/// virtual void onStop() // optional +/// { +/// // Clean up whatever has to be done after the capture ends +/// ... +/// } +/// } +/// +/// // Usage +/// if (CustomRecorder::isAvailable()) +/// { +/// CustomRecorder recorder; +/// +/// if (!recorder.start()) +/// return -1; +/// +/// ... +/// recorder.stop(); +/// } +/// \endcode +/// +/// \see sf::SoundBufferRecorder +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/SoundSource.hpp b/SFML-2.4.2/include/SFML/Audio/SoundSource.hpp new file mode 100644 index 0000000..edcaaa2 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/SoundSource.hpp @@ -0,0 +1,297 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOUNDSOURCE_HPP +#define SFML_SOUNDSOURCE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Base class defining a sound's properties +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API SoundSource : AlResource +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Enumeration of the sound source states + /// + //////////////////////////////////////////////////////////// + enum Status + { + Stopped, ///< Sound is not playing + Paused, ///< Sound is paused + Playing ///< Sound is playing + }; + + //////////////////////////////////////////////////////////// + /// \brief Copy constructor + /// + /// \param copy Instance to copy + /// + //////////////////////////////////////////////////////////// + SoundSource(const SoundSource& copy); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + virtual ~SoundSource(); + + //////////////////////////////////////////////////////////// + /// \brief Set the pitch of the sound + /// + /// The pitch represents the perceived fundamental frequency + /// of a sound; thus you can make a sound more acute or grave + /// by changing its pitch. A side effect of changing the pitch + /// is to modify the playing speed of the sound as well. + /// The default value for the pitch is 1. + /// + /// \param pitch New pitch to apply to the sound + /// + /// \see getPitch + /// + //////////////////////////////////////////////////////////// + void setPitch(float pitch); + + //////////////////////////////////////////////////////////// + /// \brief Set the volume of the sound + /// + /// The volume is a value between 0 (mute) and 100 (full volume). + /// The default value for the volume is 100. + /// + /// \param volume Volume of the sound + /// + /// \see getVolume + /// + //////////////////////////////////////////////////////////// + void setVolume(float volume); + + //////////////////////////////////////////////////////////// + /// \brief Set the 3D position of the sound in the audio scene + /// + /// Only sounds with one channel (mono sounds) can be + /// spatialized. + /// The default position of a sound is (0, 0, 0). + /// + /// \param x X coordinate of the position of the sound in the scene + /// \param y Y coordinate of the position of the sound in the scene + /// \param z Z coordinate of the position of the sound in the scene + /// + /// \see getPosition + /// + //////////////////////////////////////////////////////////// + void setPosition(float x, float y, float z); + + //////////////////////////////////////////////////////////// + /// \brief Set the 3D position of the sound in the audio scene + /// + /// Only sounds with one channel (mono sounds) can be + /// spatialized. + /// The default position of a sound is (0, 0, 0). + /// + /// \param position Position of the sound in the scene + /// + /// \see getPosition + /// + //////////////////////////////////////////////////////////// + void setPosition(const Vector3f& position); + + //////////////////////////////////////////////////////////// + /// \brief Make the sound's position relative to the listener or absolute + /// + /// Making a sound relative to the listener will ensure that it will always + /// be played the same way regardless of the position of the listener. + /// This can be useful for non-spatialized sounds, sounds that are + /// produced by the listener, or sounds attached to it. + /// The default value is false (position is absolute). + /// + /// \param relative True to set the position relative, false to set it absolute + /// + /// \see isRelativeToListener + /// + //////////////////////////////////////////////////////////// + void setRelativeToListener(bool relative); + + //////////////////////////////////////////////////////////// + /// \brief Set the minimum distance of the sound + /// + /// The "minimum distance" of a sound is the maximum + /// distance at which it is heard at its maximum volume. Further + /// than the minimum distance, it will start to fade out according + /// to its attenuation factor. A value of 0 ("inside the head + /// of the listener") is an invalid value and is forbidden. + /// The default value of the minimum distance is 1. + /// + /// \param distance New minimum distance of the sound + /// + /// \see getMinDistance, setAttenuation + /// + //////////////////////////////////////////////////////////// + void setMinDistance(float distance); + + //////////////////////////////////////////////////////////// + /// \brief Set the attenuation factor of the sound + /// + /// The attenuation is a multiplicative factor which makes + /// the sound more or less loud according to its distance + /// from the listener. An attenuation of 0 will produce a + /// non-attenuated sound, i.e. its volume will always be the same + /// whether it is heard from near or from far. On the other hand, + /// an attenuation value such as 100 will make the sound fade out + /// very quickly as it gets further from the listener. + /// The default value of the attenuation is 1. + /// + /// \param attenuation New attenuation factor of the sound + /// + /// \see getAttenuation, setMinDistance + /// + //////////////////////////////////////////////////////////// + void setAttenuation(float attenuation); + + //////////////////////////////////////////////////////////// + /// \brief Get the pitch of the sound + /// + /// \return Pitch of the sound + /// + /// \see setPitch + /// + //////////////////////////////////////////////////////////// + float getPitch() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the volume of the sound + /// + /// \return Volume of the sound, in the range [0, 100] + /// + /// \see setVolume + /// + //////////////////////////////////////////////////////////// + float getVolume() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the 3D position of the sound in the audio scene + /// + /// \return Position of the sound + /// + /// \see setPosition + /// + //////////////////////////////////////////////////////////// + Vector3f getPosition() const; + + //////////////////////////////////////////////////////////// + /// \brief Tell whether the sound's position is relative to the + /// listener or is absolute + /// + /// \return True if the position is relative, false if it's absolute + /// + /// \see setRelativeToListener + /// + //////////////////////////////////////////////////////////// + bool isRelativeToListener() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the minimum distance of the sound + /// + /// \return Minimum distance of the sound + /// + /// \see setMinDistance, getAttenuation + /// + //////////////////////////////////////////////////////////// + float getMinDistance() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the attenuation factor of the sound + /// + /// \return Attenuation factor of the sound + /// + /// \see setAttenuation, getMinDistance + /// + //////////////////////////////////////////////////////////// + float getAttenuation() const; + + //////////////////////////////////////////////////////////// + /// \brief Overload of assignment operator + /// + /// \param right Instance to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + SoundSource& operator =(const SoundSource& right); + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor is meant to be called by derived classes only. + /// + //////////////////////////////////////////////////////////// + SoundSource(); + + //////////////////////////////////////////////////////////// + /// \brief Get the current status of the sound (stopped, paused, playing) + /// + /// \return Current status of the sound + /// + //////////////////////////////////////////////////////////// + Status getStatus() const; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + unsigned int m_source; ///< OpenAL source identifier +}; + +} // namespace sf + + +#endif // SFML_SOUNDSOURCE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::SoundSource +/// \ingroup audio +/// +/// sf::SoundSource is not meant to be used directly, it +/// only serves as a common base for all audio objects +/// that can live in the audio environment. +/// +/// It defines several properties for the sound: pitch, +/// volume, position, attenuation, etc. All of them can be +/// changed at any time with no impact on performances. +/// +/// \see sf::Sound, sf::SoundStream +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Audio/SoundStream.hpp b/SFML-2.4.2/include/SFML/Audio/SoundStream.hpp new file mode 100644 index 0000000..06856ed --- /dev/null +++ b/SFML-2.4.2/include/SFML/Audio/SoundStream.hpp @@ -0,0 +1,386 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOUNDSTREAM_HPP +#define SFML_SOUNDSTREAM_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Abstract base class for streamed audio sources +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API SoundStream : public SoundSource +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Structure defining a chunk of audio data to stream + /// + //////////////////////////////////////////////////////////// + struct Chunk + { + const Int16* samples; ///< Pointer to the audio samples + std::size_t sampleCount; ///< Number of samples pointed by Samples + }; + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + virtual ~SoundStream(); + + //////////////////////////////////////////////////////////// + /// \brief Start or resume playing the audio stream + /// + /// This function starts the stream if it was stopped, resumes + /// it if it was paused, and restarts it from the beginning if + /// it was already playing. + /// This function uses its own thread so that it doesn't block + /// the rest of the program while the stream is played. + /// + /// \see pause, stop + /// + //////////////////////////////////////////////////////////// + void play(); + + //////////////////////////////////////////////////////////// + /// \brief Pause the audio stream + /// + /// This function pauses the stream if it was playing, + /// otherwise (stream already paused or stopped) it has no effect. + /// + /// \see play, stop + /// + //////////////////////////////////////////////////////////// + void pause(); + + //////////////////////////////////////////////////////////// + /// \brief Stop playing the audio stream + /// + /// This function stops the stream if it was playing or paused, + /// and does nothing if it was already stopped. + /// It also resets the playing position (unlike pause()). + /// + /// \see play, pause + /// + //////////////////////////////////////////////////////////// + void stop(); + + //////////////////////////////////////////////////////////// + /// \brief Return the number of channels of the stream + /// + /// 1 channel means a mono sound, 2 means stereo, etc. + /// + /// \return Number of channels + /// + //////////////////////////////////////////////////////////// + unsigned int getChannelCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the stream sample rate of the stream + /// + /// The sample rate is the number of audio samples played per + /// second. The higher, the better the quality. + /// + /// \return Sample rate, in number of samples per second + /// + //////////////////////////////////////////////////////////// + unsigned int getSampleRate() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the current status of the stream (stopped, paused, playing) + /// + /// \return Current status + /// + //////////////////////////////////////////////////////////// + Status getStatus() const; + + //////////////////////////////////////////////////////////// + /// \brief Change the current playing position of the stream + /// + /// The playing position can be changed when the stream is + /// either paused or playing. Changing the playing position + /// when the stream is stopped has no effect, since playing + /// the stream would reset its position. + /// + /// \param timeOffset New playing position, from the beginning of the stream + /// + /// \see getPlayingOffset + /// + //////////////////////////////////////////////////////////// + void setPlayingOffset(Time timeOffset); + + //////////////////////////////////////////////////////////// + /// \brief Get the current playing position of the stream + /// + /// \return Current playing position, from the beginning of the stream + /// + /// \see setPlayingOffset + /// + //////////////////////////////////////////////////////////// + Time getPlayingOffset() const; + + //////////////////////////////////////////////////////////// + /// \brief Set whether or not the stream should loop after reaching the end + /// + /// If set, the stream will restart from beginning after + /// reaching the end and so on, until it is stopped or + /// setLoop(false) is called. + /// The default looping state for streams is false. + /// + /// \param loop True to play in loop, false to play once + /// + /// \see getLoop + /// + //////////////////////////////////////////////////////////// + void setLoop(bool loop); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether or not the stream is in loop mode + /// + /// \return True if the stream is looping, false otherwise + /// + /// \see setLoop + /// + //////////////////////////////////////////////////////////// + bool getLoop() const; + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor is only meant to be called by derived classes. + /// + //////////////////////////////////////////////////////////// + SoundStream(); + + //////////////////////////////////////////////////////////// + /// \brief Define the audio stream parameters + /// + /// This function must be called by derived classes as soon + /// as they know the audio settings of the stream to play. + /// Any attempt to manipulate the stream (play(), ...) before + /// calling this function will fail. + /// It can be called multiple times if the settings of the + /// audio stream change, but only when the stream is stopped. + /// + /// \param channelCount Number of channels of the stream + /// \param sampleRate Sample rate, in samples per second + /// + //////////////////////////////////////////////////////////// + void initialize(unsigned int channelCount, unsigned int sampleRate); + + //////////////////////////////////////////////////////////// + /// \brief Request a new chunk of audio samples from the stream source + /// + /// This function must be overridden by derived classes to provide + /// the audio samples to play. It is called continuously by the + /// streaming loop, in a separate thread. + /// The source can choose to stop the streaming loop at any time, by + /// returning false to the caller. + /// If you return true (i.e. continue streaming) it is important that + /// the returned array of samples is not empty; this would stop the stream + /// due to an internal limitation. + /// + /// \param data Chunk of data to fill + /// + /// \return True to continue playback, false to stop + /// + //////////////////////////////////////////////////////////// + virtual bool onGetData(Chunk& data) = 0; + + //////////////////////////////////////////////////////////// + /// \brief Change the current playing position in the stream source + /// + /// This function must be overridden by derived classes to + /// allow random seeking into the stream source. + /// + /// \param timeOffset New playing position, relative to the beginning of the stream + /// + //////////////////////////////////////////////////////////// + virtual void onSeek(Time timeOffset) = 0; + +private: + + //////////////////////////////////////////////////////////// + /// \brief Function called as the entry point of the thread + /// + /// This function starts the streaming loop, and returns + /// only when the sound is stopped. + /// + //////////////////////////////////////////////////////////// + void streamData(); + + //////////////////////////////////////////////////////////// + /// \brief Fill a new buffer with audio samples, and append + /// it to the playing queue + /// + /// This function is called as soon as a buffer has been fully + /// consumed; it fills it again and inserts it back into the + /// playing queue. + /// + /// \param bufferNum Number of the buffer to fill (in [0, BufferCount]) + /// + /// \return True if the stream source has requested to stop, false otherwise + /// + //////////////////////////////////////////////////////////// + bool fillAndPushBuffer(unsigned int bufferNum); + + //////////////////////////////////////////////////////////// + /// \brief Fill the audio buffers and put them all into the playing queue + /// + /// This function is called when playing starts and the + /// playing queue is empty. + /// + /// \return True if the derived class has requested to stop, false otherwise + /// + //////////////////////////////////////////////////////////// + bool fillQueue(); + + //////////////////////////////////////////////////////////// + /// \brief Clear all the audio buffers and empty the playing queue + /// + /// This function is called when the stream is stopped. + /// + //////////////////////////////////////////////////////////// + void clearQueue(); + + enum + { + BufferCount = 3 ///< Number of audio buffers used by the streaming loop + }; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Thread m_thread; ///< Thread running the background tasks + mutable Mutex m_threadMutex; ///< Thread mutex + Status m_threadStartState; ///< State the thread starts in (Playing, Paused, Stopped) + bool m_isStreaming; ///< Streaming state (true = playing, false = stopped) + unsigned int m_buffers[BufferCount]; ///< Sound buffers used to store temporary audio data + unsigned int m_channelCount; ///< Number of channels (1 = mono, 2 = stereo, ...) + unsigned int m_sampleRate; ///< Frequency (samples / second) + Uint32 m_format; ///< Format of the internal sound buffers + bool m_loop; ///< Loop flag (true to loop, false to play once) + Uint64 m_samplesProcessed; ///< Number of buffers processed since beginning of the stream + bool m_endBuffers[BufferCount]; ///< Each buffer is marked as "end buffer" or not, for proper duration calculation +}; + +} // namespace sf + + +#endif // SFML_SOUNDSTREAM_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::SoundStream +/// \ingroup audio +/// +/// Unlike audio buffers (see sf::SoundBuffer), audio streams +/// are never completely loaded in memory. Instead, the audio +/// data is acquired continuously while the stream is playing. +/// This behavior allows to play a sound with no loading delay, +/// and keeps the memory consumption very low. +/// +/// Sound sources that need to be streamed are usually big files +/// (compressed audio musics that would eat hundreds of MB in memory) +/// or files that would take a lot of time to be received +/// (sounds played over the network). +/// +/// sf::SoundStream is a base class that doesn't care about the +/// stream source, which is left to the derived class. SFML provides +/// a built-in specialization for big files (see sf::Music). +/// No network stream source is provided, but you can write your own +/// by combining this class with the network module. +/// +/// A derived class has to override two virtual functions: +/// \li onGetData fills a new chunk of audio data to be played +/// \li onSeek changes the current playing position in the source +/// +/// It is important to note that each SoundStream is played in its +/// own separate thread, so that the streaming loop doesn't block the +/// rest of the program. In particular, the OnGetData and OnSeek +/// virtual functions may sometimes be called from this separate thread. +/// It is important to keep this in mind, because you may have to take +/// care of synchronization issues if you share data between threads. +/// +/// Usage example: +/// \code +/// class CustomStream : public sf::SoundStream +/// { +/// public: +/// +/// bool open(const std::string& location) +/// { +/// // Open the source and get audio settings +/// ... +/// unsigned int channelCount = ...; +/// unsigned int sampleRate = ...; +/// +/// // Initialize the stream -- important! +/// initialize(channelCount, sampleRate); +/// } +/// +/// private: +/// +/// virtual bool onGetData(Chunk& data) +/// { +/// // Fill the chunk with audio data from the stream source +/// // (note: must not be empty if you want to continue playing) +/// data.samples = ...; +/// data.sampleCount = ...; +/// +/// // Return true to continue playing +/// return true; +/// } +/// +/// virtual void onSeek(Uint32 timeOffset) +/// { +/// // Change the current position in the stream source +/// ... +/// } +/// } +/// +/// // Usage +/// CustomStream stream; +/// stream.open("path/to/stream"); +/// stream.play(); +/// \endcode +/// +/// \see sf::Music +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Config.hpp b/SFML-2.4.2/include/SFML/Config.hpp new file mode 100644 index 0000000..5a8a87c --- /dev/null +++ b/SFML-2.4.2/include/SFML/Config.hpp @@ -0,0 +1,231 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_CONFIG_HPP +#define SFML_CONFIG_HPP + + +//////////////////////////////////////////////////////////// +// Define the SFML version +//////////////////////////////////////////////////////////// +#define SFML_VERSION_MAJOR 2 +#define SFML_VERSION_MINOR 4 +#define SFML_VERSION_PATCH 2 + + +//////////////////////////////////////////////////////////// +// Identify the operating system +// see http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system +//////////////////////////////////////////////////////////// +#if defined(_WIN32) + + // Windows + #define SFML_SYSTEM_WINDOWS + #ifndef NOMINMAX + #define NOMINMAX + #endif + +#elif defined(__APPLE__) && defined(__MACH__) + + // Apple platform, see which one it is + #include "TargetConditionals.h" + + #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR + + // iOS + #define SFML_SYSTEM_IOS + + #elif TARGET_OS_MAC + + // MacOS + #define SFML_SYSTEM_MACOS + + #else + + // Unsupported Apple system + #error This Apple operating system is not supported by SFML library + + #endif + +#elif defined(__unix__) + + // UNIX system, see which one it is + #if defined(__ANDROID__) + + // Android + #define SFML_SYSTEM_ANDROID + + #elif defined(__linux__) + + // Linux + #define SFML_SYSTEM_LINUX + + #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + + // FreeBSD + #define SFML_SYSTEM_FREEBSD + + #else + + // Unsupported UNIX system + #error This UNIX operating system is not supported by SFML library + + #endif + +#else + + // Unsupported system + #error This operating system is not supported by SFML library + +#endif + + +//////////////////////////////////////////////////////////// +// Define a portable debug macro +//////////////////////////////////////////////////////////// +#if !defined(NDEBUG) + + #define SFML_DEBUG + +#endif + + +//////////////////////////////////////////////////////////// +// Define helpers to create portable import / export macros for each module +//////////////////////////////////////////////////////////// +#if !defined(SFML_STATIC) + + #if defined(SFML_SYSTEM_WINDOWS) + + // Windows compilers need specific (and different) keywords for export and import + #define SFML_API_EXPORT __declspec(dllexport) + #define SFML_API_IMPORT __declspec(dllimport) + + // For Visual C++ compilers, we also need to turn off this annoying C4251 warning + #ifdef _MSC_VER + + #pragma warning(disable: 4251) + + #endif + + #else // Linux, FreeBSD, Mac OS X + + #if __GNUC__ >= 4 + + // GCC 4 has special keywords for showing/hidding symbols, + // the same keyword is used for both importing and exporting + #define SFML_API_EXPORT __attribute__ ((__visibility__ ("default"))) + #define SFML_API_IMPORT __attribute__ ((__visibility__ ("default"))) + + #else + + // GCC < 4 has no mechanism to explicitely hide symbols, everything's exported + #define SFML_API_EXPORT + #define SFML_API_IMPORT + + #endif + + #endif + +#else + + // Static build doesn't need import/export macros + #define SFML_API_EXPORT + #define SFML_API_IMPORT + +#endif + + +//////////////////////////////////////////////////////////// +// Cross-platform warning for deprecated functions and classes +// +// Usage: +// class SFML_DEPRECATED MyClass +// { +// SFML_DEPRECATED void memberFunc(); +// }; +// +// SFML_DEPRECATED void globalFunc(); +//////////////////////////////////////////////////////////// +#if defined(SFML_NO_DEPRECATED_WARNINGS) + + // User explicitly requests to disable deprecation warnings + #define SFML_DEPRECATED + +#elif defined(_MSC_VER) + + // Microsoft C++ compiler + // Note: On newer MSVC versions, using deprecated functions causes a compiler error. In order to + // trigger a warning instead of an error, the compiler flag /sdl- (instead of /sdl) must be specified. + #define SFML_DEPRECATED __declspec(deprecated) + +#elif defined(__GNUC__) + + // g++ and Clang + #define SFML_DEPRECATED __attribute__ ((deprecated)) + +#else + + // Other compilers are not supported, leave class or function as-is. + // With a bit of luck, the #pragma directive works, otherwise users get a warning (no error!) for unrecognized #pragma. + #pragma message("SFML_DEPRECATED is not supported for your compiler, please contact the SFML team") + #define SFML_DEPRECATED + +#endif + + +//////////////////////////////////////////////////////////// +// Define portable fixed-size types +//////////////////////////////////////////////////////////// +namespace sf +{ + // All "common" platforms use the same size for char, short and int + // (basically there are 3 types for 3 sizes, so no other match is possible), + // we can use them without doing any kind of check + + // 8 bits integer types + typedef signed char Int8; + typedef unsigned char Uint8; + + // 16 bits integer types + typedef signed short Int16; + typedef unsigned short Uint16; + + // 32 bits integer types + typedef signed int Int32; + typedef unsigned int Uint32; + + // 64 bits integer types + #if defined(_MSC_VER) + typedef signed __int64 Int64; + typedef unsigned __int64 Uint64; + #else + typedef signed long long Int64; + typedef unsigned long long Uint64; + #endif + +} // namespace sf + + +#endif // SFML_CONFIG_HPP diff --git a/SFML-2.4.2/include/SFML/Graphics.hpp b/SFML-2.4.2/include/SFML/Graphics.hpp new file mode 100644 index 0000000..5bb622a --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics.hpp @@ -0,0 +1,67 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_GRAPHICS_HPP +#define SFML_GRAPHICS_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#endif // SFML_GRAPHICS_HPP + +//////////////////////////////////////////////////////////// +/// \defgroup graphics Graphics module +/// +/// 2D graphics module: sprites, text, shapes, ... +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/BlendMode.hpp b/SFML-2.4.2/include/SFML/Graphics/BlendMode.hpp new file mode 100644 index 0000000..3ba0a40 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/BlendMode.hpp @@ -0,0 +1,215 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_BLENDMODE_HPP +#define SFML_BLENDMODE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +namespace sf +{ + +//////////////////////////////////////////////////////////// +/// \brief Blending modes for drawing +/// +//////////////////////////////////////////////////////////// +struct SFML_GRAPHICS_API BlendMode +{ + //////////////////////////////////////////////////////// + /// \brief Enumeration of the blending factors + /// + /// The factors are mapped directly to their OpenGL equivalents, + /// specified by glBlendFunc() or glBlendFuncSeparate(). + //////////////////////////////////////////////////////// + enum Factor + { + Zero, ///< (0, 0, 0, 0) + One, ///< (1, 1, 1, 1) + SrcColor, ///< (src.r, src.g, src.b, src.a) + OneMinusSrcColor, ///< (1, 1, 1, 1) - (src.r, src.g, src.b, src.a) + DstColor, ///< (dst.r, dst.g, dst.b, dst.a) + OneMinusDstColor, ///< (1, 1, 1, 1) - (dst.r, dst.g, dst.b, dst.a) + SrcAlpha, ///< (src.a, src.a, src.a, src.a) + OneMinusSrcAlpha, ///< (1, 1, 1, 1) - (src.a, src.a, src.a, src.a) + DstAlpha, ///< (dst.a, dst.a, dst.a, dst.a) + OneMinusDstAlpha ///< (1, 1, 1, 1) - (dst.a, dst.a, dst.a, dst.a) + }; + + //////////////////////////////////////////////////////// + /// \brief Enumeration of the blending equations + /// + /// The equations are mapped directly to their OpenGL equivalents, + /// specified by glBlendEquation() or glBlendEquationSeparate(). + //////////////////////////////////////////////////////// + enum Equation + { + Add, ///< Pixel = Src * SrcFactor + Dst * DstFactor + Subtract, ///< Pixel = Src * SrcFactor - Dst * DstFactor + ReverseSubtract ///< Pixel = Dst * DstFactor - Src * SrcFactor + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Constructs a blending mode that does alpha blending. + /// + //////////////////////////////////////////////////////////// + BlendMode(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the blend mode given the factors and equation. + /// + /// This constructor uses the same factors and equation for both + /// color and alpha components. It also defaults to the Add equation. + /// + /// \param sourceFactor Specifies how to compute the source factor for the color and alpha channels. + /// \param destinationFactor Specifies how to compute the destination factor for the color and alpha channels. + /// \param blendEquation Specifies how to combine the source and destination colors and alpha. + /// + //////////////////////////////////////////////////////////// + BlendMode(Factor sourceFactor, Factor destinationFactor, Equation blendEquation = Add); + + //////////////////////////////////////////////////////////// + /// \brief Construct the blend mode given the factors and equation. + /// + /// \param colorSourceFactor Specifies how to compute the source factor for the color channels. + /// \param colorDestinationFactor Specifies how to compute the destination factor for the color channels. + /// \param colorBlendEquation Specifies how to combine the source and destination colors. + /// \param alphaSourceFactor Specifies how to compute the source factor. + /// \param alphaDestinationFactor Specifies how to compute the destination factor. + /// \param alphaBlendEquation Specifies how to combine the source and destination alphas. + /// + //////////////////////////////////////////////////////////// + BlendMode(Factor colorSourceFactor, Factor colorDestinationFactor, + Equation colorBlendEquation, Factor alphaSourceFactor, + Factor alphaDestinationFactor, Equation alphaBlendEquation); + + //////////////////////////////////////////////////////////// + // Member Data + //////////////////////////////////////////////////////////// + Factor colorSrcFactor; ///< Source blending factor for the color channels + Factor colorDstFactor; ///< Destination blending factor for the color channels + Equation colorEquation; ///< Blending equation for the color channels + Factor alphaSrcFactor; ///< Source blending factor for the alpha channel + Factor alphaDstFactor; ///< Destination blending factor for the alpha channel + Equation alphaEquation; ///< Blending equation for the alpha channel +}; + +//////////////////////////////////////////////////////////// +/// \relates BlendMode +/// \brief Overload of the == operator +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return True if blending modes are equal, false if they are different +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API bool operator ==(const BlendMode& left, const BlendMode& right); + +//////////////////////////////////////////////////////////// +/// \relates BlendMode +/// \brief Overload of the != operator +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return True if blending modes are different, false if they are equal +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API bool operator !=(const BlendMode& left, const BlendMode& right); + +//////////////////////////////////////////////////////////// +// Commonly used blending modes +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API extern const BlendMode BlendAlpha; ///< Blend source and dest according to dest alpha +SFML_GRAPHICS_API extern const BlendMode BlendAdd; ///< Add source to dest +SFML_GRAPHICS_API extern const BlendMode BlendMultiply; ///< Multiply source and dest +SFML_GRAPHICS_API extern const BlendMode BlendNone; ///< Overwrite dest with source + +} // namespace sf + + +#endif // SFML_BLENDMODE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::BlendMode +/// \ingroup graphics +/// +/// sf::BlendMode is a class that represents a blend mode. A blend +/// mode determines how the colors of an object you draw are +/// mixed with the colors that are already in the buffer. +/// +/// The class is composed of 6 components, each of which has its +/// own public member variable: +/// \li %Color Source Factor (@ref colorSrcFactor) +/// \li %Color Destination Factor (@ref colorDstFactor) +/// \li %Color Blend Equation (@ref colorEquation) +/// \li Alpha Source Factor (@ref alphaSrcFactor) +/// \li Alpha Destination Factor (@ref alphaDstFactor) +/// \li Alpha Blend Equation (@ref alphaEquation) +/// +/// The source factor specifies how the pixel you are drawing contributes +/// to the final color. The destination factor specifies how the pixel +/// already drawn in the buffer contributes to the final color. +/// +/// The color channels RGB (red, green, blue; simply referred to as +/// color) and A (alpha; the transparency) can be treated separately. This +/// separation can be useful for specific blend modes, but most often you +/// won't need it and will simply treat the color as a single unit. +/// +/// The blend factors and equations correspond to their OpenGL equivalents. +/// In general, the color of the resulting pixel is calculated according +/// to the following formula (\a src is the color of the source pixel, \a dst +/// the color of the destination pixel, the other variables correspond to the +/// public members, with the equations being + or - operators): +/// \code +/// dst.rgb = colorSrcFactor * src.rgb (colorEquation) colorDstFactor * dst.rgb +/// dst.a = alphaSrcFactor * src.a (alphaEquation) alphaDstFactor * dst.a +/// \endcode +/// All factors and colors are represented as floating point numbers between +/// 0 and 1. Where necessary, the result is clamped to fit in that range. +/// +/// The most common blending modes are defined as constants +/// in the sf namespace: +/// +/// \code +/// sf::BlendMode alphaBlending = sf::BlendAlpha; +/// sf::BlendMode additiveBlending = sf::BlendAdd; +/// sf::BlendMode multiplicativeBlending = sf::BlendMultiply; +/// sf::BlendMode noBlending = sf::BlendNone; +/// \endcode +/// +/// In SFML, a blend mode can be specified every time you draw a sf::Drawable +/// object to a render target. It is part of the sf::RenderStates compound +/// that is passed to the member function sf::RenderTarget::draw(). +/// +/// \see sf::RenderStates, sf::RenderTarget +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/CircleShape.hpp b/SFML-2.4.2/include/SFML/Graphics/CircleShape.hpp new file mode 100644 index 0000000..9f68969 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/CircleShape.hpp @@ -0,0 +1,154 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_CIRCLESHAPE_HPP +#define SFML_CIRCLESHAPE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Specialized shape representing a circle +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API CircleShape : public Shape +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// \param radius Radius of the circle + /// \param pointCount Number of points composing the circle + /// + //////////////////////////////////////////////////////////// + explicit CircleShape(float radius = 0, std::size_t pointCount = 30); + + //////////////////////////////////////////////////////////// + /// \brief Set the radius of the circle + /// + /// \param radius New radius of the circle + /// + /// \see getRadius + /// + //////////////////////////////////////////////////////////// + void setRadius(float radius); + + //////////////////////////////////////////////////////////// + /// \brief Get the radius of the circle + /// + /// \return Radius of the circle + /// + /// \see setRadius + /// + //////////////////////////////////////////////////////////// + float getRadius() const; + + //////////////////////////////////////////////////////////// + /// \brief Set the number of points of the circle + /// + /// \param count New number of points of the circle + /// + /// \see getPointCount + /// + //////////////////////////////////////////////////////////// + void setPointCount(std::size_t count); + + //////////////////////////////////////////////////////////// + /// \brief Get the number of points of the circle + /// + /// \return Number of points of the circle + /// + /// \see setPointCount + /// + //////////////////////////////////////////////////////////// + virtual std::size_t getPointCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get a point of the circle + /// + /// The returned point is in local coordinates, that is, + /// the shape's transforms (position, rotation, scale) are + /// not taken into account. + /// The result is undefined if \a index is out of the valid range. + /// + /// \param index Index of the point to get, in range [0 .. getPointCount() - 1] + /// + /// \return index-th point of the shape + /// + //////////////////////////////////////////////////////////// + virtual Vector2f getPoint(std::size_t index) const; + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + float m_radius; ///< Radius of the circle + std::size_t m_pointCount; ///< Number of points composing the circle +}; + +} // namespace sf + + +#endif // SFML_CIRCLESHAPE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::CircleShape +/// \ingroup graphics +/// +/// This class inherits all the functions of sf::Transformable +/// (position, rotation, scale, bounds, ...) as well as the +/// functions of sf::Shape (outline, color, texture, ...). +/// +/// Usage example: +/// \code +/// sf::CircleShape circle; +/// circle.setRadius(150); +/// circle.setOutlineColor(sf::Color::Red); +/// circle.setOutlineThickness(5); +/// circle.setPosition(10, 20); +/// ... +/// window.draw(circle); +/// \endcode +/// +/// Since the graphics card can't draw perfect circles, we have to +/// fake them with multiple triangles connected to each other. The +/// "points count" property of sf::CircleShape defines how many of these +/// triangles to use, and therefore defines the quality of the circle. +/// +/// The number of points can also be used for another purpose; with +/// small numbers you can create any regular polygon shape: +/// equilateral triangle, square, pentagon, hexagon, ... +/// +/// \see sf::Shape, sf::RectangleShape, sf::ConvexShape +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Color.hpp b/SFML-2.4.2/include/SFML/Graphics/Color.hpp new file mode 100644 index 0000000..1f81feb --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Color.hpp @@ -0,0 +1,275 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_COLOR_HPP +#define SFML_COLOR_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Utility class for manipulating RGBA colors +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Color +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Constructs an opaque black color. It is equivalent to + /// sf::Color(0, 0, 0, 255). + /// + //////////////////////////////////////////////////////////// + Color(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the color from its 4 RGBA components + /// + /// \param red Red component (in the range [0, 255]) + /// \param green Green component (in the range [0, 255]) + /// \param blue Blue component (in the range [0, 255]) + /// \param alpha Alpha (opacity) component (in the range [0, 255]) + /// + //////////////////////////////////////////////////////////// + Color(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha = 255); + + //////////////////////////////////////////////////////////// + /// \brief Construct the color from 32-bit unsigned integer + /// + /// \param color Number containing the RGBA components (in that order) + /// + //////////////////////////////////////////////////////////// + explicit Color(Uint32 color); + + //////////////////////////////////////////////////////////// + /// \brief Retrieve the color as a 32-bit unsigned integer + /// + /// \return Color represented as a 32-bit unsigned integer + /// + //////////////////////////////////////////////////////////// + Uint32 toInteger() const; + + //////////////////////////////////////////////////////////// + // Static member data + //////////////////////////////////////////////////////////// + static const Color Black; ///< Black predefined color + static const Color White; ///< White predefined color + static const Color Red; ///< Red predefined color + static const Color Green; ///< Green predefined color + static const Color Blue; ///< Blue predefined color + static const Color Yellow; ///< Yellow predefined color + static const Color Magenta; ///< Magenta predefined color + static const Color Cyan; ///< Cyan predefined color + static const Color Transparent; ///< Transparent (black) predefined color + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Uint8 r; ///< Red component + Uint8 g; ///< Green component + Uint8 b; ///< Blue component + Uint8 a; ///< Alpha (opacity) component +}; + +//////////////////////////////////////////////////////////// +/// \relates Color +/// \brief Overload of the == operator +/// +/// This operator compares two colors and check if they are equal. +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return True if colors are equal, false if they are different +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API bool operator ==(const Color& left, const Color& right); + +//////////////////////////////////////////////////////////// +/// \relates Color +/// \brief Overload of the != operator +/// +/// This operator compares two colors and check if they are different. +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return True if colors are different, false if they are equal +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API bool operator !=(const Color& left, const Color& right); + +//////////////////////////////////////////////////////////// +/// \relates Color +/// \brief Overload of the binary + operator +/// +/// This operator returns the component-wise sum of two colors. +/// Components that exceed 255 are clamped to 255. +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return Result of \a left + \a right +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API Color operator +(const Color& left, const Color& right); + +//////////////////////////////////////////////////////////// +/// \relates Color +/// \brief Overload of the binary - operator +/// +/// This operator returns the component-wise subtraction of two colors. +/// Components below 0 are clamped to 0. +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return Result of \a left - \a right +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API Color operator -(const Color& left, const Color& right); + +//////////////////////////////////////////////////////////// +/// \relates Color +/// \brief Overload of the binary * operator +/// +/// This operator returns the component-wise multiplication +/// (also called "modulation") of two colors. +/// Components are then divided by 255 so that the result is +/// still in the range [0, 255]. +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return Result of \a left * \a right +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API Color operator *(const Color& left, const Color& right); + +//////////////////////////////////////////////////////////// +/// \relates Color +/// \brief Overload of the binary += operator +/// +/// This operator computes the component-wise sum of two colors, +/// and assigns the result to the left operand. +/// Components that exceed 255 are clamped to 255. +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API Color& operator +=(Color& left, const Color& right); + +//////////////////////////////////////////////////////////// +/// \relates Color +/// \brief Overload of the binary -= operator +/// +/// This operator computes the component-wise subtraction of two colors, +/// and assigns the result to the left operand. +/// Components below 0 are clamped to 0. +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API Color& operator -=(Color& left, const Color& right); + +//////////////////////////////////////////////////////////// +/// \relates Color +/// \brief Overload of the binary *= operator +/// +/// This operator returns the component-wise multiplication +/// (also called "modulation") of two colors, and assigns +/// the result to the left operand. +/// Components are then divided by 255 so that the result is +/// still in the range [0, 255]. +/// +/// \param left Left operand +/// \param right Right operand +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API Color& operator *=(Color& left, const Color& right); + +} // namespace sf + + +#endif // SFML_COLOR_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Color +/// \ingroup graphics +/// +/// sf::Color is a simple color class composed of 4 components: +/// \li Red +/// \li Green +/// \li Blue +/// \li Alpha (opacity) +/// +/// Each component is a public member, an unsigned integer in +/// the range [0, 255]. Thus, colors can be constructed and +/// manipulated very easily: +/// +/// \code +/// sf::Color color(255, 0, 0); // red +/// color.r = 0; // make it black +/// color.b = 128; // make it dark blue +/// \endcode +/// +/// The fourth component of colors, named "alpha", represents +/// the opacity of the color. A color with an alpha value of +/// 255 will be fully opaque, while an alpha value of 0 will +/// make a color fully transparent, whatever the value of the +/// other components is. +/// +/// The most common colors are already defined as static variables: +/// \code +/// sf::Color black = sf::Color::Black; +/// sf::Color white = sf::Color::White; +/// sf::Color red = sf::Color::Red; +/// sf::Color green = sf::Color::Green; +/// sf::Color blue = sf::Color::Blue; +/// sf::Color yellow = sf::Color::Yellow; +/// sf::Color magenta = sf::Color::Magenta; +/// sf::Color cyan = sf::Color::Cyan; +/// sf::Color transparent = sf::Color::Transparent; +/// \endcode +/// +/// Colors can also be added and modulated (multiplied) using the +/// overloaded operators + and *. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/ConvexShape.hpp b/SFML-2.4.2/include/SFML/Graphics/ConvexShape.hpp new file mode 100644 index 0000000..117f843 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/ConvexShape.hpp @@ -0,0 +1,153 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_CONVEXSHAPE_HPP +#define SFML_CONVEXSHAPE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Specialized shape representing a convex polygon +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API ConvexShape : public Shape +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// \param pointCount Number of points of the polygon + /// + //////////////////////////////////////////////////////////// + explicit ConvexShape(std::size_t pointCount = 0); + + //////////////////////////////////////////////////////////// + /// \brief Set the number of points of the polygon + /// + /// \a count must be greater than 2 to define a valid shape. + /// + /// \param count New number of points of the polygon + /// + /// \see getPointCount + /// + //////////////////////////////////////////////////////////// + void setPointCount(std::size_t count); + + //////////////////////////////////////////////////////////// + /// \brief Get the number of points of the polygon + /// + /// \return Number of points of the polygon + /// + /// \see setPointCount + /// + //////////////////////////////////////////////////////////// + virtual std::size_t getPointCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Set the position of a point + /// + /// Don't forget that the polygon must remain convex, and + /// the points need to stay ordered! + /// setPointCount must be called first in order to set the total + /// number of points. The result is undefined if \a index is out + /// of the valid range. + /// + /// \param index Index of the point to change, in range [0 .. getPointCount() - 1] + /// \param point New position of the point + /// + /// \see getPoint + /// + //////////////////////////////////////////////////////////// + void setPoint(std::size_t index, const Vector2f& point); + + //////////////////////////////////////////////////////////// + /// \brief Get the position of a point + /// + /// The returned point is in local coordinates, that is, + /// the shape's transforms (position, rotation, scale) are + /// not taken into account. + /// The result is undefined if \a index is out of the valid range. + /// + /// \param index Index of the point to get, in range [0 .. getPointCount() - 1] + /// + /// \return Position of the index-th point of the polygon + /// + /// \see setPoint + /// + //////////////////////////////////////////////////////////// + virtual Vector2f getPoint(std::size_t index) const; + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + std::vector m_points; ///< Points composing the convex polygon +}; + +} // namespace sf + + +#endif // SFML_CONVEXSHAPE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::ConvexShape +/// \ingroup graphics +/// +/// This class inherits all the functions of sf::Transformable +/// (position, rotation, scale, bounds, ...) as well as the +/// functions of sf::Shape (outline, color, texture, ...). +/// +/// It is important to keep in mind that a convex shape must +/// always be... convex, otherwise it may not be drawn correctly. +/// Moreover, the points must be defined in order; using a random +/// order would result in an incorrect shape. +/// +/// Usage example: +/// \code +/// sf::ConvexShape polygon; +/// polygon.setPointCount(3); +/// polygon.setPoint(0, sf::Vector2f(0, 0)); +/// polygon.setPoint(1, sf::Vector2f(0, 10)); +/// polygon.setPoint(2, sf::Vector2f(25, 5)); +/// polygon.setOutlineColor(sf::Color::Red); +/// polygon.setOutlineThickness(5); +/// polygon.setPosition(10, 20); +/// ... +/// window.draw(polygon); +/// \endcode +/// +/// \see sf::Shape, sf::RectangleShape, sf::CircleShape +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Drawable.hpp b/SFML-2.4.2/include/SFML/Graphics/Drawable.hpp new file mode 100644 index 0000000..a409cf7 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Drawable.hpp @@ -0,0 +1,126 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_DRAWABLE_HPP +#define SFML_DRAWABLE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +class RenderTarget; + +//////////////////////////////////////////////////////////// +/// \brief Abstract base class for objects that can be drawn +/// to a render target +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Drawable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Virtual destructor + /// + //////////////////////////////////////////////////////////// + virtual ~Drawable() {} + +protected: + + friend class RenderTarget; + + //////////////////////////////////////////////////////////// + /// \brief Draw the object to a render target + /// + /// This is a pure virtual function that has to be implemented + /// by the derived class to define how the drawable should be + /// drawn. + /// + /// \param target Render target to draw to + /// \param states Current render states + /// + //////////////////////////////////////////////////////////// + virtual void draw(RenderTarget& target, RenderStates states) const = 0; +}; + +} // namespace sf + + +#endif // SFML_DRAWABLE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Drawable +/// \ingroup graphics +/// +/// sf::Drawable is a very simple base class that allows objects +/// of derived classes to be drawn to a sf::RenderTarget. +/// +/// All you have to do in your derived class is to override the +/// draw virtual function. +/// +/// Note that inheriting from sf::Drawable is not mandatory, +/// but it allows this nice syntax "window.draw(object)" rather +/// than "object.draw(window)", which is more consistent with other +/// SFML classes. +/// +/// Example: +/// \code +/// class MyDrawable : public sf::Drawable +/// { +/// public: +/// +/// ... +/// +/// private: +/// +/// virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const +/// { +/// // You can draw other high-level objects +/// target.draw(m_sprite, states); +/// +/// // ... or use the low-level API +/// states.texture = &m_texture; +/// target.draw(m_vertices, states); +/// +/// // ... or draw with OpenGL directly +/// glBegin(GL_QUADS); +/// ... +/// glEnd(); +/// } +/// +/// sf::Sprite m_sprite; +/// sf::Texture m_texture; +/// sf::VertexArray m_vertices; +/// }; +/// \endcode +/// +/// \see sf::RenderTarget +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Export.hpp b/SFML-2.4.2/include/SFML/Graphics/Export.hpp new file mode 100644 index 0000000..de164a1 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Export.hpp @@ -0,0 +1,48 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_GRAPHICS_EXPORT_HPP +#define SFML_GRAPHICS_EXPORT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +//////////////////////////////////////////////////////////// +// Define portable import / export macros +//////////////////////////////////////////////////////////// +#if defined(SFML_GRAPHICS_EXPORTS) + + #define SFML_GRAPHICS_API SFML_API_EXPORT + +#else + + #define SFML_GRAPHICS_API SFML_API_IMPORT + +#endif + + +#endif // SFML_GRAPHICS_EXPORT_HPP diff --git a/SFML-2.4.2/include/SFML/Graphics/Font.hpp b/SFML-2.4.2/include/SFML/Graphics/Font.hpp new file mode 100644 index 0000000..19c0308 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Font.hpp @@ -0,0 +1,439 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_FONT_HPP +#define SFML_FONT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +class InputStream; + +//////////////////////////////////////////////////////////// +/// \brief Class for loading and manipulating character fonts +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Font +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Holds various information about a font + /// + //////////////////////////////////////////////////////////// + struct Info + { + std::string family; ///< The font family + }; + +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor defines an empty font + /// + //////////////////////////////////////////////////////////// + Font(); + + //////////////////////////////////////////////////////////// + /// \brief Copy constructor + /// + /// \param copy Instance to copy + /// + //////////////////////////////////////////////////////////// + Font(const Font& copy); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + /// Cleans up all the internal resources used by the font + /// + //////////////////////////////////////////////////////////// + ~Font(); + + //////////////////////////////////////////////////////////// + /// \brief Load the font from a file + /// + /// The supported font formats are: TrueType, Type 1, CFF, + /// OpenType, SFNT, X11 PCF, Windows FNT, BDF, PFR and Type 42. + /// Note that this function know nothing about the standard + /// fonts installed on the user's system, thus you can't + /// load them directly. + /// + /// \warning SFML cannot preload all the font data in this + /// function, so the file has to remain accessible until + /// the sf::Font object loads a new font or is destroyed. + /// + /// \param filename Path of the font file to load + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromMemory, loadFromStream + /// + //////////////////////////////////////////////////////////// + bool loadFromFile(const std::string& filename); + + //////////////////////////////////////////////////////////// + /// \brief Load the font from a file in memory + /// + /// The supported font formats are: TrueType, Type 1, CFF, + /// OpenType, SFNT, X11 PCF, Windows FNT, BDF, PFR and Type 42. + /// + /// \warning SFML cannot preload all the font data in this + /// function, so the buffer pointed by \a data has to remain + /// valid until the sf::Font object loads a new font or + /// is destroyed. + /// + /// \param data Pointer to the file data in memory + /// \param sizeInBytes Size of the data to load, in bytes + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromStream + /// + //////////////////////////////////////////////////////////// + bool loadFromMemory(const void* data, std::size_t sizeInBytes); + + //////////////////////////////////////////////////////////// + /// \brief Load the font from a custom stream + /// + /// The supported font formats are: TrueType, Type 1, CFF, + /// OpenType, SFNT, X11 PCF, Windows FNT, BDF, PFR and Type 42. + /// Warning: SFML cannot preload all the font data in this + /// function, so the contents of \a stream have to remain + /// valid as long as the font is used. + /// + /// \warning SFML cannot preload all the font data in this + /// function, so the stream has to remain accessible until + /// the sf::Font object loads a new font or is destroyed. + /// + /// \param stream Source stream to read from + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromMemory + /// + //////////////////////////////////////////////////////////// + bool loadFromStream(InputStream& stream); + + //////////////////////////////////////////////////////////// + /// \brief Get the font information + /// + /// \return A structure that holds the font information + /// + //////////////////////////////////////////////////////////// + const Info& getInfo() const; + + //////////////////////////////////////////////////////////// + /// \brief Retrieve a glyph of the font + /// + /// If the font is a bitmap font, not all character sizes + /// might be available. If the glyph is not available at the + /// requested size, an empty glyph is returned. + /// + /// Be aware that using a negative value for the outline + /// thickness will cause distorted rendering. + /// + /// \param codePoint Unicode code point of the character to get + /// \param characterSize Reference character size + /// \param bold Retrieve the bold version or the regular one? + /// \param outlineThickness Thickness of outline (when != 0 the glyph will not be filled) + /// + /// \return The glyph corresponding to \a codePoint and \a characterSize + /// + //////////////////////////////////////////////////////////// + const Glyph& getGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, float outlineThickness = 0) const; + + //////////////////////////////////////////////////////////// + /// \brief Get the kerning offset of two glyphs + /// + /// The kerning is an extra offset (negative) to apply between two + /// glyphs when rendering them, to make the pair look more "natural". + /// For example, the pair "AV" have a special kerning to make them + /// closer than other characters. Most of the glyphs pairs have a + /// kerning offset of zero, though. + /// + /// \param first Unicode code point of the first character + /// \param second Unicode code point of the second character + /// \param characterSize Reference character size + /// + /// \return Kerning value for \a first and \a second, in pixels + /// + //////////////////////////////////////////////////////////// + float getKerning(Uint32 first, Uint32 second, unsigned int characterSize) const; + + //////////////////////////////////////////////////////////// + /// \brief Get the line spacing + /// + /// Line spacing is the vertical offset to apply between two + /// consecutive lines of text. + /// + /// \param characterSize Reference character size + /// + /// \return Line spacing, in pixels + /// + //////////////////////////////////////////////////////////// + float getLineSpacing(unsigned int characterSize) const; + + //////////////////////////////////////////////////////////// + /// \brief Get the position of the underline + /// + /// Underline position is the vertical offset to apply between the + /// baseline and the underline. + /// + /// \param characterSize Reference character size + /// + /// \return Underline position, in pixels + /// + /// \see getUnderlineThickness + /// + //////////////////////////////////////////////////////////// + float getUnderlinePosition(unsigned int characterSize) const; + + //////////////////////////////////////////////////////////// + /// \brief Get the thickness of the underline + /// + /// Underline thickness is the vertical size of the underline. + /// + /// \param characterSize Reference character size + /// + /// \return Underline thickness, in pixels + /// + /// \see getUnderlinePosition + /// + //////////////////////////////////////////////////////////// + float getUnderlineThickness(unsigned int characterSize) const; + + //////////////////////////////////////////////////////////// + /// \brief Retrieve the texture containing the loaded glyphs of a certain size + /// + /// The contents of the returned texture changes as more glyphs + /// are requested, thus it is not very relevant. It is mainly + /// used internally by sf::Text. + /// + /// \param characterSize Reference character size + /// + /// \return Texture containing the glyphs of the requested size + /// + //////////////////////////////////////////////////////////// + const Texture& getTexture(unsigned int characterSize) const; + + //////////////////////////////////////////////////////////// + /// \brief Overload of assignment operator + /// + /// \param right Instance to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + Font& operator =(const Font& right); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Structure defining a row of glyphs + /// + //////////////////////////////////////////////////////////// + struct Row + { + Row(unsigned int rowTop, unsigned int rowHeight) : width(0), top(rowTop), height(rowHeight) {} + + unsigned int width; ///< Current width of the row + unsigned int top; ///< Y position of the row into the texture + unsigned int height; ///< Height of the row + }; + + //////////////////////////////////////////////////////////// + // Types + //////////////////////////////////////////////////////////// + typedef std::map GlyphTable; ///< Table mapping a codepoint to its glyph + + //////////////////////////////////////////////////////////// + /// \brief Structure defining a page of glyphs + /// + //////////////////////////////////////////////////////////// + struct Page + { + Page(); + + GlyphTable glyphs; ///< Table mapping code points to their corresponding glyph + Texture texture; ///< Texture containing the pixels of the glyphs + unsigned int nextRow; ///< Y position of the next new row in the texture + std::vector rows; ///< List containing the position of all the existing rows + }; + + //////////////////////////////////////////////////////////// + /// \brief Free all the internal resources + /// + //////////////////////////////////////////////////////////// + void cleanup(); + + //////////////////////////////////////////////////////////// + /// \brief Load a new glyph and store it in the cache + /// + /// \param codePoint Unicode code point of the character to load + /// \param characterSize Reference character size + /// \param bold Retrieve the bold version or the regular one? + /// \param outlineThickness Thickness of outline (when != 0 the glyph will not be filled) + /// + /// \return The glyph corresponding to \a codePoint and \a characterSize + /// + //////////////////////////////////////////////////////////// + Glyph loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, float outlineThickness) const; + + //////////////////////////////////////////////////////////// + /// \brief Find a suitable rectangle within the texture for a glyph + /// + /// \param page Page of glyphs to search in + /// \param width Width of the rectangle + /// \param height Height of the rectangle + /// + /// \return Found rectangle within the texture + /// + //////////////////////////////////////////////////////////// + IntRect findGlyphRect(Page& page, unsigned int width, unsigned int height) const; + + //////////////////////////////////////////////////////////// + /// \brief Make sure that the given size is the current one + /// + /// \param characterSize Reference character size + /// + /// \return True on success, false if any error happened + /// + //////////////////////////////////////////////////////////// + bool setCurrentSize(unsigned int characterSize) const; + + //////////////////////////////////////////////////////////// + // Types + //////////////////////////////////////////////////////////// + typedef std::map PageTable; ///< Table mapping a character size to its page (texture) + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + void* m_library; ///< Pointer to the internal library interface (it is typeless to avoid exposing implementation details) + void* m_face; ///< Pointer to the internal font face (it is typeless to avoid exposing implementation details) + void* m_streamRec; ///< Pointer to the stream rec instance (it is typeless to avoid exposing implementation details) + void* m_stroker; ///< Pointer to the stroker (it is typeless to avoid exposing implementation details) + int* m_refCount; ///< Reference counter used by implicit sharing + Info m_info; ///< Information about the font + mutable PageTable m_pages; ///< Table containing the glyphs pages by character size + mutable std::vector m_pixelBuffer; ///< Pixel buffer holding a glyph's pixels before being written to the texture + #ifdef SFML_SYSTEM_ANDROID + void* m_stream; ///< Asset file streamer (if loaded from file) + #endif +}; + +} // namespace sf + + +#endif // SFML_FONT_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Font +/// \ingroup graphics +/// +/// Fonts can be loaded from a file, from memory or from a custom +/// stream, and supports the most common types of fonts. See +/// the loadFromFile function for the complete list of supported formats. +/// +/// Once it is loaded, a sf::Font instance provides three +/// types of information about the font: +/// \li Global metrics, such as the line spacing +/// \li Per-glyph metrics, such as bounding box or kerning +/// \li Pixel representation of glyphs +/// +/// Fonts alone are not very useful: they hold the font data +/// but cannot make anything useful of it. To do so you need to +/// use the sf::Text class, which is able to properly output text +/// with several options such as character size, style, color, +/// position, rotation, etc. +/// This separation allows more flexibility and better performances: +/// indeed a sf::Font is a heavy resource, and any operation on it +/// is slow (often too slow for real-time applications). On the other +/// side, a sf::Text is a lightweight object which can combine the +/// glyphs data and metrics of a sf::Font to display any text on a +/// render target. +/// Note that it is also possible to bind several sf::Text instances +/// to the same sf::Font. +/// +/// It is important to note that the sf::Text instance doesn't +/// copy the font that it uses, it only keeps a reference to it. +/// Thus, a sf::Font must not be destructed while it is +/// used by a sf::Text (i.e. never write a function that +/// uses a local sf::Font instance for creating a text). +/// +/// Usage example: +/// \code +/// // Declare a new font +/// sf::Font font; +/// +/// // Load it from a file +/// if (!font.loadFromFile("arial.ttf")) +/// { +/// // error... +/// } +/// +/// // Create a text which uses our font +/// sf::Text text1; +/// text1.setFont(font); +/// text1.setCharacterSize(30); +/// text1.setStyle(sf::Text::Regular); +/// +/// // Create another text using the same font, but with different parameters +/// sf::Text text2; +/// text2.setFont(font); +/// text2.setCharacterSize(50); +/// text2.setStyle(sf::Text::Italic); +/// \endcode +/// +/// Apart from loading font files, and passing them to instances +/// of sf::Text, you should normally not have to deal directly +/// with this class. However, it may be useful to access the +/// font metrics or rasterized glyphs for advanced usage. +/// +/// Note that if the font is a bitmap font, it is not scalable, +/// thus not all requested sizes will be available to use. This +/// needs to be taken into consideration when using sf::Text. +/// If you need to display text of a certain size, make sure the +/// corresponding bitmap font that supports that size is used. +/// +/// \see sf::Text +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Glsl.hpp b/SFML-2.4.2/include/SFML/Graphics/Glsl.hpp new file mode 100644 index 0000000..7bf1604 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Glsl.hpp @@ -0,0 +1,227 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_GLSL_HPP +#define SFML_GLSL_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +namespace priv +{ + // Forward declarations + template + struct Matrix; + + template + struct Vector4; + +#include + +} // namespace priv + + +//////////////////////////////////////////////////////////// +/// \brief Namespace with GLSL types +/// +//////////////////////////////////////////////////////////// +namespace Glsl +{ + + //////////////////////////////////////////////////////////// + /// \brief 2D float vector (\p vec2 in GLSL) + /// + //////////////////////////////////////////////////////////// + typedef Vector2 Vec2; + + //////////////////////////////////////////////////////////// + /// \brief 2D int vector (\p ivec2 in GLSL) + /// + //////////////////////////////////////////////////////////// + typedef Vector2 Ivec2; + + //////////////////////////////////////////////////////////// + /// \brief 2D bool vector (\p bvec2 in GLSL) + /// + //////////////////////////////////////////////////////////// + typedef Vector2 Bvec2; + + //////////////////////////////////////////////////////////// + /// \brief 3D float vector (\p vec3 in GLSL) + /// + //////////////////////////////////////////////////////////// + typedef Vector3 Vec3; + + //////////////////////////////////////////////////////////// + /// \brief 3D int vector (\p ivec3 in GLSL) + /// + //////////////////////////////////////////////////////////// + typedef Vector3 Ivec3; + + //////////////////////////////////////////////////////////// + /// \brief 3D bool vector (\p bvec3 in GLSL) + /// + //////////////////////////////////////////////////////////// + typedef Vector3 Bvec3; + +#ifdef SFML_DOXYGEN + + //////////////////////////////////////////////////////////// + /// \brief 4D float vector (\p vec4 in GLSL) + /// + /// 4D float vectors can be implicitly converted from sf::Color + /// instances. Each color channel is normalized from integers + /// in [0, 255] to floating point values in [0, 1]. + /// \code + /// sf::Glsl::Vec4 zeroVector; + /// sf::Glsl::Vec4 vector(1.f, 2.f, 3.f, 4.f); + /// sf::Glsl::Vec4 color = sf::Color::Cyan; + /// \endcode + //////////////////////////////////////////////////////////// + typedef implementation-defined Vec4; + + //////////////////////////////////////////////////////////// + /// \brief 4D int vector (\p ivec4 in GLSL) + /// + /// 4D int vectors can be implicitly converted from sf::Color + /// instances. Each color channel remains unchanged inside + /// the integer interval [0, 255]. + /// \code + /// sf::Glsl::Ivec4 zeroVector; + /// sf::Glsl::Ivec4 vector(1, 2, 3, 4); + /// sf::Glsl::Ivec4 color = sf::Color::Cyan; + /// \endcode + //////////////////////////////////////////////////////////// + typedef implementation-defined Ivec4; + + //////////////////////////////////////////////////////////// + /// \brief 4D bool vector (\p bvec4 in GLSL) + /// + //////////////////////////////////////////////////////////// + typedef implementation-defined Bvec4; + + //////////////////////////////////////////////////////////// + /// \brief 3x3 float matrix (\p mat3 in GLSL) + /// + /// The matrix can be constructed from an array with 3x3 + /// elements, aligned in column-major order. For example, + /// a translation by (x, y) looks as follows: + /// \code + /// float array[9] = + /// { + /// 1, 0, 0, + /// 0, 1, 0, + /// x, y, 1 + /// }; + /// + /// sf::Glsl::Mat3 matrix(array); + /// \endcode + /// + /// Mat3 can also be implicitly converted from sf::Transform: + /// \code + /// sf::Transform transform; + /// sf::Glsl::Mat3 matrix = transform; + /// \endcode + //////////////////////////////////////////////////////////// + typedef implementation-defined Mat3; + + //////////////////////////////////////////////////////////// + /// \brief 4x4 float matrix (\p mat4 in GLSL) + /// + /// The matrix can be constructed from an array with 4x4 + /// elements, aligned in column-major order. For example, + /// a translation by (x, y, z) looks as follows: + /// \code + /// float array[16] = + /// { + /// 1, 0, 0, 0, + /// 0, 1, 0, 0, + /// 0, 0, 1, 0, + /// x, y, z, 1 + /// }; + /// + /// sf::Glsl::Mat4 matrix(array); + /// \endcode + /// + /// Mat4 can also be implicitly converted from sf::Transform: + /// \code + /// sf::Transform transform; + /// sf::Glsl::Mat4 matrix = transform; + /// \endcode + //////////////////////////////////////////////////////////// + typedef implementation-defined Mat4; + +#else // SFML_DOXYGEN + + typedef priv::Vector4 Vec4; + typedef priv::Vector4 Ivec4; + typedef priv::Vector4 Bvec4; + typedef priv::Matrix<3, 3> Mat3; + typedef priv::Matrix<4, 4> Mat4; + +#endif // SFML_DOXYGEN + +} // namespace Glsl +} // namespace sf + +#endif // SFML_GLSL_HPP + + +//////////////////////////////////////////////////////////// +/// \namespace sf::Glsl +/// \ingroup graphics +/// +/// \details The sf::Glsl namespace contains types that match +/// their equivalents in GLSL, the OpenGL shading language. +/// These types are exclusively used by the sf::Shader class. +/// +/// Types that already exist in SFML, such as \ref sf::Vector2 +/// and \ref sf::Vector3, are reused as typedefs, so you can use +/// the types in this namespace as well as the original ones. +/// Others are newly defined, such as Glsl::Vec4 or Glsl::Mat3. Their +/// actual type is an implementation detail and should not be used. +/// +/// All vector types support a default constructor that +/// initializes every component to zero, in addition to a +/// constructor with one parameter for each component. +/// The components are stored in member variables called +/// x, y, z, and w. +/// +/// All matrix types support a constructor with a float* +/// parameter that points to a float array of the appropriate +/// size (that is, 9 in a 3x3 matrix, 16 in a 4x4 matrix). +/// Furthermore, they can be converted from sf::Transform +/// objects. +/// +/// \see sf::Shader +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Glsl.inl b/SFML-2.4.2/include/SFML/Graphics/Glsl.inl new file mode 100644 index 0000000..8e72871 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Glsl.inl @@ -0,0 +1,155 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// \brief Helper functions to copy sf::Transform to sf::Glsl::Mat3/4 +/// +//////////////////////////////////////////////////////////// +void SFML_GRAPHICS_API copyMatrix(const Transform& source, Matrix<3, 3>& dest); +void SFML_GRAPHICS_API copyMatrix(const Transform& source, Matrix<4, 4>& dest); + +//////////////////////////////////////////////////////////// +/// \brief Copy array-based matrix with given number of elements +/// +/// Indirection to std::copy() to avoid inclusion of +/// and MSVC's annoying 4996 warning in header +/// +//////////////////////////////////////////////////////////// +void SFML_GRAPHICS_API copyMatrix(const float* source, std::size_t elements, float* dest); + +//////////////////////////////////////////////////////////// +/// \brief Helper functions to copy sf::Color to sf::Glsl::Vec4/Ivec4 +/// +//////////////////////////////////////////////////////////// +void SFML_GRAPHICS_API copyVector(const Color& source, Vector4& dest); +void SFML_GRAPHICS_API copyVector(const Color& source, Vector4& dest); + + +//////////////////////////////////////////////////////////// +/// \brief Matrix type, used to set uniforms in GLSL +/// +//////////////////////////////////////////////////////////// +template +struct Matrix +{ + //////////////////////////////////////////////////////////// + /// \brief Construct from raw data + /// + /// \param pointer Points to the beginning of an array that + /// has the size of the matrix. The elements + /// are copied to the instance. + /// + //////////////////////////////////////////////////////////// + explicit Matrix(const float* pointer) + { + copyMatrix(pointer, Columns * Rows, array); + } + + //////////////////////////////////////////////////////////// + /// \brief Construct implicitly from SFML transform + /// + /// This constructor is only supported for 3x3 and 4x4 + /// matrices. + /// + /// \param transform Object containing a transform. + /// + //////////////////////////////////////////////////////////// + Matrix(const Transform& transform) + { + copyMatrix(transform, *this); + } + + float array[Columns * Rows]; ///< Array holding matrix data +}; + +//////////////////////////////////////////////////////////// +/// \brief 4D vector type, used to set uniforms in GLSL +/// +//////////////////////////////////////////////////////////// +template +struct Vector4 +{ + //////////////////////////////////////////////////////////// + /// \brief Default constructor, creates a zero vector + /// + //////////////////////////////////////////////////////////// + Vector4() : + x(0), + y(0), + z(0), + w(0) + { + } + + //////////////////////////////////////////////////////////// + /// \brief Construct from 4 vector components + /// + /// \param X Component of the 4D vector + /// \param Y Component of the 4D vector + /// \param Z Component of the 4D vector + /// \param W Component of the 4D vector + /// + //////////////////////////////////////////////////////////// + Vector4(T X, T Y, T Z, T W) : + x(X), + y(Y), + z(Z), + w(W) + { + } + + //////////////////////////////////////////////////////////// + /// \brief Conversion constructor + /// + /// \param other 4D vector of different type + /// + //////////////////////////////////////////////////////////// + template + explicit Vector4(const Vector4& other) : + x(static_cast(other.x)), + y(static_cast(other.y)), + z(static_cast(other.z)), + w(static_cast(other.w)) + { + } + + //////////////////////////////////////////////////////////// + /// \brief Construct float vector implicitly from color + /// + /// \param color Color instance. Is normalized to [0, 1] + /// for floats, and left as-is for ints. + /// + //////////////////////////////////////////////////////////// + Vector4(const Color& color) + // uninitialized + { + copyVector(color, *this); + } + + T x; ///< 1st component (X) of the 4D vector + T y; ///< 2nd component (Y) of the 4D vector + T z; ///< 3rd component (Z) of the 4D vector + T w; ///< 4th component (W) of the 4D vector +}; diff --git a/SFML-2.4.2/include/SFML/Graphics/Glyph.hpp b/SFML-2.4.2/include/SFML/Graphics/Glyph.hpp new file mode 100644 index 0000000..8c632af --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Glyph.hpp @@ -0,0 +1,79 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_GLYPH_HPP +#define SFML_GLYPH_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Structure describing a glyph +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Glyph +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + Glyph() : advance(0) {} + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + float advance; ///< Offset to move horizontally to the next character + FloatRect bounds; ///< Bounding rectangle of the glyph, in coordinates relative to the baseline + IntRect textureRect; ///< Texture coordinates of the glyph inside the font's texture +}; + +} // namespace sf + + +#endif // SFML_GLYPH_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Glyph +/// \ingroup graphics +/// +/// A glyph is the visual representation of a character. +/// +/// The sf::Glyph structure provides the information needed +/// to handle the glyph: +/// \li its coordinates in the font's texture +/// \li its bounding rectangle +/// \li the offset to apply to get the starting position of the next glyph +/// +/// \see sf::Font +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Image.hpp b/SFML-2.4.2/include/SFML/Graphics/Image.hpp new file mode 100644 index 0000000..a9010c0 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Image.hpp @@ -0,0 +1,327 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_IMAGE_HPP +#define SFML_IMAGE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + + +namespace sf +{ +class InputStream; + +//////////////////////////////////////////////////////////// +/// \brief Class for loading, manipulating and saving images +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Image +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates an empty image. + /// + //////////////////////////////////////////////////////////// + Image(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~Image(); + + //////////////////////////////////////////////////////////// + /// \brief Create the image and fill it with a unique color + /// + /// \param width Width of the image + /// \param height Height of the image + /// \param color Fill color + /// + //////////////////////////////////////////////////////////// + void create(unsigned int width, unsigned int height, const Color& color = Color(0, 0, 0)); + + //////////////////////////////////////////////////////////// + /// \brief Create the image from an array of pixels + /// + /// The \a pixel array is assumed to contain 32-bits RGBA pixels, + /// and have the given \a width and \a height. If not, this is + /// an undefined behavior. + /// If \a pixels is null, an empty image is created. + /// + /// \param width Width of the image + /// \param height Height of the image + /// \param pixels Array of pixels to copy to the image + /// + //////////////////////////////////////////////////////////// + void create(unsigned int width, unsigned int height, const Uint8* pixels); + + //////////////////////////////////////////////////////////// + /// \brief Load the image from a file on disk + /// + /// The supported image formats are bmp, png, tga, jpg, gif, + /// psd, hdr and pic. Some format options are not supported, + /// like progressive jpeg. + /// If this function fails, the image is left unchanged. + /// + /// \param filename Path of the image file to load + /// + /// \return True if loading was successful + /// + /// \see loadFromMemory, loadFromStream, saveToFile + /// + //////////////////////////////////////////////////////////// + bool loadFromFile(const std::string& filename); + + //////////////////////////////////////////////////////////// + /// \brief Load the image from a file in memory + /// + /// The supported image formats are bmp, png, tga, jpg, gif, + /// psd, hdr and pic. Some format options are not supported, + /// like progressive jpeg. + /// If this function fails, the image is left unchanged. + /// + /// \param data Pointer to the file data in memory + /// \param size Size of the data to load, in bytes + /// + /// \return True if loading was successful + /// + /// \see loadFromFile, loadFromStream + /// + //////////////////////////////////////////////////////////// + bool loadFromMemory(const void* data, std::size_t size); + + //////////////////////////////////////////////////////////// + /// \brief Load the image from a custom stream + /// + /// The supported image formats are bmp, png, tga, jpg, gif, + /// psd, hdr and pic. Some format options are not supported, + /// like progressive jpeg. + /// If this function fails, the image is left unchanged. + /// + /// \param stream Source stream to read from + /// + /// \return True if loading was successful + /// + /// \see loadFromFile, loadFromMemory + /// + //////////////////////////////////////////////////////////// + bool loadFromStream(InputStream& stream); + + //////////////////////////////////////////////////////////// + /// \brief Save the image to a file on disk + /// + /// The format of the image is automatically deduced from + /// the extension. The supported image formats are bmp, png, + /// tga and jpg. The destination file is overwritten + /// if it already exists. This function fails if the image is empty. + /// + /// \param filename Path of the file to save + /// + /// \return True if saving was successful + /// + /// \see create, loadFromFile, loadFromMemory + /// + //////////////////////////////////////////////////////////// + bool saveToFile(const std::string& filename) const; + + //////////////////////////////////////////////////////////// + /// \brief Return the size (width and height) of the image + /// + /// \return Size of the image, in pixels + /// + //////////////////////////////////////////////////////////// + Vector2u getSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Create a transparency mask from a specified color-key + /// + /// This function sets the alpha value of every pixel matching + /// the given color to \a alpha (0 by default), so that they + /// become transparent. + /// + /// \param color Color to make transparent + /// \param alpha Alpha value to assign to transparent pixels + /// + //////////////////////////////////////////////////////////// + void createMaskFromColor(const Color& color, Uint8 alpha = 0); + + //////////////////////////////////////////////////////////// + /// \brief Copy pixels from another image onto this one + /// + /// This function does a slow pixel copy and should not be + /// used intensively. It can be used to prepare a complex + /// static image from several others, but if you need this + /// kind of feature in real-time you'd better use sf::RenderTexture. + /// + /// If \a sourceRect is empty, the whole image is copied. + /// If \a applyAlpha is set to true, the transparency of + /// source pixels is applied. If it is false, the pixels are + /// copied unchanged with their alpha value. + /// + /// \param source Source image to copy + /// \param destX X coordinate of the destination position + /// \param destY Y coordinate of the destination position + /// \param sourceRect Sub-rectangle of the source image to copy + /// \param applyAlpha Should the copy take into account the source transparency? + /// + //////////////////////////////////////////////////////////// + void copy(const Image& source, unsigned int destX, unsigned int destY, const IntRect& sourceRect = IntRect(0, 0, 0, 0), bool applyAlpha = false); + + //////////////////////////////////////////////////////////// + /// \brief Change the color of a pixel + /// + /// This function doesn't check the validity of the pixel + /// coordinates, using out-of-range values will result in + /// an undefined behavior. + /// + /// \param x X coordinate of pixel to change + /// \param y Y coordinate of pixel to change + /// \param color New color of the pixel + /// + /// \see getPixel + /// + //////////////////////////////////////////////////////////// + void setPixel(unsigned int x, unsigned int y, const Color& color); + + //////////////////////////////////////////////////////////// + /// \brief Get the color of a pixel + /// + /// This function doesn't check the validity of the pixel + /// coordinates, using out-of-range values will result in + /// an undefined behavior. + /// + /// \param x X coordinate of pixel to get + /// \param y Y coordinate of pixel to get + /// + /// \return Color of the pixel at coordinates (x, y) + /// + /// \see setPixel + /// + //////////////////////////////////////////////////////////// + Color getPixel(unsigned int x, unsigned int y) const; + + //////////////////////////////////////////////////////////// + /// \brief Get a read-only pointer to the array of pixels + /// + /// The returned value points to an array of RGBA pixels made of + /// 8 bits integers components. The size of the array is + /// width * height * 4 (getSize().x * getSize().y * 4). + /// Warning: the returned pointer may become invalid if you + /// modify the image, so you should never store it for too long. + /// If the image is empty, a null pointer is returned. + /// + /// \return Read-only pointer to the array of pixels + /// + //////////////////////////////////////////////////////////// + const Uint8* getPixelsPtr() const; + + //////////////////////////////////////////////////////////// + /// \brief Flip the image horizontally (left <-> right) + /// + //////////////////////////////////////////////////////////// + void flipHorizontally(); + + //////////////////////////////////////////////////////////// + /// \brief Flip the image vertically (top <-> bottom) + /// + //////////////////////////////////////////////////////////// + void flipVertically(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Vector2u m_size; ///< Image size + std::vector m_pixels; ///< Pixels of the image + #ifdef SFML_SYSTEM_ANDROID + void* m_stream; ///< Asset file streamer (if loaded from file) + #endif +}; + +} // namespace sf + + +#endif // SFML_IMAGE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Image +/// \ingroup graphics +/// +/// sf::Image is an abstraction to manipulate images +/// as bidimensional arrays of pixels. The class provides +/// functions to load, read, write and save pixels, as well +/// as many other useful functions. +/// +/// sf::Image can handle a unique internal representation of +/// pixels, which is RGBA 32 bits. This means that a pixel +/// must be composed of 8 bits red, green, blue and alpha +/// channels -- just like a sf::Color. +/// All the functions that return an array of pixels follow +/// this rule, and all parameters that you pass to sf::Image +/// functions (such as loadFromMemory) must use this +/// representation as well. +/// +/// A sf::Image can be copied, but it is a heavy resource and +/// if possible you should always use [const] references to +/// pass or return them to avoid useless copies. +/// +/// Usage example: +/// \code +/// // Load an image file from a file +/// sf::Image background; +/// if (!background.loadFromFile("background.jpg")) +/// return -1; +/// +/// // Create a 20x20 image filled with black color +/// sf::Image image; +/// image.create(20, 20, sf::Color::Black); +/// +/// // Copy image1 on image2 at position (10, 10) +/// image.copy(background, 10, 10); +/// +/// // Make the top-left pixel transparent +/// sf::Color color = image.getPixel(0, 0); +/// color.a = 0; +/// image.setPixel(0, 0, color); +/// +/// // Save the image to a file +/// if (!image.saveToFile("result.png")) +/// return -1; +/// \endcode +/// +/// \see sf::Texture +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/PrimitiveType.hpp b/SFML-2.4.2/include/SFML/Graphics/PrimitiveType.hpp new file mode 100644 index 0000000..33f9e46 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/PrimitiveType.hpp @@ -0,0 +1,58 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_PRIMITIVETYPE_HPP +#define SFML_PRIMITIVETYPE_HPP + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \ingroup graphics +/// \brief Types of primitives that a sf::VertexArray can render +/// +/// Points and lines have no area, therefore their thickness +/// will always be 1 pixel, regardless the current transform +/// and view. +/// +//////////////////////////////////////////////////////////// +enum PrimitiveType +{ + Points, ///< List of individual points + Lines, ///< List of individual lines + LineStrip, ///< List of connected lines, a point uses the previous point to form a line + Triangles, ///< List of individual triangles + TriangleStrip, ///< List of connected triangles, a point uses the two previous points to form a triangle + TriangleFan, ///< List of connected triangles, a point uses the common center and the previous point to form a triangle + Quads, ///< List of individual quads (deprecated, don't work with OpenGL ES) + + // Deprecated names + LinesStrip = LineStrip, ///< \deprecated Use LineStrip instead + TrianglesStrip = TriangleStrip, ///< \deprecated Use TriangleStrip instead + TrianglesFan = TriangleFan ///< \deprecated Use TriangleFan instead +}; + +} // namespace sf + + +#endif // SFML_PRIMITIVETYPE_HPP diff --git a/SFML-2.4.2/include/SFML/Graphics/Rect.hpp b/SFML-2.4.2/include/SFML/Graphics/Rect.hpp new file mode 100644 index 0000000..b88e9b2 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Rect.hpp @@ -0,0 +1,254 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_RECT_HPP +#define SFML_RECT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Utility class for manipulating 2D axis aligned rectangles +/// +//////////////////////////////////////////////////////////// +template +class Rect +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates an empty rectangle (it is equivalent to calling + /// Rect(0, 0, 0, 0)). + /// + //////////////////////////////////////////////////////////// + Rect(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the rectangle from its coordinates + /// + /// Be careful, the last two parameters are the width + /// and height, not the right and bottom coordinates! + /// + /// \param rectLeft Left coordinate of the rectangle + /// \param rectTop Top coordinate of the rectangle + /// \param rectWidth Width of the rectangle + /// \param rectHeight Height of the rectangle + /// + //////////////////////////////////////////////////////////// + Rect(T rectLeft, T rectTop, T rectWidth, T rectHeight); + + //////////////////////////////////////////////////////////// + /// \brief Construct the rectangle from position and size + /// + /// Be careful, the last parameter is the size, + /// not the bottom-right corner! + /// + /// \param position Position of the top-left corner of the rectangle + /// \param size Size of the rectangle + /// + //////////////////////////////////////////////////////////// + Rect(const Vector2& position, const Vector2& size); + + //////////////////////////////////////////////////////////// + /// \brief Construct the rectangle from another type of rectangle + /// + /// This constructor doesn't replace the copy constructor, + /// it's called only when U != T. + /// A call to this constructor will fail to compile if U + /// is not convertible to T. + /// + /// \param rectangle Rectangle to convert + /// + //////////////////////////////////////////////////////////// + template + explicit Rect(const Rect& rectangle); + + //////////////////////////////////////////////////////////// + /// \brief Check if a point is inside the rectangle's area + /// + /// This check is non-inclusive. If the point lies on the + /// edge of the rectangle, this function will return false. + /// + /// \param x X coordinate of the point to test + /// \param y Y coordinate of the point to test + /// + /// \return True if the point is inside, false otherwise + /// + /// \see intersects + /// + //////////////////////////////////////////////////////////// + bool contains(T x, T y) const; + + //////////////////////////////////////////////////////////// + /// \brief Check if a point is inside the rectangle's area + /// + /// This check is non-inclusive. If the point lies on the + /// edge of the rectangle, this function will return false. + /// + /// \param point Point to test + /// + /// \return True if the point is inside, false otherwise + /// + /// \see intersects + /// + //////////////////////////////////////////////////////////// + bool contains(const Vector2& point) const; + + //////////////////////////////////////////////////////////// + /// \brief Check the intersection between two rectangles + /// + /// \param rectangle Rectangle to test + /// + /// \return True if rectangles overlap, false otherwise + /// + /// \see contains + /// + //////////////////////////////////////////////////////////// + bool intersects(const Rect& rectangle) const; + + //////////////////////////////////////////////////////////// + /// \brief Check the intersection between two rectangles + /// + /// This overload returns the overlapped rectangle in the + /// \a intersection parameter. + /// + /// \param rectangle Rectangle to test + /// \param intersection Rectangle to be filled with the intersection + /// + /// \return True if rectangles overlap, false otherwise + /// + /// \see contains + /// + //////////////////////////////////////////////////////////// + bool intersects(const Rect& rectangle, Rect& intersection) const; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + T left; ///< Left coordinate of the rectangle + T top; ///< Top coordinate of the rectangle + T width; ///< Width of the rectangle + T height; ///< Height of the rectangle +}; + +//////////////////////////////////////////////////////////// +/// \relates Rect +/// \brief Overload of binary operator == +/// +/// This operator compares strict equality between two rectangles. +/// +/// \param left Left operand (a rectangle) +/// \param right Right operand (a rectangle) +/// +/// \return True if \a left is equal to \a right +/// +//////////////////////////////////////////////////////////// +template +bool operator ==(const Rect& left, const Rect& right); + +//////////////////////////////////////////////////////////// +/// \relates Rect +/// \brief Overload of binary operator != +/// +/// This operator compares strict difference between two rectangles. +/// +/// \param left Left operand (a rectangle) +/// \param right Right operand (a rectangle) +/// +/// \return True if \a left is not equal to \a right +/// +//////////////////////////////////////////////////////////// +template +bool operator !=(const Rect& left, const Rect& right); + +#include + +// Create typedefs for the most common types +typedef Rect IntRect; +typedef Rect FloatRect; + +} // namespace sf + + +#endif // SFML_RECT_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Rect +/// \ingroup graphics +/// +/// A rectangle is defined by its top-left corner and its size. +/// It is a very simple class defined for convenience, so +/// its member variables (left, top, width and height) are public +/// and can be accessed directly, just like the vector classes +/// (Vector2 and Vector3). +/// +/// To keep things simple, sf::Rect doesn't define +/// functions to emulate the properties that are not directly +/// members (such as right, bottom, center, etc.), it rather +/// only provides intersection functions. +/// +/// sf::Rect uses the usual rules for its boundaries: +/// \li The left and top edges are included in the rectangle's area +/// \li The right (left + width) and bottom (top + height) edges are excluded from the rectangle's area +/// +/// This means that sf::IntRect(0, 0, 1, 1) and sf::IntRect(1, 1, 1, 1) +/// don't intersect. +/// +/// sf::Rect is a template and may be used with any numeric type, but +/// for simplicity the instantiations used by SFML are typedef'd: +/// \li sf::Rect is sf::IntRect +/// \li sf::Rect is sf::FloatRect +/// +/// So that you don't have to care about the template syntax. +/// +/// Usage example: +/// \code +/// // Define a rectangle, located at (0, 0) with a size of 20x5 +/// sf::IntRect r1(0, 0, 20, 5); +/// +/// // Define another rectangle, located at (4, 2) with a size of 18x10 +/// sf::Vector2i position(4, 2); +/// sf::Vector2i size(18, 10); +/// sf::IntRect r2(position, size); +/// +/// // Test intersections with the point (3, 1) +/// bool b1 = r1.contains(3, 1); // true +/// bool b2 = r2.contains(3, 1); // false +/// +/// // Test the intersection between r1 and r2 +/// sf::IntRect result; +/// bool b3 = r1.intersects(r2, result); // true +/// // result == (4, 2, 16, 3) +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Rect.inl b/SFML-2.4.2/include/SFML/Graphics/Rect.inl new file mode 100644 index 0000000..c1bb9bb --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Rect.inl @@ -0,0 +1,159 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +template +Rect::Rect() : +left (0), +top (0), +width (0), +height(0) +{ + +} + + +//////////////////////////////////////////////////////////// +template +Rect::Rect(T rectLeft, T rectTop, T rectWidth, T rectHeight) : +left (rectLeft), +top (rectTop), +width (rectWidth), +height(rectHeight) +{ + +} + + +//////////////////////////////////////////////////////////// +template +Rect::Rect(const Vector2& position, const Vector2& size) : +left (position.x), +top (position.y), +width (size.x), +height(size.y) +{ + +} + + +//////////////////////////////////////////////////////////// +template +template +Rect::Rect(const Rect& rectangle) : +left (static_cast(rectangle.left)), +top (static_cast(rectangle.top)), +width (static_cast(rectangle.width)), +height(static_cast(rectangle.height)) +{ +} + + +//////////////////////////////////////////////////////////// +template +bool Rect::contains(T x, T y) const +{ + // Rectangles with negative dimensions are allowed, so we must handle them correctly + + // Compute the real min and max of the rectangle on both axes + T minX = std::min(left, static_cast(left + width)); + T maxX = std::max(left, static_cast(left + width)); + T minY = std::min(top, static_cast(top + height)); + T maxY = std::max(top, static_cast(top + height)); + + return (x >= minX) && (x < maxX) && (y >= minY) && (y < maxY); +} + + +//////////////////////////////////////////////////////////// +template +bool Rect::contains(const Vector2& point) const +{ + return contains(point.x, point.y); +} + + +//////////////////////////////////////////////////////////// +template +bool Rect::intersects(const Rect& rectangle) const +{ + Rect intersection; + return intersects(rectangle, intersection); +} + + +//////////////////////////////////////////////////////////// +template +bool Rect::intersects(const Rect& rectangle, Rect& intersection) const +{ + // Rectangles with negative dimensions are allowed, so we must handle them correctly + + // Compute the min and max of the first rectangle on both axes + T r1MinX = std::min(left, static_cast(left + width)); + T r1MaxX = std::max(left, static_cast(left + width)); + T r1MinY = std::min(top, static_cast(top + height)); + T r1MaxY = std::max(top, static_cast(top + height)); + + // Compute the min and max of the second rectangle on both axes + T r2MinX = std::min(rectangle.left, static_cast(rectangle.left + rectangle.width)); + T r2MaxX = std::max(rectangle.left, static_cast(rectangle.left + rectangle.width)); + T r2MinY = std::min(rectangle.top, static_cast(rectangle.top + rectangle.height)); + T r2MaxY = std::max(rectangle.top, static_cast(rectangle.top + rectangle.height)); + + // Compute the intersection boundaries + T interLeft = std::max(r1MinX, r2MinX); + T interTop = std::max(r1MinY, r2MinY); + T interRight = std::min(r1MaxX, r2MaxX); + T interBottom = std::min(r1MaxY, r2MaxY); + + // If the intersection is valid (positive non zero area), then there is an intersection + if ((interLeft < interRight) && (interTop < interBottom)) + { + intersection = Rect(interLeft, interTop, interRight - interLeft, interBottom - interTop); + return true; + } + else + { + intersection = Rect(0, 0, 0, 0); + return false; + } +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator ==(const Rect& left, const Rect& right) +{ + return (left.left == right.left) && (left.width == right.width) && + (left.top == right.top) && (left.height == right.height); +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator !=(const Rect& left, const Rect& right) +{ + return !(left == right); +} diff --git a/SFML-2.4.2/include/SFML/Graphics/RectangleShape.hpp b/SFML-2.4.2/include/SFML/Graphics/RectangleShape.hpp new file mode 100644 index 0000000..f9754f6 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/RectangleShape.hpp @@ -0,0 +1,132 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_RECTANGLESHAPE_HPP +#define SFML_RECTANGLESHAPE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Specialized shape representing a rectangle +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API RectangleShape : public Shape +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// \param size Size of the rectangle + /// + //////////////////////////////////////////////////////////// + explicit RectangleShape(const Vector2f& size = Vector2f(0, 0)); + + //////////////////////////////////////////////////////////// + /// \brief Set the size of the rectangle + /// + /// \param size New size of the rectangle + /// + /// \see getSize + /// + //////////////////////////////////////////////////////////// + void setSize(const Vector2f& size); + + //////////////////////////////////////////////////////////// + /// \brief Get the size of the rectangle + /// + /// \return Size of the rectangle + /// + /// \see setSize + /// + //////////////////////////////////////////////////////////// + const Vector2f& getSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the number of points defining the shape + /// + /// \return Number of points of the shape. For rectangle + /// shapes, this number is always 4. + /// + //////////////////////////////////////////////////////////// + virtual std::size_t getPointCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get a point of the rectangle + /// + /// The returned point is in local coordinates, that is, + /// the shape's transforms (position, rotation, scale) are + /// not taken into account. + /// The result is undefined if \a index is out of the valid range. + /// + /// \param index Index of the point to get, in range [0 .. 3] + /// + /// \return index-th point of the shape + /// + //////////////////////////////////////////////////////////// + virtual Vector2f getPoint(std::size_t index) const; + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Vector2f m_size; ///< Size of the rectangle +}; + +} // namespace sf + + +#endif // SFML_RECTANGLESHAPE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::RectangleShape +/// \ingroup graphics +/// +/// This class inherits all the functions of sf::Transformable +/// (position, rotation, scale, bounds, ...) as well as the +/// functions of sf::Shape (outline, color, texture, ...). +/// +/// Usage example: +/// \code +/// sf::RectangleShape rectangle; +/// rectangle.setSize(sf::Vector2f(100, 50)); +/// rectangle.setOutlineColor(sf::Color::Red); +/// rectangle.setOutlineThickness(5); +/// rectangle.setPosition(10, 20); +/// ... +/// window.draw(rectangle); +/// \endcode +/// +/// \see sf::Shape, sf::CircleShape, sf::ConvexShape +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/RenderStates.hpp b/SFML-2.4.2/include/SFML/Graphics/RenderStates.hpp new file mode 100644 index 0000000..870b275 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/RenderStates.hpp @@ -0,0 +1,174 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_RENDERSTATES_HPP +#define SFML_RENDERSTATES_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +class Shader; +class Texture; + +//////////////////////////////////////////////////////////// +/// \brief Define the states used for drawing to a RenderTarget +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API RenderStates +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Constructing a default set of render states is equivalent + /// to using sf::RenderStates::Default. + /// The default set defines: + /// \li the BlendAlpha blend mode + /// \li the identity transform + /// \li a null texture + /// \li a null shader + /// + //////////////////////////////////////////////////////////// + RenderStates(); + + //////////////////////////////////////////////////////////// + /// \brief Construct a default set of render states with a custom blend mode + /// + /// \param theBlendMode Blend mode to use + /// + //////////////////////////////////////////////////////////// + RenderStates(const BlendMode& theBlendMode); + + //////////////////////////////////////////////////////////// + /// \brief Construct a default set of render states with a custom transform + /// + /// \param theTransform Transform to use + /// + //////////////////////////////////////////////////////////// + RenderStates(const Transform& theTransform); + + //////////////////////////////////////////////////////////// + /// \brief Construct a default set of render states with a custom texture + /// + /// \param theTexture Texture to use + /// + //////////////////////////////////////////////////////////// + RenderStates(const Texture* theTexture); + + //////////////////////////////////////////////////////////// + /// \brief Construct a default set of render states with a custom shader + /// + /// \param theShader Shader to use + /// + //////////////////////////////////////////////////////////// + RenderStates(const Shader* theShader); + + //////////////////////////////////////////////////////////// + /// \brief Construct a set of render states with all its attributes + /// + /// \param theBlendMode Blend mode to use + /// \param theTransform Transform to use + /// \param theTexture Texture to use + /// \param theShader Shader to use + /// + //////////////////////////////////////////////////////////// + RenderStates(const BlendMode& theBlendMode, const Transform& theTransform, + const Texture* theTexture, const Shader* theShader); + + //////////////////////////////////////////////////////////// + // Static member data + //////////////////////////////////////////////////////////// + static const RenderStates Default; ///< Special instance holding the default render states + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + BlendMode blendMode; ///< Blending mode + Transform transform; ///< Transform + const Texture* texture; ///< Texture + const Shader* shader; ///< Shader +}; + +} // namespace sf + + +#endif // SFML_RENDERSTATES_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::RenderStates +/// \ingroup graphics +/// +/// There are four global states that can be applied to +/// the drawn objects: +/// \li the blend mode: how pixels of the object are blended with the background +/// \li the transform: how the object is positioned/rotated/scaled +/// \li the texture: what image is mapped to the object +/// \li the shader: what custom effect is applied to the object +/// +/// High-level objects such as sprites or text force some of +/// these states when they are drawn. For example, a sprite +/// will set its own texture, so that you don't have to care +/// about it when drawing the sprite. +/// +/// The transform is a special case: sprites, texts and shapes +/// (and it's a good idea to do it with your own drawable classes +/// too) combine their transform with the one that is passed in the +/// RenderStates structure. So that you can use a "global" transform +/// on top of each object's transform. +/// +/// Most objects, especially high-level drawables, can be drawn +/// directly without defining render states explicitly -- the +/// default set of states is ok in most cases. +/// \code +/// window.draw(sprite); +/// \endcode +/// +/// If you want to use a single specific render state, +/// for example a shader, you can pass it directly to the Draw +/// function: sf::RenderStates has an implicit one-argument +/// constructor for each state. +/// \code +/// window.draw(sprite, shader); +/// \endcode +/// +/// When you're inside the Draw function of a drawable +/// object (inherited from sf::Drawable), you can +/// either pass the render states unmodified, or change +/// some of them. +/// For example, a transformable object will combine the +/// current transform with its own transform. A sprite will +/// set its texture. Etc. +/// +/// \see sf::RenderTarget, sf::Drawable +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/RenderTarget.hpp b/SFML-2.4.2/include/SFML/Graphics/RenderTarget.hpp new file mode 100644 index 0000000..ba842fb --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/RenderTarget.hpp @@ -0,0 +1,451 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_RENDERTARGET_HPP +#define SFML_RENDERTARGET_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +class Drawable; + +//////////////////////////////////////////////////////////// +/// \brief Base class for all render targets (window, texture, ...) +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API RenderTarget : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + virtual ~RenderTarget(); + + //////////////////////////////////////////////////////////// + /// \brief Clear the entire target with a single color + /// + /// This function is usually called once every frame, + /// to clear the previous contents of the target. + /// + /// \param color Fill color to use to clear the render target + /// + //////////////////////////////////////////////////////////// + void clear(const Color& color = Color(0, 0, 0, 255)); + + //////////////////////////////////////////////////////////// + /// \brief Change the current active view + /// + /// The view is like a 2D camera, it controls which part of + /// the 2D scene is visible, and how it is viewed in the + /// render target. + /// The new view will affect everything that is drawn, until + /// another view is set. + /// The render target keeps its own copy of the view object, + /// so it is not necessary to keep the original one alive + /// after calling this function. + /// To restore the original view of the target, you can pass + /// the result of getDefaultView() to this function. + /// + /// \param view New view to use + /// + /// \see getView, getDefaultView + /// + //////////////////////////////////////////////////////////// + void setView(const View& view); + + //////////////////////////////////////////////////////////// + /// \brief Get the view currently in use in the render target + /// + /// \return The view object that is currently used + /// + /// \see setView, getDefaultView + /// + //////////////////////////////////////////////////////////// + const View& getView() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the default view of the render target + /// + /// The default view has the initial size of the render target, + /// and never changes after the target has been created. + /// + /// \return The default view of the render target + /// + /// \see setView, getView + /// + //////////////////////////////////////////////////////////// + const View& getDefaultView() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the viewport of a view, applied to this render target + /// + /// The viewport is defined in the view as a ratio, this function + /// simply applies this ratio to the current dimensions of the + /// render target to calculate the pixels rectangle that the viewport + /// actually covers in the target. + /// + /// \param view The view for which we want to compute the viewport + /// + /// \return Viewport rectangle, expressed in pixels + /// + //////////////////////////////////////////////////////////// + IntRect getViewport(const View& view) const; + + //////////////////////////////////////////////////////////// + /// \brief Convert a point from target coordinates to world + /// coordinates, using the current view + /// + /// This function is an overload of the mapPixelToCoords + /// function that implicitly uses the current view. + /// It is equivalent to: + /// \code + /// target.mapPixelToCoords(point, target.getView()); + /// \endcode + /// + /// \param point Pixel to convert + /// + /// \return The converted point, in "world" coordinates + /// + /// \see mapCoordsToPixel + /// + //////////////////////////////////////////////////////////// + Vector2f mapPixelToCoords(const Vector2i& point) const; + + //////////////////////////////////////////////////////////// + /// \brief Convert a point from target coordinates to world coordinates + /// + /// This function finds the 2D position that matches the + /// given pixel of the render target. In other words, it does + /// the inverse of what the graphics card does, to find the + /// initial position of a rendered pixel. + /// + /// Initially, both coordinate systems (world units and target pixels) + /// match perfectly. But if you define a custom view or resize your + /// render target, this assertion is not true anymore, i.e. a point + /// located at (10, 50) in your render target may map to the point + /// (150, 75) in your 2D world -- if the view is translated by (140, 25). + /// + /// For render-windows, this function is typically used to find + /// which point (or object) is located below the mouse cursor. + /// + /// This version uses a custom view for calculations, see the other + /// overload of the function if you want to use the current view of the + /// render target. + /// + /// \param point Pixel to convert + /// \param view The view to use for converting the point + /// + /// \return The converted point, in "world" units + /// + /// \see mapCoordsToPixel + /// + //////////////////////////////////////////////////////////// + Vector2f mapPixelToCoords(const Vector2i& point, const View& view) const; + + //////////////////////////////////////////////////////////// + /// \brief Convert a point from world coordinates to target + /// coordinates, using the current view + /// + /// This function is an overload of the mapCoordsToPixel + /// function that implicitly uses the current view. + /// It is equivalent to: + /// \code + /// target.mapCoordsToPixel(point, target.getView()); + /// \endcode + /// + /// \param point Point to convert + /// + /// \return The converted point, in target coordinates (pixels) + /// + /// \see mapPixelToCoords + /// + //////////////////////////////////////////////////////////// + Vector2i mapCoordsToPixel(const Vector2f& point) const; + + //////////////////////////////////////////////////////////// + /// \brief Convert a point from world coordinates to target coordinates + /// + /// This function finds the pixel of the render target that matches + /// the given 2D point. In other words, it goes through the same process + /// as the graphics card, to compute the final position of a rendered point. + /// + /// Initially, both coordinate systems (world units and target pixels) + /// match perfectly. But if you define a custom view or resize your + /// render target, this assertion is not true anymore, i.e. a point + /// located at (150, 75) in your 2D world may map to the pixel + /// (10, 50) of your render target -- if the view is translated by (140, 25). + /// + /// This version uses a custom view for calculations, see the other + /// overload of the function if you want to use the current view of the + /// render target. + /// + /// \param point Point to convert + /// \param view The view to use for converting the point + /// + /// \return The converted point, in target coordinates (pixels) + /// + /// \see mapPixelToCoords + /// + //////////////////////////////////////////////////////////// + Vector2i mapCoordsToPixel(const Vector2f& point, const View& view) const; + + //////////////////////////////////////////////////////////// + /// \brief Draw a drawable object to the render target + /// + /// \param drawable Object to draw + /// \param states Render states to use for drawing + /// + //////////////////////////////////////////////////////////// + void draw(const Drawable& drawable, const RenderStates& states = RenderStates::Default); + + //////////////////////////////////////////////////////////// + /// \brief Draw primitives defined by an array of vertices + /// + /// \param vertices Pointer to the vertices + /// \param vertexCount Number of vertices in the array + /// \param type Type of primitives to draw + /// \param states Render states to use for drawing + /// + //////////////////////////////////////////////////////////// + void draw(const Vertex* vertices, std::size_t vertexCount, + PrimitiveType type, const RenderStates& states = RenderStates::Default); + + //////////////////////////////////////////////////////////// + /// \brief Return the size of the rendering region of the target + /// + /// \return Size in pixels + /// + //////////////////////////////////////////////////////////// + virtual Vector2u getSize() const = 0; + + //////////////////////////////////////////////////////////// + /// \brief Save the current OpenGL render states and matrices + /// + /// This function can be used when you mix SFML drawing + /// and direct OpenGL rendering. Combined with popGLStates, + /// it ensures that: + /// \li SFML's internal states are not messed up by your OpenGL code + /// \li your OpenGL states are not modified by a call to a SFML function + /// + /// More specifically, it must be used around code that + /// calls Draw functions. Example: + /// \code + /// // OpenGL code here... + /// window.pushGLStates(); + /// window.draw(...); + /// window.draw(...); + /// window.popGLStates(); + /// // OpenGL code here... + /// \endcode + /// + /// Note that this function is quite expensive: it saves all the + /// possible OpenGL states and matrices, even the ones you + /// don't care about. Therefore it should be used wisely. + /// It is provided for convenience, but the best results will + /// be achieved if you handle OpenGL states yourself (because + /// you know which states have really changed, and need to be + /// saved and restored). Take a look at the resetGLStates + /// function if you do so. + /// + /// \see popGLStates + /// + //////////////////////////////////////////////////////////// + void pushGLStates(); + + //////////////////////////////////////////////////////////// + /// \brief Restore the previously saved OpenGL render states and matrices + /// + /// See the description of pushGLStates to get a detailed + /// description of these functions. + /// + /// \see pushGLStates + /// + //////////////////////////////////////////////////////////// + void popGLStates(); + + //////////////////////////////////////////////////////////// + /// \brief Reset the internal OpenGL states so that the target is ready for drawing + /// + /// This function can be used when you mix SFML drawing + /// and direct OpenGL rendering, if you choose not to use + /// pushGLStates/popGLStates. It makes sure that all OpenGL + /// states needed by SFML are set, so that subsequent draw() + /// calls will work as expected. + /// + /// Example: + /// \code + /// // OpenGL code here... + /// glPushAttrib(...); + /// window.resetGLStates(); + /// window.draw(...); + /// window.draw(...); + /// glPopAttrib(...); + /// // OpenGL code here... + /// \endcode + /// + //////////////////////////////////////////////////////////// + void resetGLStates(); + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + RenderTarget(); + + //////////////////////////////////////////////////////////// + /// \brief Performs the common initialization step after creation + /// + /// The derived classes must call this function after the + /// target is created and ready for drawing. + /// + //////////////////////////////////////////////////////////// + void initialize(); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Apply the current view + /// + //////////////////////////////////////////////////////////// + void applyCurrentView(); + + //////////////////////////////////////////////////////////// + /// \brief Apply a new blending mode + /// + /// \param mode Blending mode to apply + /// + //////////////////////////////////////////////////////////// + void applyBlendMode(const BlendMode& mode); + + //////////////////////////////////////////////////////////// + /// \brief Apply a new transform + /// + /// \param transform Transform to apply + /// + //////////////////////////////////////////////////////////// + void applyTransform(const Transform& transform); + + //////////////////////////////////////////////////////////// + /// \brief Apply a new texture + /// + /// \param texture Texture to apply + /// + //////////////////////////////////////////////////////////// + void applyTexture(const Texture* texture); + + //////////////////////////////////////////////////////////// + /// \brief Apply a new shader + /// + /// \param shader Shader to apply + /// + //////////////////////////////////////////////////////////// + void applyShader(const Shader* shader); + + //////////////////////////////////////////////////////////// + /// \brief Activate the target for rendering + /// + /// This function must be implemented by derived classes to make + /// their OpenGL context current; it is called by the base class + /// everytime it's going to use OpenGL calls. + /// + /// \param active True to make the target active, false to deactivate it + /// + /// \return True if the function succeeded + /// + //////////////////////////////////////////////////////////// + virtual bool activate(bool active) = 0; + + //////////////////////////////////////////////////////////// + /// \brief Render states cache + /// + //////////////////////////////////////////////////////////// + struct StatesCache + { + enum {VertexCacheSize = 4}; + + bool glStatesSet; ///< Are our internal GL states set yet? + bool viewChanged; ///< Has the current view changed since last draw? + BlendMode lastBlendMode; ///< Cached blending mode + Uint64 lastTextureId; ///< Cached texture + bool useVertexCache; ///< Did we previously use the vertex cache? + Vertex vertexCache[VertexCacheSize]; ///< Pre-transformed vertices cache + }; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + View m_defaultView; ///< Default view + View m_view; ///< Current view + StatesCache m_cache; ///< Render states cache +}; + +} // namespace sf + + +#endif // SFML_RENDERTARGET_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::RenderTarget +/// \ingroup graphics +/// +/// sf::RenderTarget defines the common behavior of all the +/// 2D render targets usable in the graphics module. It makes +/// it possible to draw 2D entities like sprites, shapes, text +/// without using any OpenGL command directly. +/// +/// A sf::RenderTarget is also able to use views (sf::View), +/// which are a kind of 2D cameras. With views you can globally +/// scroll, rotate or zoom everything that is drawn, +/// without having to transform every single entity. See the +/// documentation of sf::View for more details and sample pieces of +/// code about this class. +/// +/// On top of that, render targets are still able to render direct +/// OpenGL stuff. It is even possible to mix together OpenGL calls +/// and regular SFML drawing commands. When doing so, make sure that +/// OpenGL states are not messed up by calling the +/// pushGLStates/popGLStates functions. +/// +/// \see sf::RenderWindow, sf::RenderTexture, sf::View +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/RenderTexture.hpp b/SFML-2.4.2/include/SFML/Graphics/RenderTexture.hpp new file mode 100644 index 0000000..db3f91e --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/RenderTexture.hpp @@ -0,0 +1,296 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_RENDERTEXTURE_HPP +#define SFML_RENDERTEXTURE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +namespace priv +{ + class RenderTextureImpl; +} + +//////////////////////////////////////////////////////////// +/// \brief Target for off-screen 2D rendering into a texture +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API RenderTexture : public RenderTarget +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Constructs an empty, invalid render-texture. You must + /// call create to have a valid render-texture. + /// + /// \see create + /// + //////////////////////////////////////////////////////////// + RenderTexture(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + virtual ~RenderTexture(); + + //////////////////////////////////////////////////////////// + /// \brief Create the render-texture + /// + /// Before calling this function, the render-texture is in + /// an invalid state, thus it is mandatory to call it before + /// doing anything with the render-texture. + /// The last parameter, \a depthBuffer, is useful if you want + /// to use the render-texture for 3D OpenGL rendering that requires + /// a depth buffer. Otherwise it is unnecessary, and you should + /// leave this parameter to false (which is its default value). + /// + /// \param width Width of the render-texture + /// \param height Height of the render-texture + /// \param depthBuffer Do you want this render-texture to have a depth buffer? + /// + /// \return True if creation has been successful + /// + //////////////////////////////////////////////////////////// + bool create(unsigned int width, unsigned int height, bool depthBuffer = false); + + //////////////////////////////////////////////////////////// + /// \brief Enable or disable texture smoothing + /// + /// This function is similar to Texture::setSmooth. + /// This parameter is disabled by default. + /// + /// \param smooth True to enable smoothing, false to disable it + /// + /// \see isSmooth + /// + //////////////////////////////////////////////////////////// + void setSmooth(bool smooth); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether the smooth filtering is enabled or not + /// + /// \return True if texture smoothing is enabled + /// + /// \see setSmooth + /// + //////////////////////////////////////////////////////////// + bool isSmooth() const; + + //////////////////////////////////////////////////////////// + /// \brief Enable or disable texture repeating + /// + /// This function is similar to Texture::setRepeated. + /// This parameter is disabled by default. + /// + /// \param repeated True to enable repeating, false to disable it + /// + /// \see isRepeated + /// + //////////////////////////////////////////////////////////// + void setRepeated(bool repeated); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether the texture is repeated or not + /// + /// \return True if texture is repeated + /// + /// \see setRepeated + /// + //////////////////////////////////////////////////////////// + bool isRepeated() const; + + //////////////////////////////////////////////////////////// + /// \brief Generate a mipmap using the current texture data + /// + /// This function is similar to Texture::generateMipmap and operates + /// on the texture used as the target for drawing. + /// Be aware that any draw operation may modify the base level image data. + /// For this reason, calling this function only makes sense after all + /// drawing is completed and display has been called. Not calling display + /// after subsequent drawing will lead to undefined behavior if a mipmap + /// had been previously generated. + /// + /// \return True if mipmap generation was successful, false if unsuccessful + /// + //////////////////////////////////////////////////////////// + bool generateMipmap(); + + //////////////////////////////////////////////////////////// + /// \brief Activate or deactivate the render-texture for rendering + /// + /// This function makes the render-texture's context current for + /// future OpenGL rendering operations (so you shouldn't care + /// about it if you're not doing direct OpenGL stuff). + /// Only one context can be current in a thread, so if you + /// want to draw OpenGL geometry to another render target + /// (like a RenderWindow) don't forget to activate it again. + /// + /// \param active True to activate, false to deactivate + /// + /// \return True if operation was successful, false otherwise + /// + //////////////////////////////////////////////////////////// + bool setActive(bool active = true); + + //////////////////////////////////////////////////////////// + /// \brief Update the contents of the target texture + /// + /// This function updates the target texture with what + /// has been drawn so far. Like for windows, calling this + /// function is mandatory at the end of rendering. Not calling + /// it may leave the texture in an undefined state. + /// + //////////////////////////////////////////////////////////// + void display(); + + //////////////////////////////////////////////////////////// + /// \brief Return the size of the rendering region of the texture + /// + /// The returned value is the size that you passed to + /// the create function. + /// + /// \return Size in pixels + /// + //////////////////////////////////////////////////////////// + virtual Vector2u getSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Get a read-only reference to the target texture + /// + /// After drawing to the render-texture and calling Display, + /// you can retrieve the updated texture using this function, + /// and draw it using a sprite (for example). + /// The internal sf::Texture of a render-texture is always the + /// same instance, so that it is possible to call this function + /// once and keep a reference to the texture even after it is + /// modified. + /// + /// \return Const reference to the texture + /// + //////////////////////////////////////////////////////////// + const Texture& getTexture() const; + +private: + + //////////////////////////////////////////////////////////// + /// \brief Activate the target for rendering + /// + /// This function is called by the base class + /// everytime it's going to use OpenGL calls. + /// + /// \param active True to make the target active, false to deactivate it + /// + /// \return True if the function succeeded + /// + //////////////////////////////////////////////////////////// + virtual bool activate(bool active); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + priv::RenderTextureImpl* m_impl; ///< Platform/hardware specific implementation + Texture m_texture; ///< Target texture to draw on +}; + +} // namespace sf + + +#endif // SFML_RENDERTEXTURE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::RenderTexture +/// \ingroup graphics +/// +/// sf::RenderTexture is the little brother of sf::RenderWindow. +/// It implements the same 2D drawing and OpenGL-related functions +/// (see their base class sf::RenderTarget for more details), +/// the difference is that the result is stored in an off-screen +/// texture rather than being show in a window. +/// +/// Rendering to a texture can be useful in a variety of situations: +/// \li precomputing a complex static texture (like a level's background from multiple tiles) +/// \li applying post-effects to the whole scene with shaders +/// \li creating a sprite from a 3D object rendered with OpenGL +/// \li etc. +/// +/// Usage example: +/// +/// \code +/// // Create a new render-window +/// sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window"); +/// +/// // Create a new render-texture +/// sf::RenderTexture texture; +/// if (!texture.create(500, 500)) +/// return -1; +/// +/// // The main loop +/// while (window.isOpen()) +/// { +/// // Event processing +/// // ... +/// +/// // Clear the whole texture with red color +/// texture.clear(sf::Color::Red); +/// +/// // Draw stuff to the texture +/// texture.draw(sprite); // sprite is a sf::Sprite +/// texture.draw(shape); // shape is a sf::Shape +/// texture.draw(text); // text is a sf::Text +/// +/// // We're done drawing to the texture +/// texture.display(); +/// +/// // Now we start rendering to the window, clear it first +/// window.clear(); +/// +/// // Draw the texture +/// sf::Sprite sprite(texture.getTexture()); +/// window.draw(sprite); +/// +/// // End the current frame and display its contents on screen +/// window.display(); +/// } +/// \endcode +/// +/// Like sf::RenderWindow, sf::RenderTexture is still able to render direct +/// OpenGL stuff. It is even possible to mix together OpenGL calls +/// and regular SFML drawing commands. If you need a depth buffer for +/// 3D rendering, don't forget to request it when calling RenderTexture::create. +/// +/// \see sf::RenderTarget, sf::RenderWindow, sf::View, sf::Texture +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/RenderWindow.hpp b/SFML-2.4.2/include/SFML/Graphics/RenderWindow.hpp new file mode 100644 index 0000000..8b24e1e --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/RenderWindow.hpp @@ -0,0 +1,278 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_RENDERWINDOW_HPP +#define SFML_RENDERWINDOW_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Window that can serve as a target for 2D drawing +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API RenderWindow : public Window, public RenderTarget +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor doesn't actually create the window, + /// use the other constructors or call create() to do so. + /// + //////////////////////////////////////////////////////////// + RenderWindow(); + + //////////////////////////////////////////////////////////// + /// \brief Construct a new window + /// + /// This constructor creates the window with the size and pixel + /// depth defined in \a mode. An optional style can be passed to + /// customize the look and behavior of the window (borders, + /// title bar, resizable, closable, ...). + /// + /// The fourth parameter is an optional structure specifying + /// advanced OpenGL context settings such as antialiasing, + /// depth-buffer bits, etc. You shouldn't care about these + /// parameters for a regular usage of the graphics module. + /// + /// \param mode Video mode to use (defines the width, height and depth of the rendering area of the window) + /// \param title Title of the window + /// \param style %Window style, a bitwise OR combination of sf::Style enumerators + /// \param settings Additional settings for the underlying OpenGL context + /// + //////////////////////////////////////////////////////////// + RenderWindow(VideoMode mode, const String& title, Uint32 style = Style::Default, const ContextSettings& settings = ContextSettings()); + + //////////////////////////////////////////////////////////// + /// \brief Construct the window from an existing control + /// + /// Use this constructor if you want to create an SFML + /// rendering area into an already existing control. + /// + /// The second parameter is an optional structure specifying + /// advanced OpenGL context settings such as antialiasing, + /// depth-buffer bits, etc. You shouldn't care about these + /// parameters for a regular usage of the graphics module. + /// + /// \param handle Platform-specific handle of the control (\a HWND on + /// Windows, \a %Window on Linux/FreeBSD, \a NSWindow on OS X) + /// \param settings Additional settings for the underlying OpenGL context + /// + //////////////////////////////////////////////////////////// + explicit RenderWindow(WindowHandle handle, const ContextSettings& settings = ContextSettings()); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + /// Closes the window and frees all the resources attached to it. + /// + //////////////////////////////////////////////////////////// + virtual ~RenderWindow(); + + //////////////////////////////////////////////////////////// + /// \brief Get the size of the rendering region of the window + /// + /// The size doesn't include the titlebar and borders + /// of the window. + /// + /// \return Size in pixels + /// + //////////////////////////////////////////////////////////// + virtual Vector2u getSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Copy the current contents of the window to an image + /// + /// \deprecated + /// Use a sf::Texture and its sf::Texture::update(const Window&) + /// function and copy its contents into an sf::Image instead. + /// \code + /// sf::Vector2u windowSize = window.getSize(); + /// sf::Texture texture; + /// texture.create(windowSize.x, windowSize.y); + /// texture.update(window); + /// sf::Image screenshot = texture.copyToImage(); + /// \endcode + /// + /// This is a slow operation, whose main purpose is to make + /// screenshots of the application. If you want to update an + /// image with the contents of the window and then use it for + /// drawing, you should rather use a sf::Texture and its + /// update(Window&) function. + /// You can also draw things directly to a texture with the + /// sf::RenderTexture class. + /// + /// \return Image containing the captured contents + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED Image capture() const; + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Function called after the window has been created + /// + /// This function is called so that derived classes can + /// perform their own specific initialization as soon as + /// the window is created. + /// + //////////////////////////////////////////////////////////// + virtual void onCreate(); + + //////////////////////////////////////////////////////////// + /// \brief Function called after the window has been resized + /// + /// This function is called so that derived classes can + /// perform custom actions when the size of the window changes. + /// + //////////////////////////////////////////////////////////// + virtual void onResize(); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Activate the target for rendering + /// + /// \param active True to make the target active, false to deactivate it + /// + /// \return True if the function succeeded + /// + //////////////////////////////////////////////////////////// + virtual bool activate(bool active); +}; + +} // namespace sf + + +#endif // SFML_RENDERWINDOW_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::RenderWindow +/// \ingroup graphics +/// +/// sf::RenderWindow is the main class of the Graphics module. +/// It defines an OS window that can be painted using the other +/// classes of the graphics module. +/// +/// sf::RenderWindow is derived from sf::Window, thus it inherits +/// all its features: events, window management, OpenGL rendering, +/// etc. See the documentation of sf::Window for a more complete +/// description of all these features, as well as code examples. +/// +/// On top of that, sf::RenderWindow adds more features related to +/// 2D drawing with the graphics module (see its base class +/// sf::RenderTarget for more details). +/// Here is a typical rendering and event loop with a sf::RenderWindow: +/// +/// \code +/// // Declare and create a new render-window +/// sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window"); +/// +/// // Limit the framerate to 60 frames per second (this step is optional) +/// window.setFramerateLimit(60); +/// +/// // The main loop - ends as soon as the window is closed +/// while (window.isOpen()) +/// { +/// // Event processing +/// sf::Event event; +/// while (window.pollEvent(event)) +/// { +/// // Request for closing the window +/// if (event.type == sf::Event::Closed) +/// window.close(); +/// } +/// +/// // Clear the whole window before rendering a new frame +/// window.clear(); +/// +/// // Draw some graphical entities +/// window.draw(sprite); +/// window.draw(circle); +/// window.draw(text); +/// +/// // End the current frame and display its contents on screen +/// window.display(); +/// } +/// \endcode +/// +/// Like sf::Window, sf::RenderWindow is still able to render direct +/// OpenGL stuff. It is even possible to mix together OpenGL calls +/// and regular SFML drawing commands. +/// +/// \code +/// // Create the render window +/// sf::RenderWindow window(sf::VideoMode(800, 600), "SFML OpenGL"); +/// +/// // Create a sprite and a text to display +/// sf::Sprite sprite; +/// sf::Text text; +/// ... +/// +/// // Perform OpenGL initializations +/// glMatrixMode(GL_PROJECTION); +/// ... +/// +/// // Start the rendering loop +/// while (window.isOpen()) +/// { +/// // Process events +/// ... +/// +/// // Draw a background sprite +/// window.pushGLStates(); +/// window.draw(sprite); +/// window.popGLStates(); +/// +/// // Draw a 3D object using OpenGL +/// glBegin(GL_QUADS); +/// glVertex3f(...); +/// ... +/// glEnd(); +/// +/// // Draw text on top of the 3D object +/// window.pushGLStates(); +/// window.draw(text); +/// window.popGLStates(); +/// +/// // Finally, display the rendered frame on screen +/// window.display(); +/// } +/// \endcode +/// +/// \see sf::Window, sf::RenderTarget, sf::RenderTexture, sf::View +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Shader.hpp b/SFML-2.4.2/include/SFML/Graphics/Shader.hpp new file mode 100644 index 0000000..9fe9c60 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Shader.hpp @@ -0,0 +1,875 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SHADER_HPP +#define SFML_SHADER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +class Color; +class InputStream; +class Texture; +class Transform; + +//////////////////////////////////////////////////////////// +/// \brief Shader class (vertex, geometry and fragment) +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Shader : GlResource, NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Types of shaders + /// + //////////////////////////////////////////////////////////// + enum Type + { + Vertex, ///< %Vertex shader + Geometry, ///< Geometry shader + Fragment ///< Fragment (pixel) shader + }; + + //////////////////////////////////////////////////////////// + /// \brief Special type that can be passed to setUniform(), + /// and that represents the texture of the object being drawn + /// + /// \see setUniform(const std::string&, CurrentTextureType) + /// + //////////////////////////////////////////////////////////// + struct CurrentTextureType {}; + + //////////////////////////////////////////////////////////// + /// \brief Represents the texture of the object being drawn + /// + /// \see setUniform(const std::string&, CurrentTextureType) + /// + //////////////////////////////////////////////////////////// + static CurrentTextureType CurrentTexture; + +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor creates an invalid shader. + /// + //////////////////////////////////////////////////////////// + Shader(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~Shader(); + + //////////////////////////////////////////////////////////// + /// \brief Load the vertex, geometry or fragment shader from a file + /// + /// This function loads a single shader, vertex, geometry or + /// fragment, identified by the second argument. + /// The source must be a text file containing a valid + /// shader in GLSL language. GLSL is a C-like language + /// dedicated to OpenGL shaders; you'll probably need to + /// read a good documentation for it before writing your + /// own shaders. + /// + /// \param filename Path of the vertex, geometry or fragment shader file to load + /// \param type Type of shader (vertex, geometry or fragment) + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromMemory, loadFromStream + /// + //////////////////////////////////////////////////////////// + bool loadFromFile(const std::string& filename, Type type); + + //////////////////////////////////////////////////////////// + /// \brief Load both the vertex and fragment shaders from files + /// + /// This function loads both the vertex and the fragment + /// shaders. If one of them fails to load, the shader is left + /// empty (the valid shader is unloaded). + /// The sources must be text files containing valid shaders + /// in GLSL language. GLSL is a C-like language dedicated to + /// OpenGL shaders; you'll probably need to read a good documentation + /// for it before writing your own shaders. + /// + /// \param vertexShaderFilename Path of the vertex shader file to load + /// \param fragmentShaderFilename Path of the fragment shader file to load + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromMemory, loadFromStream + /// + //////////////////////////////////////////////////////////// + bool loadFromFile(const std::string& vertexShaderFilename, const std::string& fragmentShaderFilename); + + //////////////////////////////////////////////////////////// + /// \brief Load the vertex, geometry and fragment shaders from files + /// + /// This function loads the vertex, geometry and fragment + /// shaders. If one of them fails to load, the shader is left + /// empty (the valid shader is unloaded). + /// The sources must be text files containing valid shaders + /// in GLSL language. GLSL is a C-like language dedicated to + /// OpenGL shaders; you'll probably need to read a good documentation + /// for it before writing your own shaders. + /// + /// \param vertexShaderFilename Path of the vertex shader file to load + /// \param geometryShaderFilename Path of the geometry shader file to load + /// \param fragmentShaderFilename Path of the fragment shader file to load + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromMemory, loadFromStream + /// + //////////////////////////////////////////////////////////// + bool loadFromFile(const std::string& vertexShaderFilename, const std::string& geometryShaderFilename, const std::string& fragmentShaderFilename); + + //////////////////////////////////////////////////////////// + /// \brief Load the vertex, geometry or fragment shader from a source code in memory + /// + /// This function loads a single shader, vertex, geometry + /// or fragment, identified by the second argument. + /// The source code must be a valid shader in GLSL language. + /// GLSL is a C-like language dedicated to OpenGL shaders; + /// you'll probably need to read a good documentation for + /// it before writing your own shaders. + /// + /// \param shader String containing the source code of the shader + /// \param type Type of shader (vertex, geometry or fragment) + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromStream + /// + //////////////////////////////////////////////////////////// + bool loadFromMemory(const std::string& shader, Type type); + + //////////////////////////////////////////////////////////// + /// \brief Load both the vertex and fragment shaders from source codes in memory + /// + /// This function loads both the vertex and the fragment + /// shaders. If one of them fails to load, the shader is left + /// empty (the valid shader is unloaded). + /// The sources must be valid shaders in GLSL language. GLSL is + /// a C-like language dedicated to OpenGL shaders; you'll + /// probably need to read a good documentation for it before + /// writing your own shaders. + /// + /// \param vertexShader String containing the source code of the vertex shader + /// \param fragmentShader String containing the source code of the fragment shader + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromStream + /// + //////////////////////////////////////////////////////////// + bool loadFromMemory(const std::string& vertexShader, const std::string& fragmentShader); + + //////////////////////////////////////////////////////////// + /// \brief Load the vertex, geometry and fragment shaders from source codes in memory + /// + /// This function loads the vertex, geometry and fragment + /// shaders. If one of them fails to load, the shader is left + /// empty (the valid shader is unloaded). + /// The sources must be valid shaders in GLSL language. GLSL is + /// a C-like language dedicated to OpenGL shaders; you'll + /// probably need to read a good documentation for it before + /// writing your own shaders. + /// + /// \param vertexShader String containing the source code of the vertex shader + /// \param geometryShader String containing the source code of the geometry shader + /// \param fragmentShader String containing the source code of the fragment shader + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromStream + /// + //////////////////////////////////////////////////////////// + bool loadFromMemory(const std::string& vertexShader, const std::string& geometryShader, const std::string& fragmentShader); + + //////////////////////////////////////////////////////////// + /// \brief Load the vertex, geometry or fragment shader from a custom stream + /// + /// This function loads a single shader, vertex, geometry + /// or fragment, identified by the second argument. + /// The source code must be a valid shader in GLSL language. + /// GLSL is a C-like language dedicated to OpenGL shaders; + /// you'll probably need to read a good documentation for it + /// before writing your own shaders. + /// + /// \param stream Source stream to read from + /// \param type Type of shader (vertex, geometry or fragment) + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromMemory + /// + //////////////////////////////////////////////////////////// + bool loadFromStream(InputStream& stream, Type type); + + //////////////////////////////////////////////////////////// + /// \brief Load both the vertex and fragment shaders from custom streams + /// + /// This function loads both the vertex and the fragment + /// shaders. If one of them fails to load, the shader is left + /// empty (the valid shader is unloaded). + /// The source codes must be valid shaders in GLSL language. + /// GLSL is a C-like language dedicated to OpenGL shaders; + /// you'll probably need to read a good documentation for + /// it before writing your own shaders. + /// + /// \param vertexShaderStream Source stream to read the vertex shader from + /// \param fragmentShaderStream Source stream to read the fragment shader from + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromMemory + /// + //////////////////////////////////////////////////////////// + bool loadFromStream(InputStream& vertexShaderStream, InputStream& fragmentShaderStream); + + //////////////////////////////////////////////////////////// + /// \brief Load the vertex, geometry and fragment shaders from custom streams + /// + /// This function loads the vertex, geometry and fragment + /// shaders. If one of them fails to load, the shader is left + /// empty (the valid shader is unloaded). + /// The source codes must be valid shaders in GLSL language. + /// GLSL is a C-like language dedicated to OpenGL shaders; + /// you'll probably need to read a good documentation for + /// it before writing your own shaders. + /// + /// \param vertexShaderStream Source stream to read the vertex shader from + /// \param geometryShaderStream Source stream to read the geometry shader from + /// \param fragmentShaderStream Source stream to read the fragment shader from + /// + /// \return True if loading succeeded, false if it failed + /// + /// \see loadFromFile, loadFromMemory + /// + //////////////////////////////////////////////////////////// + bool loadFromStream(InputStream& vertexShaderStream, InputStream& geometryShaderStream, InputStream& fragmentShaderStream); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p float uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param x Value of the float scalar + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, float x); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p vec2 uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vector Value of the vec2 vector + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Vec2& vector); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p vec3 uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vector Value of the vec3 vector + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Vec3& vector); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p vec4 uniform + /// + /// This overload can also be called with sf::Color objects + /// that are converted to sf::Glsl::Vec4. + /// + /// It is important to note that the components of the color are + /// normalized before being passed to the shader. Therefore, + /// they are converted from range [0 .. 255] to range [0 .. 1]. + /// For example, a sf::Color(255, 127, 0, 255) will be transformed + /// to a vec4(1.0, 0.5, 0.0, 1.0) in the shader. + /// + /// \param name Name of the uniform variable in GLSL + /// \param vector Value of the vec4 vector + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Vec4& vector); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p int uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param x Value of the int scalar + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, int x); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p ivec2 uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vector Value of the ivec2 vector + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Ivec2& vector); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p ivec3 uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vector Value of the ivec3 vector + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Ivec3& vector); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p ivec4 uniform + /// + /// This overload can also be called with sf::Color objects + /// that are converted to sf::Glsl::Ivec4. + /// + /// If color conversions are used, the ivec4 uniform in GLSL + /// will hold the same values as the original sf::Color + /// instance. For example, sf::Color(255, 127, 0, 255) is + /// mapped to ivec4(255, 127, 0, 255). + /// + /// \param name Name of the uniform variable in GLSL + /// \param vector Value of the ivec4 vector + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Ivec4& vector); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p bool uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param x Value of the bool scalar + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, bool x); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p bvec2 uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vector Value of the bvec2 vector + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Bvec2& vector); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p bvec3 uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vector Value of the bvec3 vector + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Bvec3& vector); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p bvec4 uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vector Value of the bvec4 vector + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Bvec4& vector); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p mat3 matrix + /// + /// \param name Name of the uniform variable in GLSL + /// \param matrix Value of the mat3 matrix + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Mat3& matrix); + + //////////////////////////////////////////////////////////// + /// \brief Specify value for \p mat4 matrix + /// + /// \param name Name of the uniform variable in GLSL + /// \param matrix Value of the mat4 matrix + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Glsl::Mat4& matrix); + + //////////////////////////////////////////////////////////// + /// \brief Specify a texture as \p sampler2D uniform + /// + /// \a name is the name of the variable to change in the shader. + /// The corresponding parameter in the shader must be a 2D texture + /// (\p sampler2D GLSL type). + /// + /// Example: + /// \code + /// uniform sampler2D the_texture; // this is the variable in the shader + /// \endcode + /// \code + /// sf::Texture texture; + /// ... + /// shader.setUniform("the_texture", texture); + /// \endcode + /// It is important to note that \a texture must remain alive as long + /// as the shader uses it, no copy is made internally. + /// + /// To use the texture of the object being drawn, which cannot be + /// known in advance, you can pass the special value + /// sf::Shader::CurrentTexture: + /// \code + /// shader.setUniform("the_texture", sf::Shader::CurrentTexture). + /// \endcode + /// + /// \param name Name of the texture in the shader + /// \param texture Texture to assign + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, const Texture& texture); + + //////////////////////////////////////////////////////////// + /// \brief Specify current texture as \p sampler2D uniform + /// + /// This overload maps a shader texture variable to the + /// texture of the object being drawn, which cannot be + /// known in advance. The second argument must be + /// sf::Shader::CurrentTexture. + /// The corresponding parameter in the shader must be a 2D texture + /// (\p sampler2D GLSL type). + /// + /// Example: + /// \code + /// uniform sampler2D current; // this is the variable in the shader + /// \endcode + /// \code + /// shader.setUniform("current", sf::Shader::CurrentTexture); + /// \endcode + /// + /// \param name Name of the texture in the shader + /// + //////////////////////////////////////////////////////////// + void setUniform(const std::string& name, CurrentTextureType); + + //////////////////////////////////////////////////////////// + /// \brief Specify values for \p float[] array uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param scalarArray pointer to array of \p float values + /// \param length Number of elements in the array + /// + //////////////////////////////////////////////////////////// + void setUniformArray(const std::string& name, const float* scalarArray, std::size_t length); + + //////////////////////////////////////////////////////////// + /// \brief Specify values for \p vec2[] array uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vectorArray pointer to array of \p vec2 values + /// \param length Number of elements in the array + /// + //////////////////////////////////////////////////////////// + void setUniformArray(const std::string& name, const Glsl::Vec2* vectorArray, std::size_t length); + + //////////////////////////////////////////////////////////// + /// \brief Specify values for \p vec3[] array uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vectorArray pointer to array of \p vec3 values + /// \param length Number of elements in the array + /// + //////////////////////////////////////////////////////////// + void setUniformArray(const std::string& name, const Glsl::Vec3* vectorArray, std::size_t length); + + //////////////////////////////////////////////////////////// + /// \brief Specify values for \p vec4[] array uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param vectorArray pointer to array of \p vec4 values + /// \param length Number of elements in the array + /// + //////////////////////////////////////////////////////////// + void setUniformArray(const std::string& name, const Glsl::Vec4* vectorArray, std::size_t length); + + //////////////////////////////////////////////////////////// + /// \brief Specify values for \p mat3[] array uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param matrixArray pointer to array of \p mat3 values + /// \param length Number of elements in the array + /// + //////////////////////////////////////////////////////////// + void setUniformArray(const std::string& name, const Glsl::Mat3* matrixArray, std::size_t length); + + //////////////////////////////////////////////////////////// + /// \brief Specify values for \p mat4[] array uniform + /// + /// \param name Name of the uniform variable in GLSL + /// \param matrixArray pointer to array of \p mat4 values + /// \param length Number of elements in the array + /// + //////////////////////////////////////////////////////////// + void setUniformArray(const std::string& name, const Glsl::Mat4* matrixArray, std::size_t length); + + //////////////////////////////////////////////////////////// + /// \brief Change a float parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, float) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, float x); + + //////////////////////////////////////////////////////////// + /// \brief Change a 2-components vector parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, const Glsl::Vec2&) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, float x, float y); + + //////////////////////////////////////////////////////////// + /// \brief Change a 3-components vector parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, const Glsl::Vec3&) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, float x, float y, float z); + + //////////////////////////////////////////////////////////// + /// \brief Change a 4-components vector parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, const Glsl::Vec4&) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, float x, float y, float z, float w); + + //////////////////////////////////////////////////////////// + /// \brief Change a 2-components vector parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, const Glsl::Vec2&) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, const Vector2f& vector); + + //////////////////////////////////////////////////////////// + /// \brief Change a 3-components vector parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, const Glsl::Vec3&) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, const Vector3f& vector); + + //////////////////////////////////////////////////////////// + /// \brief Change a color parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, const Glsl::Vec4&) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, const Color& color); + + //////////////////////////////////////////////////////////// + /// \brief Change a matrix parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, const Glsl::Mat4&) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, const Transform& transform); + + //////////////////////////////////////////////////////////// + /// \brief Change a texture parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, const Texture&) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, const Texture& texture); + + //////////////////////////////////////////////////////////// + /// \brief Change a texture parameter of the shader + /// + /// \deprecated Use setUniform(const std::string&, CurrentTextureType) instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setParameter(const std::string& name, CurrentTextureType); + + //////////////////////////////////////////////////////////// + /// \brief Get the underlying OpenGL handle of the shader. + /// + /// You shouldn't need to use this function, unless you have + /// very specific stuff to implement that SFML doesn't support, + /// or implement a temporary workaround until a bug is fixed. + /// + /// \return OpenGL handle of the shader or 0 if not yet loaded + /// + //////////////////////////////////////////////////////////// + unsigned int getNativeHandle() const; + + //////////////////////////////////////////////////////////// + /// \brief Bind a shader for rendering + /// + /// This function is not part of the graphics API, it mustn't be + /// used when drawing SFML entities. It must be used only if you + /// mix sf::Shader with OpenGL code. + /// + /// \code + /// sf::Shader s1, s2; + /// ... + /// sf::Shader::bind(&s1); + /// // draw OpenGL stuff that use s1... + /// sf::Shader::bind(&s2); + /// // draw OpenGL stuff that use s2... + /// sf::Shader::bind(NULL); + /// // draw OpenGL stuff that use no shader... + /// \endcode + /// + /// \param shader Shader to bind, can be null to use no shader + /// + //////////////////////////////////////////////////////////// + static void bind(const Shader* shader); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether or not the system supports shaders + /// + /// This function should always be called before using + /// the shader features. If it returns false, then + /// any attempt to use sf::Shader will fail. + /// + /// \return True if shaders are supported, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isAvailable(); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether or not the system supports geometry shaders + /// + /// This function should always be called before using + /// the geometry shader features. If it returns false, then + /// any attempt to use sf::Shader geometry shader features will fail. + /// + /// This function can only return true if isAvailable() would also + /// return true, since shaders in general have to be supported in + /// order for geometry shaders to be supported as well. + /// + /// Note: The first call to this function, whether by your + /// code or SFML will result in a context switch. + /// + /// \return True if geometry shaders are supported, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isGeometryAvailable(); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Compile the shader(s) and create the program + /// + /// If one of the arguments is NULL, the corresponding shader + /// is not created. + /// + /// \param vertexShaderCode Source code of the vertex shader + /// \param geometryShaderCode Source code of the geometry shader + /// \param fragmentShaderCode Source code of the fragment shader + /// + /// \return True on success, false if any error happened + /// + //////////////////////////////////////////////////////////// + bool compile(const char* vertexShaderCode, const char* geometryShaderCode, const char* fragmentShaderCode); + + //////////////////////////////////////////////////////////// + /// \brief Bind all the textures used by the shader + /// + /// This function each texture to a different unit, and + /// updates the corresponding variables in the shader accordingly. + /// + //////////////////////////////////////////////////////////// + void bindTextures() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the location ID of a shader uniform + /// + /// \param name Name of the uniform variable to search + /// + /// \return Location ID of the uniform, or -1 if not found + /// + //////////////////////////////////////////////////////////// + int getUniformLocation(const std::string& name); + + //////////////////////////////////////////////////////////// + /// \brief RAII object to save and restore the program + /// binding while uniforms are being set + /// + /// Implementation is private in the .cpp file. + /// + //////////////////////////////////////////////////////////// + struct UniformBinder; + + //////////////////////////////////////////////////////////// + // Types + //////////////////////////////////////////////////////////// + typedef std::map TextureTable; + typedef std::map UniformTable; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + unsigned int m_shaderProgram; ///< OpenGL identifier for the program + int m_currentTexture; ///< Location of the current texture in the shader + TextureTable m_textures; ///< Texture variables in the shader, mapped to their location + UniformTable m_uniforms; ///< Parameters location cache +}; + +} // namespace sf + + +#endif // SFML_SHADER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Shader +/// \ingroup graphics +/// +/// Shaders are programs written using a specific language, +/// executed directly by the graphics card and allowing +/// to apply real-time operations to the rendered entities. +/// +/// There are three kinds of shaders: +/// \li %Vertex shaders, that process vertices +/// \li Geometry shaders, that process primitives +/// \li Fragment (pixel) shaders, that process pixels +/// +/// A sf::Shader can be composed of either a vertex shader +/// alone, a geometry shader alone, a fragment shader alone, +/// or any combination of them. (see the variants of the +/// load functions). +/// +/// Shaders are written in GLSL, which is a C-like +/// language dedicated to OpenGL shaders. You'll probably +/// need to learn its basics before writing your own shaders +/// for SFML. +/// +/// Like any C/C++ program, a GLSL shader has its own variables +/// called \a uniforms that you can set from your C++ application. +/// sf::Shader handles different types of uniforms: +/// \li scalars: \p float, \p int, \p bool +/// \li vectors (2, 3 or 4 components) +/// \li matrices (3x3 or 4x4) +/// \li samplers (textures) +/// +/// Some SFML-specific types can be converted: +/// \li sf::Color as a 4D vector (\p vec4) +/// \li sf::Transform as matrices (\p mat3 or \p mat4) +/// +/// Every uniform variable in a shader can be set through one of the +/// setUniform() or setUniformArray() overloads. For example, if you +/// have a shader with the following uniforms: +/// \code +/// uniform float offset; +/// uniform vec3 point; +/// uniform vec4 color; +/// uniform mat4 matrix; +/// uniform sampler2D overlay; +/// uniform sampler2D current; +/// \endcode +/// You can set their values from C++ code as follows, using the types +/// defined in the sf::Glsl namespace: +/// \code +/// shader.setUniform("offset", 2.f); +/// shader.setUniform("point", sf::Vector3f(0.5f, 0.8f, 0.3f)); +/// shader.setUniform("color", sf::Glsl::Vec4(color)); // color is a sf::Color +/// shader.setUniform("matrix", sf::Glsl::Mat4(transform)); // transform is a sf::Transform +/// shader.setUniform("overlay", texture); // texture is a sf::Texture +/// shader.setUniform("current", sf::Shader::CurrentTexture); +/// \endcode +/// +/// The old setParameter() overloads are deprecated and will be removed in a +/// future version. You should use their setUniform() equivalents instead. +/// +/// The special Shader::CurrentTexture argument maps the +/// given \p sampler2D uniform to the current texture of the +/// object being drawn (which cannot be known in advance). +/// +/// To apply a shader to a drawable, you must pass it as an +/// additional parameter to the \ref Window::draw() draw() function: +/// \code +/// window.draw(sprite, &shader); +/// \endcode +/// +/// ... which is in fact just a shortcut for this: +/// \code +/// sf::RenderStates states; +/// states.shader = &shader; +/// window.draw(sprite, states); +/// \endcode +/// +/// In the code above we pass a pointer to the shader, because it may +/// be null (which means "no shader"). +/// +/// Shaders can be used on any drawable, but some combinations are +/// not interesting. For example, using a vertex shader on a sf::Sprite +/// is limited because there are only 4 vertices, the sprite would +/// have to be subdivided in order to apply wave effects. +/// Another bad example is a fragment shader with sf::Text: the texture +/// of the text is not the actual text that you see on screen, it is +/// a big texture containing all the characters of the font in an +/// arbitrary order; thus, texture lookups on pixels other than the +/// current one may not give you the expected result. +/// +/// Shaders can also be used to apply global post-effects to the +/// current contents of the target (like the old sf::PostFx class +/// in SFML 1). This can be done in two different ways: +/// \li draw everything to a sf::RenderTexture, then draw it to +/// the main target using the shader +/// \li draw everything directly to the main target, then use +/// sf::Texture::update(Window&) to copy its contents to a texture +/// and draw it to the main target using the shader +/// +/// The first technique is more optimized because it doesn't involve +/// retrieving the target's pixels to system memory, but the +/// second one doesn't impact the rendering process and can be +/// easily inserted anywhere without impacting all the code. +/// +/// Like sf::Texture that can be used as a raw OpenGL texture, +/// sf::Shader can also be used directly as a raw shader for +/// custom OpenGL geometry. +/// \code +/// sf::Shader::bind(&shader); +/// ... render OpenGL geometry ... +/// sf::Shader::bind(NULL); +/// \endcode +/// +/// \see sf::Glsl +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Shape.hpp b/SFML-2.4.2/include/SFML/Graphics/Shape.hpp new file mode 100644 index 0000000..b257ddc --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Shape.hpp @@ -0,0 +1,355 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SHAPE_HPP +#define SFML_SHAPE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Base class for textured shapes with outline +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Shape : public Drawable, public Transformable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Virtual destructor + /// + //////////////////////////////////////////////////////////// + virtual ~Shape(); + + //////////////////////////////////////////////////////////// + /// \brief Change the source texture of the shape + /// + /// The \a texture argument refers to a texture that must + /// exist as long as the shape uses it. Indeed, the shape + /// doesn't store its own copy of the texture, but rather keeps + /// a pointer to the one that you passed to this function. + /// If the source texture is destroyed and the shape tries to + /// use it, the behavior is undefined. + /// \a texture can be NULL to disable texturing. + /// If \a resetRect is true, the TextureRect property of + /// the shape is automatically adjusted to the size of the new + /// texture. If it is false, the texture rect is left unchanged. + /// + /// \param texture New texture + /// \param resetRect Should the texture rect be reset to the size of the new texture? + /// + /// \see getTexture, setTextureRect + /// + //////////////////////////////////////////////////////////// + void setTexture(const Texture* texture, bool resetRect = false); + + //////////////////////////////////////////////////////////// + /// \brief Set the sub-rectangle of the texture that the shape will display + /// + /// The texture rect is useful when you don't want to display + /// the whole texture, but rather a part of it. + /// By default, the texture rect covers the entire texture. + /// + /// \param rect Rectangle defining the region of the texture to display + /// + /// \see getTextureRect, setTexture + /// + //////////////////////////////////////////////////////////// + void setTextureRect(const IntRect& rect); + + //////////////////////////////////////////////////////////// + /// \brief Set the fill color of the shape + /// + /// This color is modulated (multiplied) with the shape's + /// texture if any. It can be used to colorize the shape, + /// or change its global opacity. + /// You can use sf::Color::Transparent to make the inside of + /// the shape transparent, and have the outline alone. + /// By default, the shape's fill color is opaque white. + /// + /// \param color New color of the shape + /// + /// \see getFillColor, setOutlineColor + /// + //////////////////////////////////////////////////////////// + void setFillColor(const Color& color); + + //////////////////////////////////////////////////////////// + /// \brief Set the outline color of the shape + /// + /// By default, the shape's outline color is opaque white. + /// + /// \param color New outline color of the shape + /// + /// \see getOutlineColor, setFillColor + /// + //////////////////////////////////////////////////////////// + void setOutlineColor(const Color& color); + + //////////////////////////////////////////////////////////// + /// \brief Set the thickness of the shape's outline + /// + /// Note that negative values are allowed (so that the outline + /// expands towards the center of the shape), and using zero + /// disables the outline. + /// By default, the outline thickness is 0. + /// + /// \param thickness New outline thickness + /// + /// \see getOutlineThickness + /// + //////////////////////////////////////////////////////////// + void setOutlineThickness(float thickness); + + //////////////////////////////////////////////////////////// + /// \brief Get the source texture of the shape + /// + /// If the shape has no source texture, a NULL pointer is returned. + /// The returned pointer is const, which means that you can't + /// modify the texture when you retrieve it with this function. + /// + /// \return Pointer to the shape's texture + /// + /// \see setTexture + /// + //////////////////////////////////////////////////////////// + const Texture* getTexture() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the sub-rectangle of the texture displayed by the shape + /// + /// \return Texture rectangle of the shape + /// + /// \see setTextureRect + /// + //////////////////////////////////////////////////////////// + const IntRect& getTextureRect() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the fill color of the shape + /// + /// \return Fill color of the shape + /// + /// \see setFillColor + /// + //////////////////////////////////////////////////////////// + const Color& getFillColor() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the outline color of the shape + /// + /// \return Outline color of the shape + /// + /// \see setOutlineColor + /// + //////////////////////////////////////////////////////////// + const Color& getOutlineColor() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the outline thickness of the shape + /// + /// \return Outline thickness of the shape + /// + /// \see setOutlineThickness + /// + //////////////////////////////////////////////////////////// + float getOutlineThickness() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the total number of points of the shape + /// + /// \return Number of points of the shape + /// + /// \see getPoint + /// + //////////////////////////////////////////////////////////// + virtual std::size_t getPointCount() const = 0; + + //////////////////////////////////////////////////////////// + /// \brief Get a point of the shape + /// + /// The returned point is in local coordinates, that is, + /// the shape's transforms (position, rotation, scale) are + /// not taken into account. + /// The result is undefined if \a index is out of the valid range. + /// + /// \param index Index of the point to get, in range [0 .. getPointCount() - 1] + /// + /// \return index-th point of the shape + /// + /// \see getPointCount + /// + //////////////////////////////////////////////////////////// + virtual Vector2f getPoint(std::size_t index) const = 0; + + //////////////////////////////////////////////////////////// + /// \brief Get the local bounding rectangle of the entity + /// + /// The returned rectangle is in local coordinates, which means + /// that it ignores the transformations (translation, rotation, + /// scale, ...) that are applied to the entity. + /// In other words, this function returns the bounds of the + /// entity in the entity's coordinate system. + /// + /// \return Local bounding rectangle of the entity + /// + //////////////////////////////////////////////////////////// + FloatRect getLocalBounds() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the global (non-minimal) bounding rectangle of the entity + /// + /// The returned rectangle is in global coordinates, which means + /// that it takes into account the transformations (translation, + /// rotation, scale, ...) that are applied to the entity. + /// In other words, this function returns the bounds of the + /// shape in the global 2D world's coordinate system. + /// + /// This function does not necessarily return the \a minimal + /// bounding rectangle. It merely ensures that the returned + /// rectangle covers all the vertices (but possibly more). + /// This allows for a fast approximation of the bounds as a + /// first check; you may want to use more precise checks + /// on top of that. + /// + /// \return Global bounding rectangle of the entity + /// + //////////////////////////////////////////////////////////// + FloatRect getGlobalBounds() const; + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + Shape(); + + //////////////////////////////////////////////////////////// + /// \brief Recompute the internal geometry of the shape + /// + /// This function must be called by the derived class everytime + /// the shape's points change (i.e. the result of either + /// getPointCount or getPoint is different). + /// + //////////////////////////////////////////////////////////// + void update(); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Draw the shape to a render target + /// + /// \param target Render target to draw to + /// \param states Current render states + /// + //////////////////////////////////////////////////////////// + virtual void draw(RenderTarget& target, RenderStates states) const; + + //////////////////////////////////////////////////////////// + /// \brief Update the fill vertices' color + /// + //////////////////////////////////////////////////////////// + void updateFillColors(); + + //////////////////////////////////////////////////////////// + /// \brief Update the fill vertices' texture coordinates + /// + //////////////////////////////////////////////////////////// + void updateTexCoords(); + + //////////////////////////////////////////////////////////// + /// \brief Update the outline vertices' position + /// + //////////////////////////////////////////////////////////// + void updateOutline(); + + //////////////////////////////////////////////////////////// + /// \brief Update the outline vertices' color + /// + //////////////////////////////////////////////////////////// + void updateOutlineColors(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + const Texture* m_texture; ///< Texture of the shape + IntRect m_textureRect; ///< Rectangle defining the area of the source texture to display + Color m_fillColor; ///< Fill color + Color m_outlineColor; ///< Outline color + float m_outlineThickness; ///< Thickness of the shape's outline + VertexArray m_vertices; ///< Vertex array containing the fill geometry + VertexArray m_outlineVertices; ///< Vertex array containing the outline geometry + FloatRect m_insideBounds; ///< Bounding rectangle of the inside (fill) + FloatRect m_bounds; ///< Bounding rectangle of the whole shape (outline + fill) +}; + +} // namespace sf + + +#endif // SFML_SHAPE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Shape +/// \ingroup graphics +/// +/// sf::Shape is a drawable class that allows to define and +/// display a custom convex shape on a render target. +/// It's only an abstract base, it needs to be specialized for +/// concrete types of shapes (circle, rectangle, convex polygon, +/// star, ...). +/// +/// In addition to the attributes provided by the specialized +/// shape classes, a shape always has the following attributes: +/// \li a texture +/// \li a texture rectangle +/// \li a fill color +/// \li an outline color +/// \li an outline thickness +/// +/// Each feature is optional, and can be disabled easily: +/// \li the texture can be null +/// \li the fill/outline colors can be sf::Color::Transparent +/// \li the outline thickness can be zero +/// +/// You can write your own derived shape class, there are only +/// two virtual functions to override: +/// \li getPointCount must return the number of points of the shape +/// \li getPoint must return the points of the shape +/// +/// \see sf::RectangleShape, sf::CircleShape, sf::ConvexShape, sf::Transformable +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Sprite.hpp b/SFML-2.4.2/include/SFML/Graphics/Sprite.hpp new file mode 100644 index 0000000..51bba30 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Sprite.hpp @@ -0,0 +1,279 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SPRITE_HPP +#define SFML_SPRITE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + + +namespace sf +{ +class Texture; + +//////////////////////////////////////////////////////////// +/// \brief Drawable representation of a texture, with its +/// own transformations, color, etc. +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Sprite : public Drawable, public Transformable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates an empty sprite with no source texture. + /// + //////////////////////////////////////////////////////////// + Sprite(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the sprite from a source texture + /// + /// \param texture Source texture + /// + /// \see setTexture + /// + //////////////////////////////////////////////////////////// + explicit Sprite(const Texture& texture); + + //////////////////////////////////////////////////////////// + /// \brief Construct the sprite from a sub-rectangle of a source texture + /// + /// \param texture Source texture + /// \param rectangle Sub-rectangle of the texture to assign to the sprite + /// + /// \see setTexture, setTextureRect + /// + //////////////////////////////////////////////////////////// + Sprite(const Texture& texture, const IntRect& rectangle); + + //////////////////////////////////////////////////////////// + /// \brief Change the source texture of the sprite + /// + /// The \a texture argument refers to a texture that must + /// exist as long as the sprite uses it. Indeed, the sprite + /// doesn't store its own copy of the texture, but rather keeps + /// a pointer to the one that you passed to this function. + /// If the source texture is destroyed and the sprite tries to + /// use it, the behavior is undefined. + /// If \a resetRect is true, the TextureRect property of + /// the sprite is automatically adjusted to the size of the new + /// texture. If it is false, the texture rect is left unchanged. + /// + /// \param texture New texture + /// \param resetRect Should the texture rect be reset to the size of the new texture? + /// + /// \see getTexture, setTextureRect + /// + //////////////////////////////////////////////////////////// + void setTexture(const Texture& texture, bool resetRect = false); + + //////////////////////////////////////////////////////////// + /// \brief Set the sub-rectangle of the texture that the sprite will display + /// + /// The texture rect is useful when you don't want to display + /// the whole texture, but rather a part of it. + /// By default, the texture rect covers the entire texture. + /// + /// \param rectangle Rectangle defining the region of the texture to display + /// + /// \see getTextureRect, setTexture + /// + //////////////////////////////////////////////////////////// + void setTextureRect(const IntRect& rectangle); + + //////////////////////////////////////////////////////////// + /// \brief Set the global color of the sprite + /// + /// This color is modulated (multiplied) with the sprite's + /// texture. It can be used to colorize the sprite, or change + /// its global opacity. + /// By default, the sprite's color is opaque white. + /// + /// \param color New color of the sprite + /// + /// \see getColor + /// + //////////////////////////////////////////////////////////// + void setColor(const Color& color); + + //////////////////////////////////////////////////////////// + /// \brief Get the source texture of the sprite + /// + /// If the sprite has no source texture, a NULL pointer is returned. + /// The returned pointer is const, which means that you can't + /// modify the texture when you retrieve it with this function. + /// + /// \return Pointer to the sprite's texture + /// + /// \see setTexture + /// + //////////////////////////////////////////////////////////// + const Texture* getTexture() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the sub-rectangle of the texture displayed by the sprite + /// + /// \return Texture rectangle of the sprite + /// + /// \see setTextureRect + /// + //////////////////////////////////////////////////////////// + const IntRect& getTextureRect() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the global color of the sprite + /// + /// \return Global color of the sprite + /// + /// \see setColor + /// + //////////////////////////////////////////////////////////// + const Color& getColor() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the local bounding rectangle of the entity + /// + /// The returned rectangle is in local coordinates, which means + /// that it ignores the transformations (translation, rotation, + /// scale, ...) that are applied to the entity. + /// In other words, this function returns the bounds of the + /// entity in the entity's coordinate system. + /// + /// \return Local bounding rectangle of the entity + /// + //////////////////////////////////////////////////////////// + FloatRect getLocalBounds() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the global bounding rectangle of the entity + /// + /// The returned rectangle is in global coordinates, which means + /// that it takes into account the transformations (translation, + /// rotation, scale, ...) that are applied to the entity. + /// In other words, this function returns the bounds of the + /// sprite in the global 2D world's coordinate system. + /// + /// \return Global bounding rectangle of the entity + /// + //////////////////////////////////////////////////////////// + FloatRect getGlobalBounds() const; + +private: + + //////////////////////////////////////////////////////////// + /// \brief Draw the sprite to a render target + /// + /// \param target Render target to draw to + /// \param states Current render states + /// + //////////////////////////////////////////////////////////// + virtual void draw(RenderTarget& target, RenderStates states) const; + + //////////////////////////////////////////////////////////// + /// \brief Update the vertices' positions + /// + //////////////////////////////////////////////////////////// + void updatePositions(); + + //////////////////////////////////////////////////////////// + /// \brief Update the vertices' texture coordinates + /// + //////////////////////////////////////////////////////////// + void updateTexCoords(); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Vertex m_vertices[4]; ///< Vertices defining the sprite's geometry + const Texture* m_texture; ///< Texture of the sprite + IntRect m_textureRect; ///< Rectangle defining the area of the source texture to display +}; + +} // namespace sf + + +#endif // SFML_SPRITE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Sprite +/// \ingroup graphics +/// +/// sf::Sprite is a drawable class that allows to easily display +/// a texture (or a part of it) on a render target. +/// +/// It inherits all the functions from sf::Transformable: +/// position, rotation, scale, origin. It also adds sprite-specific +/// properties such as the texture to use, the part of it to display, +/// and some convenience functions to change the overall color of the +/// sprite, or to get its bounding rectangle. +/// +/// sf::Sprite works in combination with the sf::Texture class, which +/// loads and provides the pixel data of a given texture. +/// +/// The separation of sf::Sprite and sf::Texture allows more flexibility +/// and better performances: indeed a sf::Texture is a heavy resource, +/// and any operation on it is slow (often too slow for real-time +/// applications). On the other side, a sf::Sprite is a lightweight +/// object which can use the pixel data of a sf::Texture and draw +/// it with its own transformation/color/blending attributes. +/// +/// It is important to note that the sf::Sprite instance doesn't +/// copy the texture that it uses, it only keeps a reference to it. +/// Thus, a sf::Texture must not be destroyed while it is +/// used by a sf::Sprite (i.e. never write a function that +/// uses a local sf::Texture instance for creating a sprite). +/// +/// See also the note on coordinates and undistorted rendering in sf::Transformable. +/// +/// Usage example: +/// \code +/// // Declare and load a texture +/// sf::Texture texture; +/// texture.loadFromFile("texture.png"); +/// +/// // Create a sprite +/// sf::Sprite sprite; +/// sprite.setTexture(texture); +/// sprite.setTextureRect(sf::IntRect(10, 10, 50, 30)); +/// sprite.setColor(sf::Color(255, 255, 255, 200)); +/// sprite.setPosition(100, 25); +/// +/// // Draw it +/// window.draw(sprite); +/// \endcode +/// +/// \see sf::Texture, sf::Transformable +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Text.hpp b/SFML-2.4.2/include/SFML/Graphics/Text.hpp new file mode 100644 index 0000000..f3e389f --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Text.hpp @@ -0,0 +1,456 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_TEXT_HPP +#define SFML_TEXT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Graphical text that can be drawn to a render target +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Text : public Drawable, public Transformable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Enumeration of the string drawing styles + /// + //////////////////////////////////////////////////////////// + enum Style + { + Regular = 0, ///< Regular characters, no style + Bold = 1 << 0, ///< Bold characters + Italic = 1 << 1, ///< Italic characters + Underlined = 1 << 2, ///< Underlined characters + StrikeThrough = 1 << 3 ///< Strike through characters + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates an empty text. + /// + //////////////////////////////////////////////////////////// + Text(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the text from a string, font and size + /// + /// Note that if the used font is a bitmap font, it is not + /// scalable, thus not all requested sizes will be available + /// to use. This needs to be taken into consideration when + /// setting the character size. If you need to display text + /// of a certain size, make sure the corresponding bitmap + /// font that supports that size is used. + /// + /// \param string Text assigned to the string + /// \param font Font used to draw the string + /// \param characterSize Base size of characters, in pixels + /// + //////////////////////////////////////////////////////////// + Text(const String& string, const Font& font, unsigned int characterSize = 30); + + //////////////////////////////////////////////////////////// + /// \brief Set the text's string + /// + /// The \a string argument is a sf::String, which can + /// automatically be constructed from standard string types. + /// So, the following calls are all valid: + /// \code + /// text.setString("hello"); + /// text.setString(L"hello"); + /// text.setString(std::string("hello")); + /// text.setString(std::wstring(L"hello")); + /// \endcode + /// A text's string is empty by default. + /// + /// \param string New string + /// + /// \see getString + /// + //////////////////////////////////////////////////////////// + void setString(const String& string); + + //////////////////////////////////////////////////////////// + /// \brief Set the text's font + /// + /// The \a font argument refers to a font that must + /// exist as long as the text uses it. Indeed, the text + /// doesn't store its own copy of the font, but rather keeps + /// a pointer to the one that you passed to this function. + /// If the font is destroyed and the text tries to + /// use it, the behavior is undefined. + /// + /// \param font New font + /// + /// \see getFont + /// + //////////////////////////////////////////////////////////// + void setFont(const Font& font); + + //////////////////////////////////////////////////////////// + /// \brief Set the character size + /// + /// The default size is 30. + /// + /// Note that if the used font is a bitmap font, it is not + /// scalable, thus not all requested sizes will be available + /// to use. This needs to be taken into consideration when + /// setting the character size. If you need to display text + /// of a certain size, make sure the corresponding bitmap + /// font that supports that size is used. + /// + /// \param size New character size, in pixels + /// + /// \see getCharacterSize + /// + //////////////////////////////////////////////////////////// + void setCharacterSize(unsigned int size); + + //////////////////////////////////////////////////////////// + /// \brief Set the text's style + /// + /// You can pass a combination of one or more styles, for + /// example sf::Text::Bold | sf::Text::Italic. + /// The default style is sf::Text::Regular. + /// + /// \param style New style + /// + /// \see getStyle + /// + //////////////////////////////////////////////////////////// + void setStyle(Uint32 style); + + //////////////////////////////////////////////////////////// + /// \brief Set the fill color of the text + /// + /// By default, the text's fill color is opaque white. + /// Setting the fill color to a transparent color with an outline + /// will cause the outline to be displayed in the fill area of the text. + /// + /// \param color New fill color of the text + /// + /// \see getFillColor + /// + /// \deprecated There is now fill and outline colors instead + /// of a single global color. + /// Use setFillColor() or setOutlineColor() instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED void setColor(const Color& color); + + //////////////////////////////////////////////////////////// + /// \brief Set the fill color of the text + /// + /// By default, the text's fill color is opaque white. + /// Setting the fill color to a transparent color with an outline + /// will cause the outline to be displayed in the fill area of the text. + /// + /// \param color New fill color of the text + /// + /// \see getFillColor + /// + //////////////////////////////////////////////////////////// + void setFillColor(const Color& color); + + //////////////////////////////////////////////////////////// + /// \brief Set the outline color of the text + /// + /// By default, the text's outline color is opaque black. + /// + /// \param color New outline color of the text + /// + /// \see getOutlineColor + /// + //////////////////////////////////////////////////////////// + void setOutlineColor(const Color& color); + + //////////////////////////////////////////////////////////// + /// \brief Set the thickness of the text's outline + /// + /// By default, the outline thickness is 0. + /// + /// Be aware that using a negative value for the outline + /// thickness will cause distorted rendering. + /// + /// \param thickness New outline thickness, in pixels + /// + /// \see getOutlineThickness + /// + //////////////////////////////////////////////////////////// + void setOutlineThickness(float thickness); + + //////////////////////////////////////////////////////////// + /// \brief Get the text's string + /// + /// The returned string is a sf::String, which can automatically + /// be converted to standard string types. So, the following + /// lines of code are all valid: + /// \code + /// sf::String s1 = text.getString(); + /// std::string s2 = text.getString(); + /// std::wstring s3 = text.getString(); + /// \endcode + /// + /// \return Text's string + /// + /// \see setString + /// + //////////////////////////////////////////////////////////// + const String& getString() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the text's font + /// + /// If the text has no font attached, a NULL pointer is returned. + /// The returned pointer is const, which means that you + /// cannot modify the font when you get it from this function. + /// + /// \return Pointer to the text's font + /// + /// \see setFont + /// + //////////////////////////////////////////////////////////// + const Font* getFont() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the character size + /// + /// \return Size of the characters, in pixels + /// + /// \see setCharacterSize + /// + //////////////////////////////////////////////////////////// + unsigned int getCharacterSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the text's style + /// + /// \return Text's style + /// + /// \see setStyle + /// + //////////////////////////////////////////////////////////// + Uint32 getStyle() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the fill color of the text + /// + /// \return Fill color of the text + /// + /// \see setFillColor + /// + /// \deprecated There is now fill and outline colors instead + /// of a single global color. + /// Use getFillColor() or getOutlineColor() instead. + /// + //////////////////////////////////////////////////////////// + SFML_DEPRECATED const Color& getColor() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the fill color of the text + /// + /// \return Fill color of the text + /// + /// \see setFillColor + /// + //////////////////////////////////////////////////////////// + const Color& getFillColor() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the outline color of the text + /// + /// \return Outline color of the text + /// + /// \see setOutlineColor + /// + //////////////////////////////////////////////////////////// + const Color& getOutlineColor() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the outline thickness of the text + /// + /// \return Outline thickness of the text, in pixels + /// + /// \see setOutlineThickness + /// + //////////////////////////////////////////////////////////// + float getOutlineThickness() const; + + //////////////////////////////////////////////////////////// + /// \brief Return the position of the \a index-th character + /// + /// This function computes the visual position of a character + /// from its index in the string. The returned position is + /// in global coordinates (translation, rotation, scale and + /// origin are applied). + /// If \a index is out of range, the position of the end of + /// the string is returned. + /// + /// \param index Index of the character + /// + /// \return Position of the character + /// + //////////////////////////////////////////////////////////// + Vector2f findCharacterPos(std::size_t index) const; + + //////////////////////////////////////////////////////////// + /// \brief Get the local bounding rectangle of the entity + /// + /// The returned rectangle is in local coordinates, which means + /// that it ignores the transformations (translation, rotation, + /// scale, ...) that are applied to the entity. + /// In other words, this function returns the bounds of the + /// entity in the entity's coordinate system. + /// + /// \return Local bounding rectangle of the entity + /// + //////////////////////////////////////////////////////////// + FloatRect getLocalBounds() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the global bounding rectangle of the entity + /// + /// The returned rectangle is in global coordinates, which means + /// that it takes into account the transformations (translation, + /// rotation, scale, ...) that are applied to the entity. + /// In other words, this function returns the bounds of the + /// text in the global 2D world's coordinate system. + /// + /// \return Global bounding rectangle of the entity + /// + //////////////////////////////////////////////////////////// + FloatRect getGlobalBounds() const; + +private: + + //////////////////////////////////////////////////////////// + /// \brief Draw the text to a render target + /// + /// \param target Render target to draw to + /// \param states Current render states + /// + //////////////////////////////////////////////////////////// + virtual void draw(RenderTarget& target, RenderStates states) const; + + //////////////////////////////////////////////////////////// + /// \brief Make sure the text's geometry is updated + /// + /// All the attributes related to rendering are cached, such + /// that the geometry is only updated when necessary. + /// + //////////////////////////////////////////////////////////// + void ensureGeometryUpdate() const; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + String m_string; ///< String to display + const Font* m_font; ///< Font used to display the string + unsigned int m_characterSize; ///< Base size of characters, in pixels + Uint32 m_style; ///< Text style (see Style enum) + Color m_fillColor; ///< Text fill color + Color m_outlineColor; ///< Text outline color + float m_outlineThickness; ///< Thickness of the text's outline + mutable VertexArray m_vertices; ///< Vertex array containing the fill geometry + mutable VertexArray m_outlineVertices; ///< Vertex array containing the outline geometry + mutable FloatRect m_bounds; ///< Bounding rectangle of the text (in local coordinates) + mutable bool m_geometryNeedUpdate; ///< Does the geometry need to be recomputed? +}; + +} // namespace sf + + +#endif // SFML_TEXT_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Text +/// \ingroup graphics +/// +/// sf::Text is a drawable class that allows to easily display +/// some text with custom style and color on a render target. +/// +/// It inherits all the functions from sf::Transformable: +/// position, rotation, scale, origin. It also adds text-specific +/// properties such as the font to use, the character size, +/// the font style (bold, italic, underlined, strike through), the +/// global color and the text to display of course. +/// It also provides convenience functions to calculate the +/// graphical size of the text, or to get the global position +/// of a given character. +/// +/// sf::Text works in combination with the sf::Font class, which +/// loads and provides the glyphs (visual characters) of a given font. +/// +/// The separation of sf::Font and sf::Text allows more flexibility +/// and better performances: indeed a sf::Font is a heavy resource, +/// and any operation on it is slow (often too slow for real-time +/// applications). On the other side, a sf::Text is a lightweight +/// object which can combine the glyphs data and metrics of a sf::Font +/// to display any text on a render target. +/// +/// It is important to note that the sf::Text instance doesn't +/// copy the font that it uses, it only keeps a reference to it. +/// Thus, a sf::Font must not be destructed while it is +/// used by a sf::Text (i.e. never write a function that +/// uses a local sf::Font instance for creating a text). +/// +/// See also the note on coordinates and undistorted rendering in sf::Transformable. +/// +/// Usage example: +/// \code +/// // Declare and load a font +/// sf::Font font; +/// font.loadFromFile("arial.ttf"); +/// +/// // Create a text +/// sf::Text text("hello", font); +/// text.setCharacterSize(30); +/// text.setStyle(sf::Text::Bold); +/// text.setColor(sf::Color::Red); +/// +/// // Draw it +/// window.draw(text); +/// \endcode +/// +/// \see sf::Font, sf::Transformable +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Texture.hpp b/SFML-2.4.2/include/SFML/Graphics/Texture.hpp new file mode 100644 index 0000000..f88c582 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Texture.hpp @@ -0,0 +1,686 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_TEXTURE_HPP +#define SFML_TEXTURE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +class Window; +class RenderTarget; +class RenderTexture; +class InputStream; + +//////////////////////////////////////////////////////////// +/// \brief Image living on the graphics card that can be used for drawing +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Texture : GlResource +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Types of texture coordinates that can be used for rendering + /// + //////////////////////////////////////////////////////////// + enum CoordinateType + { + Normalized, ///< Texture coordinates in range [0 .. 1] + Pixels ///< Texture coordinates in range [0 .. size] + }; + +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates an empty texture. + /// + //////////////////////////////////////////////////////////// + Texture(); + + //////////////////////////////////////////////////////////// + /// \brief Copy constructor + /// + /// \param copy instance to copy + /// + //////////////////////////////////////////////////////////// + Texture(const Texture& copy); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~Texture(); + + //////////////////////////////////////////////////////////// + /// \brief Create the texture + /// + /// If this function fails, the texture is left unchanged. + /// + /// \param width Width of the texture + /// \param height Height of the texture + /// + /// \return True if creation was successful + /// + //////////////////////////////////////////////////////////// + bool create(unsigned int width, unsigned int height); + + //////////////////////////////////////////////////////////// + /// \brief Load the texture from a file on disk + /// + /// This function is a shortcut for the following code: + /// \code + /// sf::Image image; + /// image.loadFromFile(filename); + /// texture.loadFromImage(image, area); + /// \endcode + /// + /// The \a area argument can be used to load only a sub-rectangle + /// of the whole image. If you want the entire image then leave + /// the default value (which is an empty IntRect). + /// If the \a area rectangle crosses the bounds of the image, it + /// is adjusted to fit the image size. + /// + /// The maximum size for a texture depends on the graphics + /// driver and can be retrieved with the getMaximumSize function. + /// + /// If this function fails, the texture is left unchanged. + /// + /// \param filename Path of the image file to load + /// \param area Area of the image to load + /// + /// \return True if loading was successful + /// + /// \see loadFromMemory, loadFromStream, loadFromImage + /// + //////////////////////////////////////////////////////////// + bool loadFromFile(const std::string& filename, const IntRect& area = IntRect()); + + //////////////////////////////////////////////////////////// + /// \brief Load the texture from a file in memory + /// + /// This function is a shortcut for the following code: + /// \code + /// sf::Image image; + /// image.loadFromMemory(data, size); + /// texture.loadFromImage(image, area); + /// \endcode + /// + /// The \a area argument can be used to load only a sub-rectangle + /// of the whole image. If you want the entire image then leave + /// the default value (which is an empty IntRect). + /// If the \a area rectangle crosses the bounds of the image, it + /// is adjusted to fit the image size. + /// + /// The maximum size for a texture depends on the graphics + /// driver and can be retrieved with the getMaximumSize function. + /// + /// If this function fails, the texture is left unchanged. + /// + /// \param data Pointer to the file data in memory + /// \param size Size of the data to load, in bytes + /// \param area Area of the image to load + /// + /// \return True if loading was successful + /// + /// \see loadFromFile, loadFromStream, loadFromImage + /// + //////////////////////////////////////////////////////////// + bool loadFromMemory(const void* data, std::size_t size, const IntRect& area = IntRect()); + + //////////////////////////////////////////////////////////// + /// \brief Load the texture from a custom stream + /// + /// This function is a shortcut for the following code: + /// \code + /// sf::Image image; + /// image.loadFromStream(stream); + /// texture.loadFromImage(image, area); + /// \endcode + /// + /// The \a area argument can be used to load only a sub-rectangle + /// of the whole image. If you want the entire image then leave + /// the default value (which is an empty IntRect). + /// If the \a area rectangle crosses the bounds of the image, it + /// is adjusted to fit the image size. + /// + /// The maximum size for a texture depends on the graphics + /// driver and can be retrieved with the getMaximumSize function. + /// + /// If this function fails, the texture is left unchanged. + /// + /// \param stream Source stream to read from + /// \param area Area of the image to load + /// + /// \return True if loading was successful + /// + /// \see loadFromFile, loadFromMemory, loadFromImage + /// + //////////////////////////////////////////////////////////// + bool loadFromStream(InputStream& stream, const IntRect& area = IntRect()); + + //////////////////////////////////////////////////////////// + /// \brief Load the texture from an image + /// + /// The \a area argument can be used to load only a sub-rectangle + /// of the whole image. If you want the entire image then leave + /// the default value (which is an empty IntRect). + /// If the \a area rectangle crosses the bounds of the image, it + /// is adjusted to fit the image size. + /// + /// The maximum size for a texture depends on the graphics + /// driver and can be retrieved with the getMaximumSize function. + /// + /// If this function fails, the texture is left unchanged. + /// + /// \param image Image to load into the texture + /// \param area Area of the image to load + /// + /// \return True if loading was successful + /// + /// \see loadFromFile, loadFromMemory + /// + //////////////////////////////////////////////////////////// + bool loadFromImage(const Image& image, const IntRect& area = IntRect()); + + //////////////////////////////////////////////////////////// + /// \brief Return the size of the texture + /// + /// \return Size in pixels + /// + //////////////////////////////////////////////////////////// + Vector2u getSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Copy the texture pixels to an image + /// + /// This function performs a slow operation that downloads + /// the texture's pixels from the graphics card and copies + /// them to a new image, potentially applying transformations + /// to pixels if necessary (texture may be padded or flipped). + /// + /// \return Image containing the texture's pixels + /// + /// \see loadFromImage + /// + //////////////////////////////////////////////////////////// + Image copyToImage() const; + + //////////////////////////////////////////////////////////// + /// \brief Update the whole texture from an array of pixels + /// + /// The \a pixel array is assumed to have the same size as + /// the \a area rectangle, and to contain 32-bits RGBA pixels. + /// + /// No additional check is performed on the size of the pixel + /// array, passing invalid arguments will lead to an undefined + /// behavior. + /// + /// This function does nothing if \a pixels is null or if the + /// texture was not previously created. + /// + /// \param pixels Array of pixels to copy to the texture + /// + //////////////////////////////////////////////////////////// + void update(const Uint8* pixels); + + //////////////////////////////////////////////////////////// + /// \brief Update a part of the texture from an array of pixels + /// + /// The size of the \a pixel array must match the \a width and + /// \a height arguments, and it must contain 32-bits RGBA pixels. + /// + /// No additional check is performed on the size of the pixel + /// array or the bounds of the area to update, passing invalid + /// arguments will lead to an undefined behavior. + /// + /// This function does nothing if \a pixels is null or if the + /// texture was not previously created. + /// + /// \param pixels Array of pixels to copy to the texture + /// \param width Width of the pixel region contained in \a pixels + /// \param height Height of the pixel region contained in \a pixels + /// \param x X offset in the texture where to copy the source pixels + /// \param y Y offset in the texture where to copy the source pixels + /// + //////////////////////////////////////////////////////////// + void update(const Uint8* pixels, unsigned int width, unsigned int height, unsigned int x, unsigned int y); + + //////////////////////////////////////////////////////////// + /// \brief Update the texture from an image + /// + /// Although the source image can be smaller than the texture, + /// this function is usually used for updating the whole texture. + /// The other overload, which has (x, y) additional arguments, + /// is more convenient for updating a sub-area of the texture. + /// + /// No additional check is performed on the size of the image, + /// passing an image bigger than the texture will lead to an + /// undefined behavior. + /// + /// This function does nothing if the texture was not + /// previously created. + /// + /// \param image Image to copy to the texture + /// + //////////////////////////////////////////////////////////// + void update(const Image& image); + + //////////////////////////////////////////////////////////// + /// \brief Update a part of the texture from an image + /// + /// No additional check is performed on the size of the image, + /// passing an invalid combination of image size and offset + /// will lead to an undefined behavior. + /// + /// This function does nothing if the texture was not + /// previously created. + /// + /// \param image Image to copy to the texture + /// \param x X offset in the texture where to copy the source image + /// \param y Y offset in the texture where to copy the source image + /// + //////////////////////////////////////////////////////////// + void update(const Image& image, unsigned int x, unsigned int y); + + //////////////////////////////////////////////////////////// + /// \brief Update the texture from the contents of a window + /// + /// Although the source window can be smaller than the texture, + /// this function is usually used for updating the whole texture. + /// The other overload, which has (x, y) additional arguments, + /// is more convenient for updating a sub-area of the texture. + /// + /// No additional check is performed on the size of the window, + /// passing a window bigger than the texture will lead to an + /// undefined behavior. + /// + /// This function does nothing if either the texture or the window + /// was not previously created. + /// + /// \param window Window to copy to the texture + /// + //////////////////////////////////////////////////////////// + void update(const Window& window); + + //////////////////////////////////////////////////////////// + /// \brief Update a part of the texture from the contents of a window + /// + /// No additional check is performed on the size of the window, + /// passing an invalid combination of window size and offset + /// will lead to an undefined behavior. + /// + /// This function does nothing if either the texture or the window + /// was not previously created. + /// + /// \param window Window to copy to the texture + /// \param x X offset in the texture where to copy the source window + /// \param y Y offset in the texture where to copy the source window + /// + //////////////////////////////////////////////////////////// + void update(const Window& window, unsigned int x, unsigned int y); + + //////////////////////////////////////////////////////////// + /// \brief Enable or disable the smooth filter + /// + /// When the filter is activated, the texture appears smoother + /// so that pixels are less noticeable. However if you want + /// the texture to look exactly the same as its source file, + /// you should leave it disabled. + /// The smooth filter is disabled by default. + /// + /// \param smooth True to enable smoothing, false to disable it + /// + /// \see isSmooth + /// + //////////////////////////////////////////////////////////// + void setSmooth(bool smooth); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether the smooth filter is enabled or not + /// + /// \return True if smoothing is enabled, false if it is disabled + /// + /// \see setSmooth + /// + //////////////////////////////////////////////////////////// + bool isSmooth() const; + + //////////////////////////////////////////////////////////// + /// \brief Enable or disable conversion from sRGB + /// + /// When providing texture data from an image file or memory, it can + /// either be stored in a linear color space or an sRGB color space. + /// Most digital images account for gamma correction already, so they + /// would need to be "uncorrected" back to linear color space before + /// being processed by the hardware. The hardware can automatically + /// convert it from the sRGB color space to a linear color space when + /// it gets sampled. When the rendered image gets output to the final + /// framebuffer, it gets converted back to sRGB. + /// + /// After enabling or disabling sRGB conversion, make sure to reload + /// the texture data in order for the setting to take effect. + /// + /// This option is only useful in conjunction with an sRGB capable + /// framebuffer. This can be requested during window creation. + /// + /// \param sRgb True to enable sRGB conversion, false to disable it + /// + /// \see isSrgb + /// + //////////////////////////////////////////////////////////// + void setSrgb(bool sRgb); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether the texture source is converted from sRGB or not + /// + /// \return True if the texture source is converted from sRGB, false if not + /// + /// \see setSrgb + /// + //////////////////////////////////////////////////////////// + bool isSrgb() const; + + //////////////////////////////////////////////////////////// + /// \brief Enable or disable repeating + /// + /// Repeating is involved when using texture coordinates + /// outside the texture rectangle [0, 0, width, height]. + /// In this case, if repeat mode is enabled, the whole texture + /// will be repeated as many times as needed to reach the + /// coordinate (for example, if the X texture coordinate is + /// 3 * width, the texture will be repeated 3 times). + /// If repeat mode is disabled, the "extra space" will instead + /// be filled with border pixels. + /// Warning: on very old graphics cards, white pixels may appear + /// when the texture is repeated. With such cards, repeat mode + /// can be used reliably only if the texture has power-of-two + /// dimensions (such as 256x128). + /// Repeating is disabled by default. + /// + /// \param repeated True to repeat the texture, false to disable repeating + /// + /// \see isRepeated + /// + //////////////////////////////////////////////////////////// + void setRepeated(bool repeated); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether the texture is repeated or not + /// + /// \return True if repeat mode is enabled, false if it is disabled + /// + /// \see setRepeated + /// + //////////////////////////////////////////////////////////// + bool isRepeated() const; + + //////////////////////////////////////////////////////////// + /// \brief Generate a mipmap using the current texture data + /// + /// Mipmaps are pre-computed chains of optimized textures. Each + /// level of texture in a mipmap is generated by halving each of + /// the previous level's dimensions. This is done until the final + /// level has the size of 1x1. The textures generated in this process may + /// make use of more advanced filters which might improve the visual quality + /// of textures when they are applied to objects much smaller than they are. + /// This is known as minification. Because fewer texels (texture elements) + /// have to be sampled from when heavily minified, usage of mipmaps + /// can also improve rendering performance in certain scenarios. + /// + /// Mipmap generation relies on the necessary OpenGL extension being + /// available. If it is unavailable or generation fails due to another + /// reason, this function will return false. Mipmap data is only valid from + /// the time it is generated until the next time the base level image is + /// modified, at which point this function will have to be called again to + /// regenerate it. + /// + /// \return True if mipmap generation was successful, false if unsuccessful + /// + //////////////////////////////////////////////////////////// + bool generateMipmap(); + + //////////////////////////////////////////////////////////// + /// \brief Overload of assignment operator + /// + /// \param right Instance to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + Texture& operator =(const Texture& right); + + //////////////////////////////////////////////////////////// + /// \brief Get the underlying OpenGL handle of the texture. + /// + /// You shouldn't need to use this function, unless you have + /// very specific stuff to implement that SFML doesn't support, + /// or implement a temporary workaround until a bug is fixed. + /// + /// \return OpenGL handle of the texture or 0 if not yet created + /// + //////////////////////////////////////////////////////////// + unsigned int getNativeHandle() const; + + //////////////////////////////////////////////////////////// + /// \brief Bind a texture for rendering + /// + /// This function is not part of the graphics API, it mustn't be + /// used when drawing SFML entities. It must be used only if you + /// mix sf::Texture with OpenGL code. + /// + /// \code + /// sf::Texture t1, t2; + /// ... + /// sf::Texture::bind(&t1); + /// // draw OpenGL stuff that use t1... + /// sf::Texture::bind(&t2); + /// // draw OpenGL stuff that use t2... + /// sf::Texture::bind(NULL); + /// // draw OpenGL stuff that use no texture... + /// \endcode + /// + /// The \a coordinateType argument controls how texture + /// coordinates will be interpreted. If Normalized (the default), they + /// must be in range [0 .. 1], which is the default way of handling + /// texture coordinates with OpenGL. If Pixels, they must be given + /// in pixels (range [0 .. size]). This mode is used internally by + /// the graphics classes of SFML, it makes the definition of texture + /// coordinates more intuitive for the high-level API, users don't need + /// to compute normalized values. + /// + /// \param texture Pointer to the texture to bind, can be null to use no texture + /// \param coordinateType Type of texture coordinates to use + /// + //////////////////////////////////////////////////////////// + static void bind(const Texture* texture, CoordinateType coordinateType = Normalized); + + //////////////////////////////////////////////////////////// + /// \brief Get the maximum texture size allowed + /// + /// This maximum size is defined by the graphics driver. + /// You can expect a value of 512 pixels for low-end graphics + /// card, and up to 8192 pixels or more for newer hardware. + /// + /// \return Maximum size allowed for textures, in pixels + /// + //////////////////////////////////////////////////////////// + static unsigned int getMaximumSize(); + +private: + + friend class RenderTexture; + friend class RenderTarget; + + //////////////////////////////////////////////////////////// + /// \brief Get a valid image size according to hardware support + /// + /// This function checks whether the graphics driver supports + /// non power of two sizes or not, and adjusts the size + /// accordingly. + /// The returned size is greater than or equal to the original size. + /// + /// \param size size to convert + /// + /// \return Valid nearest size (greater than or equal to specified size) + /// + //////////////////////////////////////////////////////////// + static unsigned int getValidSize(unsigned int size); + + //////////////////////////////////////////////////////////// + /// \brief Invalidate the mipmap if one exists + /// + /// This also resets the texture's minifying function. + /// This function is mainly for internal use by RenderTexture. + /// + //////////////////////////////////////////////////////////// + void invalidateMipmap(); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Vector2u m_size; ///< Public texture size + Vector2u m_actualSize; ///< Actual texture size (can be greater than public size because of padding) + unsigned int m_texture; ///< Internal texture identifier + bool m_isSmooth; ///< Status of the smooth filter + bool m_sRgb; ///< Should the texture source be converted from sRGB? + bool m_isRepeated; ///< Is the texture in repeat mode? + mutable bool m_pixelsFlipped; ///< To work around the inconsistency in Y orientation + bool m_fboAttachment; ///< Is this texture owned by a framebuffer object? + bool m_hasMipmap; ///< Has the mipmap been generated? + Uint64 m_cacheId; ///< Unique number that identifies the texture to the render target's cache +}; + +} // namespace sf + + +#endif // SFML_TEXTURE_HPP + +//////////////////////////////////////////////////////////// +/// \class sf::Texture +/// \ingroup graphics +/// +/// sf::Texture stores pixels that can be drawn, with a sprite +/// for example. A texture lives in the graphics card memory, +/// therefore it is very fast to draw a texture to a render target, +/// or copy a render target to a texture (the graphics card can +/// access both directly). +/// +/// Being stored in the graphics card memory has some drawbacks. +/// A texture cannot be manipulated as freely as a sf::Image, +/// you need to prepare the pixels first and then upload them +/// to the texture in a single operation (see Texture::update). +/// +/// sf::Texture makes it easy to convert from/to sf::Image, but +/// keep in mind that these calls require transfers between +/// the graphics card and the central memory, therefore they are +/// slow operations. +/// +/// A texture can be loaded from an image, but also directly +/// from a file/memory/stream. The necessary shortcuts are defined +/// so that you don't need an image first for the most common cases. +/// However, if you want to perform some modifications on the pixels +/// before creating the final texture, you can load your file to a +/// sf::Image, do whatever you need with the pixels, and then call +/// Texture::loadFromImage. +/// +/// Since they live in the graphics card memory, the pixels of a texture +/// cannot be accessed without a slow copy first. And they cannot be +/// accessed individually. Therefore, if you need to read the texture's +/// pixels (like for pixel-perfect collisions), it is recommended to +/// store the collision information separately, for example in an array +/// of booleans. +/// +/// Like sf::Image, sf::Texture can handle a unique internal +/// representation of pixels, which is RGBA 32 bits. This means +/// that a pixel must be composed of 8 bits red, green, blue and +/// alpha channels -- just like a sf::Color. +/// +/// Usage example: +/// \code +/// // This example shows the most common use of sf::Texture: +/// // drawing a sprite +/// +/// // Load a texture from a file +/// sf::Texture texture; +/// if (!texture.loadFromFile("texture.png")) +/// return -1; +/// +/// // Assign it to a sprite +/// sf::Sprite sprite; +/// sprite.setTexture(texture); +/// +/// // Draw the textured sprite +/// window.draw(sprite); +/// \endcode +/// +/// \code +/// // This example shows another common use of sf::Texture: +/// // streaming real-time data, like video frames +/// +/// // Create an empty texture +/// sf::Texture texture; +/// if (!texture.create(640, 480)) +/// return -1; +/// +/// // Create a sprite that will display the texture +/// sf::Sprite sprite(texture); +/// +/// while (...) // the main loop +/// { +/// ... +/// +/// // update the texture +/// sf::Uint8* pixels = ...; // get a fresh chunk of pixels (the next frame of a movie, for example) +/// texture.update(pixels); +/// +/// // draw it +/// window.draw(sprite); +/// +/// ... +/// } +/// +/// \endcode +/// +/// Like sf::Shader that can be used as a raw OpenGL shader, +/// sf::Texture can also be used directly as a raw texture for +/// custom OpenGL geometry. +/// \code +/// sf::Texture::bind(&texture); +/// ... render OpenGL geometry ... +/// sf::Texture::bind(NULL); +/// \endcode +/// +/// \see sf::Sprite, sf::Image, sf::RenderTexture +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Transform.hpp b/SFML-2.4.2/include/SFML/Graphics/Transform.hpp new file mode 100644 index 0000000..ab0307c --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Transform.hpp @@ -0,0 +1,450 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_TRANSFORM_HPP +#define SFML_TRANSFORM_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Define a 3x3 transform matrix +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Transform +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates an identity transform (a transform that does nothing). + /// + //////////////////////////////////////////////////////////// + Transform(); + + //////////////////////////////////////////////////////////// + /// \brief Construct a transform from a 3x3 matrix + /// + /// \param a00 Element (0, 0) of the matrix + /// \param a01 Element (0, 1) of the matrix + /// \param a02 Element (0, 2) of the matrix + /// \param a10 Element (1, 0) of the matrix + /// \param a11 Element (1, 1) of the matrix + /// \param a12 Element (1, 2) of the matrix + /// \param a20 Element (2, 0) of the matrix + /// \param a21 Element (2, 1) of the matrix + /// \param a22 Element (2, 2) of the matrix + /// + //////////////////////////////////////////////////////////// + Transform(float a00, float a01, float a02, + float a10, float a11, float a12, + float a20, float a21, float a22); + + //////////////////////////////////////////////////////////// + /// \brief Return the transform as a 4x4 matrix + /// + /// This function returns a pointer to an array of 16 floats + /// containing the transform elements as a 4x4 matrix, which + /// is directly compatible with OpenGL functions. + /// + /// \code + /// sf::Transform transform = ...; + /// glLoadMatrixf(transform.getMatrix()); + /// \endcode + /// + /// \return Pointer to a 4x4 matrix + /// + //////////////////////////////////////////////////////////// + const float* getMatrix() const; + + //////////////////////////////////////////////////////////// + /// \brief Return the inverse of the transform + /// + /// If the inverse cannot be computed, an identity transform + /// is returned. + /// + /// \return A new transform which is the inverse of self + /// + //////////////////////////////////////////////////////////// + Transform getInverse() const; + + //////////////////////////////////////////////////////////// + /// \brief Transform a 2D point + /// + /// \param x X coordinate of the point to transform + /// \param y Y coordinate of the point to transform + /// + /// \return Transformed point + /// + //////////////////////////////////////////////////////////// + Vector2f transformPoint(float x, float y) const; + + //////////////////////////////////////////////////////////// + /// \brief Transform a 2D point + /// + /// \param point Point to transform + /// + /// \return Transformed point + /// + //////////////////////////////////////////////////////////// + Vector2f transformPoint(const Vector2f& point) const; + + //////////////////////////////////////////////////////////// + /// \brief Transform a rectangle + /// + /// Since SFML doesn't provide support for oriented rectangles, + /// the result of this function is always an axis-aligned + /// rectangle. Which means that if the transform contains a + /// rotation, the bounding rectangle of the transformed rectangle + /// is returned. + /// + /// \param rectangle Rectangle to transform + /// + /// \return Transformed rectangle + /// + //////////////////////////////////////////////////////////// + FloatRect transformRect(const FloatRect& rectangle) const; + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with another one + /// + /// The result is a transform that is equivalent to applying + /// *this followed by \a transform. Mathematically, it is + /// equivalent to a matrix multiplication. + /// + /// \param transform Transform to combine with this transform + /// + /// \return Reference to *this + /// + //////////////////////////////////////////////////////////// + Transform& combine(const Transform& transform); + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with a translation + /// + /// This function returns a reference to *this, so that calls + /// can be chained. + /// \code + /// sf::Transform transform; + /// transform.translate(100, 200).rotate(45); + /// \endcode + /// + /// \param x Offset to apply on X axis + /// \param y Offset to apply on Y axis + /// + /// \return Reference to *this + /// + /// \see rotate, scale + /// + //////////////////////////////////////////////////////////// + Transform& translate(float x, float y); + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with a translation + /// + /// This function returns a reference to *this, so that calls + /// can be chained. + /// \code + /// sf::Transform transform; + /// transform.translate(sf::Vector2f(100, 200)).rotate(45); + /// \endcode + /// + /// \param offset Translation offset to apply + /// + /// \return Reference to *this + /// + /// \see rotate, scale + /// + //////////////////////////////////////////////////////////// + Transform& translate(const Vector2f& offset); + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with a rotation + /// + /// This function returns a reference to *this, so that calls + /// can be chained. + /// \code + /// sf::Transform transform; + /// transform.rotate(90).translate(50, 20); + /// \endcode + /// + /// \param angle Rotation angle, in degrees + /// + /// \return Reference to *this + /// + /// \see translate, scale + /// + //////////////////////////////////////////////////////////// + Transform& rotate(float angle); + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with a rotation + /// + /// The center of rotation is provided for convenience as a second + /// argument, so that you can build rotations around arbitrary points + /// more easily (and efficiently) than the usual + /// translate(-center).rotate(angle).translate(center). + /// + /// This function returns a reference to *this, so that calls + /// can be chained. + /// \code + /// sf::Transform transform; + /// transform.rotate(90, 8, 3).translate(50, 20); + /// \endcode + /// + /// \param angle Rotation angle, in degrees + /// \param centerX X coordinate of the center of rotation + /// \param centerY Y coordinate of the center of rotation + /// + /// \return Reference to *this + /// + /// \see translate, scale + /// + //////////////////////////////////////////////////////////// + Transform& rotate(float angle, float centerX, float centerY); + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with a rotation + /// + /// The center of rotation is provided for convenience as a second + /// argument, so that you can build rotations around arbitrary points + /// more easily (and efficiently) than the usual + /// translate(-center).rotate(angle).translate(center). + /// + /// This function returns a reference to *this, so that calls + /// can be chained. + /// \code + /// sf::Transform transform; + /// transform.rotate(90, sf::Vector2f(8, 3)).translate(sf::Vector2f(50, 20)); + /// \endcode + /// + /// \param angle Rotation angle, in degrees + /// \param center Center of rotation + /// + /// \return Reference to *this + /// + /// \see translate, scale + /// + //////////////////////////////////////////////////////////// + Transform& rotate(float angle, const Vector2f& center); + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with a scaling + /// + /// This function returns a reference to *this, so that calls + /// can be chained. + /// \code + /// sf::Transform transform; + /// transform.scale(2, 1).rotate(45); + /// \endcode + /// + /// \param scaleX Scaling factor on the X axis + /// \param scaleY Scaling factor on the Y axis + /// + /// \return Reference to *this + /// + /// \see translate, rotate + /// + //////////////////////////////////////////////////////////// + Transform& scale(float scaleX, float scaleY); + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with a scaling + /// + /// The center of scaling is provided for convenience as a second + /// argument, so that you can build scaling around arbitrary points + /// more easily (and efficiently) than the usual + /// translate(-center).scale(factors).translate(center). + /// + /// This function returns a reference to *this, so that calls + /// can be chained. + /// \code + /// sf::Transform transform; + /// transform.scale(2, 1, 8, 3).rotate(45); + /// \endcode + /// + /// \param scaleX Scaling factor on X axis + /// \param scaleY Scaling factor on Y axis + /// \param centerX X coordinate of the center of scaling + /// \param centerY Y coordinate of the center of scaling + /// + /// \return Reference to *this + /// + /// \see translate, rotate + /// + //////////////////////////////////////////////////////////// + Transform& scale(float scaleX, float scaleY, float centerX, float centerY); + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with a scaling + /// + /// This function returns a reference to *this, so that calls + /// can be chained. + /// \code + /// sf::Transform transform; + /// transform.scale(sf::Vector2f(2, 1)).rotate(45); + /// \endcode + /// + /// \param factors Scaling factors + /// + /// \return Reference to *this + /// + /// \see translate, rotate + /// + //////////////////////////////////////////////////////////// + Transform& scale(const Vector2f& factors); + + //////////////////////////////////////////////////////////// + /// \brief Combine the current transform with a scaling + /// + /// The center of scaling is provided for convenience as a second + /// argument, so that you can build scaling around arbitrary points + /// more easily (and efficiently) than the usual + /// translate(-center).scale(factors).translate(center). + /// + /// This function returns a reference to *this, so that calls + /// can be chained. + /// \code + /// sf::Transform transform; + /// transform.scale(sf::Vector2f(2, 1), sf::Vector2f(8, 3)).rotate(45); + /// \endcode + /// + /// \param factors Scaling factors + /// \param center Center of scaling + /// + /// \return Reference to *this + /// + /// \see translate, rotate + /// + //////////////////////////////////////////////////////////// + Transform& scale(const Vector2f& factors, const Vector2f& center); + + //////////////////////////////////////////////////////////// + // Static member data + //////////////////////////////////////////////////////////// + static const Transform Identity; ///< The identity transform (does nothing) + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + float m_matrix[16]; ///< 4x4 matrix defining the transformation +}; + +//////////////////////////////////////////////////////////// +/// \relates sf::Transform +/// \brief Overload of binary operator * to combine two transforms +/// +/// This call is equivalent to calling Transform(left).combine(right). +/// +/// \param left Left operand (the first transform) +/// \param right Right operand (the second transform) +/// +/// \return New combined transform +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API Transform operator *(const Transform& left, const Transform& right); + +//////////////////////////////////////////////////////////// +/// \relates sf::Transform +/// \brief Overload of binary operator *= to combine two transforms +/// +/// This call is equivalent to calling left.combine(right). +/// +/// \param left Left operand (the first transform) +/// \param right Right operand (the second transform) +/// +/// \return The combined transform +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API Transform& operator *=(Transform& left, const Transform& right); + +//////////////////////////////////////////////////////////// +/// \relates sf::Transform +/// \brief Overload of binary operator * to transform a point +/// +/// This call is equivalent to calling left.transformPoint(right). +/// +/// \param left Left operand (the transform) +/// \param right Right operand (the point to transform) +/// +/// \return New transformed point +/// +//////////////////////////////////////////////////////////// +SFML_GRAPHICS_API Vector2f operator *(const Transform& left, const Vector2f& right); + +} // namespace sf + + +#endif // SFML_TRANSFORM_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Transform +/// \ingroup graphics +/// +/// A sf::Transform specifies how to translate, rotate, scale, +/// shear, project, whatever things. In mathematical terms, it defines +/// how to transform a coordinate system into another. +/// +/// For example, if you apply a rotation transform to a sprite, the +/// result will be a rotated sprite. And anything that is transformed +/// by this rotation transform will be rotated the same way, according +/// to its initial position. +/// +/// Transforms are typically used for drawing. But they can also be +/// used for any computation that requires to transform points between +/// the local and global coordinate systems of an entity (like collision +/// detection). +/// +/// Example: +/// \code +/// // define a translation transform +/// sf::Transform translation; +/// translation.translate(20, 50); +/// +/// // define a rotation transform +/// sf::Transform rotation; +/// rotation.rotate(45); +/// +/// // combine them +/// sf::Transform transform = translation * rotation; +/// +/// // use the result to transform stuff... +/// sf::Vector2f point = transform.transformPoint(10, 20); +/// sf::FloatRect rect = transform.transformRect(sf::FloatRect(0, 0, 10, 100)); +/// \endcode +/// +/// \see sf::Transformable, sf::RenderStates +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Transformable.hpp b/SFML-2.4.2/include/SFML/Graphics/Transformable.hpp new file mode 100644 index 0000000..4e46cc6 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Transformable.hpp @@ -0,0 +1,429 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_TRANSFORMABLE_HPP +#define SFML_TRANSFORMABLE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Decomposed transform defined by a position, a rotation and a scale +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Transformable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + Transformable(); + + //////////////////////////////////////////////////////////// + /// \brief Virtual destructor + /// + //////////////////////////////////////////////////////////// + virtual ~Transformable(); + + //////////////////////////////////////////////////////////// + /// \brief set the position of the object + /// + /// This function completely overwrites the previous position. + /// See the move function to apply an offset based on the previous position instead. + /// The default position of a transformable object is (0, 0). + /// + /// \param x X coordinate of the new position + /// \param y Y coordinate of the new position + /// + /// \see move, getPosition + /// + //////////////////////////////////////////////////////////// + void setPosition(float x, float y); + + //////////////////////////////////////////////////////////// + /// \brief set the position of the object + /// + /// This function completely overwrites the previous position. + /// See the move function to apply an offset based on the previous position instead. + /// The default position of a transformable object is (0, 0). + /// + /// \param position New position + /// + /// \see move, getPosition + /// + //////////////////////////////////////////////////////////// + void setPosition(const Vector2f& position); + + //////////////////////////////////////////////////////////// + /// \brief set the orientation of the object + /// + /// This function completely overwrites the previous rotation. + /// See the rotate function to add an angle based on the previous rotation instead. + /// The default rotation of a transformable object is 0. + /// + /// \param angle New rotation, in degrees + /// + /// \see rotate, getRotation + /// + //////////////////////////////////////////////////////////// + void setRotation(float angle); + + //////////////////////////////////////////////////////////// + /// \brief set the scale factors of the object + /// + /// This function completely overwrites the previous scale. + /// See the scale function to add a factor based on the previous scale instead. + /// The default scale of a transformable object is (1, 1). + /// + /// \param factorX New horizontal scale factor + /// \param factorY New vertical scale factor + /// + /// \see scale, getScale + /// + //////////////////////////////////////////////////////////// + void setScale(float factorX, float factorY); + + //////////////////////////////////////////////////////////// + /// \brief set the scale factors of the object + /// + /// This function completely overwrites the previous scale. + /// See the scale function to add a factor based on the previous scale instead. + /// The default scale of a transformable object is (1, 1). + /// + /// \param factors New scale factors + /// + /// \see scale, getScale + /// + //////////////////////////////////////////////////////////// + void setScale(const Vector2f& factors); + + //////////////////////////////////////////////////////////// + /// \brief set the local origin of the object + /// + /// The origin of an object defines the center point for + /// all transformations (position, scale, rotation). + /// The coordinates of this point must be relative to the + /// top-left corner of the object, and ignore all + /// transformations (position, scale, rotation). + /// The default origin of a transformable object is (0, 0). + /// + /// \param x X coordinate of the new origin + /// \param y Y coordinate of the new origin + /// + /// \see getOrigin + /// + //////////////////////////////////////////////////////////// + void setOrigin(float x, float y); + + //////////////////////////////////////////////////////////// + /// \brief set the local origin of the object + /// + /// The origin of an object defines the center point for + /// all transformations (position, scale, rotation). + /// The coordinates of this point must be relative to the + /// top-left corner of the object, and ignore all + /// transformations (position, scale, rotation). + /// The default origin of a transformable object is (0, 0). + /// + /// \param origin New origin + /// + /// \see getOrigin + /// + //////////////////////////////////////////////////////////// + void setOrigin(const Vector2f& origin); + + //////////////////////////////////////////////////////////// + /// \brief get the position of the object + /// + /// \return Current position + /// + /// \see setPosition + /// + //////////////////////////////////////////////////////////// + const Vector2f& getPosition() const; + + //////////////////////////////////////////////////////////// + /// \brief get the orientation of the object + /// + /// The rotation is always in the range [0, 360]. + /// + /// \return Current rotation, in degrees + /// + /// \see setRotation + /// + //////////////////////////////////////////////////////////// + float getRotation() const; + + //////////////////////////////////////////////////////////// + /// \brief get the current scale of the object + /// + /// \return Current scale factors + /// + /// \see setScale + /// + //////////////////////////////////////////////////////////// + const Vector2f& getScale() const; + + //////////////////////////////////////////////////////////// + /// \brief get the local origin of the object + /// + /// \return Current origin + /// + /// \see setOrigin + /// + //////////////////////////////////////////////////////////// + const Vector2f& getOrigin() const; + + //////////////////////////////////////////////////////////// + /// \brief Move the object by a given offset + /// + /// This function adds to the current position of the object, + /// unlike setPosition which overwrites it. + /// Thus, it is equivalent to the following code: + /// \code + /// sf::Vector2f pos = object.getPosition(); + /// object.setPosition(pos.x + offsetX, pos.y + offsetY); + /// \endcode + /// + /// \param offsetX X offset + /// \param offsetY Y offset + /// + /// \see setPosition + /// + //////////////////////////////////////////////////////////// + void move(float offsetX, float offsetY); + + //////////////////////////////////////////////////////////// + /// \brief Move the object by a given offset + /// + /// This function adds to the current position of the object, + /// unlike setPosition which overwrites it. + /// Thus, it is equivalent to the following code: + /// \code + /// object.setPosition(object.getPosition() + offset); + /// \endcode + /// + /// \param offset Offset + /// + /// \see setPosition + /// + //////////////////////////////////////////////////////////// + void move(const Vector2f& offset); + + //////////////////////////////////////////////////////////// + /// \brief Rotate the object + /// + /// This function adds to the current rotation of the object, + /// unlike setRotation which overwrites it. + /// Thus, it is equivalent to the following code: + /// \code + /// object.setRotation(object.getRotation() + angle); + /// \endcode + /// + /// \param angle Angle of rotation, in degrees + /// + //////////////////////////////////////////////////////////// + void rotate(float angle); + + //////////////////////////////////////////////////////////// + /// \brief Scale the object + /// + /// This function multiplies the current scale of the object, + /// unlike setScale which overwrites it. + /// Thus, it is equivalent to the following code: + /// \code + /// sf::Vector2f scale = object.getScale(); + /// object.setScale(scale.x * factorX, scale.y * factorY); + /// \endcode + /// + /// \param factorX Horizontal scale factor + /// \param factorY Vertical scale factor + /// + /// \see setScale + /// + //////////////////////////////////////////////////////////// + void scale(float factorX, float factorY); + + //////////////////////////////////////////////////////////// + /// \brief Scale the object + /// + /// This function multiplies the current scale of the object, + /// unlike setScale which overwrites it. + /// Thus, it is equivalent to the following code: + /// \code + /// sf::Vector2f scale = object.getScale(); + /// object.setScale(scale.x * factor.x, scale.y * factor.y); + /// \endcode + /// + /// \param factor Scale factors + /// + /// \see setScale + /// + //////////////////////////////////////////////////////////// + void scale(const Vector2f& factor); + + //////////////////////////////////////////////////////////// + /// \brief get the combined transform of the object + /// + /// \return Transform combining the position/rotation/scale/origin of the object + /// + /// \see getInverseTransform + /// + //////////////////////////////////////////////////////////// + const Transform& getTransform() const; + + //////////////////////////////////////////////////////////// + /// \brief get the inverse of the combined transform of the object + /// + /// \return Inverse of the combined transformations applied to the object + /// + /// \see getTransform + /// + //////////////////////////////////////////////////////////// + const Transform& getInverseTransform() const; + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Vector2f m_origin; ///< Origin of translation/rotation/scaling of the object + Vector2f m_position; ///< Position of the object in the 2D world + float m_rotation; ///< Orientation of the object, in degrees + Vector2f m_scale; ///< Scale of the object + mutable Transform m_transform; ///< Combined transformation of the object + mutable bool m_transformNeedUpdate; ///< Does the transform need to be recomputed? + mutable Transform m_inverseTransform; ///< Combined transformation of the object + mutable bool m_inverseTransformNeedUpdate; ///< Does the transform need to be recomputed? +}; + +} // namespace sf + + +#endif // SFML_TRANSFORMABLE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Transformable +/// \ingroup graphics +/// +/// This class is provided for convenience, on top of sf::Transform. +/// +/// sf::Transform, as a low-level class, offers a great level of +/// flexibility but it is not always convenient to manage. Indeed, +/// one can easily combine any kind of operation, such as a translation +/// followed by a rotation followed by a scaling, but once the result +/// transform is built, there's no way to go backward and, let's say, +/// change only the rotation without modifying the translation and scaling. +/// The entire transform must be recomputed, which means that you +/// need to retrieve the initial translation and scale factors as +/// well, and combine them the same way you did before updating the +/// rotation. This is a tedious operation, and it requires to store +/// all the individual components of the final transform. +/// +/// That's exactly what sf::Transformable was written for: it hides +/// these variables and the composed transform behind an easy to use +/// interface. You can set or get any of the individual components +/// without worrying about the others. It also provides the composed +/// transform (as a sf::Transform), and keeps it up-to-date. +/// +/// In addition to the position, rotation and scale, sf::Transformable +/// provides an "origin" component, which represents the local origin +/// of the three other components. Let's take an example with a 10x10 +/// pixels sprite. By default, the sprite is positioned/rotated/scaled +/// relatively to its top-left corner, because it is the local point +/// (0, 0). But if we change the origin to be (5, 5), the sprite will +/// be positioned/rotated/scaled around its center instead. And if +/// we set the origin to (10, 10), it will be transformed around its +/// bottom-right corner. +/// +/// To keep the sf::Transformable class simple, there's only one +/// origin for all the components. You cannot position the sprite +/// relatively to its top-left corner while rotating it around its +/// center, for example. To do such things, use sf::Transform directly. +/// +/// sf::Transformable can be used as a base class. It is often +/// combined with sf::Drawable -- that's what SFML's sprites, +/// texts and shapes do. +/// \code +/// class MyEntity : public sf::Transformable, public sf::Drawable +/// { +/// virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const +/// { +/// states.transform *= getTransform(); +/// target.draw(..., states); +/// } +/// }; +/// +/// MyEntity entity; +/// entity.setPosition(10, 20); +/// entity.setRotation(45); +/// window.draw(entity); +/// \endcode +/// +/// It can also be used as a member, if you don't want to use +/// its API directly (because you don't need all its functions, +/// or you have different naming conventions for example). +/// \code +/// class MyEntity +/// { +/// public: +/// void SetPosition(const MyVector& v) +/// { +/// myTransform.setPosition(v.x(), v.y()); +/// } +/// +/// void Draw(sf::RenderTarget& target) const +/// { +/// target.draw(..., myTransform.getTransform()); +/// } +/// +/// private: +/// sf::Transformable myTransform; +/// }; +/// \endcode +/// +/// A note on coordinates and undistorted rendering: \n +/// By default, SFML (or more exactly, OpenGL) may interpolate drawable objects +/// such as sprites or texts when rendering. While this allows transitions +/// like slow movements or rotations to appear smoothly, it can lead to +/// unwanted results in some cases, for example blurred or distorted objects. +/// In order to render a sf::Drawable object pixel-perfectly, make sure +/// the involved coordinates allow a 1:1 mapping of pixels in the window +/// to texels (pixels in the texture). More specifically, this means: +/// * The object's position, origin and scale have no fractional part +/// * The object's and the view's rotation are a multiple of 90 degrees +/// * The view's center and size have no fractional part +/// +/// \see sf::Transform +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/Vertex.hpp b/SFML-2.4.2/include/SFML/Graphics/Vertex.hpp new file mode 100644 index 0000000..a9a8820 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/Vertex.hpp @@ -0,0 +1,148 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_VERTEX_HPP +#define SFML_VERTEX_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Define a point with color and texture coordinates +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API Vertex +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + Vertex(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the vertex from its position + /// + /// The vertex color is white and texture coordinates are (0, 0). + /// + /// \param thePosition Vertex position + /// + //////////////////////////////////////////////////////////// + Vertex(const Vector2f& thePosition); + + //////////////////////////////////////////////////////////// + /// \brief Construct the vertex from its position and color + /// + /// The texture coordinates are (0, 0). + /// + /// \param thePosition Vertex position + /// \param theColor Vertex color + /// + //////////////////////////////////////////////////////////// + Vertex(const Vector2f& thePosition, const Color& theColor); + + //////////////////////////////////////////////////////////// + /// \brief Construct the vertex from its position and texture coordinates + /// + /// The vertex color is white. + /// + /// \param thePosition Vertex position + /// \param theTexCoords Vertex texture coordinates + /// + //////////////////////////////////////////////////////////// + Vertex(const Vector2f& thePosition, const Vector2f& theTexCoords); + + //////////////////////////////////////////////////////////// + /// \brief Construct the vertex from its position, color and texture coordinates + /// + /// \param thePosition Vertex position + /// \param theColor Vertex color + /// \param theTexCoords Vertex texture coordinates + /// + //////////////////////////////////////////////////////////// + Vertex(const Vector2f& thePosition, const Color& theColor, const Vector2f& theTexCoords); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Vector2f position; ///< 2D position of the vertex + Color color; ///< Color of the vertex + Vector2f texCoords; ///< Coordinates of the texture's pixel to map to the vertex +}; + +} // namespace sf + + +#endif // SFML_VERTEX_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Vertex +/// \ingroup graphics +/// +/// A vertex is an improved point. It has a position and other +/// extra attributes that will be used for drawing: in SFML, +/// vertices also have a color and a pair of texture coordinates. +/// +/// The vertex is the building block of drawing. Everything which +/// is visible on screen is made of vertices. They are grouped +/// as 2D primitives (triangles, quads, ...), and these primitives +/// are grouped to create even more complex 2D entities such as +/// sprites, texts, etc. +/// +/// If you use the graphical entities of SFML (sprite, text, shape) +/// you won't have to deal with vertices directly. But if you want +/// to define your own 2D entities, such as tiled maps or particle +/// systems, using vertices will allow you to get maximum performances. +/// +/// Example: +/// \code +/// // define a 100x100 square, red, with a 10x10 texture mapped on it +/// sf::Vertex vertices[] = +/// { +/// sf::Vertex(sf::Vector2f( 0, 0), sf::Color::Red, sf::Vector2f( 0, 0)), +/// sf::Vertex(sf::Vector2f( 0, 100), sf::Color::Red, sf::Vector2f( 0, 10)), +/// sf::Vertex(sf::Vector2f(100, 100), sf::Color::Red, sf::Vector2f(10, 10)), +/// sf::Vertex(sf::Vector2f(100, 0), sf::Color::Red, sf::Vector2f(10, 0)) +/// }; +/// +/// // draw it +/// window.draw(vertices, 4, sf::Quads); +/// \endcode +/// +/// Note: although texture coordinates are supposed to be an integer +/// amount of pixels, their type is float because of some buggy graphics +/// drivers that are not able to process integer coordinates correctly. +/// +/// \see sf::VertexArray +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/VertexArray.hpp b/SFML-2.4.2/include/SFML/Graphics/VertexArray.hpp new file mode 100644 index 0000000..109a7e8 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/VertexArray.hpp @@ -0,0 +1,223 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_VERTEXARRAY_HPP +#define SFML_VERTEXARRAY_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Define a set of one or more 2D primitives +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API VertexArray : public Drawable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates an empty vertex array. + /// + //////////////////////////////////////////////////////////// + VertexArray(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the vertex array with a type and an initial number of vertices + /// + /// \param type Type of primitives + /// \param vertexCount Initial number of vertices in the array + /// + //////////////////////////////////////////////////////////// + explicit VertexArray(PrimitiveType type, std::size_t vertexCount = 0); + + //////////////////////////////////////////////////////////// + /// \brief Return the vertex count + /// + /// \return Number of vertices in the array + /// + //////////////////////////////////////////////////////////// + std::size_t getVertexCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get a read-write access to a vertex by its index + /// + /// This function doesn't check \a index, it must be in range + /// [0, getVertexCount() - 1]. The behavior is undefined + /// otherwise. + /// + /// \param index Index of the vertex to get + /// + /// \return Reference to the index-th vertex + /// + /// \see getVertexCount + /// + //////////////////////////////////////////////////////////// + Vertex& operator [](std::size_t index); + + //////////////////////////////////////////////////////////// + /// \brief Get a read-only access to a vertex by its index + /// + /// This function doesn't check \a index, it must be in range + /// [0, getVertexCount() - 1]. The behavior is undefined + /// otherwise. + /// + /// \param index Index of the vertex to get + /// + /// \return Const reference to the index-th vertex + /// + /// \see getVertexCount + /// + //////////////////////////////////////////////////////////// + const Vertex& operator [](std::size_t index) const; + + //////////////////////////////////////////////////////////// + /// \brief Clear the vertex array + /// + /// This function removes all the vertices from the array. + /// It doesn't deallocate the corresponding memory, so that + /// adding new vertices after clearing doesn't involve + /// reallocating all the memory. + /// + //////////////////////////////////////////////////////////// + void clear(); + + //////////////////////////////////////////////////////////// + /// \brief Resize the vertex array + /// + /// If \a vertexCount is greater than the current size, the previous + /// vertices are kept and new (default-constructed) vertices are + /// added. + /// If \a vertexCount is less than the current size, existing vertices + /// are removed from the array. + /// + /// \param vertexCount New size of the array (number of vertices) + /// + //////////////////////////////////////////////////////////// + void resize(std::size_t vertexCount); + + //////////////////////////////////////////////////////////// + /// \brief Add a vertex to the array + /// + /// \param vertex Vertex to add + /// + //////////////////////////////////////////////////////////// + void append(const Vertex& vertex); + + //////////////////////////////////////////////////////////// + /// \brief Set the type of primitives to draw + /// + /// This function defines how the vertices must be interpreted + /// when it's time to draw them: + /// \li As points + /// \li As lines + /// \li As triangles + /// \li As quads + /// The default primitive type is sf::Points. + /// + /// \param type Type of primitive + /// + //////////////////////////////////////////////////////////// + void setPrimitiveType(PrimitiveType type); + + //////////////////////////////////////////////////////////// + /// \brief Get the type of primitives drawn by the vertex array + /// + /// \return Primitive type + /// + //////////////////////////////////////////////////////////// + PrimitiveType getPrimitiveType() const; + + //////////////////////////////////////////////////////////// + /// \brief Compute the bounding rectangle of the vertex array + /// + /// This function returns the minimal axis-aligned rectangle + /// that contains all the vertices of the array. + /// + /// \return Bounding rectangle of the vertex array + /// + //////////////////////////////////////////////////////////// + FloatRect getBounds() const; + +private: + + //////////////////////////////////////////////////////////// + /// \brief Draw the vertex array to a render target + /// + /// \param target Render target to draw to + /// \param states Current render states + /// + //////////////////////////////////////////////////////////// + virtual void draw(RenderTarget& target, RenderStates states) const; + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + std::vector m_vertices; ///< Vertices contained in the array + PrimitiveType m_primitiveType; ///< Type of primitives to draw +}; + +} // namespace sf + + +#endif // SFML_VERTEXARRAY_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::VertexArray +/// \ingroup graphics +/// +/// sf::VertexArray is a very simple wrapper around a dynamic +/// array of vertices and a primitives type. +/// +/// It inherits sf::Drawable, but unlike other drawables it +/// is not transformable. +/// +/// Example: +/// \code +/// sf::VertexArray lines(sf::LineStrip, 4); +/// lines[0].position = sf::Vector2f(10, 0); +/// lines[1].position = sf::Vector2f(20, 0); +/// lines[2].position = sf::Vector2f(30, 5); +/// lines[3].position = sf::Vector2f(40, 2); +/// +/// window.draw(lines); +/// \endcode +/// +/// \see sf::Vertex +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Graphics/View.hpp b/SFML-2.4.2/include/SFML/Graphics/View.hpp new file mode 100644 index 0000000..d49cb49 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Graphics/View.hpp @@ -0,0 +1,343 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_VIEW_HPP +#define SFML_VIEW_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief 2D camera that defines what region is shown on screen +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API View +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor creates a default view of (0, 0, 1000, 1000) + /// + //////////////////////////////////////////////////////////// + View(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the view from a rectangle + /// + /// \param rectangle Rectangle defining the zone to display + /// + //////////////////////////////////////////////////////////// + explicit View(const FloatRect& rectangle); + + //////////////////////////////////////////////////////////// + /// \brief Construct the view from its center and size + /// + /// \param center Center of the zone to display + /// \param size Size of zone to display + /// + //////////////////////////////////////////////////////////// + View(const Vector2f& center, const Vector2f& size); + + //////////////////////////////////////////////////////////// + /// \brief Set the center of the view + /// + /// \param x X coordinate of the new center + /// \param y Y coordinate of the new center + /// + /// \see setSize, getCenter + /// + //////////////////////////////////////////////////////////// + void setCenter(float x, float y); + + //////////////////////////////////////////////////////////// + /// \brief Set the center of the view + /// + /// \param center New center + /// + /// \see setSize, getCenter + /// + //////////////////////////////////////////////////////////// + void setCenter(const Vector2f& center); + + //////////////////////////////////////////////////////////// + /// \brief Set the size of the view + /// + /// \param width New width of the view + /// \param height New height of the view + /// + /// \see setCenter, getCenter + /// + //////////////////////////////////////////////////////////// + void setSize(float width, float height); + + //////////////////////////////////////////////////////////// + /// \brief Set the size of the view + /// + /// \param size New size + /// + /// \see setCenter, getCenter + /// + //////////////////////////////////////////////////////////// + void setSize(const Vector2f& size); + + //////////////////////////////////////////////////////////// + /// \brief Set the orientation of the view + /// + /// The default rotation of a view is 0 degree. + /// + /// \param angle New angle, in degrees + /// + /// \see getRotation + /// + //////////////////////////////////////////////////////////// + void setRotation(float angle); + + //////////////////////////////////////////////////////////// + /// \brief Set the target viewport + /// + /// The viewport is the rectangle into which the contents of the + /// view are displayed, expressed as a factor (between 0 and 1) + /// of the size of the RenderTarget to which the view is applied. + /// For example, a view which takes the left side of the target would + /// be defined with View.setViewport(sf::FloatRect(0, 0, 0.5, 1)). + /// By default, a view has a viewport which covers the entire target. + /// + /// \param viewport New viewport rectangle + /// + /// \see getViewport + /// + //////////////////////////////////////////////////////////// + void setViewport(const FloatRect& viewport); + + //////////////////////////////////////////////////////////// + /// \brief Reset the view to the given rectangle + /// + /// Note that this function resets the rotation angle to 0. + /// + /// \param rectangle Rectangle defining the zone to display + /// + /// \see setCenter, setSize, setRotation + /// + //////////////////////////////////////////////////////////// + void reset(const FloatRect& rectangle); + + //////////////////////////////////////////////////////////// + /// \brief Get the center of the view + /// + /// \return Center of the view + /// + /// \see getSize, setCenter + /// + //////////////////////////////////////////////////////////// + const Vector2f& getCenter() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the size of the view + /// + /// \return Size of the view + /// + /// \see getCenter, setSize + /// + //////////////////////////////////////////////////////////// + const Vector2f& getSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the current orientation of the view + /// + /// \return Rotation angle of the view, in degrees + /// + /// \see setRotation + /// + //////////////////////////////////////////////////////////// + float getRotation() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the target viewport rectangle of the view + /// + /// \return Viewport rectangle, expressed as a factor of the target size + /// + /// \see setViewport + /// + //////////////////////////////////////////////////////////// + const FloatRect& getViewport() const; + + //////////////////////////////////////////////////////////// + /// \brief Move the view relatively to its current position + /// + /// \param offsetX X coordinate of the move offset + /// \param offsetY Y coordinate of the move offset + /// + /// \see setCenter, rotate, zoom + /// + //////////////////////////////////////////////////////////// + void move(float offsetX, float offsetY); + + //////////////////////////////////////////////////////////// + /// \brief Move the view relatively to its current position + /// + /// \param offset Move offset + /// + /// \see setCenter, rotate, zoom + /// + //////////////////////////////////////////////////////////// + void move(const Vector2f& offset); + + //////////////////////////////////////////////////////////// + /// \brief Rotate the view relatively to its current orientation + /// + /// \param angle Angle to rotate, in degrees + /// + /// \see setRotation, move, zoom + /// + //////////////////////////////////////////////////////////// + void rotate(float angle); + + //////////////////////////////////////////////////////////// + /// \brief Resize the view rectangle relatively to its current size + /// + /// Resizing the view simulates a zoom, as the zone displayed on + /// screen grows or shrinks. + /// \a factor is a multiplier: + /// \li 1 keeps the size unchanged + /// \li > 1 makes the view bigger (objects appear smaller) + /// \li < 1 makes the view smaller (objects appear bigger) + /// + /// \param factor Zoom factor to apply + /// + /// \see setSize, move, rotate + /// + //////////////////////////////////////////////////////////// + void zoom(float factor); + + //////////////////////////////////////////////////////////// + /// \brief Get the projection transform of the view + /// + /// This function is meant for internal use only. + /// + /// \return Projection transform defining the view + /// + /// \see getInverseTransform + /// + //////////////////////////////////////////////////////////// + const Transform& getTransform() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the inverse projection transform of the view + /// + /// This function is meant for internal use only. + /// + /// \return Inverse of the projection transform defining the view + /// + /// \see getTransform + /// + //////////////////////////////////////////////////////////// + const Transform& getInverseTransform() const; + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Vector2f m_center; ///< Center of the view, in scene coordinates + Vector2f m_size; ///< Size of the view, in scene coordinates + float m_rotation; ///< Angle of rotation of the view rectangle, in degrees + FloatRect m_viewport; ///< Viewport rectangle, expressed as a factor of the render-target's size + mutable Transform m_transform; ///< Precomputed projection transform corresponding to the view + mutable Transform m_inverseTransform; ///< Precomputed inverse projection transform corresponding to the view + mutable bool m_transformUpdated; ///< Internal state telling if the transform needs to be updated + mutable bool m_invTransformUpdated; ///< Internal state telling if the inverse transform needs to be updated +}; + +} // namespace sf + + +#endif // SFML_VIEW_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::View +/// \ingroup graphics +/// +/// sf::View defines a camera in the 2D scene. This is a +/// very powerful concept: you can scroll, rotate or zoom +/// the entire scene without altering the way that your +/// drawable objects are drawn. +/// +/// A view is composed of a source rectangle, which defines +/// what part of the 2D scene is shown, and a target viewport, +/// which defines where the contents of the source rectangle +/// will be displayed on the render target (window or texture). +/// +/// The viewport allows to map the scene to a custom part +/// of the render target, and can be used for split-screen +/// or for displaying a minimap, for example. If the source +/// rectangle doesn't have the same size as the viewport, its +/// contents will be stretched to fit in. +/// +/// To apply a view, you have to assign it to the render target. +/// Then, objects drawn in this render target will be +/// affected by the view until you use another view. +/// +/// Usage example: +/// \code +/// sf::RenderWindow window; +/// sf::View view; +/// +/// // Initialize the view to a rectangle located at (100, 100) and with a size of 400x200 +/// view.reset(sf::FloatRect(100, 100, 400, 200)); +/// +/// // Rotate it by 45 degrees +/// view.rotate(45); +/// +/// // Set its target viewport to be half of the window +/// view.setViewport(sf::FloatRect(0.f, 0.f, 0.5f, 1.f)); +/// +/// // Apply it +/// window.setView(view); +/// +/// // Render stuff +/// window.draw(someSprite); +/// +/// // Set the default view back +/// window.setView(window.getDefaultView()); +/// +/// // Render stuff not affected by the view +/// window.draw(someText); +/// \endcode +/// +/// See also the note on coordinates and undistorted rendering in sf::Transformable. +/// +/// \see sf::RenderWindow, sf::RenderTexture +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Main.hpp b/SFML-2.4.2/include/SFML/Main.hpp new file mode 100644 index 0000000..f8ac048 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Main.hpp @@ -0,0 +1,43 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_MAIN_HPP +#define SFML_MAIN_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +#if defined(SFML_SYSTEM_IOS) + + // On iOS, we have no choice but to have our own main, + // so we need to rename the user one and call it later + #define main sfmlMain + +#endif + + +#endif // SFML_MAIN_HPP diff --git a/SFML-2.4.2/include/SFML/Network.hpp b/SFML-2.4.2/include/SFML/Network.hpp new file mode 100644 index 0000000..3216c5c --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network.hpp @@ -0,0 +1,53 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_NETWORK_HPP +#define SFML_NETWORK_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#endif // SFML_NETWORK_HPP + +//////////////////////////////////////////////////////////// +/// \defgroup network Network module +/// +/// Socket-based communication, utilities and higher-level +/// network protocols (HTTP, FTP). +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Network/Export.hpp b/SFML-2.4.2/include/SFML/Network/Export.hpp new file mode 100644 index 0000000..4a8d800 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/Export.hpp @@ -0,0 +1,48 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_NETWORK_EXPORT_HPP +#define SFML_NETWORK_EXPORT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +//////////////////////////////////////////////////////////// +// Define portable import / export macros +//////////////////////////////////////////////////////////// +#if defined(SFML_NETWORK_EXPORTS) + + #define SFML_NETWORK_API SFML_API_EXPORT + +#else + + #define SFML_NETWORK_API SFML_API_IMPORT + +#endif + + +#endif // SFML_NETWORK_EXPORT_HPP diff --git a/SFML-2.4.2/include/SFML/Network/Ftp.hpp b/SFML-2.4.2/include/SFML/Network/Ftp.hpp new file mode 100644 index 0000000..3600a9d --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/Ftp.hpp @@ -0,0 +1,612 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_FTP_HPP +#define SFML_FTP_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +class IpAddress; + +//////////////////////////////////////////////////////////// +/// \brief A FTP client +/// +//////////////////////////////////////////////////////////// +class SFML_NETWORK_API Ftp : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Enumeration of transfer modes + /// + //////////////////////////////////////////////////////////// + enum TransferMode + { + Binary, ///< Binary mode (file is transfered as a sequence of bytes) + Ascii, ///< Text mode using ASCII encoding + Ebcdic ///< Text mode using EBCDIC encoding + }; + + //////////////////////////////////////////////////////////// + /// \brief Define a FTP response + /// + //////////////////////////////////////////////////////////// + class SFML_NETWORK_API Response + { + public: + + //////////////////////////////////////////////////////////// + /// \brief Status codes possibly returned by a FTP response + /// + //////////////////////////////////////////////////////////// + enum Status + { + // 1xx: the requested action is being initiated, + // expect another reply before proceeding with a new command + RestartMarkerReply = 110, ///< Restart marker reply + ServiceReadySoon = 120, ///< Service ready in N minutes + DataConnectionAlreadyOpened = 125, ///< Data connection already opened, transfer starting + OpeningDataConnection = 150, ///< File status ok, about to open data connection + + // 2xx: the requested action has been successfully completed + Ok = 200, ///< Command ok + PointlessCommand = 202, ///< Command not implemented + SystemStatus = 211, ///< System status, or system help reply + DirectoryStatus = 212, ///< Directory status + FileStatus = 213, ///< File status + HelpMessage = 214, ///< Help message + SystemType = 215, ///< NAME system type, where NAME is an official system name from the list in the Assigned Numbers document + ServiceReady = 220, ///< Service ready for new user + ClosingConnection = 221, ///< Service closing control connection + DataConnectionOpened = 225, ///< Data connection open, no transfer in progress + ClosingDataConnection = 226, ///< Closing data connection, requested file action successful + EnteringPassiveMode = 227, ///< Entering passive mode + LoggedIn = 230, ///< User logged in, proceed. Logged out if appropriate + FileActionOk = 250, ///< Requested file action ok + DirectoryOk = 257, ///< PATHNAME created + + // 3xx: the command has been accepted, but the requested action + // is dormant, pending receipt of further information + NeedPassword = 331, ///< User name ok, need password + NeedAccountToLogIn = 332, ///< Need account for login + NeedInformation = 350, ///< Requested file action pending further information + + // 4xx: the command was not accepted and the requested action did not take place, + // but the error condition is temporary and the action may be requested again + ServiceUnavailable = 421, ///< Service not available, closing control connection + DataConnectionUnavailable = 425, ///< Can't open data connection + TransferAborted = 426, ///< Connection closed, transfer aborted + FileActionAborted = 450, ///< Requested file action not taken + LocalError = 451, ///< Requested action aborted, local error in processing + InsufficientStorageSpace = 452, ///< Requested action not taken; insufficient storage space in system, file unavailable + + // 5xx: the command was not accepted and + // the requested action did not take place + CommandUnknown = 500, ///< Syntax error, command unrecognized + ParametersUnknown = 501, ///< Syntax error in parameters or arguments + CommandNotImplemented = 502, ///< Command not implemented + BadCommandSequence = 503, ///< Bad sequence of commands + ParameterNotImplemented = 504, ///< Command not implemented for that parameter + NotLoggedIn = 530, ///< Not logged in + NeedAccountToStore = 532, ///< Need account for storing files + FileUnavailable = 550, ///< Requested action not taken, file unavailable + PageTypeUnknown = 551, ///< Requested action aborted, page type unknown + NotEnoughMemory = 552, ///< Requested file action aborted, exceeded storage allocation + FilenameNotAllowed = 553, ///< Requested action not taken, file name not allowed + + // 10xx: SFML custom codes + InvalidResponse = 1000, ///< Not part of the FTP standard, generated by SFML when a received response cannot be parsed + ConnectionFailed = 1001, ///< Not part of the FTP standard, generated by SFML when the low-level socket connection with the server fails + ConnectionClosed = 1002, ///< Not part of the FTP standard, generated by SFML when the low-level socket connection is unexpectedly closed + InvalidFile = 1003 ///< Not part of the FTP standard, generated by SFML when a local file cannot be read or written + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor is used by the FTP client to build + /// the response. + /// + /// \param code Response status code + /// \param message Response message + /// + //////////////////////////////////////////////////////////// + explicit Response(Status code = InvalidResponse, const std::string& message = ""); + + //////////////////////////////////////////////////////////// + /// \brief Check if the status code means a success + /// + /// This function is defined for convenience, it is + /// equivalent to testing if the status code is < 400. + /// + /// \return True if the status is a success, false if it is a failure + /// + //////////////////////////////////////////////////////////// + bool isOk() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the status code of the response + /// + /// \return Status code + /// + //////////////////////////////////////////////////////////// + Status getStatus() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the full message contained in the response + /// + /// \return The response message + /// + //////////////////////////////////////////////////////////// + const std::string& getMessage() const; + + private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Status m_status; ///< Status code returned from the server + std::string m_message; ///< Last message received from the server + }; + + //////////////////////////////////////////////////////////// + /// \brief Specialization of FTP response returning a directory + /// + //////////////////////////////////////////////////////////// + class SFML_NETWORK_API DirectoryResponse : public Response + { + public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// \param response Source response + /// + //////////////////////////////////////////////////////////// + DirectoryResponse(const Response& response); + + //////////////////////////////////////////////////////////// + /// \brief Get the directory returned in the response + /// + /// \return Directory name + /// + //////////////////////////////////////////////////////////// + const std::string& getDirectory() const; + + private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + std::string m_directory; ///< Directory extracted from the response message + }; + + + //////////////////////////////////////////////////////////// + /// \brief Specialization of FTP response returning a + /// filename listing + //////////////////////////////////////////////////////////// + class SFML_NETWORK_API ListingResponse : public Response + { + public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// \param response Source response + /// \param data Data containing the raw listing + /// + //////////////////////////////////////////////////////////// + ListingResponse(const Response& response, const std::string& data); + + //////////////////////////////////////////////////////////// + /// \brief Return the array of directory/file names + /// + /// \return Array containing the requested listing + /// + //////////////////////////////////////////////////////////// + const std::vector& getListing() const; + + private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + std::vector m_listing; ///< Directory/file names extracted from the data + }; + + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + /// Automatically closes the connection with the server if + /// it is still opened. + /// + //////////////////////////////////////////////////////////// + ~Ftp(); + + //////////////////////////////////////////////////////////// + /// \brief Connect to the specified FTP server + /// + /// The port has a default value of 21, which is the standard + /// port used by the FTP protocol. You shouldn't use a different + /// value, unless you really know what you do. + /// This function tries to connect to the server so it may take + /// a while to complete, especially if the server is not + /// reachable. To avoid blocking your application for too long, + /// you can use a timeout. The default value, Time::Zero, means that the + /// system timeout will be used (which is usually pretty long). + /// + /// \param server Name or address of the FTP server to connect to + /// \param port Port used for the connection + /// \param timeout Maximum time to wait + /// + /// \return Server response to the request + /// + /// \see disconnect + /// + //////////////////////////////////////////////////////////// + Response connect(const IpAddress& server, unsigned short port = 21, Time timeout = Time::Zero); + + //////////////////////////////////////////////////////////// + /// \brief Close the connection with the server + /// + /// \return Server response to the request + /// + /// \see connect + /// + //////////////////////////////////////////////////////////// + Response disconnect(); + + //////////////////////////////////////////////////////////// + /// \brief Log in using an anonymous account + /// + /// Logging in is mandatory after connecting to the server. + /// Users that are not logged in cannot perform any operation. + /// + /// \return Server response to the request + /// + //////////////////////////////////////////////////////////// + Response login(); + + //////////////////////////////////////////////////////////// + /// \brief Log in using a username and a password + /// + /// Logging in is mandatory after connecting to the server. + /// Users that are not logged in cannot perform any operation. + /// + /// \param name User name + /// \param password Password + /// + /// \return Server response to the request + /// + //////////////////////////////////////////////////////////// + Response login(const std::string& name, const std::string& password); + + //////////////////////////////////////////////////////////// + /// \brief Send a null command to keep the connection alive + /// + /// This command is useful because the server may close the + /// connection automatically if no command is sent. + /// + /// \return Server response to the request + /// + //////////////////////////////////////////////////////////// + Response keepAlive(); + + //////////////////////////////////////////////////////////// + /// \brief Get the current working directory + /// + /// The working directory is the root path for subsequent + /// operations involving directories and/or filenames. + /// + /// \return Server response to the request + /// + /// \see getDirectoryListing, changeDirectory, parentDirectory + /// + //////////////////////////////////////////////////////////// + DirectoryResponse getWorkingDirectory(); + + //////////////////////////////////////////////////////////// + /// \brief Get the contents of the given directory + /// + /// This function retrieves the sub-directories and files + /// contained in the given directory. It is not recursive. + /// The \a directory parameter is relative to the current + /// working directory. + /// + /// \param directory Directory to list + /// + /// \return Server response to the request + /// + /// \see getWorkingDirectory, changeDirectory, parentDirectory + /// + //////////////////////////////////////////////////////////// + ListingResponse getDirectoryListing(const std::string& directory = ""); + + //////////////////////////////////////////////////////////// + /// \brief Change the current working directory + /// + /// The new directory must be relative to the current one. + /// + /// \param directory New working directory + /// + /// \return Server response to the request + /// + /// \see getWorkingDirectory, getDirectoryListing, parentDirectory + /// + //////////////////////////////////////////////////////////// + Response changeDirectory(const std::string& directory); + + //////////////////////////////////////////////////////////// + /// \brief Go to the parent directory of the current one + /// + /// \return Server response to the request + /// + /// \see getWorkingDirectory, getDirectoryListing, changeDirectory + /// + //////////////////////////////////////////////////////////// + Response parentDirectory(); + + //////////////////////////////////////////////////////////// + /// \brief Create a new directory + /// + /// The new directory is created as a child of the current + /// working directory. + /// + /// \param name Name of the directory to create + /// + /// \return Server response to the request + /// + /// \see deleteDirectory + /// + //////////////////////////////////////////////////////////// + Response createDirectory(const std::string& name); + + //////////////////////////////////////////////////////////// + /// \brief Remove an existing directory + /// + /// The directory to remove must be relative to the + /// current working directory. + /// Use this function with caution, the directory will + /// be removed permanently! + /// + /// \param name Name of the directory to remove + /// + /// \return Server response to the request + /// + /// \see createDirectory + /// + //////////////////////////////////////////////////////////// + Response deleteDirectory(const std::string& name); + + //////////////////////////////////////////////////////////// + /// \brief Rename an existing file + /// + /// The filenames must be relative to the current working + /// directory. + /// + /// \param file File to rename + /// \param newName New name of the file + /// + /// \return Server response to the request + /// + /// \see deleteFile + /// + //////////////////////////////////////////////////////////// + Response renameFile(const std::string& file, const std::string& newName); + + //////////////////////////////////////////////////////////// + /// \brief Remove an existing file + /// + /// The file name must be relative to the current working + /// directory. + /// Use this function with caution, the file will be + /// removed permanently! + /// + /// \param name File to remove + /// + /// \return Server response to the request + /// + /// \see renameFile + /// + //////////////////////////////////////////////////////////// + Response deleteFile(const std::string& name); + + //////////////////////////////////////////////////////////// + /// \brief Download a file from the server + /// + /// The filename of the distant file is relative to the + /// current working directory of the server, and the local + /// destination path is relative to the current directory + /// of your application. + /// If a file with the same filename as the distant file + /// already exists in the local destination path, it will + /// be overwritten. + /// + /// \param remoteFile Filename of the distant file to download + /// \param localPath The directory in which to put the file on the local computer + /// \param mode Transfer mode + /// + /// \return Server response to the request + /// + /// \see upload + /// + //////////////////////////////////////////////////////////// + Response download(const std::string& remoteFile, const std::string& localPath, TransferMode mode = Binary); + + //////////////////////////////////////////////////////////// + /// \brief Upload a file to the server + /// + /// The name of the local file is relative to the current + /// working directory of your application, and the + /// remote path is relative to the current directory of the + /// FTP server. + /// + /// \param localFile Path of the local file to upload + /// \param remotePath The directory in which to put the file on the server + /// \param mode Transfer mode + /// + /// \return Server response to the request + /// + /// \see download + /// + //////////////////////////////////////////////////////////// + Response upload(const std::string& localFile, const std::string& remotePath, TransferMode mode = Binary); + + //////////////////////////////////////////////////////////// + /// \brief Send a command to the FTP server + /// + /// While the most often used commands are provided as member + /// functions in the sf::Ftp class, this method can be used + /// to send any FTP command to the server. If the command + /// requires one or more parameters, they can be specified + /// in \a parameter. If the server returns information, you + /// can extract it from the response using Response::getMessage(). + /// + /// \param command Command to send + /// \param parameter Command parameter + /// + /// \return Server response to the request + /// + //////////////////////////////////////////////////////////// + Response sendCommand(const std::string& command, const std::string& parameter = ""); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Receive a response from the server + /// + /// This function must be called after each call to + /// sendCommand that expects a response. + /// + /// \return Server response to the request + /// + //////////////////////////////////////////////////////////// + Response getResponse(); + + //////////////////////////////////////////////////////////// + /// \brief Utility class for exchanging datas with the server + /// on the data channel + /// + //////////////////////////////////////////////////////////// + class DataChannel; + + friend class DataChannel; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + TcpSocket m_commandSocket; ///< Socket holding the control connection with the server + std::string m_receiveBuffer; ///< Received command data that is yet to be processed +}; + +} // namespace sf + + +#endif // SFML_FTP_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Ftp +/// \ingroup network +/// +/// sf::Ftp is a very simple FTP client that allows you +/// to communicate with a FTP server. The FTP protocol allows +/// you to manipulate a remote file system (list files, +/// upload, download, create, remove, ...). +/// +/// Using the FTP client consists of 4 parts: +/// \li Connecting to the FTP server +/// \li Logging in (either as a registered user or anonymously) +/// \li Sending commands to the server +/// \li Disconnecting (this part can be done implicitly by the destructor) +/// +/// Every command returns a FTP response, which contains the +/// status code as well as a message from the server. Some +/// commands such as getWorkingDirectory() and getDirectoryListing() +/// return additional data, and use a class derived from +/// sf::Ftp::Response to provide this data. The most often used +/// commands are directly provided as member functions, but it is +/// also possible to use specific commands with the sendCommand() function. +/// +/// Note that response statuses >= 1000 are not part of the FTP standard, +/// they are generated by SFML when an internal error occurs. +/// +/// All commands, especially upload and download, may take some +/// time to complete. This is important to know if you don't want +/// to block your application while the server is completing +/// the task. +/// +/// Usage example: +/// \code +/// // Create a new FTP client +/// sf::Ftp ftp; +/// +/// // Connect to the server +/// sf::Ftp::Response response = ftp.connect("ftp://ftp.myserver.com"); +/// if (response.isOk()) +/// std::cout << "Connected" << std::endl; +/// +/// // Log in +/// response = ftp.login("laurent", "dF6Zm89D"); +/// if (response.isOk()) +/// std::cout << "Logged in" << std::endl; +/// +/// // Print the working directory +/// sf::Ftp::DirectoryResponse directory = ftp.getWorkingDirectory(); +/// if (directory.isOk()) +/// std::cout << "Working directory: " << directory.getDirectory() << std::endl; +/// +/// // Create a new directory +/// response = ftp.createDirectory("files"); +/// if (response.isOk()) +/// std::cout << "Created new directory" << std::endl; +/// +/// // Upload a file to this new directory +/// response = ftp.upload("local-path/file.txt", "files", sf::Ftp::Ascii); +/// if (response.isOk()) +/// std::cout << "File uploaded" << std::endl; +/// +/// // Send specific commands (here: FEAT to list supported FTP features) +/// response = ftp.sendCommand("FEAT"); +/// if (response.isOk()) +/// std::cout << "Feature list:\n" << response.getMessage() << std::endl; +/// +/// // Disconnect from the server (optional) +/// ftp.disconnect(); +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Network/Http.hpp b/SFML-2.4.2/include/SFML/Network/Http.hpp new file mode 100644 index 0000000..d165a7c --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/Http.hpp @@ -0,0 +1,482 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_HTTP_HPP +#define SFML_HTTP_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief A HTTP client +/// +//////////////////////////////////////////////////////////// +class SFML_NETWORK_API Http : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Define a HTTP request + /// + //////////////////////////////////////////////////////////// + class SFML_NETWORK_API Request + { + public: + + //////////////////////////////////////////////////////////// + /// \brief Enumerate the available HTTP methods for a request + /// + //////////////////////////////////////////////////////////// + enum Method + { + Get, ///< Request in get mode, standard method to retrieve a page + Post, ///< Request in post mode, usually to send data to a page + Head, ///< Request a page's header only + Put, ///< Request in put mode, useful for a REST API + Delete ///< Request in delete mode, useful for a REST API + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor creates a GET request, with the root + /// URI ("/") and an empty body. + /// + /// \param uri Target URI + /// \param method Method to use for the request + /// \param body Content of the request's body + /// + //////////////////////////////////////////////////////////// + Request(const std::string& uri = "/", Method method = Get, const std::string& body = ""); + + //////////////////////////////////////////////////////////// + /// \brief Set the value of a field + /// + /// The field is created if it doesn't exist. The name of + /// the field is case-insensitive. + /// By default, a request doesn't contain any field (but the + /// mandatory fields are added later by the HTTP client when + /// sending the request). + /// + /// \param field Name of the field to set + /// \param value Value of the field + /// + //////////////////////////////////////////////////////////// + void setField(const std::string& field, const std::string& value); + + //////////////////////////////////////////////////////////// + /// \brief Set the request method + /// + /// See the Method enumeration for a complete list of all + /// the availale methods. + /// The method is Http::Request::Get by default. + /// + /// \param method Method to use for the request + /// + //////////////////////////////////////////////////////////// + void setMethod(Method method); + + //////////////////////////////////////////////////////////// + /// \brief Set the requested URI + /// + /// The URI is the resource (usually a web page or a file) + /// that you want to get or post. + /// The URI is "/" (the root page) by default. + /// + /// \param uri URI to request, relative to the host + /// + //////////////////////////////////////////////////////////// + void setUri(const std::string& uri); + + //////////////////////////////////////////////////////////// + /// \brief Set the HTTP version for the request + /// + /// The HTTP version is 1.0 by default. + /// + /// \param major Major HTTP version number + /// \param minor Minor HTTP version number + /// + //////////////////////////////////////////////////////////// + void setHttpVersion(unsigned int major, unsigned int minor); + + //////////////////////////////////////////////////////////// + /// \brief Set the body of the request + /// + /// The body of a request is optional and only makes sense + /// for POST requests. It is ignored for all other methods. + /// The body is empty by default. + /// + /// \param body Content of the body + /// + //////////////////////////////////////////////////////////// + void setBody(const std::string& body); + + private: + + friend class Http; + + //////////////////////////////////////////////////////////// + /// \brief Prepare the final request to send to the server + /// + /// This is used internally by Http before sending the + /// request to the web server. + /// + /// \return String containing the request, ready to be sent + /// + //////////////////////////////////////////////////////////// + std::string prepare() const; + + //////////////////////////////////////////////////////////// + /// \brief Check if the request defines a field + /// + /// This function uses case-insensitive comparisons. + /// + /// \param field Name of the field to test + /// + /// \return True if the field exists, false otherwise + /// + //////////////////////////////////////////////////////////// + bool hasField(const std::string& field) const; + + //////////////////////////////////////////////////////////// + // Types + //////////////////////////////////////////////////////////// + typedef std::map FieldTable; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + FieldTable m_fields; ///< Fields of the header associated to their value + Method m_method; ///< Method to use for the request + std::string m_uri; ///< Target URI of the request + unsigned int m_majorVersion; ///< Major HTTP version + unsigned int m_minorVersion; ///< Minor HTTP version + std::string m_body; ///< Body of the request + }; + + //////////////////////////////////////////////////////////// + /// \brief Define a HTTP response + /// + //////////////////////////////////////////////////////////// + class SFML_NETWORK_API Response + { + public: + + //////////////////////////////////////////////////////////// + /// \brief Enumerate all the valid status codes for a response + /// + //////////////////////////////////////////////////////////// + enum Status + { + // 2xx: success + Ok = 200, ///< Most common code returned when operation was successful + Created = 201, ///< The resource has successfully been created + Accepted = 202, ///< The request has been accepted, but will be processed later by the server + NoContent = 204, ///< The server didn't send any data in return + ResetContent = 205, ///< The server informs the client that it should clear the view (form) that caused the request to be sent + PartialContent = 206, ///< The server has sent a part of the resource, as a response to a partial GET request + + // 3xx: redirection + MultipleChoices = 300, ///< The requested page can be accessed from several locations + MovedPermanently = 301, ///< The requested page has permanently moved to a new location + MovedTemporarily = 302, ///< The requested page has temporarily moved to a new location + NotModified = 304, ///< For conditional requests, means the requested page hasn't changed and doesn't need to be refreshed + + // 4xx: client error + BadRequest = 400, ///< The server couldn't understand the request (syntax error) + Unauthorized = 401, ///< The requested page needs an authentication to be accessed + Forbidden = 403, ///< The requested page cannot be accessed at all, even with authentication + NotFound = 404, ///< The requested page doesn't exist + RangeNotSatisfiable = 407, ///< The server can't satisfy the partial GET request (with a "Range" header field) + + // 5xx: server error + InternalServerError = 500, ///< The server encountered an unexpected error + NotImplemented = 501, ///< The server doesn't implement a requested feature + BadGateway = 502, ///< The gateway server has received an error from the source server + ServiceNotAvailable = 503, ///< The server is temporarily unavailable (overloaded, in maintenance, ...) + GatewayTimeout = 504, ///< The gateway server couldn't receive a response from the source server + VersionNotSupported = 505, ///< The server doesn't support the requested HTTP version + + // 10xx: SFML custom codes + InvalidResponse = 1000, ///< Response is not a valid HTTP one + ConnectionFailed = 1001 ///< Connection with server failed + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Constructs an empty response. + /// + //////////////////////////////////////////////////////////// + Response(); + + //////////////////////////////////////////////////////////// + /// \brief Get the value of a field + /// + /// If the field \a field is not found in the response header, + /// the empty string is returned. This function uses + /// case-insensitive comparisons. + /// + /// \param field Name of the field to get + /// + /// \return Value of the field, or empty string if not found + /// + //////////////////////////////////////////////////////////// + const std::string& getField(const std::string& field) const; + + //////////////////////////////////////////////////////////// + /// \brief Get the response status code + /// + /// The status code should be the first thing to be checked + /// after receiving a response, it defines whether it is a + /// success, a failure or anything else (see the Status + /// enumeration). + /// + /// \return Status code of the response + /// + //////////////////////////////////////////////////////////// + Status getStatus() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the major HTTP version number of the response + /// + /// \return Major HTTP version number + /// + /// \see getMinorHttpVersion + /// + //////////////////////////////////////////////////////////// + unsigned int getMajorHttpVersion() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the minor HTTP version number of the response + /// + /// \return Minor HTTP version number + /// + /// \see getMajorHttpVersion + /// + //////////////////////////////////////////////////////////// + unsigned int getMinorHttpVersion() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the body of the response + /// + /// The body of a response may contain: + /// \li the requested page (for GET requests) + /// \li a response from the server (for POST requests) + /// \li nothing (for HEAD requests) + /// \li an error message (in case of an error) + /// + /// \return The response body + /// + //////////////////////////////////////////////////////////// + const std::string& getBody() const; + + private: + + friend class Http; + + //////////////////////////////////////////////////////////// + /// \brief Construct the header from a response string + /// + /// This function is used by Http to build the response + /// of a request. + /// + /// \param data Content of the response to parse + /// + //////////////////////////////////////////////////////////// + void parse(const std::string& data); + + + //////////////////////////////////////////////////////////// + /// \brief Read values passed in the answer header + /// + /// This function is used by Http to extract values passed + /// in the response. + /// + /// \param in String stream containing the header values + /// + //////////////////////////////////////////////////////////// + void parseFields(std::istream &in); + + //////////////////////////////////////////////////////////// + // Types + //////////////////////////////////////////////////////////// + typedef std::map FieldTable; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + FieldTable m_fields; ///< Fields of the header + Status m_status; ///< Status code + unsigned int m_majorVersion; ///< Major HTTP version + unsigned int m_minorVersion; ///< Minor HTTP version + std::string m_body; ///< Body of the response + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + Http(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the HTTP client with the target host + /// + /// This is equivalent to calling setHost(host, port). + /// The port has a default value of 0, which means that the + /// HTTP client will use the right port according to the + /// protocol used (80 for HTTP). You should leave it like + /// this unless you really need a port other than the + /// standard one, or use an unknown protocol. + /// + /// \param host Web server to connect to + /// \param port Port to use for connection + /// + //////////////////////////////////////////////////////////// + Http(const std::string& host, unsigned short port = 0); + + //////////////////////////////////////////////////////////// + /// \brief Set the target host + /// + /// This function just stores the host address and port, it + /// doesn't actually connect to it until you send a request. + /// The port has a default value of 0, which means that the + /// HTTP client will use the right port according to the + /// protocol used (80 for HTTP). You should leave it like + /// this unless you really need a port other than the + /// standard one, or use an unknown protocol. + /// + /// \param host Web server to connect to + /// \param port Port to use for connection + /// + //////////////////////////////////////////////////////////// + void setHost(const std::string& host, unsigned short port = 0); + + //////////////////////////////////////////////////////////// + /// \brief Send a HTTP request and return the server's response. + /// + /// You must have a valid host before sending a request (see setHost). + /// Any missing mandatory header field in the request will be added + /// with an appropriate value. + /// Warning: this function waits for the server's response and may + /// not return instantly; use a thread if you don't want to block your + /// application, or use a timeout to limit the time to wait. A value + /// of Time::Zero means that the client will use the system default timeout + /// (which is usually pretty long). + /// + /// \param request Request to send + /// \param timeout Maximum time to wait + /// + /// \return Server's response + /// + //////////////////////////////////////////////////////////// + Response sendRequest(const Request& request, Time timeout = Time::Zero); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + TcpSocket m_connection; ///< Connection to the host + IpAddress m_host; ///< Web host address + std::string m_hostName; ///< Web host name + unsigned short m_port; ///< Port used for connection with host +}; + +} // namespace sf + + +#endif // SFML_HTTP_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Http +/// \ingroup network +/// +/// sf::Http is a very simple HTTP client that allows you +/// to communicate with a web server. You can retrieve +/// web pages, send data to an interactive resource, +/// download a remote file, etc. The HTTPS protocol is +/// not supported. +/// +/// The HTTP client is split into 3 classes: +/// \li sf::Http::Request +/// \li sf::Http::Response +/// \li sf::Http +/// +/// sf::Http::Request builds the request that will be +/// sent to the server. A request is made of: +/// \li a method (what you want to do) +/// \li a target URI (usually the name of the web page or file) +/// \li one or more header fields (options that you can pass to the server) +/// \li an optional body (for POST requests) +/// +/// sf::Http::Response parse the response from the web server +/// and provides getters to read them. The response contains: +/// \li a status code +/// \li header fields (that may be answers to the ones that you requested) +/// \li a body, which contains the contents of the requested resource +/// +/// sf::Http provides a simple function, SendRequest, to send a +/// sf::Http::Request and return the corresponding sf::Http::Response +/// from the server. +/// +/// Usage example: +/// \code +/// // Create a new HTTP client +/// sf::Http http; +/// +/// // We'll work on http://www.sfml-dev.org +/// http.setHost("http://www.sfml-dev.org"); +/// +/// // Prepare a request to get the 'features.php' page +/// sf::Http::Request request("features.php"); +/// +/// // Send the request +/// sf::Http::Response response = http.sendRequest(request); +/// +/// // Check the status code and display the result +/// sf::Http::Response::Status status = response.getStatus(); +/// if (status == sf::Http::Response::Ok) +/// { +/// std::cout << response.getBody() << std::endl; +/// } +/// else +/// { +/// std::cout << "Error " << status << std::endl; +/// } +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Network/IpAddress.hpp b/SFML-2.4.2/include/SFML/Network/IpAddress.hpp new file mode 100644 index 0000000..4940f2b --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/IpAddress.hpp @@ -0,0 +1,328 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_IPADDRESS_HPP +#define SFML_IPADDRESS_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Encapsulate an IPv4 network address +/// +//////////////////////////////////////////////////////////// +class SFML_NETWORK_API IpAddress +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor creates an empty (invalid) address + /// + //////////////////////////////////////////////////////////// + IpAddress(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the address from a string + /// + /// Here \a address can be either a decimal address + /// (ex: "192.168.1.56") or a network name (ex: "localhost"). + /// + /// \param address IP address or network name + /// + //////////////////////////////////////////////////////////// + IpAddress(const std::string& address); + + //////////////////////////////////////////////////////////// + /// \brief Construct the address from a string + /// + /// Here \a address can be either a decimal address + /// (ex: "192.168.1.56") or a network name (ex: "localhost"). + /// This is equivalent to the constructor taking a std::string + /// parameter, it is defined for convenience so that the + /// implicit conversions from literal strings to IpAddress work. + /// + /// \param address IP address or network name + /// + //////////////////////////////////////////////////////////// + IpAddress(const char* address); + + //////////////////////////////////////////////////////////// + /// \brief Construct the address from 4 bytes + /// + /// Calling IpAddress(a, b, c, d) is equivalent to calling + /// IpAddress("a.b.c.d"), but safer as it doesn't have to + /// parse a string to get the address components. + /// + /// \param byte0 First byte of the address + /// \param byte1 Second byte of the address + /// \param byte2 Third byte of the address + /// \param byte3 Fourth byte of the address + /// + //////////////////////////////////////////////////////////// + IpAddress(Uint8 byte0, Uint8 byte1, Uint8 byte2, Uint8 byte3); + + //////////////////////////////////////////////////////////// + /// \brief Construct the address from a 32-bits integer + /// + /// This constructor uses the internal representation of + /// the address directly. It should be used for optimization + /// purposes, and only if you got that representation from + /// IpAddress::toInteger(). + /// + /// \param address 4 bytes of the address packed into a 32-bits integer + /// + /// \see toInteger + /// + //////////////////////////////////////////////////////////// + explicit IpAddress(Uint32 address); + + //////////////////////////////////////////////////////////// + /// \brief Get a string representation of the address + /// + /// The returned string is the decimal representation of the + /// IP address (like "192.168.1.56"), even if it was constructed + /// from a host name. + /// + /// \return String representation of the address + /// + /// \see toInteger + /// + //////////////////////////////////////////////////////////// + std::string toString() const; + + //////////////////////////////////////////////////////////// + /// \brief Get an integer representation of the address + /// + /// The returned number is the internal representation of the + /// address, and should be used for optimization purposes only + /// (like sending the address through a socket). + /// The integer produced by this function can then be converted + /// back to a sf::IpAddress with the proper constructor. + /// + /// \return 32-bits unsigned integer representation of the address + /// + /// \see toString + /// + //////////////////////////////////////////////////////////// + Uint32 toInteger() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the computer's local address + /// + /// The local address is the address of the computer from the + /// LAN point of view, i.e. something like 192.168.1.56. It is + /// meaningful only for communications over the local network. + /// Unlike getPublicAddress, this function is fast and may be + /// used safely anywhere. + /// + /// \return Local IP address of the computer + /// + /// \see getPublicAddress + /// + //////////////////////////////////////////////////////////// + static IpAddress getLocalAddress(); + + //////////////////////////////////////////////////////////// + /// \brief Get the computer's public address + /// + /// The public address is the address of the computer from the + /// internet point of view, i.e. something like 89.54.1.169. + /// It is necessary for communications over the world wide web. + /// The only way to get a public address is to ask it to a + /// distant website; as a consequence, this function depends on + /// both your network connection and the server, and may be + /// very slow. You should use it as few as possible. Because + /// this function depends on the network connection and on a distant + /// server, you may use a time limit if you don't want your program + /// to be possibly stuck waiting in case there is a problem; this + /// limit is deactivated by default. + /// + /// \param timeout Maximum time to wait + /// + /// \return Public IP address of the computer + /// + /// \see getLocalAddress + /// + //////////////////////////////////////////////////////////// + static IpAddress getPublicAddress(Time timeout = Time::Zero); + + //////////////////////////////////////////////////////////// + // Static member data + //////////////////////////////////////////////////////////// + static const IpAddress None; ///< Value representing an empty/invalid address + static const IpAddress Any; ///< Value representing any address (0.0.0.0) + static const IpAddress LocalHost; ///< The "localhost" address (for connecting a computer to itself locally) + static const IpAddress Broadcast; ///< The "broadcast" address (for sending UDP messages to everyone on a local network) + +private: + + friend SFML_NETWORK_API bool operator <(const IpAddress& left, const IpAddress& right); + + //////////////////////////////////////////////////////////// + /// \brief Resolve the given address string + /// + /// \param address Address string + /// + //////////////////////////////////////////////////////////// + void resolve(const std::string& address); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Uint32 m_address; ///< Address stored as an unsigned 32 bits integer + bool m_valid; ///< Is the address valid? +}; + +//////////////////////////////////////////////////////////// +/// \brief Overload of == operator to compare two IP addresses +/// +/// \param left Left operand (a IP address) +/// \param right Right operand (a IP address) +/// +/// \return True if both addresses are equal +/// +//////////////////////////////////////////////////////////// +SFML_NETWORK_API bool operator ==(const IpAddress& left, const IpAddress& right); + +//////////////////////////////////////////////////////////// +/// \brief Overload of != operator to compare two IP addresses +/// +/// \param left Left operand (a IP address) +/// \param right Right operand (a IP address) +/// +/// \return True if both addresses are different +/// +//////////////////////////////////////////////////////////// +SFML_NETWORK_API bool operator !=(const IpAddress& left, const IpAddress& right); + +//////////////////////////////////////////////////////////// +/// \brief Overload of < operator to compare two IP addresses +/// +/// \param left Left operand (a IP address) +/// \param right Right operand (a IP address) +/// +/// \return True if \a left is lesser than \a right +/// +//////////////////////////////////////////////////////////// +SFML_NETWORK_API bool operator <(const IpAddress& left, const IpAddress& right); + +//////////////////////////////////////////////////////////// +/// \brief Overload of > operator to compare two IP addresses +/// +/// \param left Left operand (a IP address) +/// \param right Right operand (a IP address) +/// +/// \return True if \a left is greater than \a right +/// +//////////////////////////////////////////////////////////// +SFML_NETWORK_API bool operator >(const IpAddress& left, const IpAddress& right); + +//////////////////////////////////////////////////////////// +/// \brief Overload of <= operator to compare two IP addresses +/// +/// \param left Left operand (a IP address) +/// \param right Right operand (a IP address) +/// +/// \return True if \a left is lesser or equal than \a right +/// +//////////////////////////////////////////////////////////// +SFML_NETWORK_API bool operator <=(const IpAddress& left, const IpAddress& right); + +//////////////////////////////////////////////////////////// +/// \brief Overload of >= operator to compare two IP addresses +/// +/// \param left Left operand (a IP address) +/// \param right Right operand (a IP address) +/// +/// \return True if \a left is greater or equal than \a right +/// +//////////////////////////////////////////////////////////// +SFML_NETWORK_API bool operator >=(const IpAddress& left, const IpAddress& right); + +//////////////////////////////////////////////////////////// +/// \brief Overload of >> operator to extract an IP address from an input stream +/// +/// \param stream Input stream +/// \param address IP address to extract +/// +/// \return Reference to the input stream +/// +//////////////////////////////////////////////////////////// +SFML_NETWORK_API std::istream& operator >>(std::istream& stream, IpAddress& address); + +//////////////////////////////////////////////////////////// +/// \brief Overload of << operator to print an IP address to an output stream +/// +/// \param stream Output stream +/// \param address IP address to print +/// +/// \return Reference to the output stream +/// +//////////////////////////////////////////////////////////// +SFML_NETWORK_API std::ostream& operator <<(std::ostream& stream, const IpAddress& address); + +} // namespace sf + + +#endif // SFML_IPADDRESS_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::IpAddress +/// \ingroup network +/// +/// sf::IpAddress is a utility class for manipulating network +/// addresses. It provides a set a implicit constructors and +/// conversion functions to easily build or transform an IP +/// address from/to various representations. +/// +/// Usage example: +/// \code +/// sf::IpAddress a0; // an invalid address +/// sf::IpAddress a1 = sf::IpAddress::None; // an invalid address (same as a0) +/// sf::IpAddress a2("127.0.0.1"); // the local host address +/// sf::IpAddress a3 = sf::IpAddress::Broadcast; // the broadcast address +/// sf::IpAddress a4(192, 168, 1, 56); // a local address +/// sf::IpAddress a5("my_computer"); // a local address created from a network name +/// sf::IpAddress a6("89.54.1.169"); // a distant address +/// sf::IpAddress a7("www.google.com"); // a distant address created from a network name +/// sf::IpAddress a8 = sf::IpAddress::getLocalAddress(); // my address on the local network +/// sf::IpAddress a9 = sf::IpAddress::getPublicAddress(); // my address on the internet +/// \endcode +/// +/// Note that sf::IpAddress currently doesn't support IPv6 +/// nor other types of network addresses. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Network/Packet.hpp b/SFML-2.4.2/include/SFML/Network/Packet.hpp new file mode 100644 index 0000000..ac97692 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/Packet.hpp @@ -0,0 +1,412 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_PACKET_HPP +#define SFML_PACKET_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +class String; +class TcpSocket; +class UdpSocket; + +//////////////////////////////////////////////////////////// +/// \brief Utility class to build blocks of data to transfer +/// over the network +/// +//////////////////////////////////////////////////////////// +class SFML_NETWORK_API Packet +{ + // A bool-like type that cannot be converted to integer or pointer types + typedef bool (Packet::*BoolType)(std::size_t); + +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates an empty packet. + /// + //////////////////////////////////////////////////////////// + Packet(); + + //////////////////////////////////////////////////////////// + /// \brief Virtual destructor + /// + //////////////////////////////////////////////////////////// + virtual ~Packet(); + + //////////////////////////////////////////////////////////// + /// \brief Append data to the end of the packet + /// + /// \param data Pointer to the sequence of bytes to append + /// \param sizeInBytes Number of bytes to append + /// + /// \see clear + /// + //////////////////////////////////////////////////////////// + void append(const void* data, std::size_t sizeInBytes); + + //////////////////////////////////////////////////////////// + /// \brief Clear the packet + /// + /// After calling Clear, the packet is empty. + /// + /// \see append + /// + //////////////////////////////////////////////////////////// + void clear(); + + //////////////////////////////////////////////////////////// + /// \brief Get a pointer to the data contained in the packet + /// + /// Warning: the returned pointer may become invalid after + /// you append data to the packet, therefore it should never + /// be stored. + /// The return pointer is NULL if the packet is empty. + /// + /// \return Pointer to the data + /// + /// \see getDataSize + /// + //////////////////////////////////////////////////////////// + const void* getData() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the size of the data contained in the packet + /// + /// This function returns the number of bytes pointed to by + /// what getData returns. + /// + /// \return Data size, in bytes + /// + /// \see getData + /// + //////////////////////////////////////////////////////////// + std::size_t getDataSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Tell if the reading position has reached the + /// end of the packet + /// + /// This function is useful to know if there is some data + /// left to be read, without actually reading it. + /// + /// \return True if all data was read, false otherwise + /// + /// \see operator bool + /// + //////////////////////////////////////////////////////////// + bool endOfPacket() const; + +public: + + //////////////////////////////////////////////////////////// + /// \brief Test the validity of the packet, for reading + /// + /// This operator allows to test the packet as a boolean + /// variable, to check if a reading operation was successful. + /// + /// A packet will be in an invalid state if it has no more + /// data to read. + /// + /// This behavior is the same as standard C++ streams. + /// + /// Usage example: + /// \code + /// float x; + /// packet >> x; + /// if (packet) + /// { + /// // ok, x was extracted successfully + /// } + /// + /// // -- or -- + /// + /// float x; + /// if (packet >> x) + /// { + /// // ok, x was extracted successfully + /// } + /// \endcode + /// + /// Don't focus on the return type, it's equivalent to bool but + /// it disallows unwanted implicit conversions to integer or + /// pointer types. + /// + /// \return True if last data extraction from packet was successful + /// + /// \see endOfPacket + /// + //////////////////////////////////////////////////////////// + operator BoolType() const; + + //////////////////////////////////////////////////////////// + /// Overloads of operator >> to read data from the packet + /// + //////////////////////////////////////////////////////////// + Packet& operator >>(bool& data); + Packet& operator >>(Int8& data); + Packet& operator >>(Uint8& data); + Packet& operator >>(Int16& data); + Packet& operator >>(Uint16& data); + Packet& operator >>(Int32& data); + Packet& operator >>(Uint32& data); + Packet& operator >>(Int64& data); + Packet& operator >>(Uint64& data); + Packet& operator >>(float& data); + Packet& operator >>(double& data); + Packet& operator >>(char* data); + Packet& operator >>(std::string& data); + Packet& operator >>(wchar_t* data); + Packet& operator >>(std::wstring& data); + Packet& operator >>(String& data); + + //////////////////////////////////////////////////////////// + /// Overloads of operator << to write data into the packet + /// + //////////////////////////////////////////////////////////// + Packet& operator <<(bool data); + Packet& operator <<(Int8 data); + Packet& operator <<(Uint8 data); + Packet& operator <<(Int16 data); + Packet& operator <<(Uint16 data); + Packet& operator <<(Int32 data); + Packet& operator <<(Uint32 data); + Packet& operator <<(Int64 data); + Packet& operator <<(Uint64 data); + Packet& operator <<(float data); + Packet& operator <<(double data); + Packet& operator <<(const char* data); + Packet& operator <<(const std::string& data); + Packet& operator <<(const wchar_t* data); + Packet& operator <<(const std::wstring& data); + Packet& operator <<(const String& data); + +protected: + + friend class TcpSocket; + friend class UdpSocket; + + //////////////////////////////////////////////////////////// + /// \brief Called before the packet is sent over the network + /// + /// This function can be defined by derived classes to + /// transform the data before it is sent; this can be + /// used for compression, encryption, etc. + /// The function must return a pointer to the modified data, + /// as well as the number of bytes pointed. + /// The default implementation provides the packet's data + /// without transforming it. + /// + /// \param size Variable to fill with the size of data to send + /// + /// \return Pointer to the array of bytes to send + /// + /// \see onReceive + /// + //////////////////////////////////////////////////////////// + virtual const void* onSend(std::size_t& size); + + //////////////////////////////////////////////////////////// + /// \brief Called after the packet is received over the network + /// + /// This function can be defined by derived classes to + /// transform the data after it is received; this can be + /// used for decompression, decryption, etc. + /// The function receives a pointer to the received data, + /// and must fill the packet with the transformed bytes. + /// The default implementation fills the packet directly + /// without transforming the data. + /// + /// \param data Pointer to the received bytes + /// \param size Number of bytes + /// + /// \see onSend + /// + //////////////////////////////////////////////////////////// + virtual void onReceive(const void* data, std::size_t size); + +private: + + //////////////////////////////////////////////////////////// + /// Disallow comparisons between packets + /// + //////////////////////////////////////////////////////////// + bool operator ==(const Packet& right) const; + bool operator !=(const Packet& right) const; + + //////////////////////////////////////////////////////////// + /// \brief Check if the packet can extract a given number of bytes + /// + /// This function updates accordingly the state of the packet. + /// + /// \param size Size to check + /// + /// \return True if \a size bytes can be read from the packet + /// + //////////////////////////////////////////////////////////// + bool checkSize(std::size_t size); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + std::vector m_data; ///< Data stored in the packet + std::size_t m_readPos; ///< Current reading position in the packet + std::size_t m_sendPos; ///< Current send position in the packet (for handling partial sends) + bool m_isValid; ///< Reading state of the packet +}; + +} // namespace sf + + +#endif // SFML_PACKET_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Packet +/// \ingroup network +/// +/// Packets provide a safe and easy way to serialize data, +/// in order to send it over the network using sockets +/// (sf::TcpSocket, sf::UdpSocket). +/// +/// Packets solve 2 fundamental problems that arise when +/// transferring data over the network: +/// \li data is interpreted correctly according to the endianness +/// \li the bounds of the packet are preserved (one send == one receive) +/// +/// The sf::Packet class provides both input and output modes. +/// It is designed to follow the behavior of standard C++ streams, +/// using operators >> and << to extract and insert data. +/// +/// It is recommended to use only fixed-size types (like sf::Int32, etc.), +/// to avoid possible differences between the sender and the receiver. +/// Indeed, the native C++ types may have different sizes on two platforms +/// and your data may be corrupted if that happens. +/// +/// Usage example: +/// \code +/// sf::Uint32 x = 24; +/// std::string s = "hello"; +/// double d = 5.89; +/// +/// // Group the variables to send into a packet +/// sf::Packet packet; +/// packet << x << s << d; +/// +/// // Send it over the network (socket is a valid sf::TcpSocket) +/// socket.send(packet); +/// +/// ----------------------------------------------------------------- +/// +/// // Receive the packet at the other end +/// sf::Packet packet; +/// socket.receive(packet); +/// +/// // Extract the variables contained in the packet +/// sf::Uint32 x; +/// std::string s; +/// double d; +/// if (packet >> x >> s >> d) +/// { +/// // Data extracted successfully... +/// } +/// \endcode +/// +/// Packets have built-in operator >> and << overloads for +/// standard types: +/// \li bool +/// \li fixed-size integer types (sf::Int8/16/32, sf::Uint8/16/32) +/// \li floating point numbers (float, double) +/// \li string types (char*, wchar_t*, std::string, std::wstring, sf::String) +/// +/// Like standard streams, it is also possible to define your own +/// overloads of operators >> and << in order to handle your +/// custom types. +/// +/// \code +/// struct MyStruct +/// { +/// float number; +/// sf::Int8 integer; +/// std::string str; +/// }; +/// +/// sf::Packet& operator <<(sf::Packet& packet, const MyStruct& m) +/// { +/// return packet << m.number << m.integer << m.str; +/// } +/// +/// sf::Packet& operator >>(sf::Packet& packet, MyStruct& m) +/// { +/// return packet >> m.number >> m.integer >> m.str; +/// } +/// \endcode +/// +/// Packets also provide an extra feature that allows to apply +/// custom transformations to the data before it is sent, +/// and after it is received. This is typically used to +/// handle automatic compression or encryption of the data. +/// This is achieved by inheriting from sf::Packet, and overriding +/// the onSend and onReceive functions. +/// +/// Here is an example: +/// \code +/// class ZipPacket : public sf::Packet +/// { +/// virtual const void* onSend(std::size_t& size) +/// { +/// const void* srcData = getData(); +/// std::size_t srcSize = getDataSize(); +/// +/// return MySuperZipFunction(srcData, srcSize, &size); +/// } +/// +/// virtual void onReceive(const void* data, std::size_t size) +/// { +/// std::size_t dstSize; +/// const void* dstData = MySuperUnzipFunction(data, size, &dstSize); +/// +/// append(dstData, dstSize); +/// } +/// }; +/// +/// // Use like regular packets: +/// ZipPacket packet; +/// packet << x << s << d; +/// ... +/// \endcode +/// +/// \see sf::TcpSocket, sf::UdpSocket +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Network/Socket.hpp b/SFML-2.4.2/include/SFML/Network/Socket.hpp new file mode 100644 index 0000000..0b11171 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/Socket.hpp @@ -0,0 +1,219 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOCKET_HPP +#define SFML_SOCKET_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +class SocketSelector; + +//////////////////////////////////////////////////////////// +/// \brief Base class for all the socket types +/// +//////////////////////////////////////////////////////////// +class SFML_NETWORK_API Socket : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Status codes that may be returned by socket functions + /// + //////////////////////////////////////////////////////////// + enum Status + { + Done, ///< The socket has sent / received the data + NotReady, ///< The socket is not ready to send / receive data yet + Partial, ///< The socket sent a part of the data + Disconnected, ///< The TCP socket has been disconnected + Error ///< An unexpected error happened + }; + + //////////////////////////////////////////////////////////// + /// \brief Some special values used by sockets + /// + //////////////////////////////////////////////////////////// + enum + { + AnyPort = 0 ///< Special value that tells the system to pick any available port + }; + +public: + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + virtual ~Socket(); + + //////////////////////////////////////////////////////////// + /// \brief Set the blocking state of the socket + /// + /// In blocking mode, calls will not return until they have + /// completed their task. For example, a call to Receive in + /// blocking mode won't return until some data was actually + /// received. + /// In non-blocking mode, calls will always return immediately, + /// using the return code to signal whether there was data + /// available or not. + /// By default, all sockets are blocking. + /// + /// \param blocking True to set the socket as blocking, false for non-blocking + /// + /// \see isBlocking + /// + //////////////////////////////////////////////////////////// + void setBlocking(bool blocking); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether the socket is in blocking or non-blocking mode + /// + /// \return True if the socket is blocking, false otherwise + /// + /// \see setBlocking + /// + //////////////////////////////////////////////////////////// + bool isBlocking() const; + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Types of protocols that the socket can use + /// + //////////////////////////////////////////////////////////// + enum Type + { + Tcp, ///< TCP protocol + Udp ///< UDP protocol + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor can only be accessed by derived classes. + /// + /// \param type Type of the socket (TCP or UDP) + /// + //////////////////////////////////////////////////////////// + Socket(Type type); + + //////////////////////////////////////////////////////////// + /// \brief Return the internal handle of the socket + /// + /// The returned handle may be invalid if the socket + /// was not created yet (or already destroyed). + /// This function can only be accessed by derived classes. + /// + /// \return The internal (OS-specific) handle of the socket + /// + //////////////////////////////////////////////////////////// + SocketHandle getHandle() const; + + //////////////////////////////////////////////////////////// + /// \brief Create the internal representation of the socket + /// + /// This function can only be accessed by derived classes. + /// + //////////////////////////////////////////////////////////// + void create(); + + //////////////////////////////////////////////////////////// + /// \brief Create the internal representation of the socket + /// from a socket handle + /// + /// This function can only be accessed by derived classes. + /// + /// \param handle OS-specific handle of the socket to wrap + /// + //////////////////////////////////////////////////////////// + void create(SocketHandle handle); + + //////////////////////////////////////////////////////////// + /// \brief Close the socket gracefully + /// + /// This function can only be accessed by derived classes. + /// + //////////////////////////////////////////////////////////// + void close(); + +private: + + friend class SocketSelector; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Type m_type; ///< Type of the socket (TCP or UDP) + SocketHandle m_socket; ///< Socket descriptor + bool m_isBlocking; ///< Current blocking mode of the socket +}; + +} // namespace sf + + +#endif // SFML_SOCKET_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Socket +/// \ingroup network +/// +/// This class mainly defines internal stuff to be used by +/// derived classes. +/// +/// The only public features that it defines, and which +/// is therefore common to all the socket classes, is the +/// blocking state. All sockets can be set as blocking or +/// non-blocking. +/// +/// In blocking mode, socket functions will hang until +/// the operation completes, which means that the entire +/// program (well, in fact the current thread if you use +/// multiple ones) will be stuck waiting for your socket +/// operation to complete. +/// +/// In non-blocking mode, all the socket functions will +/// return immediately. If the socket is not ready to complete +/// the requested operation, the function simply returns +/// the proper status code (Socket::NotReady). +/// +/// The default mode, which is blocking, is the one that is +/// generally used, in combination with threads or selectors. +/// The non-blocking mode is rather used in real-time +/// applications that run an endless loop that can poll +/// the socket often enough, and cannot afford blocking +/// this loop. +/// +/// \see sf::TcpListener, sf::TcpSocket, sf::UdpSocket +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Network/SocketHandle.hpp b/SFML-2.4.2/include/SFML/Network/SocketHandle.hpp new file mode 100644 index 0000000..d5b395d --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/SocketHandle.hpp @@ -0,0 +1,57 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOCKETHANDLE_HPP +#define SFML_SOCKETHANDLE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + +#if defined(SFML_SYSTEM_WINDOWS) + #include +#endif + + +namespace sf +{ +//////////////////////////////////////////////////////////// +// Define the low-level socket handle type, specific to +// each platform +//////////////////////////////////////////////////////////// +#if defined(SFML_SYSTEM_WINDOWS) + + typedef UINT_PTR SocketHandle; + +#else + + typedef int SocketHandle; + +#endif + +} // namespace sf + + +#endif // SFML_SOCKETHANDLE_HPP diff --git a/SFML-2.4.2/include/SFML/Network/SocketSelector.hpp b/SFML-2.4.2/include/SFML/Network/SocketSelector.hpp new file mode 100644 index 0000000..92dcbad --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/SocketSelector.hpp @@ -0,0 +1,263 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SOCKETSELECTOR_HPP +#define SFML_SOCKETSELECTOR_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +class Socket; + +//////////////////////////////////////////////////////////// +/// \brief Multiplexer that allows to read from multiple sockets +/// +//////////////////////////////////////////////////////////// +class SFML_NETWORK_API SocketSelector +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + SocketSelector(); + + //////////////////////////////////////////////////////////// + /// \brief Copy constructor + /// + /// \param copy Instance to copy + /// + //////////////////////////////////////////////////////////// + SocketSelector(const SocketSelector& copy); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~SocketSelector(); + + //////////////////////////////////////////////////////////// + /// \brief Add a new socket to the selector + /// + /// This function keeps a weak reference to the socket, + /// so you have to make sure that the socket is not destroyed + /// while it is stored in the selector. + /// This function does nothing if the socket is not valid. + /// + /// \param socket Reference to the socket to add + /// + /// \see remove, clear + /// + //////////////////////////////////////////////////////////// + void add(Socket& socket); + + //////////////////////////////////////////////////////////// + /// \brief Remove a socket from the selector + /// + /// This function doesn't destroy the socket, it simply + /// removes the reference that the selector has to it. + /// + /// \param socket Reference to the socket to remove + /// + /// \see add, clear + /// + //////////////////////////////////////////////////////////// + void remove(Socket& socket); + + //////////////////////////////////////////////////////////// + /// \brief Remove all the sockets stored in the selector + /// + /// This function doesn't destroy any instance, it simply + /// removes all the references that the selector has to + /// external sockets. + /// + /// \see add, remove + /// + //////////////////////////////////////////////////////////// + void clear(); + + //////////////////////////////////////////////////////////// + /// \brief Wait until one or more sockets are ready to receive + /// + /// This function returns as soon as at least one socket has + /// some data available to be received. To know which sockets are + /// ready, use the isReady function. + /// If you use a timeout and no socket is ready before the timeout + /// is over, the function returns false. + /// + /// \param timeout Maximum time to wait, (use Time::Zero for infinity) + /// + /// \return True if there are sockets ready, false otherwise + /// + /// \see isReady + /// + //////////////////////////////////////////////////////////// + bool wait(Time timeout = Time::Zero); + + //////////////////////////////////////////////////////////// + /// \brief Test a socket to know if it is ready to receive data + /// + /// This function must be used after a call to Wait, to know + /// which sockets are ready to receive data. If a socket is + /// ready, a call to receive will never block because we know + /// that there is data available to read. + /// Note that if this function returns true for a TcpListener, + /// this means that it is ready to accept a new connection. + /// + /// \param socket Socket to test + /// + /// \return True if the socket is ready to read, false otherwise + /// + /// \see isReady + /// + //////////////////////////////////////////////////////////// + bool isReady(Socket& socket) const; + + //////////////////////////////////////////////////////////// + /// \brief Overload of assignment operator + /// + /// \param right Instance to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + SocketSelector& operator =(const SocketSelector& right); + +private: + + struct SocketSelectorImpl; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + SocketSelectorImpl* m_impl; ///< Opaque pointer to the implementation (which requires OS-specific types) +}; + +} // namespace sf + + +#endif // SFML_SOCKETSELECTOR_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::SocketSelector +/// \ingroup network +/// +/// Socket selectors provide a way to wait until some data is +/// available on a set of sockets, instead of just one. This +/// is convenient when you have multiple sockets that may +/// possibly receive data, but you don't know which one will +/// be ready first. In particular, it avoids to use a thread +/// for each socket; with selectors, a single thread can handle +/// all the sockets. +/// +/// All types of sockets can be used in a selector: +/// \li sf::TcpListener +/// \li sf::TcpSocket +/// \li sf::UdpSocket +/// +/// A selector doesn't store its own copies of the sockets +/// (socket classes are not copyable anyway), it simply keeps +/// a reference to the original sockets that you pass to the +/// "add" function. Therefore, you can't use the selector as a +/// socket container, you must store them outside and make sure +/// that they are alive as long as they are used in the selector. +/// +/// Using a selector is simple: +/// \li populate the selector with all the sockets that you want to observe +/// \li make it wait until there is data available on any of the sockets +/// \li test each socket to find out which ones are ready +/// +/// Usage example: +/// \code +/// // Create a socket to listen to new connections +/// sf::TcpListener listener; +/// listener.listen(55001); +/// +/// // Create a list to store the future clients +/// std::list clients; +/// +/// // Create a selector +/// sf::SocketSelector selector; +/// +/// // Add the listener to the selector +/// selector.add(listener); +/// +/// // Endless loop that waits for new connections +/// while (running) +/// { +/// // Make the selector wait for data on any socket +/// if (selector.wait()) +/// { +/// // Test the listener +/// if (selector.isReady(listener)) +/// { +/// // The listener is ready: there is a pending connection +/// sf::TcpSocket* client = new sf::TcpSocket; +/// if (listener.accept(*client) == sf::Socket::Done) +/// { +/// // Add the new client to the clients list +/// clients.push_back(client); +/// +/// // Add the new client to the selector so that we will +/// // be notified when he sends something +/// selector.add(*client); +/// } +/// else +/// { +/// // Error, we won't get a new connection, delete the socket +/// delete client; +/// } +/// } +/// else +/// { +/// // The listener socket is not ready, test all other sockets (the clients) +/// for (std::list::iterator it = clients.begin(); it != clients.end(); ++it) +/// { +/// sf::TcpSocket& client = **it; +/// if (selector.isReady(client)) +/// { +/// // The client has sent some data, we can receive it +/// sf::Packet packet; +/// if (client.receive(packet) == sf::Socket::Done) +/// { +/// ... +/// } +/// } +/// } +/// } +/// } +/// } +/// \endcode +/// +/// \see sf::Socket +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Network/TcpListener.hpp b/SFML-2.4.2/include/SFML/Network/TcpListener.hpp new file mode 100644 index 0000000..720ebf1 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/TcpListener.hpp @@ -0,0 +1,164 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_TCPLISTENER_HPP +#define SFML_TCPLISTENER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +class TcpSocket; + +//////////////////////////////////////////////////////////// +/// \brief Socket that listens to new TCP connections +/// +//////////////////////////////////////////////////////////// +class SFML_NETWORK_API TcpListener : public Socket +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + TcpListener(); + + //////////////////////////////////////////////////////////// + /// \brief Get the port to which the socket is bound locally + /// + /// If the socket is not listening to a port, this function + /// returns 0. + /// + /// \return Port to which the socket is bound + /// + /// \see listen + /// + //////////////////////////////////////////////////////////// + unsigned short getLocalPort() const; + + //////////////////////////////////////////////////////////// + /// \brief Start listening for connections + /// + /// This functions makes the socket listen to the specified + /// port, waiting for new connections. + /// If the socket was previously listening to another port, + /// it will be stopped first and bound to the new port. + /// + /// \param port Port to listen for new connections + /// \param address Address of the interface to listen on + /// + /// \return Status code + /// + /// \see accept, close + /// + //////////////////////////////////////////////////////////// + Status listen(unsigned short port, const IpAddress& address = IpAddress::Any); + + //////////////////////////////////////////////////////////// + /// \brief Stop listening and close the socket + /// + /// This function gracefully stops the listener. If the + /// socket is not listening, this function has no effect. + /// + /// \see listen + /// + //////////////////////////////////////////////////////////// + void close(); + + //////////////////////////////////////////////////////////// + /// \brief Accept a new connection + /// + /// If the socket is in blocking mode, this function will + /// not return until a connection is actually received. + /// + /// \param socket Socket that will hold the new connection + /// + /// \return Status code + /// + /// \see listen + /// + //////////////////////////////////////////////////////////// + Status accept(TcpSocket& socket); +}; + + +} // namespace sf + + +#endif // SFML_TCPLISTENER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::TcpListener +/// \ingroup network +/// +/// A listener socket is a special type of socket that listens to +/// a given port and waits for connections on that port. +/// This is all it can do. +/// +/// When a new connection is received, you must call accept and +/// the listener returns a new instance of sf::TcpSocket that +/// is properly initialized and can be used to communicate with +/// the new client. +/// +/// Listener sockets are specific to the TCP protocol, +/// UDP sockets are connectionless and can therefore communicate +/// directly. As a consequence, a listener socket will always +/// return the new connections as sf::TcpSocket instances. +/// +/// A listener is automatically closed on destruction, like all +/// other types of socket. However if you want to stop listening +/// before the socket is destroyed, you can call its close() +/// function. +/// +/// Usage example: +/// \code +/// // Create a listener socket and make it wait for new +/// // connections on port 55001 +/// sf::TcpListener listener; +/// listener.listen(55001); +/// +/// // Endless loop that waits for new connections +/// while (running) +/// { +/// sf::TcpSocket client; +/// if (listener.accept(client) == sf::Socket::Done) +/// { +/// // A new client just connected! +/// std::cout << "New connection received from " << client.getRemoteAddress() << std::endl; +/// doSomethingWith(client); +/// } +/// } +/// \endcode +/// +/// \see sf::TcpSocket, sf::Socket +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Network/TcpSocket.hpp b/SFML-2.4.2/include/SFML/Network/TcpSocket.hpp new file mode 100644 index 0000000..da6b549 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/TcpSocket.hpp @@ -0,0 +1,315 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_TCPSOCKET_HPP +#define SFML_TCPSOCKET_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +class TcpListener; +class IpAddress; +class Packet; + +//////////////////////////////////////////////////////////// +/// \brief Specialized socket using the TCP protocol +/// +//////////////////////////////////////////////////////////// +class SFML_NETWORK_API TcpSocket : public Socket +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + TcpSocket(); + + //////////////////////////////////////////////////////////// + /// \brief Get the port to which the socket is bound locally + /// + /// If the socket is not connected, this function returns 0. + /// + /// \return Port to which the socket is bound + /// + /// \see connect, getRemotePort + /// + //////////////////////////////////////////////////////////// + unsigned short getLocalPort() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the address of the connected peer + /// + /// It the socket is not connected, this function returns + /// sf::IpAddress::None. + /// + /// \return Address of the remote peer + /// + /// \see getRemotePort + /// + //////////////////////////////////////////////////////////// + IpAddress getRemoteAddress() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the port of the connected peer to which + /// the socket is connected + /// + /// If the socket is not connected, this function returns 0. + /// + /// \return Remote port to which the socket is connected + /// + /// \see getRemoteAddress + /// + //////////////////////////////////////////////////////////// + unsigned short getRemotePort() const; + + //////////////////////////////////////////////////////////// + /// \brief Connect the socket to a remote peer + /// + /// In blocking mode, this function may take a while, especially + /// if the remote peer is not reachable. The last parameter allows + /// you to stop trying to connect after a given timeout. + /// If the socket was previously connected, it is first disconnected. + /// + /// \param remoteAddress Address of the remote peer + /// \param remotePort Port of the remote peer + /// \param timeout Optional maximum time to wait + /// + /// \return Status code + /// + /// \see disconnect + /// + //////////////////////////////////////////////////////////// + Status connect(const IpAddress& remoteAddress, unsigned short remotePort, Time timeout = Time::Zero); + + //////////////////////////////////////////////////////////// + /// \brief Disconnect the socket from its remote peer + /// + /// This function gracefully closes the connection. If the + /// socket is not connected, this function has no effect. + /// + /// \see connect + /// + //////////////////////////////////////////////////////////// + void disconnect(); + + //////////////////////////////////////////////////////////// + /// \brief Send raw data to the remote peer + /// + /// To be able to handle partial sends over non-blocking + /// sockets, use the send(const void*, std::size_t, std::size_t&) + /// overload instead. + /// This function will fail if the socket is not connected. + /// + /// \param data Pointer to the sequence of bytes to send + /// \param size Number of bytes to send + /// + /// \return Status code + /// + /// \see receive + /// + //////////////////////////////////////////////////////////// + Status send(const void* data, std::size_t size); + + //////////////////////////////////////////////////////////// + /// \brief Send raw data to the remote peer + /// + /// This function will fail if the socket is not connected. + /// + /// \param data Pointer to the sequence of bytes to send + /// \param size Number of bytes to send + /// \param sent The number of bytes sent will be written here + /// + /// \return Status code + /// + /// \see receive + /// + //////////////////////////////////////////////////////////// + Status send(const void* data, std::size_t size, std::size_t& sent); + + //////////////////////////////////////////////////////////// + /// \brief Receive raw data from the remote peer + /// + /// In blocking mode, this function will wait until some + /// bytes are actually received. + /// This function will fail if the socket is not connected. + /// + /// \param data Pointer to the array to fill with the received bytes + /// \param size Maximum number of bytes that can be received + /// \param received This variable is filled with the actual number of bytes received + /// + /// \return Status code + /// + /// \see send + /// + //////////////////////////////////////////////////////////// + Status receive(void* data, std::size_t size, std::size_t& received); + + //////////////////////////////////////////////////////////// + /// \brief Send a formatted packet of data to the remote peer + /// + /// In non-blocking mode, if this function returns sf::Socket::Partial, + /// you \em must retry sending the same unmodified packet before sending + /// anything else in order to guarantee the packet arrives at the remote + /// peer uncorrupted. + /// This function will fail if the socket is not connected. + /// + /// \param packet Packet to send + /// + /// \return Status code + /// + /// \see receive + /// + //////////////////////////////////////////////////////////// + Status send(Packet& packet); + + //////////////////////////////////////////////////////////// + /// \brief Receive a formatted packet of data from the remote peer + /// + /// In blocking mode, this function will wait until the whole packet + /// has been received. + /// This function will fail if the socket is not connected. + /// + /// \param packet Packet to fill with the received data + /// + /// \return Status code + /// + /// \see send + /// + //////////////////////////////////////////////////////////// + Status receive(Packet& packet); + +private: + + friend class TcpListener; + + //////////////////////////////////////////////////////////// + /// \brief Structure holding the data of a pending packet + /// + //////////////////////////////////////////////////////////// + struct PendingPacket + { + PendingPacket(); + + Uint32 Size; ///< Data of packet size + std::size_t SizeReceived; ///< Number of size bytes received so far + std::vector Data; ///< Data of the packet + }; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + PendingPacket m_pendingPacket; ///< Temporary data of the packet currently being received +}; + +} // namespace sf + + +#endif // SFML_TCPSOCKET_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::TcpSocket +/// \ingroup network +/// +/// TCP is a connected protocol, which means that a TCP +/// socket can only communicate with the host it is connected +/// to. It can't send or receive anything if it is not connected. +/// +/// The TCP protocol is reliable but adds a slight overhead. +/// It ensures that your data will always be received in order +/// and without errors (no data corrupted, lost or duplicated). +/// +/// When a socket is connected to a remote host, you can +/// retrieve informations about this host with the +/// getRemoteAddress and getRemotePort functions. You can +/// also get the local port to which the socket is bound +/// (which is automatically chosen when the socket is connected), +/// with the getLocalPort function. +/// +/// Sending and receiving data can use either the low-level +/// or the high-level functions. The low-level functions +/// process a raw sequence of bytes, and cannot ensure that +/// one call to Send will exactly match one call to Receive +/// at the other end of the socket. +/// +/// The high-level interface uses packets (see sf::Packet), +/// which are easier to use and provide more safety regarding +/// the data that is exchanged. You can look at the sf::Packet +/// class to get more details about how they work. +/// +/// The socket is automatically disconnected when it is destroyed, +/// but if you want to explicitly close the connection while +/// the socket instance is still alive, you can call disconnect. +/// +/// Usage example: +/// \code +/// // ----- The client ----- +/// +/// // Create a socket and connect it to 192.168.1.50 on port 55001 +/// sf::TcpSocket socket; +/// socket.connect("192.168.1.50", 55001); +/// +/// // Send a message to the connected host +/// std::string message = "Hi, I am a client"; +/// socket.send(message.c_str(), message.size() + 1); +/// +/// // Receive an answer from the server +/// char buffer[1024]; +/// std::size_t received = 0; +/// socket.receive(buffer, sizeof(buffer), received); +/// std::cout << "The server said: " << buffer << std::endl; +/// +/// // ----- The server ----- +/// +/// // Create a listener to wait for incoming connections on port 55001 +/// sf::TcpListener listener; +/// listener.listen(55001); +/// +/// // Wait for a connection +/// sf::TcpSocket socket; +/// listener.accept(socket); +/// std::cout << "New client connected: " << socket.getRemoteAddress() << std::endl; +/// +/// // Receive a message from the client +/// char buffer[1024]; +/// std::size_t received = 0; +/// socket.receive(buffer, sizeof(buffer), received); +/// std::cout << "The client said: " << buffer << std::endl; +/// +/// // Send an answer +/// std::string message = "Welcome, client"; +/// socket.send(message.c_str(), message.size() + 1); +/// \endcode +/// +/// \see sf::Socket, sf::UdpSocket, sf::Packet +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Network/UdpSocket.hpp b/SFML-2.4.2/include/SFML/Network/UdpSocket.hpp new file mode 100644 index 0000000..6ee191c --- /dev/null +++ b/SFML-2.4.2/include/SFML/Network/UdpSocket.hpp @@ -0,0 +1,286 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_UDPSOCKET_HPP +#define SFML_UDPSOCKET_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +class Packet; + +//////////////////////////////////////////////////////////// +/// \brief Specialized socket using the UDP protocol +/// +//////////////////////////////////////////////////////////// +class SFML_NETWORK_API UdpSocket : public Socket +{ +public: + + //////////////////////////////////////////////////////////// + // Constants + //////////////////////////////////////////////////////////// + enum + { + MaxDatagramSize = 65507 ///< The maximum number of bytes that can be sent in a single UDP datagram + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + UdpSocket(); + + //////////////////////////////////////////////////////////// + /// \brief Get the port to which the socket is bound locally + /// + /// If the socket is not bound to a port, this function + /// returns 0. + /// + /// \return Port to which the socket is bound + /// + /// \see bind + /// + //////////////////////////////////////////////////////////// + unsigned short getLocalPort() const; + + //////////////////////////////////////////////////////////// + /// \brief Bind the socket to a specific port + /// + /// Binding the socket to a port is necessary for being + /// able to receive data on that port. + /// You can use the special value Socket::AnyPort to tell the + /// system to automatically pick an available port, and then + /// call getLocalPort to retrieve the chosen port. + /// + /// \param port Port to bind the socket to + /// \param address Address of the interface to bind to + /// + /// \return Status code + /// + /// \see unbind, getLocalPort + /// + //////////////////////////////////////////////////////////// + Status bind(unsigned short port, const IpAddress& address = IpAddress::Any); + + //////////////////////////////////////////////////////////// + /// \brief Unbind the socket from the local port to which it is bound + /// + /// The port that the socket was previously bound to is immediately + /// made available to the operating system after this function is called. + /// This means that a subsequent call to bind() will be able to re-bind + /// the port if no other process has done so in the mean time. + /// If the socket is not bound to a port, this function has no effect. + /// + /// \see bind + /// + //////////////////////////////////////////////////////////// + void unbind(); + + //////////////////////////////////////////////////////////// + /// \brief Send raw data to a remote peer + /// + /// Make sure that \a size is not greater than + /// UdpSocket::MaxDatagramSize, otherwise this function will + /// fail and no data will be sent. + /// + /// \param data Pointer to the sequence of bytes to send + /// \param size Number of bytes to send + /// \param remoteAddress Address of the receiver + /// \param remotePort Port of the receiver to send the data to + /// + /// \return Status code + /// + /// \see receive + /// + //////////////////////////////////////////////////////////// + Status send(const void* data, std::size_t size, const IpAddress& remoteAddress, unsigned short remotePort); + + //////////////////////////////////////////////////////////// + /// \brief Receive raw data from a remote peer + /// + /// In blocking mode, this function will wait until some + /// bytes are actually received. + /// Be careful to use a buffer which is large enough for + /// the data that you intend to receive, if it is too small + /// then an error will be returned and *all* the data will + /// be lost. + /// + /// \param data Pointer to the array to fill with the received bytes + /// \param size Maximum number of bytes that can be received + /// \param received This variable is filled with the actual number of bytes received + /// \param remoteAddress Address of the peer that sent the data + /// \param remotePort Port of the peer that sent the data + /// + /// \return Status code + /// + /// \see send + /// + //////////////////////////////////////////////////////////// + Status receive(void* data, std::size_t size, std::size_t& received, IpAddress& remoteAddress, unsigned short& remotePort); + + //////////////////////////////////////////////////////////// + /// \brief Send a formatted packet of data to a remote peer + /// + /// Make sure that the packet size is not greater than + /// UdpSocket::MaxDatagramSize, otherwise this function will + /// fail and no data will be sent. + /// + /// \param packet Packet to send + /// \param remoteAddress Address of the receiver + /// \param remotePort Port of the receiver to send the data to + /// + /// \return Status code + /// + /// \see receive + /// + //////////////////////////////////////////////////////////// + Status send(Packet& packet, const IpAddress& remoteAddress, unsigned short remotePort); + + //////////////////////////////////////////////////////////// + /// \brief Receive a formatted packet of data from a remote peer + /// + /// In blocking mode, this function will wait until the whole packet + /// has been received. + /// + /// \param packet Packet to fill with the received data + /// \param remoteAddress Address of the peer that sent the data + /// \param remotePort Port of the peer that sent the data + /// + /// \return Status code + /// + /// \see send + /// + //////////////////////////////////////////////////////////// + Status receive(Packet& packet, IpAddress& remoteAddress, unsigned short& remotePort); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + std::vector m_buffer; ///< Temporary buffer holding the received data in Receive(Packet) +}; + +} // namespace sf + + +#endif // SFML_UDPSOCKET_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::UdpSocket +/// \ingroup network +/// +/// A UDP socket is a connectionless socket. Instead of +/// connecting once to a remote host, like TCP sockets, +/// it can send to and receive from any host at any time. +/// +/// It is a datagram protocol: bounded blocks of data (datagrams) +/// are transfered over the network rather than a continuous +/// stream of data (TCP). Therefore, one call to send will always +/// match one call to receive (if the datagram is not lost), +/// with the same data that was sent. +/// +/// The UDP protocol is lightweight but unreliable. Unreliable +/// means that datagrams may be duplicated, be lost or +/// arrive reordered. However, if a datagram arrives, its +/// data is guaranteed to be valid. +/// +/// UDP is generally used for real-time communication +/// (audio or video streaming, real-time games, etc.) where +/// speed is crucial and lost data doesn't matter much. +/// +/// Sending and receiving data can use either the low-level +/// or the high-level functions. The low-level functions +/// process a raw sequence of bytes, whereas the high-level +/// interface uses packets (see sf::Packet), which are easier +/// to use and provide more safety regarding the data that is +/// exchanged. You can look at the sf::Packet class to get +/// more details about how they work. +/// +/// It is important to note that UdpSocket is unable to send +/// datagrams bigger than MaxDatagramSize. In this case, it +/// returns an error and doesn't send anything. This applies +/// to both raw data and packets. Indeed, even packets are +/// unable to split and recompose data, due to the unreliability +/// of the protocol (dropped, mixed or duplicated datagrams may +/// lead to a big mess when trying to recompose a packet). +/// +/// If the socket is bound to a port, it is automatically +/// unbound from it when the socket is destroyed. However, +/// you can unbind the socket explicitly with the Unbind +/// function if necessary, to stop receiving messages or +/// make the port available for other sockets. +/// +/// Usage example: +/// \code +/// // ----- The client ----- +/// +/// // Create a socket and bind it to the port 55001 +/// sf::UdpSocket socket; +/// socket.bind(55001); +/// +/// // Send a message to 192.168.1.50 on port 55002 +/// std::string message = "Hi, I am " + sf::IpAddress::getLocalAddress().toString(); +/// socket.send(message.c_str(), message.size() + 1, "192.168.1.50", 55002); +/// +/// // Receive an answer (most likely from 192.168.1.50, but could be anyone else) +/// char buffer[1024]; +/// std::size_t received = 0; +/// sf::IpAddress sender; +/// unsigned short port; +/// socket.receive(buffer, sizeof(buffer), received, sender, port); +/// std::cout << sender.ToString() << " said: " << buffer << std::endl; +/// +/// // ----- The server ----- +/// +/// // Create a socket and bind it to the port 55002 +/// sf::UdpSocket socket; +/// socket.bind(55002); +/// +/// // Receive a message from anyone +/// char buffer[1024]; +/// std::size_t received = 0; +/// sf::IpAddress sender; +/// unsigned short port; +/// socket.receive(buffer, sizeof(buffer), received, sender, port); +/// std::cout << sender.ToString() << " said: " << buffer << std::endl; +/// +/// // Send an answer +/// std::string message = "Welcome " + sender.toString(); +/// socket.send(message.c_str(), message.size() + 1, sender, port); +/// \endcode +/// +/// \see sf::Socket, sf::TcpSocket, sf::Packet +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/OpenGL.hpp b/SFML-2.4.2/include/SFML/OpenGL.hpp new file mode 100644 index 0000000..39e97b6 --- /dev/null +++ b/SFML-2.4.2/include/SFML/OpenGL.hpp @@ -0,0 +1,77 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_OPENGL_HPP +#define SFML_OPENGL_HPP + + +//////////////////////////////////////////////////////////// +/// Headers +//////////////////////////////////////////////////////////// +#include + + +//////////////////////////////////////////////////////////// +/// This file just includes the OpenGL headers, +/// which have actually different paths on each system +//////////////////////////////////////////////////////////// +#if defined(SFML_SYSTEM_WINDOWS) + + // The Visual C++ version of gl.h uses WINGDIAPI and APIENTRY but doesn't define them + #ifdef _MSC_VER + #include + #endif + + #include + +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) + + #if defined(SFML_OPENGL_ES) + #include + #include + #else + #include + #endif + +#elif defined(SFML_SYSTEM_MACOS) + + #include + +#elif defined (SFML_SYSTEM_IOS) + + #include + #include + +#elif defined (SFML_SYSTEM_ANDROID) + + #include + #include + + // We're not using OpenGL ES 2+ yet, but we can use the sRGB extension + #include + +#endif + + +#endif // SFML_OPENGL_HPP diff --git a/SFML-2.4.2/include/SFML/System.hpp b/SFML-2.4.2/include/SFML/System.hpp new file mode 100644 index 0000000..5f18f76 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System.hpp @@ -0,0 +1,60 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SYSTEM_HPP +#define SFML_SYSTEM_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // SFML_SYSTEM_HPP + +//////////////////////////////////////////////////////////// +/// \defgroup system System module +/// +/// Base module of SFML, defining various utilities. It provides +/// vector classes, Unicode strings and conversion functions, +/// threads and mutexes, timing classes. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Clock.hpp b/SFML-2.4.2/include/SFML/System/Clock.hpp new file mode 100644 index 0000000..0e57d60 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Clock.hpp @@ -0,0 +1,117 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_CLOCK_HPP +#define SFML_CLOCK_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Utility class that measures the elapsed time +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API Clock +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// The clock starts automatically after being constructed. + /// + //////////////////////////////////////////////////////////// + Clock(); + + //////////////////////////////////////////////////////////// + /// \brief Get the elapsed time + /// + /// This function returns the time elapsed since the last call + /// to restart() (or the construction of the instance if restart() + /// has not been called). + /// + /// \return Time elapsed + /// + //////////////////////////////////////////////////////////// + Time getElapsedTime() const; + + //////////////////////////////////////////////////////////// + /// \brief Restart the clock + /// + /// This function puts the time counter back to zero. + /// It also returns the time elapsed since the clock was started. + /// + /// \return Time elapsed + /// + //////////////////////////////////////////////////////////// + Time restart(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Time m_startTime; ///< Time of last reset, in microseconds +}; + +} // namespace sf + + +#endif // SFML_CLOCK_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Clock +/// \ingroup system +/// +/// sf::Clock is a lightweight class for measuring time. +/// +/// Its provides the most precise time that the underlying +/// OS can achieve (generally microseconds or nanoseconds). +/// It also ensures monotonicity, which means that the returned +/// time can never go backward, even if the system time is +/// changed. +/// +/// Usage example: +/// \code +/// sf::Clock clock; +/// ... +/// Time time1 = clock.getElapsedTime(); +/// ... +/// Time time2 = clock.restart(); +/// \endcode +/// +/// The sf::Time value returned by the clock can then be +/// converted to a number of seconds, milliseconds or even +/// microseconds. +/// +/// \see sf::Time +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Err.hpp b/SFML-2.4.2/include/SFML/System/Err.hpp new file mode 100644 index 0000000..56505a9 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Err.hpp @@ -0,0 +1,80 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_ERR_HPP +#define SFML_ERR_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Standard stream used by SFML to output warnings and errors +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API std::ostream& err(); + +} // namespace sf + + +#endif // SFML_ERR_HPP + + +//////////////////////////////////////////////////////////// +/// \fn sf::err +/// \ingroup system +/// +/// By default, sf::err() outputs to the same location as std::cerr, +/// (-> the stderr descriptor) which is the console if there's +/// one available. +/// +/// It is a standard std::ostream instance, so it supports all the +/// insertion operations defined by the STL +/// (operator <<, manipulators, etc.). +/// +/// sf::err() can be redirected to write to another output, independently +/// of std::cerr, by using the rdbuf() function provided by the +/// std::ostream class. +/// +/// Example: +/// \code +/// // Redirect to a file +/// std::ofstream file("sfml-log.txt"); +/// std::streambuf* previous = sf::err().rdbuf(file.rdbuf()); +/// +/// // Redirect to nothing +/// sf::err().rdbuf(NULL); +/// +/// // Restore the original output +/// sf::err().rdbuf(previous); +/// \endcode +/// +/// \return Reference to std::ostream representing the SFML error stream +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Export.hpp b/SFML-2.4.2/include/SFML/System/Export.hpp new file mode 100644 index 0000000..0387c2e --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Export.hpp @@ -0,0 +1,48 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SYSTEM_EXPORT_HPP +#define SFML_SYSTEM_EXPORT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +//////////////////////////////////////////////////////////// +// Define portable import / export macros +//////////////////////////////////////////////////////////// +#if defined(SFML_SYSTEM_EXPORTS) + + #define SFML_SYSTEM_API SFML_API_EXPORT + +#else + + #define SFML_SYSTEM_API SFML_API_IMPORT + +#endif + + +#endif // SFML_SYSTEM_EXPORT_HPP diff --git a/SFML-2.4.2/include/SFML/System/FileInputStream.hpp b/SFML-2.4.2/include/SFML/System/FileInputStream.hpp new file mode 100644 index 0000000..b1a8c62 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/FileInputStream.hpp @@ -0,0 +1,169 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_FILEINPUTSTREAM_HPP +#define SFML_FILEINPUTSTREAM_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include + +#ifdef ANDROID +namespace sf +{ +namespace priv +{ +class SFML_SYSTEM_API ResourceStream; +} +} +#endif + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Implementation of input stream based on a file +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API FileInputStream : public InputStream, NonCopyable +{ +public: + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + FileInputStream(); + + //////////////////////////////////////////////////////////// + /// \brief Default destructor + /// + //////////////////////////////////////////////////////////// + virtual ~FileInputStream(); + + //////////////////////////////////////////////////////////// + /// \brief Open the stream from a file path + /// + /// \param filename Name of the file to open + /// + /// \return True on success, false on error + /// + //////////////////////////////////////////////////////////// + bool open(const std::string& filename); + + //////////////////////////////////////////////////////////// + /// \brief Read data from the stream + /// + /// After reading, the stream's reading position must be + /// advanced by the amount of bytes read. + /// + /// \param data Buffer where to copy the read data + /// \param size Desired number of bytes to read + /// + /// \return The number of bytes actually read, or -1 on error + /// + //////////////////////////////////////////////////////////// + virtual Int64 read(void* data, Int64 size); + + //////////////////////////////////////////////////////////// + /// \brief Change the current reading position + /// + /// \param position The position to seek to, from the beginning + /// + /// \return The position actually sought to, or -1 on error + /// + //////////////////////////////////////////////////////////// + virtual Int64 seek(Int64 position); + + //////////////////////////////////////////////////////////// + /// \brief Get the current reading position in the stream + /// + /// \return The current position, or -1 on error. + /// + //////////////////////////////////////////////////////////// + virtual Int64 tell(); + + //////////////////////////////////////////////////////////// + /// \brief Return the size of the stream + /// + /// \return The total number of bytes available in the stream, or -1 on error + /// + //////////////////////////////////////////////////////////// + virtual Int64 getSize(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// +#ifdef ANDROID + priv::ResourceStream* m_file; +#else + std::FILE* m_file; ///< stdio file stream +#endif +}; + +} // namespace sf + + +#endif // SFML_FILEINPUTSTREAM_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::FileInputStream +/// \ingroup system +/// +/// This class is a specialization of InputStream that +/// reads from a file on disk. +/// +/// It wraps a file in the common InputStream interface +/// and therefore allows to use generic classes or functions +/// that accept such a stream, with a file on disk as the data +/// source. +/// +/// In addition to the virtual functions inherited from +/// InputStream, FileInputStream adds a function to +/// specify the file to open. +/// +/// SFML resource classes can usually be loaded directly from +/// a filename, so this class shouldn't be useful to you unless +/// you create your own algorithms that operate on an InputStream. +/// +/// Usage example: +/// \code +/// void process(InputStream& stream); +/// +/// FileInputStream stream; +/// if (stream.open("some_file.dat")) +/// process(stream); +/// \endcode +/// +/// InputStream, MemoryInputStream +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/InputStream.hpp b/SFML-2.4.2/include/SFML/System/InputStream.hpp new file mode 100644 index 0000000..4419a0b --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/InputStream.hpp @@ -0,0 +1,152 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_INPUTSTREAM_HPP +#define SFML_INPUTSTREAM_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Abstract class for custom file input streams +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API InputStream +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Virtual destructor + /// + //////////////////////////////////////////////////////////// + virtual ~InputStream() {} + + //////////////////////////////////////////////////////////// + /// \brief Read data from the stream + /// + /// After reading, the stream's reading position must be + /// advanced by the amount of bytes read. + /// + /// \param data Buffer where to copy the read data + /// \param size Desired number of bytes to read + /// + /// \return The number of bytes actually read, or -1 on error + /// + //////////////////////////////////////////////////////////// + virtual Int64 read(void* data, Int64 size) = 0; + + //////////////////////////////////////////////////////////// + /// \brief Change the current reading position + /// + /// \param position The position to seek to, from the beginning + /// + /// \return The position actually sought to, or -1 on error + /// + //////////////////////////////////////////////////////////// + virtual Int64 seek(Int64 position) = 0; + + //////////////////////////////////////////////////////////// + /// \brief Get the current reading position in the stream + /// + /// \return The current position, or -1 on error. + /// + //////////////////////////////////////////////////////////// + virtual Int64 tell() = 0; + + //////////////////////////////////////////////////////////// + /// \brief Return the size of the stream + /// + /// \return The total number of bytes available in the stream, or -1 on error + /// + //////////////////////////////////////////////////////////// + virtual Int64 getSize() = 0; +}; + +} // namespace sf + + +#endif // SFML_INPUTSTREAM_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::InputStream +/// \ingroup system +/// +/// This class allows users to define their own file input sources +/// from which SFML can load resources. +/// +/// SFML resource classes like sf::Texture and +/// sf::SoundBuffer provide loadFromFile and loadFromMemory functions, +/// which read data from conventional sources. However, if you +/// have data coming from a different source (over a network, +/// embedded, encrypted, compressed, etc) you can derive your +/// own class from sf::InputStream and load SFML resources with +/// their loadFromStream function. +/// +/// Usage example: +/// \code +/// // custom stream class that reads from inside a zip file +/// class ZipStream : public sf::InputStream +/// { +/// public: +/// +/// ZipStream(std::string archive); +/// +/// bool open(std::string filename); +/// +/// Int64 read(void* data, Int64 size); +/// +/// Int64 seek(Int64 position); +/// +/// Int64 tell(); +/// +/// Int64 getSize(); +/// +/// private: +/// +/// ... +/// }; +/// +/// // now you can load textures... +/// sf::Texture texture; +/// ZipStream stream("resources.zip"); +/// stream.open("images/img.png"); +/// texture.loadFromStream(stream); +/// +/// // musics... +/// sf::Music music; +/// ZipStream stream("resources.zip"); +/// stream.open("musics/msc.ogg"); +/// music.openFromStream(stream); +/// +/// // etc. +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Lock.hpp b/SFML-2.4.2/include/SFML/System/Lock.hpp new file mode 100644 index 0000000..eb420a8 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Lock.hpp @@ -0,0 +1,139 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_LOCK_HPP +#define SFML_LOCK_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +class Mutex; + +//////////////////////////////////////////////////////////// +/// \brief Automatic wrapper for locking and unlocking mutexes +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API Lock : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Construct the lock with a target mutex + /// + /// The mutex passed to sf::Lock is automatically locked. + /// + /// \param mutex Mutex to lock + /// + //////////////////////////////////////////////////////////// + explicit Lock(Mutex& mutex); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + /// The destructor of sf::Lock automatically unlocks its mutex. + /// + //////////////////////////////////////////////////////////// + ~Lock(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Mutex& m_mutex; ///< Mutex to lock / unlock +}; + +} // namespace sf + + +#endif // SFML_LOCK_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Lock +/// \ingroup system +/// +/// sf::Lock is a RAII wrapper for sf::Mutex. By unlocking +/// it in its destructor, it ensures that the mutex will +/// always be released when the current scope (most likely +/// a function) ends. +/// This is even more important when an exception or an early +/// return statement can interrupt the execution flow of the +/// function. +/// +/// For maximum robustness, sf::Lock should always be used +/// to lock/unlock a mutex. +/// +/// Usage example: +/// \code +/// sf::Mutex mutex; +/// +/// void function() +/// { +/// sf::Lock lock(mutex); // mutex is now locked +/// +/// functionThatMayThrowAnException(); // mutex is unlocked if this function throws +/// +/// if (someCondition) +/// return; // mutex is unlocked +/// +/// } // mutex is unlocked +/// \endcode +/// +/// Because the mutex is not explicitly unlocked in the code, +/// it may remain locked longer than needed. If the region +/// of the code that needs to be protected by the mutex is +/// not the entire function, a good practice is to create a +/// smaller, inner scope so that the lock is limited to this +/// part of the code. +/// +/// \code +/// sf::Mutex mutex; +/// +/// void function() +/// { +/// { +/// sf::Lock lock(mutex); +/// codeThatRequiresProtection(); +/// +/// } // mutex is unlocked here +/// +/// codeThatDoesntCareAboutTheMutex(); +/// } +/// \endcode +/// +/// Having a mutex locked longer than required is a bad practice +/// which can lead to bad performances. Don't forget that when +/// a mutex is locked, other threads may be waiting doing nothing +/// until it is released. +/// +/// \see sf::Mutex +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/MemoryInputStream.hpp b/SFML-2.4.2/include/SFML/System/MemoryInputStream.hpp new file mode 100644 index 0000000..c26f823 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/MemoryInputStream.hpp @@ -0,0 +1,148 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_MEMORYINPUTSTREAM_HPP +#define SFML_MEMORYINPUTSTREAM_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Implementation of input stream based on a memory chunk +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API MemoryInputStream : public InputStream +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + MemoryInputStream(); + + //////////////////////////////////////////////////////////// + /// \brief Open the stream from its data + /// + /// \param data Pointer to the data in memory + /// \param sizeInBytes Size of the data, in bytes + /// + //////////////////////////////////////////////////////////// + void open(const void* data, std::size_t sizeInBytes); + + //////////////////////////////////////////////////////////// + /// \brief Read data from the stream + /// + /// After reading, the stream's reading position must be + /// advanced by the amount of bytes read. + /// + /// \param data Buffer where to copy the read data + /// \param size Desired number of bytes to read + /// + /// \return The number of bytes actually read, or -1 on error + /// + //////////////////////////////////////////////////////////// + virtual Int64 read(void* data, Int64 size); + + //////////////////////////////////////////////////////////// + /// \brief Change the current reading position + /// + /// \param position The position to seek to, from the beginning + /// + /// \return The position actually sought to, or -1 on error + /// + //////////////////////////////////////////////////////////// + virtual Int64 seek(Int64 position); + + //////////////////////////////////////////////////////////// + /// \brief Get the current reading position in the stream + /// + /// \return The current position, or -1 on error. + /// + //////////////////////////////////////////////////////////// + virtual Int64 tell(); + + //////////////////////////////////////////////////////////// + /// \brief Return the size of the stream + /// + /// \return The total number of bytes available in the stream, or -1 on error + /// + //////////////////////////////////////////////////////////// + virtual Int64 getSize(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + const char* m_data; ///< Pointer to the data in memory + Int64 m_size; ///< Total size of the data + Int64 m_offset; ///< Current reading position +}; + +} // namespace sf + + +#endif // SFML_MEMORYINPUTSTREAM_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::MemoryInputStream +/// \ingroup system +/// +/// This class is a specialization of InputStream that +/// reads from data in memory. +/// +/// It wraps a memory chunk in the common InputStream interface +/// and therefore allows to use generic classes or functions +/// that accept such a stream, with content already loaded in memory. +/// +/// In addition to the virtual functions inherited from +/// InputStream, MemoryInputStream adds a function to +/// specify the pointer and size of the data in memory. +/// +/// SFML resource classes can usually be loaded directly from +/// memory, so this class shouldn't be useful to you unless +/// you create your own algorithms that operate on an InputStream. +/// +/// Usage example: +/// \code +/// void process(InputStream& stream); +/// +/// MemoryInputStream stream; +/// stream.open(thePtr, theSize); +/// process(stream); +/// \endcode +/// +/// InputStream, FileInputStream +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Mutex.hpp b/SFML-2.4.2/include/SFML/System/Mutex.hpp new file mode 100644 index 0000000..18349e4 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Mutex.hpp @@ -0,0 +1,148 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_MUTEX_HPP +#define SFML_MUTEX_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +namespace priv +{ + class MutexImpl; +} + +//////////////////////////////////////////////////////////// +/// \brief Blocks concurrent access to shared resources +/// from multiple threads +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API Mutex : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + Mutex(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~Mutex(); + + //////////////////////////////////////////////////////////// + /// \brief Lock the mutex + /// + /// If the mutex is already locked in another thread, + /// this call will block the execution until the mutex + /// is released. + /// + /// \see unlock + /// + //////////////////////////////////////////////////////////// + void lock(); + + //////////////////////////////////////////////////////////// + /// \brief Unlock the mutex + /// + /// \see lock + /// + //////////////////////////////////////////////////////////// + void unlock(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + priv::MutexImpl* m_mutexImpl; ///< OS-specific implementation +}; + +} // namespace sf + + +#endif // SFML_MUTEX_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Mutex +/// \ingroup system +/// +/// Mutex stands for "MUTual EXclusion". A mutex is a +/// synchronization object, used when multiple threads are involved. +/// +/// When you want to protect a part of the code from being accessed +/// simultaneously by multiple threads, you typically use a +/// mutex. When a thread is locked by a mutex, any other thread +/// trying to lock it will be blocked until the mutex is released +/// by the thread that locked it. This way, you can allow only +/// one thread at a time to access a critical region of your code. +/// +/// Usage example: +/// \code +/// Database database; // this is a critical resource that needs some protection +/// sf::Mutex mutex; +/// +/// void thread1() +/// { +/// mutex.lock(); // this call will block the thread if the mutex is already locked by thread2 +/// database.write(...); +/// mutex.unlock(); // if thread2 was waiting, it will now be unblocked +/// } +/// +/// void thread2() +/// { +/// mutex.lock(); // this call will block the thread if the mutex is already locked by thread1 +/// database.write(...); +/// mutex.unlock(); // if thread1 was waiting, it will now be unblocked +/// } +/// \endcode +/// +/// Be very careful with mutexes. A bad usage can lead to bad problems, +/// like deadlocks (two threads are waiting for each other and the +/// application is globally stuck). +/// +/// To make the usage of mutexes more robust, particularly in +/// environments where exceptions can be thrown, you should +/// use the helper class sf::Lock to lock/unlock mutexes. +/// +/// SFML mutexes are recursive, which means that you can lock +/// a mutex multiple times in the same thread without creating +/// a deadlock. In this case, the first call to lock() behaves +/// as usual, and the following ones have no effect. +/// However, you must call unlock() exactly as many times as you +/// called lock(). If you don't, the mutex won't be released. +/// +/// \see sf::Lock +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/NativeActivity.hpp b/SFML-2.4.2/include/SFML/System/NativeActivity.hpp new file mode 100644 index 0000000..7927620 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/NativeActivity.hpp @@ -0,0 +1,62 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_NATIVEACTIVITY_HPP +#define SFML_NATIVEACTIVITY_HPP + + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +#if !defined(SFML_SYSTEM_ANDROID) +#error NativeActivity.hpp: This header is Android only. +#endif + + +struct ANativeActivity; + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \ingroup system +/// \brief Return a pointer to the Android native activity +/// +/// You shouldn't have to use this function, unless you want +/// to implement very specific details, that SFML doesn't +/// support, or to use a workaround for a known issue. +/// +/// \return Pointer to Android native activity structure +/// +/// \sfplatform{Android,SFML/System/NativeActivity.hpp} +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API ANativeActivity* getNativeActivity(); + +} // namespace sf + + +#endif // SFML_NATIVEACTIVITY_HPP diff --git a/SFML-2.4.2/include/SFML/System/NonCopyable.hpp b/SFML-2.4.2/include/SFML/System/NonCopyable.hpp new file mode 100644 index 0000000..7a483bc --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/NonCopyable.hpp @@ -0,0 +1,119 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_NONCOPYABLE_HPP +#define SFML_NONCOPYABLE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Utility class that makes any derived +/// class non-copyable +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API NonCopyable +{ +protected: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Because this class has a copy constructor, the compiler + /// will not automatically generate the default constructor. + /// That's why we must define it explicitly. + /// + //////////////////////////////////////////////////////////// + NonCopyable() {} + +private: + + //////////////////////////////////////////////////////////// + /// \brief Disabled copy constructor + /// + /// By making the copy constructor private, the compiler will + /// trigger an error if anyone outside tries to use it. + /// To prevent NonCopyable or friend classes from using it, + /// we also give no definition, so that the linker will + /// produce an error if the first protection was inefficient. + /// + //////////////////////////////////////////////////////////// + NonCopyable(const NonCopyable&); + + //////////////////////////////////////////////////////////// + /// \brief Disabled assignment operator + /// + /// By making the assignment operator private, the compiler will + /// trigger an error if anyone outside tries to use it. + /// To prevent NonCopyable or friend classes from using it, + /// we also give no definition, so that the linker will + /// produce an error if the first protection was inefficient. + /// + //////////////////////////////////////////////////////////// + NonCopyable& operator =(const NonCopyable&); +}; + +} // namespace sf + + +#endif // SFML_NONCOPYABLE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::NonCopyable +/// \ingroup system +/// +/// This class makes its instances non-copyable, by explicitly +/// disabling its copy constructor and its assignment operator. +/// +/// To create a non-copyable class, simply inherit from +/// sf::NonCopyable. +/// +/// The type of inheritance (public or private) doesn't matter, +/// the copy constructor and assignment operator are declared private +/// in sf::NonCopyable so they will end up being inaccessible in both +/// cases. Thus you can use a shorter syntax for inheriting from it +/// (see below). +/// +/// Usage example: +/// \code +/// class MyNonCopyableClass : sf::NonCopyable +/// { +/// ... +/// }; +/// \endcode +/// +/// Deciding whether the instances of a class can be copied +/// or not is a very important design choice. You are strongly +/// encouraged to think about it before writing a class, +/// and to use sf::NonCopyable when necessary to prevent +/// many potential future errors when using it. This is also +/// a very important indication to users of your class. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Sleep.hpp b/SFML-2.4.2/include/SFML/System/Sleep.hpp new file mode 100644 index 0000000..e943aa1 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Sleep.hpp @@ -0,0 +1,52 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SLEEP_HPP +#define SFML_SLEEP_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \ingroup system +/// \brief Make the current thread sleep for a given duration +/// +/// sf::sleep is the best way to block a program or one of its +/// threads, as it doesn't consume any CPU power. +/// +/// \param duration Time to sleep +/// +//////////////////////////////////////////////////////////// +void SFML_SYSTEM_API sleep(Time duration); + +} // namespace sf + + +#endif // SFML_SLEEP_HPP diff --git a/SFML-2.4.2/include/SFML/System/String.hpp b/SFML-2.4.2/include/SFML/System/String.hpp new file mode 100644 index 0000000..8b0da3f --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/String.hpp @@ -0,0 +1,669 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_STRING_HPP +#define SFML_STRING_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Utility string class that automatically handles +/// conversions between types and encodings +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API String +{ +public: + + //////////////////////////////////////////////////////////// + // Types + //////////////////////////////////////////////////////////// + typedef std::basic_string::iterator Iterator; ///< Iterator type + typedef std::basic_string::const_iterator ConstIterator; ///< Read-only iterator type + + //////////////////////////////////////////////////////////// + // Static member data + //////////////////////////////////////////////////////////// + static const std::size_t InvalidPos; ///< Represents an invalid position in the string + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor creates an empty string. + /// + //////////////////////////////////////////////////////////// + String(); + + //////////////////////////////////////////////////////////// + /// \brief Construct from a single ANSI character and a locale + /// + /// The source character is converted to UTF-32 according + /// to the given locale. + /// + /// \param ansiChar ANSI character to convert + /// \param locale Locale to use for conversion + /// + //////////////////////////////////////////////////////////// + String(char ansiChar, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Construct from single wide character + /// + /// \param wideChar Wide character to convert + /// + //////////////////////////////////////////////////////////// + String(wchar_t wideChar); + + //////////////////////////////////////////////////////////// + /// \brief Construct from single UTF-32 character + /// + /// \param utf32Char UTF-32 character to convert + /// + //////////////////////////////////////////////////////////// + String(Uint32 utf32Char); + + //////////////////////////////////////////////////////////// + /// \brief Construct from a null-terminated C-style ANSI string and a locale + /// + /// The source string is converted to UTF-32 according + /// to the given locale. + /// + /// \param ansiString ANSI string to convert + /// \param locale Locale to use for conversion + /// + //////////////////////////////////////////////////////////// + String(const char* ansiString, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Construct from an ANSI string and a locale + /// + /// The source string is converted to UTF-32 according + /// to the given locale. + /// + /// \param ansiString ANSI string to convert + /// \param locale Locale to use for conversion + /// + //////////////////////////////////////////////////////////// + String(const std::string& ansiString, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Construct from null-terminated C-style wide string + /// + /// \param wideString Wide string to convert + /// + //////////////////////////////////////////////////////////// + String(const wchar_t* wideString); + + //////////////////////////////////////////////////////////// + /// \brief Construct from a wide string + /// + /// \param wideString Wide string to convert + /// + //////////////////////////////////////////////////////////// + String(const std::wstring& wideString); + + //////////////////////////////////////////////////////////// + /// \brief Construct from a null-terminated C-style UTF-32 string + /// + /// \param utf32String UTF-32 string to assign + /// + //////////////////////////////////////////////////////////// + String(const Uint32* utf32String); + + //////////////////////////////////////////////////////////// + /// \brief Construct from an UTF-32 string + /// + /// \param utf32String UTF-32 string to assign + /// + //////////////////////////////////////////////////////////// + String(const std::basic_string& utf32String); + + //////////////////////////////////////////////////////////// + /// \brief Copy constructor + /// + /// \param copy Instance to copy + /// + //////////////////////////////////////////////////////////// + String(const String& copy); + + //////////////////////////////////////////////////////////// + /// \brief Create a new sf::String from a UTF-8 encoded string + /// + /// \param begin Forward iterator to the beginning of the UTF-8 sequence + /// \param end Forward iterator to the end of the UTF-8 sequence + /// + /// \return A sf::String containing the source string + /// + /// \see fromUtf16, fromUtf32 + /// + //////////////////////////////////////////////////////////// + template + static String fromUtf8(T begin, T end); + + //////////////////////////////////////////////////////////// + /// \brief Create a new sf::String from a UTF-16 encoded string + /// + /// \param begin Forward iterator to the beginning of the UTF-16 sequence + /// \param end Forward iterator to the end of the UTF-16 sequence + /// + /// \return A sf::String containing the source string + /// + /// \see fromUtf8, fromUtf32 + /// + //////////////////////////////////////////////////////////// + template + static String fromUtf16(T begin, T end); + + //////////////////////////////////////////////////////////// + /// \brief Create a new sf::String from a UTF-32 encoded string + /// + /// This function is provided for consistency, it is equivalent to + /// using the constructors that takes a const sf::Uint32* or + /// a std::basic_string. + /// + /// \param begin Forward iterator to the beginning of the UTF-32 sequence + /// \param end Forward iterator to the end of the UTF-32 sequence + /// + /// \return A sf::String containing the source string + /// + /// \see fromUtf8, fromUtf16 + /// + //////////////////////////////////////////////////////////// + template + static String fromUtf32(T begin, T end); + + //////////////////////////////////////////////////////////// + /// \brief Implicit conversion operator to std::string (ANSI string) + /// + /// The current global locale is used for conversion. If you + /// want to explicitly specify a locale, see toAnsiString. + /// Characters that do not fit in the target encoding are + /// discarded from the returned string. + /// This operator is defined for convenience, and is equivalent + /// to calling toAnsiString(). + /// + /// \return Converted ANSI string + /// + /// \see toAnsiString, operator std::wstring + /// + //////////////////////////////////////////////////////////// + operator std::string() const; + + //////////////////////////////////////////////////////////// + /// \brief Implicit conversion operator to std::wstring (wide string) + /// + /// Characters that do not fit in the target encoding are + /// discarded from the returned string. + /// This operator is defined for convenience, and is equivalent + /// to calling toWideString(). + /// + /// \return Converted wide string + /// + /// \see toWideString, operator std::string + /// + //////////////////////////////////////////////////////////// + operator std::wstring() const; + + //////////////////////////////////////////////////////////// + /// \brief Convert the Unicode string to an ANSI string + /// + /// The UTF-32 string is converted to an ANSI string in + /// the encoding defined by \a locale. + /// Characters that do not fit in the target encoding are + /// discarded from the returned string. + /// + /// \param locale Locale to use for conversion + /// + /// \return Converted ANSI string + /// + /// \see toWideString, operator std::string + /// + //////////////////////////////////////////////////////////// + std::string toAnsiString(const std::locale& locale = std::locale()) const; + + //////////////////////////////////////////////////////////// + /// \brief Convert the Unicode string to a wide string + /// + /// Characters that do not fit in the target encoding are + /// discarded from the returned string. + /// + /// \return Converted wide string + /// + /// \see toAnsiString, operator std::wstring + /// + //////////////////////////////////////////////////////////// + std::wstring toWideString() const; + + //////////////////////////////////////////////////////////// + /// \brief Convert the Unicode string to a UTF-8 string + /// + /// \return Converted UTF-8 string + /// + /// \see toUtf16, toUtf32 + /// + //////////////////////////////////////////////////////////// + std::basic_string toUtf8() const; + + //////////////////////////////////////////////////////////// + /// \brief Convert the Unicode string to a UTF-16 string + /// + /// \return Converted UTF-16 string + /// + /// \see toUtf8, toUtf32 + /// + //////////////////////////////////////////////////////////// + std::basic_string toUtf16() const; + + //////////////////////////////////////////////////////////// + /// \brief Convert the Unicode string to a UTF-32 string + /// + /// This function doesn't perform any conversion, since the + /// string is already stored as UTF-32 internally. + /// + /// \return Converted UTF-32 string + /// + /// \see toUtf8, toUtf16 + /// + //////////////////////////////////////////////////////////// + std::basic_string toUtf32() const; + + //////////////////////////////////////////////////////////// + /// \brief Overload of assignment operator + /// + /// \param right Instance to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + String& operator =(const String& right); + + //////////////////////////////////////////////////////////// + /// \brief Overload of += operator to append an UTF-32 string + /// + /// \param right String to append + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + String& operator +=(const String& right); + + //////////////////////////////////////////////////////////// + /// \brief Overload of [] operator to access a character by its position + /// + /// This function provides read-only access to characters. + /// Note: the behavior is undefined if \a index is out of range. + /// + /// \param index Index of the character to get + /// + /// \return Character at position \a index + /// + //////////////////////////////////////////////////////////// + Uint32 operator [](std::size_t index) const; + + //////////////////////////////////////////////////////////// + /// \brief Overload of [] operator to access a character by its position + /// + /// This function provides read and write access to characters. + /// Note: the behavior is undefined if \a index is out of range. + /// + /// \param index Index of the character to get + /// + /// \return Reference to the character at position \a index + /// + //////////////////////////////////////////////////////////// + Uint32& operator [](std::size_t index); + + //////////////////////////////////////////////////////////// + /// \brief Clear the string + /// + /// This function removes all the characters from the string. + /// + /// \see isEmpty, erase + /// + //////////////////////////////////////////////////////////// + void clear(); + + //////////////////////////////////////////////////////////// + /// \brief Get the size of the string + /// + /// \return Number of characters in the string + /// + /// \see isEmpty + /// + //////////////////////////////////////////////////////////// + std::size_t getSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Check whether the string is empty or not + /// + /// \return True if the string is empty (i.e. contains no character) + /// + /// \see clear, getSize + /// + //////////////////////////////////////////////////////////// + bool isEmpty() const; + + //////////////////////////////////////////////////////////// + /// \brief Erase one or more characters from the string + /// + /// This function removes a sequence of \a count characters + /// starting from \a position. + /// + /// \param position Position of the first character to erase + /// \param count Number of characters to erase + /// + //////////////////////////////////////////////////////////// + void erase(std::size_t position, std::size_t count = 1); + + //////////////////////////////////////////////////////////// + /// \brief Insert one or more characters into the string + /// + /// This function inserts the characters of \a str + /// into the string, starting from \a position. + /// + /// \param position Position of insertion + /// \param str Characters to insert + /// + //////////////////////////////////////////////////////////// + void insert(std::size_t position, const String& str); + + //////////////////////////////////////////////////////////// + /// \brief Find a sequence of one or more characters in the string + /// + /// This function searches for the characters of \a str + /// in the string, starting from \a start. + /// + /// \param str Characters to find + /// \param start Where to begin searching + /// + /// \return Position of \a str in the string, or String::InvalidPos if not found + /// + //////////////////////////////////////////////////////////// + std::size_t find(const String& str, std::size_t start = 0) const; + + //////////////////////////////////////////////////////////// + /// \brief Replace a substring with another string + /// + /// This function replaces the substring that starts at index \a position + /// and spans \a length characters with the string \a replaceWith. + /// + /// \param position Index of the first character to be replaced + /// \param length Number of characters to replace. You can pass InvalidPos to + /// replace all characters until the end of the string. + /// \param replaceWith String that replaces the given substring. + /// + //////////////////////////////////////////////////////////// + void replace(std::size_t position, std::size_t length, const String& replaceWith); + + //////////////////////////////////////////////////////////// + /// \brief Replace all occurrences of a substring with a replacement string + /// + /// This function replaces all occurrences of \a searchFor in this string + /// with the string \a replaceWith. + /// + /// \param searchFor The value being searched for + /// \param replaceWith The value that replaces found \a searchFor values + /// + //////////////////////////////////////////////////////////// + void replace(const String& searchFor, const String& replaceWith); + + //////////////////////////////////////////////////////////// + /// \brief Return a part of the string + /// + /// This function returns the substring that starts at index \a position + /// and spans \a length characters. + /// + /// \param position Index of the first character + /// \param length Number of characters to include in the substring (if + /// the string is shorter, as many characters as possible + /// are included). \ref InvalidPos can be used to include all + /// characters until the end of the string. + /// + /// \return String object containing a substring of this object + /// + //////////////////////////////////////////////////////////// + String substring(std::size_t position, std::size_t length = InvalidPos) const; + + //////////////////////////////////////////////////////////// + /// \brief Get a pointer to the C-style array of characters + /// + /// This functions provides a read-only access to a + /// null-terminated C-style representation of the string. + /// The returned pointer is temporary and is meant only for + /// immediate use, thus it is not recommended to store it. + /// + /// \return Read-only pointer to the array of characters + /// + //////////////////////////////////////////////////////////// + const Uint32* getData() const; + + //////////////////////////////////////////////////////////// + /// \brief Return an iterator to the beginning of the string + /// + /// \return Read-write iterator to the beginning of the string characters + /// + /// \see end + /// + //////////////////////////////////////////////////////////// + Iterator begin(); + + //////////////////////////////////////////////////////////// + /// \brief Return an iterator to the beginning of the string + /// + /// \return Read-only iterator to the beginning of the string characters + /// + /// \see end + /// + //////////////////////////////////////////////////////////// + ConstIterator begin() const; + + //////////////////////////////////////////////////////////// + /// \brief Return an iterator to the end of the string + /// + /// The end iterator refers to 1 position past the last character; + /// thus it represents an invalid character and should never be + /// accessed. + /// + /// \return Read-write iterator to the end of the string characters + /// + /// \see begin + /// + //////////////////////////////////////////////////////////// + Iterator end(); + + //////////////////////////////////////////////////////////// + /// \brief Return an iterator to the end of the string + /// + /// The end iterator refers to 1 position past the last character; + /// thus it represents an invalid character and should never be + /// accessed. + /// + /// \return Read-only iterator to the end of the string characters + /// + /// \see begin + /// + //////////////////////////////////////////////////////////// + ConstIterator end() const; + +private: + + friend SFML_SYSTEM_API bool operator ==(const String& left, const String& right); + friend SFML_SYSTEM_API bool operator <(const String& left, const String& right); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + std::basic_string m_string; ///< Internal string of UTF-32 characters +}; + +//////////////////////////////////////////////////////////// +/// \relates String +/// \brief Overload of == operator to compare two UTF-32 strings +/// +/// \param left Left operand (a string) +/// \param right Right operand (a string) +/// +/// \return True if both strings are equal +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator ==(const String& left, const String& right); + +//////////////////////////////////////////////////////////// +/// \relates String +/// \brief Overload of != operator to compare two UTF-32 strings +/// +/// \param left Left operand (a string) +/// \param right Right operand (a string) +/// +/// \return True if both strings are different +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator !=(const String& left, const String& right); + +//////////////////////////////////////////////////////////// +/// \relates String +/// \brief Overload of < operator to compare two UTF-32 strings +/// +/// \param left Left operand (a string) +/// \param right Right operand (a string) +/// +/// \return True if \a left is lexicographically before \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator <(const String& left, const String& right); + +//////////////////////////////////////////////////////////// +/// \relates String +/// \brief Overload of > operator to compare two UTF-32 strings +/// +/// \param left Left operand (a string) +/// \param right Right operand (a string) +/// +/// \return True if \a left is lexicographically after \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator >(const String& left, const String& right); + +//////////////////////////////////////////////////////////// +/// \relates String +/// \brief Overload of <= operator to compare two UTF-32 strings +/// +/// \param left Left operand (a string) +/// \param right Right operand (a string) +/// +/// \return True if \a left is lexicographically before or equivalent to \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator <=(const String& left, const String& right); + +//////////////////////////////////////////////////////////// +/// \relates String +/// \brief Overload of >= operator to compare two UTF-32 strings +/// +/// \param left Left operand (a string) +/// \param right Right operand (a string) +/// +/// \return True if \a left is lexicographically after or equivalent to \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator >=(const String& left, const String& right); + +//////////////////////////////////////////////////////////// +/// \relates String +/// \brief Overload of binary + operator to concatenate two strings +/// +/// \param left Left operand (a string) +/// \param right Right operand (a string) +/// +/// \return Concatenated string +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API String operator +(const String& left, const String& right); + +#include + +} // namespace sf + + +#endif // SFML_STRING_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::String +/// \ingroup system +/// +/// sf::String is a utility string class defined mainly for +/// convenience. It is a Unicode string (implemented using +/// UTF-32), thus it can store any character in the world +/// (European, Chinese, Arabic, Hebrew, etc.). +/// +/// It automatically handles conversions from/to ANSI and +/// wide strings, so that you can work with standard string +/// classes and still be compatible with functions taking a +/// sf::String. +/// +/// \code +/// sf::String s; +/// +/// std::string s1 = s; // automatically converted to ANSI string +/// std::wstring s2 = s; // automatically converted to wide string +/// s = "hello"; // automatically converted from ANSI string +/// s = L"hello"; // automatically converted from wide string +/// s += 'a'; // automatically converted from ANSI string +/// s += L'a'; // automatically converted from wide string +/// \endcode +/// +/// Conversions involving ANSI strings use the default user locale. However +/// it is possible to use a custom locale if necessary: +/// \code +/// std::locale locale; +/// sf::String s; +/// ... +/// std::string s1 = s.toAnsiString(locale); +/// s = sf::String("hello", locale); +/// \endcode +/// +/// sf::String defines the most important functions of the +/// standard std::string class: removing, random access, iterating, +/// appending, comparing, etc. However it is a simple class +/// provided for convenience, and you may have to consider using +/// a more optimized class if your program requires complex string +/// handling. The automatic conversion functions will then take +/// care of converting your string to sf::String whenever SFML +/// requires it. +/// +/// Please note that SFML also defines a low-level, generic +/// interface for Unicode handling, see the sf::Utf classes. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/String.inl b/SFML-2.4.2/include/SFML/System/String.inl new file mode 100644 index 0000000..1be1266 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/String.inl @@ -0,0 +1,53 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +template +String String::fromUtf8(T begin, T end) +{ + String string; + Utf8::toUtf32(begin, end, std::back_inserter(string.m_string)); + return string; +} + + +//////////////////////////////////////////////////////////// +template +String String::fromUtf16(T begin, T end) +{ + String string; + Utf16::toUtf32(begin, end, std::back_inserter(string.m_string)); + return string; +} + + +//////////////////////////////////////////////////////////// +template +String String::fromUtf32(T begin, T end) +{ + String string; + string.m_string.assign(begin, end); + return string; +} diff --git a/SFML-2.4.2/include/SFML/System/Thread.hpp b/SFML-2.4.2/include/SFML/System/Thread.hpp new file mode 100644 index 0000000..65c9127 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Thread.hpp @@ -0,0 +1,282 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_THREAD_HPP +#define SFML_THREAD_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +namespace priv +{ + class ThreadImpl; + struct ThreadFunc; +} + +//////////////////////////////////////////////////////////// +/// \brief Utility class to manipulate threads +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API Thread : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Construct the thread from a functor with no argument + /// + /// This constructor works for function objects, as well + /// as free functions. + /// + /// Use this constructor for this kind of function: + /// \code + /// void function(); + /// + /// // --- or ---- + /// + /// struct Functor + /// { + /// void operator()(); + /// }; + /// \endcode + /// Note: this does *not* run the thread, use launch(). + /// + /// \param function Functor or free function to use as the entry point of the thread + /// + //////////////////////////////////////////////////////////// + template + Thread(F function); + + //////////////////////////////////////////////////////////// + /// \brief Construct the thread from a functor with an argument + /// + /// This constructor works for function objects, as well + /// as free functions. + /// It is a template, which means that the argument can + /// have any type (int, std::string, void*, Toto, ...). + /// + /// Use this constructor for this kind of function: + /// \code + /// void function(int arg); + /// + /// // --- or ---- + /// + /// struct Functor + /// { + /// void operator()(std::string arg); + /// }; + /// \endcode + /// Note: this does *not* run the thread, use launch(). + /// + /// \param function Functor or free function to use as the entry point of the thread + /// \param argument argument to forward to the function + /// + //////////////////////////////////////////////////////////// + template + Thread(F function, A argument); + + //////////////////////////////////////////////////////////// + /// \brief Construct the thread from a member function and an object + /// + /// This constructor is a template, which means that you can + /// use it with any class. + /// Use this constructor for this kind of function: + /// \code + /// class MyClass + /// { + /// public: + /// + /// void function(); + /// }; + /// \endcode + /// Note: this does *not* run the thread, use launch(). + /// + /// \param function Entry point of the thread + /// \param object Pointer to the object to use + /// + //////////////////////////////////////////////////////////// + template + Thread(void(C::*function)(), C* object); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + /// This destructor calls wait(), so that the internal thread + /// cannot survive after its sf::Thread instance is destroyed. + /// + //////////////////////////////////////////////////////////// + ~Thread(); + + //////////////////////////////////////////////////////////// + /// \brief Run the thread + /// + /// This function starts the entry point passed to the + /// thread's constructor, and returns immediately. + /// After this function returns, the thread's function is + /// running in parallel to the calling code. + /// + //////////////////////////////////////////////////////////// + void launch(); + + //////////////////////////////////////////////////////////// + /// \brief Wait until the thread finishes + /// + /// This function will block the execution until the + /// thread's function ends. + /// Warning: if the thread function never ends, the calling + /// thread will block forever. + /// If this function is called from its owner thread, it + /// returns without doing anything. + /// + //////////////////////////////////////////////////////////// + void wait(); + + //////////////////////////////////////////////////////////// + /// \brief Terminate the thread + /// + /// This function immediately stops the thread, without waiting + /// for its function to finish. + /// Terminating a thread with this function is not safe, + /// and can lead to local variables not being destroyed + /// on some operating systems. You should rather try to make + /// the thread function terminate by itself. + /// + //////////////////////////////////////////////////////////// + void terminate(); + +private: + + friend class priv::ThreadImpl; + + //////////////////////////////////////////////////////////// + /// \brief Internal entry point of the thread + /// + /// This function is called by the thread implementation. + /// + //////////////////////////////////////////////////////////// + void run(); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + priv::ThreadImpl* m_impl; ///< OS-specific implementation of the thread + priv::ThreadFunc* m_entryPoint; ///< Abstraction of the function to run +}; + +#include + +} // namespace sf + +#endif // SFML_THREAD_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Thread +/// \ingroup system +/// +/// Threads provide a way to run multiple parts of the code +/// in parallel. When you launch a new thread, the execution +/// is split and both the new thread and the caller run +/// in parallel. +/// +/// To use a sf::Thread, you construct it directly with the +/// function to execute as the entry point of the thread. +/// sf::Thread has multiple template constructors, which means +/// that you can use several types of entry points: +/// \li non-member functions with no argument +/// \li non-member functions with one argument of any type +/// \li functors with no argument (this one is particularly useful for compatibility with boost/std::%bind) +/// \li functors with one argument of any type +/// \li member functions from any class with no argument +/// +/// The function argument, if any, is copied in the sf::Thread +/// instance, as well as the functor (if the corresponding +/// constructor is used). Class instances, however, are passed +/// by pointer so you must make sure that the object won't be +/// destroyed while the thread is still using it. +/// +/// The thread ends when its function is terminated. If the +/// owner sf::Thread instance is destroyed before the +/// thread is finished, the destructor will wait (see wait()) +/// +/// Usage examples: +/// \code +/// // example 1: non member function with one argument +/// +/// void threadFunc(int argument) +/// { +/// ... +/// } +/// +/// sf::Thread thread(&threadFunc, 5); +/// thread.launch(); // start the thread (internally calls threadFunc(5)) +/// \endcode +/// +/// \code +/// // example 2: member function +/// +/// class Task +/// { +/// public: +/// void run() +/// { +/// ... +/// } +/// }; +/// +/// Task task; +/// sf::Thread thread(&Task::run, &task); +/// thread.launch(); // start the thread (internally calls task.run()) +/// \endcode +/// +/// \code +/// // example 3: functor +/// +/// struct Task +/// { +/// void operator()() +/// { +/// ... +/// } +/// }; +/// +/// sf::Thread thread(Task()); +/// thread.launch(); // start the thread (internally calls operator() on the Task instance) +/// \endcode +/// +/// Creating parallel threads of execution can be dangerous: +/// all threads inside the same process share the same memory space, +/// which means that you may end up accessing the same variable +/// from multiple threads at the same time. To prevent this +/// kind of situations, you can use mutexes (see sf::Mutex). +/// +/// \see sf::Mutex +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Thread.inl b/SFML-2.4.2/include/SFML/System/Thread.inl new file mode 100644 index 0000000..b707aa3 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Thread.inl @@ -0,0 +1,90 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +namespace priv +{ +// Base class for abstract thread functions +struct ThreadFunc +{ + virtual ~ThreadFunc() {} + virtual void run() = 0; +}; + +// Specialization using a functor (including free functions) with no argument +template +struct ThreadFunctor : ThreadFunc +{ + ThreadFunctor(T functor) : m_functor(functor) {} + virtual void run() {m_functor();} + T m_functor; +}; + +// Specialization using a functor (including free functions) with one argument +template +struct ThreadFunctorWithArg : ThreadFunc +{ + ThreadFunctorWithArg(F function, A arg) : m_function(function), m_arg(arg) {} + virtual void run() {m_function(m_arg);} + F m_function; + A m_arg; +}; + +// Specialization using a member function +template +struct ThreadMemberFunc : ThreadFunc +{ + ThreadMemberFunc(void(C::*function)(), C* object) : m_function(function), m_object(object) {} + virtual void run() {(m_object->*m_function)();} + void(C::*m_function)(); + C* m_object; +}; + +} // namespace priv + + +//////////////////////////////////////////////////////////// +template +Thread::Thread(F functor) : +m_impl (NULL), +m_entryPoint(new priv::ThreadFunctor(functor)) +{ +} + + +//////////////////////////////////////////////////////////// +template +Thread::Thread(F function, A argument) : +m_impl (NULL), +m_entryPoint(new priv::ThreadFunctorWithArg(function, argument)) +{ +} + + +//////////////////////////////////////////////////////////// +template +Thread::Thread(void(C::*function)(), C* object) : +m_impl (NULL), +m_entryPoint(new priv::ThreadMemberFunc(function, object)) +{ +} diff --git a/SFML-2.4.2/include/SFML/System/ThreadLocal.hpp b/SFML-2.4.2/include/SFML/System/ThreadLocal.hpp new file mode 100644 index 0000000..6975e52 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/ThreadLocal.hpp @@ -0,0 +1,103 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_THREADLOCAL_HPP +#define SFML_THREADLOCAL_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +namespace priv +{ + class ThreadLocalImpl; +} + +//////////////////////////////////////////////////////////// +/// \brief Defines variables with thread-local storage +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API ThreadLocal : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// \param value Optional value to initialize the variable + /// + //////////////////////////////////////////////////////////// + ThreadLocal(void* value = NULL); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~ThreadLocal(); + + //////////////////////////////////////////////////////////// + /// \brief Set the thread-specific value of the variable + /// + /// \param value Value of the variable for the current thread + /// + //////////////////////////////////////////////////////////// + void setValue(void* value); + + //////////////////////////////////////////////////////////// + /// \brief Retrieve the thread-specific value of the variable + /// + /// \return Value of the variable for the current thread + /// + //////////////////////////////////////////////////////////// + void* getValue() const; + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + priv::ThreadLocalImpl* m_impl; ///< Pointer to the OS specific implementation +}; + +} // namespace sf + + +#endif // SFML_THREADLOCAL_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::ThreadLocal +/// \ingroup system +/// +/// This class manipulates void* parameters and thus is not +/// appropriate for strongly-typed variables. You should rather +/// use the sf::ThreadLocalPtr template class. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/ThreadLocalPtr.hpp b/SFML-2.4.2/include/SFML/System/ThreadLocalPtr.hpp new file mode 100644 index 0000000..751a9b5 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/ThreadLocalPtr.hpp @@ -0,0 +1,158 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_THREADLOCALPTR_HPP +#define SFML_THREADLOCALPTR_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Pointer to a thread-local variable +/// +//////////////////////////////////////////////////////////// +template +class ThreadLocalPtr : private ThreadLocal +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// \param value Optional value to initialize the variable + /// + //////////////////////////////////////////////////////////// + ThreadLocalPtr(T* value = NULL); + + //////////////////////////////////////////////////////////// + /// \brief Overload of unary operator * + /// + /// Like raw pointers, applying the * operator returns a + /// reference to the pointed-to object. + /// + /// \return Reference to the thread-local variable + /// + //////////////////////////////////////////////////////////// + T& operator *() const; + + //////////////////////////////////////////////////////////// + /// \brief Overload of operator -> + /// + /// Similarly to raw pointers, applying the -> operator + /// returns the pointed-to object. + /// + /// \return Pointer to the thread-local variable + /// + //////////////////////////////////////////////////////////// + T* operator ->() const; + + //////////////////////////////////////////////////////////// + /// \brief Conversion operator to implicitly convert the + /// pointer to its raw pointer type (T*) + /// + /// \return Pointer to the actual object + /// + //////////////////////////////////////////////////////////// + operator T*() const; + + //////////////////////////////////////////////////////////// + /// \brief Assignment operator for a raw pointer parameter + /// + /// \param value Pointer to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + ThreadLocalPtr& operator =(T* value); + + //////////////////////////////////////////////////////////// + /// \brief Assignment operator for a ThreadLocalPtr parameter + /// + /// \param right ThreadLocalPtr to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + ThreadLocalPtr& operator =(const ThreadLocalPtr& right); +}; + +} // namespace sf + +#include + + +#endif // SFML_THREADLOCALPTR_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::ThreadLocalPtr +/// \ingroup system +/// +/// sf::ThreadLocalPtr is a type-safe wrapper for storing +/// pointers to thread-local variables. A thread-local +/// variable holds a different value for each different +/// thread, unlike normal variables that are shared. +/// +/// Its usage is completely transparent, so that it is similar +/// to manipulating the raw pointer directly (like any smart pointer). +/// +/// Usage example: +/// \code +/// MyClass object1; +/// MyClass object2; +/// sf::ThreadLocalPtr objectPtr; +/// +/// void thread1() +/// { +/// objectPtr = &object1; // doesn't impact thread2 +/// ... +/// } +/// +/// void thread2() +/// { +/// objectPtr = &object2; // doesn't impact thread1 +/// ... +/// } +/// +/// int main() +/// { +/// // Create and launch the two threads +/// sf::Thread t1(&thread1); +/// sf::Thread t2(&thread2); +/// t1.launch(); +/// t2.launch(); +/// +/// return 0; +/// } +/// \endcode +/// +/// ThreadLocalPtr is designed for internal use; however you +/// can use it if you feel like it fits well your implementation. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/ThreadLocalPtr.inl b/SFML-2.4.2/include/SFML/System/ThreadLocalPtr.inl new file mode 100644 index 0000000..5652f56 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/ThreadLocalPtr.inl @@ -0,0 +1,77 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + + +namespace sf +{ +//////////////////////////////////////////////////////////// +template +ThreadLocalPtr::ThreadLocalPtr(T* value) : +ThreadLocal(value) +{ +} + + +//////////////////////////////////////////////////////////// +template +T& ThreadLocalPtr::operator *() const +{ + return *static_cast(getValue()); +} + + +//////////////////////////////////////////////////////////// +template +T* ThreadLocalPtr::operator ->() const +{ + return static_cast(getValue()); +} + + +//////////////////////////////////////////////////////////// +template +ThreadLocalPtr::operator T*() const +{ + return static_cast(getValue()); +} + + +//////////////////////////////////////////////////////////// +template +ThreadLocalPtr& ThreadLocalPtr::operator =(T* value) +{ + setValue(value); + return *this; +} + + +//////////////////////////////////////////////////////////// +template +ThreadLocalPtr& ThreadLocalPtr::operator =(const ThreadLocalPtr& right) +{ + setValue(right.getValue()); + return *this; +} + +} // namespace sf diff --git a/SFML-2.4.2/include/SFML/System/Time.hpp b/SFML-2.4.2/include/SFML/System/Time.hpp new file mode 100644 index 0000000..4dff928 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Time.hpp @@ -0,0 +1,488 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_TIME_HPP +#define SFML_TIME_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Represents a time value +/// +//////////////////////////////////////////////////////////// +class SFML_SYSTEM_API Time +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Sets the time value to zero. + /// + //////////////////////////////////////////////////////////// + Time(); + + //////////////////////////////////////////////////////////// + /// \brief Return the time value as a number of seconds + /// + /// \return Time in seconds + /// + /// \see asMilliseconds, asMicroseconds + /// + //////////////////////////////////////////////////////////// + float asSeconds() const; + + //////////////////////////////////////////////////////////// + /// \brief Return the time value as a number of milliseconds + /// + /// \return Time in milliseconds + /// + /// \see asSeconds, asMicroseconds + /// + //////////////////////////////////////////////////////////// + Int32 asMilliseconds() const; + + //////////////////////////////////////////////////////////// + /// \brief Return the time value as a number of microseconds + /// + /// \return Time in microseconds + /// + /// \see asSeconds, asMilliseconds + /// + //////////////////////////////////////////////////////////// + Int64 asMicroseconds() const; + + //////////////////////////////////////////////////////////// + // Static member data + //////////////////////////////////////////////////////////// + static const Time Zero; ///< Predefined "zero" time value + +private: + + friend SFML_SYSTEM_API Time seconds(float); + friend SFML_SYSTEM_API Time milliseconds(Int32); + friend SFML_SYSTEM_API Time microseconds(Int64); + + //////////////////////////////////////////////////////////// + /// \brief Construct from a number of microseconds + /// + /// This function is internal. To construct time values, + /// use sf::seconds, sf::milliseconds or sf::microseconds instead. + /// + /// \param microseconds Number of microseconds + /// + //////////////////////////////////////////////////////////// + explicit Time(Int64 microseconds); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Int64 m_microseconds; ///< Time value stored as microseconds +}; + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Construct a time value from a number of seconds +/// +/// \param amount Number of seconds +/// +/// \return Time value constructed from the amount of seconds +/// +/// \see milliseconds, microseconds +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time seconds(float amount); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Construct a time value from a number of milliseconds +/// +/// \param amount Number of milliseconds +/// +/// \return Time value constructed from the amount of milliseconds +/// +/// \see seconds, microseconds +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time milliseconds(Int32 amount); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Construct a time value from a number of microseconds +/// +/// \param amount Number of microseconds +/// +/// \return Time value constructed from the amount of microseconds +/// +/// \see seconds, milliseconds +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time microseconds(Int64 amount); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of == operator to compare two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return True if both time values are equal +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator ==(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of != operator to compare two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return True if both time values are different +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator !=(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of < operator to compare two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return True if \a left is lesser than \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator <(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of > operator to compare two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return True if \a left is greater than \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator >(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of <= operator to compare two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return True if \a left is lesser or equal than \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator <=(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of >= operator to compare two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return True if \a left is greater or equal than \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API bool operator >=(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of unary - operator to negate a time value +/// +/// \param right Right operand (a time) +/// +/// \return Opposite of the time value +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator -(Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary + operator to add two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return Sum of the two times values +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator +(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary += operator to add/assign two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return Sum of the two times values +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time& operator +=(Time& left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary - operator to subtract two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return Difference of the two times values +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator -(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary -= operator to subtract/assign two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return Difference of the two times values +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time& operator -=(Time& left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary * operator to scale a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a number) +/// +/// \return \a left multiplied by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator *(Time left, float right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary * operator to scale a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a number) +/// +/// \return \a left multiplied by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator *(Time left, Int64 right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary * operator to scale a time value +/// +/// \param left Left operand (a number) +/// \param right Right operand (a time) +/// +/// \return \a left multiplied by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator *(float left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary * operator to scale a time value +/// +/// \param left Left operand (a number) +/// \param right Right operand (a time) +/// +/// \return \a left multiplied by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator *(Int64 left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary *= operator to scale/assign a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a number) +/// +/// \return \a left multiplied by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time& operator *=(Time& left, float right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary *= operator to scale/assign a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a number) +/// +/// \return \a left multiplied by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time& operator *=(Time& left, Int64 right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary / operator to scale a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a number) +/// +/// \return \a left divided by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator /(Time left, float right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary / operator to scale a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a number) +/// +/// \return \a left divided by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator /(Time left, Int64 right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary /= operator to scale/assign a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a number) +/// +/// \return \a left divided by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time& operator /=(Time& left, float right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary /= operator to scale/assign a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a number) +/// +/// \return \a left divided by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time& operator /=(Time& left, Int64 right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary / operator to compute the ratio of two time values +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return \a left divided by \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API float operator /(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary % operator to compute remainder of a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return \a left modulo \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time operator %(Time left, Time right); + +//////////////////////////////////////////////////////////// +/// \relates Time +/// \brief Overload of binary %= operator to compute/assign remainder of a time value +/// +/// \param left Left operand (a time) +/// \param right Right operand (a time) +/// +/// \return \a left modulo \a right +/// +//////////////////////////////////////////////////////////// +SFML_SYSTEM_API Time& operator %=(Time& left, Time right); + +} // namespace sf + + +#endif // SFML_TIME_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Time +/// \ingroup system +/// +/// sf::Time encapsulates a time value in a flexible way. +/// It allows to define a time value either as a number of +/// seconds, milliseconds or microseconds. It also works the +/// other way round: you can read a time value as either +/// a number of seconds, milliseconds or microseconds. +/// +/// By using such a flexible interface, the API doesn't +/// impose any fixed type or resolution for time values, +/// and let the user choose its own favorite representation. +/// +/// Time values support the usual mathematical operations: +/// you can add or subtract two times, multiply or divide +/// a time by a number, compare two times, etc. +/// +/// Since they represent a time span and not an absolute time +/// value, times can also be negative. +/// +/// Usage example: +/// \code +/// sf::Time t1 = sf::seconds(0.1f); +/// Int32 milli = t1.asMilliseconds(); // 100 +/// +/// sf::Time t2 = sf::milliseconds(30); +/// Int64 micro = t2.asMicroseconds(); // 30000 +/// +/// sf::Time t3 = sf::microseconds(-800000); +/// float sec = t3.asSeconds(); // -0.8 +/// \endcode +/// +/// \code +/// void update(sf::Time elapsed) +/// { +/// position += speed * elapsed.asSeconds(); +/// } +/// +/// update(sf::milliseconds(100)); +/// \endcode +/// +/// \see sf::Clock +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Utf.hpp b/SFML-2.4.2/include/SFML/System/Utf.hpp new file mode 100644 index 0000000..819d8ff --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Utf.hpp @@ -0,0 +1,763 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_UTF_HPP +#define SFML_UTF_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + + +namespace sf +{ +template +class Utf; + +//////////////////////////////////////////////////////////// +/// \brief Specialization of the Utf template for UTF-8 +/// +//////////////////////////////////////////////////////////// +template <> +class Utf<8> +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Decode a single UTF-8 character + /// + /// Decoding a character means finding its unique 32-bits + /// code (called the codepoint) in the Unicode standard. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Codepoint of the decoded UTF-8 character + /// \param replacement Replacement character to use in case the UTF-8 sequence is invalid + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In decode(In begin, In end, Uint32& output, Uint32 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-8 character + /// + /// Encoding a character means converting a unique 32-bits + /// code (called the codepoint) in the target encoding, UTF-8. + /// + /// \param input Codepoint to encode as UTF-8 + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to UTF-8 (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out encode(Uint32 input, Out output, Uint8 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Advance to the next UTF-8 character + /// + /// This function is necessary for multi-elements encodings, as + /// a single character may use more than 1 storage element. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In next(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Count the number of characters of a UTF-8 sequence + /// + /// This function is necessary for multi-elements encodings, as + /// a single character may use more than 1 storage element, thus the + /// total size can be different from (begin - end). + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static std::size_t count(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Convert an ANSI characters range to UTF-8 + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out fromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Convert a wide characters range to UTF-8 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out fromWide(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a latin-1 (ISO-5589-1) characters range to UTF-8 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out fromLatin1(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-8 characters range to ANSI characters + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to ANSI (use 0 to skip them) + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-8 characters range to wide characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toWide(In begin, In end, Out output, wchar_t replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-8 characters range to latin-1 (ISO-5589-1) characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toLatin1(In begin, In end, Out output, char replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-8 characters range to UTF-8 + /// + /// This functions does nothing more than a direct copy; + /// it is defined only to provide the same interface as other + /// specializations of the sf::Utf<> template, and allow + /// generic code to be written on top of it. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf8(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-8 characters range to UTF-16 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf16(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-8 characters range to UTF-32 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf32(In begin, In end, Out output); +}; + +//////////////////////////////////////////////////////////// +/// \brief Specialization of the Utf template for UTF-16 +/// +//////////////////////////////////////////////////////////// +template <> +class Utf<16> +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Decode a single UTF-16 character + /// + /// Decoding a character means finding its unique 32-bits + /// code (called the codepoint) in the Unicode standard. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Codepoint of the decoded UTF-16 character + /// \param replacement Replacement character to use in case the UTF-8 sequence is invalid + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In decode(In begin, In end, Uint32& output, Uint32 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-16 character + /// + /// Encoding a character means converting a unique 32-bits + /// code (called the codepoint) in the target encoding, UTF-16. + /// + /// \param input Codepoint to encode as UTF-16 + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to UTF-16 (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out encode(Uint32 input, Out output, Uint16 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Advance to the next UTF-16 character + /// + /// This function is necessary for multi-elements encodings, as + /// a single character may use more than 1 storage element. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In next(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Count the number of characters of a UTF-16 sequence + /// + /// This function is necessary for multi-elements encodings, as + /// a single character may use more than 1 storage element, thus the + /// total size can be different from (begin - end). + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static std::size_t count(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Convert an ANSI characters range to UTF-16 + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out fromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Convert a wide characters range to UTF-16 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out fromWide(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a latin-1 (ISO-5589-1) characters range to UTF-16 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out fromLatin1(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-16 characters range to ANSI characters + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to ANSI (use 0 to skip them) + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-16 characters range to wide characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toWide(In begin, In end, Out output, wchar_t replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-16 characters range to latin-1 (ISO-5589-1) characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toLatin1(In begin, In end, Out output, char replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-16 characters range to UTF-8 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf8(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-16 characters range to UTF-16 + /// + /// This functions does nothing more than a direct copy; + /// it is defined only to provide the same interface as other + /// specializations of the sf::Utf<> template, and allow + /// generic code to be written on top of it. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf16(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-16 characters range to UTF-32 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf32(In begin, In end, Out output); +}; + +//////////////////////////////////////////////////////////// +/// \brief Specialization of the Utf template for UTF-32 +/// +//////////////////////////////////////////////////////////// +template <> +class Utf<32> +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Decode a single UTF-32 character + /// + /// Decoding a character means finding its unique 32-bits + /// code (called the codepoint) in the Unicode standard. + /// For UTF-32, the character value is the same as the codepoint. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Codepoint of the decoded UTF-32 character + /// \param replacement Replacement character to use in case the UTF-8 sequence is invalid + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In decode(In begin, In end, Uint32& output, Uint32 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-32 character + /// + /// Encoding a character means converting a unique 32-bits + /// code (called the codepoint) in the target encoding, UTF-32. + /// For UTF-32, the codepoint is the same as the character value. + /// + /// \param input Codepoint to encode as UTF-32 + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to UTF-32 (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out encode(Uint32 input, Out output, Uint32 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Advance to the next UTF-32 character + /// + /// This function is trivial for UTF-32, which can store + /// every character in a single storage element. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In next(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Count the number of characters of a UTF-32 sequence + /// + /// This function is trivial for UTF-32, which can store + /// every character in a single storage element. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static std::size_t count(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Convert an ANSI characters range to UTF-32 + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out fromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Convert a wide characters range to UTF-32 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out fromWide(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a latin-1 (ISO-5589-1) characters range to UTF-32 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out fromLatin1(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-32 characters range to ANSI characters + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to ANSI (use 0 to skip them) + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-32 characters range to wide characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toWide(In begin, In end, Out output, wchar_t replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-16 characters range to latin-1 (ISO-5589-1) characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toLatin1(In begin, In end, Out output, char replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-32 characters range to UTF-8 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf8(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-32 characters range to UTF-16 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf16(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-32 characters range to UTF-32 + /// + /// This functions does nothing more than a direct copy; + /// it is defined only to provide the same interface as other + /// specializations of the sf::Utf<> template, and allow + /// generic code to be written on top of it. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf32(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Decode a single ANSI character to UTF-32 + /// + /// This function does not exist in other specializations + /// of sf::Utf<>, it is defined for convenience (it is used by + /// several other conversion functions). + /// + /// \param input Input ANSI character + /// \param locale Locale to use for conversion + /// + /// \return Converted character + /// + //////////////////////////////////////////////////////////// + template + static Uint32 decodeAnsi(In input, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Decode a single wide character to UTF-32 + /// + /// This function does not exist in other specializations + /// of sf::Utf<>, it is defined for convenience (it is used by + /// several other conversion functions). + /// + /// \param input Input wide character + /// + /// \return Converted character + /// + //////////////////////////////////////////////////////////// + template + static Uint32 decodeWide(In input); + + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-32 character to ANSI + /// + /// This function does not exist in other specializations + /// of sf::Utf<>, it is defined for convenience (it is used by + /// several other conversion functions). + /// + /// \param codepoint Iterator pointing to the beginning of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement if the input character is not convertible to ANSI (use 0 to skip it) + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out encodeAnsi(Uint32 codepoint, Out output, char replacement = 0, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-32 character to wide + /// + /// This function does not exist in other specializations + /// of sf::Utf<>, it is defined for convenience (it is used by + /// several other conversion functions). + /// + /// \param codepoint Iterator pointing to the beginning of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement if the input character is not convertible to wide (use 0 to skip it) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out encodeWide(Uint32 codepoint, Out output, wchar_t replacement = 0); +}; + +#include + +// Make typedefs to get rid of the template syntax +typedef Utf<8> Utf8; +typedef Utf<16> Utf16; +typedef Utf<32> Utf32; + +} // namespace sf + + +#endif // SFML_UTF_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Utf +/// \ingroup system +/// +/// Utility class providing generic functions for UTF conversions. +/// +/// sf::Utf is a low-level, generic interface for counting, iterating, +/// encoding and decoding Unicode characters and strings. It is able +/// to handle ANSI, wide, latin-1, UTF-8, UTF-16 and UTF-32 encodings. +/// +/// sf::Utf functions are all static, these classes are not meant to +/// be instantiated. All the functions are template, so that you +/// can use any character / string type for a given encoding. +/// +/// It has 3 specializations: +/// \li sf::Utf<8> (typedef'd to sf::Utf8) +/// \li sf::Utf<16> (typedef'd to sf::Utf16) +/// \li sf::Utf<32> (typedef'd to sf::Utf32) +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Utf.inl b/SFML-2.4.2/include/SFML/System/Utf.inl new file mode 100644 index 0000000..6ffceda --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Utf.inl @@ -0,0 +1,752 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +// References: +// +// http://www.unicode.org/ +// http://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.c +// http://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.h +// http://people.w3.org/rishida/scripts/uniview/conversion +// +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +template +In Utf<8>::decode(In begin, In end, Uint32& output, Uint32 replacement) +{ + // Some useful precomputed data + static const int trailing[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5 + }; + static const Uint32 offsets[6] = + { + 0x00000000, 0x00003080, 0x000E2080, 0x03C82080, 0xFA082080, 0x82082080 + }; + + // decode the character + int trailingBytes = trailing[static_cast(*begin)]; + if (begin + trailingBytes < end) + { + output = 0; + switch (trailingBytes) + { + case 5: output += static_cast(*begin++); output <<= 6; + case 4: output += static_cast(*begin++); output <<= 6; + case 3: output += static_cast(*begin++); output <<= 6; + case 2: output += static_cast(*begin++); output <<= 6; + case 1: output += static_cast(*begin++); output <<= 6; + case 0: output += static_cast(*begin++); + } + output -= offsets[trailingBytes]; + } + else + { + // Incomplete character + begin = end; + output = replacement; + } + + return begin; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::encode(Uint32 input, Out output, Uint8 replacement) +{ + // Some useful precomputed data + static const Uint8 firstBytes[7] = + { + 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC + }; + + // encode the character + if ((input > 0x0010FFFF) || ((input >= 0xD800) && (input <= 0xDBFF))) + { + // Invalid character + if (replacement) + *output++ = replacement; + } + else + { + // Valid character + + // Get the number of bytes to write + std::size_t bytestoWrite = 1; + if (input < 0x80) bytestoWrite = 1; + else if (input < 0x800) bytestoWrite = 2; + else if (input < 0x10000) bytestoWrite = 3; + else if (input <= 0x0010FFFF) bytestoWrite = 4; + + // Extract the bytes to write + Uint8 bytes[4]; + switch (bytestoWrite) + { + case 4: bytes[3] = static_cast((input | 0x80) & 0xBF); input >>= 6; + case 3: bytes[2] = static_cast((input | 0x80) & 0xBF); input >>= 6; + case 2: bytes[1] = static_cast((input | 0x80) & 0xBF); input >>= 6; + case 1: bytes[0] = static_cast (input | firstBytes[bytestoWrite]); + } + + // Add them to the output + output = std::copy(bytes, bytes + bytestoWrite, output); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +In Utf<8>::next(In begin, In end) +{ + Uint32 codepoint; + return decode(begin, end, codepoint); +} + + +//////////////////////////////////////////////////////////// +template +std::size_t Utf<8>::count(In begin, In end) +{ + std::size_t length = 0; + while (begin < end) + { + begin = next(begin, end); + ++length; + } + + return length; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::fromAnsi(In begin, In end, Out output, const std::locale& locale) +{ + while (begin < end) + { + Uint32 codepoint = Utf<32>::decodeAnsi(*begin++, locale); + output = encode(codepoint, output); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::fromWide(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint = Utf<32>::decodeWide(*begin++); + output = encode(codepoint, output); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::fromLatin1(In begin, In end, Out output) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + output = encode(*begin++, output); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::toAnsi(In begin, In end, Out output, char replacement, const std::locale& locale) +{ + while (begin < end) + { + Uint32 codepoint; + begin = decode(begin, end, codepoint); + output = Utf<32>::encodeAnsi(codepoint, output, replacement, locale); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::toWide(In begin, In end, Out output, wchar_t replacement) +{ + while (begin < end) + { + Uint32 codepoint; + begin = decode(begin, end, codepoint); + output = Utf<32>::encodeWide(codepoint, output, replacement); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::toLatin1(In begin, In end, Out output, char replacement) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + { + Uint32 codepoint; + begin = decode(begin, end, codepoint); + *output++ = codepoint < 256 ? static_cast(codepoint) : replacement; + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::toUtf8(In begin, In end, Out output) +{ + return std::copy(begin, end, output); +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::toUtf16(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint; + begin = decode(begin, end, codepoint); + output = Utf<16>::encode(codepoint, output); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::toUtf32(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint; + begin = decode(begin, end, codepoint); + *output++ = codepoint; + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +In Utf<16>::decode(In begin, In end, Uint32& output, Uint32 replacement) +{ + Uint16 first = *begin++; + + // If it's a surrogate pair, first convert to a single UTF-32 character + if ((first >= 0xD800) && (first <= 0xDBFF)) + { + if (begin < end) + { + Uint32 second = *begin++; + if ((second >= 0xDC00) && (second <= 0xDFFF)) + { + // The second element is valid: convert the two elements to a UTF-32 character + output = static_cast(((first - 0xD800) << 10) + (second - 0xDC00) + 0x0010000); + } + else + { + // Invalid character + output = replacement; + } + } + else + { + // Invalid character + begin = end; + output = replacement; + } + } + else + { + // We can make a direct copy + output = first; + } + + return begin; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::encode(Uint32 input, Out output, Uint16 replacement) +{ + if (input <= 0xFFFF) + { + // The character can be copied directly, we just need to check if it's in the valid range + if ((input >= 0xD800) && (input <= 0xDFFF)) + { + // Invalid character (this range is reserved) + if (replacement) + *output++ = replacement; + } + else + { + // Valid character directly convertible to a single UTF-16 character + *output++ = static_cast(input); + } + } + else if (input > 0x0010FFFF) + { + // Invalid character (greater than the maximum Unicode value) + if (replacement) + *output++ = replacement; + } + else + { + // The input character will be converted to two UTF-16 elements + input -= 0x0010000; + *output++ = static_cast((input >> 10) + 0xD800); + *output++ = static_cast((input & 0x3FFUL) + 0xDC00); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +In Utf<16>::next(In begin, In end) +{ + Uint32 codepoint; + return decode(begin, end, codepoint); +} + + +//////////////////////////////////////////////////////////// +template +std::size_t Utf<16>::count(In begin, In end) +{ + std::size_t length = 0; + while (begin < end) + { + begin = next(begin, end); + ++length; + } + + return length; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::fromAnsi(In begin, In end, Out output, const std::locale& locale) +{ + while (begin < end) + { + Uint32 codepoint = Utf<32>::decodeAnsi(*begin++, locale); + output = encode(codepoint, output); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::fromWide(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint = Utf<32>::decodeWide(*begin++); + output = encode(codepoint, output); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::fromLatin1(In begin, In end, Out output) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + return std::copy(begin, end, output); +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::toAnsi(In begin, In end, Out output, char replacement, const std::locale& locale) +{ + while (begin < end) + { + Uint32 codepoint; + begin = decode(begin, end, codepoint); + output = Utf<32>::encodeAnsi(codepoint, output, replacement, locale); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::toWide(In begin, In end, Out output, wchar_t replacement) +{ + while (begin < end) + { + Uint32 codepoint; + begin = decode(begin, end, codepoint); + output = Utf<32>::encodeWide(codepoint, output, replacement); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::toLatin1(In begin, In end, Out output, char replacement) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + { + *output++ = *begin < 256 ? static_cast(*begin) : replacement; + begin++; + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::toUtf8(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint; + begin = decode(begin, end, codepoint); + output = Utf<8>::encode(codepoint, output); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::toUtf16(In begin, In end, Out output) +{ + return std::copy(begin, end, output); +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<16>::toUtf32(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint; + begin = decode(begin, end, codepoint); + *output++ = codepoint; + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +In Utf<32>::decode(In begin, In /*end*/, Uint32& output, Uint32 /*replacement*/) +{ + output = *begin++; + return begin; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::encode(Uint32 input, Out output, Uint32 /*replacement*/) +{ + *output++ = input; + return output; +} + + +//////////////////////////////////////////////////////////// +template +In Utf<32>::next(In begin, In /*end*/) +{ + return ++begin; +} + + +//////////////////////////////////////////////////////////// +template +std::size_t Utf<32>::count(In begin, In end) +{ + return begin - end; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::fromAnsi(In begin, In end, Out output, const std::locale& locale) +{ + while (begin < end) + *output++ = decodeAnsi(*begin++, locale); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::fromWide(In begin, In end, Out output) +{ + while (begin < end) + *output++ = decodeWide(*begin++); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::fromLatin1(In begin, In end, Out output) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + return std::copy(begin, end, output); +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::toAnsi(In begin, In end, Out output, char replacement, const std::locale& locale) +{ + while (begin < end) + output = encodeAnsi(*begin++, output, replacement, locale); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::toWide(In begin, In end, Out output, wchar_t replacement) +{ + while (begin < end) + output = encodeWide(*begin++, output, replacement); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::toLatin1(In begin, In end, Out output, char replacement) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + { + *output++ = *begin < 256 ? static_cast(*begin) : replacement; + begin++; + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::toUtf8(In begin, In end, Out output) +{ + while (begin < end) + output = Utf<8>::encode(*begin++, output); + + return output; +} + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::toUtf16(In begin, In end, Out output) +{ + while (begin < end) + output = Utf<16>::encode(*begin++, output); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::toUtf32(In begin, In end, Out output) +{ + return std::copy(begin, end, output); +} + + +//////////////////////////////////////////////////////////// +template +Uint32 Utf<32>::decodeAnsi(In input, const std::locale& locale) +{ + // On Windows, GCC's standard library (glibc++) has almost + // no support for Unicode stuff. As a consequence, in this + // context we can only use the default locale and ignore + // the one passed as parameter. + + #if defined(SFML_SYSTEM_WINDOWS) && /* if Windows ... */ \ + (defined(__GLIBCPP__) || defined (__GLIBCXX__)) && /* ... and standard library is glibc++ ... */ \ + !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) /* ... and STLPort is not used on top of it */ + + (void)locale; // to avoid warnings + + wchar_t character = 0; + mbtowc(&character, &input, 1); + return static_cast(character); + + #else + + // Get the facet of the locale which deals with character conversion + const std::ctype& facet = std::use_facet< std::ctype >(locale); + + // Use the facet to convert each character of the input string + return static_cast(facet.widen(input)); + + #endif +} + + +//////////////////////////////////////////////////////////// +template +Uint32 Utf<32>::decodeWide(In input) +{ + // The encoding of wide characters is not well defined and is left to the system; + // however we can safely assume that it is UCS-2 on Windows and + // UCS-4 on Unix systems. + // In both cases, a simple copy is enough (UCS-2 is a subset of UCS-4, + // and UCS-4 *is* UTF-32). + + return input; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::encodeAnsi(Uint32 codepoint, Out output, char replacement, const std::locale& locale) +{ + // On Windows, gcc's standard library (glibc++) has almost + // no support for Unicode stuff. As a consequence, in this + // context we can only use the default locale and ignore + // the one passed as parameter. + + #if defined(SFML_SYSTEM_WINDOWS) && /* if Windows ... */ \ + (defined(__GLIBCPP__) || defined (__GLIBCXX__)) && /* ... and standard library is glibc++ ... */ \ + !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) /* ... and STLPort is not used on top of it */ + + (void)locale; // to avoid warnings + + char character = 0; + if (wctomb(&character, static_cast(codepoint)) >= 0) + *output++ = character; + else if (replacement) + *output++ = replacement; + + return output; + + #else + + // Get the facet of the locale which deals with character conversion + const std::ctype& facet = std::use_facet< std::ctype >(locale); + + // Use the facet to convert each character of the input string + *output++ = facet.narrow(static_cast(codepoint), replacement); + + return output; + + #endif +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::encodeWide(Uint32 codepoint, Out output, wchar_t replacement) +{ + // The encoding of wide characters is not well defined and is left to the system; + // however we can safely assume that it is UCS-2 on Windows and + // UCS-4 on Unix systems. + // For UCS-2 we need to check if the source characters fits in (UCS-2 is a subset of UCS-4). + // For UCS-4 we can do a direct copy (UCS-4 *is* UTF-32). + + switch (sizeof(wchar_t)) + { + case 4: + { + *output++ = static_cast(codepoint); + break; + } + + default: + { + if ((codepoint <= 0xFFFF) && ((codepoint < 0xD800) || (codepoint > 0xDFFF))) + { + *output++ = static_cast(codepoint); + } + else if (replacement) + { + *output++ = replacement; + } + break; + } + } + + return output; +} diff --git a/SFML-2.4.2/include/SFML/System/Vector2.hpp b/SFML-2.4.2/include/SFML/System/Vector2.hpp new file mode 100644 index 0000000..d5e1744 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Vector2.hpp @@ -0,0 +1,301 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_VECTOR2_HPP +#define SFML_VECTOR2_HPP + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Utility template class for manipulating +/// 2-dimensional vectors +/// +//////////////////////////////////////////////////////////// +template +class Vector2 +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates a Vector2(0, 0). + /// + //////////////////////////////////////////////////////////// + Vector2(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the vector from its coordinates + /// + /// \param X X coordinate + /// \param Y Y coordinate + /// + //////////////////////////////////////////////////////////// + Vector2(T X, T Y); + + //////////////////////////////////////////////////////////// + /// \brief Construct the vector from another type of vector + /// + /// This constructor doesn't replace the copy constructor, + /// it's called only when U != T. + /// A call to this constructor will fail to compile if U + /// is not convertible to T. + /// + /// \param vector Vector to convert + /// + //////////////////////////////////////////////////////////// + template + explicit Vector2(const Vector2& vector); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + T x; ///< X coordinate of the vector + T y; ///< Y coordinate of the vector +}; + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of unary operator - +/// +/// \param right Vector to negate +/// +/// \return Memberwise opposite of the vector +/// +//////////////////////////////////////////////////////////// +template +Vector2 operator -(const Vector2& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator += +/// +/// This operator performs a memberwise addition of both vectors, +/// and assigns the result to \a left. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +template +Vector2& operator +=(Vector2& left, const Vector2& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator -= +/// +/// This operator performs a memberwise subtraction of both vectors, +/// and assigns the result to \a left. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +template +Vector2& operator -=(Vector2& left, const Vector2& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator + +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return Memberwise addition of both vectors +/// +//////////////////////////////////////////////////////////// +template +Vector2 operator +(const Vector2& left, const Vector2& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator - +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return Memberwise subtraction of both vectors +/// +//////////////////////////////////////////////////////////// +template +Vector2 operator -(const Vector2& left, const Vector2& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator * +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a scalar value) +/// +/// \return Memberwise multiplication by \a right +/// +//////////////////////////////////////////////////////////// +template +Vector2 operator *(const Vector2& left, T right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator * +/// +/// \param left Left operand (a scalar value) +/// \param right Right operand (a vector) +/// +/// \return Memberwise multiplication by \a left +/// +//////////////////////////////////////////////////////////// +template +Vector2 operator *(T left, const Vector2& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator *= +/// +/// This operator performs a memberwise multiplication by \a right, +/// and assigns the result to \a left. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a scalar value) +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +template +Vector2& operator *=(Vector2& left, T right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator / +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a scalar value) +/// +/// \return Memberwise division by \a right +/// +//////////////////////////////////////////////////////////// +template +Vector2 operator /(const Vector2& left, T right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator /= +/// +/// This operator performs a memberwise division by \a right, +/// and assigns the result to \a left. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a scalar value) +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +template +Vector2& operator /=(Vector2& left, T right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator == +/// +/// This operator compares strict equality between two vectors. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return True if \a left is equal to \a right +/// +//////////////////////////////////////////////////////////// +template +bool operator ==(const Vector2& left, const Vector2& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector2 +/// \brief Overload of binary operator != +/// +/// This operator compares strict difference between two vectors. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return True if \a left is not equal to \a right +/// +//////////////////////////////////////////////////////////// +template +bool operator !=(const Vector2& left, const Vector2& right); + +#include + +// Define the most common types +typedef Vector2 Vector2i; +typedef Vector2 Vector2u; +typedef Vector2 Vector2f; + +} // namespace sf + + +#endif // SFML_VECTOR2_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Vector2 +/// \ingroup system +/// +/// sf::Vector2 is a simple class that defines a mathematical +/// vector with two coordinates (x and y). It can be used to +/// represent anything that has two dimensions: a size, a point, +/// a velocity, etc. +/// +/// The template parameter T is the type of the coordinates. It +/// can be any type that supports arithmetic operations (+, -, /, *) +/// and comparisons (==, !=), for example int or float. +/// +/// You generally don't have to care about the templated form (sf::Vector2), +/// the most common specializations have special typedefs: +/// \li sf::Vector2 is sf::Vector2f +/// \li sf::Vector2 is sf::Vector2i +/// \li sf::Vector2 is sf::Vector2u +/// +/// The sf::Vector2 class has a small and simple interface, its x and y members +/// can be accessed directly (there are no accessors like setX(), getX()) and it +/// contains no mathematical function like dot product, cross product, length, etc. +/// +/// Usage example: +/// \code +/// sf::Vector2f v1(16.5f, 24.f); +/// v1.x = 18.2f; +/// float y = v1.y; +/// +/// sf::Vector2f v2 = v1 * 5.f; +/// sf::Vector2f v3; +/// v3 = v1 + v2; +/// +/// bool different = (v2 != v3); +/// \endcode +/// +/// Note: for 3-dimensional vectors, see sf::Vector3. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Vector2.inl b/SFML-2.4.2/include/SFML/System/Vector2.inl new file mode 100644 index 0000000..081b211 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Vector2.inl @@ -0,0 +1,161 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +template +inline Vector2::Vector2() : +x(0), +y(0) +{ + +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2::Vector2(T X, T Y) : +x(X), +y(Y) +{ + +} + + +//////////////////////////////////////////////////////////// +template +template +inline Vector2::Vector2(const Vector2& vector) : +x(static_cast(vector.x)), +y(static_cast(vector.y)) +{ +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2 operator -(const Vector2& right) +{ + return Vector2(-right.x, -right.y); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2& operator +=(Vector2& left, const Vector2& right) +{ + left.x += right.x; + left.y += right.y; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2& operator -=(Vector2& left, const Vector2& right) +{ + left.x -= right.x; + left.y -= right.y; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2 operator +(const Vector2& left, const Vector2& right) +{ + return Vector2(left.x + right.x, left.y + right.y); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2 operator -(const Vector2& left, const Vector2& right) +{ + return Vector2(left.x - right.x, left.y - right.y); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2 operator *(const Vector2& left, T right) +{ + return Vector2(left.x * right, left.y * right); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2 operator *(T left, const Vector2& right) +{ + return Vector2(right.x * left, right.y * left); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2& operator *=(Vector2& left, T right) +{ + left.x *= right; + left.y *= right; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2 operator /(const Vector2& left, T right) +{ + return Vector2(left.x / right, left.y / right); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector2& operator /=(Vector2& left, T right) +{ + left.x /= right; + left.y /= right; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator ==(const Vector2& left, const Vector2& right) +{ + return (left.x == right.x) && (left.y == right.y); +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator !=(const Vector2& left, const Vector2& right) +{ + return (left.x != right.x) || (left.y != right.y); +} diff --git a/SFML-2.4.2/include/SFML/System/Vector3.hpp b/SFML-2.4.2/include/SFML/System/Vector3.hpp new file mode 100644 index 0000000..61d0dc7 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Vector3.hpp @@ -0,0 +1,302 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_VECTOR3_HPP +#define SFML_VECTOR3_HPP + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Utility template class for manipulating +/// 3-dimensional vectors +/// +//////////////////////////////////////////////////////////// +template +class Vector3 +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates a Vector3(0, 0, 0). + /// + //////////////////////////////////////////////////////////// + Vector3(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the vector from its coordinates + /// + /// \param X X coordinate + /// \param Y Y coordinate + /// \param Z Z coordinate + /// + //////////////////////////////////////////////////////////// + Vector3(T X, T Y, T Z); + + //////////////////////////////////////////////////////////// + /// \brief Construct the vector from another type of vector + /// + /// This constructor doesn't replace the copy constructor, + /// it's called only when U != T. + /// A call to this constructor will fail to compile if U + /// is not convertible to T. + /// + /// \param vector Vector to convert + /// + //////////////////////////////////////////////////////////// + template + explicit Vector3(const Vector3& vector); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + T x; ///< X coordinate of the vector + T y; ///< Y coordinate of the vector + T z; ///< Z coordinate of the vector +}; + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of unary operator - +/// +/// \param left Vector to negate +/// +/// \return Memberwise opposite of the vector +/// +//////////////////////////////////////////////////////////// +template +Vector3 operator -(const Vector3& left); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator += +/// +/// This operator performs a memberwise addition of both vectors, +/// and assigns the result to \a left. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +template +Vector3& operator +=(Vector3& left, const Vector3& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator -= +/// +/// This operator performs a memberwise subtraction of both vectors, +/// and assigns the result to \a left. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +template +Vector3& operator -=(Vector3& left, const Vector3& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator + +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return Memberwise addition of both vectors +/// +//////////////////////////////////////////////////////////// +template +Vector3 operator +(const Vector3& left, const Vector3& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator - +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return Memberwise subtraction of both vectors +/// +//////////////////////////////////////////////////////////// +template +Vector3 operator -(const Vector3& left, const Vector3& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator * +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a scalar value) +/// +/// \return Memberwise multiplication by \a right +/// +//////////////////////////////////////////////////////////// +template +Vector3 operator *(const Vector3& left, T right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator * +/// +/// \param left Left operand (a scalar value) +/// \param right Right operand (a vector) +/// +/// \return Memberwise multiplication by \a left +/// +//////////////////////////////////////////////////////////// +template +Vector3 operator *(T left, const Vector3& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator *= +/// +/// This operator performs a memberwise multiplication by \a right, +/// and assigns the result to \a left. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a scalar value) +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +template +Vector3& operator *=(Vector3& left, T right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator / +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a scalar value) +/// +/// \return Memberwise division by \a right +/// +//////////////////////////////////////////////////////////// +template +Vector3 operator /(const Vector3& left, T right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator /= +/// +/// This operator performs a memberwise division by \a right, +/// and assigns the result to \a left. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a scalar value) +/// +/// \return Reference to \a left +/// +//////////////////////////////////////////////////////////// +template +Vector3& operator /=(Vector3& left, T right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator == +/// +/// This operator compares strict equality between two vectors. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return True if \a left is equal to \a right +/// +//////////////////////////////////////////////////////////// +template +bool operator ==(const Vector3& left, const Vector3& right); + +//////////////////////////////////////////////////////////// +/// \relates Vector3 +/// \brief Overload of binary operator != +/// +/// This operator compares strict difference between two vectors. +/// +/// \param left Left operand (a vector) +/// \param right Right operand (a vector) +/// +/// \return True if \a left is not equal to \a right +/// +//////////////////////////////////////////////////////////// +template +bool operator !=(const Vector3& left, const Vector3& right); + +#include + +// Define the most common types +typedef Vector3 Vector3i; +typedef Vector3 Vector3f; + +} // namespace sf + + +#endif // SFML_VECTOR3_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Vector3 +/// \ingroup system +/// +/// sf::Vector3 is a simple class that defines a mathematical +/// vector with three coordinates (x, y and z). It can be used to +/// represent anything that has three dimensions: a size, a point, +/// a velocity, etc. +/// +/// The template parameter T is the type of the coordinates. It +/// can be any type that supports arithmetic operations (+, -, /, *) +/// and comparisons (==, !=), for example int or float. +/// +/// You generally don't have to care about the templated form (sf::Vector3), +/// the most common specializations have special typedefs: +/// \li sf::Vector3 is sf::Vector3f +/// \li sf::Vector3 is sf::Vector3i +/// +/// The sf::Vector3 class has a small and simple interface, its x and y members +/// can be accessed directly (there are no accessors like setX(), getX()) and it +/// contains no mathematical function like dot product, cross product, length, etc. +/// +/// Usage example: +/// \code +/// sf::Vector3f v1(16.5f, 24.f, -8.2f); +/// v1.x = 18.2f; +/// float y = v1.y; +/// float z = v1.z; +/// +/// sf::Vector3f v2 = v1 * 5.f; +/// sf::Vector3f v3; +/// v3 = v1 + v2; +/// +/// bool different = (v2 != v3); +/// \endcode +/// +/// Note: for 2-dimensional vectors, see sf::Vector2. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/System/Vector3.inl b/SFML-2.4.2/include/SFML/System/Vector3.inl new file mode 100644 index 0000000..2f5eea8 --- /dev/null +++ b/SFML-2.4.2/include/SFML/System/Vector3.inl @@ -0,0 +1,168 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +template +inline Vector3::Vector3() : +x(0), +y(0), +z(0) +{ + +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3::Vector3(T X, T Y, T Z) : +x(X), +y(Y), +z(Z) +{ + +} + + +//////////////////////////////////////////////////////////// +template +template +inline Vector3::Vector3(const Vector3& vector) : +x(static_cast(vector.x)), +y(static_cast(vector.y)), +z(static_cast(vector.z)) +{ +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator -(const Vector3& left) +{ + return Vector3(-left.x, -left.y, -left.z); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3& operator +=(Vector3& left, const Vector3& right) +{ + left.x += right.x; + left.y += right.y; + left.z += right.z; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3& operator -=(Vector3& left, const Vector3& right) +{ + left.x -= right.x; + left.y -= right.y; + left.z -= right.z; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator +(const Vector3& left, const Vector3& right) +{ + return Vector3(left.x + right.x, left.y + right.y, left.z + right.z); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator -(const Vector3& left, const Vector3& right) +{ + return Vector3(left.x - right.x, left.y - right.y, left.z - right.z); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator *(const Vector3& left, T right) +{ + return Vector3(left.x * right, left.y * right, left.z * right); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator *(T left, const Vector3& right) +{ + return Vector3(right.x * left, right.y * left, right.z * left); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3& operator *=(Vector3& left, T right) +{ + left.x *= right; + left.y *= right; + left.z *= right; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator /(const Vector3& left, T right) +{ + return Vector3(left.x / right, left.y / right, left.z / right); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3& operator /=(Vector3& left, T right) +{ + left.x /= right; + left.y /= right; + left.z /= right; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator ==(const Vector3& left, const Vector3& right) +{ + return (left.x == right.x) && (left.y == right.y) && (left.z == right.z); +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator !=(const Vector3& left, const Vector3& right) +{ + return (left.x != right.x) || (left.y != right.y) || (left.z != right.z); +} diff --git a/SFML-2.4.2/include/SFML/Window.hpp b/SFML-2.4.2/include/SFML/Window.hpp new file mode 100644 index 0000000..eefe267 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window.hpp @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SFML_WINDOW_HPP +#define SFML_SFML_WINDOW_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +#endif // SFML_SFML_WINDOW_HPP + +//////////////////////////////////////////////////////////// +/// \defgroup window Window module +/// +/// Provides OpenGL-based windows, and abstractions for +/// events and input handling. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/Context.hpp b/SFML-2.4.2/include/SFML/Window/Context.hpp new file mode 100644 index 0000000..9e1eedd --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/Context.hpp @@ -0,0 +1,180 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_CONTEXT_HPP +#define SFML_CONTEXT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +namespace priv +{ + class GlContext; +} + +typedef void (*GlFunctionPointer)(); + +//////////////////////////////////////////////////////////// +/// \brief Class holding a valid drawing context +/// +//////////////////////////////////////////////////////////// +class SFML_WINDOW_API Context : GlResource, NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// The constructor creates and activates the context + /// + //////////////////////////////////////////////////////////// + Context(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + /// The destructor deactivates and destroys the context + /// + //////////////////////////////////////////////////////////// + ~Context(); + + //////////////////////////////////////////////////////////// + /// \brief Activate or deactivate explicitly the context + /// + /// \param active True to activate, false to deactivate + /// + /// \return True on success, false on failure + /// + //////////////////////////////////////////////////////////// + bool setActive(bool active); + + //////////////////////////////////////////////////////////// + /// \brief Get the settings of the context + /// + /// Note that these settings may be different than the ones + /// passed to the constructor; they are indeed adjusted if the + /// original settings are not directly supported by the system. + /// + /// \return Structure containing the settings + /// + //////////////////////////////////////////////////////////// + const ContextSettings& getSettings() const; + + //////////////////////////////////////////////////////////// + /// \brief Check whether a given OpenGL extension is available + /// + /// \param name Name of the extension to check for + /// + /// \return True if available, false if unavailable + /// + //////////////////////////////////////////////////////////// + static bool isExtensionAvailable(const char* name); + + //////////////////////////////////////////////////////////// + /// \brief Get the address of an OpenGL function + /// + /// \param name Name of the function to get the address of + /// + /// \return Address of the OpenGL function, 0 on failure + /// + //////////////////////////////////////////////////////////// + static GlFunctionPointer getFunction(const char* name); + + //////////////////////////////////////////////////////////// + /// \brief Get the currently active context + /// + /// \return The currently active context or NULL if none is active + /// + //////////////////////////////////////////////////////////// + static const Context* getActiveContext(); + + //////////////////////////////////////////////////////////// + /// \brief Construct a in-memory context + /// + /// This constructor is for internal use, you don't need + /// to bother with it. + /// + /// \param settings Creation parameters + /// \param width Back buffer width + /// \param height Back buffer height + /// + //////////////////////////////////////////////////////////// + Context(const ContextSettings& settings, unsigned int width, unsigned int height); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + priv::GlContext* m_context; ///< Internal OpenGL context +}; + +} // namespace sf + + +#endif // SFML_CONTEXT_HPP + +//////////////////////////////////////////////////////////// +/// \class sf::Context +/// \ingroup window +/// +/// If you need to make OpenGL calls without having an +/// active window (like in a thread), you can use an +/// instance of this class to get a valid context. +/// +/// Having a valid context is necessary for *every* OpenGL call. +/// +/// Note that a context is only active in its current thread, +/// if you create a new thread it will have no valid context +/// by default. +/// +/// To use a sf::Context instance, just construct it and let it +/// live as long as you need a valid context. No explicit activation +/// is needed, all it has to do is to exist. Its destructor +/// will take care of deactivating and freeing all the attached +/// resources. +/// +/// Usage example: +/// \code +/// void threadFunction(void*) +/// { +/// sf::Context context; +/// // from now on, you have a valid context +/// +/// // you can make OpenGL calls +/// glClear(GL_DEPTH_BUFFER_BIT); +/// } +/// // the context is automatically deactivated and destroyed +/// // by the sf::Context destructor +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/ContextSettings.hpp b/SFML-2.4.2/include/SFML/Window/ContextSettings.hpp new file mode 100644 index 0000000..2774302 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/ContextSettings.hpp @@ -0,0 +1,148 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_CONTEXTSETTINGS_HPP +#define SFML_CONTEXTSETTINGS_HPP + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Structure defining the settings of the OpenGL +/// context attached to a window +/// +//////////////////////////////////////////////////////////// +struct ContextSettings +{ + //////////////////////////////////////////////////////////// + /// \brief Enumeration of the context attribute flags + /// + //////////////////////////////////////////////////////////// + enum Attribute + { + Default = 0, ///< Non-debug, compatibility context (this and the core attribute are mutually exclusive) + Core = 1 << 0, ///< Core attribute + Debug = 1 << 2 ///< Debug attribute + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// \param depth Depth buffer bits + /// \param stencil Stencil buffer bits + /// \param antialiasing Antialiasing level + /// \param major Major number of the context version + /// \param minor Minor number of the context version + /// \param attributes Attribute flags of the context + /// \param sRgb sRGB capable framebuffer + /// + //////////////////////////////////////////////////////////// + explicit ContextSettings(unsigned int depth = 0, unsigned int stencil = 0, unsigned int antialiasing = 0, unsigned int major = 1, unsigned int minor = 1, unsigned int attributes = Default, bool sRgb = false) : + depthBits (depth), + stencilBits (stencil), + antialiasingLevel(antialiasing), + majorVersion (major), + minorVersion (minor), + attributeFlags (attributes), + sRgbCapable (sRgb) + { + } + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + unsigned int depthBits; ///< Bits of the depth buffer + unsigned int stencilBits; ///< Bits of the stencil buffer + unsigned int antialiasingLevel; ///< Level of antialiasing + unsigned int majorVersion; ///< Major number of the context version to create + unsigned int minorVersion; ///< Minor number of the context version to create + Uint32 attributeFlags; ///< The attribute flags to create the context with + bool sRgbCapable; ///< Whether the context framebuffer is sRGB capable +}; + +} // namespace sf + + +#endif // SFML_CONTEXTSETTINGS_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::ContextSettings +/// \ingroup window +/// +/// ContextSettings allows to define several advanced settings +/// of the OpenGL context attached to a window. All these +/// settings with the exception of the compatibility flag +/// and anti-aliasing level have no impact on the regular +/// SFML rendering (graphics module), so you may need to use +/// this structure only if you're using SFML as a windowing +/// system for custom OpenGL rendering. +/// +/// The depthBits and stencilBits members define the number +/// of bits per pixel requested for the (respectively) depth +/// and stencil buffers. +/// +/// antialiasingLevel represents the requested number of +/// multisampling levels for anti-aliasing. +/// +/// majorVersion and minorVersion define the version of the +/// OpenGL context that you want. Only versions greater or +/// equal to 3.0 are relevant; versions lesser than 3.0 are +/// all handled the same way (i.e. you can use any version +/// < 3.0 if you don't want an OpenGL 3 context). +/// +/// When requesting a context with a version greater or equal +/// to 3.2, you have the option of specifying whether the +/// context should follow the core or compatibility profile +/// of all newer (>= 3.2) OpenGL specifications. For versions +/// 3.0 and 3.1 there is only the core profile. By default +/// a compatibility context is created. You only need to specify +/// the core flag if you want a core profile context to use with +/// your own OpenGL rendering. +/// Warning: The graphics module will not function if you +/// request a core profile context. Make sure the attributes are +/// set to Default if you want to use the graphics module. +/// +/// Setting the debug attribute flag will request a context with +/// additional debugging features enabled. Depending on the +/// system, this might be required for advanced OpenGL debugging. +/// OpenGL debugging is disabled by default. +/// +/// Special Note for OS X: +/// Apple only supports choosing between either a legacy context +/// (OpenGL 2.1) or a core context (OpenGL version depends on the +/// operating system version but is at least 3.2). Compatibility +/// contexts are not supported. Further information is available on the +/// +/// OpenGL Capabilities Tables page. OS X also currently does +/// not support debug contexts. +/// +/// Please note that these values are only a hint. +/// No failure will be reported if one or more of these values +/// are not supported by the system; instead, SFML will try to +/// find the closest valid match. You can then retrieve the +/// settings that the window actually used to create its context, +/// with Window::getSettings(). +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/Event.hpp b/SFML-2.4.2/include/SFML/Window/Event.hpp new file mode 100644 index 0000000..7bfd610 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/Event.hpp @@ -0,0 +1,284 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_EVENT_HPP +#define SFML_EVENT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Defines a system event and its parameters +/// +//////////////////////////////////////////////////////////// +class Event +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Size events parameters (Resized) + /// + //////////////////////////////////////////////////////////// + struct SizeEvent + { + unsigned int width; ///< New width, in pixels + unsigned int height; ///< New height, in pixels + }; + + //////////////////////////////////////////////////////////// + /// \brief Keyboard event parameters (KeyPressed, KeyReleased) + /// + //////////////////////////////////////////////////////////// + struct KeyEvent + { + Keyboard::Key code; ///< Code of the key that has been pressed + bool alt; ///< Is the Alt key pressed? + bool control; ///< Is the Control key pressed? + bool shift; ///< Is the Shift key pressed? + bool system; ///< Is the System key pressed? + }; + + //////////////////////////////////////////////////////////// + /// \brief Text event parameters (TextEntered) + /// + //////////////////////////////////////////////////////////// + struct TextEvent + { + Uint32 unicode; ///< UTF-32 Unicode value of the character + }; + + //////////////////////////////////////////////////////////// + /// \brief Mouse move event parameters (MouseMoved) + /// + //////////////////////////////////////////////////////////// + struct MouseMoveEvent + { + int x; ///< X position of the mouse pointer, relative to the left of the owner window + int y; ///< Y position of the mouse pointer, relative to the top of the owner window + }; + + //////////////////////////////////////////////////////////// + /// \brief Mouse buttons events parameters + /// (MouseButtonPressed, MouseButtonReleased) + /// + //////////////////////////////////////////////////////////// + struct MouseButtonEvent + { + Mouse::Button button; ///< Code of the button that has been pressed + int x; ///< X position of the mouse pointer, relative to the left of the owner window + int y; ///< Y position of the mouse pointer, relative to the top of the owner window + }; + + //////////////////////////////////////////////////////////// + /// \brief Mouse wheel events parameters (MouseWheelMoved) + /// + /// \deprecated This event is deprecated and potentially inaccurate. + /// Use MouseWheelScrollEvent instead. + /// + //////////////////////////////////////////////////////////// + struct MouseWheelEvent + { + int delta; ///< Number of ticks the wheel has moved (positive is up, negative is down) + int x; ///< X position of the mouse pointer, relative to the left of the owner window + int y; ///< Y position of the mouse pointer, relative to the top of the owner window + }; + + //////////////////////////////////////////////////////////// + /// \brief Mouse wheel events parameters (MouseWheelScrolled) + /// + //////////////////////////////////////////////////////////// + struct MouseWheelScrollEvent + { + Mouse::Wheel wheel; ///< Which wheel (for mice with multiple ones) + float delta; ///< Wheel offset (positive is up/left, negative is down/right). High-precision mice may use non-integral offsets. + int x; ///< X position of the mouse pointer, relative to the left of the owner window + int y; ///< Y position of the mouse pointer, relative to the top of the owner window + }; + + //////////////////////////////////////////////////////////// + /// \brief Joystick connection events parameters + /// (JoystickConnected, JoystickDisconnected) + /// + //////////////////////////////////////////////////////////// + struct JoystickConnectEvent + { + unsigned int joystickId; ///< Index of the joystick (in range [0 .. Joystick::Count - 1]) + }; + + //////////////////////////////////////////////////////////// + /// \brief Joystick axis move event parameters (JoystickMoved) + /// + //////////////////////////////////////////////////////////// + struct JoystickMoveEvent + { + unsigned int joystickId; ///< Index of the joystick (in range [0 .. Joystick::Count - 1]) + Joystick::Axis axis; ///< Axis on which the joystick moved + float position; ///< New position on the axis (in range [-100 .. 100]) + }; + + //////////////////////////////////////////////////////////// + /// \brief Joystick buttons events parameters + /// (JoystickButtonPressed, JoystickButtonReleased) + /// + //////////////////////////////////////////////////////////// + struct JoystickButtonEvent + { + unsigned int joystickId; ///< Index of the joystick (in range [0 .. Joystick::Count - 1]) + unsigned int button; ///< Index of the button that has been pressed (in range [0 .. Joystick::ButtonCount - 1]) + }; + + //////////////////////////////////////////////////////////// + /// \brief Touch events parameters (TouchBegan, TouchMoved, TouchEnded) + /// + //////////////////////////////////////////////////////////// + struct TouchEvent + { + unsigned int finger; ///< Index of the finger in case of multi-touch events + int x; ///< X position of the touch, relative to the left of the owner window + int y; ///< Y position of the touch, relative to the top of the owner window + }; + + //////////////////////////////////////////////////////////// + /// \brief Sensor event parameters (SensorChanged) + /// + //////////////////////////////////////////////////////////// + struct SensorEvent + { + Sensor::Type type; ///< Type of the sensor + float x; ///< Current value of the sensor on X axis + float y; ///< Current value of the sensor on Y axis + float z; ///< Current value of the sensor on Z axis + }; + + //////////////////////////////////////////////////////////// + /// \brief Enumeration of the different types of events + /// + //////////////////////////////////////////////////////////// + enum EventType + { + Closed, ///< The window requested to be closed (no data) + Resized, ///< The window was resized (data in event.size) + LostFocus, ///< The window lost the focus (no data) + GainedFocus, ///< The window gained the focus (no data) + TextEntered, ///< A character was entered (data in event.text) + KeyPressed, ///< A key was pressed (data in event.key) + KeyReleased, ///< A key was released (data in event.key) + MouseWheelMoved, ///< The mouse wheel was scrolled (data in event.mouseWheel) (deprecated) + MouseWheelScrolled, ///< The mouse wheel was scrolled (data in event.mouseWheelScroll) + MouseButtonPressed, ///< A mouse button was pressed (data in event.mouseButton) + MouseButtonReleased, ///< A mouse button was released (data in event.mouseButton) + MouseMoved, ///< The mouse cursor moved (data in event.mouseMove) + MouseEntered, ///< The mouse cursor entered the area of the window (no data) + MouseLeft, ///< The mouse cursor left the area of the window (no data) + JoystickButtonPressed, ///< A joystick button was pressed (data in event.joystickButton) + JoystickButtonReleased, ///< A joystick button was released (data in event.joystickButton) + JoystickMoved, ///< The joystick moved along an axis (data in event.joystickMove) + JoystickConnected, ///< A joystick was connected (data in event.joystickConnect) + JoystickDisconnected, ///< A joystick was disconnected (data in event.joystickConnect) + TouchBegan, ///< A touch event began (data in event.touch) + TouchMoved, ///< A touch moved (data in event.touch) + TouchEnded, ///< A touch event ended (data in event.touch) + SensorChanged, ///< A sensor value changed (data in event.sensor) + + Count ///< Keep last -- the total number of event types + }; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + EventType type; ///< Type of the event + + union + { + SizeEvent size; ///< Size event parameters (Event::Resized) + KeyEvent key; ///< Key event parameters (Event::KeyPressed, Event::KeyReleased) + TextEvent text; ///< Text event parameters (Event::TextEntered) + MouseMoveEvent mouseMove; ///< Mouse move event parameters (Event::MouseMoved) + MouseButtonEvent mouseButton; ///< Mouse button event parameters (Event::MouseButtonPressed, Event::MouseButtonReleased) + MouseWheelEvent mouseWheel; ///< Mouse wheel event parameters (Event::MouseWheelMoved) (deprecated) + MouseWheelScrollEvent mouseWheelScroll; ///< Mouse wheel event parameters (Event::MouseWheelScrolled) + JoystickMoveEvent joystickMove; ///< Joystick move event parameters (Event::JoystickMoved) + JoystickButtonEvent joystickButton; ///< Joystick button event parameters (Event::JoystickButtonPressed, Event::JoystickButtonReleased) + JoystickConnectEvent joystickConnect; ///< Joystick (dis)connect event parameters (Event::JoystickConnected, Event::JoystickDisconnected) + TouchEvent touch; ///< Touch events parameters (Event::TouchBegan, Event::TouchMoved, Event::TouchEnded) + SensorEvent sensor; ///< Sensor event parameters (Event::SensorChanged) + }; +}; + +} // namespace sf + + +#endif // SFML_EVENT_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Event +/// \ingroup window +/// +/// sf::Event holds all the informations about a system event +/// that just happened. Events are retrieved using the +/// sf::Window::pollEvent and sf::Window::waitEvent functions. +/// +/// A sf::Event instance contains the type of the event +/// (mouse moved, key pressed, window closed, ...) as well +/// as the details about this particular event. Please note that +/// the event parameters are defined in a union, which means that +/// only the member matching the type of the event will be properly +/// filled; all other members will have undefined values and must not +/// be read if the type of the event doesn't match. For example, +/// if you received a KeyPressed event, then you must read the +/// event.key member, all other members such as event.MouseMove +/// or event.text will have undefined values. +/// +/// Usage example: +/// \code +/// sf::Event event; +/// while (window.pollEvent(event)) +/// { +/// // Request for closing the window +/// if (event.type == sf::Event::Closed) +/// window.close(); +/// +/// // The escape key was pressed +/// if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)) +/// window.close(); +/// +/// // The window was resized +/// if (event.type == sf::Event::Resized) +/// doSomethingWithTheNewSize(event.size.width, event.size.height); +/// +/// // etc ... +/// } +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/Export.hpp b/SFML-2.4.2/include/SFML/Window/Export.hpp new file mode 100644 index 0000000..a890bee --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/Export.hpp @@ -0,0 +1,48 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_WINDOW_EXPORT_HPP +#define SFML_WINDOW_EXPORT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +//////////////////////////////////////////////////////////// +// Define portable import / export macros +//////////////////////////////////////////////////////////// +#if defined(SFML_WINDOW_EXPORTS) + + #define SFML_WINDOW_API SFML_API_EXPORT + +#else + + #define SFML_WINDOW_API SFML_API_IMPORT + +#endif + + +#endif // SFML_WINDOW_EXPORT_HPP diff --git a/SFML-2.4.2/include/SFML/Window/GlResource.hpp b/SFML-2.4.2/include/SFML/Window/GlResource.hpp new file mode 100644 index 0000000..d386c08 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/GlResource.hpp @@ -0,0 +1,103 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_GLRESOURCE_HPP +#define SFML_GLRESOURCE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ + +class Context; + +//////////////////////////////////////////////////////////// +/// \brief Base class for classes that require an OpenGL context +/// +//////////////////////////////////////////////////////////// +class SFML_WINDOW_API GlResource +{ +protected: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + GlResource(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~GlResource(); + + //////////////////////////////////////////////////////////// + /// \brief Empty function for ABI compatibility, use acquireTransientContext instead + /// + //////////////////////////////////////////////////////////// + static void ensureGlContext(); + + //////////////////////////////////////////////////////////// + /// \brief RAII helper class to temporarily lock an available context for use + /// + //////////////////////////////////////////////////////////// + class SFML_WINDOW_API TransientContextLock : NonCopyable + { + public: + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + TransientContextLock(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~TransientContextLock(); + + private: + Context* m_context; ///< Temporary context, in case we needed to create one + }; +}; + +} // namespace sf + + +#endif // SFML_GLRESOURCE_HPP + +//////////////////////////////////////////////////////////// +/// \class sf::GlResource +/// \ingroup window +/// +/// This class is for internal use only, it must be the base +/// of every class that requires a valid OpenGL context in +/// order to work. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/Joystick.hpp b/SFML-2.4.2/include/SFML/Window/Joystick.hpp new file mode 100644 index 0000000..dda7369 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/Joystick.hpp @@ -0,0 +1,227 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_JOYSTICK_HPP +#define SFML_JOYSTICK_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Give access to the real-time state of the joysticks +/// +//////////////////////////////////////////////////////////// +class SFML_WINDOW_API Joystick +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Constants related to joysticks capabilities + /// + //////////////////////////////////////////////////////////// + enum + { + Count = 8, ///< Maximum number of supported joysticks + ButtonCount = 32, ///< Maximum number of supported buttons + AxisCount = 8 ///< Maximum number of supported axes + }; + + //////////////////////////////////////////////////////////// + /// \brief Axes supported by SFML joysticks + /// + //////////////////////////////////////////////////////////// + enum Axis + { + X, ///< The X axis + Y, ///< The Y axis + Z, ///< The Z axis + R, ///< The R axis + U, ///< The U axis + V, ///< The V axis + PovX, ///< The X axis of the point-of-view hat + PovY ///< The Y axis of the point-of-view hat + }; + + //////////////////////////////////////////////////////////// + /// \brief Structure holding a joystick's identification + /// + //////////////////////////////////////////////////////////// + struct SFML_WINDOW_API Identification + { + Identification(); + + String name; ///< Name of the joystick + unsigned int vendorId; ///< Manufacturer identifier + unsigned int productId; ///< Product identifier + }; + + //////////////////////////////////////////////////////////// + /// \brief Check if a joystick is connected + /// + /// \param joystick Index of the joystick to check + /// + /// \return True if the joystick is connected, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isConnected(unsigned int joystick); + + //////////////////////////////////////////////////////////// + /// \brief Return the number of buttons supported by a joystick + /// + /// If the joystick is not connected, this function returns 0. + /// + /// \param joystick Index of the joystick + /// + /// \return Number of buttons supported by the joystick + /// + //////////////////////////////////////////////////////////// + static unsigned int getButtonCount(unsigned int joystick); + + //////////////////////////////////////////////////////////// + /// \brief Check if a joystick supports a given axis + /// + /// If the joystick is not connected, this function returns false. + /// + /// \param joystick Index of the joystick + /// \param axis Axis to check + /// + /// \return True if the joystick supports the axis, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool hasAxis(unsigned int joystick, Axis axis); + + //////////////////////////////////////////////////////////// + /// \brief Check if a joystick button is pressed + /// + /// If the joystick is not connected, this function returns false. + /// + /// \param joystick Index of the joystick + /// \param button Button to check + /// + /// \return True if the button is pressed, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isButtonPressed(unsigned int joystick, unsigned int button); + + //////////////////////////////////////////////////////////// + /// \brief Get the current position of a joystick axis + /// + /// If the joystick is not connected, this function returns 0. + /// + /// \param joystick Index of the joystick + /// \param axis Axis to check + /// + /// \return Current position of the axis, in range [-100 .. 100] + /// + //////////////////////////////////////////////////////////// + static float getAxisPosition(unsigned int joystick, Axis axis); + + //////////////////////////////////////////////////////////// + /// \brief Get the joystick information + /// + /// \param joystick Index of the joystick + /// + /// \return Structure containing joystick information. + /// + //////////////////////////////////////////////////////////// + static Identification getIdentification(unsigned int joystick); + + //////////////////////////////////////////////////////////// + /// \brief Update the states of all joysticks + /// + /// This function is used internally by SFML, so you normally + /// don't have to call it explicitly. However, you may need to + /// call it if you have no window yet (or no window at all): + /// in this case the joystick states are not updated automatically. + /// + //////////////////////////////////////////////////////////// + static void update(); +}; + +} // namespace sf + + +#endif // SFML_JOYSTICK_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Joystick +/// \ingroup window +/// +/// sf::Joystick provides an interface to the state of the +/// joysticks. It only contains static functions, so it's not +/// meant to be instantiated. Instead, each joystick is identified +/// by an index that is passed to the functions of this class. +/// +/// This class allows users to query the state of joysticks at any +/// time and directly, without having to deal with a window and +/// its events. Compared to the JoystickMoved, JoystickButtonPressed +/// and JoystickButtonReleased events, sf::Joystick can retrieve the +/// state of axes and buttons of joysticks at any time +/// (you don't need to store and update a boolean on your side +/// in order to know if a button is pressed or released), and you +/// always get the real state of joysticks, even if they are +/// moved, pressed or released when your window is out of focus +/// and no event is triggered. +/// +/// SFML supports: +/// \li 8 joysticks (sf::Joystick::Count) +/// \li 32 buttons per joystick (sf::Joystick::ButtonCount) +/// \li 8 axes per joystick (sf::Joystick::AxisCount) +/// +/// Unlike the keyboard or mouse, the state of joysticks is sometimes +/// not directly available (depending on the OS), therefore an update() +/// function must be called in order to update the current state of +/// joysticks. When you have a window with event handling, this is done +/// automatically, you don't need to call anything. But if you have no +/// window, or if you want to check joysticks state before creating one, +/// you must call sf::Joystick::update explicitly. +/// +/// Usage example: +/// \code +/// // Is joystick #0 connected? +/// bool connected = sf::Joystick::isConnected(0); +/// +/// // How many buttons does joystick #0 support? +/// unsigned int buttons = sf::Joystick::getButtonCount(0); +/// +/// // Does joystick #0 define a X axis? +/// bool hasX = sf::Joystick::hasAxis(0, sf::Joystick::X); +/// +/// // Is button #2 pressed on joystick #0? +/// bool pressed = sf::Joystick::isButtonPressed(0, 2); +/// +/// // What's the current position of the Y axis on joystick #0? +/// float position = sf::Joystick::getAxisPosition(0, sf::Joystick::Y); +/// \endcode +/// +/// \see sf::Keyboard, sf::Mouse +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/Keyboard.hpp b/SFML-2.4.2/include/SFML/Window/Keyboard.hpp new file mode 100644 index 0000000..b35c7a0 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/Keyboard.hpp @@ -0,0 +1,224 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_KEYBOARD_HPP +#define SFML_KEYBOARD_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Give access to the real-time state of the keyboard +/// +//////////////////////////////////////////////////////////// +class SFML_WINDOW_API Keyboard +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Key codes + /// + //////////////////////////////////////////////////////////// + enum Key + { + Unknown = -1, ///< Unhandled key + A = 0, ///< The A key + B, ///< The B key + C, ///< The C key + D, ///< The D key + E, ///< The E key + F, ///< The F key + G, ///< The G key + H, ///< The H key + I, ///< The I key + J, ///< The J key + K, ///< The K key + L, ///< The L key + M, ///< The M key + N, ///< The N key + O, ///< The O key + P, ///< The P key + Q, ///< The Q key + R, ///< The R key + S, ///< The S key + T, ///< The T key + U, ///< The U key + V, ///< The V key + W, ///< The W key + X, ///< The X key + Y, ///< The Y key + Z, ///< The Z key + Num0, ///< The 0 key + Num1, ///< The 1 key + Num2, ///< The 2 key + Num3, ///< The 3 key + Num4, ///< The 4 key + Num5, ///< The 5 key + Num6, ///< The 6 key + Num7, ///< The 7 key + Num8, ///< The 8 key + Num9, ///< The 9 key + Escape, ///< The Escape key + LControl, ///< The left Control key + LShift, ///< The left Shift key + LAlt, ///< The left Alt key + LSystem, ///< The left OS specific key: window (Windows and Linux), apple (MacOS X), ... + RControl, ///< The right Control key + RShift, ///< The right Shift key + RAlt, ///< The right Alt key + RSystem, ///< The right OS specific key: window (Windows and Linux), apple (MacOS X), ... + Menu, ///< The Menu key + LBracket, ///< The [ key + RBracket, ///< The ] key + SemiColon, ///< The ; key + Comma, ///< The , key + Period, ///< The . key + Quote, ///< The ' key + Slash, ///< The / key + BackSlash, ///< The \ key + Tilde, ///< The ~ key + Equal, ///< The = key + Dash, ///< The - key + Space, ///< The Space key + Return, ///< The Return key + BackSpace, ///< The Backspace key + Tab, ///< The Tabulation key + PageUp, ///< The Page up key + PageDown, ///< The Page down key + End, ///< The End key + Home, ///< The Home key + Insert, ///< The Insert key + Delete, ///< The Delete key + Add, ///< The + key + Subtract, ///< The - key + Multiply, ///< The * key + Divide, ///< The / key + Left, ///< Left arrow + Right, ///< Right arrow + Up, ///< Up arrow + Down, ///< Down arrow + Numpad0, ///< The numpad 0 key + Numpad1, ///< The numpad 1 key + Numpad2, ///< The numpad 2 key + Numpad3, ///< The numpad 3 key + Numpad4, ///< The numpad 4 key + Numpad5, ///< The numpad 5 key + Numpad6, ///< The numpad 6 key + Numpad7, ///< The numpad 7 key + Numpad8, ///< The numpad 8 key + Numpad9, ///< The numpad 9 key + F1, ///< The F1 key + F2, ///< The F2 key + F3, ///< The F3 key + F4, ///< The F4 key + F5, ///< The F5 key + F6, ///< The F6 key + F7, ///< The F7 key + F8, ///< The F8 key + F9, ///< The F9 key + F10, ///< The F10 key + F11, ///< The F11 key + F12, ///< The F12 key + F13, ///< The F13 key + F14, ///< The F14 key + F15, ///< The F15 key + Pause, ///< The Pause key + + KeyCount ///< Keep last -- the total number of keyboard keys + }; + + //////////////////////////////////////////////////////////// + /// \brief Check if a key is pressed + /// + /// \param key Key to check + /// + /// \return True if the key is pressed, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isKeyPressed(Key key); + + //////////////////////////////////////////////////////////// + /// \brief Show or hide the virtual keyboard + /// + /// Warning: the virtual keyboard is not supported on all + /// systems. It will typically be implemented on mobile OSes + /// (Android, iOS) but not on desktop OSes (Windows, Linux, ...). + /// + /// If the virtual keyboard is not available, this function does + /// nothing. + /// + /// \param visible True to show, false to hide + /// + //////////////////////////////////////////////////////////// + static void setVirtualKeyboardVisible(bool visible); +}; + +} // namespace sf + + +#endif // SFML_KEYBOARD_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Keyboard +/// \ingroup window +/// +/// sf::Keyboard provides an interface to the state of the +/// keyboard. It only contains static functions (a single +/// keyboard is assumed), so it's not meant to be instantiated. +/// +/// This class allows users to query the keyboard state at any +/// time and directly, without having to deal with a window and +/// its events. Compared to the KeyPressed and KeyReleased events, +/// sf::Keyboard can retrieve the state of a key at any time +/// (you don't need to store and update a boolean on your side +/// in order to know if a key is pressed or released), and you +/// always get the real state of the keyboard, even if keys are +/// pressed or released when your window is out of focus and no +/// event is triggered. +/// +/// Usage example: +/// \code +/// if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) +/// { +/// // move left... +/// } +/// else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) +/// { +/// // move right... +/// } +/// else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) +/// { +/// // quit... +/// } +/// \endcode +/// +/// \see sf::Joystick, sf::Mouse, sf::Touch +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/Mouse.hpp b/SFML-2.4.2/include/SFML/Window/Mouse.hpp new file mode 100644 index 0000000..53d5281 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/Mouse.hpp @@ -0,0 +1,177 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_MOUSE_HPP +#define SFML_MOUSE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +class Window; + +//////////////////////////////////////////////////////////// +/// \brief Give access to the real-time state of the mouse +/// +//////////////////////////////////////////////////////////// +class SFML_WINDOW_API Mouse +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Mouse buttons + /// + //////////////////////////////////////////////////////////// + enum Button + { + Left, ///< The left mouse button + Right, ///< The right mouse button + Middle, ///< The middle (wheel) mouse button + XButton1, ///< The first extra mouse button + XButton2, ///< The second extra mouse button + + ButtonCount ///< Keep last -- the total number of mouse buttons + }; + + //////////////////////////////////////////////////////////// + /// \brief Mouse wheels + /// + //////////////////////////////////////////////////////////// + enum Wheel + { + VerticalWheel, ///< The vertical mouse wheel + HorizontalWheel ///< The horizontal mouse wheel + }; + + //////////////////////////////////////////////////////////// + /// \brief Check if a mouse button is pressed + /// + /// \param button Button to check + /// + /// \return True if the button is pressed, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isButtonPressed(Button button); + + //////////////////////////////////////////////////////////// + /// \brief Get the current position of the mouse in desktop coordinates + /// + /// This function returns the global position of the mouse + /// cursor on the desktop. + /// + /// \return Current position of the mouse + /// + //////////////////////////////////////////////////////////// + static Vector2i getPosition(); + + //////////////////////////////////////////////////////////// + /// \brief Get the current position of the mouse in window coordinates + /// + /// This function returns the current position of the mouse + /// cursor, relative to the given window. + /// + /// \param relativeTo Reference window + /// + /// \return Current position of the mouse + /// + //////////////////////////////////////////////////////////// + static Vector2i getPosition(const Window& relativeTo); + + //////////////////////////////////////////////////////////// + /// \brief Set the current position of the mouse in desktop coordinates + /// + /// This function sets the global position of the mouse + /// cursor on the desktop. + /// + /// \param position New position of the mouse + /// + //////////////////////////////////////////////////////////// + static void setPosition(const Vector2i& position); + + //////////////////////////////////////////////////////////// + /// \brief Set the current position of the mouse in window coordinates + /// + /// This function sets the current position of the mouse + /// cursor, relative to the given window. + /// + /// \param position New position of the mouse + /// \param relativeTo Reference window + /// + //////////////////////////////////////////////////////////// + static void setPosition(const Vector2i& position, const Window& relativeTo); +}; + +} // namespace sf + + +#endif // SFML_MOUSE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Mouse +/// \ingroup window +/// +/// sf::Mouse provides an interface to the state of the +/// mouse. It only contains static functions (a single +/// mouse is assumed), so it's not meant to be instantiated. +/// +/// This class allows users to query the mouse state at any +/// time and directly, without having to deal with a window and +/// its events. Compared to the MouseMoved, MouseButtonPressed +/// and MouseButtonReleased events, sf::Mouse can retrieve the +/// state of the cursor and the buttons at any time +/// (you don't need to store and update a boolean on your side +/// in order to know if a button is pressed or released), and you +/// always get the real state of the mouse, even if it is +/// moved, pressed or released when your window is out of focus +/// and no event is triggered. +/// +/// The setPosition and getPosition functions can be used to change +/// or retrieve the current position of the mouse pointer. There are +/// two versions: one that operates in global coordinates (relative +/// to the desktop) and one that operates in window coordinates +/// (relative to a specific window). +/// +/// Usage example: +/// \code +/// if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) +/// { +/// // left click... +/// } +/// +/// // get global mouse position +/// sf::Vector2i position = sf::Mouse::getPosition(); +/// +/// // set mouse position relative to a window +/// sf::Mouse::setPosition(sf::Vector2i(100, 200), window); +/// \endcode +/// +/// \see sf::Joystick, sf::Keyboard, sf::Touch +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/Sensor.hpp b/SFML-2.4.2/include/SFML/Window/Sensor.hpp new file mode 100644 index 0000000..9bef970 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/Sensor.hpp @@ -0,0 +1,150 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_SENSOR_HPP +#define SFML_SENSOR_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Give access to the real-time state of the sensors +/// +//////////////////////////////////////////////////////////// +class SFML_WINDOW_API Sensor +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Sensor type + /// + //////////////////////////////////////////////////////////// + enum Type + { + Accelerometer, ///< Measures the raw acceleration (m/s^2) + Gyroscope, ///< Measures the raw rotation rates (degrees/s) + Magnetometer, ///< Measures the ambient magnetic field (micro-teslas) + Gravity, ///< Measures the direction and intensity of gravity, independent of device acceleration (m/s^2) + UserAcceleration, ///< Measures the direction and intensity of device acceleration, independent of the gravity (m/s^2) + Orientation, ///< Measures the absolute 3D orientation (degrees) + + Count ///< Keep last -- the total number of sensor types + }; + + //////////////////////////////////////////////////////////// + /// \brief Check if a sensor is available on the underlying platform + /// + /// \param sensor Sensor to check + /// + /// \return True if the sensor is available, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isAvailable(Type sensor); + + //////////////////////////////////////////////////////////// + /// \brief Enable or disable a sensor + /// + /// All sensors are disabled by default, to avoid consuming too + /// much battery power. Once a sensor is enabled, it starts + /// sending events of the corresponding type. + /// + /// This function does nothing if the sensor is unavailable. + /// + /// \param sensor Sensor to enable + /// \param enabled True to enable, false to disable + /// + //////////////////////////////////////////////////////////// + static void setEnabled(Type sensor, bool enabled); + + //////////////////////////////////////////////////////////// + /// \brief Get the current sensor value + /// + /// \param sensor Sensor to read + /// + /// \return The current sensor value + /// + //////////////////////////////////////////////////////////// + static Vector3f getValue(Type sensor); +}; + +} // namespace sf + + +#endif // SFML_SENSOR_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Sensor +/// \ingroup window +/// +/// sf::Sensor provides an interface to the state of the +/// various sensors that a device provides. It only contains static +/// functions, so it's not meant to be instantiated. +/// +/// This class allows users to query the sensors values at any +/// time and directly, without having to deal with a window and +/// its events. Compared to the SensorChanged event, sf::Sensor +/// can retrieve the state of a sensor at any time (you don't need to +/// store and update its current value on your side). +/// +/// Depending on the OS and hardware of the device (phone, tablet, ...), +/// some sensor types may not be available. You should always check +/// the availability of a sensor before trying to read it, with the +/// sf::Sensor::isAvailable function. +/// +/// You may wonder why some sensor types look so similar, for example +/// Accelerometer and Gravity / UserAcceleration. The first one +/// is the raw measurement of the acceleration, and takes into account +/// both the earth gravity and the user movement. The others are +/// more precise: they provide these components separately, which is +/// usually more useful. In fact they are not direct sensors, they +/// are computed internally based on the raw acceleration and other sensors. +/// This is exactly the same for Gyroscope vs Orientation. +/// +/// Because sensors consume a non-negligible amount of current, they are +/// all disabled by default. You must call sf::Sensor::setEnabled for each +/// sensor in which you are interested. +/// +/// Usage example: +/// \code +/// if (sf::Sensor::isAvailable(sf::Sensor::Gravity)) +/// { +/// // gravity sensor is available +/// } +/// +/// // enable the gravity sensor +/// sf::Sensor::setEnabled(sf::Sensor::Gravity, true); +/// +/// // get the current value of gravity +/// sf::Vector3f gravity = sf::Sensor::getValue(sf::Sensor::Gravity); +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/Touch.hpp b/SFML-2.4.2/include/SFML/Window/Touch.hpp new file mode 100644 index 0000000..92c42df --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/Touch.hpp @@ -0,0 +1,137 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_TOUCH_HPP +#define SFML_TOUCH_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +class Window; + +//////////////////////////////////////////////////////////// +/// \brief Give access to the real-time state of the touches +/// +//////////////////////////////////////////////////////////// +class SFML_WINDOW_API Touch +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Check if a touch event is currently down + /// + /// \param finger Finger index + /// + /// \return True if \a finger is currently touching the screen, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isDown(unsigned int finger); + + //////////////////////////////////////////////////////////// + /// \brief Get the current position of a touch in desktop coordinates + /// + /// This function returns the current touch position + /// in global (desktop) coordinates. + /// + /// \param finger Finger index + /// + /// \return Current position of \a finger, or undefined if it's not down + /// + //////////////////////////////////////////////////////////// + static Vector2i getPosition(unsigned int finger); + + //////////////////////////////////////////////////////////// + /// \brief Get the current position of a touch in window coordinates + /// + /// This function returns the current touch position + /// relative to the given window. + /// + /// \param finger Finger index + /// \param relativeTo Reference window + /// + /// \return Current position of \a finger, or undefined if it's not down + /// + //////////////////////////////////////////////////////////// + static Vector2i getPosition(unsigned int finger, const Window& relativeTo); +}; + +} // namespace sf + + +#endif // SFML_TOUCH_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Touch +/// \ingroup window +/// +/// sf::Touch provides an interface to the state of the +/// touches. It only contains static functions, so it's not +/// meant to be instantiated. +/// +/// This class allows users to query the touches state at any +/// time and directly, without having to deal with a window and +/// its events. Compared to the TouchBegan, TouchMoved +/// and TouchEnded events, sf::Touch can retrieve the +/// state of the touches at any time (you don't need to store and +/// update a boolean on your side in order to know if a touch is down), +/// and you always get the real state of the touches, even if they +/// happen when your window is out of focus and no event is triggered. +/// +/// The getPosition function can be used to retrieve the current +/// position of a touch. There are two versions: one that operates +/// in global coordinates (relative to the desktop) and one that +/// operates in window coordinates (relative to a specific window). +/// +/// Touches are identified by an index (the "finger"), so that in +/// multi-touch events, individual touches can be tracked correctly. +/// As long as a finger touches the screen, it will keep the same index +/// even if other fingers start or stop touching the screen in the +/// meantime. As a consequence, active touch indices may not always be +/// sequential (i.e. touch number 0 may be released while touch number 1 +/// is still down). +/// +/// Usage example: +/// \code +/// if (sf::Touch::isDown(0)) +/// { +/// // touch 0 is down +/// } +/// +/// // get global position of touch 1 +/// sf::Vector2i globalPos = sf::Touch::getPosition(1); +/// +/// // get position of touch 1 relative to a window +/// sf::Vector2i relativePos = sf::Touch::getPosition(1, window); +/// \endcode +/// +/// \see sf::Joystick, sf::Keyboard, sf::Mouse +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/VideoMode.hpp b/SFML-2.4.2/include/SFML/Window/VideoMode.hpp new file mode 100644 index 0000000..fee45ae --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/VideoMode.hpp @@ -0,0 +1,228 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_VIDEOMODE_HPP +#define SFML_VIDEOMODE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief VideoMode defines a video mode (width, height, bpp) +/// +//////////////////////////////////////////////////////////// +class SFML_WINDOW_API VideoMode +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructors initializes all members to 0. + /// + //////////////////////////////////////////////////////////// + VideoMode(); + + //////////////////////////////////////////////////////////// + /// \brief Construct the video mode with its attributes + /// + /// \param modeWidth Width in pixels + /// \param modeHeight Height in pixels + /// \param modeBitsPerPixel Pixel depths in bits per pixel + /// + //////////////////////////////////////////////////////////// + VideoMode(unsigned int modeWidth, unsigned int modeHeight, unsigned int modeBitsPerPixel = 32); + + //////////////////////////////////////////////////////////// + /// \brief Get the current desktop video mode + /// + /// \return Current desktop video mode + /// + //////////////////////////////////////////////////////////// + static VideoMode getDesktopMode(); + + //////////////////////////////////////////////////////////// + /// \brief Retrieve all the video modes supported in fullscreen mode + /// + /// When creating a fullscreen window, the video mode is restricted + /// to be compatible with what the graphics driver and monitor + /// support. This function returns the complete list of all video + /// modes that can be used in fullscreen mode. + /// The returned array is sorted from best to worst, so that + /// the first element will always give the best mode (higher + /// width, height and bits-per-pixel). + /// + /// \return Array containing all the supported fullscreen modes + /// + //////////////////////////////////////////////////////////// + static const std::vector& getFullscreenModes(); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether or not the video mode is valid + /// + /// The validity of video modes is only relevant when using + /// fullscreen windows; otherwise any video mode can be used + /// with no restriction. + /// + /// \return True if the video mode is valid for fullscreen mode + /// + //////////////////////////////////////////////////////////// + bool isValid() const; + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + unsigned int width; ///< Video mode width, in pixels + unsigned int height; ///< Video mode height, in pixels + unsigned int bitsPerPixel; ///< Video mode pixel depth, in bits per pixels +}; + +//////////////////////////////////////////////////////////// +/// \relates VideoMode +/// \brief Overload of == operator to compare two video modes +/// +/// \param left Left operand (a video mode) +/// \param right Right operand (a video mode) +/// +/// \return True if modes are equal +/// +//////////////////////////////////////////////////////////// +SFML_WINDOW_API bool operator ==(const VideoMode& left, const VideoMode& right); + +//////////////////////////////////////////////////////////// +/// \relates VideoMode +/// \brief Overload of != operator to compare two video modes +/// +/// \param left Left operand (a video mode) +/// \param right Right operand (a video mode) +/// +/// \return True if modes are different +/// +//////////////////////////////////////////////////////////// +SFML_WINDOW_API bool operator !=(const VideoMode& left, const VideoMode& right); + +//////////////////////////////////////////////////////////// +/// \relates VideoMode +/// \brief Overload of < operator to compare video modes +/// +/// \param left Left operand (a video mode) +/// \param right Right operand (a video mode) +/// +/// \return True if \a left is lesser than \a right +/// +//////////////////////////////////////////////////////////// +SFML_WINDOW_API bool operator <(const VideoMode& left, const VideoMode& right); + +//////////////////////////////////////////////////////////// +/// \relates VideoMode +/// \brief Overload of > operator to compare video modes +/// +/// \param left Left operand (a video mode) +/// \param right Right operand (a video mode) +/// +/// \return True if \a left is greater than \a right +/// +//////////////////////////////////////////////////////////// +SFML_WINDOW_API bool operator >(const VideoMode& left, const VideoMode& right); + +//////////////////////////////////////////////////////////// +/// \relates VideoMode +/// \brief Overload of <= operator to compare video modes +/// +/// \param left Left operand (a video mode) +/// \param right Right operand (a video mode) +/// +/// \return True if \a left is lesser or equal than \a right +/// +//////////////////////////////////////////////////////////// +SFML_WINDOW_API bool operator <=(const VideoMode& left, const VideoMode& right); + +//////////////////////////////////////////////////////////// +/// \relates VideoMode +/// \brief Overload of >= operator to compare video modes +/// +/// \param left Left operand (a video mode) +/// \param right Right operand (a video mode) +/// +/// \return True if \a left is greater or equal than \a right +/// +//////////////////////////////////////////////////////////// +SFML_WINDOW_API bool operator >=(const VideoMode& left, const VideoMode& right); + +} // namespace sf + + +#endif // SFML_VIDEOMODE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::VideoMode +/// \ingroup window +/// +/// A video mode is defined by a width and a height (in pixels) +/// and a depth (in bits per pixel). Video modes are used to +/// setup windows (sf::Window) at creation time. +/// +/// The main usage of video modes is for fullscreen mode: +/// indeed you must use one of the valid video modes +/// allowed by the OS (which are defined by what the monitor +/// and the graphics card support), otherwise your window +/// creation will just fail. +/// +/// sf::VideoMode provides a static function for retrieving +/// the list of all the video modes supported by the system: +/// getFullscreenModes(). +/// +/// A custom video mode can also be checked directly for +/// fullscreen compatibility with its isValid() function. +/// +/// Additionally, sf::VideoMode provides a static function +/// to get the mode currently used by the desktop: getDesktopMode(). +/// This allows to build windows with the same size or pixel +/// depth as the current resolution. +/// +/// Usage example: +/// \code +/// // Display the list of all the video modes available for fullscreen +/// std::vector modes = sf::VideoMode::getFullscreenModes(); +/// for (std::size_t i = 0; i < modes.size(); ++i) +/// { +/// sf::VideoMode mode = modes[i]; +/// std::cout << "Mode #" << i << ": " +/// << mode.width << "x" << mode.height << " - " +/// << mode.bitsPerPixel << " bpp" << std::endl; +/// } +/// +/// // Create a window with the same pixel depth as the desktop +/// sf::VideoMode desktop = sf::VideoMode::getDesktopMode(); +/// window.create(sf::VideoMode(1024, 768, desktop.bitsPerPixel), "SFML window"); +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/Window.hpp b/SFML-2.4.2/include/SFML/Window/Window.hpp new file mode 100644 index 0000000..7135fdf --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/Window.hpp @@ -0,0 +1,594 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_WINDOW_HPP +#define SFML_WINDOW_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +namespace priv +{ + class GlContext; + class WindowImpl; +} + +class Event; + +//////////////////////////////////////////////////////////// +/// \brief Window that serves as a target for OpenGL rendering +/// +//////////////////////////////////////////////////////////// +class SFML_WINDOW_API Window : GlResource, NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// This constructor doesn't actually create the window, + /// use the other constructors or call create() to do so. + /// + //////////////////////////////////////////////////////////// + Window(); + + //////////////////////////////////////////////////////////// + /// \brief Construct a new window + /// + /// This constructor creates the window with the size and pixel + /// depth defined in \a mode. An optional style can be passed to + /// customize the look and behavior of the window (borders, + /// title bar, resizable, closable, ...). If \a style contains + /// Style::Fullscreen, then \a mode must be a valid video mode. + /// + /// The fourth parameter is an optional structure specifying + /// advanced OpenGL context settings such as antialiasing, + /// depth-buffer bits, etc. + /// + /// \param mode Video mode to use (defines the width, height and depth of the rendering area of the window) + /// \param title Title of the window + /// \param style %Window style, a bitwise OR combination of sf::Style enumerators + /// \param settings Additional settings for the underlying OpenGL context + /// + //////////////////////////////////////////////////////////// + Window(VideoMode mode, const String& title, Uint32 style = Style::Default, const ContextSettings& settings = ContextSettings()); + + //////////////////////////////////////////////////////////// + /// \brief Construct the window from an existing control + /// + /// Use this constructor if you want to create an OpenGL + /// rendering area into an already existing control. + /// + /// The second parameter is an optional structure specifying + /// advanced OpenGL context settings such as antialiasing, + /// depth-buffer bits, etc. + /// + /// \param handle Platform-specific handle of the control + /// \param settings Additional settings for the underlying OpenGL context + /// + //////////////////////////////////////////////////////////// + explicit Window(WindowHandle handle, const ContextSettings& settings = ContextSettings()); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + /// Closes the window and frees all the resources attached to it. + /// + //////////////////////////////////////////////////////////// + virtual ~Window(); + + //////////////////////////////////////////////////////////// + /// \brief Create (or recreate) the window + /// + /// If the window was already created, it closes it first. + /// If \a style contains Style::Fullscreen, then \a mode + /// must be a valid video mode. + /// + /// The fourth parameter is an optional structure specifying + /// advanced OpenGL context settings such as antialiasing, + /// depth-buffer bits, etc. + /// + /// \param mode Video mode to use (defines the width, height and depth of the rendering area of the window) + /// \param title Title of the window + /// \param style %Window style, a bitwise OR combination of sf::Style enumerators + /// \param settings Additional settings for the underlying OpenGL context + /// + //////////////////////////////////////////////////////////// + void create(VideoMode mode, const String& title, Uint32 style = Style::Default, const ContextSettings& settings = ContextSettings()); + + //////////////////////////////////////////////////////////// + /// \brief Create (or recreate) the window from an existing control + /// + /// Use this function if you want to create an OpenGL + /// rendering area into an already existing control. + /// If the window was already created, it closes it first. + /// + /// The second parameter is an optional structure specifying + /// advanced OpenGL context settings such as antialiasing, + /// depth-buffer bits, etc. + /// + /// \param handle Platform-specific handle of the control + /// \param settings Additional settings for the underlying OpenGL context + /// + //////////////////////////////////////////////////////////// + void create(WindowHandle handle, const ContextSettings& settings = ContextSettings()); + + //////////////////////////////////////////////////////////// + /// \brief Close the window and destroy all the attached resources + /// + /// After calling this function, the sf::Window instance remains + /// valid and you can call create() to recreate the window. + /// All other functions such as pollEvent() or display() will + /// still work (i.e. you don't have to test isOpen() every time), + /// and will have no effect on closed windows. + /// + //////////////////////////////////////////////////////////// + void close(); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether or not the window is open + /// + /// This function returns whether or not the window exists. + /// Note that a hidden window (setVisible(false)) is open + /// (therefore this function would return true). + /// + /// \return True if the window is open, false if it has been closed + /// + //////////////////////////////////////////////////////////// + bool isOpen() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the settings of the OpenGL context of the window + /// + /// Note that these settings may be different from what was + /// passed to the constructor or the create() function, + /// if one or more settings were not supported. In this case, + /// SFML chose the closest match. + /// + /// \return Structure containing the OpenGL context settings + /// + //////////////////////////////////////////////////////////// + const ContextSettings& getSettings() const; + + //////////////////////////////////////////////////////////// + /// \brief Pop the event on top of the event queue, if any, and return it + /// + /// This function is not blocking: if there's no pending event then + /// it will return false and leave \a event unmodified. + /// Note that more than one event may be present in the event queue, + /// thus you should always call this function in a loop + /// to make sure that you process every pending event. + /// \code + /// sf::Event event; + /// while (window.pollEvent(event)) + /// { + /// // process event... + /// } + /// \endcode + /// + /// \param event Event to be returned + /// + /// \return True if an event was returned, or false if the event queue was empty + /// + /// \see waitEvent + /// + //////////////////////////////////////////////////////////// + bool pollEvent(Event& event); + + //////////////////////////////////////////////////////////// + /// \brief Wait for an event and return it + /// + /// This function is blocking: if there's no pending event then + /// it will wait until an event is received. + /// After this function returns (and no error occurred), + /// the \a event object is always valid and filled properly. + /// This function is typically used when you have a thread that + /// is dedicated to events handling: you want to make this thread + /// sleep as long as no new event is received. + /// \code + /// sf::Event event; + /// if (window.waitEvent(event)) + /// { + /// // process event... + /// } + /// \endcode + /// + /// \param event Event to be returned + /// + /// \return False if any error occurred + /// + /// \see pollEvent + /// + //////////////////////////////////////////////////////////// + bool waitEvent(Event& event); + + //////////////////////////////////////////////////////////// + /// \brief Get the position of the window + /// + /// \return Position of the window, in pixels + /// + /// \see setPosition + /// + //////////////////////////////////////////////////////////// + Vector2i getPosition() const; + + //////////////////////////////////////////////////////////// + /// \brief Change the position of the window on screen + /// + /// This function only works for top-level windows + /// (i.e. it will be ignored for windows created from + /// the handle of a child window/control). + /// + /// \param position New position, in pixels + /// + /// \see getPosition + /// + //////////////////////////////////////////////////////////// + void setPosition(const Vector2i& position); + + //////////////////////////////////////////////////////////// + /// \brief Get the size of the rendering region of the window + /// + /// The size doesn't include the titlebar and borders + /// of the window. + /// + /// \return Size in pixels + /// + /// \see setSize + /// + //////////////////////////////////////////////////////////// + Vector2u getSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Change the size of the rendering region of the window + /// + /// \param size New size, in pixels + /// + /// \see getSize + /// + //////////////////////////////////////////////////////////// + void setSize(const Vector2u& size); + + //////////////////////////////////////////////////////////// + /// \brief Change the title of the window + /// + /// \param title New title + /// + /// \see setIcon + /// + //////////////////////////////////////////////////////////// + void setTitle(const String& title); + + //////////////////////////////////////////////////////////// + /// \brief Change the window's icon + /// + /// \a pixels must be an array of \a width x \a height pixels + /// in 32-bits RGBA format. + /// + /// The OS default icon is used by default. + /// + /// \param width Icon's width, in pixels + /// \param height Icon's height, in pixels + /// \param pixels Pointer to the array of pixels in memory. The + /// pixels are copied, so you need not keep the + /// source alive after calling this function. + /// + /// \see setTitle + /// + //////////////////////////////////////////////////////////// + void setIcon(unsigned int width, unsigned int height, const Uint8* pixels); + + //////////////////////////////////////////////////////////// + /// \brief Show or hide the window + /// + /// The window is shown by default. + /// + /// \param visible True to show the window, false to hide it + /// + //////////////////////////////////////////////////////////// + void setVisible(bool visible); + + //////////////////////////////////////////////////////////// + /// \brief Enable or disable vertical synchronization + /// + /// Activating vertical synchronization will limit the number + /// of frames displayed to the refresh rate of the monitor. + /// This can avoid some visual artifacts, and limit the framerate + /// to a good value (but not constant across different computers). + /// + /// Vertical synchronization is disabled by default. + /// + /// \param enabled True to enable v-sync, false to deactivate it + /// + //////////////////////////////////////////////////////////// + void setVerticalSyncEnabled(bool enabled); + + //////////////////////////////////////////////////////////// + /// \brief Show or hide the mouse cursor + /// + /// The mouse cursor is visible by default. + /// + /// \param visible True to show the mouse cursor, false to hide it + /// + //////////////////////////////////////////////////////////// + void setMouseCursorVisible(bool visible); + + //////////////////////////////////////////////////////////// + /// \brief Grab or release the mouse cursor + /// + /// If set, grabs the mouse cursor inside this window's client + /// area so it may no longer be moved outside its bounds. + /// Note that grabbing is only active while the window has + /// focus. + /// + /// \param grabbed True to enable, false to disable + /// + //////////////////////////////////////////////////////////// + void setMouseCursorGrabbed(bool grabbed); + + //////////////////////////////////////////////////////////// + /// \brief Enable or disable automatic key-repeat + /// + /// If key repeat is enabled, you will receive repeated + /// KeyPressed events while keeping a key pressed. If it is disabled, + /// you will only get a single event when the key is pressed. + /// + /// Key repeat is enabled by default. + /// + /// \param enabled True to enable, false to disable + /// + //////////////////////////////////////////////////////////// + void setKeyRepeatEnabled(bool enabled); + + //////////////////////////////////////////////////////////// + /// \brief Limit the framerate to a maximum fixed frequency + /// + /// If a limit is set, the window will use a small delay after + /// each call to display() to ensure that the current frame + /// lasted long enough to match the framerate limit. + /// SFML will try to match the given limit as much as it can, + /// but since it internally uses sf::sleep, whose precision + /// depends on the underlying OS, the results may be a little + /// unprecise as well (for example, you can get 65 FPS when + /// requesting 60). + /// + /// \param limit Framerate limit, in frames per seconds (use 0 to disable limit) + /// + //////////////////////////////////////////////////////////// + void setFramerateLimit(unsigned int limit); + + //////////////////////////////////////////////////////////// + /// \brief Change the joystick threshold + /// + /// The joystick threshold is the value below which + /// no JoystickMoved event will be generated. + /// + /// The threshold value is 0.1 by default. + /// + /// \param threshold New threshold, in the range [0, 100] + /// + //////////////////////////////////////////////////////////// + void setJoystickThreshold(float threshold); + + //////////////////////////////////////////////////////////// + /// \brief Activate or deactivate the window as the current target + /// for OpenGL rendering + /// + /// A window is active only on the current thread, if you want to + /// make it active on another thread you have to deactivate it + /// on the previous thread first if it was active. + /// Only one window can be active on a thread at a time, thus + /// the window previously active (if any) automatically gets deactivated. + /// This is not to be confused with requestFocus(). + /// + /// \param active True to activate, false to deactivate + /// + /// \return True if operation was successful, false otherwise + /// + //////////////////////////////////////////////////////////// + bool setActive(bool active = true) const; + + //////////////////////////////////////////////////////////// + /// \brief Request the current window to be made the active + /// foreground window + /// + /// At any given time, only one window may have the input focus + /// to receive input events such as keystrokes or mouse events. + /// If a window requests focus, it only hints to the operating + /// system, that it would like to be focused. The operating system + /// is free to deny the request. + /// This is not to be confused with setActive(). + /// + /// \see hasFocus + /// + //////////////////////////////////////////////////////////// + void requestFocus(); + + //////////////////////////////////////////////////////////// + /// \brief Check whether the window has the input focus + /// + /// At any given time, only one window may have the input focus + /// to receive input events such as keystrokes or most mouse + /// events. + /// + /// \return True if window has focus, false otherwise + /// \see requestFocus + /// + //////////////////////////////////////////////////////////// + bool hasFocus() const; + + //////////////////////////////////////////////////////////// + /// \brief Display on screen what has been rendered to the window so far + /// + /// This function is typically called after all OpenGL rendering + /// has been done for the current frame, in order to show + /// it on screen. + /// + //////////////////////////////////////////////////////////// + void display(); + + //////////////////////////////////////////////////////////// + /// \brief Get the OS-specific handle of the window + /// + /// The type of the returned handle is sf::WindowHandle, + /// which is a typedef to the handle type defined by the OS. + /// You shouldn't need to use this function, unless you have + /// very specific stuff to implement that SFML doesn't support, + /// or implement a temporary workaround until a bug is fixed. + /// + /// \return System handle of the window + /// + //////////////////////////////////////////////////////////// + WindowHandle getSystemHandle() const; + +protected: + + //////////////////////////////////////////////////////////// + /// \brief Function called after the window has been created + /// + /// This function is called so that derived classes can + /// perform their own specific initialization as soon as + /// the window is created. + /// + //////////////////////////////////////////////////////////// + virtual void onCreate(); + + //////////////////////////////////////////////////////////// + /// \brief Function called after the window has been resized + /// + /// This function is called so that derived classes can + /// perform custom actions when the size of the window changes. + /// + //////////////////////////////////////////////////////////// + virtual void onResize(); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Processes an event before it is sent to the user + /// + /// This function is called every time an event is received + /// from the internal window (through pollEvent or waitEvent). + /// It filters out unwanted events, and performs whatever internal + /// stuff the window needs before the event is returned to the + /// user. + /// + /// \param event Event to filter + /// + //////////////////////////////////////////////////////////// + bool filterEvent(const Event& event); + + //////////////////////////////////////////////////////////// + /// \brief Perform some common internal initializations + /// + //////////////////////////////////////////////////////////// + void initialize(); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + priv::WindowImpl* m_impl; ///< Platform-specific implementation of the window + priv::GlContext* m_context; ///< Platform-specific implementation of the OpenGL context + Clock m_clock; ///< Clock for measuring the elapsed time between frames + Time m_frameTimeLimit; ///< Current framerate limit + Vector2u m_size; ///< Current size of the window +}; + +} // namespace sf + + +#endif // SFML_WINDOW_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Window +/// \ingroup window +/// +/// sf::Window is the main class of the Window module. It defines +/// an OS window that is able to receive an OpenGL rendering. +/// +/// A sf::Window can create its own new window, or be embedded into +/// an already existing control using the create(handle) function. +/// This can be useful for embedding an OpenGL rendering area into +/// a view which is part of a bigger GUI with existing windows, +/// controls, etc. It can also serve as embedding an OpenGL rendering +/// area into a window created by another (probably richer) GUI library +/// like Qt or wxWidgets. +/// +/// The sf::Window class provides a simple interface for manipulating +/// the window: move, resize, show/hide, control mouse cursor, etc. +/// It also provides event handling through its pollEvent() and waitEvent() +/// functions. +/// +/// Note that OpenGL experts can pass their own parameters (antialiasing +/// level, bits for the depth and stencil buffers, etc.) to the +/// OpenGL context attached to the window, with the sf::ContextSettings +/// structure which is passed as an optional argument when creating the +/// window. +/// +/// Usage example: +/// \code +/// // Declare and create a new window +/// sf::Window window(sf::VideoMode(800, 600), "SFML window"); +/// +/// // Limit the framerate to 60 frames per second (this step is optional) +/// window.setFramerateLimit(60); +/// +/// // The main loop - ends as soon as the window is closed +/// while (window.isOpen()) +/// { +/// // Event processing +/// sf::Event event; +/// while (window.pollEvent(event)) +/// { +/// // Request for closing the window +/// if (event.type == sf::Event::Closed) +/// window.close(); +/// } +/// +/// // Activate the window for OpenGL rendering +/// window.setActive(); +/// +/// // OpenGL drawing commands go here... +/// +/// // End the current frame and display its contents on screen +/// window.display(); +/// } +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/WindowHandle.hpp b/SFML-2.4.2/include/SFML/Window/WindowHandle.hpp new file mode 100644 index 0000000..bfb4dc5 --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/WindowHandle.hpp @@ -0,0 +1,101 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_WINDOWHANDLE_HPP +#define SFML_WINDOWHANDLE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + +// Windows' HWND is a typedef on struct HWND__* +#if defined(SFML_SYSTEM_WINDOWS) + struct HWND__; +#endif + +namespace sf +{ +#if defined(SFML_SYSTEM_WINDOWS) + + // Window handle is HWND (HWND__*) on Windows + typedef HWND__* WindowHandle; + +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) + + // Window handle is Window (unsigned long) on Unix - X11 + typedef unsigned long WindowHandle; + +#elif defined(SFML_SYSTEM_MACOS) + + // Window handle is NSWindow or NSView (void*) on Mac OS X - Cocoa + typedef void* WindowHandle; + +#elif defined(SFML_SYSTEM_IOS) + + // Window handle is UIWindow (void*) on iOS - UIKit + typedef void* WindowHandle; + +#elif defined(SFML_SYSTEM_ANDROID) + + // Window handle is ANativeWindow* (void*) on Android + typedef void* WindowHandle; + +#elif defined(SFML_DOXYGEN) + + // Define typedef symbol so that Doxygen can attach some documentation to it + typedef "platform–specific" WindowHandle; + +#endif + +} // namespace sf + + +#endif // SFML_WINDOWHANDLE_HPP + +//////////////////////////////////////////////////////////// +/// \typedef sf::WindowHandle +/// \ingroup window +/// +/// Define a low-level window handle type, specific to +/// each platform. +/// +/// Platform | Type +/// ----------------|------------------------------------------------------------ +/// Windows | \p HWND +/// Linux/FreeBSD | \p %Window +/// Mac OS X | either \p NSWindow* or \p NSView*, disguised as \p void* +/// iOS | \p UIWindow* +/// Android | \p ANativeWindow* +/// +/// \par Mac OS X Specification +/// +/// On Mac OS X, a sf::Window can be created either from an +/// existing \p NSWindow* or an \p NSView*. When the window +/// is created from a window, SFML will use its content view +/// as the OpenGL area. sf::Window::getSystemHandle() will +/// return the handle that was used to create the window, +/// which is a \p NSWindow* by default. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML-2.4.2/include/SFML/Window/WindowStyle.hpp b/SFML-2.4.2/include/SFML/Window/WindowStyle.hpp new file mode 100644 index 0000000..8623d1f --- /dev/null +++ b/SFML-2.4.2/include/SFML/Window/WindowStyle.hpp @@ -0,0 +1,53 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_WINDOWSTYLE_HPP +#define SFML_WINDOWSTYLE_HPP + + +namespace sf +{ +namespace Style +{ + //////////////////////////////////////////////////////////// + /// \ingroup window + /// \brief Enumeration of the window styles + /// + //////////////////////////////////////////////////////////// + enum + { + None = 0, ///< No border / title bar (this flag and all others are mutually exclusive) + Titlebar = 1 << 0, ///< Title bar + fixed border + Resize = 1 << 1, ///< Title bar + resizable border + maximize button + Close = 1 << 2, ///< Title bar + close button + Fullscreen = 1 << 3, ///< Fullscreen mode (this flag and all others are mutually exclusive) + + Default = Titlebar | Resize | Close ///< Default window style + }; +} + +} // namespace sf + + +#endif // SFML_WINDOWSTYLE_HPP diff --git a/SFML-2.4.2/license.txt b/SFML-2.4.2/license.txt new file mode 100644 index 0000000..c988c6f --- /dev/null +++ b/SFML-2.4.2/license.txt @@ -0,0 +1,37 @@ +SFML +---- + +SFML - Copyright (C) 2007-2017 Laurent Gomila - laurent@sfml-dev.org + +This software is provided 'as-is', without any express or +implied warranty. In no event will the authors be held +liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute +it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but + is not required. + +2. Altered source versions must be plainly marked as such, + and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any + source distribution. + + + +External libraries used by SFML +------------------------------- + +* OpenAL-Soft is under the LGPL license +* libjpeg is public domain +* stb_image and stb_image_write are public domain +* freetype is under the FreeType license or the GPL license +* libogg is under the BSD license +* libvorbis is under the BSD license +* libflac is under the BSD license diff --git a/SFML-2.4.2/readme.txt b/SFML-2.4.2/readme.txt new file mode 100644 index 0000000..28beb60 --- /dev/null +++ b/SFML-2.4.2/readme.txt @@ -0,0 +1,44 @@ +SFML - Simple and Fast Multimedia Library +========================================= + +SFML is a simple, fast, cross-platform and object-oriented multimedia API. It provides access to windowing, graphics, audio and network. +It is written in C++, and has bindings for various languages such as C, .Net, Ruby, Python. + +Authors +------- + +Laurent Gomila - main developer (laurent@sfml-dev.org) +Marco Antognini - OS X developer (hiura@sfml-dev.org) +Jonathan De Wachter - Android developer (dewachter.jonathan@gmail.com) +Jan Haller (bromeon@sfml-dev.org) +Stefan Schindler (tank@sfml-dev.org) +Lukas Dürrenberger (eXpl0it3r@sfml-dev.org) +binary1248 (binary1248@hotmail.com) +Artur Moreira (artturmoreira@gmail.com) +Mario Liebisch (mario@sfml-dev.org) + +Download +-------- + +You can get the latest official release on SFML website (http://www.sfml-dev.org/download.php). +You can also get the current development version from the git repository (https://github.com/SFML/SFML). + +Install +------- + +Follow the instructions of the tutorials (http://www.sfml-dev.org/tutorials/), there is one for each platform/compiler that SFML supports. + +Learn +----- + +There are several places to learn SFML: +* The official tutorials (http://www.sfml-dev.org/tutorials/) +* The online API documentation (http://www.sfml-dev.org/documentation/) +* The community wiki (https://github.com/SFML/SFML/wiki/) +* The community forum (http://en.sfml-dev.org/forums/) (or http://fr.sfml-dev.org/forums/ for French people) + +Contribute +---------- + +SFML is an open-source project, and it needs your help to go on growing and improving. +If you want to get involved and suggest some additional features, file a bug report or submit a patch, please have a look at the contribution guidelines (http://www.sfml-dev.org/contribute.php). diff --git a/Utils/Clamp.h b/Utils/Clamp.h new file mode 100644 index 0000000..8e57370 --- /dev/null +++ b/Utils/Clamp.h @@ -0,0 +1,20 @@ +/* + * Clamp.h + * + * Created on: May 7, 2013 + * Author: chibi_000 + */ + +#ifndef CLAMP_H_ +#define CLAMP_H_ + +#include + +template +A clamp (A value, B minimum, C maximum) +{ + return std::min( std::max(value, minimum) , maximum); +} + + +#endif /* CLAMP_H_ */ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..27374cb --- /dev/null +++ b/main.cpp @@ -0,0 +1,21 @@ +/* + * main.cpp + * + * Created on: May 4, 2013 + * Author: chibi_000 + */ + +#include "Application.h" +#include + +using namespace std; + +int main() +{ + Application app; + return app.run(); + + return 0; +} + +

    L0brP+TtrairC;zh5 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�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