TGUI  0.8-dev
Clipping.hpp
1 //
3 // TGUI - Texus' Graphical User Interface
4 // Copyright (C) 2012-2017 Bruno Van de Velde (vdv_b@tgui.eu)
5 //
6 // This software is provided 'as-is', without any express or implied warranty.
7 // In no event will the authors be held liable for any damages arising from the use of this software.
8 //
9 // Permission is granted to anyone to use this software for any purpose,
10 // including commercial applications, and to alter it and redistribute it freely,
11 // subject to the following restrictions:
12 //
13 // 1. The origin of this software must not be misrepresented;
14 // you must not claim that you wrote the original software.
15 // If you use this software in a product, an acknowledgment
16 // in the product documentation would be appreciated but is not required.
17 //
18 // 2. Altered source versions must be plainly marked as such,
19 // and must not be misrepresented as being the original software.
20 //
21 // 3. This notice may not be removed or altered from any source distribution.
22 //
24 
25 
26 #ifndef TGUI_CLIPPING_HPP
27 #define TGUI_CLIPPING_HPP
28 
29 #include <TGUI/Global.hpp>
30 #include <SFML/Graphics/RenderTarget.hpp>
31 #include <SFML/Graphics/View.hpp>
32 #include <SFML/OpenGL.hpp>
33 
35 
36 namespace tgui
37 {
39 
40  class TGUI_API Clipping
41  {
42  public:
43 
53  Clipping(const sf::RenderTarget& target, const sf::RenderStates& states, sf::Vector2f topLeft, sf::Vector2f size)
54  {
55  const sf::View& view = target.getView();
56  sf::Vector2f bottomRight = topLeft + size;
57 
58  // Calculate the scale factor of the view
59  float scaleViewX = target.getSize().x / view.getSize().x;
60  float scaleViewY = target.getSize().y / view.getSize().y;
61 
62  // Get the global position
63  sf::Vector2f topLeftPosition = {((topLeft.x - view.getCenter().x + (view.getSize().x / 2.f)) * view.getViewport().width) + (view.getSize().x * view.getViewport().left),
64  ((topLeft.y - view.getCenter().y + (view.getSize().y / 2.f)) * view.getViewport().height) + (view.getSize().y * view.getViewport().top)};
65  sf::Vector2f bottomRightPosition = {(bottomRight.x - view.getCenter().x + (view.getSize().x / 2.f)) * view.getViewport().width + (view.getSize().x * view.getViewport().left),
66  (bottomRight.y - view.getCenter().y + (view.getSize().y / 2.f)) * view.getViewport().height + (view.getSize().y * view.getViewport().top)};
67 
68  topLeftPosition = states.transform.transformPoint(topLeftPosition);
69  bottomRightPosition = states.transform.transformPoint(bottomRightPosition);
70 
71  // Get the old clipping area
72  glGetIntegerv(GL_SCISSOR_BOX, m_scissor);
73 
74  // Calculate the clipping area
75  GLint scissorLeft = std::max(static_cast<GLint>(topLeftPosition.x * scaleViewX), m_scissor[0]);
76  GLint scissorTop = std::max(static_cast<GLint>(topLeftPosition.y * scaleViewY), static_cast<GLint>(target.getSize().y) - m_scissor[1] - m_scissor[3]);
77  GLint scissorRight = std::min(static_cast<GLint>(bottomRightPosition.x * scaleViewX), m_scissor[0] + m_scissor[2]);
78  GLint scissorBottom = std::min(static_cast<GLint>(bottomRightPosition.y * scaleViewY), static_cast<GLint>(target.getSize().y) - m_scissor[1]);
79 
80  // If the object outside the window then don't draw anything
81  if (scissorRight < scissorLeft)
82  scissorRight = scissorLeft;
83  else if (scissorBottom < scissorTop)
84  scissorTop = scissorBottom;
85 
86  // Set the clipping area
87  glScissor(scissorLeft, target.getSize().y - scissorBottom, scissorRight - scissorLeft, scissorBottom - scissorTop);
88  }
89 
91 
92  // The clipping object cannot be copied
93  Clipping(const Clipping& copy) = delete;
94  Clipping& operator=(const Clipping& right) = delete;
95 
97 
98  // When the clipping object is destroyed, the old clipping is restored
99  ~Clipping()
100  {
101  glScissor(m_scissor[0], m_scissor[1], m_scissor[2], m_scissor[3]);
102  };
103 
104 
106  private:
107 
108  GLint m_scissor[4];
109  };
110 
112 }
113 
115 
116 #endif // TGUI_CLIPPING_HPP
Namespace that contains all TGUI functions and classes.
Definition: Animation.hpp:33
Clipping(const sf::RenderTarget &target, const sf::RenderStates &states, sf::Vector2f topLeft, sf::Vector2f size)
Creates a clipping object which will define a clipping region until the object is destroyed...
Definition: Clipping.hpp:53
Definition: Clipping.hpp:40