diff --git a/paint/sources/functions.h b/paint/sources/functions.h index 99ec8d1a..0b3004aa 100644 --- a/paint/sources/functions.h +++ b/paint/sources/functions.h @@ -575,6 +575,7 @@ void ui_box_hide(); void tab_meshes_draw(ui_handle_t *htab); void tab_meshes_reset_preview_map(); void util_particle_init_physics(); +void tab_layers_apply_filter(i32 filter); void tab_layers_draw(ui_handle_t *htab); void tab_layers_remap_layer_pointers(ui_node_t_array_t *nodes, i32_imap_t *pointer_map); i32_map_t *tab_layers_init_layer_map(); diff --git a/paint/sources/tab_layers.c b/paint/sources/tab_layers.c index 9227b602..2004a274 100644 --- a/paint/sources/tab_layers.c +++ b/paint/sources/tab_layers.c @@ -1131,6 +1131,41 @@ void tab_layers_button_new(char *text) { } } +void tab_layers_apply_filter(i32 filter) { + g_context->layer_filter = filter; + char *filter_name = NULL; + if (filter > 0 && filter <= project_paint_objects->length) { + filter_name = project_paint_objects->buffer[filter - 1]->base->name; + } + else if (filter > project_paint_objects->length) { + string_array_t *atlases = project_get_used_atlases(); + if (atlases != NULL) { + filter_name = atlases->buffer[filter - project_paint_objects->length - 1]; + } + } + for (i32 i = 0; i < project_paint_objects->length; ++i) { + mesh_object_t *p = project_paint_objects->buffer[i]; + p->base->visible = filter == 0 || (filter_name != NULL && string_equals(p->base->name, filter_name)) || project_is_atlas_object(p); + } + if (filter == 0 && g_context->merged_object_is_atlas) { + util_mesh_merge(NULL); + } + else if (filter > project_paint_objects->length) { + mesh_object_t_array_t *visibles = any_array_create_from_raw((void *[]){}, 0); + for (i32 i = 0; i < project_paint_objects->length; ++i) { + mesh_object_t *p = project_paint_objects->buffer[i]; + if (p->base->visible) { + any_array_push(visibles, p); + } + } + util_mesh_merge(visibles); + } + layers_set_object_mask(); + util_uv_uvmap_cached = false; + g_context->ddirty = 2; + render_path_raytrace_ready = false; +} + void tab_layers_combo_filter() { string_array_t *ar = any_array_create_from_raw( (void *[]){ @@ -1152,28 +1187,7 @@ void tab_layers_combo_filter() { filter_handle->i = g_context->layer_filter; g_context->layer_filter = ui_combo(filter_handle, ar, tr("Filter"), false, UI_ALIGN_LEFT, true); if (filter_handle->changed) { - for (i32 i = 0; i < project_paint_objects->length; ++i) { - mesh_object_t *p = project_paint_objects->buffer[i]; - char *filter_name = ar->buffer[g_context->layer_filter]; - p->base->visible = g_context->layer_filter == 0 || string_equals(p->base->name, filter_name) || project_is_atlas_object(p); - } - if (g_context->layer_filter == 0 && g_context->merged_object_is_atlas) { // All - util_mesh_merge(NULL); - } - else if (g_context->layer_filter > project_paint_objects->length) { // Atlas - mesh_object_t_array_t *visibles = any_array_create_from_raw((void *[]){}, 0); - for (i32 i = 0; i < project_paint_objects->length; ++i) { - mesh_object_t *p = project_paint_objects->buffer[i]; - if (p->base->visible) { - any_array_push(visibles, p); - } - } - util_mesh_merge(visibles); - } - layers_set_object_mask(); - util_uv_uvmap_cached = false; - g_context->ddirty = 2; - render_path_raytrace_ready = false; + tab_layers_apply_filter(g_context->layer_filter); } } diff --git a/paint/sources/tab_meshes.c b/paint/sources/tab_meshes.c index baf7e763..78a82609 100644 --- a/paint/sources/tab_meshes.c +++ b/paint/sources/tab_meshes.c @@ -608,6 +608,15 @@ void tab_meshes_draw(ui_handle_t *htab) { if (state == UI_STATE_STARTED && ui->input_y > ui->_window_y) { g_context->paint_object = o; } + // Double click to show only this mesh + if (state == UI_STATE_RELEASED && ui->input_y > ui->_window_y) { + if (sys_time() - g_context->select_time < 0.2) { + tab_layers_apply_filter(i + 1); + } + if (sys_time() - g_context->select_time > 0.2) { + g_context->select_time = sys_time(); + } + } // Context menu if (ui->is_hovered && ui->input_released_r) {