Beispiel #1
0
    def _show_custom_ui(self):
        width = 250
        height = 100

        draw_list = imgui.get_window_draw_list()
        plot_start = imgui.get_cursor_screen_pos()
        imgui.push_style_color(imgui.COLOR_PLOT_LINES, 0.8, 0.8, 0.8, 1.0)
        imgui.plot_lines("",
                         self._beat_value_buffer.contents * self.get("gain"),
                         0.0, 1.0, (width, height))
        imgui.pop_style_color()
        plot_size = imgui.get_item_rect_size()

        beat_risings = self._beat_rising_buffer.contents
        count = self._beat_rising_buffer.size
        for i, beat_rising in enumerate(beat_risings):
            if not beat_rising:
                continue
            x = i / (count - 1) * width
            line_start = plot_start[0] + x, plot_start[1]
            line_end = plot_start[0] + x, plot_start[1] + height
            draw_list.add_line(line_start, line_end,
                               imgui.get_color_u32_rgba(0.0, 0.8, 0.0, 0.8))

        threshold = min(1.0, max(0.0, self.get("threshold")))
        threshold_start = plot_start[0], plot_start[1] + (1.0 -
                                                          threshold) * height
        threshold_end = plot_start[0] + width, threshold_start[1]

        draw_list.add_line(threshold_start, threshold_end,
                           imgui.get_color_u32_rgba(0.8, 0.0, 0.0, 0.8))
Beispiel #2
0
def draw_map_wall(draw_list, wall, highlight=False):
    is_portal = wall.adj_sector_idx != -1
    tbl = [
        # not highlighted
        wall_default,
        portal_default,
        # highlighted
        wall_highlight,
        portal_highlight
    ]

    color = tbl[(highlight << 1 | is_portal)]

    v1 = wall.v1
    v2 = wall.v2

    ((n1x, n1y), (n2x, n2y)) = wall.centered_normal()

    cam_x = cur_state.camera_x
    cam_y = cur_state.camera_y

    draw_list.add_line(v1.x - cam_x, v1.y - cam_y, v2.x - cam_x, v2.y - cam_y,
                       imgui.get_color_u32_rgba(*color), 1.0)
    draw_list.add_line(n1x - cam_x, n1y - cam_y, n2x - cam_x, n2y - cam_y,
                       imgui.get_color_u32_rgba(*color), 1.0)
Beispiel #3
0
def render_layers(view):

    "Layer selector. Currently extremely spare."

    index = view.index
    # changed, new_index = imgui.v_slider_int("##layer_index", 30, 100, index,
    #                                         min_value=0, max_value=n_layers - 1)
    # if changed:
    #     x, y, z = view.direction
    #     delta = new_index - index
    #     view.switch_layer(delta)

    # imgui.same_line()

    draw_list = imgui.get_window_draw_list()
    x, y = imgui.get_cursor_screen_pos()
    draw_list.add_rect_filled(x, y, x + 30, y + 100,
                              imgui.get_color_u32_rgba(0.5, 0.5, 0.5, 1))
    top_layer = view.depth
    h = 100 / top_layer

    for layer in view.hidden_layers:
        dy = 100 - 100 * (view.index_of_layer(layer) + 1) / top_layer
        draw_list.add_rect_filled(x, y + dy, x + 30, y + dy + h,
                                  imgui.get_color_u32_rgba(0.5, 0.1, 0.1, 1))

    dy = 100 - 100 * (index + 1) / top_layer
    draw_list.add_rect_filled(x, y + dy, x + 30, y + dy + h,
                              imgui.get_color_u32_rgba(1, 1, 1, 0.5))

    imgui.set_cursor_screen_pos((x, y))
    imgui.text(str(index))
Beispiel #4
0
    def draw(self):
        imgui.new_frame()

        imgui.set_next_window_position(16, 32, imgui.ONCE)
        imgui.set_next_window_size(256, 256, imgui.ONCE)

        imgui.begin("Circle")
        draw_list = imgui.get_window_draw_list()
        draw_list.add_circle(100,
                             60,
                             30,
                             imgui.get_color_u32_rgba(1, 1, 0, 1),
                             thickness=3)
        imgui.end()

        imgui.set_next_window_position(270, 32, imgui.ONCE)
        imgui.set_next_window_size(256, 256, imgui.ONCE)

        imgui.begin("Filled Circle")
        draw_list = imgui.get_window_draw_list()
        draw_list.add_circle_filled(100, 60, 30,
                                    imgui.get_color_u32_rgba(1, 1, 0, 1))
        imgui.end()

        imgui.end_frame()

        imgui.render()

        self.renderer.render(imgui.get_draw_data())
