display_effect.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // SuperTux
  2. // Copyright (C) 2006 Matthias Braun <matze@braunis.de>
  3. //
  4. // This program is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. #include "object/display_effect.hpp"
  17. #include "supertux/globals.hpp"
  18. #include "video/drawing_context.hpp"
  19. static const float BORDER_SIZE = 75;
  20. DisplayEffect::DisplayEffect(const std::string& name) :
  21. GameObject(name),
  22. ExposedObject<DisplayEffect, scripting::DisplayEffect>(this),
  23. screen_fade(FadeType::NO_FADE),
  24. screen_fadetime(0),
  25. screen_fading(0),
  26. border_fade(FadeType::NO_FADE),
  27. border_fadetime(0),
  28. border_fading(),
  29. border_size(0),
  30. black(false),
  31. borders(false)
  32. {
  33. }
  34. DisplayEffect::~DisplayEffect()
  35. {
  36. }
  37. void
  38. DisplayEffect::update(float dt_sec)
  39. {
  40. switch (screen_fade) {
  41. case FadeType::NO_FADE:
  42. break;
  43. case FadeType::FADE_IN:
  44. screen_fading -= dt_sec;
  45. if (screen_fading < 0) {
  46. screen_fade = FadeType::NO_FADE;
  47. }
  48. break;
  49. case FadeType::FADE_OUT:
  50. screen_fading -= dt_sec;
  51. if (screen_fading < 0) {
  52. screen_fade = FadeType::NO_FADE;
  53. black = true;
  54. }
  55. break;
  56. default:
  57. assert(false);
  58. }
  59. switch (border_fade) {
  60. case FadeType::NO_FADE:
  61. break;
  62. case FadeType::FADE_IN:
  63. border_fading -= dt_sec;
  64. if (border_fading < 0) {
  65. border_fade = FadeType::NO_FADE;
  66. }
  67. border_size = (border_fadetime - border_fading)
  68. / border_fadetime * BORDER_SIZE;
  69. break;
  70. case FadeType::FADE_OUT:
  71. border_fading -= dt_sec;
  72. if (border_fading < 0) {
  73. borders = false;
  74. border_fade = FadeType::NO_FADE;
  75. }
  76. border_size = border_fading / border_fadetime * BORDER_SIZE;
  77. break;
  78. default:
  79. assert(false);
  80. }
  81. }
  82. void
  83. DisplayEffect::draw(DrawingContext& context)
  84. {
  85. context.push_transform();
  86. context.set_translation(Vector(0, 0));
  87. context.transform().scale = 1.f;
  88. if (black || screen_fade != FadeType::NO_FADE) {
  89. float alpha;
  90. if (black) {
  91. alpha = 1.0f;
  92. } else {
  93. switch (screen_fade) {
  94. case FadeType::FADE_IN:
  95. alpha = screen_fading / screen_fadetime;
  96. break;
  97. case FadeType::FADE_OUT:
  98. alpha = (screen_fadetime - screen_fading) / screen_fadetime;
  99. break;
  100. default:
  101. alpha = 0.0f; // NOLINT
  102. assert(false);
  103. }
  104. // Same as in fadetoblack.cpp.
  105. alpha = Color::remove_gamma(alpha);
  106. }
  107. context.color().draw_filled_rect(context.get_rect(), Color(0, 0, 0, alpha), LAYER_GUI - 10);
  108. }
  109. if (borders) {
  110. context.color().draw_filled_rect(Rectf(0, 0,
  111. context.get_width(),
  112. static_cast<float>(border_size)),
  113. Color(0, 0, 0, 1.0f), LAYER_GUI-10);
  114. context.color().draw_filled_rect(Rectf(Vector(0,
  115. context.get_height() - border_size),
  116. Sizef(context.get_width(),
  117. static_cast<float>(border_size))),
  118. Color(0, 0, 0, 1.0f), LAYER_GUI-10);
  119. }
  120. context.pop_transform();
  121. }
  122. void
  123. DisplayEffect::fade_out(float fadetime)
  124. {
  125. black = false;
  126. screen_fadetime = fadetime;
  127. screen_fading = fadetime;
  128. screen_fade = FadeType::FADE_OUT;
  129. }
  130. void
  131. DisplayEffect::fade_in(float fadetime)
  132. {
  133. black = false;
  134. screen_fadetime = fadetime;
  135. screen_fading = fadetime;
  136. screen_fade = FadeType::FADE_IN;
  137. }
  138. void
  139. DisplayEffect::set_black(bool enabled)
  140. {
  141. black = enabled;
  142. }
  143. bool
  144. DisplayEffect::is_black() const
  145. {
  146. return black;
  147. }
  148. void
  149. DisplayEffect::sixteen_to_nine(float fadetime)
  150. {
  151. if (fadetime == 0) {
  152. borders = true;
  153. border_size = BORDER_SIZE;
  154. } else {
  155. borders = true;
  156. border_size = 0;
  157. border_fade = FadeType::FADE_IN;
  158. border_fadetime = fadetime;
  159. border_fading = border_fadetime;
  160. }
  161. }
  162. void
  163. DisplayEffect::four_to_three(float fadetime)
  164. {
  165. if (fadetime == 0) {
  166. borders = false;
  167. } else {
  168. border_size = BORDER_SIZE;
  169. border_fade = FadeType::FADE_OUT;
  170. border_fadetime = fadetime;
  171. border_fading = border_fadetime;
  172. }
  173. }
  174. /* EOF */