Blame synfig-studio/plugins/lottie-exporter/properties/timeAdjust.py

AnishGulati 12ca25
"""
AnishGulati 12ca25
Stores the functions required for adjusting time factor in the neighbouring
AnishGulati 12ca25
waypoints in Synfig
AnishGulati 12ca25
"""
AnishGulati decf6d
AnishGulati 12ca25
import sys
AnishGulati 668236
sys.path.append("../")
AnishGulati 668236
AnishGulati decf6d
AnishGulati 668236
def time_adjust(lottie, animated):
AnishGulati 12ca25
    """
AnishGulati 12ca25
    Adjusts the tangents between neighbouring waypoints depending upon the time
AnishGulati 12ca25
    factor between previous waypoints or next waypoints
AnishGulati 0f1f11
AnishGulati 0f1f11
    Args:
AnishGulati 0f1f11
        lottie   (dict)                : Holds bezier curve in Lottie format
AnishGulati 0f1f11
        animated (lxml.etree._Element) : Synfig format animation
AnishGulati 0f1f11
AnishGulati 0f1f11
    Returns:
AnishGulati 0f1f11
        (None)
AnishGulati 12ca25
    """
AnishGulati 668236
    timeadjust = 0.5
AnishGulati 668236
    for i in range(len(animated) - 1):
AnishGulati 668236
        if i == 0:
AnishGulati 668236
            continue
AnishGulati 668236
        time_span_cur = lottie["k"][i+1]["t"] - lottie["k"][i]["t"]
AnishGulati 668236
        time_span_prev = lottie["k"][i]["t"] - lottie["k"][i-1]["t"]
AnishGulati 668236
        cur_get_after = animated[i].attrib["after"]
AnishGulati 668236
        next_get_before = animated[i+1].attrib["before"]
AnishGulati 668236
AnishGulati 0d2507
        # prev              iter
AnishGulati 668236
        # ANY/CONSTANT ---- ANY/ANY
AnishGulati 668236
        # ANY/ANY      ---- CONSTANT/ANY
AnishGulati 668236
        if cur_get_after == "constant" or next_get_before == "constant":
AnishGulati 668236
            continue
AnishGulati 668236
AnishGulati 0d2507
        if animated.attrib["type"] == "real":
AnishGulati 0d2507
            if cur_get_after != "linear":
AnishGulati 0d2507
                lottie["k"][i]["o"]["x"][0] *= (time_span_cur * (timeadjust + 1)) /\
AnishGulati 0d2507
                        (time_span_cur * timeadjust + time_span_prev)
AnishGulati 0d2507
                lottie["k"][i]["o"]["y"][0] *= (time_span_cur * (timeadjust + 1)) /\
AnishGulati 0d2507
                        (time_span_cur * timeadjust + time_span_prev)
AnishGulati 0d2507
            if next_get_before != "linear":
AnishGulati 668236
                if i + 2 <= len(animated) - 1:
AnishGulati 668236
                    time_span_next = lottie["k"][i+2]["t"] - lottie["k"][i+1]["t"]
AnishGulati 0d2507
                    lottie["k"][i]["i"]["x"][0] *= (time_span_cur * (timeadjust + 1)) /\
AnishGulati 0d2507
                            (time_span_cur * timeadjust + time_span_next)
AnishGulati 0d2507
AnishGulati 0d2507
        elif animated.attrib["type"] == "vector":
AnishGulati 0d2507
AnishGulati 0d2507
            # prev    --- iter        --- next
AnishGulati 0d2507
            # ANY/ANY --- ANY/!LINEAR --- ANY/ANY
AnishGulati 0d2507
            if cur_get_after != "linear":
AnishGulati 0d2507
                for dim in range(len(lottie["k"][i]["to"])):
AnishGulati 0d2507
                    lottie["k"][i]["to"][dim] = lottie["k"][i]["to"][dim] *\
AnishGulati 668236
                    (time_span_cur * (timeadjust + 1)) /\
AnishGulati 0d2507
                    (time_span_cur * timeadjust + time_span_prev)
AnishGulati 0d2507
AnishGulati 0d2507
            # iter    --- next        --- after_next
AnishGulati 0d2507
            # ANY/ANY --- !LINEAR/ANY --- ANY/ANY
AnishGulati 0d2507
            if next_get_before != "linear":
AnishGulati 0d2507
                for dim in range(len(lottie["k"][i]["to"])):
AnishGulati 0d2507
                    if i + 2 <= len(animated) - 1:
AnishGulati 0d2507
                        time_span_next = lottie["k"][i+2]["t"] - lottie["k"][i+1]["t"]
AnishGulati 0d2507
                        lottie["k"][i]["ti"][dim] = lottie["k"][i]["ti"][dim] *\
AnishGulati 0d2507
                        (time_span_cur * (timeadjust + 1)) /\
AnishGulati 0d2507
                        (time_span_cur * timeadjust + time_span_next)