Beispiel #5
0
 def render_turns(self, scale, rectmin):
     turns = self.pts['turn']
     Nturns = len(turns)
     if Nturns < 3:
         return
     t = np.float32(turns).T
     t[1] = -t[1]  # invert y
     tx = tapetrack.trackexport(t)
     N = 100 * Nturns
     s = (tapetrack.tracksubdiv(tx, N) * scale)
     s[:, 0] += rectmin[0]
     s[:, 1] = rectmin[1] - s[:, 1]  # uninvert y
     s[:, 3] = -s[:, 3]
     L = s[:, :2] + s[:, 2:4] * self.lanewidth
     R = s[:, :2] - s[:, 2:4] * self.lanewidth
     dl = imgui.get_window_draw_list()
     cyan = imgui.get_color_u32_rgba(0, 1, 1, 1)
     yellow = imgui.get_color_u32_rgba(1, 1, 0, 1)
     for i in range(1 + N):
         a = i % N
         b = (i + 1) % N
         if i & 1:
             dl.add_line(s[a, 0], s[a, 1], s[b, 0], s[b, 1], yellow)
         dl.add_line(L[a, 0], L[a, 1], L[b, 0], L[b, 1], cyan)
         dl.add_line(R[a, 0], R[a, 1], R[b, 0], R[b, 1], cyan)
     return s
Beispiel #6
0
def drawMap(linesc,
            east,
            north,
            xbias=1300,
            ybias=100,
            scale=0.5,
            edge_color='#ff0000',
            edge_linewidth=1,
            edge_alpha=1):
    draw_list = imgui.get_window_draw_list()
    pos = imgui.core.get_window_position()
    for p in linesc:
        points = ((p - [east, north]) * [1, -1] /
                  [1.141255544679108e-5, 8.993216192195822e-6] +
                  [xbias, ybias]) * scale + [pos[0], pos[1]]
        if (len(points) > 2):
            draw_list.add_polyline(list(points),
                                   imgui.get_color_u32_rgba(
                                       1, 0, 0, edge_alpha),
                                   closed=False,
                                   thickness=edge_linewidth)
        else:
            draw_list.add_line(points[0][0], points[0][1], points[1][0],
                               points[1][1],
                               imgui.get_color_u32_rgba(1, 0, 0, edge_alpha),
                               edge_linewidth)
Beispiel #7
0
 def draw(self):
     imgui.begin("Line")
     draw_list = imgui.get_window_draw_list()
     draw_list.add_line(20, 35, 180, 80,
                        imgui.get_color_u32_rgba(1, 1, 0, 1), 3)
     draw_list.add_line(180, 35, 20, 80,
                        imgui.get_color_u32_rgba(1, 0, 0, 1), 3)
     imgui.end()
def ProgessBar(CV, MV, BarSize = 200):
    if CV >= MV:
        CV = MV
    imgui.dummy(10, 20)
    draw_list = imgui.get_window_draw_list()
    sp = imgui.get_item_rect_min()
    ep = imgui.get_item_rect_max()
    draw_list.add_rect(sp[0]+60,ep[1], sp[0]+60 + BarSize ,sp[1], imgui.get_color_u32_rgba(0.098, 0.098, 0.439, 1))
    draw_list.add_rect_filled(sp[0]+60,ep[1], sp[0]+60 + CV/MV * BarSize ,sp[1], imgui.get_color_u32_rgba(0.098, 0.098, 0.439, 1))
    draw_list.add_text(sp[0]+60 + BarSize + 10, sp[1] + 2, imgui.get_color_u32_rgba(1,0.5,0.5,1), f'{round(CV/MV* 100, 2)} %')    
Beispiel #9
0
 def draw(self):
     imgui.begin("Poly Line Overlay")
     draw_list = imgui.get_overlay_draw_list()
     draw_list.add_polyline([(20, 35), (90, 35), (55, 80)],
                            imgui.get_color_u32_rgba(1, 1, 0, 1),
                            closed=False,
                            thickness=3)
     draw_list.add_polyline([(110, 35), (180, 35), (145, 80)],
                            imgui.get_color_u32_rgba(1, 0, 0, 1),
                            closed=True,
                            thickness=3)
     imgui.end()
Beispiel #10
0
 def draw(self):
     imgui.begin("Image example")
     texture_id = imgui.get_io().fonts.texture_id
     draw_list = imgui.get_window_draw_list()
     draw_list.add_image(texture_id, (128, 64), (512, 256),
                         col=imgui.get_color_u32_rgba(0.5, 0.5, 1, 1))
     imgui.end()
Beispiel #11
0
    def draw(self):
        imgui.new_frame()

        pos_x = 10
        pos_y = 10
        sz = 20

        draw_list = imgui.get_window_draw_list()

        for i in range(0, imgui.COLOR_COUNT):
            name = imgui.get_style_color_name(i)
            draw_list.add_rect_filled(pos_x, pos_y, pos_x + sz, pos_y + sz,
                                      imgui.get_color_u32_idx(i))
            imgui.dummy(sz, sz)
            imgui.same_line()

        rgba_color = imgui.get_color_u32_rgba(1, 1, 0, 1)
        draw_list.add_rect_filled(pos_x, pos_y, pos_x + sz, pos_y + sz,
                                  rgba_color)

        imgui.end_frame()

        imgui.render()

        self.renderer.render(imgui.get_draw_data())
