1f67b43e8ee4dd75e18f487a1d09b8f355eb54db
[supertux.git] / src / object / display_effect.cpp
1 #include <config.h>
2 #include "display_effect.hpp"
3
4 #include <assert.h>
5 #include "video/drawing_context.hpp"
6 #include "main.hpp"
7
8 DisplayEffect::DisplayEffect()
9     : type(NO_FADE), fadetime(0), fading(0), black(false)
10 {
11  border_size = 0; 
12  borders_fading = false;
13  borders_active = false;
14 }
15
16 DisplayEffect::~DisplayEffect()
17 {
18 }
19
20 void
21 DisplayEffect::update(float elapsed_time)
22 {
23     if (borders_fading) {
24       if (border_size < 75) border_size += 1.5;
25       else borders_active = true;
26     }
27     else if (borders_active) {
28       if (border_size > 0) border_size -= 1.5;
29       else borders_active = false;
30     }
31     switch(type) {
32         case NO_FADE:
33             return;
34         case FADE_IN:
35             fading -= elapsed_time;
36             if(fading < 0) {
37                 type = NO_FADE;
38             }
39             break;
40         case FADE_OUT:
41             fading -= elapsed_time;
42             if(fading < 0) {
43                 type = NO_FADE;
44                 black = true;
45             }
46             break;
47         default:
48             assert(false);
49     }
50 }
51
52 void
53 DisplayEffect::draw(DrawingContext& context)
54 {
55     context.push_transform();
56     context.set_translation(Vector(0, 0));
57
58     if(black || type != NO_FADE) {    
59       float alpha;
60       if(black) {
61           alpha = 1.0f;
62       } else {
63           switch(type) {
64               case FADE_IN:
65                   alpha = fading / fadetime;
66                   break;
67               case FADE_OUT:
68                   alpha = (fadetime-fading) / fadetime;
69                   break;
70               default:
71                   alpha = 0;
72                   assert(false);
73           }
74       }
75       context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT),
76               Color(0, 0, 0, alpha), LAYER_GUI-10);
77     }
78
79     if (borders_fading || borders_active) {
80       context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, border_size),
81               Color(0, 0, 0, 1.0f), LAYER_GUI-10);
82       context.draw_filled_rect(Vector(0, SCREEN_HEIGHT - border_size), Vector(SCREEN_WIDTH, border_size),
83               Color(0, 0, 0, 1.0f), LAYER_GUI-10);
84     }
85
86     context.pop_transform();
87 }
88
89 void
90 DisplayEffect::fade_out(float fadetime)
91 {
92     black = false;
93     this->fadetime = fadetime;
94     fading = fadetime;
95     type = FADE_OUT;
96 }
97
98 void
99 DisplayEffect::fade_in(float fadetime)
100 {
101     black = false;
102     this->fadetime = fadetime;
103     fading = fadetime;
104     type = FADE_IN;
105 }
106
107 void
108 DisplayEffect::set_black(bool enabled)
109 {
110     black = enabled;
111 }
112
113 bool
114 DisplayEffect::is_black()
115 {
116     return black;
117 }
118
119 void
120 DisplayEffect::sixteen_to_nine()
121 {
122   borders_fading = true;
123 }
124
125 void
126 DisplayEffect::four_to_three()
127 {
128   borders_fading = false;
129 }
130