Example #1
0
def square2circle(cfg, square_color=(0.9, 0.1, 0.3, 1.0), circle_color=(1.0, 1.0, 1.0, 1.0)):
    '''Morphing of a square (composed of many vertices) into a circle'''
    cfg.duration = 5
    cfg.aspect_ratio = (1, 1)

    def sqxf(t):  # square x coordinates clockwise starting top-left
        if t < 1/4.: return t*4
        if t < 1/2.: return 1
        if t < 3/4.: return 1.-(t-.5)*4
        return 0

    def sqyf(t):  # square y coordinates clockwise starting top-left
        if t < 1/4.: return 1
        if t < 1/2.: return 1.-(t-.25)*4
        if t < 3/4.: return 0
        return (t-.75)*4

    n = 1024  # number of vertices
    s = 1.25  # shapes scale
    interp = 'exp_in_out'

    center_vertex = [0, 0, 0]
    square_vertices = array.array('f', center_vertex)
    for i in range(n):
        x = (sqxf(i / float(n)) - .5) * s
        y = (sqyf(i / float(n)) - .5) * s
        square_vertices.extend([x, y, 0])

    circle_vertices = array.array('f', center_vertex)
    step = 2 * math.pi / float(n)
    for i in range(n):
        angle = i * step - math.pi/4.
        x = math.sin(angle) * .5 * s
        y = math.cos(angle) * .5 * s
        circle_vertices.extend([x, y, 0])

    indices = array.array('H')
    for i in range(1, n + 1):
        indices.extend([0, i, i + 1])
    indices[-1] = 1

    vertices_animkf = [
            ngl.AnimKeyFrameBuffer(0,               square_vertices),
            ngl.AnimKeyFrameBuffer(cfg.duration/2., circle_vertices, interp),
            ngl.AnimKeyFrameBuffer(cfg.duration,    square_vertices, interp),
    ]
    vertices = ngl.AnimatedBufferVec3(vertices_animkf)

    color_animkf = [
            ngl.AnimKeyFrameVec4(0,               square_color),
            ngl.AnimKeyFrameVec4(cfg.duration/2., circle_color, interp),
            ngl.AnimKeyFrameVec4(cfg.duration,    square_color, interp),
    ]
    ucolor = ngl.AnimatedVec4(color_animkf)

    geom = ngl.Geometry(vertices, indices=ngl.BufferUShort(data=indices))
    p = ngl.Program(vertex=cfg.get_vert('color'), fragment=cfg.get_frag('color'))
    render = ngl.Render(geom, p)
    render.update_frag_resources(color=ucolor)
    return render
Example #2
0
def _shape_geometry(cfg, set_normals=False, set_indices=False):
    # Fake cube (3 faces only) obtained from:
    # echo 'cube();'>x.scad; openscad x.scad -o x.stl
    vertices = array.array('f', [x - 0.5 for x in [
        1,1,0, 0,1,1, 1,1,1,
        0,1,1, 1,1,0, 0,1,0,
        0,0,0, 0,1,1, 0,1,0,
        0,1,1, 0,0,0, 0,0,1,
        0,1,1, 1,0,1, 1,1,1,
        1,0,1, 0,1,1, 0,0,1,
    ]])

    normals = array.array('f', [
        0,1,0,  0,1,0,  0,1,0,
        0,1,0,  0,1,0,  0,1,0,
       -1,0,0, -1,0,0, -1,0,0,
       -1,0,0, -1,0,0, -1,0,0,
        0,0,1,  0,0,1,  0,0,1,
        0,0,1,  0,0,1,  0,0,1,
    ])

    vertices_buffer = ngl.BufferVec3(data=vertices)
    normals_buffer = ngl.BufferVec3(data=normals)

    cfg.aspect_ratio = (1, 1)
    geometry = ngl.Geometry(vertices=vertices_buffer)

    if set_normals:
        geometry.set_normals(normals_buffer)
        prog = ngl.Program(vertex=cfg.get_vert('colored-normals'), fragment=cfg.get_frag('colored-normals'))
        prog.update_vert_out_vars(var_normal=ngl.IOVec3())
        render = ngl.Render(geometry, prog)
    else:
        render = _render_shape(cfg, geometry, COLORS['magenta'])

    if set_indices:
        indices = array.array('H', list(range(3 * 6)))
        indices_buffer = ngl.BufferUShort(data=indices)
        geometry.set_indices(indices_buffer)

    return ngl.Rotate(render, 45, axis=(1, 1, 1))