Beispiel #12
0
 def draw(self):
     x, y = self.output.get_position()
     x1, y1 = self.input.get_position()
     draw_list = imgui.get_overlay_draw_list()
     #arcade.draw_line(x,y,x1,y1,(arcade.color.AQUA))
     draw_list.add_line(x, y, x1, y1, imgui.get_color_u32_rgba(1, 1, 1, 1),
                        1)
Beispiel #13
0
def render_selection_rectangle(window, p0, p1, color=(1, 1, 0, 1)):
    with invisible_window(window):
        w, h = window.get_size()
        x0, y0 = p0
        x1, y1 = p1
        draw_list = imgui.get_window_draw_list()
        draw_list.add_rect(int(x0), int(h - y0), int(x1), int(h - y1),
                           imgui.get_color_u32_rgba(*color))
Beispiel #14
0
def render_selection_line(window, p0, p1):
    with invisible_window(window):
        imgui.text("hej")
        x0, y0 = p0
        x1, y1 = p1
        draw_list = imgui.get_window_draw_list()
        draw_list.add_line(x0, y0, x1, y1,
                           imgui.get_color_u32_rgba(1, 1, 0, 1), 2)
Beispiel #15
0
def assign_parameter_colors(node_library):
    global params_color
    global params_color_palette
    global params_color_palette_index
    for parameters_name in node_library.parameters:
        col = params_color_palette[params_color_palette_index]
        imgui_col = imgui.get_color_u32_rgba(col[0], col[1], col[2], 0.7)
        params_color[node_library.parameters[parameters_name].get().type] = imgui_col
        params_color_palette_index = params_color_palette_index + 1
Beispiel #16
0
 def draw(self):
     imgui.begin("Circle")
     draw_list = imgui.get_window_draw_list()
     draw_list.add_circle(100,
                          60,
                          30,
                          imgui.get_color_u32_rgba(1, 1, 0, 1),
                          thickness=3)
     imgui.end()
Beispiel #17
0
    def render_map(self):
        imgui.begin("map")
        imgui.slider_float("x (m)",
                           self.track[self.i, 0] * ceiltrack.CEIL_HEIGHT, -80,
                           80)
        imgui.slider_float("y (m)",
                           self.track[self.i, 1] * ceiltrack.CEIL_HEIGHT, -80,
                           80)
        imgui.slider_float("theta", self.track[self.i, 2] % (np.pi * 2), -7, 7)
        imgui.slider_float("x (grid)",
                           self.track[self.i, 0] / ceiltrack.X_GRID, -10, 10)
        imgui.slider_float("y (grid)",
                           self.track[self.i, 1] / ceiltrack.X_GRID, -10, 10)

        changed, self.ceilheight = imgui.slider_float("ceiling height (m)",
                                                      self.ceilheight, 2, 4)
        if changed:
            self.loadframe(self.i)

        dl = imgui.get_window_draw_list()
        pos = imgui.get_cursor_screen_pos()
        siz = imgui.get_content_region_available()
        if siz[1] == 0:
            siz = [400, 300]
        # just use a fixed size
        w = siz[0]
        imgui.image_button(self.floortex, w, w / 2, frame_padding=0)
        # imgui.image_button(self.floortex, siz[0], siz[0])
        origin = [pos[0], pos[1]]
        scale = 50 * ceiltrack.CEIL_HEIGHT * w / 1000
        trackcolor = imgui.get_color_u32_rgba(0.3, 0.5, 0.3, 1)
        for i in range(1, self.i):
            dl.add_line(origin[0] + scale * self.track[i - 1, 0],
                        origin[1] + scale * self.track[i - 1, 1],
                        origin[0] + scale * self.track[i, 0],
                        origin[1] + scale * self.track[i, 1], trackcolor, 1.5)

        carcolor = imgui.get_color_u32_rgba(0, 1, 0.6, 1)
        B = self.track[self.i]
        dl.add_line(origin[0] + scale * B[0], origin[1] + scale * B[1],
                    origin[0] + scale * (B[0] + np.cos(B[2])),
                    origin[1] + scale * (B[1] - np.sin(B[2])), carcolor, 1.5)

        imgui.end()
Beispiel #18
0
def add_rect_coords(draw_list, top_left: Vec2, bottom_right: Vec2,
                    color) -> IMGui[None]:
    """ Necessary because i haven't added the bindings for add_rect yet """
    top_right = Vec2(bottom_right.x, top_left.y)
    bottom_left = Vec2(top_left.x, bottom_right.y)
    # draw rect clockwise from top left
    color = im.get_color_u32_rgba(*color)
    draw_list.add_line(*top_left, *top_right, col=color)
    draw_list.add_line(*top_right, *bottom_right, col=color)
    draw_list.add_line(*bottom_right, *bottom_left, col=color)
    draw_list.add_line(*bottom_left, *top_left, col=color)
