|
@@ -610,7 +610,42 @@ static Error _fix_imported_scene_paths(Node* node, Node* root, String save_path)
|
|
|
};
|
|
|
|
|
|
|
|
|
-bool EditorNode::_find_and_save_edited_subresources(Object *obj,Set<RES>& processed,int32_t flags) {
|
|
|
+bool EditorNode::_find_and_save_resource(RES res,Map<RES,bool>& processed,int32_t flags) {
|
|
|
+
|
|
|
+ if (res.is_null())
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (processed.has(res)) {
|
|
|
+
|
|
|
+ return processed[res];
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ bool changed = res->is_edited();
|
|
|
+ res->set_edited(false);
|
|
|
+
|
|
|
+ bool subchanged = _find_and_save_edited_subresources(res.ptr(),processed,flags);
|
|
|
+
|
|
|
+// print_line("checking if edited: "+res->get_type()+" :: "+res->get_name()+" :: "+res->get_path()+" :: "+itos(changed)+" :: SR "+itos(subchanged));
|
|
|
+
|
|
|
+ if (res->get_path().is_resource_file()) {
|
|
|
+ if (changed || subchanged) {
|
|
|
+ //save
|
|
|
+ print_line("Also saving modified external resource: "+res->get_path());
|
|
|
+ Error err = ResourceSaver::save(res->get_path(),res,flags);
|
|
|
+
|
|
|
+ }
|
|
|
+ processed[res]=false; //because it's a file
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+
|
|
|
+
|
|
|
+ processed[res]=changed;
|
|
|
+ return changed;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+bool EditorNode::_find_and_save_edited_subresources(Object *obj,Map<RES,bool>& processed,int32_t flags) {
|
|
|
|
|
|
bool ret_changed=false;
|
|
|
List<PropertyInfo> pi;
|
|
@@ -620,57 +655,45 @@ bool EditorNode::_find_and_save_edited_subresources(Object *obj,Set<RES>& proces
|
|
|
if (!(E->get().usage&PROPERTY_USAGE_STORAGE))
|
|
|
continue;
|
|
|
|
|
|
+
|
|
|
+
|
|
|
switch(E->get().type) {
|
|
|
case Variant::OBJECT: {
|
|
|
|
|
|
RES res = obj->get(E->get().name);
|
|
|
|
|
|
- if (res.is_null() || processed.has(res))
|
|
|
- break;
|
|
|
-
|
|
|
- processed.insert(res);
|
|
|
-
|
|
|
- bool changed = res->is_edited();
|
|
|
- res->set_edited(false);
|
|
|
-
|
|
|
- bool subchanged = _find_and_save_edited_subresources(res.ptr(),processed,flags);
|
|
|
-
|
|
|
- if (res->get_path().is_resource_file()) {
|
|
|
- if (changed || subchanged) {
|
|
|
- //save
|
|
|
- print_line("Also saving modified external resource: "+res->get_path());
|
|
|
- Error err = ResourceSaver::save(res->get_path(),res,flags);
|
|
|
-
|
|
|
- }
|
|
|
- } else {
|
|
|
-
|
|
|
+ if (_find_and_save_resource(res,processed,flags))
|
|
|
ret_changed=true;
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
} break;
|
|
|
case Variant::ARRAY: {
|
|
|
|
|
|
- /*Array varray=p_variant;
|
|
|
+ Array varray= obj->get(E->get().name);
|
|
|
int len=varray.size();
|
|
|
for(int i=0;i<len;i++) {
|
|
|
|
|
|
Variant v=varray.get(i);
|
|
|
- _find_resources(v);
|
|
|
- }*/
|
|
|
+ RES res=v;
|
|
|
+ if (_find_and_save_resource(res,processed,flags))
|
|
|
+ ret_changed=true;
|
|
|
+
|
|
|
+ //_find_resources(v);
|
|
|
+ }
|
|
|
|
|
|
} break;
|
|
|
case Variant::DICTIONARY: {
|
|
|
|
|
|
- /*
|
|
|
- Dictionary d=p_variant;
|
|
|
+
|
|
|
+ Dictionary d=obj->get(E->get().name);;
|
|
|
List<Variant> keys;
|
|
|
d.get_key_list(&keys);
|
|
|
for(List<Variant>::Element *E=keys.front();E;E=E->next()) {
|
|
|
|
|
|
Variant v = d[E->get()];
|
|
|
- _find_resources(v);
|
|
|
- } */
|
|
|
+ RES res=v;
|
|
|
+ if (_find_and_save_resource(res,processed,flags))
|
|
|
+ ret_changed=true;
|
|
|
+ }
|
|
|
} break;
|
|
|
default: {}
|
|
|
}
|
|
@@ -681,7 +704,7 @@ bool EditorNode::_find_and_save_edited_subresources(Object *obj,Set<RES>& proces
|
|
|
|
|
|
}
|
|
|
|
|
|
-void EditorNode::_save_edited_subresources(Node* scene,Set<RES>& processed,int32_t flags) {
|
|
|
+void EditorNode::_save_edited_subresources(Node* scene,Map<RES,bool>& processed,int32_t flags) {
|
|
|
|
|
|
_find_and_save_edited_subresources(scene,processed,flags);
|
|
|
|
|
@@ -741,7 +764,7 @@ void EditorNode::_save_scene(String p_file) {
|
|
|
|
|
|
|
|
|
err = ResourceSaver::save(p_file,sdata,flg);
|
|
|
- Set<RES> processed;
|
|
|
+ Map<RES,bool> processed;
|
|
|
_save_edited_subresources(scene,processed,flg);
|
|
|
editor_data.save_editor_external_data();
|
|
|
if (err==OK) {
|