@@ -1314,7 +1314,7 @@ Node *ResourceImporterScene::_post_fix_animations(Node *p_node, Node *p_root, co
1314
1314
int end_frame = anim_settings[" slice_" + itos (i + 1 ) + " /end_frame" ];
1315
1315
Animation::LoopMode loop_mode = static_cast <Animation::LoopMode>((int )anim_settings[" slice_" + itos (i + 1 ) + " /loop_mode" ]);
1316
1316
bool save_to_file = anim_settings[" slice_" + itos (i + 1 ) + " /save_to_file/enabled" ];
1317
- String save_to_path = anim_settings[" slice_" + itos (i + 1 ) + " /save_to_file/path" ];
1317
+ String save_to_path = ResourceUID::ensure_path ( anim_settings[" slice_" + itos (i + 1 ) + " /save_to_file/path" ]) ;
1318
1318
bool save_to_file_keep_custom = anim_settings[" slice_" + itos (i + 1 ) + " /save_to_file/keep_custom_tracks" ];
1319
1319
1320
1320
animation_slices.push_back (slice_name);
@@ -1343,7 +1343,7 @@ Node *ResourceImporterScene::_post_fix_animations(Node *p_node, Node *p_root, co
1343
1343
1344
1344
anim->set_loop_mode (static_cast <Animation::LoopMode>((int )anim_settings[" settings/loop_mode" ]));
1345
1345
bool save = anim_settings[" save_to_file/enabled" ];
1346
- String path = anim_settings[" save_to_file/path" ];
1346
+ String path = ResourceUID::ensure_path ( anim_settings[" save_to_file/path" ]) ;
1347
1347
bool keep_custom = anim_settings[" save_to_file/keep_custom_tracks" ];
1348
1348
1349
1349
Ref<Animation> saved_anim = _save_animation_to_file (anim, save, path, keep_custom);
@@ -1534,6 +1534,19 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, HashMap<
1534
1534
if (matdata.has (" use_external/enabled" ) && bool (matdata[" use_external/enabled" ]) && matdata.has (" use_external/path" )) {
1535
1535
String path = matdata[" use_external/path" ];
1536
1536
Ref<Material> external_mat = ResourceLoader::load (path);
1537
+ if (!external_mat.is_valid ()) {
1538
+ if (matdata.has (" use_external/fallback_path" )) {
1539
+ String fallback_save_path = matdata[" use_external/fallback_path" ];
1540
+ if (!fallback_save_path.is_empty ()) {
1541
+ external_mat = ResourceLoader::load (fallback_save_path);
1542
+ if (external_mat.is_valid ()) {
1543
+ matdata[" use_external/path" ] = ResourceUID::path_to_uid (fallback_save_path);
1544
+ }
1545
+ }
1546
+ }
1547
+ } else {
1548
+ matdata[" save_to_file/fallback_path" ] = ResourceUID::ensure_path (path);
1549
+ }
1537
1550
if (external_mat.is_valid ()) {
1538
1551
m->set_surface_material (i, external_mat);
1539
1552
}
@@ -2044,6 +2057,7 @@ void ResourceImporterScene::get_internal_import_options(InternalImportCategory p
2044
2057
case INTERNAL_IMPORT_CATEGORY_MESH: {
2045
2058
r_options->push_back (ImportOption (PropertyInfo (Variant::BOOL, " save_to_file/enabled" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false ));
2046
2059
r_options->push_back (ImportOption (PropertyInfo (Variant::STRING, " save_to_file/path" , PROPERTY_HINT_SAVE_FILE, " *.res,*.tres" ), " " ));
2060
+ r_options->push_back (ImportOption (PropertyInfo (Variant::STRING, " save_to_file/fallback_path" , PROPERTY_HINT_SAVE_FILE, " " , PROPERTY_USAGE_NO_EDITOR), " " ));
2047
2061
r_options->push_back (ImportOption (PropertyInfo (Variant::INT, " generate/shadow_meshes" , PROPERTY_HINT_ENUM, " Default,Enable,Disable" ), 0 ));
2048
2062
r_options->push_back (ImportOption (PropertyInfo (Variant::INT, " generate/lightmap_uv" , PROPERTY_HINT_ENUM, " Default,Enable,Disable" ), 0 ));
2049
2063
r_options->push_back (ImportOption (PropertyInfo (Variant::INT, " generate/lods" , PROPERTY_HINT_ENUM, " Default,Enable,Disable" ), 0 ));
@@ -2052,11 +2066,13 @@ void ResourceImporterScene::get_internal_import_options(InternalImportCategory p
2052
2066
case INTERNAL_IMPORT_CATEGORY_MATERIAL: {
2053
2067
r_options->push_back (ImportOption (PropertyInfo (Variant::BOOL, " use_external/enabled" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false ));
2054
2068
r_options->push_back (ImportOption (PropertyInfo (Variant::STRING, " use_external/path" , PROPERTY_HINT_FILE, " *.material,*.res,*.tres" ), " " ));
2069
+ r_options->push_back (ImportOption (PropertyInfo (Variant::STRING, " use_external/fallback_path" , PROPERTY_HINT_FILE, " " , PROPERTY_USAGE_NO_EDITOR), " " ));
2055
2070
} break ;
2056
2071
case INTERNAL_IMPORT_CATEGORY_ANIMATION: {
2057
2072
r_options->push_back (ImportOption (PropertyInfo (Variant::INT, " settings/loop_mode" , PROPERTY_HINT_ENUM, " None,Linear,Pingpong" ), 0 ));
2058
2073
r_options->push_back (ImportOption (PropertyInfo (Variant::BOOL, " save_to_file/enabled" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false ));
2059
2074
r_options->push_back (ImportOption (PropertyInfo (Variant::STRING, " save_to_file/path" , PROPERTY_HINT_SAVE_FILE, " *.res,*.tres" ), " " ));
2075
+ r_options->push_back (ImportOption (PropertyInfo (Variant::STRING, " save_to_file/fallback_path" , PROPERTY_HINT_SAVE_FILE, " " , PROPERTY_USAGE_NO_EDITOR), " " ));
2060
2076
r_options->push_back (ImportOption (PropertyInfo (Variant::BOOL, " save_to_file/keep_custom_tracks" ), " " ));
2061
2077
r_options->push_back (ImportOption (PropertyInfo (Variant::INT, " slices/amount" , PROPERTY_HINT_RANGE, " 0,256,1" , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0 ));
2062
2078
@@ -2067,6 +2083,7 @@ void ResourceImporterScene::get_internal_import_options(InternalImportCategory p
2067
2083
r_options->push_back (ImportOption (PropertyInfo (Variant::INT, " slice_" + itos (i + 1 ) + " /loop_mode" , PROPERTY_HINT_ENUM, " None,Linear,Pingpong" ), 0 ));
2068
2084
r_options->push_back (ImportOption (PropertyInfo (Variant::BOOL, " slice_" + itos (i + 1 ) + " /save_to_file/enabled" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false ));
2069
2085
r_options->push_back (ImportOption (PropertyInfo (Variant::STRING, " slice_" + itos (i + 1 ) + " /save_to_file/path" , PROPERTY_HINT_SAVE_FILE, " .res,*.tres" ), " " ));
2086
+ r_options->push_back (ImportOption (PropertyInfo (Variant::STRING, " slice_" + itos (i + 1 ) + " /save_to_file/fallback_path" , PROPERTY_HINT_SAVE_FILE, " " , PROPERTY_USAGE_NO_EDITOR), " " ));
2070
2087
r_options->push_back (ImportOption (PropertyInfo (Variant::BOOL, " slice_" + itos (i + 1 ) + " /save_to_file/keep_custom_tracks" ), false ));
2071
2088
}
2072
2089
} break ;
@@ -2196,17 +2213,17 @@ bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategor
2196
2213
}
2197
2214
} break ;
2198
2215
case INTERNAL_IMPORT_CATEGORY_MESH: {
2199
- if (p_option == " save_to_file/path" ) {
2216
+ if (p_option == " save_to_file/path" || p_option == " save_to_file/fallback_path " ) {
2200
2217
return p_options[" save_to_file/enabled" ];
2201
2218
}
2202
2219
} break ;
2203
2220
case INTERNAL_IMPORT_CATEGORY_MATERIAL: {
2204
- if (p_option == " use_external/path" ) {
2221
+ if (p_option == " use_external/path" || p_option == " use_external/fallback_path " ) {
2205
2222
return p_options[" use_external/enabled" ];
2206
2223
}
2207
2224
} break ;
2208
2225
case INTERNAL_IMPORT_CATEGORY_ANIMATION: {
2209
- if (p_option == " save_to_file/path" || p_option == " save_to_file/keep_custom_tracks" ) {
2226
+ if (p_option == " save_to_file/path" || p_option == " save_to_file/fallback_path " || p_option == " save_to_file/ keep_custom_tracks" ) {
2210
2227
return p_options[" save_to_file/enabled" ];
2211
2228
}
2212
2229
if (p_option.begins_with (" slice_" )) {
@@ -2873,13 +2890,52 @@ Node *ResourceImporterScene::pre_import(const String &p_source_file, const HashM
2873
2890
2874
2891
Error ResourceImporterScene::_check_resource_save_paths (const Dictionary &p_data) {
2875
2892
Array keys = p_data.keys ();
2876
- for (int i = 0 ; i < keys.size (); i ++) {
2877
- const Dictionary & settings = p_data[keys[i ]];
2893
+ for (int di = 0 ; di < keys.size (); di ++) {
2894
+ Dictionary settings = p_data[keys[di ]];
2878
2895
2879
2896
if (bool (settings.get (" save_to_file/enabled" , false )) && settings.has (" save_to_file/path" )) {
2880
- const String save_path = ResourceUID::ensure_path (settings[" save_to_file/path" ]);
2897
+ const String &raw_save_path = settings[" save_to_file/path" ];
2898
+ String save_path = ResourceUID::ensure_path (raw_save_path);
2899
+ if (raw_save_path.begins_with (" uid://" )) {
2900
+ if (save_path.is_empty () || !DirAccess::exists (save_path.get_base_dir ())) {
2901
+ if (settings.has (" save_to_file/fallback_path" )) {
2902
+ String fallback_save_path = settings[" save_to_file/fallback_path" ];
2903
+ if (!fallback_save_path.is_empty () && DirAccess::exists (fallback_save_path.get_base_dir ())) {
2904
+ save_path = fallback_save_path;
2905
+ ResourceUID::get_singleton ()->add_id (ResourceUID::get_singleton ()->text_to_id (raw_save_path), save_path);
2906
+ }
2907
+ }
2908
+ } else {
2909
+ settings[" save_to_file/fallback_path" ] = save_path;
2910
+ }
2911
+ }
2881
2912
ERR_FAIL_COND_V (!save_path.is_empty () && !DirAccess::exists (save_path.get_base_dir ()), ERR_FILE_BAD_PATH);
2882
2913
}
2914
+
2915
+ if (settings.has (" slices/amount" )) {
2916
+ int slices_count = settings[" slices/amount" ];
2917
+ for (int si = 0 ; si < slices_count; si++) {
2918
+ if (bool (settings.get (" slice_" + itos (si + 1 ) + " /save_to_file/enabled" , false )) &&
2919
+ settings.has (" slice_" + itos (si + 1 ) + " /save_to_file/path" )) {
2920
+ const String &raw_save_path = settings[" slice_" + itos (si + 1 ) + " /save_to_file/path" ];
2921
+ String save_path = ResourceUID::ensure_path (raw_save_path);
2922
+ if (raw_save_path.begins_with (" uid://" )) {
2923
+ if (save_path.is_empty () || !DirAccess::exists (save_path.get_base_dir ())) {
2924
+ if (settings.has (" slice_" + itos (si + 1 ) + " /save_to_file/fallback_path" )) {
2925
+ String fallback_save_path = settings[" slice_" + itos (si + 1 ) + " /save_to_file/fallback_path" ];
2926
+ if (!fallback_save_path.is_empty () && DirAccess::exists (fallback_save_path.get_base_dir ())) {
2927
+ save_path = fallback_save_path;
2928
+ ResourceUID::get_singleton ()->add_id (ResourceUID::get_singleton ()->text_to_id (raw_save_path), save_path);
2929
+ }
2930
+ }
2931
+ } else {
2932
+ settings[" save_to_file/fallback_path" ] = save_path;
2933
+ }
2934
+ }
2935
+ ERR_FAIL_COND_V (!save_path.is_empty () && !DirAccess::exists (save_path.get_base_dir ()), ERR_FILE_BAD_PATH);
2936
+ }
2937
+ }
2938
+ }
2883
2939
}
2884
2940
2885
2941
return OK;
0 commit comments