#include "fiko/ui/animasyon.hpp" #include #include #include "fiko/core/kare_istek.hpp" // on-demand: aktif animasyon kare ister namespace fiko::ui { namespace { struct AnimKayit { float deger = 0.0f; float hizVek = 0.0f; // yay için hız float sonZaman = 0.0f; // GC bool ilk = true; }; std::unordered_map g_kayitlar; int g_sonKare = -1; void bakim() { const int kare = ImGui::GetFrameCount(); if (kare == g_sonKare) return; g_sonKare = kare; if ((kare & 127) != 0) return; // GC her 128 karede bir const float simdi = (float)ImGui::GetTime(); for (auto it = g_kayitlar.begin(); it != g_kayitlar.end();) it = (simdi - it->second.sonZaman > 2.0f) ? g_kayitlar.erase(it) : ++it; } AnimKayit& kayit(ImGuiID id, float hedef) { bakim(); auto [it, yeni] = g_kayitlar.try_emplace(id); AnimKayit& k = it->second; if (k.ilk) { k.deger = hedef; // ilk karede zıplama yok k.ilk = false; } k.sonZaman = (float)ImGui::GetTime(); return k; } } // namespace float animf(ImGuiID id, float hedef, float hiz) { AnimKayit& k = kayit(id, hedef); const float dt = ImGui::GetIO().DeltaTime; k.deger += (hedef - k.deger) * (1.0f - std::exp(-hiz * dt)); if (std::fabs(hedef - k.deger) < 0.0005f) k.deger = hedef; else kareIste(2); // hâlâ hareketli → sonraki kareyi iste (on-demand) return k.deger; } float yay(ImGuiID id, float hedef, float sertlik, float sonum) { AnimKayit& k = kayit(id, hedef); float dt = ImGui::GetIO().DeltaTime; if (dt > 0.05f) dt = 0.05f; // takılma karesinde patlama olmasın const float ivme = sertlik * (hedef - k.deger) - sonum * k.hizVek; k.hizVek += ivme * dt; k.deger += k.hizVek * dt; if (std::fabs(hedef - k.deger) > 0.0005f || std::fabs(k.hizVek) > 0.0005f) kareIste(2); // yay hâlâ hareketli → sonraki kareyi iste (on-demand) return k.deger; } float nabiz(float hz, float faz) { kareIste(2); // sürekli nabız animasyonu → çizildiği sürece kare ister (on-demand) return 0.5f + 0.5f * std::sin(((float)ImGui::GetTime() * hz + faz) * 6.2831853f); } float zaman() { return (float)ImGui::GetTime(); } void animKare() { bakim(); } void animSifirla(ImGuiID id, float deger) { AnimKayit& k = g_kayitlar[id]; k.deger = deger; k.hizVek = 0.0f; k.ilk = false; k.sonZaman = (float)ImGui::GetTime(); } } // namespace fiko::ui