Node previews

This commit is contained in:
luboslenco
2025-09-29 20:49:04 +02:00
parent 359ed14ad0
commit ad704b27b9
5 changed files with 89 additions and 75 deletions
+2 -38
View File
@@ -4,21 +4,16 @@ type context_t = {
paint_object?: mesh_object_t;
merged_object?: mesh_object_t;
merged_object_is_atlas?: bool;
ddirty?: i32;
pdirty?: i32;
rdirty?: i32;
brush_blend_dirty?: bool;
node_preview_socket?: i32;
split_view?: bool;
view_index?: i32;
view_index_last?: i32;
swatch?: swatch_color_t;
picked_color?: swatch_color_t;
color_picker_callback?: (sc: swatch_color_t)=>void;
default_irradiance?: f32_array_t;
default_radiance?: gpu_texture_t;
default_radiance_mipmaps?: gpu_texture_t[];
@@ -34,24 +29,20 @@ type context_t = {
light_angle?: f32;
cull_backfaces?: bool;
texture_filter?: bool;
format_type?: texture_ldr_format_t;
format_quality?: f32;
layers_destination?: export_destination_t;
split_by?: split_type_t;
parse_transform?: bool;
parse_vcols?: bool;
select_time?: f32;
viewport_mode?: viewport_mode_t;
render_mode?: render_mode_t;
viewport_shader?: any; // JSValue * -> (ns: node_shader_t)=>void;
hscale_was_changed?: bool;
export_mesh_format?: mesh_format_t;
export_mesh_index?: i32;
pack_assets_on_export?: bool;
paint_vec?: vec4_t;
last_paint_x?: f32;
last_paint_y?: f32;
@@ -62,19 +53,16 @@ type context_t = {
clone_start_y?: f32;
clone_delta_x?: f32;
clone_delta_y?: f32;
show_compass?: bool;
project_type?: i32;
project_aspect_ratio?: i32;
project_objects?: mesh_object_t[];
last_paint_vec_x?: f32;
last_paint_vec_y?: f32;
prev_paint_vec_x?: f32;
prev_paint_vec_y?: f32;
frame?: i32;
paint2d_view?: bool;
brush_locked?: bool;
camera_type?: camera_type_t;
cam_handle?: ui_handle_t;
@@ -87,16 +75,14 @@ type context_t = {
last_status_position?: i32;
camera_controls?: camera_controls_t;
pen_painting_only?: bool;
material?: slot_material_t;
layer?: slot_layer_t;
brush?: slot_brush_t;
font?: slot_font_t;
tool?: tool_type_t;
layer_preview_dirty?: bool;
layers_preview_dirty?: bool;
node_preview_dirty?: bool;
node_preview_socket?: i32;
node_preview_map?: map_t<ui_node_t, gpu_texture_t>;
node_preview_name?: string;
node_previews?: map_t<string, gpu_texture_t>;
@@ -104,11 +90,9 @@ type context_t = {
selected_node_preview: bool;
mask_preview_rgba32?: gpu_texture_t;
mask_preview_last?: slot_layer_t;
colorid_picked?: bool;
material_preview?: bool;
saved_camera?: mat4_t;
color_picker_previous_tool?: tool_type_t;
materialid_picked?: i32;
uvx_picked?: f32;
@@ -122,32 +106,25 @@ type context_t = {
norx_picked?: f32;
nory_picked?: f32;
norz_picked?: f32;
draw_wireframe?: bool;
wireframe_handle?: ui_handle_t;
draw_texels?: bool;
texels_handle?: ui_handle_t;
colorid_handle?: ui_handle_t;
layers_export?: export_mode_t;
decal_image?: gpu_texture_t;
decal_preview?: bool;
decal_x?: f32;
decal_y?: f32;
// cache_draws?: bool;
write_icon_on_export?: bool;
text_tool_image?: gpu_texture_t;
text_tool_text?: string;
particle_material?: material_data_t;
layer_filter?: i32;
brush_output_node_inst?: brush_output_node_t;
run_brush?: (self: any, i: i32)=>void;
parse_brush_inputs?: (self: any)=>void;
gizmo?: object_t;
gizmo_translate_x?: object_t;
gizmo_translate_y?: object_t;
@@ -171,7 +148,6 @@ type context_t = {
rotate_x?: bool;
rotate_y?: bool;
rotate_z?: bool;
brush_nodes_radius?: f32;
brush_nodes_opacity?: f32;
brush_mask_image?: gpu_texture_t;
@@ -188,7 +164,6 @@ type context_t = {
brush_nodes_angle?: f32;
brush_nodes_hardness?: f32;
brush_directional?: bool;
brush_radius?: f32;
brush_radius_handle?: ui_handle_t;
brush_scale_x?: f32;
@@ -220,31 +195,24 @@ type context_t = {
bake_curv_offset?: f32;
bake_curv_smooth?: i32;
bake_high_poly?: i32;
xray?: bool;
sym_x?: bool;
sym_y?: bool;
sym_z?: bool;
fill_type_handle?: ui_handle_t;
paint2d?: bool;
maximized_sidebar_width?: i32;
drag_dest?: i32;
coords?: vec4_t;
start_x?: f32;
start_y?: f32;
lock_begin?: bool;
lock_x?: bool;
lock_y?: bool;
lock_start_x?: f32;
lock_start_y?: f32;
registered?: bool;
selected_object?: object_t;
particle_hit_x?: f32;
particle_hit_y?: f32;
particle_hit_z?: f32;
@@ -264,7 +232,6 @@ function context_create(): context_t {
c.pdirty = 0; // paint
c.rdirty = 0; // render
c.brush_blend_dirty = true;
c.node_preview_socket = 0;
c.split_view = false;
c.view_index = -1;
c.view_index_last = -1;
@@ -322,10 +289,9 @@ function context_create(): context_t {
c.last_status_position = 0;
c.camera_controls = camera_controls_t.ORBIT;
c.pen_painting_only = false; // Reject painting with finger when using pen
c.layer_preview_dirty = true;
c.layers_preview_dirty = false;
c.node_preview_dirty = false;
c.node_preview_socket = 0;
c.node_preview_name = "";
c.node_preview_map = map_create();
c.selected_node_preview = true;
@@ -389,7 +355,6 @@ function context_create(): context_t {
c.brush_nodes_angle = 0.0;
c.brush_nodes_hardness = 1.0;
c.brush_directional = false;
c.brush_radius_handle = ui_handle_create();
c.brush_scale_x = 1.0;
c.brush_decal_mask_radius = 0.5;
@@ -431,7 +396,6 @@ function context_create(): context_t {
c.paint2d = false;
c.maximized_sidebar_width = 0;
c.drag_dest = 0;
return c;
}
+64 -37
View File
@@ -51,11 +51,13 @@ let _ui_nodes_hval3: ui_handle_t = ui_handle_create();
let _ui_nodes_on_canvas_released_selected: ui_node_t;
let _ui_nodes_node_search_first: bool;
let _ui_nodes_node_search_done: ()=>void;
let ui_nodes_node_changed: ui_node_t = null;
function ui_viewnodes_init() {
ui_nodes_preview_image = ui_nodes_get_node_preview_image;
ui_nodes_on_link_drag = ui_viewnodes_on_link_drag;
ui_nodes_on_node_remove = ui_viewnodes_on_node_remove;
ui_nodes_on_node_changed = ui_viewnodes_on_node_changed;
ui_nodes_on_socket_released = ui_viewnodes_on_socket_released;
ui_nodes_on_canvas_released = ui_viewnodes_on_canvas_released;
ui_nodes_on_canvas_control = ui_viewnodes_on_canvas_control;
@@ -71,6 +73,10 @@ function ui_viewnodes_on_node_remove(n: ui_node_t) {
}
}
function ui_viewnodes_on_node_changed(n: ui_node_t) {
ui_nodes_node_changed = n;
}
function ui_viewnodes_on_link_drag(link_drag_id: i32, is_new_link: bool) {
if (!is_new_link) {
return;
@@ -133,7 +139,7 @@ function ui_viewnodes_on_link_drag(link_drag_id: i32, is_new_link: bool) {
// Selecting which node socket to preview
else if (ui_nodes.nodes_selected_id.length > 0 && node.id == ui_nodes.nodes_selected_id[0]) {
context_raw.node_preview_socket = link_drag.from_id > -1 ? link_drag.from_socket : 0;
context_raw.node_preview_dirty = true;
ui_nodes_node_changed = node;
}
}
@@ -254,7 +260,7 @@ function ui_viewnodes_on_socket_released(socket_id: i32) {
let i: i32 = array_index_of(node.outputs, socket);
if (i > -1) {
context_raw.node_preview_socket = i;
context_raw.node_preview_dirty = true;
ui_nodes_node_changed = node;
}
}
}
@@ -777,28 +783,33 @@ function ui_nodes_recompile() {
}
ui_base_hwnds[tab_area_t.SIDEBAR0].redraws = 2;
context_raw.node_preview_dirty = true;
ui_nodes_recompile_mat_final = false;
}
}
function ui_nodes_get_linked_nodes(linked_nodes: ui_node_t[], n: ui_node_t, c: ui_node_canvas_t) {
if (array_index_of(linked_nodes, n) == -1 && (n.flags & _ui_node_flag_t.PREVIEW)) {
array_push(linked_nodes, n);
}
for (let i: i32 = 0; i < c.links.length; ++i) {
let l: ui_node_link_t = c.links[i];
if (l.from_id == n.id) {
let nn: ui_node_t = ui_get_node(c.nodes, l.to_id);
ui_nodes_get_linked_nodes(linked_nodes, nn, c);
}
}
}
function ui_nodes_render() {
ui_nodes_recompile();
// Node preview
let nodes: ui_nodes_t = ui_nodes_get_nodes();
if (nodes.nodes_selected_id.length > 0 && nodes.nodes_selected_id[0] != ui_nodes_last_node_selected_id) {
ui_nodes_last_node_selected_id = nodes.nodes_selected_id[0];
context_raw.node_preview_dirty = true;
context_raw.node_preview_socket = 0;
}
let ui_nodes: ui_nodes_t = ui_nodes_get_nodes();
// Remove dragged link when mouse is released out of the node viewport
let c: ui_node_canvas_t = ui_nodes_get_canvas(true);
if (ui_nodes_release_link && nodes.link_drag_id != -1) {
array_remove(c.links, ui_get_link(c.links, nodes.link_drag_id));
nodes.link_drag_id = -1;
if (ui_nodes_release_link && ui_nodes.link_drag_id != -1) {
array_remove(c.links, ui_get_link(c.links, ui_nodes.link_drag_id));
ui_nodes.link_drag_id = -1;
}
ui_nodes_release_link = ui.input_released;
@@ -808,7 +819,6 @@ function ui_nodes_render() {
ui.input_enabled = base_ui_enabled;
let ui_nodes: ui_nodes_t = ui_nodes_get_nodes();
if (ui_nodes_last_zoom != ui_nodes.zoom) {
ui_nodes_last_zoom = ui_nodes.zoom;
ui_nodes_grid_redraw = true;
@@ -822,8 +832,34 @@ function ui_nodes_render() {
ui_nodes_grid_redraw = false;
}
if (context_raw.selected_node_preview && context_raw.node_preview_dirty) {
ui_nodes_make_node_preview();
// Selected node preview
if (ui_nodes.nodes_selected_id.length > 0 && ui_nodes.nodes_selected_id[0] != ui_nodes_last_node_selected_id) {
ui_nodes_last_node_selected_id = ui_nodes.nodes_selected_id[0];
let sel: ui_node_t = ui_get_node(c.nodes, ui_nodes.nodes_selected_id[0]);
context_raw.node_preview_socket = 0;
ui_nodes_make_node_preview(sel);
}
else if (ui_nodes.nodes_selected_id.length == 0) {
ui_nodes_last_node_selected_id = -1;
}
// Update node previews
if (ui_nodes_node_changed != null && !ui.input_down) {
let linked_nodes: ui_node_t[] = [];
ui_nodes_get_linked_nodes(linked_nodes, ui_nodes_node_changed, c);
let sel: ui_node_t = ui_nodes.nodes_selected_id.length > 0 ? ui_get_node(c.nodes, ui_nodes.nodes_selected_id[0]) : null;
if (sel != null && array_index_of(linked_nodes, sel) == -1) {
array_push(linked_nodes, sel);
}
let _node_preview_socket: i32 = context_raw.node_preview_socket;
for (let i: i32 = 0; i < linked_nodes.length; ++i) {
context_raw.node_preview_socket = linked_nodes[i] == sel ? _node_preview_socket : 0;
ui_nodes_make_node_preview(linked_nodes[i]);
}
context_raw.node_preview_socket = _node_preview_socket;
ui_nodes_node_changed = null;
}
// Start with UI
@@ -886,7 +922,7 @@ function ui_nodes_render() {
// Grid
draw_set_color(0xffffffff);
let step: f32 = ui_nodes_grid_cell_w * nodes.zoom;
let step: f32 = ui_nodes_grid_cell_w * ui_nodes.zoom;
let x: f32 = math_fmod(UI_NODES_PAN_X(), step) - step;
let y: f32 = math_fmod(UI_NODES_PAN_Y(), step) - step;
draw_image(ui_nodes_grid, x, y);
@@ -905,13 +941,13 @@ function ui_nodes_render() {
ui.window_border_top = ui_header_h * 2;
ui.window_border_bottom = config_raw.layout[layout_size_t.STATUS_H];
ui_node_canvas(nodes, c);
ui_node_canvas(ui_nodes, c);
ui.input_enabled = _input_enabled;
if (nodes.color_picker_callback != null) {
if (ui_nodes.color_picker_callback != null) {
context_raw.color_picker_previous_tool = context_raw.tool;
context_select_tool(tool_type_t.PICKER);
_ui_nodes_render_tmp = nodes.color_picker_callback;
_ui_nodes_render_tmp = ui_nodes.color_picker_callback;
context_raw.color_picker_callback = function (color: swatch_color_t) {
_ui_nodes_render_tmp(color.base);
@@ -922,7 +958,7 @@ function ui_nodes_render() {
ui_nodes_canvas_changed();
}
};
nodes.color_picker_callback = null;
ui_nodes.color_picker_callback = null;
}
// Remove nodes with unknown id for this canvas type
@@ -954,7 +990,7 @@ function ui_nodes_render() {
}
if (!found) {
ui_remove_node(canvas_node, c);
array_remove(nodes.nodes_selected_id, canvas_node.id);
array_remove(ui_nodes.nodes_selected_id, canvas_node.id);
i--;
}
}
@@ -978,8 +1014,8 @@ function ui_nodes_render() {
ui_nodes_uichanged_last = ui.changed;
// Node previews
if (context_raw.selected_node_preview && nodes.nodes_selected_id.length > 0) {
let sel: ui_node_t = ui_get_node(c.nodes, nodes.nodes_selected_id[0]);
if (context_raw.selected_node_preview && ui_nodes.nodes_selected_id.length > 0) {
let sel: ui_node_t = ui_get_node(c.nodes, ui_nodes.nodes_selected_id[0]);
let img: gpu_texture_t = ui_nodes_get_node_preview_image(sel);
if (img != null && !(sel.flags & _ui_node_flag_t.PREVIEW)) {
let tw: f32 = 128 * UI_SCALE();
@@ -1417,6 +1453,7 @@ function ui_nodes_make_node(n: ui_node_t, nodes: ui_nodes_t, canvas: ui_node_can
array_push(node.buttons, but);
}
ui_nodes_node_changed = node;
return node;
}
@@ -1459,17 +1496,7 @@ function ui_nodes_make_group_node(group_canvas: ui_node_canvas_t, nodes: ui_node
return node;
}
function ui_nodes_make_node_preview() {
let ui_nodes: ui_nodes_t = ui_nodes_get_nodes();
if (ui_nodes.nodes_selected_id.length == 0) {
return;
}
let nodes: ui_node_t[] = ui_nodes_get_canvas().nodes;
let node: ui_node_t = ui_get_node(nodes, ui_nodes.nodes_selected_id[0]);
if (node == null) {
return;
}
function ui_nodes_make_node_preview(node: ui_node_t) {
context_raw.node_preview_name = node.name;
if (node.type == "LAYER" ||
@@ -1479,6 +1506,7 @@ function ui_nodes_make_node_preview() {
return;
}
let nodes: ui_node_t[] = ui_nodes_get_canvas().nodes;
if (array_index_of(nodes, node) == -1) {
return;
}
@@ -1489,7 +1517,6 @@ function ui_nodes_make_node_preview() {
map_set(context_raw.node_preview_map, node, img);
}
context_raw.node_preview_dirty = false;
ui_nodes_hwnd.redraws = 2;
util_render_make_node_preview(ui_nodes_get_canvas(), node, img);
}