3 #include "../animation.h"
6 #include <Strings/components/utils/math/math.h>
7 #include <Strings/components/classes/events/events.h>
24 BlamColor evaluated_color;
29 float fade_duration = 1.0f;
31 int ticks_per_fade = 0;
33 bool swap_fade_direction =
false;
34 float elapsed_time = 0.0f;
37 bool animation_done =
false;
38 bool is_started =
false;
49 byte GetIntermediaryColor(
byte subcolor1,
byte subcolor2)
51 byte blend_amount = abs((subcolor1 - subcolor2) * elapsed_time);
53 if (subcolor1 < subcolor2)
55 return subcolor2 - blend_amount;
59 return subcolor2 + blend_amount;
66 void OnTickEvent(TickEvent* event)
74 if (local_ticks == ticks_per_fade)
76 swap_fade_direction = !swap_fade_direction;
80 elapsed_time = float(local_ticks) / float(ticks_per_fade);
82 if (swap_fade_direction)
84 evaluated_color.r = GetIntermediaryColor(color_1.r, color_2.r);
85 evaluated_color.g = GetIntermediaryColor(color_1.g, color_2.g);
86 evaluated_color.b = GetIntermediaryColor(color_1.b, color_2.b);
87 evaluated_color.a = GetIntermediaryColor(color_1.a, color_2.a);
91 evaluated_color.r = GetIntermediaryColor(color_2.r, color_1.r);
92 evaluated_color.g = GetIntermediaryColor(color_2.g, color_1.g);
93 evaluated_color.b = GetIntermediaryColor(color_2.b, color_1.b);
94 evaluated_color.a = GetIntermediaryColor(color_2.a, color_1.a);
103 elapsed_time = float(local_ticks) / float(ticks_per_fade);
105 evaluated_color.r = GetIntermediaryColor(color_1.r, color_2.r);
106 evaluated_color.g = GetIntermediaryColor(color_1.g, color_2.g);
107 evaluated_color.b = GetIntermediaryColor(color_1.b, color_2.b);
108 evaluated_color.a = GetIntermediaryColor(color_1.a, color_2.a);
110 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)
112 animation_done =
true;
117 BlamStrings::Events::UnregisterListener(
this);
132 void Initialize(BlamColor _c1, BlamColor _c2,
float fade_duration,
bool _loop)
136 ticks_per_fade = full_ticks_per_fade;
138 if (!BlamStrings::Utils::Math::FloatIsInteger(full_ticks_per_fade))
140 Blam::Logger::LogEvent(
"color transition animation was configured to use fade duration of " + std::to_string(fade_duration) +
141 ", 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 "
142 +
"this can cause unforeseen issues!", WSV_WARNING);
150 evaluated_color = _c2;
160 this->Subscribe(BlamEventType::Tick);
161 BlamStrings::Events::RegisterListener(
this,
"color_transition_animation");
172 return evaluated_color;