Beispiel #19
0
def draw_map_vert(draw_list, vert, highlight=False):
    if highlight:
        color = vert_highlight
    else:
        color = vert_default

    cam_x = cur_state.camera_x
    cam_y = cur_state.camera_y
    draw_list.add_circle_filled(vert.x - cam_x,
                                vert.y - cam_y,
                                2,
                                imgui.get_color_u32_rgba(*color),
                                num_segments=12)
Beispiel #20
0
    def draw(self):
        imgui.new_frame()

        imgui.set_next_window_position(16, 32, imgui.ONCE)
        imgui.set_next_window_size(256, 256, imgui.ONCE)

        imgui.begin("Rectangle")
        draw_list = imgui.get_window_draw_list()
        draw_list.add_rect(20,
                           35,
                           90,
                           80,
                           imgui.get_color_u32_rgba(1, 1, 0, 1),
                           thickness=3)
        draw_list.add_rect(110,
                           35,
                           180,
                           80,
                           imgui.get_color_u32_rgba(1, 0, 0, 1),
                           rounding=5,
                           thickness=3)
        imgui.end()

        imgui.set_next_window_position(270, 32, imgui.ONCE)
        imgui.set_next_window_size(256, 256, imgui.ONCE)

        imgui.begin("Filled Rectangle")
        draw_list = imgui.get_window_draw_list()
        draw_list.add_rect_filled(20, 35, 90, 80,
                                  imgui.get_color_u32_rgba(1, 1, 0, 1))
        draw_list.add_rect_filled(110, 35, 180, 80,
                                  imgui.get_color_u32_rgba(1, 0, 0, 1), 5)
        imgui.end()

        imgui.end_frame()

        imgui.render()

        self.renderer.render(imgui.get_draw_data())
Beispiel #21
0
 def render_ptlist(self,
                   dl,
                   ptlist,
                   rectmin,
                   scale,
                   col,
                   r,
                   select=False,
                   lines=False):
     lastuv = None
     for i, p in enumerate(ptlist):
         u = p[0] * scale + rectmin[0]
         v = p[1] * scale + rectmin[1]
         dl.add_rect_filled(u - r, v - r, u + r, v + r, col, r)
         if select and i == self.selectedpt:
             dl.add_rect(u - r + 1.5, v - r + 1.5, u + r + 1.5, v + r + 1.5,
                         imgui.get_color_u32_rgba(1, 1, 1, 1), r + 1)
         else:
             dl.add_rect(u - r + .5, v - r + .5, u + r + .5, v + r + .5,
                         imgui.get_color_u32_rgba(0, 0, 0, 1), r + 1)
         if lines and lastuv is not None:
             dl.add_line(lastuv[0], lastuv[1], u, v, col)
         lastuv = (u, v)
Beispiel #22
0
    def draw(self):
        imgui.new_frame()

        imgui.set_next_window_position(16, 32, imgui.ONCE)
        imgui.set_next_window_size(512, 512, imgui.ONCE)

        imgui.begin("Line")
        draw_list = imgui.get_window_draw_list()
        draw_list.add_line(20, 35, 180, 80, imgui.get_color_u32_rgba(1,1,0,1), 3)
        draw_list.add_line(180, 35, 20, 80, imgui.get_color_u32_rgba(1,0,0,1), 3)
        imgui.end()

        imgui.begin("Poly Line")
        draw_list = imgui.get_window_draw_list()
        draw_list.add_polyline([(20, 35), (90, 35), (55, 80)], imgui.get_color_u32_rgba(1,1,0,1), closed=False, thickness=3)
        draw_list.add_polyline([(110, 35), (180, 35), (145, 80)], imgui.get_color_u32_rgba(1,0,0,1), closed=True, thickness=3)
        imgui.end()

        imgui.end_frame()

        imgui.render()

        self.renderer.render(imgui.get_draw_data())
Beispiel #23
0
    def draw(self):
        imgui.new_frame()

        imgui.set_next_window_position(16, 32, imgui.ONCE)
        imgui.set_next_window_size(512, 512, imgui.ONCE)

        imgui.begin("Text")
        draw_list = imgui.get_window_draw_list()
        draw_list.add_text(20, 35, imgui.get_color_u32_rgba(1, 1, 0, 1),
                           "Hello!")
        imgui.end()

        imgui.end_frame()

        imgui.render()

        self.renderer.render(imgui.get_draw_data())
Beispiel #24
0
    def draw(self):
        imgui.new_frame()

        imgui.set_next_window_position(16, 32, imgui.ONCE)
        imgui.set_next_window_size(512, 512, imgui.ONCE)

        imgui.begin("Font image example")
        texture_id = imgui.get_io().fonts.texture_id
        draw_list = imgui.get_window_draw_list()
        draw_list.add_image(texture_id, (20, 35), (180, 80),
                            col=imgui.get_color_u32_rgba(0.5, 0.5, 1, 1))
        imgui.end()

        imgui.end_frame()

        imgui.render()

        self.renderer.render(imgui.get_draw_data())
