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 _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))
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
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))
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