diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/editor/editor_import_export.cpp | 21 | ||||
-rw-r--r-- | tools/editor/editor_import_export.h | 5 | ||||
-rw-r--r-- | tools/editor/editor_node.cpp | 2 | ||||
-rw-r--r-- | tools/editor/io_plugins/editor_export_scene.cpp | 112 | ||||
-rw-r--r-- | tools/editor/io_plugins/editor_export_scene.h | 16 | ||||
-rw-r--r-- | tools/editor/project_export.cpp | 10 | ||||
-rw-r--r-- | tools/editor/project_export.h | 1 |
7 files changed, 167 insertions, 0 deletions
diff --git a/tools/editor/editor_import_export.cpp b/tools/editor/editor_import_export.cpp index f52c6e67a2..a4906c1b3a 100644 --- a/tools/editor/editor_import_export.cpp +++ b/tools/editor/editor_import_export.cpp @@ -1562,6 +1562,17 @@ void EditorImportExport::image_export_get_images_in_group(const StringName& p_gr } } +void EditorImportExport::set_convert_text_scenes(bool p_convert) { + + convert_text_scenes=p_convert; +} + +bool EditorImportExport::get_convert_text_scenes() const{ + + return convert_text_scenes; +} + + void EditorImportExport::load_config() { Ref<ConfigFile> cf = memnew( ConfigFile ); @@ -1604,6 +1615,12 @@ void EditorImportExport::load_config() { } } + if (cf->has_section("convert_scenes")) { + + convert_text_scenes = cf->get_value("convert_scenes","convert_text_scenes"); + } + + if (cf->has_section("export_filter_files")) { @@ -1837,6 +1854,8 @@ void EditorImportExport::save_config() { case SCRIPT_ACTION_ENCRYPT: cf->set_value("script","action","encrypt"); break; } + cf->set_value("convert_scenes","convert_text_scenes",convert_text_scenes); + cf->set_value("script","encrypt_key",script_key); switch(sample_action) { @@ -1935,6 +1954,8 @@ EditorImportExport::EditorImportExport() { sample_action_max_hz=44100; sample_action_trim=false; + convert_text_scenes=true; + } diff --git a/tools/editor/editor_import_export.h b/tools/editor/editor_import_export.h index 1a3171e66b..e3ef3a592c 100644 --- a/tools/editor/editor_import_export.h +++ b/tools/editor/editor_import_export.h @@ -284,6 +284,8 @@ protected: int sample_action_max_hz; bool sample_action_trim; + bool convert_text_scenes; + static EditorImportExport* singleton; static void _bind_methods(); @@ -362,6 +364,9 @@ public: void sample_set_trim(bool p_trim); bool sample_get_trim() const; + void set_convert_text_scenes(bool p_convert); + bool get_convert_text_scenes() const; + void load_config(); void save_config(); diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp index 7b96db56f2..b63dc9556e 100644 --- a/tools/editor/editor_node.cpp +++ b/tools/editor/editor_node.cpp @@ -102,6 +102,7 @@ #include "tools/editor/io_plugins/editor_sample_import_plugin.h" #include "tools/editor/io_plugins/editor_translation_import_plugin.h" #include "tools/editor/io_plugins/editor_mesh_import_plugin.h" +#include "tools/editor/io_plugins/editor_export_scene.h" #include "plugins/editor_preview_plugins.h" @@ -5684,6 +5685,7 @@ EditorNode::EditorNode() { editor_import_export->add_export_plugin( Ref<EditorTextureExportPlugin>( memnew(EditorTextureExportPlugin))); editor_import_export->add_export_plugin( Ref<EditorSampleExportPlugin>( memnew(EditorSampleExportPlugin))); + editor_import_export->add_export_plugin( Ref<EditorSceneExportPlugin>( memnew(EditorSceneExportPlugin))); add_editor_plugin( memnew( CanvasItemEditorPlugin(this) ) ); add_editor_plugin( memnew( SpatialEditorPlugin(this) ) ); diff --git a/tools/editor/io_plugins/editor_export_scene.cpp b/tools/editor/io_plugins/editor_export_scene.cpp new file mode 100644 index 0000000000..cd5c34e53b --- /dev/null +++ b/tools/editor/io_plugins/editor_export_scene.cpp @@ -0,0 +1,112 @@ +#include "editor_export_scene.h" +#include "io/resource_loader.h" +#include "io/resource_saver.h" +#include "os/dir_access.h" +#include "os/file_access.h" +#include "tools/editor/editor_settings.h" +#include "scene/resources/packed_scene.h" +#include "globals.h" + +Vector<uint8_t> EditorSceneExportPlugin::custom_export(String& p_path,const Ref<EditorExportPlatform> &p_platform) { + + if (!EditorImportExport::get_singleton()->get_convert_text_scenes()) { + return Vector<uint8_t>(); + } + + + String extension = p_path.extension(); + + //step 1 check if scene + + if (extension=="xml" || extension=="xres") { + + String type = ResourceLoader::get_resource_type(p_path); + + if (type!="PackedScene") + return Vector<uint8_t>(); + + } else if (extension!="tscn" && extension!="xscn") { + return Vector<uint8_t>(); + } + + //step 2 check if cached + + uint64_t sd=0; + String smd5; + String gp = Globals::get_singleton()->globalize_path(p_path); + String md5=gp.md5_text(); + String tmp_path = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp/"); + + bool valid=false; + { + //if existing, make sure it's valid + FileAccessRef f = FileAccess::open(tmp_path+"scnexp-"+md5+".txt",FileAccess::READ); + if (f) { + + uint64_t d = f->get_line().strip_edges().to_int64(); + sd = FileAccess::get_modified_time(p_path); + + if (d==sd) { + valid=true; + } else { + String cmd5 = f->get_line().strip_edges(); + smd5 = FileAccess::get_md5(p_path); + if (cmd5==smd5) { + valid=true; + } + } + + + } + } + + if (!valid) { + //cache failed, convert + DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + + String copy = p_path+".convert."+extension; + + // a copy will allow loading the internal resources without conflicting with opened scenes + da->copy(p_path,copy); + + //@todo for tscn use something more efficient + + Ref<PackedScene> copyres = ResourceLoader::load(copy,"PackedScene"); + + da->remove(copy); + + memdelete(da); + + ERR_FAIL_COND_V(!copyres.is_valid(),Vector<uint8_t>()); + + Error err = ResourceSaver::save(tmp_path+"scnexp-"+md5+".scn",copyres); + + copyres=Ref<PackedScene>(); + + ERR_FAIL_COND_V(err!=OK,Vector<uint8_t>()); + + FileAccessRef f = FileAccess::open(tmp_path+"scnexp-"+md5+".txt",FileAccess::WRITE); + + if (sd==0) + sd = FileAccess::get_modified_time(p_path); + if (smd5==String()) + smd5 = FileAccess::get_md5(p_path); + + f->store_line(String::num(sd)); + f->store_line(smd5); + f->store_line(gp); //source path for reference + } + + + Vector<uint8_t> ret = FileAccess::get_file_as_array(tmp_path+"scnexp-"+md5+".scn"); + + p_path+=".optimized.scn"; + + return ret; + +} + + +EditorSceneExportPlugin::EditorSceneExportPlugin() +{ +} diff --git a/tools/editor/io_plugins/editor_export_scene.h b/tools/editor/io_plugins/editor_export_scene.h new file mode 100644 index 0000000000..134da6c234 --- /dev/null +++ b/tools/editor/io_plugins/editor_export_scene.h @@ -0,0 +1,16 @@ +#ifndef EDITOR_EXPORT_SCENE_H +#define EDITOR_EXPORT_SCENE_H + +#include "tools/editor/editor_import_export.h" + + +class EditorSceneExportPlugin : public EditorExportPlugin { + OBJ_TYPE( EditorSceneExportPlugin, EditorExportPlugin ); +public: + + virtual Vector<uint8_t> custom_export(String& p_path,const Ref<EditorExportPlatform> &p_platform); + + EditorSceneExportPlugin(); +}; + +#endif // EDITOR_EXPORT_SCENE_H diff --git a/tools/editor/project_export.cpp b/tools/editor/project_export.cpp index 3464b3c9bb..b288439b74 100644 --- a/tools/editor/project_export.cpp +++ b/tools/editor/project_export.cpp @@ -297,6 +297,7 @@ void ProjectExportDialog::_notification(int p_what) { // _rescan(); _update_platform(); export_mode->select( EditorImportExport::get_singleton()->get_export_filter() ); + convert_text_scenes->set_pressed( EditorImportExport::get_singleton()->get_convert_text_scenes() ); filters->set_text( EditorImportExport::get_singleton()->get_export_custom_filter() ); if (EditorImportExport::get_singleton()->get_export_filter()!=EditorImportExport::EXPORT_SELECTED) tree_vb->hide(); @@ -420,6 +421,8 @@ void ProjectExportDialog::_export_mode_changed(int p_idx) { else tree_vb->show(); + EditorImportExport::get_singleton()->set_convert_text_scenes( convert_text_scenes->is_pressed() ); + _save_export_cfg(); } @@ -1137,6 +1140,7 @@ ProjectExportDialog::ProjectExportDialog(EditorNode *p_editor) { vb = memnew( VBoxContainer ); vb->set_name("Resources"); sections->add_child(vb); + export_mode = memnew( OptionButton ); export_mode->add_item("Export selected resources (including dependencies)."); export_mode->add_item("Export all resources in the project."); @@ -1145,6 +1149,8 @@ ProjectExportDialog::ProjectExportDialog(EditorNode *p_editor) { vb->add_margin_child("Export Mode:",export_mode); + + tree_vb = memnew( VBoxContainer ); vb->add_child(tree_vb); tree_vb->set_v_size_flags(SIZE_EXPAND_FILL); @@ -1165,6 +1171,10 @@ ProjectExportDialog::ProjectExportDialog(EditorNode *p_editor) { vb->add_margin_child("Filters to export non-resource files (Comma Separated, ie: *.json, *.txt):",filters); filters->connect("text_changed",this,"_filters_edited"); + convert_text_scenes = memnew( CheckButton ); + convert_text_scenes->set_text("Convert text scenes to binary on export"); + vb->add_child(convert_text_scenes); + convert_text_scenes->connect("toggled",this,"_export_mode_changed"); image_vb = memnew( VBoxContainer ); image_vb->set_name("Images"); diff --git a/tools/editor/project_export.h b/tools/editor/project_export.h index 2f824e5ff7..09c8f10206 100644 --- a/tools/editor/project_export.h +++ b/tools/editor/project_export.h @@ -108,6 +108,7 @@ private: PropertyEditor *platform_options; OptionButton *export_mode; + CheckButton *convert_text_scenes; VBoxContainer *tree_vb; VBoxContainer *image_vb; |