Beispiel #25
0
def zoomtip(imtex, imdim, mag=1.0):
    if imgui.is_item_hovered():
        w, h = imgui.get_window_size()
        h = imdim[0] * w / imdim[1]
        rectmin = imgui.get_item_rect_min()
        mousepos = imgui.get_mouse_pos()
        u = float(mousepos[0] - rectmin[0]) / w
        v = float(mousepos[1] - rectmin[1]) / h
        imgui.begin_tooltip()
        tw = 32. / imdim[1] / mag
        th = 32. / imdim[0] / mag
        imgui.image(imtex, 64, 64, uv0=(u - tw, v - th), uv1=(u + tw, v + th))
        dl = imgui.get_window_draw_list()
        rm = imgui.get_item_rect_min()
        col = imgui.get_color_u32_rgba(1, 1, 0, 1)
        dl.add_line(rm[0], rm[1] + 32, rm[0] + 64, rm[1] + 32, col)
        dl.add_line(rm[0] + 32, rm[1], rm[0] + 32, rm[1] + 64, col)
        imgui.end()
Beispiel #26
0
def get_node_color(node, iggraph, hovered):
    node_color = imgui.get_color_u32_rgba(0,0.5,1,0.5)
    if iggraph.is_error(node):
        if hovered:
            node_color = imgui.get_color_u32_rgba(1,0,0,0.7)
        else:
            node_color = imgui.get_color_u32_rgba(1,0,0,0.5)
    elif iggraph.is_running(node):
        if hovered:
            node_color = imgui.get_color_u32_rgba(0,1,0,0.7)
        else:
            node_color = imgui.get_color_u32_rgba(0,1,0,0.5)
    elif iggraph.has_run(node):
        if hovered:
            node_color = imgui.get_color_u32_rgba(0,1,1,0.7)
        else:
            node_color = imgui.get_color_u32_rgba(0,1,1,0.5)
    elif hovered:
        node_color = imgui.get_color_u32_rgba(0,0.5,1,0.7)
    return node_color
Beispiel #27
0
    def render_opttrack(self, scale, rectmin):
        turns = self.pts['turn']
        Nturns = len(turns)
        if Nturns < 3:
            return
        t = np.float32(turns).T
        t[1] = -t[1]  # invert y
        tx = tapetrack.trackexport(t)
        s = tapetrack.tracksubdiv(tx, 100)
        if self.start_opt:
            self.start_opt = False
            sscale = np.max(s[:, :2]) - np.min(s[:, :2])
            u = s[:, 0] + 1j * s[:, 1]
            ye, val, stuff = track_opt.OptimizeTrack(u / sscale,
                                                     lanewidth=2 *
                                                     self.lanewidth / sscale,
                                                     kcurv=self.kcurv,
                                                     kdist=self.kdist)
            print(u[:30] / sscale)
            print(ye[:30])
            print(ye[:30] * sscale)
            print(self.lanewidth / sscale)
            self.opttrack = ye * sscale

        if self.opttrack is None:
            return

        ye = self.opttrack
        s *= scale
        s[:, 0] += rectmin[0]
        s[:, 1] = rectmin[1] - s[:, 1]  # uninvert y
        s[:, 3] = -s[:, 3]
        L = s[:, :2] + (s[:, 2:4].T * ye.T).T
        dl = imgui.get_window_draw_list()
        magenta = imgui.get_color_u32_rgba(1, 0, 1, 1)
        N = len(ye)
        for i in range(1 + N):
            a = i % N
            b = (i + 1) % N
            dl.add_line(L[a, 0], L[a, 1], L[b, 0], L[b, 1], magenta)
