diff --git a/paint/sources/base.c b/paint/sources/base.c index ff35936a..3123088e 100644 --- a/paint/sources/base.c +++ b/paint/sources/base.c @@ -170,6 +170,18 @@ gpu_texture_t *base_get_drag_image() { if (base_drag_layer != NULL) { return base_drag_layer->fill_material != NULL ? base_drag_layer->fill_material->image_icon : base_drag_layer->texpaint_preview; } + if (base_drag_mesh != NULL) { + gpu_texture_t *preview = tab_meshes_preview_map != NULL ? any_map_get(tab_meshes_preview_map, i32_to_string(base_drag_mesh->base->uid)) : NULL; + if (preview != NULL) { + return preview; + } + gpu_texture_t *icons = resource_get("icons.k"); + gc_unroot(base_drag_rect); + base_drag_rect = resource_tile50(icons, ICON_CUBE); + gc_root(base_drag_rect); + base_drag_tint = g_theme->BUTTON_COL; + return icons; + } return NULL; } @@ -201,7 +213,7 @@ void base_update(void *_) { } bool has_drag = base_drag_asset != NULL || base_drag_material != NULL || base_drag_layer != NULL || base_drag_file != NULL || base_drag_swatch != NULL || - base_drag_brush != NULL || base_drag_font != NULL; + base_drag_brush != NULL || base_drag_font != NULL || base_drag_mesh != NULL; if (g_config->touch_ui) { // Touch and hold to activate dragging @@ -232,6 +244,8 @@ void base_update(void *_) { base_drag_material = NULL; gc_unroot(base_drag_layer); base_drag_layer = NULL; + gc_unroot(base_drag_mesh); + base_drag_mesh = NULL; gc_unroot(base_drag_brush); base_drag_brush = NULL; gc_unroot(base_drag_font); @@ -320,6 +334,13 @@ void base_update(void *_) { gc_unroot(base_drag_layer); base_drag_layer = NULL; } + else if (base_drag_mesh != NULL) { + if (context_in_meshes() && base_is_dragging) { + tab_meshes_accept_mesh_drop(base_drag_mesh); + } + gc_unroot(base_drag_mesh); + base_drag_mesh = NULL; + } else if (base_drag_brush != NULL) { if (context_in_brushes()) { tab_brushes_accept_brush_drop(base_drag_brush); @@ -349,7 +370,7 @@ void base_update(void *_) { g_context->ddirty = 0; } - if (g_context->tool == TOOL_TYPE_CURSOR) { + if (g_context->tool == TOOL_TYPE_CURSOR && context_in_3d_view()) { if (keyboard_down("control") && keyboard_started("d")) { sim_duplicate(); } @@ -904,7 +925,7 @@ void base_update_workspace() { ui_base_htabs->buffer[TAB_AREA_SIDEBAR0]->i = 2; // Script g_config->layout_tabs->buffer[TAB_AREA_SIDEBAR0] = 2; - g_config->layout->buffer[LAYOUT_SIZE_STATUS_H] = iron_window_height() * 0.3; + g_config->layout->buffer[LAYOUT_SIZE_STATUS_H] = iron_window_height() * 0.2; g_config->layout->buffer[LAYOUT_SIZE_SIDEBAR_W] = iron_window_width() * 0.52; float h = UI_ELEMENT_H() + UI_ELEMENT_OFFSET() + 2; h += UI_ELEMENT_H() * 3.5; // Small material panel diff --git a/paint/sources/context.c b/paint/sources/context.c index 9332d265..41a260d6 100644 --- a/paint/sources/context.c +++ b/paint/sources/context.c @@ -362,6 +362,11 @@ bool context_in_materials() { return string_equals(tab, tr("Materials")); } +bool context_in_meshes() { + char *tab = ui_hovered_tab_name(); + return string_equals(tab, tr("Meshes")); +} + bool context_in_swatches() { char *tab = ui_hovered_tab_name(); return string_equals(tab, tr("Swatches")); diff --git a/paint/sources/functions.h b/paint/sources/functions.h index e642d357..d9775f9a 100644 --- a/paint/sources/functions.h +++ b/paint/sources/functions.h @@ -242,6 +242,7 @@ bool context_in_3d_view(); bool context_in_paint_area(); bool context_in_layers(); bool context_in_materials(); +bool context_in_meshes(); bool context_in_2d_view(view_2d_type_t type); bool context_in_nodes(); bool context_in_swatches(); @@ -338,6 +339,8 @@ void import_mesh_run(char *path, bool _clear_layers, bool r void import_mesh_finish_import(void *_); void import_mesh_make_mesh(raw_mesh_t *mesh); void import_mesh_add_mesh(raw_mesh_t *mesh); +bool _import_mesh_is_unique_name(char *s); +char *_import_mesh_number_ext(i32 i); mesh_data_t *import_mesh_raw_mesh(raw_mesh_t *mesh); void ui_menubar_init(); i32 ui_menu_top_y(); @@ -665,8 +668,11 @@ void ui_box_show_custom(void (*commands)(void), i32 mw, void ui_box_hide(); void tab_meshes_draw(ui_handle_t *htab); void tab_meshes_reset_preview_map(); +void tab_meshes_accept_mesh_drop(mesh_object_t *mesh); void tab_meshes_set_override(mesh_object_t *o, i32 mat_index); i32 tab_meshes_get_override(mesh_object_t *o); +void tab_meshes_on_material_deleted(i32 deleted_index); +void tab_meshes_on_material_reordered(i32 old_index, i32 new_index); void util_particle_init_physics(); void util_particle_update(); void tab_layers_apply_filter(i32 filter); diff --git a/paint/sources/globals.h b/paint/sources/globals.h index 1340be3d..c5ac2bf9 100644 --- a/paint/sources/globals.h +++ b/paint/sources/globals.h @@ -135,6 +135,7 @@ slot_material_t *base_drag_material = NULL; slot_layer_t *base_drag_layer = NULL; slot_brush_t *base_drag_brush = NULL; slot_font_t *base_drag_font = NULL; +mesh_object_t *base_drag_mesh = NULL; bool base_player_lock = false; bool ui_base_show = true;