From 2d140020b96803f5effa9dcc630887c98fb47804 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Fri, 5 Jun 2026 18:55:53 +0200 Subject: [PATCH] paint: cleanup --- paint/sources/base.c | 24 +- paint/sources/globals.h | 255 +++++++++--------- paint/sources/io/export_arm.c | 6 +- paint/sources/io/export_texture.c | 21 +- paint/sources/io/import_arm.c | 16 +- paint/sources/io/import_asset.c | 2 +- paint/sources/io/import_mesh.c | 4 +- paint/sources/io/import_texture.c | 3 +- paint/sources/main.c | 9 +- paint/sources/nodes_brush/brush_output_node.c | 16 +- paint/sources/project.c | 39 +-- paint/sources/types.h | 7 +- paint/sources/ui/box_export.c | 20 +- paint/sources/ui/tab_layers.c | 9 +- paint/sources/ui/tab_textures.c | 5 - paint/sources/ui/ui_header.c | 4 +- paint/sources/ui/ui_view2d.c | 7 +- 17 files changed, 208 insertions(+), 239 deletions(-) diff --git a/paint/sources/base.c b/paint/sources/base.c index 1f92a661..8e160af7 100644 --- a/paint/sources/base.c +++ b/paint/sources/base.c @@ -2009,8 +2009,12 @@ void base_resize() { string_array_t *base_combo_enum_texts(char *node_type) { if (string_equals(node_type, "TEX_IMAGE")) { - if (project_asset_names->length > 0) { - return project_asset_names; + if (project_assets->length > 0) { + string_array_t *asset_names = any_array_create_from_raw((void *[]){}, 0); + for (i32 i = 0; i < project_assets->length; ++i) { + any_array_push(asset_names, project_assets->buffer[i]->name); + } + return asset_names; } else { string_array_t *empty = any_array_create_from_raw( @@ -2041,8 +2045,12 @@ string_array_t *base_combo_enum_texts(char *node_type) { } if (string_equals(node_type, "image_texture_node")) { - if (project_asset_names->length > 0) { - return project_asset_names; + if (project_assets->length > 0) { + string_array_t *asset_names = any_array_create_from_raw((void *[]){}, 0); + for (i32 i = 0; i < project_assets->length; ++i) { + any_array_push(asset_names, project_assets->buffer[i]->name); + } + return asset_names; } else { string_array_t *empty = any_array_create_from_raw( @@ -2100,8 +2108,12 @@ any_array_t *base_combo_enum_images(char *node_type) { } i32 base_get_asset_index(char *file_name) { - i32 i = string_array_index_of(project_asset_names, file_name); - return i >= 0 ? i : 0; + for (i32 i = 0; i < project_assets->length; ++i) { + if (string_equals(project_assets->buffer[i]->name, file_name)) { + return i; + } + } + return 0; } void base_toggle_fullscreen() { diff --git a/paint/sources/globals.h b/paint/sources/globals.h index 8f1a94a5..30437cb8 100644 --- a/paint/sources/globals.h +++ b/paint/sources/globals.h @@ -13,6 +13,11 @@ char *manifest_url = "https://armorpaint.org"; char *manifest_url_android = "https://play.google.com/store/apps/details?id=org.armorpaint"; char *manifest_url_ios = "https://apps.apple.com/app/armorpaint/id1533967534"; +context_t *g_context; +project_t *g_project; +config_t *g_config; +ui_t *ui; + any_map_t *ui_children; any_map_t *ui_nodes_custom_buttons; gpu_texture_t *lut_image = NULL; @@ -24,7 +29,6 @@ gpu_texture_t *layers_expc = NULL; f32 layers_default_base = 0.5; f32 layers_default_rough = 0.4; any_map_t *operator_ops; -config_t *g_config = NULL; any_map_t *config_keymap; ui_align_t config_button_align = UI_ALIGN_LEFT; char *config_button_spacing = " "; @@ -103,41 +107,40 @@ char *ui_files_default_path = "/Users"; char *ui_files_default_path = "/"; #endif -char *ui_files_filename; -char *ui_files_path; -char *ui_files_last_path = ""; -bool base_ui_enabled = true; -bool base_view3d_show = true; -bool base_is_dragging = false; -bool base_is_resizing = false; -asset_t *base_drag_asset = NULL; -swatch_color_t *base_drag_swatch = NULL; -char *base_drag_file = NULL; -gpu_texture_t *base_drag_file_icon = NULL; -f32 base_drag_off_x = 0.0; -f32 base_drag_off_y = 0.0; -draw_font_t *base_font = NULL; -ui_theme_t *base_theme; -i32 base_default_element_w = 100; -i32 base_default_element_h = 28; -i32 base_default_font_size = 13; -ui_handle_t *base_res_handle; -ui_handle_t *base_res_x_handle; -ui_handle_t *base_res_y_handle; -ui_handle_t *base_bits_handle; -string_array_t *base_drop_paths; -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; -bool base_player_lock = false; -ui_t *ui; +char *ui_files_filename; +char *ui_files_path; +char *ui_files_last_path = ""; +bool base_ui_enabled = true; +bool base_view3d_show = true; +bool base_is_dragging = false; +bool base_is_resizing = false; +asset_t *base_drag_asset = NULL; +swatch_color_t *base_drag_swatch = NULL; +char *base_drag_file = NULL; +gpu_texture_t *base_drag_file_icon = NULL; +f32 base_drag_off_x = 0.0; +f32 base_drag_off_y = 0.0; +draw_font_t *base_font = NULL; +ui_theme_t *base_theme; +i32 base_default_element_w = 100; +i32 base_default_element_h = 28; +i32 base_default_font_size = 13; +ui_handle_t *base_res_handle; +ui_handle_t *base_res_x_handle; +ui_handle_t *base_res_y_handle; +ui_handle_t *base_bits_handle; +string_array_t *base_drop_paths; +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; +bool base_player_lock = false; + bool ui_base_show = true; i32 ui_base_viewport_col; ui_handle_t_array_t *ui_base_hwnds; ui_handle_t_array_t *ui_base_htabs; tab_draw_array_t_array_t *ui_base_hwnd_tabs; -context_t *g_context; i32 ui_toolbar_default_w = 36; ui_handle_t *ui_toolbar_handle; string_array_t *ui_toolbar_tool_names; @@ -171,22 +174,16 @@ bool ui_menu_show_first = true; i32 render_path_base_bloom_current_mip = 0; f32 render_path_base_bloom_sample_scale; bool render_path_base_buf_swapped = false; -project_t *g_project; -char *project_filepath = ""; +char *project_filepath = ""; asset_t_array_t *project_assets; -string_array_t *project_asset_names; i32 project_asset_id = 0; -string_array_t *project_mesh_assets; node_group_t_array_t *project_material_groups; mesh_object_t_array_t *project_paint_objects = NULL; -any_imap_t *project_asset_map; // gpu_texture_t | font_t string_array_t *project_mesh_list = NULL; slot_material_t_array_t *project_materials; slot_brush_t_array_t *project_brushes; slot_layer_t_array_t *project_layers; slot_font_t_array_t *project_fonts; -i32_array_t *project_atlas_objects = NULL; -string_array_t *project_atlas_names = NULL; gpu_pipeline_t *ui_view2d_pipe; i32 ui_view2d_channel_loc; view_2d_type_t ui_view2d_type = VIEW_2D_TYPE_LAYER; @@ -300,6 +297,98 @@ ui_node_t_array_t *nodes_material_neural; ui_node_t_array_t *nodes_material_group; node_list_t_array_t *nodes_material_list = NULL; i32 make_mesh_layer_pass_count = 1; + +i32 ui_sidebar_default_w_mini = 56; +i32 ui_sidebar_default_w_full = 280; +i32 ui_sidebar_default_w; +ui_handle_t *ui_sidebar_hminimized; +i32 ui_sidebar_w_mini; +char *console_message = ""; +f32 console_message_timer = 0.0; +i32 console_message_color = 0x00000000; +string_array_t *console_last_traces; +vec4_t camera_origins[2]; +mat4_t camera_views[2]; +ui_handle_t *box_preferences_htab; +string_array_t *box_preferences_files_plugin = NULL; +ui_handle_t *box_preferences_h_theme; +ui_handle_t *box_preferences_h_preset; +slot_layer_t *render_path_paint_live_layer = NULL; +i32 render_path_paint_live_layer_drawn = 0; +bool render_path_paint_live_layer_locked = false; +bool render_path_paint_push_undo_last; +bool ui_box_show = false; +ui_handle_t *ui_box_hwnd; +bool ui_box_click_to_hide = true; +i32 ui_box_modalw = 400; +i32 ui_box_modalh = 170; +ui_handle_t *tab_layers_layer_name_handle; +gpu_texture_t *util_uv_uvmap = NULL; +bool util_uv_uvmap_cached = false; +gpu_texture_t *util_uv_trianglemap = NULL; +bool util_uv_trianglemap_cached = false; +gpu_texture_t *util_uv_dilatemap = NULL; +bool util_uv_dilatemap_cached = false; +gpu_texture_t *util_uv_uvislandmap = NULL; +bool util_uv_uvislandmap_cached = false; +i32 render_path_raytrace_frame = 0; +bool render_path_raytrace_ready = false; +bool render_path_raytrace_init_shader = true; +f32_array_t *render_path_raytrace_f32a; +mat4_t render_path_raytrace_help_mat; +gpu_texture_t *render_path_raytrace_last_envmap = NULL; +bool render_path_raytrace_is_bake = false; + +#ifdef IRON_DIRECT3D12 +char *render_path_raytrace_ext = ".cso"; +#elif defined(IRON_METAL) +char *render_path_raytrace_ext = ".metal"; +#else +char *render_path_raytrace_ext = ".spirv"; +#endif + +bool sculpt_push_undo = false; +i32 ui_statusbar_default_h = 33; +char *parser_material_bake_passthrough_strength = "0.0"; +char *parser_material_bake_passthrough_radius = "0.0"; +char *parser_material_bake_passthrough_offset = "0.0"; + +any_imap_t *neural_node_results; +ui_node_t *neural_node_current; +i32 neural_node_downloading = 0; +neural_node_model_t_array_t *neural_node_models = NULL; + +char *str_hue_sat = "\ +fun hsv_to_rgb(c: float3): float3 { \ + var K: float4 = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \ + var p: float3 = abs3(frac3(c.xxx + K.xyz) * 6.0 - K.www); \ + return lerp3(K.xxx, clamp3(p - K.xxx, float3(0.0, 0.0, 0.0), float3(1.0, 1.0, 1.0)), c.y) * c.z; \ +} \ +fun rgb_to_hsv(c: float3): float3 { \ + var K: float4 = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); \ + var p: float4 = lerp4(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); \ + var q: float4 = lerp4(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); \ + var d: float = q.x - min(q.w, q.y); \ + var e: float = 0.0000000001; \ + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); \ +} \ +fun hue_sat(col: float3, shift: float4): float3 { \ + var hsv: float3 = rgb_to_hsv(col); \ + hsv.x += shift.x; \ + hsv.y *= shift.y; \ + hsv.z *= shift.z; \ + return lerp3(hsv_to_rgb(hsv), col, shift.w); \ +} \ +"; + +char *str_brightcontrast = "\ +fun brightcontrast(col: float3, bright: float, contr: float): float3 { \ + var a: float = 1.0 + contr; \ + var b: float = bright - contr * 0.5; \ + return max3(a * col + b, float3(0.0, 0.0, 0.0)); \ +} \ +"; + char *str_cotangent_frame = "\ fun cotangent_frame(n: float3, p: float3, tex_coord: float2): float3x3 { \ var duv1: float2 = ddx2(tex_coord); \ @@ -404,93 +493,3 @@ fun dither_bayer(uv: float2): float { \ return 5.0 / 16.0; \ } \ "; -i32 ui_sidebar_default_w_mini = 56; -i32 ui_sidebar_default_w_full = 280; -i32 ui_sidebar_default_w; -ui_handle_t *ui_sidebar_hminimized; -i32 ui_sidebar_w_mini; -char *console_message = ""; -f32 console_message_timer = 0.0; -i32 console_message_color = 0x00000000; -string_array_t *console_last_traces; -vec4_t camera_origins[2]; -mat4_t camera_views[2]; -ui_handle_t *box_preferences_htab; -string_array_t *box_preferences_files_plugin = NULL; -ui_handle_t *box_preferences_h_theme; -ui_handle_t *box_preferences_h_preset; -slot_layer_t *render_path_paint_live_layer = NULL; -i32 render_path_paint_live_layer_drawn = 0; -bool render_path_paint_live_layer_locked = false; -bool render_path_paint_push_undo_last; -bool ui_box_show = false; -ui_handle_t *ui_box_hwnd; -bool ui_box_click_to_hide = true; -i32 ui_box_modalw = 400; -i32 ui_box_modalh = 170; -ui_handle_t *tab_layers_layer_name_handle; -gpu_texture_t *util_uv_uvmap = NULL; -bool util_uv_uvmap_cached = false; -gpu_texture_t *util_uv_trianglemap = NULL; -bool util_uv_trianglemap_cached = false; -gpu_texture_t *util_uv_dilatemap = NULL; -bool util_uv_dilatemap_cached = false; -gpu_texture_t *util_uv_uvislandmap = NULL; -bool util_uv_uvislandmap_cached = false; -i32 render_path_raytrace_frame = 0; -bool render_path_raytrace_ready = false; -bool render_path_raytrace_init_shader = true; -f32_array_t *render_path_raytrace_f32a; -mat4_t render_path_raytrace_help_mat; -gpu_texture_t *render_path_raytrace_last_envmap = NULL; -bool render_path_raytrace_is_bake = false; - -#ifdef IRON_DIRECT3D12 -char *render_path_raytrace_ext = ".cso"; -#elif defined(IRON_METAL) -char *render_path_raytrace_ext = ".metal"; -#else -char *render_path_raytrace_ext = ".spirv"; -#endif - -bool sculpt_push_undo = false; -i32 ui_statusbar_default_h = 33; -char *parser_material_bake_passthrough_strength = "0.0"; -char *parser_material_bake_passthrough_radius = "0.0"; -char *parser_material_bake_passthrough_offset = "0.0"; - -char *str_hue_sat = "\ -fun hsv_to_rgb(c: float3): float3 { \ - var K: float4 = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \ - var p: float3 = abs3(frac3(c.xxx + K.xyz) * 6.0 - K.www); \ - return lerp3(K.xxx, clamp3(p - K.xxx, float3(0.0, 0.0, 0.0), float3(1.0, 1.0, 1.0)), c.y) * c.z; \ -} \ -fun rgb_to_hsv(c: float3): float3 { \ - var K: float4 = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); \ - var p: float4 = lerp4(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); \ - var q: float4 = lerp4(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); \ - var d: float = q.x - min(q.w, q.y); \ - var e: float = 0.0000000001; \ - return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); \ -} \ -fun hue_sat(col: float3, shift: float4): float3 { \ - var hsv: float3 = rgb_to_hsv(col); \ - hsv.x += shift.x; \ - hsv.y *= shift.y; \ - hsv.z *= shift.z; \ - return lerp3(hsv_to_rgb(hsv), col, shift.w); \ -} \ -"; - -char *str_brightcontrast = "\ -fun brightcontrast(col: float3, bright: float, contr: float): float3 { \ - var a: float = 1.0 + contr; \ - var b: float = bright - contr * 0.5; \ - return max3(a * col + b, float3(0.0, 0.0, 0.0)); \ -} \ -"; - -any_imap_t *neural_node_results; -ui_node_t *neural_node_current; -i32 neural_node_downloading = 0; -neural_node_model_t_array_t *neural_node_models = NULL; diff --git a/paint/sources/io/export_arm.c b/paint/sources/io/export_arm.c index 72a6ac53..c9c67746 100644 --- a/paint/sources/io/export_arm.c +++ b/paint/sources/io/export_arm.c @@ -57,8 +57,8 @@ string_array_t *export_arm_assets_to_files(char *project_path, asset_t_array_t * string_array_t *export_arm_meshes_to_files(char *project_path) { string_array_t *mesh_files = any_array_create_from_raw((void *[]){}, 0); - for (i32 i = 0; i < project_mesh_assets->length; ++i) { - char *file = project_mesh_assets->buffer[i]; + for (i32 i = 0; i < g_project->mesh_assets->length; ++i) { + char *file = g_project->mesh_assets->buffer[i]; #ifdef IRON_IOS bool same_drive = false; #else @@ -263,8 +263,6 @@ void export_arm_run_project() { g_project->layer_datas = ld; g_project->font_assets = font_files; g_project->mesh_assets = mesh_files; - g_project->atlas_objects = project_atlas_objects; - g_project->atlas_names = project_atlas_names; tab_timeline_export(g_project); diff --git a/paint/sources/io/export_texture.c b/paint/sources/io/export_texture.c index 74e0cc47..bf6edb4c 100644 --- a/paint/sources/io/export_texture.c +++ b/paint/sources/io/export_texture.c @@ -41,8 +41,7 @@ static void export_texture_write_texture(char *file, buffer_t *pixels, i32 type, g_project->assets = any_array_create_from_raw((void *[]){}, 0); } any_array_push(g_project->assets, asset->file); - any_array_push(project_asset_names, asset->name); - any_imap_set(project_asset_map, asset->id, image); + asset->image = image; asset_t_array_t *assets = any_array_create_from_raw( (void *[]){ asset, @@ -546,9 +545,9 @@ void export_texture_run(char *path, bool bake_material) { } else { // Visible or selected bool atlas_export = false; - if (project_atlas_objects != NULL) { - for (i32 i = 1; i < project_atlas_objects->length; ++i) { - if (project_atlas_objects->buffer[i - 1] != project_atlas_objects->buffer[i]) { + if (g_project->atlas_objects != NULL) { + for (i32 i = 1; i < g_project->atlas_objects->length; ++i) { + if (g_project->atlas_objects->buffer[i - 1] != g_project->atlas_objects->buffer[i]) { atlas_export = true; break; } @@ -556,11 +555,11 @@ void export_texture_run(char *path, bool bake_material) { } if (atlas_export) { string_array_t *used_atlases = project_get_used_atlases(); - for (i32 atlas_index = 0; atlas_index < project_atlas_objects->length; ++atlas_index) { + for (i32 atlas_index = 0; atlas_index < g_project->atlas_objects->length; ++atlas_index) { // Skip atlases that no object is assigned to bool atlas_used = false; - for (i32 object_index = 0; object_index < project_atlas_objects->length; ++object_index) { - if (project_atlas_objects->buffer[object_index] == atlas_index) { + for (i32 object_index = 0; object_index < g_project->atlas_objects->length; ++object_index) { + if (g_project->atlas_objects->buffer[object_index] == atlas_index) { atlas_used = true; break; } @@ -577,12 +576,12 @@ void export_texture_run(char *path, bool bake_material) { add = true; } else if (mask <= project_paint_objects->length) { // Specific object - add = project_atlas_objects->buffer[mask - 1] == atlas_index; + add = g_project->atlas_objects->buffer[mask - 1] == atlas_index; } else if (used_atlases != NULL) { // Atlas i32 used_index = mask - project_paint_objects->length - 1; if (used_index < used_atlases->length) { - add = string_array_index_of(project_atlas_names, used_atlases->buffer[used_index]) == atlas_index; + add = string_array_index_of(g_project->atlas_names, used_atlases->buffer[used_index]) == atlas_index; } } if (add) { @@ -590,7 +589,7 @@ void export_texture_run(char *path, bool bake_material) { } } if (layers->length > 0) { - export_texture_run_layers(path, layers, project_atlas_names->buffer[atlas_index], false); + export_texture_run_layers(path, layers, g_project->atlas_names->buffer[atlas_index], false); } } } diff --git a/paint/sources/io/import_arm.c b/paint/sources/io/import_arm.c index a68a4c34..32c8530a 100644 --- a/paint/sources/io/import_arm.c +++ b/paint/sources/io/import_arm.c @@ -394,25 +394,11 @@ void import_arm_run_project(char *path) { if (project->mesh_assets != NULL && project->mesh_assets->length > 0) { char *file = project->mesh_assets->buffer[0]; char *abs = data_is_abs(file) ? file : string("%s%s", base, file); - gc_unroot(project_mesh_assets); - project_mesh_assets = any_array_create_from_raw( + g_project->mesh_assets = any_array_create_from_raw( (void *[]){ abs, }, 1); - gc_root(project_mesh_assets); - } - - if (project->atlas_objects != NULL) { - gc_unroot(project_atlas_objects); - project_atlas_objects = project->atlas_objects; - gc_root(project_atlas_objects); - } - - if (project->atlas_names != NULL) { - gc_unroot(project_atlas_names); - project_atlas_names = project->atlas_names; - gc_root(project_atlas_names); } // No mask by default diff --git a/paint/sources/io/import_asset.c b/paint/sources/io/import_asset.c index 58ab1323..f867defb 100644 --- a/paint/sources/io/import_asset.c +++ b/paint/sources/io/import_asset.c @@ -58,7 +58,7 @@ void import_asset_run(char *path, f32 drop_x, f32 drop_y, bool show_box, bool hd ui_nodes_hwnd->redraws = 2; } - if (g_context->tool == TOOL_TYPE_COLORID && project_asset_names->length == 1) { + if (g_context->tool == TOOL_TYPE_COLORID && project_assets->length == 1) { ui_header_handle->redraws = 2; g_context->ddirty = 2; } diff --git a/paint/sources/io/import_mesh.c b/paint/sources/io/import_mesh.c index 82bbe5a7..91dfb0a6 100644 --- a/paint/sources/io/import_mesh.c +++ b/paint/sources/io/import_mesh.c @@ -47,13 +47,11 @@ void import_mesh_run(char *path, bool _clear_layers, bool replace_existing, bool } } - gc_unroot(project_mesh_assets); - project_mesh_assets = any_array_create_from_raw( + g_project->mesh_assets = any_array_create_from_raw( (void *[]){ path, }, 1); - gc_root(project_mesh_assets); #if defined(IRON_ANDROID) || defined(IRON_IOS) sys_title_set(substring(path, string_last_index_of(path, PATH_SEP) + 1, string_last_index_of(path, "."))); diff --git a/paint/sources/io/import_texture.c b/paint/sources/io/import_texture.c index 4c6b04ac..41b8fe3e 100644 --- a/paint/sources/io/import_texture.c +++ b/paint/sources/io/import_texture.c @@ -61,8 +61,7 @@ void import_texture_run(char *path, bool hdr_as_envmap) { if (g_context->texture == NULL) { g_context->texture = asset; } - any_array_push(project_asset_names, name); - any_imap_set(project_asset_map, asset->id, image); + asset->image = image; ui_base_hwnds->buffer[TAB_AREA_STATUS]->redraws = 2; console_info(string("%s %s", tr("Texture imported:"), name)); diff --git a/paint/sources/main.c b/paint/sources/main.c index 6890ba7f..c4d1b9f6 100644 --- a/paint/sources/main.c +++ b/paint/sources/main.c @@ -369,18 +369,11 @@ void _kickstart() { project_assets = any_array_create_from_raw((void *[]){}, 0); gc_root(project_assets); - project_asset_names = any_array_create_from_raw((void *[]){}, 0); - gc_root(project_asset_names); - - project_mesh_assets = any_array_create_from_raw((void *[]){}, 0); - gc_root(project_mesh_assets); + g_project->mesh_assets = any_array_create_from_raw((void *[]){}, 0); project_material_groups = any_array_create_from_raw((void *[]){}, 0); gc_root(project_material_groups); - project_asset_map = any_imap_create(); - gc_root(project_asset_map); - project_materials = any_array_create_from_raw((void *[]){}, 0); gc_root(project_materials); diff --git a/paint/sources/nodes_brush/brush_output_node.c b/paint/sources/nodes_brush/brush_output_node.c index ae5ccaf9..7065a0e4 100644 --- a/paint/sources/nodes_brush/brush_output_node.c +++ b/paint/sources/nodes_brush/brush_output_node.c @@ -43,7 +43,13 @@ void brush_output_node_parse_inputs() { g_context->brush_mask_image_is_alpha = ends_with(opac->_str, ".a"); opac->_str = string_copy(substring(opac->_str, 0, string_last_index_of(opac->_str, "."))); g_context->brush_nodes_opacity = 1.0; - i32 index = string_array_index_of(project_asset_names, opac->_str); + i32 index = -1; + for (i32 i = 0; i < project_assets->length; ++i) { + if (string_equals(project_assets->buffer[i]->name, opac->_str)) { + index = i; + break; + } + } if (index != -1) { asset_t *asset = project_assets->buffer[index]; g_context->brush_mask_image = project_get_image(asset); @@ -63,7 +69,13 @@ void brush_output_node_parse_inputs() { if (stencil->_str != NULL) { // string g_context->brush_stencil_image_is_alpha = ends_with(stencil->_str, ".a"); stencil->_str = string_copy(substring(stencil->_str, 0, string_last_index_of(stencil->_str, "."))); - i32 index = string_array_index_of(project_asset_names, stencil->_str); + i32 index = -1; + for (i32 i = 0; i < project_assets->length; ++i) { + if (string_equals(project_assets->buffer[i]->name, stencil->_str)) { + index = i; + break; + } + } if (index != -1) { asset_t *asset = project_assets->buffer[index]; g_context->brush_stencil_image = project_get_image(asset); diff --git a/paint/sources/project.c b/paint/sources/project.c index 15001ff5..50ffc37f 100644 --- a/paint/sources/project.c +++ b/paint/sources/project.c @@ -184,9 +184,7 @@ void project_new(bool reset_layers) { g_context->layer_preview_dirty = true; g_context->layer_filter = 0; g_context->texture = NULL; - gc_unroot(project_mesh_assets); - project_mesh_assets = any_array_create_from_raw((void *[]){}, 0); - gc_root(project_mesh_assets); + g_project->mesh_assets = any_array_create_from_raw((void *[]){}, 0); mesh_data_t *raw = NULL; char *mesh_name = project_mesh_list == NULL ? "box_bevel" : project_mesh_list->buffer[g_context->project_type]; @@ -284,12 +282,6 @@ void project_new(bool reset_layers) { gc_unroot(project_assets); project_assets = any_array_create_from_raw((void *[]){}, 0); gc_root(project_assets); - gc_unroot(project_asset_names); - project_asset_names = any_array_create_from_raw((void *[]){}, 0); - gc_root(project_asset_names); - gc_unroot(project_asset_map); - project_asset_map = any_imap_create(); - gc_root(project_asset_map); project_asset_id = 0; g_project->packed_assets = any_array_create_from_raw((void *[]){}, 0); g_context->ddirty = 4; @@ -502,8 +494,8 @@ void project_import_mesh_box(char *path, bool replace_existing, bool clear_layer } void project_reimport_mesh() { - if (project_mesh_assets != NULL && project_mesh_assets->length > 0 && iron_file_exists(project_mesh_assets->buffer[0])) { - project_import_mesh_box(project_mesh_assets->buffer[0], true, false, true, NULL); + if (g_project->mesh_assets != NULL && g_project->mesh_assets->length > 0 && iron_file_exists(g_project->mesh_assets->buffer[0])) { + project_import_mesh_box(g_project->mesh_assets->buffer[0], true, false, true, NULL); } else { project_import_asset(NULL, true); @@ -512,10 +504,10 @@ void project_reimport_mesh() { void project_reimport_mesh_skinned(int frame) { extern bool import_mesh_no_scale; - if (project_mesh_assets != NULL && project_mesh_assets->length > 0 && iron_file_exists(project_mesh_assets->buffer[0])) { + if (g_project->mesh_assets != NULL && g_project->mesh_assets->length > 0 && iron_file_exists(g_project->mesh_assets->buffer[0])) { plugins_skinning_frame = frame; import_mesh_no_scale = true; - import_mesh_run(project_mesh_assets->buffer[0], false, true, true); + import_mesh_run(g_project->mesh_assets->buffer[0], false, true, true); plugins_skinning_frame = -1; } } @@ -590,13 +582,10 @@ void project_reimport_texture_load(char *path, asset_t *asset) { asset->file = string_copy(path); i32 i = array_index_of(project_assets, asset); data_delete_image(asset->file); - imap_delete(project_asset_map, asset->id); asset_t *old_asset = project_assets->buffer[i]; array_splice(project_assets, i, 1); - array_splice(project_asset_names, i, 1); import_texture_run(asset->file, true); array_insert(project_assets, i, array_pop(project_assets)); - array_insert(project_asset_names, i, array_pop(project_asset_names)); if (g_context->texture == old_asset) { g_context->texture = project_assets->buffer[i]; @@ -623,16 +612,16 @@ void project_reimport_texture(asset_t *asset) { } gpu_texture_t *project_get_image(asset_t *asset) { - return asset != NULL ? any_imap_get(project_asset_map, asset->id) : NULL; + return asset != NULL ? asset->image : NULL; } string_array_t *project_get_used_atlases() { - if (project_atlas_objects == NULL) { + if (g_project->atlas_objects == NULL) { return NULL; } i32_array_t *used = i32_array_create_from_raw((i32[]){}, 0); - for (i32 i = 0; i < project_atlas_objects->length; ++i) { - i32 ao = project_atlas_objects->buffer[i]; + for (i32 i = 0; i < g_project->atlas_objects->length; ++i) { + i32 ao = g_project->atlas_objects->buffer[i]; if (i32_array_index_of(used, ao) == -1) { i32_array_push(used, ao); } @@ -641,7 +630,7 @@ string_array_t *project_get_used_atlases() { string_array_t *res = any_array_create_from_raw((void *[]){}, 0); for (i32 i = 0; i < used->length; ++i) { i32 u = used->buffer[i]; - any_array_push(res, project_atlas_names->buffer[u]); + any_array_push(res, g_project->atlas_names->buffer[u]); } return res; } @@ -654,8 +643,8 @@ bool project_is_atlas_object(mesh_object_t *p) { return false; } char *atlas_name = project_get_used_atlases()->buffer[g_context->layer_filter - project_paint_objects->length - 1]; - i32 atlas_i = string_array_index_of(project_atlas_names, atlas_name); - return atlas_i == project_atlas_objects->buffer[array_index_of(project_paint_objects, p)]; + i32 atlas_i = string_array_index_of(g_project->atlas_names, atlas_name); + return atlas_i == g_project->atlas_objects->buffer[array_index_of(project_paint_objects, p)]; } mesh_object_t_array_t *project_get_atlas_objects(i32 object_mask) { @@ -665,10 +654,10 @@ mesh_object_t_array_t *project_get_atlas_objects(i32 object_mask) { return project_paint_objects; } char *atlas_name = atlases->buffer[i]; - i32 atlas_i = string_array_index_of(project_atlas_names, atlas_name); + i32 atlas_i = string_array_index_of(g_project->atlas_names, atlas_name); mesh_object_t_array_t *visibles = any_array_create_from_raw((void *[]){}, 0); for (i32 i = 0; i < project_paint_objects->length; ++i) { - if (project_atlas_objects->buffer[i] == atlas_i) { + if (g_project->atlas_objects->buffer[i] == atlas_i) { any_array_push(visibles, project_paint_objects->buffer[i]); } } diff --git a/paint/sources/types.h b/paint/sources/types.h index 722ac696..5851d567 100644 --- a/paint/sources/types.h +++ b/paint/sources/types.h @@ -556,9 +556,10 @@ typedef struct project { } project_t; typedef struct asset { - i32 id; - char *name; - char *file; + i32 id; + char *name; + char *file; + gpu_texture_t *image; } asset_t; typedef struct packed_asset { diff --git a/paint/sources/ui/box_export.c b/paint/sources/ui/box_export.c index 43c26998..ef71d462 100644 --- a/paint/sources/ui/box_export.c +++ b/paint/sources/ui/box_export.c @@ -394,25 +394,21 @@ void box_export_tab_presets() { void box_export_tab_atlases() { bool tab_vertical = g_config->touch_ui; if (ui_tab(box_export_htab, tr("Atlases"), tab_vertical, -1, false)) { - if (project_atlas_objects == NULL || project_atlas_objects->length != project_paint_objects->length) { - gc_unroot(project_atlas_objects); - project_atlas_objects = i32_array_create_from_raw((i32[]){}, 0); - gc_root(project_atlas_objects); - gc_unroot(project_atlas_names); - project_atlas_names = any_array_create_from_raw((void *[]){}, 0); - gc_root(project_atlas_names); + if (g_project->atlas_objects == NULL || g_project->atlas_objects->length != project_paint_objects->length) { + g_project->atlas_objects = i32_array_create_from_raw((i32[]){}, 0); + g_project->atlas_names = any_array_create_from_raw((void *[]){}, 0); for (i32 i = 0; i < project_paint_objects->length; ++i) { - i32_array_push(project_atlas_objects, 0); + i32_array_push(g_project->atlas_objects, 0); i32 i1 = i + 1; - any_array_push(project_atlas_names, string("%s %s", tr("Atlas"), i32_to_string(i1))); + any_array_push(g_project->atlas_names, string("%s %s", tr("Atlas"), i32_to_string(i1))); } } for (i32 i = 0; i < project_paint_objects->length; ++i) { ui_row2(); ui_text(project_paint_objects->buffer[i]->base->name, UI_ALIGN_LEFT, 0x00000000); - ui_handle_t *hatlas = ui_nest(ui_handle(__ID__), i); - hatlas->i = project_atlas_objects->buffer[i]; - project_atlas_objects->buffer[i] = ui_combo(hatlas, project_atlas_names, tr("Atlas"), false, UI_ALIGN_LEFT, true); + ui_handle_t *hatlas = ui_nest(ui_handle(__ID__), i); + hatlas->i = g_project->atlas_objects->buffer[i]; + g_project->atlas_objects->buffer[i] = ui_combo(hatlas, g_project->atlas_names, tr("Atlas"), false, UI_ALIGN_LEFT, true); } } } diff --git a/paint/sources/ui/tab_layers.c b/paint/sources/ui/tab_layers.c index c2eaf3c6..f80b96f3 100644 --- a/paint/sources/ui/tab_layers.c +++ b/paint/sources/ui/tab_layers.c @@ -732,15 +732,10 @@ void tab_layers_draw_layer_context_menu_draw() { tr("Custom"), }, 5); - ui_handle_t *h = ui_handle(__ID__); - bool changed_last = h->changed; - h->i = base_res_handle->i; - base_res_handle->i = ui_combo(h, ar, tr("Resolution"), true, UI_ALIGN_LEFT, true); - if (h->changed) { + ui_combo(base_res_handle, ar, tr("Resolution"), true, UI_ALIGN_LEFT, true); + if (base_res_handle->changed) { ui_menu_keep_open = true; config_set_texture_res(base_res_handle->i); - } - if (changed_last && !h->changed) { layers_on_resized(); } diff --git a/paint/sources/ui/tab_textures.c b/paint/sources/ui/tab_textures.c index fe6c04a7..cd5698c6 100644 --- a/paint/sources/ui/tab_textures.c +++ b/paint/sources/ui/tab_textures.c @@ -101,9 +101,7 @@ void tab_textures_delete_texture(asset_t *asset) { } data_delete_image(asset->file); - imap_delete(project_asset_map, asset->id); array_splice(project_assets, index, 1); - array_splice(project_asset_names, index, 1); sys_notify_on_next_frame(&tab_textures_delete_texture_on_next_frame, NULL); for (i32 i = 0; i < project_materials->length; ++i) { @@ -384,11 +382,8 @@ void tab_textures_accept_asset_drop(asset_t *asset) { i32 asset_pos = array_index_of(project_assets, asset); if (asset_pos != -1 && math_abs(asset_pos - tab_textures_drag_pos) > 0) { array_remove(project_assets, asset); - char *asset_name = project_asset_names->buffer[asset_pos]; - array_splice(project_asset_names, asset_pos, 1); i32 new_pos = tab_textures_drag_pos - asset_pos > 0 ? tab_textures_drag_pos - 1 : tab_textures_drag_pos; array_insert(project_assets, new_pos, asset); - array_insert(project_asset_names, new_pos, asset_name); for (i32 i = 0; i < project_materials->length; ++i) { tab_textures_remap_node_indices(project_materials->buffer[i]->canvas->nodes, asset_pos, new_pos); diff --git a/paint/sources/ui/ui_header.c b/paint/sources/ui/ui_header.c index e7599a7a..f860aa98 100644 --- a/paint/sources/ui/ui_header.c +++ b/paint/sources/ui/ui_header.c @@ -139,7 +139,7 @@ void ui_header_draw_tool_properties_to_mask(slot_layer_t *m) { void ui_header_draw_tool_properties_import(char *path) { import_asset_run(path, -1.0, -1.0, true, false, NULL); - g_context->colorid = project_asset_names->length - 1; + g_context->colorid = project_assets->length - 1; for (i32 i = 0; i < project_assets->length; ++i) { asset_t *a = project_assets->buffer[i]; // Already imported @@ -167,7 +167,7 @@ void ui_header_draw_tool_properties() { } ui->enabled = true; ui_text(tr("Color ID Map"), UI_ALIGN_LEFT, 0x00000000); - if (project_asset_names->length > 0) { + if (project_assets->length > 0) { ui_handle_t *colorid_handle = ui_handle(__ID__); colorid_handle->i = g_context->colorid; g_context->colorid = ui_combo(colorid_handle, base_combo_enum_texts("TEX_IMAGE"), tr("Color ID"), false, UI_ALIGN_LEFT, true); diff --git a/paint/sources/ui/ui_view2d.c b/paint/sources/ui/ui_view2d.c index 8a2265e2..b46eef59 100644 --- a/paint/sources/ui/ui_view2d.c +++ b/paint/sources/ui/ui_view2d.c @@ -377,11 +377,8 @@ void ui_view2d_render(void *_) { if (ui_view2d_type == VIEW_2D_TYPE_ASSET) { asset_t *asset = g_context->texture; if (asset != NULL) { - string_array_t *asset_names = project_asset_names; - i32 i = string_array_index_of(asset_names, asset->name); - h->text = string_copy(asset->name); - asset->name = string_copy(ui_text_input(h, "", UI_ALIGN_LEFT, true, false)); - asset_names->buffer[i] = asset->name; + h->text = string_copy(asset->name); + asset->name = string_copy(ui_text_input(h, "", UI_ALIGN_LEFT, true, false)); } } else if (ui_view2d_type == VIEW_2D_TYPE_NODE) {