def grease_pencil_frame_handler(scene, flock: Flock, spirograph: Spirograph, context): frame = scene.frame_current if frame == 0: for i, unit in enumerate(flock.units): gp_layer = init_grease_pencil(gpencil_layer_name="unit_{}".format(i), clear_layer=True) gp_layer.frames.new(0) # When reaching final frame, clear handlers if frame >= context.scene.NUM_FRAMES: bpy.app.handlers.frame_change_pre.clear() elif (frame % context.scene.NUM_FRAMES_CHANGE) == 0: flock.update() spirograph.update() # Update target location target = flock.attractor_obj target.location = spirograph.get_hypotrochoid_loc() target.keyframe_insert("location") flock.attractor_pos = np.array(target.location) for i, unit in enumerate(flock.units): gp_layer = init_grease_pencil(gpencil_layer_name="unit_{}".format(i), clear_layer=False) gp_frame = gp_layer.frames.copy(gp_layer.frames[-1]) gp_frame.frame_number = frame p0 = unit.pos p1 = unit.pos + unit.vel draw_line(gp_frame, p0, p1, i)
def run_morphogenesis(morphogenesis_config, gp_layer, nodes, is_circle, draw_debug, draw_progress, num_frames): morphogenesis = Morphogenesis(nodes, closed=is_circle, config=morphogenesis_config) if draw_debug: draw_force_fun = lambda p0, p1, mat_idx: draw_line( gp_frame, p0, p1, material_index=mat_idx) draw_segment_fun = lambda nodes, mat_idx: draw_segment( gp_frame, nodes, material_index=mat_idx, draw_cyclic=is_circle) else: draw_force_fun = draw_segment_fun = None # Run and Draw Simulation gp_layer.frames.new(-1) for frame in range(num_frames): if frame % 10 == 0: print("Updating frame {}".format(frame)) if draw_progress: gp_frame = gp_layer.frames.copy(gp_layer.frames[-1]) gp_frame.frame_number = frame else: gp_frame = gp_layer.frames.new(frame) morphogenesis.update(draw_force=draw_force_fun, draw_segment=draw_segment_fun) # increase z pos nodes = np.array(morphogenesis.nodes) nodes += np.array([0, 0, frame * 0.1]) draw_segment(gp_frame, nodes, draw_cyclic=is_circle)
def run_morphogenesis(morphogenesis_config, gp_layer, nodes, is_circle, draw_debug, draw_progress, num_frames, container_name=None, draw_curve=False, skip_curve_nodes=1): container = load_container( container_name) if container_name is not None else None morphogenesis = Morphogenesis(nodes, closed=is_circle, config=morphogenesis_config, container=container) if draw_debug: draw_force_fun = lambda p0, p1, mat_idx: draw_line( gp_frame, p0, p1, material_index=mat_idx) draw_segment_fun = lambda nodes, mat_idx: draw_segment( gp_frame, nodes, material_index=mat_idx, draw_cyclic=is_circle) else: draw_force_fun = draw_segment_fun = None # Run and Draw Simulation gp_layer.frames.new(-1) curve = [] for frame in range(num_frames): if frame % 10 == 0: print("Updating frame {}".format(frame)) if draw_progress: gp_frame = gp_layer.frames.copy(gp_layer.frames[-1]) gp_frame.frame_number = frame else: gp_frame = gp_layer.frames.new(frame) morphogenesis.update(draw_force=draw_force_fun, draw_segment=draw_segment_fun) nodes = np.array(morphogenesis.nodes) draw_segment(gp_frame, nodes, draw_cyclic=is_circle) if frame % skip_curve_nodes == 0: if is_circle: curve.extend(nodes) else: if frame % 2 == 0: curve.extend(nodes[::-1]) else: curve.extend(nodes) if draw_curve: add_curve("morpho_curve", curve)
def draw(start: tuple, end: tuple, gp_layer, context): gp_frame = gp_layer.frames[-1] draw_line(gp_frame, start, end)