Program Listing for File defaultcomponents.cpp

Return to documentation for file (/home/runner/work/Legion-Engine/Legion-Engine/legion/engine/core/defaults/defaultcomponents.cpp)

#include <core/defaults/defaultcomponents.hpp>

namespace legion::core
{
    L_NODISCARD std::tuple<position, rotation, scale> transform::get_local_components()
    {
        OPTICK_EVENT();

        auto& [positionH, rotationH, scaleH] = handles;

        position p = positionH.read();
        rotation r = rotationH.read();
        scale s = scaleH.read();

        auto parent = positionH.entity.get_parent();
        if (!parent.get_id())
            return std::tuple<position, rotation, scale>(p, r, s);

        transform transf = parent.get_component_handles<transform>();
        if (transf)
        {
            position pp = transf.get<position>().read();
            rotation pr = transf.get<rotation>().read();
            scale ps = transf.get<scale>().read();

            return std::tuple<position, rotation, scale>(pp - p, r * math::inverse(pr), s / ps);
        }

        return std::tuple<position, rotation, scale>(p, r, s);
    }

    L_NODISCARD math::mat4 transform::get_local_to_world_matrix()
    {
        OPTICK_EVENT();
        auto& [positionH, rotationH, scaleH] = handles;
        return math::compose(scaleH.read(), rotationH.read(), positionH.read());
    }

}