paint: draw fixes

This commit is contained in:
luboslenco
2026-06-09 07:51:31 +02:00
parent c25e30c69a
commit 41f5c24f14
3 changed files with 205 additions and 224 deletions
+15 -33
View File
@@ -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) {
+86 -88
View File
@@ -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;
}
}
}
+104 -103
View File
@@ -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