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 urchin(cfg, npoints=25): '''Urchin with animated vertices''' cfg.duration = 5 cfg.aspect_ratio = (1, 1) random.seed(0) def get_vertices(n, radius_func, offset=0): vertices = [] step = 2 * math.pi / n for i in range(n): angle = (i + offset) * step radius = radius_func() x, y = math.sin(angle) * radius, math.cos(angle) * radius vertices.append([x, y, 0]) return vertices k = 16 n, m = .1, .9 inner_rfunc = lambda: n inner_vertices = get_vertices(npoints, inner_rfunc) vdata = [] for i in range(k): outer_rfunc = lambda: random.uniform(n, m) outer_vertices = get_vertices(npoints, outer_rfunc, offset=.5) vertices_data = array.array('f') for inner_vertex, outer_vertex in zip(inner_vertices, outer_vertices): vertices_data.extend(inner_vertex + outer_vertex) vertices_data.extend(inner_vertices[0]) vdata.append(vertices_data) animkf = [] for i, v in enumerate(vdata + [vdata[0]]): animkf.append(ngl.AnimKeyFrameBuffer(i * cfg.duration / float(k), v)) vertices = ngl.AnimatedBufferVec3(animkf) geom = ngl.Geometry(vertices) geom.set_topology('line_strip') p = ngl.Program(vertex=cfg.get_vert('color'), fragment=cfg.get_frag('color')) render = ngl.Render(geom, p) render.update_frag_resources(color=ngl.UniformVec4(value=(.9, .1, .3, 1))) return render
def texture_data_animated(cfg, dim=8): cfg.duration = 3.0 random.seed(0) get_rand = lambda: array.array( 'f', [random.random() for i in range(dim**2 * 3)]) nb_kf = int(cfg.duration) 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, height=dim) quad = ngl.Quad((-1, -1, 0), (2, 0, 0), (0, 2, 0)) prog = ngl.Program(vertex=cfg.get_vert('texture'), fragment=cfg.get_frag('texture')) render = ngl.Render(quad, prog) render.update_textures(tex0=random_tex) return render
def animated_buffer(cfg, dim=50): '''Transform a random buffer content using animations''' cfg.duration = 5. random.seed(0) get_rand = lambda: array.array( 'f', [random.random() for i in range(dim**2 * 3)]) nb_kf = int(cfg.duration) 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, height=dim) quad = ngl.Quad((-1, -1, 0), (2, 0, 0), (0, 2, 0)) prog = ngl.Program() render = ngl.Render(quad, prog) render.update_textures(tex0=random_tex) return render
def shape_morphing(cfg, n=6): cfg.duration = 5.0 random.seed(0) vertices_tl = _get_morphing_coordinates(n, -1, 0) vertices_tr = _get_morphing_coordinates(n, 0, 0) vertices_bl = _get_morphing_coordinates(n, -1,-1) vertices_br = _get_morphing_coordinates(n, 0,-1) vertices_animkf = [] for i, coords in enumerate(zip(vertices_tl, vertices_tr, vertices_bl, vertices_br)): flat_coords = list(itertools.chain(*coords)) coords_array = array.array('f', flat_coords) vertices_animkf.append(ngl.AnimKeyFrameBuffer(i * cfg.duration / (n - 1), coords_array)) vertices = ngl.AnimatedBufferVec3(vertices_animkf) geom = ngl.Geometry(vertices) geom.set_topology('triangle_fan') p = ngl.Program(vertex=cfg.get_vert('color'), fragment=cfg.get_frag('color')) render = ngl.Render(geom, p) render.update_frag_resources(color=ngl.UniformVec4(COLORS['cyan'])) return render
def shape_morphing(cfg, n=6): cfg.duration = 5.0 vertices_tl = _get_morphing_coordinates(cfg.rng, n, -1, 0) vertices_tr = _get_morphing_coordinates(cfg.rng, n, 0, 0) vertices_bl = _get_morphing_coordinates(cfg.rng, n, -1, -1) vertices_br = _get_morphing_coordinates(cfg.rng, n, 0, -1) vertices_animkf = [] for i, coords in enumerate( zip(vertices_tl, vertices_tr, vertices_bl, vertices_br)): flat_coords = list(itertools.chain(*coords)) coords_array = array.array("f", flat_coords) vertices_animkf.append( ngl.AnimKeyFrameBuffer(i * cfg.duration / (n - 1), coords_array)) vertices = ngl.AnimatedBufferVec3(vertices_animkf) geom = ngl.Geometry(vertices) geom.set_topology("triangle_strip") p = ngl.Program(vertex=cfg.get_vert("color"), fragment=cfg.get_frag("color")) render = ngl.Render(geom, p) render.update_frag_resources(color=ngl.UniformVec3(COLORS.cyan), opacity=ngl.UniformFloat(1)) return render
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
FUNCS = dict( animated_float=lambda data: ngl.AnimatedFloat(keyframes=_get_anim_kf( ngl.AnimKeyFrameFloat, data)), animated_vec2=lambda data: ngl.AnimatedVec2(keyframes=_get_anim_kf( ngl.AnimKeyFrameVec2, data)), animated_vec3=lambda data: ngl.AnimatedVec3(keyframes=_get_anim_kf( ngl.AnimKeyFrameVec3, data)), animated_vec4=lambda data: ngl.AnimatedVec4(keyframes=_get_anim_kf( ngl.AnimKeyFrameVec4, data)), animated_buffer_float=lambda data: ngl.AnimatedBufferFloat( keyframes=_get_anim_kf(ngl.AnimKeyFrameBuffer, data)), animated_buffer_vec2=lambda data: ngl.AnimatedBufferVec2( keyframes=_get_anim_kf(ngl.AnimKeyFrameBuffer, data)), animated_buffer_vec3=lambda data: ngl.AnimatedBufferVec3( keyframes=_get_anim_kf(ngl.AnimKeyFrameBuffer, data)), animated_buffer_vec4=lambda data: ngl.AnimatedBufferVec4( keyframes=_get_anim_kf(ngl.AnimKeyFrameBuffer, data)), animated_quat_mat4=lambda data: ngl.AnimatedQuat( keyframes=_get_anim_kf(ngl.AnimKeyFrameQuat, data), as_mat4=True), animated_quat_vec4=lambda data: ngl.AnimatedQuat( keyframes=_get_anim_kf(ngl.AnimKeyFrameQuat, data), as_mat4=False), array_float=lambda data: ngl.BufferFloat(data=data), array_int=lambda data: ngl.BufferInt(data=data), array_ivec2=lambda data: ngl.BufferIVec2(data=data), array_ivec3=lambda data: ngl.BufferIVec3(data=data), array_ivec4=lambda data: ngl.BufferIVec4(data=data), array_mat4=lambda data: ngl.BufferMat4(data=data), array_vec2=lambda data: ngl.BufferVec2(data=data), array_vec3=lambda data: ngl.BufferVec3(data=data), array_vec4=lambda data: ngl.BufferVec4(data=data),