c2b1538d6fb17503dd387e11d71b20fb14b5980e
[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 "scripting/wrapper_util.hpp"
7 #include "main.hpp"
8
9 static const float BORDER_SIZE = 75;
10
11 DisplayEffect::DisplayEffect()
12     : screen_fade(NO_FADE), screen_fadetime(0), screen_fading(0),
13       border_fade(NO_FADE), border_fadetime(0), border_size(0),
14       black(false), borders(false)
15 {
16 }
17
18 DisplayEffect::~DisplayEffect()
19 {
20 }
21
22 void
23 DisplayEffect::expose(HSQUIRRELVM vm, int table_idx)
24 {
25   Scripting::DisplayEffect* interface = static_cast<Scripting::DisplayEffect*> (this);
26   expose_object(vm, table_idx, interface, "Effect", false);
27 }
28
29 void
30 DisplayEffect::unexpose(HSQUIRRELVM vm, int table_idx)
31 {
32   try {
33     Scripting::unexpose_object(vm, table_idx, "Effect");
34   } catch(...) {
35     // for now...
36   }
37 }
38
39 void
40 DisplayEffect::update(float elapsed_time)
41 {
42     switch(screen_fade) {
43         case NO_FADE:
44             break;
45         case FADE_IN:
46             screen_fading -= elapsed_time;
47             if(screen_fading < 0) {
48                 screen_fade = NO_FADE;
49             }
50             break;
51         case FADE_OUT:
52             screen_fading -= elapsed_time;
53             if(screen_fading < 0) {
54                 screen_fade = NO_FADE;
55                 black = true;
56             }
57             break;
58         default:
59             assert(false);
60     }
61
62     switch(border_fade) {
63         case NO_FADE:
64             break;
65         case FADE_IN:
66             border_fading -= elapsed_time;
67             if(border_fading < 0) {
68                 border_fade = NO_FADE;
69             }
70             border_size = border_fading / border_fading * BORDER_SIZE;
71             break;
72         case FADE_OUT:
73             border_fading -= elapsed_time;
74             if(border_fading < 0) {
75                 borders = false;
76                 border_fade = NO_FADE;
77             }
78             border_size = (border_fadetime - border_fading) 
79                 / border_fadetime * BORDER_SIZE;
80             break;
81         default:
82             assert(false);
83     }       
84 }
85
86 void
87 DisplayEffect::draw(DrawingContext& context)
88 {
89     context.push_transform();
90     context.set_translation(Vector(0, 0));
91
92     if(black || screen_fade != NO_FADE) {    
93       float alpha;
94       if(black) {
95           alpha = 1.0f;
96       } else {
97           switch(screen_fade) {
98               case FADE_IN:
99                   alpha = screen_fading / screen_fadetime;
100                   break;
101               case FADE_OUT:
102                   alpha = (screen_fadetime - screen_fading) / screen_fadetime;
103                   break;
104               default:
105                   alpha = 0;
106                   assert(false);
107           }
108       }
109       context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT),
110               Color(0, 0, 0, alpha), LAYER_GUI-10);
111     }
112
113     if (borders) {
114       context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, border_size),
115               Color(0, 0, 0, 1.0f), LAYER_GUI-10);
116       context.draw_filled_rect(Vector(0, SCREEN_HEIGHT - border_size), Vector(SCREEN_WIDTH, border_size),
117               Color(0, 0, 0, 1.0f), LAYER_GUI-10);
118     }
119
120     context.pop_transform();
121 }
122
123 void
124 DisplayEffect::fade_out(float fadetime)
125 {
126     black = false;
127     screen_fadetime = fadetime;
128     screen_fading = fadetime;
129     screen_fade = FADE_OUT;
130 }
131
132 void
133 DisplayEffect::fade_in(float fadetime)
134 {
135     black = false;
136     this->screen_fadetime = fadetime;
137     screen_fading = fadetime;
138     screen_fade = FADE_IN;
139 }
140
141 void
142 DisplayEffect::set_black(bool enabled)
143 {
144     black = enabled;
145 }
146
147 bool
148 DisplayEffect::is_black()
149 {
150     return black;
151 }
152
153 void
154 DisplayEffect::sixteen_to_nine(float fadetime)
155 {
156   if(fadetime == 0) {
157     borders = true;
158     border_size = BORDER_SIZE;
159   } else {
160     borders = true;
161     border_size = 0;
162     border_fade = FADE_IN;
163     border_fadetime = fadetime;
164     border_fading = border_fadetime;
165   }
166 }
167
168 void
169 DisplayEffect::four_to_three(float fadetime)
170 {
171   if(fadetime == 0) {
172     borders = false;
173   } else {
174     border_size = BORDER_SIZE;
175     border_fade = FADE_OUT;
176     border_fadetime = fadetime;
177     border_fading = border_fadetime;
178   }
179 }
180