Beispiel #28
0
    def render(self, play):
        imgui.begin("sim")
        dl = imgui.get_window_draw_list()
        meterwidth = max(np.max(self.track[:, 0]), np.max(self.lm[:, 0]))

        if play:
            if imgui.button("pause"):
                play = False
        else:
            if imgui.button("play"):
                play = True

        # sliders
        _, xy = imgui.slider_float2("car xy", self.car.x, -self.car.y, 0,
                                    meterwidth)
        self.car.x, self.car.y = xy[0], -xy[1]
        _, self.car.theta = imgui.slider_float("car theta", self.car.theta, 0,
                                               2 * np.pi)
        imgui.slider_float("car v", self.car.v, 0, 10)
        imgui.slider_float2("controls", self.u, self.k, -1, 1)
        _, self.lanewidth = imgui.slider_float("lane width", self.lanewidth,
                                               0.1, 2.0)

        # render overview
        pos = imgui.get_cursor_screen_pos()
        siz = imgui.get_content_region_available()
        if siz[1] <= 0:
            siz = [400, 400]
        imgui.invisible_button("overview", siz[0], siz[1])
        origin = pos
        scale = siz[0] / (meterwidth * 1.1)
        conecolor = imgui.get_color_u32_rgba(1, 0.7, 0, 1)
        for lm in self.lm:
            dl.add_rect_filled(origin[0] + lm[0] * scale - 2,
                               origin[1] - lm[1] * scale - 2,
                               origin[0] + lm[0] * scale + 2,
                               origin[1] - lm[1] * scale + 2, conecolor, 3)
        trackcolor = imgui.get_color_u32_rgba(1, 1, 0.3, 0.5)
        for i in range(0, len(self.track), 2):
            j = (i + 1) % len(self.track)
            ti = self.track[i] * scale
            tj = self.track[j] * scale
            dl.add_line(origin[0] + ti[0], origin[1] - ti[1],
                        origin[0] + tj[0], origin[1] - tj[1], trackcolor, 1.5)

        for i in range(0, len(self.track)):
            j = (i + 1) % len(self.track)
            ti = self.track[i] * scale
            tj = self.track[j] * scale
            Li = ti[2:4] * self.lanewidth
            Lj = tj[2:4] * self.lanewidth
            dl.add_line(origin[0] + ti[0] + Li[0], origin[1] - ti[1] - Li[1],
                        origin[0] + tj[0] + Lj[0], origin[1] - tj[1] - Lj[1],
                        trackcolor, 3)
            dl.add_line(origin[0] + ti[0] - Li[0], origin[1] - ti[1] + Li[1],
                        origin[0] + tj[0] - Lj[0], origin[1] - tj[1] + Lj[1],
                        trackcolor, 3)

        mx = scale * self.car.x
        my = scale * self.car.y
        # draw forward projections
        for traj in self.shots:
            for i in range(len(traj) - 1):
                dl.add_line(origin[0] + traj[i, 0] * scale,
                            origin[1] - traj[i, 1] * scale,
                            origin[0] + traj[i + 1, 0] * scale,
                            origin[1] - traj[i + 1, 1] * scale,
                            imgui.get_color_u32_rgba(0, 1, 1, 1), 1)

        # draw car + velocity
        vxy = scale * self.car.v * .1 * \
            np.array([np.cos(self.car.theta), np.sin(self.car.theta)])
        dl.add_line(origin[0] + mx, origin[1] - my, origin[0] + mx + vxy[0],
                    origin[1] - my - vxy[1],
                    imgui.get_color_u32_rgba(0, 1, 0, 1), 1)
        imgui.end()
        return play
