From 41f5c24f14e8dbe028d4a1a3f166ccac6acd8e10 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Tue, 9 Jun 2026 07:51:31 +0200 Subject: [PATCH] paint: draw fixes --- paint/sources/ui/ui_base.c | 48 +++----- paint/sources/ui/ui_nodes.c | 174 +++++++++++++++-------------- paint/sources/ui/ui_view2d.c | 207 ++++++++++++++++++----------------- 3 files changed, 205 insertions(+), 224 deletions(-) diff --git a/paint/sources/ui/ui_base.c b/paint/sources/ui/ui_base.c index ecc49625..45b5352e 100644 --- a/paint/sources/ui/ui_base.c +++ b/paint/sources/ui/ui_base.c @@ -216,27 +216,23 @@ void ui_base_update(void *_) { ui_sidebar_w_mini = math_floor(ui_sidebar_default_w_mini * UI_SCALE()); - if (!base_ui_enabled) { - return; + if (base_ui_enabled) { + render_gizmo_update(); + util_layer_update_path(); + util_touch_update(); + util_stencil_transform(); + util_select_update(); + util_brush_update(); + util_layer_update_preview(); + util_shortcut_undo_redo(); + util_shortcut_global(); + util_shortcut_brush(); + util_shortcut_viewport(); + util_resize_borders(); + util_particle_update(); + operator_update(); } - render_gizmo_update(); - util_layer_update_path(); - - util_touch_update(); - - util_stencil_transform(); - - util_select_update(); - - util_brush_update(); - - util_layer_update_preview(); - - util_shortcut_undo_redo(); - - operator_update(); - string_array_t *keys = map_keys(g_plugins); for (i32 i = 0; i < keys->length; ++i) { plugin_t *p = any_map_get(g_plugins, keys->buffer[i]); @@ -245,26 +241,12 @@ void ui_base_update(void *_) { } } - if (!base_ui_enabled) { - return; - } - - util_shortcut_global(); - - util_shortcut_brush(); - - util_shortcut_viewport(); - - util_resize_borders(); - if (!mouse_down("left")) { gc_unroot(ui_base_border_handle); ui_base_border_handle = NULL; base_is_resizing = false; } - util_particle_update(); - util_cursor_render(_); if (!ui_base_show && g_config->touch_ui) { diff --git a/paint/sources/ui/ui_nodes.c b/paint/sources/ui/ui_nodes.c index 53cf7a4d..1aeb84ed 100644 --- a/paint/sources/ui/ui_nodes.c +++ b/paint/sources/ui/ui_nodes.c @@ -660,106 +660,104 @@ void ui_nodes_draw_menubar() { } void ui_nodes_update(void *_) { - if (!ui_nodes_show || !base_ui_enabled) { - return; - } + if (ui_nodes_show && base_ui_enabled) { - ui_nodes_wx = math_floor(sys_w()) + ui_toolbar_w(true); - ui_nodes_wy = ui_header_h * 2; + ui_nodes_wx = math_floor(sys_w()) + ui_toolbar_w(true); + ui_nodes_wy = ui_header_h * 2; - if (ui_view2d_show && base_view3d_show) { - ui_nodes_wy += sys_h() - g_config->layout->buffer[LAYOUT_SIZE_NODES_H]; - } - - i32 ww = g_config->layout->buffer[LAYOUT_SIZE_NODES_W]; - if (!ui_base_show) { - ww += g_config->layout->buffer[LAYOUT_SIZE_SIDEBAR_W] + ui_toolbar_w(true); - ui_nodes_wx -= ui_toolbar_w(true); - ui_nodes_wy = 0; - } - if (!base_view3d_show) { - ww += base_view3d_w(); - } - - if (!base_view3d_show && ui_view2d_show) { - ui_nodes_wx = base_view3d_w(); - ui_nodes_wy = 0; - ui_nodes_ww = g_config->layout->buffer[LAYOUT_SIZE_NODES_W]; - ui_nodes_wh = sys_h(); - if (g_config->layout->buffer[LAYOUT_SIZE_HEADER] == 1) { - ui_nodes_wh += ui_header_h * 2; + if (ui_view2d_show && base_view3d_show) { + ui_nodes_wy += sys_h() - g_config->layout->buffer[LAYOUT_SIZE_NODES_H]; } - } - if (!base_view3d_show) { - ui_nodes_wh -= ui_header_h * 4; - } + i32 ww = g_config->layout->buffer[LAYOUT_SIZE_NODES_W]; + if (!ui_base_show) { + ww += g_config->layout->buffer[LAYOUT_SIZE_SIDEBAR_W] + ui_toolbar_w(true); + ui_nodes_wx -= ui_toolbar_w(true); + ui_nodes_wy = 0; + } + if (!base_view3d_show) { + ww += base_view3d_w(); + } - i32 mx = mouse_x; - i32 my = mouse_y; - bool enabled = true; - if (mx < ui_nodes_wx || mx > ui_nodes_wx + ww || my < ui_nodes_wy) { - enabled = false; - } - if (g_ui->is_typing || !g_ui->input_enabled) { - enabled = false; - } - - if (enabled) { - - ui_nodes_t *nodes = ui_nodes_get_nodes(); - if (nodes->nodes_selected_id->length > 0 && g_ui->is_key_pressed) { - if (g_ui->key_code == KEY_CODE_LEFT) { - for (i32 i = 0; i < nodes->nodes_selected_id->length; ++i) { - i32 n = nodes->nodes_selected_id->buffer[i]; - ui_node_t_array_t *_nodes = ui_nodes_get_canvas(true)->nodes; - ui_get_node(_nodes, n)->x -= 1; - } - } - else if (g_ui->key_code == KEY_CODE_RIGHT) { - for (i32 i = 0; i < nodes->nodes_selected_id->length; ++i) { - i32 n = nodes->nodes_selected_id->buffer[i]; - ui_node_t_array_t *_nodes = ui_nodes_get_canvas(true)->nodes; - ui_get_node(_nodes, n)->x += 1; - } - } - if (g_ui->key_code == KEY_CODE_UP) { - for (i32 i = 0; i < nodes->nodes_selected_id->length; ++i) { - i32 n = nodes->nodes_selected_id->buffer[i]; - ui_node_t_array_t *_nodes = ui_nodes_get_canvas(true)->nodes; - ui_get_node(_nodes, n)->y -= 1; - } - } - else if (g_ui->key_code == KEY_CODE_DOWN) { - for (i32 i = 0; i < nodes->nodes_selected_id->length; ++i) { - i32 n = nodes->nodes_selected_id->buffer[i]; - ui_node_t_array_t *_nodes = ui_nodes_get_canvas(true)->nodes; - ui_get_node(_nodes, n)->y += 1; - } + if (!base_view3d_show && ui_view2d_show) { + ui_nodes_wx = base_view3d_w(); + ui_nodes_wy = 0; + ui_nodes_ww = g_config->layout->buffer[LAYOUT_SIZE_NODES_W]; + ui_nodes_wh = sys_h(); + if (g_config->layout->buffer[LAYOUT_SIZE_HEADER] == 1) { + ui_nodes_wh += ui_header_h * 2; } } - // Node search popup - if (operator_shortcut(any_map_get(g_keymap, "node_search"), SHORTCUT_TYPE_STARTED)) { - ui_nodes_node_search(-1, -1, NULL); - } - if (ui_nodes_node_search_spawn != NULL) { - g_ui->input_x = mouse_x; // Fix input_dx after popup removal - g_ui->input_y = mouse_y; - gc_unroot(ui_nodes_node_search_spawn); - ui_nodes_node_search_spawn = NULL; + if (!base_view3d_show) { + ui_nodes_wh -= ui_header_h * 4; } - if (operator_shortcut(any_map_get(g_keymap, "view_reset"), SHORTCUT_TYPE_STARTED)) { - nodes->pan_x = 0.0; - nodes->pan_y = 0.0; - nodes->zoom = 1.0; + i32 mx = mouse_x; + i32 my = mouse_y; + bool enabled = true; + if (mx < ui_nodes_wx || mx > ui_nodes_wx + ww || my < ui_nodes_wy) { + enabled = false; + } + if (g_ui->is_typing || !g_ui->input_enabled) { + enabled = false; } - if (operator_shortcut(any_map_get(g_keymap, "node_overview"), SHORTCUT_TYPE_STARTED)) { - nodes->zoom = nodes->zoom == 1.0 ? 0.2 : 1.0; - nodes->uiw = ui_nodes_ww; - nodes->uih = ui_nodes_wh; + if (enabled) { + ui_nodes_t *nodes = ui_nodes_get_nodes(); + if (nodes->nodes_selected_id->length > 0 && g_ui->is_key_pressed) { + if (g_ui->key_code == KEY_CODE_LEFT) { + for (i32 i = 0; i < nodes->nodes_selected_id->length; ++i) { + i32 n = nodes->nodes_selected_id->buffer[i]; + ui_node_t_array_t *_nodes = ui_nodes_get_canvas(true)->nodes; + ui_get_node(_nodes, n)->x -= 1; + } + } + else if (g_ui->key_code == KEY_CODE_RIGHT) { + for (i32 i = 0; i < nodes->nodes_selected_id->length; ++i) { + i32 n = nodes->nodes_selected_id->buffer[i]; + ui_node_t_array_t *_nodes = ui_nodes_get_canvas(true)->nodes; + ui_get_node(_nodes, n)->x += 1; + } + } + if (g_ui->key_code == KEY_CODE_UP) { + for (i32 i = 0; i < nodes->nodes_selected_id->length; ++i) { + i32 n = nodes->nodes_selected_id->buffer[i]; + ui_node_t_array_t *_nodes = ui_nodes_get_canvas(true)->nodes; + ui_get_node(_nodes, n)->y -= 1; + } + } + else if (g_ui->key_code == KEY_CODE_DOWN) { + for (i32 i = 0; i < nodes->nodes_selected_id->length; ++i) { + i32 n = nodes->nodes_selected_id->buffer[i]; + ui_node_t_array_t *_nodes = ui_nodes_get_canvas(true)->nodes; + ui_get_node(_nodes, n)->y += 1; + } + } + } + + // Node search popup + if (operator_shortcut(any_map_get(g_keymap, "node_search"), SHORTCUT_TYPE_STARTED)) { + ui_nodes_node_search(-1, -1, NULL); + } + if (ui_nodes_node_search_spawn != NULL) { + g_ui->input_x = mouse_x; // Fix input_dx after popup removal + g_ui->input_y = mouse_y; + gc_unroot(ui_nodes_node_search_spawn); + ui_nodes_node_search_spawn = NULL; + } + + if (operator_shortcut(any_map_get(g_keymap, "view_reset"), SHORTCUT_TYPE_STARTED)) { + nodes->pan_x = 0.0; + nodes->pan_y = 0.0; + nodes->zoom = 1.0; + } + + if (operator_shortcut(any_map_get(g_keymap, "node_overview"), SHORTCUT_TYPE_STARTED)) { + nodes->zoom = nodes->zoom == 1.0 ? 0.2 : 1.0; + nodes->uiw = ui_nodes_ww; + nodes->uih = ui_nodes_wh; + } } } diff --git a/paint/sources/ui/ui_view2d.c b/paint/sources/ui/ui_view2d.c index c2753a02..131dae8e 100644 --- a/paint/sources/ui/ui_view2d.c +++ b/paint/sources/ui/ui_view2d.c @@ -142,121 +142,122 @@ void ui_view2d_update(void *_) { ui_canvas_control_t *control = ui_nodes_get_canvas_control(ui_view2d_controls_down, false); ui_view2d_controls_down = control->controls_down; } - return; } + else { - ui_canvas_control_t *control = ui_nodes_get_canvas_control(ui_view2d_controls_down, false); - ui_view2d_pan_x += control->pan_x; - ui_view2d_pan_y += control->pan_y; - ui_view2d_controls_down = control->controls_down; - if (control->zoom != 0.0) { - f32 _pan_x = ui_view2d_pan_x / (float)ui_view2d_pan_scale; - f32 _pan_y = ui_view2d_pan_y / (float)ui_view2d_pan_scale; - ui_view2d_pan_scale += control->zoom; - if (ui_view2d_pan_scale < 0.1) { - ui_view2d_pan_scale = 0.1; - } - if (ui_view2d_pan_scale > 6.0) { - ui_view2d_pan_scale = 6.0; - } - ui_view2d_pan_x = _pan_x * ui_view2d_pan_scale; - ui_view2d_pan_y = _pan_y * ui_view2d_pan_scale; - - if (ui_touch_control) { - // Zoom to finger location - ui_view2d_pan_x -= (g_ui->input_x - g_ui->_window_x - g_ui->_window_w / 2.0) * control->zoom; - ui_view2d_pan_y -= (g_ui->input_y - g_ui->_window_y - g_ui->_window_h / 2.0) * control->zoom; - } - ui_view2d_grid_redraw = true; - } - - bool decal_mask = context_is_decal_mask_paint(); - bool set_clone_source = - g_context->tool == TOOL_TYPE_CLONE && - operator_shortcut(string("%s+%s", any_map_get(g_keymap, "set_clone_source"), any_map_get(g_keymap, "action_paint")), SHORTCUT_TYPE_DOWN); - - if (!g_ui->input_down) { - ui_view2d_layer_touched = false; - } - - if (ui_view2d_type == VIEW_2D_TYPE_LAYER && !ui_view2d_text_input_hover && - (operator_shortcut(any_map_get(g_keymap, "action_paint"), SHORTCUT_TYPE_DOWN) || - operator_shortcut(string("%s+%s", any_map_get(g_keymap, "brush_ruler"), any_map_get(g_keymap, "action_paint")), SHORTCUT_TYPE_DOWN) || decal_mask || - set_clone_source || g_config->brush_live)) { - - if (g_config->touch_ui) { - // Paint only when clicking on the layer rect - slot_layer_t *layer = g_context->layer; - gpu_texture_t *tex = layer->texpaint; - f32 ratio = tex->height / (float)tex->width; - f32 wm = fmin(ui_view2d_ww, ui_view2d_wh); - f32 tw = wm * 0.9 * ui_view2d_pan_scale; - f32 th = tw * ratio; - f32 tx = ui_view2d_ww / 2.0 - tw / 2.0 + ui_view2d_pan_x; - i32 headerh = g_config->layout->buffer[LAYOUT_SIZE_HEADER] == 1 ? ui_header_h * 2 : ui_header_h; - i32 apph = iron_window_height() - g_config->layout->buffer[LAYOUT_SIZE_STATUS_H] + headerh; - f32 ty = apph / 2.0 - th / 2.0 + ui_view2d_pan_y; - f32 mx = mouse_x - ui_view2d_wx; - f32 my = mouse_y - ui_view2d_wy; - if (mx > tx && mx < tx + tw && my > ty && my < ty + th) { - ui_view2d_layer_touched = true; + ui_canvas_control_t *control = ui_nodes_get_canvas_control(ui_view2d_controls_down, false); + ui_view2d_pan_x += control->pan_x; + ui_view2d_pan_y += control->pan_y; + ui_view2d_controls_down = control->controls_down; + if (control->zoom != 0.0) { + f32 _pan_x = ui_view2d_pan_x / (float)ui_view2d_pan_scale; + f32 _pan_y = ui_view2d_pan_y / (float)ui_view2d_pan_scale; + ui_view2d_pan_scale += control->zoom; + if (ui_view2d_pan_scale < 0.1) { + ui_view2d_pan_scale = 0.1; } - if (ui_view2d_layer_touched) { + if (ui_view2d_pan_scale > 6.0) { + ui_view2d_pan_scale = 6.0; + } + ui_view2d_pan_x = _pan_x * ui_view2d_pan_scale; + ui_view2d_pan_y = _pan_y * ui_view2d_pan_scale; + + if (ui_touch_control) { + // Zoom to finger location + ui_view2d_pan_x -= (g_ui->input_x - g_ui->_window_x - g_ui->_window_w / 2.0) * control->zoom; + ui_view2d_pan_y -= (g_ui->input_y - g_ui->_window_y - g_ui->_window_h / 2.0) * control->zoom; + } + ui_view2d_grid_redraw = true; + } + + bool decal_mask = context_is_decal_mask_paint(); + bool set_clone_source = + g_context->tool == TOOL_TYPE_CLONE && + operator_shortcut(string("%s+%s", any_map_get(g_keymap, "set_clone_source"), any_map_get(g_keymap, "action_paint")), SHORTCUT_TYPE_DOWN); + + if (!g_ui->input_down) { + ui_view2d_layer_touched = false; + } + + if (ui_view2d_type == VIEW_2D_TYPE_LAYER && !ui_view2d_text_input_hover && + (operator_shortcut(any_map_get(g_keymap, "action_paint"), SHORTCUT_TYPE_DOWN) || + operator_shortcut(string("%s+%s", any_map_get(g_keymap, "brush_ruler"), any_map_get(g_keymap, "action_paint")), SHORTCUT_TYPE_DOWN) || decal_mask || + set_clone_source || g_config->brush_live)) { + + if (g_config->touch_ui) { + // Paint only when clicking on the layer rect + slot_layer_t *layer = g_context->layer; + gpu_texture_t *tex = layer->texpaint; + f32 ratio = tex->height / (float)tex->width; + f32 wm = fmin(ui_view2d_ww, ui_view2d_wh); + f32 tw = wm * 0.9 * ui_view2d_pan_scale; + f32 th = tw * ratio; + f32 tx = ui_view2d_ww / 2.0 - tw / 2.0 + ui_view2d_pan_x; + i32 headerh = g_config->layout->buffer[LAYOUT_SIZE_HEADER] == 1 ? ui_header_h * 2 : ui_header_h; + i32 apph = iron_window_height() - g_config->layout->buffer[LAYOUT_SIZE_STATUS_H] + headerh; + f32 ty = apph / 2.0 - th / 2.0 + ui_view2d_pan_y; + f32 mx = mouse_x - ui_view2d_wx; + f32 my = mouse_y - ui_view2d_wy; + if (mx > tx && mx < tx + tw && my > ty && my < ty + th) { + ui_view2d_layer_touched = true; + } + if (ui_view2d_layer_touched) { + g_context->paint2d = true; + } + } + else { g_context->paint2d = true; } } - else { - g_context->paint2d = true; + + if (g_ui->is_typing) { + return; } - } - if (g_ui->is_typing) { - return; - } + if (keyboard_started("left")) { + ui_view2d_pan_x -= 5; + } + else if (keyboard_started("right")) { + ui_view2d_pan_x += 5; + } + if (keyboard_started("up")) { + ui_view2d_pan_y -= 5; + } + else if (keyboard_started("down")) { + ui_view2d_pan_y += 5; + } - if (keyboard_started("left")) { - ui_view2d_pan_x -= 5; - } - else if (keyboard_started("right")) { - ui_view2d_pan_x += 5; - } - if (keyboard_started("up")) { - ui_view2d_pan_y -= 5; - } - else if (keyboard_started("down")) { - ui_view2d_pan_y += 5; - } + if (!g_context->paint2d && g_config->touch_ui && g_ui->input_down && ui_view2d_type != VIEW_2D_TYPE_UVMAP) { + ui_view2d_pan_x += g_ui->input_dx; + ui_view2d_pan_y += g_ui->input_dy; + } - if (!g_context->paint2d && g_config->touch_ui && g_ui->input_down && ui_view2d_type != VIEW_2D_TYPE_UVMAP) { - ui_view2d_pan_x += g_ui->input_dx; - ui_view2d_pan_y += g_ui->input_dy; - } + // Limit panning to keep texture in viewport + i32 border = 32; + f32 wm = fmin(ui_view2d_ww, ui_view2d_wh); + f32 tw = ui_view2d_ww * 0.9 * ui_view2d_pan_scale; + f32 tx = ui_view2d_ww / 2.0 - tw / 2.0 + ui_view2d_pan_x; + f32 hh = sys_h(); + f32 ty = hh / 2.0 - tw / 2.0 + ui_view2d_pan_y; - // Limit panning to keep texture in viewport - i32 border = 32; - f32 wm = fmin(ui_view2d_ww, ui_view2d_wh); - f32 tw = ui_view2d_ww * 0.9 * ui_view2d_pan_scale; - f32 tx = ui_view2d_ww / 2.0 - tw / 2.0 + ui_view2d_pan_x; - f32 hh = sys_h(); - f32 ty = hh / 2.0 - tw / 2.0 + ui_view2d_pan_y; + if (tx + border > ui_view2d_ww) { + ui_view2d_pan_x = ui_view2d_ww / 2.0 + tw / 2.0 - border; + } + else if (tx - border < -tw) { + ui_view2d_pan_x = -tw / 2.0 - ui_view2d_ww / 2.0 + border; + } + if (ty + border > hh) { + ui_view2d_pan_y = hh / 2.0 + tw / 2.0 - border; + } + else if (ty - border < -tw) { + ui_view2d_pan_y = -tw / 2.0 - hh / 2.0 + border; + } - if (tx + border > ui_view2d_ww) { - ui_view2d_pan_x = ui_view2d_ww / 2.0 + tw / 2.0 - border; - } - else if (tx - border < -tw) { - ui_view2d_pan_x = -tw / 2.0 - ui_view2d_ww / 2.0 + border; - } - if (ty + border > hh) { - ui_view2d_pan_y = hh / 2.0 + tw / 2.0 - border; - } - else if (ty - border < -tw) { - ui_view2d_pan_y = -tw / 2.0 - hh / 2.0 + border; - } - - if (operator_shortcut(any_map_get(g_keymap, "view_reset"), SHORTCUT_TYPE_STARTED)) { - ui_view2d_pan_x = 0.0; - ui_view2d_pan_y = 0.0; - ui_view2d_pan_scale = 1.0; + if (operator_shortcut(any_map_get(g_keymap, "view_reset"), SHORTCUT_TYPE_STARTED)) { + ui_view2d_pan_x = 0.0; + ui_view2d_pan_y = 0.0; + ui_view2d_pan_scale = 1.0; + } } // Render