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