Beispiel #29
0
    def render_graphs(self):
        imgui.begin("graphs")
        i = self.i
        dl = imgui.get_window_draw_list()
        mi = max(0, i - 30 * 3)
        temp = self.controlstate[mi:i + 1, 3].copy()
        imgui.plot_lines("velocity", temp)
        temp = self.controlstate[mi:i + 1, 8].copy()
        imgui.plot_lines("target v", temp)
        temp = self.controls[mi:i + 1, 0].copy()
        imgui.plot_lines("control v", temp)
        temp = self.controls[mi:i + 1, 1].copy()
        imgui.plot_lines("control steer", temp)
        temp = self.controlstate[mi:i + 1, 9].copy()
        imgui.plot_lines("target w", temp)
        temp = self.controlstate[mi:i + 1, 4].copy()
        imgui.plot_lines("yaw rate", temp)

        # live variables
        maxv = int(np.ceil(np.max(self.controlstate[:, 3]) * 1.1))
        imgui.slider_float("wheel v", self.controlstate[i, 3], 0, maxv)
        imgui.slider_float("target v", self.controlstate[i, 8], 0, maxv)
        lv = 0
        if i > 0:
            dx = self.controlstate[i, 0] - self.controlstate[i - 1, 0]
            dy = self.controlstate[i, 1] - self.controlstate[i - 1, 1]
            lv = np.sqrt(dx**2 + dy**2) * 30.0
        imgui.slider_float("localized v", lv, 0, maxv)

        imgui.slider_float("control motor", self.controls[i, 0] / 127., -1, 1)
        imgui.slider_float("control steer", self.controls[i, 1] / 127., -1, 1)

        # for yaw rate and curvature, set the limits backwards
        # so that turning right is to the right
        maxw = int(np.ceil(np.max(np.abs(self.controlstate[:, 4])) * 1.1))
        imgui.slider_float("yaw rate", self.controlstate[i, 4], maxw, -maxw)
        imgui.slider_float("target w", self.controlstate[i, 9], maxw, -maxw)
        v = self.controlstate[i, 3]
        if v > 0.5:
            k = self.controlstate[i, 4] / v
        else:
            k = 0
        imgui.slider_float("curvature", k, 2, -2)

        targetK = self.controlstate[self.i, 7]
        imgui.slider_float("target k", targetK, 2, -2)

        # render overview
        pos = imgui.get_cursor_screen_pos()
        siz = imgui.get_content_region_available()
        if siz[1] == 0:
            siz = [400, 300]
        imgui.invisible_button("overview", siz[0], siz[0] * 0.7)
        origin = pos
        meterwidth = max(np.max(self.track[:, 0]), np.max(self.lm[:, 0]))
        scale = siz[0] / (meterwidth * 1.1)
        conecolor = imgui.get_color_u32_rgba(1, 0.7, 0, 1)
        for lm in self.lm:
            dl.add_rect_filled(origin[0] + lm[0] * scale - 2,
                               origin[1] - lm[1] * scale - 2,
                               origin[0] + lm[0] * scale + 2,
                               origin[1] - lm[1] * scale + 2, conecolor, 3)
        trackcolor = imgui.get_color_u32_rgba(1, 1, 0.3, 0.5)
        for i in range(0, len(self.track), 2):
            j = (i + 1) % len(self.track)
            ti = self.track[i] * scale
            tj = self.track[j] * scale
            dl.add_line(origin[0] + ti[0], origin[1] - ti[1],
                        origin[0] + tj[0], origin[1] - tj[1], trackcolor, 1.5)

        particlecolor = imgui.get_color_u32_rgba(1, 1, 1, 0.3)
        dl.add_rect(pos[0], pos[1], pos[0] + siz[0], pos[1] + siz[1],
                    particlecolor, 1)
        if 'particles' in self.frame:
            ps = self.frame['particles']
            for p in ps:
                dl.add_rect_filled(origin[0] + p[0] * scale,
                                   origin[1] - p[1] * scale,
                                   origin[0] + p[0] * scale + 1,
                                   origin[1] - p[1] * scale + 1, particlecolor)
            # also draw a mean velocity vector
            mxy = scale * np.mean(ps[:, :2], axis=0)
            vxy = scale * v * .1 * np.array(
                [np.mean(np.cos(ps[:, 3])),
                 np.mean(np.sin(ps[:, 3]))])
            dl.add_line(origin[0] + mxy[0], origin[1] - mxy[1],
                        origin[0] + mxy[0] + vxy[0],
                        origin[1] - mxy[1] - vxy[1],
                        imgui.get_color_u32_rgba(0, 1, 0, 1), 1)
        else:
            x = self.controlstate[self.i, 0]
            y = self.controlstate[self.i, 1]
            theta = self.controlstate[self.i, 2]
            imgui.slider_float("x", x, 0, 20)
            imgui.slider_float("y", y, -10, 0)
            imgui.slider_float("theta", theta % (2 * np.pi), -np.pi, np.pi)
            v = 0.3 * self.controlstate[self.i, 3]
            S, C = np.sin(theta), np.cos(theta)
            dl.add_rect_filled(origin[0] + x * scale - 3,
                               origin[1] - y * scale - 3,
                               origin[0] + scale * x + 3,
                               origin[1] - scale * y + 3,
                               imgui.get_color_u32_rgba(0, 1, 0, 1), 1)
            dl.add_line(origin[0] + x * scale, origin[1] - y * scale,
                        origin[0] + scale * (x + v * C),
                        origin[1] - scale * (y + v * S),
                        imgui.get_color_u32_rgba(0, 1, 0, 1), 1)

        targetaccel = self.controlstate[self.i][12:14] / 9.8
        accel = self.carstate[self.i][2]
        ox, oy = origin[0] + scale * 3, origin[1] + scale * 9
        for i in range(100):
            t0 = i * 2 * np.pi / 100
            t1 = (i + 1) * 2 * np.pi / 100
            dl.add_line(ox + 2 * scale * np.cos(t0),
                        oy - 2 * scale * np.sin(t0),
                        ox + 2 * scale * np.cos(t1),
                        oy - 2 * scale * np.sin(t1),
                        imgui.get_color_u32_rgba(0.7, 0.7, 0.7, 1), 1)
            dl.add_line(ox + scale * np.cos(t0), oy - scale * np.sin(t0),
                        ox + scale * np.cos(t1), oy - scale * np.sin(t1),
                        imgui.get_color_u32_rgba(0.7, 0.7, 0.7, 1), 1)
        dl.add_line(ox, oy, ox + scale * accel[1], oy - scale * accel[0],
                    imgui.get_color_u32_rgba(0.3, 1, 0.5, 1), 3)
        dl.add_rect(ox - scale * targetaccel[1] - 2,
                    oy + scale * targetaccel[0] - 2,
                    ox - scale * targetaccel[1] + 2,
                    oy + scale * targetaccel[0] + 2,
                    imgui.get_color_u32_rgba(0.0, 1, 1, 1), 1)

        imgui.end()