Example #3
0
    def cropboard(cfg, dim_clr=3, dim_cut=9):
        cfg.duration = 5.0 + 1.0

        nb_kf = 2
        buffers = [
            get_random_color_buffer(cfg.rng, dim_clr) for _ in range(nb_kf)
        ]
        random_animkf = []
        time_scale = cfg.duration / float(nb_kf)
        for i, buf in enumerate(buffers + [buffers[0]]):
            random_animkf.append(ngl.AnimKeyFrameBuffer(i * time_scale, buf))
        random_buffer = ngl.AnimatedBufferVec4(keyframes=random_animkf)
        random_tex = ngl.Texture2D(data_src=random_buffer,
                                   width=dim_clr,
                                   height=dim_clr)

        kw = kh = 1.0 / dim_cut
        qw = qh = 2.0 / dim_cut

        p = ngl.Program(vertex=cfg.get_vert("cropboard"),
                        fragment=cfg.get_frag("texture"))
        p.update_vert_out_vars(var_tex0_coord=ngl.IOVec2())

        uv_offset_buffer = array.array("f")
        translate_a_buffer = array.array("f")
        translate_b_buffer = array.array("f")

        if set_indices:
            indices = array.array("H", [0, 2, 1, 1, 3, 0])
            indices_buffer = ngl.BufferUShort(data=indices)

            vertices = array.array(
                "f",
                [
                    # fmt: off
                    0,
                    0,
                    0,
                    qw,
                    qh,
                    0,
                    qw,
                    0,
                    0,
                    0,
                    qh,
                    0,
                    # fmt: on
                ],
            )

            uvcoords = array.array(
                "f",
                [
                    # fmt: off
                    0,
                    1.0,
                    kw,
                    1.0 - kh,
                    kw,
                    1.0,
                    0,
                    1.0 - kh,
                    # fmt: on
                ],
            )

            vertices_buffer = ngl.BufferVec3(data=vertices)
            uvcoords_buffer = ngl.BufferVec2(data=uvcoords)

            q = ngl.Geometry(vertices=vertices_buffer,
                             uvcoords=uvcoords_buffer,
                             indices=indices_buffer)
        else:
            q = ngl.Quad(
                corner=(0, 0, 0),
                width=(qw, 0, 0),
                height=(0, qh, 0),
                uv_corner=(0, 0),
                uv_width=(kw, 0),
                uv_height=(0, kh),
            )

        for y in range(dim_cut):
            for x in range(dim_cut):
                uv_offset = [x * kw, (y + 1.0) * kh - 1.0]
                src = [cfg.rng.uniform(-2, 2), cfg.rng.uniform(-2, 2)]
                dst = [x * qw - 1.0, 1.0 - (y + 1.0) * qh]

                uv_offset_buffer.extend(uv_offset)
                translate_a_buffer.extend(src)
                translate_b_buffer.extend(dst)

        utime_animkf = [
            ngl.AnimKeyFrameFloat(0, 0),
            ngl.AnimKeyFrameFloat(cfg.duration - 1.0, 1)
        ]
        utime = ngl.AnimatedFloat(utime_animkf)

        render = ngl.Render(q, p, nb_instances=dim_cut**2)
        render.update_frag_resources(tex0=random_tex)
        render.update_vert_resources(time=utime)
        render.update_instance_attributes(
            uv_offset=ngl.BufferVec2(data=uv_offset_buffer),
            translate_a=ngl.BufferVec2(data=translate_a_buffer),
            translate_b=ngl.BufferVec2(data=translate_b_buffer),
        )

        return render
