3 #include "../animation.h"
9 #include <Strings/components/utils/math/math.h>
11 #include <Strings/components/classes/events/events.h>
27 D2D1_COLOR_F evaluated_color;
32 float fade_duration = 1.0f;
34 int ticks_per_fade = 0;
36 bool swap_fade_direction =
false;
37 float elapsed_time = 0.0f;
40 bool animation_done =
false;
41 bool is_started =
false;
52 float GetIntermediaryColor(
float subcolor1,
float subcolor2)
54 float blend_amount = fabsf((subcolor1 - subcolor2) * elapsed_time);
56 if (subcolor1 < subcolor2)
58 return subcolor2 - blend_amount;
62 return subcolor2 + blend_amount;
69 void OnTickEvent(TickEvent* event)
77 if (local_ticks == ticks_per_fade)
79 swap_fade_direction = !swap_fade_direction;
83 elapsed_time = float(local_ticks) / float(ticks_per_fade);
85 if (swap_fade_direction)
87 evaluated_color.r = GetIntermediaryColor(color_1.r, color_2.r);
88 evaluated_color.g = GetIntermediaryColor(color_1.g, color_2.g);
89 evaluated_color.b = GetIntermediaryColor(color_1.b, color_2.b);
90 evaluated_color.a = GetIntermediaryColor(color_1.a, color_2.a);
94 evaluated_color.r = GetIntermediaryColor(color_2.r, color_1.r);
95 evaluated_color.g = GetIntermediaryColor(color_2.g, color_1.g);
96 evaluated_color.b = GetIntermediaryColor(color_2.b, color_1.b);
97 evaluated_color.a = GetIntermediaryColor(color_2.a, color_1.a);
106 elapsed_time = float(local_ticks) / float(ticks_per_fade);
108 evaluated_color.r = GetIntermediaryColor(color_1.r, color_2.r);
109 evaluated_color.g = GetIntermediaryColor(color_1.g, color_2.g);
110 evaluated_color.b = GetIntermediaryColor(color_1.b, color_2.b);
111 evaluated_color.a = GetIntermediaryColor(color_1.a, color_2.a);
113 if (evaluated_color.r == color_1.r && evaluated_color.g == color_1.g && evaluated_color.b == color_1.b && evaluated_color.a == color_1.a)
115 animation_done =
true;
120 BlamStrings::Events::UnregisterListener(
this);
135 void Initialize(D2D1_COLOR_F _c1, D2D1_COLOR_F _c2,
float fade_duration,
bool _loop)
139 ticks_per_fade = full_ticks_per_fade;
141 if (!BlamStrings::Utils::Math::FloatIsInteger(full_ticks_per_fade))
143 Blam::Logger::LogEvent(
"color transition animation was configured to use fade duration of " + std::to_string(fade_duration) +
144 ", which results in a tick per fade of " + std::to_string(full_ticks_per_fade) +
" - the animation will not be properly fixed to a per-second timestep and "
145 +
"this can cause unforeseen issues!", WSV_WARNING);
153 evaluated_color = _c2;
163 this->Subscribe(BlamEventType::Tick);
164 BlamStrings::Events::RegisterListener(
this,
"color_transition_animation");
175 return evaluated_color;