Beispiel #30
0
def render_palette(drawing: Drawing):

    global color_editor_open  # Need a persistent way to keep track of the popup being closed...
    global current_color_page

    palette = drawing.palette
    fg = palette.foreground
    bg = palette.background
    fg_color = palette.foreground_color
    bg_color = palette.background_color

    imgui.begin_child("Palette", border=False, height=460)
    # Edit foreground color
    if imgui.color_button(f"Foreground (#{fg})", *as_float(fg_color), 0, 30,
                          30):
        io = imgui.get_io()
        w, h = io.display_size
        imgui.open_popup("Edit foreground color")
        imgui.set_next_window_position(w - 115 - 120, 200)
        color_editor_open = True
    if imgui.begin_popup("Edit foreground color",
                         flags=(imgui.WINDOW_NO_MOVE
                                | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)):
        done, cancelled, new_color = render_color_editor(
            palette.colors[fg], fg_color)
        if done and new_color != fg_color:
            drawing.change_colors(fg, new_color)
            palette.clear_overlay()
        elif cancelled:
            palette.clear_overlay()
        else:
            palette.set_overlay(fg, new_color)
        imgui.end_popup()
    elif color_editor_open:
        # The popup was closed by clicking outside, keeping the change (same as OK)
        drawing.change_colors(fg, fg_color)
        palette.clear_overlay()
        color_editor_open = False

    imgui.same_line()

    imgui.color_button(f"Background (#{bg})", *as_float(bg_color), 0, 30, 30)

    max_pages = len(palette.colors) // 64 - 1
    imgui.push_item_width(100)
    _, current_color_page = imgui.slider_int("Page",
                                             current_color_page,
                                             min_value=0,
                                             max_value=max_pages)
    start_color = 64 * current_color_page

    imgui.begin_child("Colors", border=False)
    imgui.push_style_var(imgui.STYLE_ITEM_SPACING,
                         (0, 0))  # Make layout tighter
    width = int(imgui.get_window_content_region_width()) // 20

    imgui.push_style_color(imgui.COLOR_FRAME_BACKGROUND, 0, 0, 0)

    colors = palette.colors

    # Order the colors by column instead of by row (which is the order we draw them)
    for i, c in enumerate(
            chain.from_iterable(
                zip(range(0, 16), range(16, 32), range(32, 48), range(48,
                                                                      64)))):
        color = colors[start_color + c]
        is_foreground = c == fg
        is_background = (c == bg) * 2
        selection = is_foreground | is_background
        color = as_float(color)

        if color[3] == 0 or selection:
            x, y = imgui.get_cursor_screen_pos()

        if imgui.color_button(f"color {i}", *color[:3], 1, 0, 25, 25):
            # io = imgui.get_io()
            # if io.key_shift:
            #     if "spread_start" in temp_vars:
            #         temp_vars["spread_end"] = i
            #     else:
            #         temp_vars["spread_start"] = i
            # else:
            fg = c

        if i % width != width - 1:
            imgui.same_line()

        draw_list = imgui.get_window_draw_list()
        if color[3] == 0:
            # Mark transparent color
            draw_list.add_line(x + 1, y + 1, x + 24, y + 24,
                               imgui.get_color_u32_rgba(0, 0, 0, 1), 1)
            draw_list.add_line(x + 1, y + 2, x + 23, y + 24,
                               imgui.get_color_u32_rgba(1, 1, 1, 1), 1)

        if is_foreground:
            # Mark foregroupd color
            draw_list.add_rect_filled(x + 2, y + 2, x + 10, y + 10,
                                      imgui.get_color_u32_rgba(1, 1, 1, 1))
            draw_list.add_rect(x + 2, y + 2, x + 10, y + 10,
                               imgui.get_color_u32_rgba(0, 0, 0, 1))
        if is_background:
            # Mark background color
            draw_list.add_rect_filled(x + 15, y + 2, x + 23, y + 10,
                                      imgui.get_color_u32_rgba(0, 0, 0, 1))
            draw_list.add_rect(x + 15, y + 2, x + 23, y + 10,
                               imgui.get_color_u32_rgba(1, 1, 1, 1))

        if imgui.core.is_item_clicked(2):
            # Right button sets background
            bg = c

        # Drag and drop (currently does not accomplish anything though)
        if imgui.begin_drag_drop_source():
            imgui.set_drag_drop_payload('start_index',
                                        c.to_bytes(1, sys.byteorder))
            imgui.color_button(f"color {c}", *color[:3], 1, 0, 20, 20)
            imgui.end_drag_drop_source()
        if imgui.begin_drag_drop_target():
            start_index = imgui.accept_drag_drop_payload('start_index')
            if start_index is not None:
                start_index = int.from_bytes(start_index, sys.byteorder)
                io = imgui.get_io()
                image_only = io.key_shift
                drawing.swap_colors(start_index, c, image_only=image_only)
                palette.clear_overlay()
            imgui.end_drag_drop_target()

    imgui.pop_style_color(1)
    imgui.pop_style_var(1)
    imgui.end_child()

    imgui.end_child()

    if imgui.is_item_hovered():
        io = imgui.get_io()
        delta = int(io.mouse_wheel)
        current_color_page = min(max(current_color_page - delta, 0), max_pages)

    palette.foreground = fg
    palette.background = bg