Example #4
0
def _shape_geometry(cfg, set_normals=False, set_indices=False):
    # Fake cube (3 faces only) obtained from:
    # echo 'cube();'>x.scad; openscad x.scad -o x.stl
    vertices = array.array(
        "f",
        [
            x - 0.5 for x in [
                # fmt: off
                1,
                1,
                0,
                0,
                1,
                1,
                1,
                1,
                1,
                0,
                1,
                1,
                1,
                1,
                0,
                0,
                1,
                0,
                0,
                0,
                0,
                0,
                1,
                1,
                0,
                1,
                0,
                0,
                1,
                1,
                0,
                0,
                0,
                0,
                0,
                1,
                0,
                1,
                1,
                1,
                0,
                1,
                1,
                1,
                1,
                1,
                0,
                1,
                0,
                1,
                1,
                0,
                0,
                1,
                # fmt: on
            ]
        ],
    )

    normals = array.array(
        "f",
        [
            # fmt: off
            0,
            1,
            0,
            0,
            1,
            0,
            0,
            1,
            0,
            0,
            1,
            0,
            0,
            1,
            0,
            0,
            1,
            0,
            -1,
            0,
            0,
            -1,
            0,
            0,
            -1,
            0,
            0,
            -1,
            0,
            0,
            -1,
            0,
            0,
            -1,
            0,
            0,
            0,
            0,
            1,
            0,
            0,
            1,
            0,
            0,
            1,
            0,
            0,
            1,
            0,
            0,
            1,
            0,
            0,
            1,
            # fmt: on
        ],
    )

    vertices_buffer = ngl.BufferVec3(data=vertices)
    normals_buffer = ngl.BufferVec3(data=normals)

    cfg.aspect_ratio = (1, 1)
    geometry = ngl.Geometry(vertices=vertices_buffer)

    if set_normals:
        geometry.set_normals(normals_buffer)
        prog = ngl.Program(vertex=cfg.get_vert("colored-normals"),
                           fragment=cfg.get_frag("colored-normals"))
        prog.update_vert_out_vars(var_normal=ngl.IOVec3())
        render = ngl.Render(geometry, prog)
    else:
        prog = ngl.Program(vertex=cfg.get_vert("color"),
                           fragment=cfg.get_frag("color"))
        render = ngl.Render(geometry, prog)
        render.update_frag_resources(
            color=ngl.UniformVec3(value=COLORS.magenta),
            opacity=ngl.UniformFloat(1))

    if set_indices:
        indices = array.array("H", list(range(3 * 6)))
        indices_buffer = ngl.BufferUShort(data=indices)
        geometry.set_indices(indices_buffer)

    return ngl.Rotate(render, 45, axis=(1, 1, 1))
Example #5
0
    def cropboard(cfg, dim_clr=3, dim_cut=9):
        cfg.duration = 5. + 1.

        random.seed(0)

        get_rand = lambda: array.array(
            'f', [random.random() for i in range(dim_clr**2 * 3)])
        nb_kf = 2
        buffers = [get_rand() for i in range(nb_kf)]
        random_animkf = []
        time_scale = cfg.duration / float(nb_kf)
        for i, buf in enumerate(buffers + [buffers[0]]):
            random_animkf.append(ngl.AnimKeyFrameBuffer(i * time_scale, buf))
        random_buffer = ngl.AnimatedBufferVec3(keyframes=random_animkf)
        random_tex = ngl.Texture2D(data_src=random_buffer,
                                   width=dim_clr,
                                   height=dim_clr)

        kw = kh = 1. / dim_cut
        qw = qh = 2. / dim_cut

        p = ngl.Program(vertex=cfg.get_vert('cropboard'),
                        fragment=cfg.get_frag('texture'))

        uv_offset_buffer = array.array('f')
        translate_a_buffer = array.array('f')
        translate_b_buffer = array.array('f')

        if set_indices:
            indices = array.array('H', [0, 2, 1, 3])
            indices_buffer = ngl.BufferUShort(data=indices)

            vertices = array.array('f', [
                0,
                0,
                0,
                qw,
                qh,
                0,
                qw,
                0,
                0,
                0,
                qh,
                0,
            ])

            uvcoords = array.array('f', [
                0,
                1.0,
                kw,
                1.0 - kh,
                kw,
                1.0,
                0,
                1.0 - kh,
            ])

            vertices_buffer = ngl.BufferVec3(data=vertices)
            uvcoords_buffer = ngl.BufferVec2(data=uvcoords)

            q = ngl.Geometry(topology='triangle_fan',
                             vertices=vertices_buffer,
                             uvcoords=uvcoords_buffer,
                             indices=indices_buffer)
        else:
            q = ngl.Quad(corner=(0, 0, 0),
                         width=(qw, 0, 0),
                         height=(0, qh, 0),
                         uv_corner=(0, 0),
                         uv_width=(kw, 0),
                         uv_height=(0, kh))

        for y in range(dim_cut):
            for x in range(dim_cut):
                uv_offset = [x * kw, (y + 1.) * kh - 1.]
                src = [random.uniform(-2, 2), random.uniform(-2, 2)]
                dst = [x * qw - 1., 1. - (y + 1.) * qh]

                uv_offset_buffer.extend(uv_offset)
                translate_a_buffer.extend(src)
                translate_b_buffer.extend(dst)

        utime_animkf = [
            ngl.AnimKeyFrameFloat(0, 0),
            ngl.AnimKeyFrameFloat(cfg.duration - 1., 1)
        ]
        utime = ngl.AnimatedFloat(utime_animkf)

        render = ngl.Render(q, p, nb_instances=dim_cut**2)
        render.update_textures(tex0=random_tex)
        render.update_uniforms(time=utime)
        render.update_instance_attributes(
            uv_offset=ngl.BufferVec2(data=uv_offset_buffer),
            translate_a=ngl.BufferVec2(data=translate_a_buffer),
            translate_b=ngl.BufferVec2(data=translate_b_buffer),
        )

        return render