zeffii / BlenderPythonRecipes

curated snippets for bpy (mostly for Blender <= 2.79 ), some changes are needed to maintain compatibility with 2.8+
GNU General Public License v2.0
121 stars 9 forks source link

nox filter - and multiplex (2d, 3d) #6

Open zeffii opened 7 years ago

zeffii commented 7 years ago
"""
in verts_in v
in floats_in s
in order s d=3 n=2
out verts_out v
out floats_out s
"""

def process_component(data, order):

    order = order // 2

    fdata = []
    add = fdata.append

    # add first n
    for i in range(order+1):
        if i == 0:
            B = data[0]
        else:
            data_to_avg = data[0:i+(order+1)]
            num_items = len(data_to_avg)
            add(sum(data_to_avg)/num_items)

    # add middle n
    for i in range(order, len(data)-order):
        fk1 = data[i-order:i]
        fk2 = data[i:i+order]
        cr1 = sum(fk1) / order
        cr2 = sum(fk2) / order
        add((cr1 + cr2) / 2 )

    # add last n
    for i in range(order):
        if i == -1:
            add(data[-1])
        else:
            a = len(data)-order
            data_to_avg = data[a-(order-i):]
            num_items = len(data_to_avg)
            add(sum(data_to_avg)/num_items)                

    return fdata

def multiplexed(data, order):
    d0 = process_component([d[0] for d in data], order)
    d1 = process_component([d[1] for d in data], order)
    d2 = process_component([d[2] for d in data], order)
    return [tuple(d) for d in zip(d0, d1, d2)]

def nox_filter(data, order=2):
    """
    - order >= 2
    - data has two modes, vectors and numbers
    """

    if not len(data) or order in {0, 1}:
        pass
    elif isinstance(data[0], (list, tuple)) and len(data[0]) == 3:
        return multiplexed(data, order)
    elif isinstance(data[0], (float, int)):
        return process_component(data, order)
    return data

order = min(order, 40)

if verts_in:
    for val_list in verts_in:
        verts_out.append(nox_filter(val_list, order))

if floats_in:
    for val_list in floats_in:
        floats_out.append(nox_filter(val_list, order))