aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/helpers/AnimatedVariable.cpp
blob: 450826f97bebbec1d7f8197760019223af995424 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "AnimatedVariable.hpp"
#include "../managers/AnimationManager.hpp"
#include "../config/ConfigManager.hpp"

CAnimatedVariable::CAnimatedVariable() {
    ; // dummy var
}

void CAnimatedVariable::create(ANIMATEDVARTYPE type, SAnimationPropertyConfig* pAnimConfig, void* pWindow, AVARDAMAGEPOLICY policy) {
    m_eVarType      = type;
    m_eDamagePolicy = policy;
    m_pConfig       = pAnimConfig;
    m_pWindow       = pWindow;

    m_bDummy = false;
}

void CAnimatedVariable::create(ANIMATEDVARTYPE type, std::any val, SAnimationPropertyConfig* pAnimConfig, void* pWindow, AVARDAMAGEPOLICY policy) {
    create(type, pAnimConfig, pWindow, policy);

    try {
        switch (type) {
            case AVARTYPE_FLOAT: {
                const auto V = std::any_cast<float>(val);
                m_fValue     = V;
                m_fGoal      = V;
                break;
            }
            case AVARTYPE_VECTOR: {
                const auto V = std::any_cast<Vector2D>(val);
                m_vValue     = V;
                m_vGoal      = V;
                break;
            }
            case AVARTYPE_COLOR: {
                const auto V = std::any_cast<CColor>(val);
                m_cValue     = V;
                m_cGoal      = V;
                break;
            }
            default: ASSERT(false); break;
        }
    } catch (std::exception& e) {
        Debug::log(ERR, "CAnimatedVariable create error: %s", e.what());
        RASSERT(false, "CAnimatedVariable create error: %s", e.what());
    }
}

CAnimatedVariable::~CAnimatedVariable() {
    unregister();
}

void CAnimatedVariable::unregister() {
    std::erase_if(g_pAnimationManager->m_vAnimatedVariables, [&](const auto& other) { return other == this; });
    m_bIsRegistered = false;
    disconnectFromActive();
}

void CAnimatedVariable::registerVar() {
    if (!m_bIsRegistered)
        g_pAnimationManager->m_vAnimatedVariables.push_back(this);
    m_bIsRegistered = true;
}

int CAnimatedVariable::getDurationLeftMs() {
    return std::max(
        (int)(m_pConfig->pValues->internalSpeed * 100) - (int)std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - animationBegin).count(), 0);
}

float CAnimatedVariable::getPercent() {
    const auto DURATIONPASSED = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - animationBegin).count();
    return std::clamp((DURATIONPASSED / 100.f) / m_pConfig->pValues->internalSpeed, 0.f, 1.f);
}

float CAnimatedVariable::getCurveValue() {
    const auto SPENT = getPercent();

    if (SPENT >= 1.f)
        return 1.f;

    return g_pAnimationManager->getBezier(m_pConfig->pValues->internalBezier)->getYForPoint(SPENT);
}

void CAnimatedVariable::connectToActive() {
    g_pAnimationManager->scheduleTick(); // otherwise the animation manager will never pick this up

    if (!m_bIsConnectedToActive)
        g_pAnimationManager->m_vActiveAnimatedVariables.push_back(this);

    m_bIsConnectedToActive = true;
}

void CAnimatedVariable::disconnectFromActive() {
    std::erase_if(g_pAnimationManager->m_vActiveAnimatedVariables, [&](const auto& other) { return other == this; });
    m_bIsConnectedToActive = false;
}