Files
armorpaint/base/sources/ts/ui_view2d.ts
T

530 lines
17 KiB
TypeScript
Raw Normal View History

2024-03-11 15:10:18 +01:00
2025-06-19 19:55:16 +02:00
let ui_view2d_pipe: gpu_pipeline_t;
2025-06-19 09:20:00 +02:00
let ui_view2d_channel_loc: i32;
2024-03-11 15:10:18 +01:00
let ui_view2d_text_input_hover: bool = false;
let ui_view2d_uvmap_show: bool = false;
let ui_view2d_tex_type: paint_tex_t = paint_tex_t.BASE;
let ui_view2d_layer_mode: view_2d_layer_mode_t = view_2d_layer_mode_t.SELECTED;
///if (is_paint || is_sculpt)
let ui_view2d_type: view_2d_type_t = view_2d_type_t.LAYER;
///else
let ui_view2d_type: view_2d_type_t = view_2d_type_t.ASSET;
///end
let ui_view2d_show: bool = false;
let ui_view2d_wx: i32;
let ui_view2d_wy: i32;
let ui_view2d_ww: i32;
let ui_view2d_wh: i32;
2024-09-03 15:52:05 +02:00
let ui_view2d_ui: ui_t;
let ui_view2d_hwnd: ui_handle_t = ui_handle_create();
2024-03-11 15:10:18 +01:00
let ui_view2d_pan_x: f32 = 0.0;
let ui_view2d_pan_y: f32 = 0.0;
let ui_view2d_pan_scale: f32 = 1.0;
let ui_view2d_tiled_show: bool = false;
let ui_view2d_controls_down: bool = false;
2025-06-19 19:55:16 +02:00
let _ui_view2d_render_tex: gpu_texture_t;
2024-11-08 23:46:39 +01:00
let _ui_view2d_render_x: f32;
let _ui_view2d_render_y: f32;
let _ui_view2d_render_tw: f32;
let _ui_view2d_render_th: f32;
2025-06-19 19:55:16 +02:00
let ui_view2d_grid: gpu_texture_t = null;
2025-01-27 16:04:04 +01:00
let ui_view2d_grid_redraw: bool = true;
2024-03-11 15:10:18 +01:00
function ui_view2d_init() {
///if (is_paint || is_sculpt)
2025-03-10 20:38:53 +01:00
ui_view2d_pipe = gpu_create_pipeline();
2024-03-11 15:10:18 +01:00
ui_view2d_pipe.vertex_shader = sys_get_shader("layer_view.vert");
ui_view2d_pipe.fragment_shader = sys_get_shader("layer_view.frag");
2025-06-19 19:55:16 +02:00
let vs: gpu_vertex_structure_t = gpu_vertex_struct_create();
2025-04-21 19:38:23 +02:00
gpu_vertex_struct_add(vs, "pos", vertex_data_t.F32_2X);
2025-02-11 10:51:57 +01:00
ui_view2d_pipe.input_layout = vs;
2024-03-11 15:10:18 +01:00
ui_view2d_pipe.blend_source = blend_factor_t.BLEND_ONE;
2025-03-03 22:50:40 +01:00
ui_view2d_pipe.blend_destination = blend_factor_t.BLEND_ZERO;
ARRAY_ACCESS(ui_view2d_pipe.color_write_mask_alpha, 0) = false;
2025-06-19 23:30:32 +02:00
gpu_pipeline_compile(ui_view2d_pipe);
2025-03-31 18:31:49 +02:00
pipes_offset = 0;
2025-06-19 09:20:00 +02:00
pipes_get_constant_location("mat4");
pipes_get_constant_location("float4");
pipes_get_constant_location("float4");
pipes_get_constant_location("float4");
ui_view2d_channel_loc = pipes_get_constant_location("int");
2024-03-11 15:10:18 +01:00
///end
let scale: f32 = config_raw.window_scale;
2024-09-03 15:52:05 +02:00
let ops: ui_options_t = {
2024-04-25 22:04:43 +02:00
theme: base_theme,
2024-05-11 22:03:44 +02:00
font: base_font,
2025-03-06 20:42:54 +01:00
color_wheel: base_color_wheel,
black_white_gradient: base_color_wheel_gradient,
2024-04-25 22:04:43 +02:00
scale_factor: scale
};
2024-09-03 15:52:05 +02:00
ui_view2d_ui = ui_create(ops);
2024-03-11 15:10:18 +01:00
ui_view2d_ui.scroll_enabled = false;
}
function ui_view2d_render() {
ui_view2d_ww = config_raw.layout[layout_size_t.NODES_W];
///if (is_paint || is_sculpt)
2025-07-18 23:37:51 +02:00
ui_view2d_wx = math_floor(sys_w()) + ui_toolbar_w(true);
2024-03-11 15:10:18 +01:00
///else
2025-03-11 19:49:42 +01:00
ui_view2d_wx = math_floor(sys_w());
2024-03-11 15:10:18 +01:00
///end
ui_view2d_wy = 0;
///if (is_paint || is_sculpt)
if (!ui_base_show) {
2025-07-18 23:37:51 +02:00
ui_view2d_ww += config_raw.layout[layout_size_t.SIDEBAR_W] + ui_toolbar_w(true);
ui_view2d_wx -= ui_toolbar_w(true);
2024-03-11 15:10:18 +01:00
}
///end
2024-03-20 16:13:54 +01:00
if (!ui_view2d_show) {
return;
}
2025-03-09 17:02:12 +01:00
if (iron_window_width() == 0 || iron_window_height() == 0) {
2024-03-20 16:13:54 +01:00
return;
}
2024-03-11 15:10:18 +01:00
2024-03-20 16:13:54 +01:00
if (context_raw.pdirty >= 0) {
ui_view2d_hwnd.redraws = 2; // Paint was active
}
2024-03-11 15:10:18 +01:00
// Cache grid
2025-01-27 16:04:04 +01:00
if (ui_view2d_grid_redraw) {
if (ui_view2d_grid != null) {
2025-07-21 17:14:54 +02:00
iron_delete_texture(ui_view2d_grid);
2025-01-27 16:04:04 +01:00
}
ui_view2d_grid = ui_nodes_draw_grid(ui_view2d_pan_scale);
ui_view2d_grid_redraw = false;
2024-03-20 16:13:54 +01:00
}
2024-03-11 15:10:18 +01:00
// Ensure UV map is drawn
///if (is_paint || is_sculpt)
2024-03-20 16:13:54 +01:00
if (ui_view2d_uvmap_show) {
util_uv_cache_uv_map();
}
2024-03-11 15:10:18 +01:00
///end
// Ensure font image is drawn
///if (is_paint || is_sculpt)
2024-03-20 16:13:54 +01:00
if (context_raw.font.image == null) {
util_render_make_font_preview();
}
2024-03-11 15:10:18 +01:00
///end
2024-09-03 15:52:05 +02:00
ui_begin(ui_view2d_ui);
2024-03-11 15:10:18 +01:00
let headerh: i32 = config_raw.layout[layout_size_t.HEADER] == 1 ? ui_header_h * 2 : ui_header_h;
2025-03-09 17:02:12 +01:00
let apph: i32 = iron_window_height() - config_raw.layout[layout_size_t.STATUS_H] + headerh;
ui_view2d_wh = iron_window_height() - config_raw.layout[layout_size_t.STATUS_H];
2024-03-11 15:10:18 +01:00
if (ui_nodes_show) {
ui_view2d_wh -= config_raw.layout[layout_size_t.NODES_H];
2025-01-04 19:18:54 +01:00
if (config_raw.touch_ui) {
ui_view2d_wh += ui_header_h;
}
2024-03-11 15:10:18 +01:00
}
2024-09-03 15:52:05 +02:00
if (ui_window(ui_view2d_hwnd, ui_view2d_wx, ui_view2d_wy, ui_view2d_ww, ui_view2d_wh)) {
2024-03-11 15:10:18 +01:00
2024-09-03 15:52:05 +02:00
ui_tab(ui_handle(__ID__), tr("2D View"));
2024-03-11 15:10:18 +01:00
// Grid
2025-03-02 21:07:17 +01:00
draw_set_color(0xffffffff);
2025-01-27 16:04:04 +01:00
let step: f32 = ui_nodes_grid_cell_w * ui_view2d_pan_scale;
let x: f32 = math_fmod(ui_view2d_pan_x, step) - step;
let y: f32 = math_fmod(ui_view2d_pan_y, step) - step;
2025-03-02 19:44:26 +01:00
draw_image(ui_view2d_grid, x, y);
2024-03-11 15:10:18 +01:00
// Texture
2025-06-19 19:55:16 +02:00
let tex: gpu_texture_t = null;
2024-03-11 15:10:18 +01:00
2024-03-20 16:13:54 +01:00
let l: slot_layer_t = context_raw.layer;
2024-03-11 15:10:18 +01:00
let channel: i32 = 0;
let tw: f32 = ui_view2d_ww * 0.95 * ui_view2d_pan_scale;
let tx: f32 = ui_view2d_ww / 2 - tw / 2 + ui_view2d_pan_x;
let ty: f32 = apph / 2 - tw / 2 + ui_view2d_pan_y;
if (ui_view2d_type == view_2d_type_t.ASSET) {
tex = project_get_image(context_raw.texture);
}
else if (ui_view2d_type == view_2d_type_t.NODE) {
///if (is_paint || is_sculpt)
tex = context_raw.node_preview;
///else
2024-09-03 15:52:05 +02:00
let nodes: ui_nodes_t = ui_nodes_get_nodes();
2024-03-11 15:10:18 +01:00
if (nodes.nodes_selected_id.length > 0) {
2024-09-03 15:52:05 +02:00
let sel: ui_node_t = ui_get_node(ui_nodes_get_canvas(true).nodes, nodes.nodes_selected_id[0]);
2024-10-21 19:28:43 +02:00
let brush_node: logic_node_ext_t = parser_logic_get_logic_node(sel);
2024-03-11 15:10:18 +01:00
if (brush_node != null) {
2024-10-21 19:28:43 +02:00
tex = logic_node_get_cached_image(brush_node.base);
2024-03-11 15:10:18 +01:00
}
}
///end
}
else if (ui_view2d_type == view_2d_type_t.LAYER) {
2024-03-20 16:13:54 +01:00
let layer: slot_layer_t = l;
2024-03-11 15:10:18 +01:00
2024-03-14 15:31:22 +01:00
if (config_raw.brush_live && render_path_paint_live_layer_drawn > 0) {
layer = render_path_paint_live_layer;
2024-03-11 15:10:18 +01:00
}
if (ui_view2d_layer_mode == view_2d_layer_mode_t.VISIBLE) {
2025-06-19 19:55:16 +02:00
let current: gpu_texture_t = _draw_current;
2025-06-21 16:49:53 +02:00
let in_use: bool = gpu_in_use;
if (in_use) draw_end();
2024-11-10 16:53:36 +01:00
layer = layers_flatten();
2025-06-21 16:49:53 +02:00
if (in_use) draw_begin(current);
2024-03-11 15:10:18 +01:00
}
2024-03-14 15:31:22 +01:00
else if (slot_layer_is_group(layer)) {
2025-06-19 19:55:16 +02:00
let current: gpu_texture_t = _draw_current;
2025-06-21 16:49:53 +02:00
let in_use: bool = gpu_in_use;
if (in_use) draw_end();
2024-11-10 16:53:36 +01:00
layer = layers_flatten(false, slot_layer_get_children(layer));
2025-06-21 16:49:53 +02:00
if (in_use) draw_begin(current);
2024-03-11 15:10:18 +01:00
}
tex =
2025-04-21 19:38:23 +02:00
slot_layer_is_mask(context_raw.layer) ? layer.texpaint :
ui_view2d_tex_type == paint_tex_t.BASE ? layer.texpaint :
ui_view2d_tex_type == paint_tex_t.OPACITY ? layer.texpaint :
ui_view2d_tex_type == paint_tex_t.NORMAL ? layer.texpaint_nor :
layer.texpaint_pack;
2024-03-11 15:10:18 +01:00
channel =
2025-04-21 19:38:23 +02:00
slot_layer_is_mask(context_raw.layer) ? 1 :
2024-03-11 15:10:18 +01:00
ui_view2d_tex_type == paint_tex_t.OCCLUSION ? 1 :
ui_view2d_tex_type == paint_tex_t.ROUGHNESS ? 2 :
ui_view2d_tex_type == paint_tex_t.METALLIC ? 3 :
ui_view2d_tex_type == paint_tex_t.OPACITY ? 4 :
ui_view2d_tex_type == paint_tex_t.HEIGHT ? 4 :
ui_view2d_tex_type == paint_tex_t.NORMAL ? 5 :
0;
}
else if (ui_view2d_type == view_2d_type_t.FONT) {
tex = context_raw.font.image;
}
let th: f32 = tw;
if (tex != null) {
th = tw * (tex.height / tex.width);
ty = apph / 2 - th / 2 + ui_view2d_pan_y;
///if (is_paint || is_sculpt)
if (ui_view2d_type == view_2d_type_t.LAYER) {
2025-03-03 22:50:40 +01:00
draw_set_pipeline(ui_view2d_pipe);
2024-03-11 15:10:18 +01:00
if (!context_raw.texture_filter) {
2025-03-02 19:44:26 +01:00
draw_set_bilinear_filter(false);
2024-03-11 15:10:18 +01:00
}
2025-03-18 12:14:21 +01:00
gpu_set_int(ui_view2d_channel_loc, channel);
2024-03-11 15:10:18 +01:00
}
///end
2025-03-02 19:44:26 +01:00
draw_scaled_image(tex, tx, ty, tw, th);
2024-03-11 15:10:18 +01:00
if (ui_view2d_tiled_show) {
2025-03-02 19:44:26 +01:00
draw_scaled_image(tex, tx - tw, ty, tw, th);
draw_scaled_image(tex, tx - tw, ty - th, tw, th);
draw_scaled_image(tex, tx - tw, ty + th, tw, th);
draw_scaled_image(tex, tx + tw, ty, tw, th);
draw_scaled_image(tex, tx + tw, ty - th, tw, th);
draw_scaled_image(tex, tx + tw, ty + th, tw, th);
draw_scaled_image(tex, tx, ty - th, tw, th);
draw_scaled_image(tex, tx, ty + th, tw, th);
2024-03-11 15:10:18 +01:00
}
///if (is_paint || is_sculpt)
if (ui_view2d_type == view_2d_type_t.LAYER) {
2025-03-03 22:50:40 +01:00
draw_set_pipeline(null);
2024-03-11 15:10:18 +01:00
if (!context_raw.texture_filter) {
2025-03-02 19:44:26 +01:00
draw_set_bilinear_filter(true);
2024-03-11 15:10:18 +01:00
}
}
// Texture and node preview color picking
if ((context_in_2d_view(view_2d_type_t.ASSET) || context_in_2d_view(view_2d_type_t.NODE)) && context_raw.tool == workspace_tool_t.PICKER && ui_view2d_ui.input_down) {
2024-04-07 09:52:45 +02:00
_ui_view2d_render_tex = tex;
_ui_view2d_render_x = ui_view2d_ui.input_x - tx - ui_view2d_wx;;
_ui_view2d_render_y = ui_view2d_ui.input_y - ty - ui_view2d_wy;
_ui_view2d_render_tw = tw;
_ui_view2d_render_th = th;
2025-03-11 19:49:42 +01:00
sys_notify_on_next_frame(function () {
2024-05-03 21:29:39 +02:00
let rt: render_target_t = map_get(render_path_render_targets, "texpaint_picker");
2025-06-19 19:55:16 +02:00
let texpaint_picker: gpu_texture_t = rt._image;
2025-03-10 20:26:45 +01:00
draw_begin(texpaint_picker);
2025-03-02 19:44:26 +01:00
draw_scaled_image(_ui_view2d_render_tex, -_ui_view2d_render_x, -_ui_view2d_render_y, _ui_view2d_render_tw, _ui_view2d_render_th);
2025-03-10 20:26:45 +01:00
draw_end();
2025-03-10 20:38:53 +01:00
let a: buffer_t = gpu_get_texture_pixels(texpaint_picker);
2024-09-06 21:11:46 +02:00
///if (arm_metal || arm_vulkan)
2024-03-11 15:10:18 +01:00
let i0: i32 = 2;
let i1: i32 = 1;
let i2: i32 = 0;
///else
let i0: i32 = 0;
let i1: i32 = 1;
let i2: i32 = 2;
///end
2024-07-24 20:04:49 +02:00
context_raw.picked_color.base = color_set_rb(context_raw.picked_color.base, buffer_get_u8(a, i0));
context_raw.picked_color.base = color_set_gb(context_raw.picked_color.base, buffer_get_u8(a, i1));
context_raw.picked_color.base = color_set_bb(context_raw.picked_color.base, buffer_get_u8(a, i2));
2024-03-11 15:10:18 +01:00
ui_header_handle.redraws = 2;
});
}
///end
}
///if (is_paint || is_sculpt)
// UV map
if (ui_view2d_type == view_2d_type_t.LAYER && ui_view2d_uvmap_show) {
2025-03-02 19:44:26 +01:00
draw_scaled_image(util_uv_uvmap, tx, ty, tw, th);
2024-03-11 15:10:18 +01:00
}
///end
// Menu
2024-09-03 15:52:05 +02:00
let ew: i32 = math_floor(ui_ELEMENT_W(ui_view2d_ui));
2025-03-02 21:07:17 +01:00
draw_set_color(ui_view2d_ui.ops.theme.SEPARATOR_COL);
2025-03-02 19:44:26 +01:00
draw_filled_rect(0, ui_ELEMENT_H(ui_view2d_ui), ui_view2d_ww, ui_ELEMENT_H(ui_view2d_ui) + ui_ELEMENT_OFFSET(ui_view2d_ui) * 2);
2025-03-02 21:07:17 +01:00
draw_set_color(0xffffffff);
2024-03-11 15:10:18 +01:00
2024-09-03 15:52:05 +02:00
let start_y: f32 = ui_ELEMENT_H(ui_view2d_ui) + ui_ELEMENT_OFFSET(ui_view2d_ui);
2024-03-11 15:10:18 +01:00
ui_view2d_ui._x = 2;
ui_view2d_ui._y = 2 + start_y;
ui_view2d_ui._w = ew;
// Editable layer name
2024-09-03 15:52:05 +02:00
let h: ui_handle_t = ui_handle(__ID__);
2024-03-11 15:10:18 +01:00
///if (is_paint || is_sculpt)
let text: string = ui_view2d_type == view_2d_type_t.NODE ? context_raw.node_preview_name : h.text;
///else
let text: string = h.text;
///end
2025-03-10 20:26:45 +01:00
ui_view2d_ui._w = math_floor(math_min(draw_string_width(ui_view2d_ui.ops.font, ui_view2d_ui.font_size, text) + 15 * ui_SCALE(ui_view2d_ui), 100 * ui_SCALE(ui_view2d_ui)));
2024-03-11 15:10:18 +01:00
if (ui_view2d_type == view_2d_type_t.ASSET) {
let asset: asset_t = context_raw.texture;
if (asset != null) {
2024-03-20 16:13:54 +01:00
let asset_names: string[] = project_asset_names;
let i: i32 = array_index_of(asset_names, asset.name);
2024-03-11 15:10:18 +01:00
h.text = asset.name;
2024-09-03 15:52:05 +02:00
asset.name = ui_text_input(h, "");
2024-03-20 16:13:54 +01:00
asset_names[i] = asset.name;
2024-03-11 15:10:18 +01:00
}
}
else if (ui_view2d_type == view_2d_type_t.NODE) {
///if (is_paint || is_sculpt)
2024-09-03 15:52:05 +02:00
ui_text(context_raw.node_preview_name);
2024-03-11 15:10:18 +01:00
///else
2024-09-03 15:52:05 +02:00
let nodes: ui_nodes_t = ui_nodes_get_nodes();
2024-03-11 15:10:18 +01:00
if (nodes.nodes_selected_id.length > 0) {
2024-09-03 15:52:05 +02:00
ui_text(ui_get_node(ui_nodes_get_canvas(true).nodes, nodes.nodes_selected_id[0]).name);
2024-03-11 15:10:18 +01:00
}
///end
}
///if (is_paint || is_sculpt)
else if (ui_view2d_type == view_2d_type_t.LAYER) {
h.text = l.name;
2024-09-03 15:52:05 +02:00
l.name = ui_text_input(h, "");
2024-03-11 15:10:18 +01:00
ui_view2d_text_input_hover = ui_view2d_ui.is_hovered;
}
else if (ui_view2d_type == view_2d_type_t.FONT) {
h.text = context_raw.font.name;
2024-09-03 15:52:05 +02:00
context_raw.font.name = ui_text_input(h, "");
2024-03-11 15:10:18 +01:00
}
///end
2024-03-20 16:13:54 +01:00
if (h.changed) {
ui_base_hwnds[0].redraws = 2;
}
2024-03-11 15:10:18 +01:00
ui_view2d_ui._x += ui_view2d_ui._w + 3;
ui_view2d_ui._y = 2 + start_y;
ui_view2d_ui._w = ew;
///if (is_paint || is_sculpt)
if (ui_view2d_type == view_2d_type_t.LAYER) {
2024-09-03 15:52:05 +02:00
let h_layer_mode: ui_handle_t = ui_handle(__ID__);
2024-04-24 12:14:47 +02:00
if (h_layer_mode.init) {
h_layer_mode.position = ui_view2d_layer_mode;
}
2024-04-25 22:04:43 +02:00
let layer_mode_combo: string[] = [tr("Visible"), tr("Selected")];
2024-09-03 15:52:05 +02:00
ui_view2d_layer_mode = ui_combo(h_layer_mode, layer_mode_combo, tr("Layers"));
2024-03-11 15:10:18 +01:00
ui_view2d_ui._x += ew + 3;
ui_view2d_ui._y = 2 + start_y;
2024-03-14 15:31:22 +01:00
if (!slot_layer_is_mask(context_raw.layer)) {
2024-09-03 15:52:05 +02:00
let h_tex_type: ui_handle_t = ui_handle(__ID__);
2024-04-24 12:14:47 +02:00
if (h_tex_type.init) {
h_tex_type.position = ui_view2d_tex_type;
}
2024-04-25 22:04:43 +02:00
let tex_type_combo: string[] = [
2024-03-11 15:10:18 +01:00
tr("Base Color"),
tr("Normal Map"),
tr("Occlusion"),
tr("Roughness"),
tr("Metallic"),
tr("Opacity"),
tr("Height"),
2024-04-25 22:04:43 +02:00
];
2024-09-03 15:52:05 +02:00
ui_view2d_tex_type = ui_combo(h_tex_type, tex_type_combo, tr("Texture"));
2024-03-11 15:10:18 +01:00
ui_view2d_ui._x += ew + 3;
ui_view2d_ui._y = 2 + start_y;
}
ui_view2d_ui._w = math_floor(ew * 0.7 + 3);
2024-09-03 15:52:05 +02:00
let h_uvmap_show: ui_handle_t = ui_handle(__ID__);
2024-04-24 12:14:47 +02:00
if (h_uvmap_show.init) {
h_uvmap_show.selected = ui_view2d_uvmap_show;
}
2024-09-03 15:52:05 +02:00
ui_view2d_uvmap_show = ui_check(h_uvmap_show, tr("UV Map"));
2024-03-11 15:10:18 +01:00
ui_view2d_ui._x += ew * 0.7 + 3;
ui_view2d_ui._y = 2 + start_y;
}
///end
2024-09-03 15:52:05 +02:00
let h_tiled_show: ui_handle_t = ui_handle(__ID__);
2024-04-24 12:14:47 +02:00
if (h_tiled_show.init) {
h_tiled_show.selected = ui_view2d_tiled_show;
}
2024-09-03 15:52:05 +02:00
ui_view2d_tiled_show = ui_check(h_tiled_show, tr("Tiled"));
2024-03-11 15:10:18 +01:00
ui_view2d_ui._x += ew * 0.7 + 3;
ui_view2d_ui._y = 2 + start_y;
if (ui_view2d_type == view_2d_type_t.ASSET && tex != null) { // Texture resolution
2024-09-03 15:52:05 +02:00
ui_text(tex.width + "x" + tex.height);
2024-03-11 15:10:18 +01:00
}
// Picked position
///if (is_paint || is_sculpt)
if (context_raw.tool == workspace_tool_t.PICKER && (ui_view2d_type == view_2d_type_t.LAYER || ui_view2d_type == view_2d_type_t.ASSET)) {
2025-06-19 19:55:16 +02:00
let cursor_img: gpu_texture_t = resource_get("cursor.k");
2024-09-03 15:52:05 +02:00
let hsize: f32 = 16 * ui_SCALE(ui_view2d_ui);
2024-03-11 15:10:18 +01:00
let size: f32 = hsize * 2;
2025-03-02 19:44:26 +01:00
draw_scaled_image(cursor_img, tx + tw * context_raw.uvx_picked - hsize, ty + th * context_raw.uvy_picked - hsize, size, size);
2024-03-11 15:10:18 +01:00
}
///end
}
2024-09-03 15:52:05 +02:00
ui_end();
2024-03-11 15:10:18 +01:00
}
function ui_view2d_update() {
2024-09-03 15:52:05 +02:00
let headerh: f32 = ui_ELEMENT_H(ui_view2d_ui) * 1.4;
2024-03-11 15:10:18 +01:00
///if (is_paint || is_sculpt)
context_raw.paint2d = false;
///end
if (!base_ui_enabled ||
!ui_view2d_show ||
mouse_x < ui_view2d_wx ||
mouse_x > ui_view2d_wx + ui_view2d_ww ||
mouse_y < ui_view2d_wy + headerh ||
mouse_y > ui_view2d_wy + ui_view2d_wh) {
if (ui_view2d_controls_down) {
2024-09-03 15:52:05 +02:00
let control: ui_canvas_control_t = ui_nodes_get_canvas_control(ui_view2d_ui, ui_view2d_controls_down);
2024-03-11 15:10:18 +01:00
ui_view2d_controls_down = control.controls_down;
}
return;
}
2024-09-03 15:52:05 +02:00
let control: ui_canvas_control_t = ui_nodes_get_canvas_control(ui_view2d_ui, ui_view2d_controls_down);
2024-03-11 15:10:18 +01:00
ui_view2d_pan_x += control.pan_x;
ui_view2d_pan_y += control.pan_y;
ui_view2d_controls_down = control.controls_down;
2025-01-27 16:04:04 +01:00
if (control.zoom != 0.0) {
2024-03-11 15:10:18 +01:00
let _pan_x: f32 = ui_view2d_pan_x / ui_view2d_pan_scale;
let _pan_y: f32 = ui_view2d_pan_y / ui_view2d_pan_scale;
ui_view2d_pan_scale += control.zoom;
2024-03-20 16:13:54 +01:00
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;
}
2024-03-11 15:10:18 +01:00
ui_view2d_pan_x = _pan_x * ui_view2d_pan_scale;
ui_view2d_pan_y = _pan_y * ui_view2d_pan_scale;
2024-09-03 15:52:05 +02:00
if (ui_touch_scroll) {
2024-03-11 15:10:18 +01:00
// Zoom to finger location
ui_view2d_pan_x -= (ui_view2d_ui.input_x - ui_view2d_ui._window_x - ui_view2d_ui._window_w / 2) * control.zoom;
ui_view2d_pan_y -= (ui_view2d_ui.input_y - ui_view2d_ui._window_y - ui_view2d_ui._window_h / 2) * control.zoom;
}
2025-01-27 16:04:04 +01:00
ui_view2d_grid_redraw = true;
2024-03-11 15:10:18 +01:00
}
///if (is_paint || is_sculpt)
2024-11-09 11:31:18 +01:00
let decal_mask: bool = context_is_decal_mask_paint();
2025-01-16 20:38:03 +01:00
let set_clone_source: bool = context_raw.tool == workspace_tool_t.CLONE &&
operator_shortcut(map_get(config_keymap, "set_clone_source") + "+" + map_get(config_keymap, "action_paint"), shortcut_type_t.DOWN);
let bake: bool = context_raw.tool == workspace_tool_t.BAKE;
2024-03-11 15:10:18 +01:00
if (ui_view2d_type == view_2d_type_t.LAYER &&
!ui_view2d_text_input_hover &&
2025-01-16 20:38:03 +01:00
!bake &&
2024-04-08 17:40:32 +02:00
(operator_shortcut(map_get(config_keymap, "action_paint"), shortcut_type_t.DOWN) ||
operator_shortcut(map_get(config_keymap, "brush_ruler") + "+" + map_get(config_keymap, "action_paint"), shortcut_type_t.DOWN) ||
2024-03-11 15:10:18 +01:00
decal_mask ||
set_clone_source ||
config_raw.brush_live)) {
context_raw.paint2d = true;
}
///end
2024-03-20 16:13:54 +01:00
if (ui_view2d_ui.is_typing) {
return;
}
2024-03-11 15:10:18 +01:00
2024-03-20 16:13:54 +01:00
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;
}
2024-03-11 15:10:18 +01:00
// Limit panning to keep texture in viewport
let border: i32 = 32;
let tw: f32 = ui_view2d_ww * 0.95 * ui_view2d_pan_scale;
let tx: f32 = ui_view2d_ww / 2 - tw / 2 + ui_view2d_pan_x;
2025-03-11 19:49:42 +01:00
let hh: f32 = sys_h();
2024-03-11 15:10:18 +01:00
let ty: f32 = hh / 2 - tw / 2 + ui_view2d_pan_y;
2024-03-20 16:13:54 +01:00
if (tx + border > ui_view2d_ww) {
ui_view2d_pan_x = ui_view2d_ww / 2 + tw / 2 - border;
}
else if (tx - border < -tw) {
ui_view2d_pan_x = -tw / 2 - ui_view2d_ww / 2 + border;
}
if (ty + border > hh) {
ui_view2d_pan_y = hh / 2 + tw / 2 - border;
}
else if (ty - border < -tw) {
ui_view2d_pan_y = -tw / 2 - hh / 2 + border;
}
2024-03-11 15:10:18 +01:00
2024-04-08 17:40:32 +02:00
if (operator_shortcut(map_get(config_keymap, "view_reset"))) {
2024-03-11 15:10:18 +01:00
ui_view2d_pan_x = 0.0;
ui_view2d_pan_y = 0.0;
ui_view2d_pan_scale = 1.0;
}
}