Program Listing for File TimeDisplay.cc

Program Listing for File TimeDisplay.cc#

Return to documentation for file (doxygen_docs/GeneralKModels/TimeDisplay.cc)

#include <format>

#include "Karana/GeneralKModels/TimeDisplay.h"
#include "Karana/KCore/Allocator.h"

/**
 * @file
 * @brief TimeDisplay implementation.
 */

namespace Karana::Models {

    namespace kc = Karana::Core;
    namespace kd = Karana::Dynamics;
    namespace ks = Karana::Scene;
    namespace km = Karana::Math;

    TimeDisplayParams::TimeDisplayParams(std::string_view name)
        : KModelParams(name) {}

    bool TimeDisplayParams::isReady() const { return true; }

    kc::ks_ptr<kc::BaseVars> TimeDisplayParams::_getVars() const {
        return TimeDisplayParamsVars::create(kc::static_pointer_cast<const TimeDisplayParams>(
            kc::ks_ptr<const Base>(shared_from_this())));
    };

    TimeDisplayParamsVars::TimeDisplayParamsVars(const kc::ks_ptr<const TimeDisplayParams> &model)
        : Karana::Core::BaseVars(model) {

        color = Karana::Core::Var_T<Karana::Math::Vec>::create(
            "color",
            [model] {
                auto color = model->color;
                auto dark = km::Vec(4);
                dark[0] = double(color.r());
                dark[1] = double(color.g());
                dark[2] = double(color.b());
                dark[3] = double(color.alpha());
                return dark;
            },
            4,
            "Color of the time text",
            "");
    }

    TimeDisplayParamsVars::~TimeDisplayParamsVars(){};

    kc::ks_ptr<TimeDisplayParamsVars>
    TimeDisplayParamsVars::create(const kc::ks_ptr<const TimeDisplayParams> &model) {
        return std::allocate_shared<TimeDisplayParamsVars>(kc::Allocator<TimeDisplayParamsVars>{},
                                                           model);
    }

    kc::NestedVars TimeDisplayParamsVars::getAllVars() const {
        auto out = Karana::Core::BaseVars::getAllVars();
        kc::addVarsToStruct(out, color);

        return out;
    }

    TimeDisplay::TimeDisplay(std::string_view name,
                             const kc::ks_ptr<kd::ModelManager> &mm,
                             const kc::ks_ptr<ks::GraphicalScene> &scene)
        : KModel<TimeDisplay, TimeDisplayParams>(name, mm)
        , _scene(scene) {
        params = std::allocate_shared<TimeDisplayParams>(kc::Allocator<TimeDisplayParams>{},
                                                         std::format("{}_params", name));
    }

    kc::ks_ptr<TimeDisplay> TimeDisplay::create(std::string_view name,
                                                const kc::ks_ptr<kd::ModelManager> &mm,
                                                const kc::ks_ptr<ks::GraphicalScene> &scene) {
        kc::ks_ptr<TimeDisplay> model =
            std::allocate_shared<TimeDisplay>(kc::Allocator<TimeDisplay>{}, name, mm, scene);
        mm->registerModel(model);
        return model;
    }

    void TimeDisplay::postHop(const km::Ktime &t, const km::Vec &) {
        if (!_scene) {
            return;
        }
        if (!_overlay_id) {
            _overlay_id = _scene->addOverlayText("", 0.f, 0.05f, {.color = params->color});
        }
        const auto &message = std::format("Time: {}s", km::ktimeToSeconds(t));
        _scene->setOverlayText(_overlay_id, message);
    }

    void TimeDisplay::_unregisterModel() {
        // Call the parent. This will do the normal unregistration.
        KModel<TimeDisplay, TimeDisplayParams>::_unregisterModel();

        if (!_scene || !_overlay_id) {
            return;
        }

        _scene->removeOverlayText(_overlay_id);
        _overlay_id = 0;
    }

    // Destructor included for MacOS builds. Must have a key-function out-of-line to avoid dulpicate
    // symbols.
    TimeDisplay::~TimeDisplay(){};

} // namespace Karana::Models