00001
00002
00003
00004
00005
00006
00007
00009
00010
00011 #include <cassert>
00012 #include <cstdarg>
00013 #include <math.h>
00014 #include "utils.h"
00015 #include "fade.h"
00016 #include "video.h"
00017 #include "gui.h"
00018
00019 using namespace std;
00020 using namespace hoa_video::private_video;
00021
00022 namespace hoa_video {
00023
00024 namespace private_video {
00025
00026 ScreenFader::ScreenFader()
00027 : current_color(0.0f, 0.0f, 0.0f, 0.0f),
00028 is_fading(false)
00029 {
00030 current_time = 0;
00031 end_time = 0;
00032 fade_modulation = 1.0f;
00033 use_fade_overlay = false;
00034 }
00035
00036
00037
00038
00039
00040 void ScreenFader::FadeTo(const Color &final, float num_seconds)
00041 {
00042 if (num_seconds <= 0.0f)
00043 end_time = 0;
00044 else
00045 end_time = static_cast<int32>(num_seconds * 1000);
00046
00047 initial_color = current_color;
00048 final_color = final;
00049 current_time = 0;
00050
00051
00052 is_fading = true;
00053
00054
00055
00056
00057
00058
00059
00060 use_fade_overlay = true;
00061
00062 if( (initial_color[0] == 0.0f &&
00063 initial_color[1] == 0.0f &&
00064 initial_color[2] == 0.0f &&
00065 final_color[0] == 0.0f &&
00066 final_color[1] == 0.0f &&
00067 final_color[2] == 0.0f))
00068 {
00069 use_fade_overlay = false;
00070 }
00071 else
00072 {
00073 fade_modulation = 1.0f;
00074 }
00075
00076 Update(0);
00077 }
00078
00079
00080
00081
00082
00083
00084
00085 void ScreenFader::Update(int32 t)
00086 {
00087 if(!is_fading)
00088 return;
00089
00090 if(current_time >= end_time)
00091 {
00092 current_color = final_color;
00093 is_fading = false;
00094
00095 if(use_fade_overlay)
00096 {
00097
00098 if(final_color[3] == 0.0f ||
00099 (final_color[0] == 0.0f &&
00100 final_color[1] == 0.0f &&
00101 final_color[2] == 0.0f))
00102 {
00103 use_fade_overlay = false;
00104 fade_modulation = 1.0f - final_color[3];
00105 }
00106 }
00107 else
00108 fade_modulation = 1.0f - final_color[3];
00109 }
00110 else
00111 {
00112
00113 float a = (float)current_time / (float)end_time;
00114
00115 current_color[3] = Lerp(a, initial_color[3], final_color[3]);
00116
00117
00118
00119 if(final_color[3] == 0.0f)
00120 {
00121 current_color[0] = initial_color[0];
00122 current_color[1] = initial_color[1];
00123 current_color[2] = initial_color[2];
00124 }
00125 if(initial_color[3] == 0.0f)
00126 {
00127 current_color[0] = final_color[0];
00128 current_color[1] = final_color[1];
00129 current_color[2] = final_color[2];
00130 }
00131 else
00132 {
00133 current_color[0] = Lerp(a, initial_color[0], final_color[0]);
00134 current_color[1] = Lerp(a, initial_color[1], final_color[1]);
00135 current_color[2] = Lerp(a, initial_color[2], final_color[2]);
00136 }
00137
00138 if(!use_fade_overlay)
00139 fade_modulation = 1.0f - current_color[3];
00140 else
00141 fade_overlay_color = current_color;
00142 }
00143
00144 current_time += t;
00145 }
00146
00147 }
00148
00149
00150
00151
00152 void GameVideo::FadeScreen(const Color &color, float fade_time)
00153 {
00154 _fader.FadeTo(color, fade_time);
00155 }
00156
00157
00158
00159
00160
00161
00162 bool GameVideo::IsFading()
00163 {
00164 return _fader.IsFading();
00165 }
00166
00167 }