1 /*************************************************************************/
2 /*  editor_import_plugin.cpp                                             */
3 /*************************************************************************/
4 /*                       This file is part of:                           */
5 /*                           GODOT ENGINE                                */
6 /*                      https://godotengine.org                          */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
9 /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
10 /*                                                                       */
11 /* Permission is hereby granted, free of charge, to any person obtaining */
12 /* a copy of this software and associated documentation files (the       */
13 /* "Software"), to deal in the Software without restriction, including   */
14 /* without limitation the rights to use, copy, modify, merge, publish,   */
15 /* distribute, sublicense, and/or sell copies of the Software, and to    */
16 /* permit persons to whom the Software is furnished to do so, subject to */
17 /* the following conditions:                                             */
18 /*                                                                       */
19 /* The above copyright notice and this permission notice shall be        */
20 /* included in all copies or substantial portions of the Software.       */
21 /*                                                                       */
22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
29 /*************************************************************************/
30 
31 #include "editor_import_plugin.h"
32 #include "core/script_language.h"
33 
EditorImportPlugin()34 EditorImportPlugin::EditorImportPlugin() {
35 }
36 
get_importer_name() const37 String EditorImportPlugin::get_importer_name() const {
38 	ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_importer_name")), "");
39 	return get_script_instance()->call("get_importer_name");
40 }
41 
get_visible_name() const42 String EditorImportPlugin::get_visible_name() const {
43 	ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_visible_name")), "");
44 	return get_script_instance()->call("get_visible_name");
45 }
46 
get_recognized_extensions(List<String> * p_extensions) const47 void EditorImportPlugin::get_recognized_extensions(List<String> *p_extensions) const {
48 	ERR_FAIL_COND(!(get_script_instance() && get_script_instance()->has_method("get_recognized_extensions")));
49 	Array extensions = get_script_instance()->call("get_recognized_extensions");
50 	for (int i = 0; i < extensions.size(); i++) {
51 		p_extensions->push_back(extensions[i]);
52 	}
53 }
54 
get_preset_name(int p_idx) const55 String EditorImportPlugin::get_preset_name(int p_idx) const {
56 	ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_preset_name")), "");
57 	return get_script_instance()->call("get_preset_name", p_idx);
58 }
59 
get_preset_count() const60 int EditorImportPlugin::get_preset_count() const {
61 	ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_preset_count")), 0);
62 	return get_script_instance()->call("get_preset_count");
63 }
64 
get_save_extension() const65 String EditorImportPlugin::get_save_extension() const {
66 	ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_save_extension")), "");
67 	return get_script_instance()->call("get_save_extension");
68 }
69 
get_resource_type() const70 String EditorImportPlugin::get_resource_type() const {
71 	ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_resource_type")), "");
72 	return get_script_instance()->call("get_resource_type");
73 }
74 
get_priority() const75 float EditorImportPlugin::get_priority() const {
76 	if (!(get_script_instance() && get_script_instance()->has_method("get_priority"))) {
77 		return ResourceImporter::get_priority();
78 	}
79 	return get_script_instance()->call("get_priority");
80 }
81 
get_import_order() const82 int EditorImportPlugin::get_import_order() const {
83 	if (!(get_script_instance() && get_script_instance()->has_method("get_import_order"))) {
84 		return ResourceImporter::get_import_order();
85 	}
86 	return get_script_instance()->call("get_import_order");
87 }
88 
get_import_options(List<ResourceImporter::ImportOption> * r_options,int p_preset) const89 void EditorImportPlugin::get_import_options(List<ResourceImporter::ImportOption> *r_options, int p_preset) const {
90 
91 	ERR_FAIL_COND(!(get_script_instance() && get_script_instance()->has_method("get_import_options")));
92 	Array needed;
93 	needed.push_back("name");
94 	needed.push_back("default_value");
95 	Array options = get_script_instance()->call("get_import_options", p_preset);
96 	for (int i = 0; i < options.size(); i++) {
97 		Dictionary d = options[i];
98 		ERR_FAIL_COND(!d.has_all(needed));
99 		String name = d["name"];
100 		Variant default_value = d["default_value"];
101 
102 		PropertyHint hint = PROPERTY_HINT_NONE;
103 		if (d.has("property_hint")) {
104 			hint = (PropertyHint)d["property_hint"].operator int64_t();
105 		}
106 
107 		String hint_string;
108 		if (d.has("hint_string")) {
109 			hint_string = d["hint_string"];
110 		}
111 
112 		uint32_t usage = PROPERTY_USAGE_DEFAULT;
113 		if (d.has("usage")) {
114 			usage = d["usage"];
115 		}
116 
117 		ImportOption option(PropertyInfo(default_value.get_type(), name, hint, hint_string, usage), default_value);
118 		r_options->push_back(option);
119 	}
120 }
121 
get_option_visibility(const String & p_option,const Map<StringName,Variant> & p_options) const122 bool EditorImportPlugin::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const {
123 	ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_option_visibility")), true);
124 	Dictionary d;
125 	Map<StringName, Variant>::Element *E = p_options.front();
126 	while (E) {
127 		d[E->key()] = E->get();
128 		E = E->next();
129 	}
130 	return get_script_instance()->call("get_option_visibility", p_option, d);
131 }
132 
import(const String & p_source_file,const String & p_save_path,const Map<StringName,Variant> & p_options,List<String> * r_platform_variants,List<String> * r_gen_files,Variant * r_metadata)133 Error EditorImportPlugin::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
134 
135 	ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("import")), ERR_UNAVAILABLE);
136 	Dictionary options;
137 	Array platform_variants, gen_files;
138 
139 	Map<StringName, Variant>::Element *E = p_options.front();
140 	while (E) {
141 		options[E->key()] = E->get();
142 		E = E->next();
143 	}
144 	Error err = (Error)get_script_instance()->call("import", p_source_file, p_save_path, options, platform_variants, gen_files).operator int64_t();
145 
146 	for (int i = 0; i < platform_variants.size(); i++) {
147 		r_platform_variants->push_back(platform_variants[i]);
148 	}
149 	for (int i = 0; i < gen_files.size(); i++) {
150 		r_gen_files->push_back(gen_files[i]);
151 	}
152 	return err;
153 }
154 
_bind_methods()155 void EditorImportPlugin::_bind_methods() {
156 
157 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_importer_name"));
158 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_visible_name"));
159 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "get_preset_count"));
160 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_preset_name", PropertyInfo(Variant::INT, "preset")));
161 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::ARRAY, "get_recognized_extensions"));
162 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::ARRAY, "get_import_options", PropertyInfo(Variant::INT, "preset")));
163 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_save_extension"));
164 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_resource_type"));
165 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::REAL, "get_priority"));
166 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "get_import_order"));
167 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "get_option_visibility", PropertyInfo(Variant::STRING, "option"), PropertyInfo(Variant::DICTIONARY, "options")));
168 	ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "import", PropertyInfo(Variant::STRING, "source_file"), PropertyInfo(Variant::STRING, "save_path"), PropertyInfo(Variant::DICTIONARY, "options"), PropertyInfo(Variant::ARRAY, "platform_variants"), PropertyInfo(Variant::ARRAY, "gen_files")));
169 }
170