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
def buffer_dove(cfg, bgcolor1=(.6, 0, 0, 1), bgcolor2=(.8, .8, 0, 1), bilinear_filtering=True): '''Blending of a Render using a Buffer as data source''' cfg.duration = 3. # Credits: https://icons8.com/icon/40514/dove icon_filename = op.join(op.dirname(__file__), 'data', 'icons8-dove.raw') cfg.files.append(icon_filename) w, h = (96, 96) cfg.aspect_ratio = (w, h) img_buf = ngl.BufferUBVec4(filename=icon_filename, label='icon raw buffer') img_tex = ngl.Texture2D(data_src=img_buf, width=w, height=h) if bilinear_filtering: img_tex.set_mag_filter('linear') quad = ngl.Quad((-.5, -.5, 0.1), (1, 0, 0), (0, 1, 0)) program = ngl.Program(vertex=cfg.get_vert('texture'), fragment=cfg.get_frag('texture')) program.update_vert_out_vars(var_tex0_coord=ngl.IOVec2(), var_uvcoord=ngl.IOVec2()) render = ngl.Render(quad, program, label='dove') render.update_frag_resources(tex0=img_tex) render = ngl.GraphicConfig(render, blend=True, blend_src_factor='src_alpha', blend_dst_factor='one_minus_src_alpha', blend_src_factor_a='zero', blend_dst_factor_a='one') prog_bg = ngl.Program(vertex=cfg.get_vert('color'), fragment=cfg.get_frag('color')) shape_bg = ngl.Circle(radius=.6, npoints=256) render_bg = ngl.Render(shape_bg, prog_bg, label='background') color_animkf = [ ngl.AnimKeyFrameVec4(0, bgcolor1), ngl.AnimKeyFrameVec4(cfg.duration / 2.0, bgcolor2), ngl.AnimKeyFrameVec4(cfg.duration, bgcolor1) ] ucolor = ngl.AnimatedVec4(color_animkf) render_bg.update_frag_resources(color=ucolor) return ngl.Group(children=(render_bg, render))
# Query between times values = [ anim.evaluate((t_id + 1) * scale) for t_id in range(nb_queries) ] # Query boundaries and out of them (to trigger a copy instead of a mix) values += [anim.evaluate(0)] values += [anim.evaluate(1)] values += [anim.evaluate(5)] if hasattr(values[0], '__iter__'): values = list(itertools.chain(*values)) ret.append(['off%d' % i] + values) return ret return test_func _float_kf_func = lambda t, v, **kw: ngl.AnimKeyFrameFloat(t, v[0], **kw) _vec2_kf_func = lambda t, v, **kw: ngl.AnimKeyFrameVec2(t, v, **kw) _vec3_kf_func = lambda t, v, **kw: ngl.AnimKeyFrameVec3(t, v, **kw) _vec4_kf_func = lambda t, v, **kw: ngl.AnimKeyFrameVec4(t, v, **kw) _quat_kf_func = lambda t, v, **kw: ngl.AnimKeyFrameQuat(t, v, **kw) anim_forward_float = _get_anim_func(1, ngl.AnimatedFloat, _float_kf_func) anim_forward_vec2 = _get_anim_func(2, ngl.AnimatedVec2, _vec2_kf_func) anim_forward_vec3 = _get_anim_func(3, ngl.AnimatedVec3, _vec3_kf_func) anim_forward_vec4 = _get_anim_func(4, ngl.AnimatedVec4, _vec4_kf_func) anim_forward_quat = _get_anim_func(4, ngl.AnimatedQuat, _quat_kf_func)