315 lines
12 KiB
C++
315 lines
12 KiB
C++
|
////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// SFML - Simple and Fast Multimedia Library
|
||
|
// Copyright (C) 2007-2018 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 <SFML/Graphics/Export.hpp>
|
||
|
#include <SFML/Graphics/Texture.hpp>
|
||
|
#include <SFML/Graphics/RenderTarget.hpp>
|
||
|
#include <SFML/Window/ContextSettings.hpp>
|
||
|
|
||
|
|
||
|
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
|
||
|
///
|
||
|
/// \deprecated Use create(unsigned int, unsigned int, const ContextSettings&) instead.
|
||
|
///
|
||
|
////////////////////////////////////////////////////////////
|
||
|
SFML_DEPRECATED bool create(unsigned int width, unsigned int height, bool depthBuffer);
|
||
|
|
||
|
////////////////////////////////////////////////////////////
|
||
|
/// \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 settings, is useful if you want to enable
|
||
|
/// multi-sampling or use the render-texture for OpenGL rendering that
|
||
|
/// requires a depth or stencil buffer. Otherwise it is unnecessary, and
|
||
|
/// you should leave this parameter at its default value.
|
||
|
///
|
||
|
/// \param width Width of the render-texture
|
||
|
/// \param height Height of the render-texture
|
||
|
/// \param settings Additional settings for the underlying OpenGL texture and context
|
||
|
///
|
||
|
/// \return True if creation has been successful
|
||
|
///
|
||
|
////////////////////////////////////////////////////////////
|
||
|
bool create(unsigned int width, unsigned int height, const ContextSettings& settings = ContextSettings());
|
||
|
|
||
|
////////////////////////////////////////////////////////////
|
||
|
/// \brief Get the maximum anti-aliasing level supported by the system
|
||
|
///
|
||
|
/// \return The maximum anti-aliasing level supported by the system
|
||
|
///
|
||
|
////////////////////////////////////////////////////////////
|
||
|
static unsigned int getMaximumAntialiasingLevel();
|
||
|
|
||
|
////////////////////////////////////////////////////////////
|
||
|
/// \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:
|
||
|
|
||
|
////////////////////////////////////////////////////////////
|
||
|
// 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
|
||
|
///
|
||
|
////////////////////////////////////////////////////////////
|