Ejemplo n.º 1
0
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)
Ejemplo n.º 3
0
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)