diff options
46 files changed, 1400 insertions, 591 deletions
@@ -1,4 +1,4 @@ -[](https://godotengine.org) +[](https://godotengine.org) ## Godot Engine diff --git a/core/global_constants.cpp b/core/global_constants.cpp index 3098df421a..18f34b5d37 100644 --- a/core/global_constants.cpp +++ b/core/global_constants.cpp @@ -506,21 +506,21 @@ static _GlobalConstant _global_constants[] = { { "TYPE_TRANSFORM2D", Variant::TRANSFORM2D }, { "TYPE_PLANE", Variant::PLANE }, { "TYPE_QUAT", Variant::QUAT }, // 10 - { "TYPE_RECT3", Variant::RECT3 }, //sorry naming convention fail :( not like it's used often + { "TYPE_RECT3", Variant::RECT3 }, { "TYPE_BASIS", Variant::BASIS }, { "TYPE_TRANSFORM", Variant::TRANSFORM }, { "TYPE_COLOR", Variant::COLOR }, - { "TYPE_NODE_PATH", Variant::NODE_PATH }, + { "TYPE_NODE_PATH", Variant::NODE_PATH }, // 15 { "TYPE_RID", Variant::_RID }, { "TYPE_OBJECT", Variant::OBJECT }, { "TYPE_INPUT_EVENT", Variant::INPUT_EVENT }, - { "TYPE_DICTIONARY", Variant::DICTIONARY }, // 20 - { "TYPE_ARRAY", Variant::ARRAY }, + { "TYPE_DICTIONARY", Variant::DICTIONARY }, + { "TYPE_ARRAY", Variant::ARRAY }, // 20 { "TYPE_RAW_ARRAY", Variant::POOL_BYTE_ARRAY }, { "TYPE_INT_ARRAY", Variant::POOL_INT_ARRAY }, { "TYPE_REAL_ARRAY", Variant::POOL_REAL_ARRAY }, - { "TYPE_STRING_ARRAY", Variant::POOL_STRING_ARRAY }, // 25 - { "TYPE_VECTOR2_ARRAY", Variant::POOL_VECTOR2_ARRAY }, + { "TYPE_STRING_ARRAY", Variant::POOL_STRING_ARRAY }, + { "TYPE_VECTOR2_ARRAY", Variant::POOL_VECTOR2_ARRAY }, // 25 { "TYPE_VECTOR3_ARRAY", Variant::POOL_VECTOR3_ARRAY }, { "TYPE_COLOR_ARRAY", Variant::POOL_COLOR_ARRAY }, { "TYPE_MAX", Variant::VARIANT_MAX }, diff --git a/core/image.cpp b/core/image.cpp index a490c06275..85ca63be5e 100644 --- a/core/image.cpp +++ b/core/image.cpp @@ -1960,7 +1960,7 @@ void Image::_bind_methods() { ClassDB::bind_method(D_METHOD("get_mipmap_offset", "mipmap"), &Image::get_mipmap_offset); ClassDB::bind_method(D_METHOD("resize_to_po2", "square"), &Image::resize_to_po2, DEFVAL("false")); - ClassDB::bind_method(D_METHOD("resize", "width", "height", "interpolation"), &Image::resize_to_po2, DEFVAL(INTERPOLATE_BILINEAR)); + ClassDB::bind_method(D_METHOD("resize", "width", "height", "interpolation"), &Image::resize, DEFVAL(INTERPOLATE_BILINEAR)); ClassDB::bind_method(D_METHOD("shrink_x2"), &Image::shrink_x2); ClassDB::bind_method(D_METHOD("expand_x2_hq2x"), &Image::expand_x2_hq2x); diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index d6e2925d57..4ad3d261b2 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -49,7 +49,7 @@ enum { VARIANT_VECTOR3 = 12, VARIANT_PLANE = 13, VARIANT_QUAT = 14, - VARIANT_AABB = 15, + VARIANT_RECT3 = 15, VARIANT_MATRIX3 = 16, VARIANT_TRANSFORM = 17, VARIANT_MATRIX32 = 18, @@ -188,7 +188,7 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) { r_v = v; } break; - case VARIANT_AABB: { + case VARIANT_RECT3: { Rect3 v; v.pos.x = f->get_real(); @@ -1332,7 +1332,7 @@ void ResourceFormatSaverBinaryInstance::write_variant(const Variant &p_property, } break; case Variant::RECT3: { - f->store_32(VARIANT_AABB); + f->store_32(VARIANT_RECT3); Rect3 val = p_property; f->store_real(val.pos.x); f->store_real(val.pos.y); diff --git a/core/message_queue.cpp b/core/message_queue.cpp index fa1c8112cc..d7d31b6c1e 100644 --- a/core/message_queue.cpp +++ b/core/message_queue.cpp @@ -318,12 +318,19 @@ void MessageQueue::flush() { while (read_pos < buffer_end) { - _THREAD_SAFE_UNLOCK_ - //lock on each interation, so a call can re-add itself to the message queue Message *message = (Message *)&buffer[read_pos]; + uint32_t advance = sizeof(Message); + if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) + advance += sizeof(Variant) * message->args; + + //pre-advance so this function is reentrant + read_pos += advance; + + _THREAD_SAFE_UNLOCK_ + Object *target = ObjectDB::get_instance(message->instance_ID); if (target != NULL) { @@ -359,13 +366,9 @@ void MessageQueue::flush() { } } - uint32_t advance = sizeof(Message); - if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) - advance += sizeof(Variant) * message->args; message->~Message(); _THREAD_SAFE_LOCK_ - read_pos += advance; } buffer_end = 0; // reset buffer diff --git a/core/ring_buffer.h b/core/ring_buffer.h index d5085e9560..8b32bb5e10 100644 --- a/core/ring_buffer.h +++ b/core/ring_buffer.h @@ -101,6 +101,32 @@ public: return p_size; }; + int find(const T &t, int p_offset, int p_max_size) { + + int left = data_left(); + if ((p_offset + p_max_size) > left) { + p_max_size -= left - p_offset; + if (p_max_size <= 0) + return 0; + } + p_max_size = MIN(left, p_max_size); + int pos = read_pos; + inc(pos, p_offset); + int to_read = p_max_size; + while (to_read) { + int end = pos + to_read; + end = MIN(end, size()); + int total = end - pos; + for (int i = 0; i < total; i++) { + if (data[pos + i] == t) + return i + (p_max_size - to_read); + }; + to_read -= total; + pos = 0; + } + return -1; + } + inline int advance_read(int p_n) { p_n = MIN(p_n, data_left()); inc(read_pos, p_n); diff --git a/core/variant.h b/core/variant.h index 021f1d0144..76097dfbdd 100644 --- a/core/variant.h +++ b/core/variant.h @@ -91,13 +91,13 @@ public: TRANSFORM2D, PLANE, QUAT, // 10 - RECT3, //sorry naming convention fail :( not like it's used often + RECT3, BASIS, TRANSFORM, // misc types COLOR, - NODE_PATH, + NODE_PATH, // 15 _RID, OBJECT, INPUT_EVENT, diff --git a/core/variant_op.cpp b/core/variant_op.cpp index 1de46a07eb..8bae6a168b 100644 --- a/core/variant_op.cpp +++ b/core/variant_op.cpp @@ -1303,7 +1303,7 @@ void Variant::set(const Variant &p_index, const Variant &p_value, bool *r_valid) } } - } break; + } break; // 10 case RECT3: { if (p_value.type != Variant::VECTOR3) @@ -1328,7 +1328,7 @@ void Variant::set(const Variant &p_index, const Variant &p_value, bool *r_valid) return; } } - } break; //sorry naming convention fail :( not like it's used often // 10 + } break; case BASIS: { if (p_value.type != Variant::VECTOR3) @@ -1896,13 +1896,13 @@ void Variant::set(const Variant &p_index, const Variant &p_value, bool *r_valid) dic->operator[](p_index) = p_value; valid = true; //always valid, i guess? should this really be ok? return; - } break; // 20 - DEFAULT_OP_ARRAY_CMD(ARRAY, Array, ;, (*arr)[index] = p_value; return ) + } break; + DEFAULT_OP_ARRAY_CMD(ARRAY, Array, ;, (*arr)[index] = p_value; return ) // 20 DEFAULT_OP_DVECTOR_SET(POOL_BYTE_ARRAY, uint8_t, p_value.type != Variant::REAL && p_value.type != Variant::INT) DEFAULT_OP_DVECTOR_SET(POOL_INT_ARRAY, int, p_value.type != Variant::REAL && p_value.type != Variant::INT) DEFAULT_OP_DVECTOR_SET(POOL_REAL_ARRAY, real_t, p_value.type != Variant::REAL && p_value.type != Variant::INT) - DEFAULT_OP_DVECTOR_SET(POOL_STRING_ARRAY, String, p_value.type != Variant::STRING) // 25 - DEFAULT_OP_DVECTOR_SET(POOL_VECTOR2_ARRAY, Vector2, p_value.type != Variant::VECTOR2) + DEFAULT_OP_DVECTOR_SET(POOL_STRING_ARRAY, String, p_value.type != Variant::STRING) + DEFAULT_OP_DVECTOR_SET(POOL_VECTOR2_ARRAY, Vector2, p_value.type != Variant::VECTOR2) // 25 DEFAULT_OP_DVECTOR_SET(POOL_VECTOR3_ARRAY, Vector3, p_value.type != Variant::VECTOR3) DEFAULT_OP_DVECTOR_SET(POOL_COLOR_ARRAY, Color, p_value.type != Variant::COLOR) default: return; @@ -2103,7 +2103,7 @@ Variant Variant::get(const Variant &p_index, bool *r_valid) const { } } - } break; + } break; // 10 case RECT3: { if (p_index.get_type() == Variant::STRING) { @@ -2122,7 +2122,7 @@ Variant Variant::get(const Variant &p_index, bool *r_valid) const { return v->size + v->pos; } } - } break; //sorry naming convention fail :( not like it's used often // 10 + } break; case BASIS: { if (p_index.get_type() == Variant::INT || p_index.get_type() == Variant::REAL) { @@ -2498,13 +2498,13 @@ Variant Variant::get(const Variant &p_index, bool *r_valid) const { valid = true; return *res; } - } break; // 20 - DEFAULT_OP_ARRAY_CMD(ARRAY, const Array, ;, return (*arr)[index]) + } break; + DEFAULT_OP_ARRAY_CMD(ARRAY, const Array, ;, return (*arr)[index]) // 20 DEFAULT_OP_DVECTOR_GET(POOL_BYTE_ARRAY, uint8_t) DEFAULT_OP_DVECTOR_GET(POOL_INT_ARRAY, int) DEFAULT_OP_DVECTOR_GET(POOL_REAL_ARRAY, real_t) DEFAULT_OP_DVECTOR_GET(POOL_STRING_ARRAY, String) - DEFAULT_OP_DVECTOR_GET(POOL_VECTOR2_ARRAY, Vector2) + DEFAULT_OP_DVECTOR_GET(POOL_VECTOR2_ARRAY, Vector2) // 25 DEFAULT_OP_DVECTOR_GET(POOL_VECTOR3_ARRAY, Vector3) DEFAULT_OP_DVECTOR_GET(POOL_COLOR_ARRAY, Color) default: return Variant(); @@ -2768,12 +2768,12 @@ void Variant::get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::REAL, "z")); p_list->push_back(PropertyInfo(Variant::REAL, "w")); - } break; + } break; // 10 case RECT3: { p_list->push_back(PropertyInfo(Variant::VECTOR3, "pos")); p_list->push_back(PropertyInfo(Variant::VECTOR3, "size")); p_list->push_back(PropertyInfo(Variant::VECTOR3, "end")); - } break; //sorry naming convention fail :( not like it's used often // 10 + } break; case BASIS: { p_list->push_back(PropertyInfo(Variant::VECTOR3, "x")); @@ -2921,12 +2921,13 @@ void Variant::get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::STRING, E->get())); } } - } break; // 20 - case ARRAY: + } break; + case ARRAY: // 20 case POOL_BYTE_ARRAY: case POOL_INT_ARRAY: case POOL_REAL_ARRAY: case POOL_STRING_ARRAY: + case POOL_VECTOR2_ARRAY: // 25 case POOL_VECTOR3_ARRAY: case POOL_COLOR_ARRAY: { diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp index f650e5f833..798a830dd0 100644 --- a/core/variant_parser.cpp +++ b/core/variant_parser.cpp @@ -504,39 +504,7 @@ Error VariantParser::parse_value(Token &token, Variant &value, Stream *p_stream, return OK; } else if (token.type == TK_IDENTIFIER) { - /* - VECTOR2, // 5 - RECT2, - VECTOR3, - MATRIX32, - PLANE, - QUAT, // 10 - _AABB, //sorry naming convention fail :( not like it's used often - MATRIX3, - TRANSFORM, - // misc types - COLOR, - IMAGE, // 15 - NODE_PATH, - _RID, - OBJECT, - INPUT_EVENT, - DICTIONARY, // 20 - ARRAY, - - // arrays - RAW_ARRAY, - INT_ARRAY, - REAL_ARRAY, - STRING_ARRAY, // 25 - VECTOR2_ARRAY, - VECTOR3_ARRAY, - COLOR_ARRAY, - - VARIANT_MAX - -*/ String id = token.value; if (id == "true") value = true; @@ -1243,40 +1211,6 @@ Error VariantParser::parse_value(Token &token, Variant &value, Stream *p_stream, return ERR_PARSE_ERROR; } - /* - VECTOR2, // 5 - RECT2, - VECTOR3, - MATRIX32, - PLANE, - QUAT, // 10 - _AABB, //sorry naming convention fail :( not like it's used often - MATRIX3, - TRANSFORM, - - // misc types - COLOR, - IMAGE, // 15 - NODE_PATH, - _RID, - OBJECT, - INPUT_EVENT, - DICTIONARY, // 20 - ARRAY, - - // arrays - RAW_ARRAY, - INT_ARRAY, - REAL_ARRAY, - STRING_ARRAY, // 25 - VECTOR2_ARRAY, - VECTOR3_ARRAY, - COLOR_ARRAY, - - VARIANT_MAX - - */ - return OK; } else if (token.type == TK_NUMBER) { diff --git a/doc/base/classes.xml b/doc/base/classes.xml index b50590c105..af0a494a84 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -15433,6 +15433,10 @@ <method name="is_valid" qualifiers="const"> <return type="bool"> </return> + <argument index="0" name="extended_check" type="bool" default="false"> + If true, also check if the associated script and object still exists. + The extended check is done in debug mode as part of [method GDFunctionState.resume], but you can use this if you know you may be trying to resume without knowing for sure the object and/or script have survived up to that point. + </argument> <description> Check whether the function call may be resumed. This is not the case if the function state was already resumed. </description> diff --git a/drivers/gles3/shader_compiler_gles3.cpp b/drivers/gles3/shader_compiler_gles3.cpp index 89b056df84..23bcb79b46 100644 --- a/drivers/gles3/shader_compiler_gles3.cpp +++ b/drivers/gles3/shader_compiler_gles3.cpp @@ -383,7 +383,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener String vcode; vcode += _prestr(E->get().precission); vcode += _typestr(E->get().type); - vcode += " " + String(E->key()); + vcode += " " + _mkid(E->key()); vcode += ";\n"; r_gen_code.vertex_global += "out " + vcode; r_gen_code.fragment_global += "in " + vcode; diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp index aea1c231aa..75d8721756 100644 --- a/editor/doc/doc_data.cpp +++ b/editor/doc/doc_data.cpp @@ -295,8 +295,8 @@ void DocData::generate(bool p_basic_types) { case Variant::REAL: //keep it break; - case Variant::STRING: // 15 - case Variant::NODE_PATH: // 15 + case Variant::STRING: + case Variant::NODE_PATH: default_arg_text = "\"" + default_arg_text + "\""; break; case Variant::TRANSFORM: @@ -307,19 +307,19 @@ void DocData::generate(bool p_basic_types) { default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; - case Variant::RECT3: //sorry naming convention fail :( not like it's used often // 10 + case Variant::RECT3: case Variant::COLOR: case Variant::PLANE: case Variant::POOL_BYTE_ARRAY: case Variant::POOL_INT_ARRAY: case Variant::POOL_REAL_ARRAY: - case Variant::POOL_STRING_ARRAY: //25 + case Variant::POOL_STRING_ARRAY: case Variant::POOL_VECTOR2_ARRAY: case Variant::POOL_VECTOR3_ARRAY: case Variant::POOL_COLOR_ARRAY: default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; - case Variant::VECTOR2: // 5 + case Variant::VECTOR2: case Variant::RECT2: case Variant::VECTOR3: case Variant::QUAT: @@ -332,7 +332,7 @@ void DocData::generate(bool p_basic_types) { break; } case Variant::INPUT_EVENT: - case Variant::DICTIONARY: // 20 + case Variant::DICTIONARY: case Variant::ARRAY: case Variant::_RID: diff --git a/editor/doc/doc_dump.cpp b/editor/doc/doc_dump.cpp index d8608a00d0..10cd29b814 100644 --- a/editor/doc/doc_dump.cpp +++ b/editor/doc/doc_dump.cpp @@ -165,8 +165,8 @@ void DocDump::dump(const String &p_file) { case Variant::REAL: //keep it break; - case Variant::STRING: // 15 - case Variant::NODE_PATH: // 15 + case Variant::STRING: + case Variant::NODE_PATH: default_arg_text = "\"" + default_arg_text + "\""; break; case Variant::TRANSFORM: @@ -177,25 +177,25 @@ void DocDump::dump(const String &p_file) { default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; - case Variant::VECTOR2: // 5 + case Variant::VECTOR2: case Variant::RECT2: case Variant::VECTOR3: case Variant::PLANE: case Variant::QUAT: - case Variant::RECT3: //sorry naming convention fail :( not like it's used often // 10 + case Variant::RECT3: case Variant::BASIS: case Variant::COLOR: case Variant::POOL_BYTE_ARRAY: case Variant::POOL_INT_ARRAY: case Variant::POOL_REAL_ARRAY: - case Variant::POOL_STRING_ARRAY: //25 + case Variant::POOL_STRING_ARRAY: case Variant::POOL_VECTOR3_ARRAY: case Variant::POOL_COLOR_ARRAY: default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; case Variant::OBJECT: case Variant::INPUT_EVENT: - case Variant::DICTIONARY: // 20 + case Variant::DICTIONARY: case Variant::ARRAY: case Variant::_RID: diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index f0152b4be2..42de85ec00 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -194,28 +194,20 @@ void EditorNode::_unhandled_input(const InputEvent &p_event) { filesystem_dock->focus_on_filter(); } - switch (p_event.key.scancode) { - - /*case KEY_F1: - if (!p_event.key.mod.shift && !p_event.key.mod.command) - _editor_select(EDITOR_SCRIPT); - break;*/ - case KEY_F1: - if (!p_event.key.mod.shift && !p_event.key.mod.command) - _editor_select(EDITOR_2D); - break; - case KEY_F2: - if (!p_event.key.mod.shift && !p_event.key.mod.command) - _editor_select(EDITOR_3D); - break; - case KEY_F3: - if (!p_event.key.mod.shift && !p_event.key.mod.command) - _editor_select(EDITOR_SCRIPT); - break; - /* case KEY_F5: _menu_option_confirm((p_event.key.mod.control&&p_event.key.mod.shift)?RUN_PLAY_CUSTOM_SCENE:RUN_PLAY,true); break; - case KEY_F6: _menu_option_confirm(RUN_PLAY_SCENE,true); break; - //case KEY_F7: _menu_option_confirm(RUN_PAUSE,true); break; - case KEY_F8: _menu_option_confirm(RUN_STOP,true); break;*/ + if (ED_IS_SHORTCUT("editor/editor_2d", p_event)) { + _editor_select(EDITOR_2D); + } else if (ED_IS_SHORTCUT("editor/editor_3d", p_event)) { + _editor_select(EDITOR_3D); + } else if (ED_IS_SHORTCUT("editor/editor_script", p_event)) { + _editor_select(EDITOR_SCRIPT); + } else if (ED_IS_SHORTCUT("editor/editor_help", p_event)) { + emit_signal("request_help_search", ""); + } else if (ED_IS_SHORTCUT("editor/editor_assetlib", p_event)) { + _editor_select(EDITOR_ASSETLIB); + } else if (ED_IS_SHORTCUT("editor/editor_next", p_event)) { + _editor_select_next(); + } else if (ED_IS_SHORTCUT("editor/editor_prev", p_event)) { + _editor_select_prev(); } } } @@ -454,6 +446,30 @@ void EditorNode::_node_renamed() { property_editor->update_tree(); } +void EditorNode::_editor_select_next() { + + int editor = _get_current_main_editor(); + + if (editor == editor_table.size() - 1) { + editor = 0; + } else { + editor++; + } + _editor_select(editor); +} + +void EditorNode::_editor_select_prev() { + + int editor = _get_current_main_editor(); + + if (editor == 0) { + editor = editor_table.size() - 1; + } else { + editor--; + } + _editor_select(editor); +} + Error EditorNode::load_resource(const String &p_scene) { RES res = ResourceLoader::load(p_scene); @@ -3566,7 +3582,7 @@ bool EditorNode::is_scene_in_use(const String &p_path) { void EditorNode::register_editor_types() { ClassDB::register_class<EditorPlugin>(); - // ClassDB::register_class<EditorImportPlugin>(); + ClassDB::register_class<EditorImportPlugin>(); // ClassDB::register_class<EditorExportPlugin>(); // ClassDB::register_class<EditorScenePostImport>(); ClassDB::register_class<EditorScript>(); @@ -4796,6 +4812,7 @@ void EditorNode::_bind_methods() { ADD_SIGNAL(MethodInfo("pause_pressed")); ADD_SIGNAL(MethodInfo("stop_pressed")); ADD_SIGNAL(MethodInfo("request_help")); + ADD_SIGNAL(MethodInfo("request_help_search")); ADD_SIGNAL(MethodInfo("script_add_function_request", PropertyInfo(Variant::OBJECT, "obj"), PropertyInfo(Variant::STRING, "function"), PropertyInfo(Variant::POOL_STRING_ARRAY, "args"))); ADD_SIGNAL(MethodInfo("resource_saved", PropertyInfo(Variant::OBJECT, "obj"))); } @@ -6112,6 +6129,14 @@ EditorNode::EditorNode() { _dim_timer->set_wait_time(0.01666f); _dim_timer->connect("timeout", this, "_dim_timeout"); add_child(_dim_timer); + + ED_SHORTCUT("editor/editor_2d", TTR("Open 2D Editor"), KEY_F2); + ED_SHORTCUT("editor/editor_3d", TTR("Open 3D Editor"), KEY_F3); + ED_SHORTCUT("editor/editor_script", TTR("Open Script Editor"), KEY_F4); + ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_F1); + ED_SHORTCUT("editor/editor_assetlib", TTR("Open Asset Library")); + ED_SHORTCUT("editor/editor_next", TTR("Open the next Editor")); + ED_SHORTCUT("editor/editor_prev", TTR("Open the previous Editor")); } EditorNode::~EditorNode() { diff --git a/editor/editor_node.h b/editor/editor_node.h index fc107bb505..92df04f423 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -440,6 +440,8 @@ private: void _imported(Node *p_node); void _node_renamed(); + void _editor_select_next(); + void _editor_select_prev(); void _editor_select(int p_which); void _set_scene_metadata(const String &p_file, int p_idx = -1); void _get_scene_metadata(const String &p_file); @@ -618,7 +620,8 @@ public: enum EditorTable { EDITOR_2D = 0, EDITOR_3D, - EDITOR_SCRIPT + EDITOR_SCRIPT, + EDITOR_ASSETLIB }; void set_visible_editor(EditorTable p_table) { _editor_select(p_table); } diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index 405784a7e2..5e5b31aac9 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -276,6 +276,11 @@ bool EditorPlugin::get_remove_list(List<Node *> *p_list) { void EditorPlugin::restore_global_state() {} void EditorPlugin::save_global_state() {} +void EditorPlugin::add_import_plugin(const Ref<EditorImportPlugin> &p_importer) { + ResourceFormatImporter::get_singleton()->add_importer(p_importer); + EditorFileSystem::get_singleton()->scan_changes(); +} + void EditorPlugin::set_window_layout(Ref<ConfigFile> p_layout) { if (get_script_instance() && get_script_instance()->has_method("set_window_layout")) { @@ -360,7 +365,7 @@ void EditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("get_editor_settings:EditorSettings"), &EditorPlugin::get_editor_settings); ClassDB::bind_method(D_METHOD("queue_save_layout"), &EditorPlugin::queue_save_layout); ClassDB::bind_method(D_METHOD("edit_resource"), &EditorPlugin::edit_resource); - + ClassDB::bind_method(D_METHOD("add_import_plugin"), &EditorPlugin::add_import_plugin); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_canvas_gui_input", PropertyInfo(Variant::TRANSFORM2D, "canvas_xform"), PropertyInfo(Variant::INPUT_EVENT, "event"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo("forward_draw_over_canvas", PropertyInfo(Variant::TRANSFORM2D, "canvas_xform"), PropertyInfo(Variant::OBJECT, "canvas:Control"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_spatial_gui_input", PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera"), PropertyInfo(Variant::INPUT_EVENT, "event"))); diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index 5df1f63fbe..5f4b47caee 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -30,6 +30,7 @@ #ifndef EDITOR_PLUGIN_H #define EDITOR_PLUGIN_H +#include "editor/import/editor_import_plugin.h" #include "io/config_file.h" #include "scene/gui/tool_button.h" #include "scene/main/node.h" @@ -146,6 +147,8 @@ public: virtual void restore_global_state(); virtual void save_global_state(); + void add_import_plugin(const Ref<EditorImportPlugin> &p_importer); + EditorPlugin(); virtual ~EditorPlugin(); }; diff --git a/editor/icons/2x/icon_godot.png b/editor/icons/2x/icon_godot.png Binary files differdeleted file mode 100644 index 94d87e23cc..0000000000 --- a/editor/icons/2x/icon_godot.png +++ /dev/null diff --git a/editor/icons/2x/icon_godot_docs.png b/editor/icons/2x/icon_godot_docs.png Binary files differnew file mode 100644 index 0000000000..be30f092ef --- /dev/null +++ b/editor/icons/2x/icon_godot_docs.png diff --git a/editor/icons/icon_default_project_icon.png b/editor/icons/icon_default_project_icon.png Binary files differindex e87a49bd28..4c31fe5cb2 100644 --- a/editor/icons/icon_default_project_icon.png +++ b/editor/icons/icon_default_project_icon.png diff --git a/editor/icons/icon_godot.png b/editor/icons/icon_godot.png Binary files differdeleted file mode 100644 index 0b72e6ecc7..0000000000 --- a/editor/icons/icon_godot.png +++ /dev/null diff --git a/editor/icons/icon_godot_docs.png b/editor/icons/icon_godot_docs.png Binary files differnew file mode 100644 index 0000000000..554280c5b4 --- /dev/null +++ b/editor/icons/icon_godot_docs.png diff --git a/editor/icons/icon_logo.png b/editor/icons/icon_logo.png Binary files differindex 9bbd7dc619..aed94cb87a 100644 --- a/editor/icons/icon_logo.png +++ b/editor/icons/icon_logo.png diff --git a/editor/icons/icon_logo_small.png b/editor/icons/icon_logo_small.png Binary files differindex 9c7c7fe365..809cf18541 100644 --- a/editor/icons/icon_logo_small.png +++ b/editor/icons/icon_logo_small.png diff --git a/editor/icons/source/icon_godot.svg b/editor/icons/source/icon_godot.svg deleted file mode 100644 index 419f23125b..0000000000 --- a/editor/icons/source/icon_godot.svg +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="16" - height="16" - viewBox="0 0 16 16" - id="svg2" - version="1.1" - inkscape:version="0.91 r13725" - inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - sodipodi:docname="icon_godot.svg"> - <defs - id="defs4" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="32" - inkscape:cx="9.8470361" - inkscape:cy="9.8599985" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - units="px" - inkscape:snap-bbox="true" - inkscape:bbox-paths="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="true" - inkscape:snap-bbox-midpoints="true" - inkscape:snap-object-midpoints="true" - inkscape:snap-center="true" - inkscape:window-width="1920" - inkscape:window-height="1016" - inkscape:window-x="0" - inkscape:window-y="27" - inkscape:window-maximized="1"> - <inkscape:grid - type="xygrid" - id="grid3336" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-1036.3622)"> - <g - transform="matrix(0.01724138,0,0,0.01724138,-0.82758647,1035.0456)" - id="layer1-5" - inkscape:label="Layer 1"> - <g - transform="matrix(1.0688992,0,0,1.1334985,-45.061194,-81.689066)" - id="g4149"> - <path - style="fill:#ffffff;fill-opacity:1;stroke:none" - d="m 116.99388,715.36604 43.13957,-74.51381 75.99672,-171.42666 271.088,-13.63746 282.06373,14.1696 138.45065,255.56931 -25.0756,66.96734 -376.12685,53.39482 -367.70391,-40.32222 z" - id="path3239" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccccccccc" /> - <g - id="g3412" - transform="matrix(12.995388,0,0,-12.995388,898.37246,704.73082)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 0,-3.942 c 0,-0.39 -0.25,-0.734 -0.621,-0.852 L -6.835,-6.8 c -0.273,-0.091 -0.57,-0.042 -0.8,0.128 -0.232,0.168 -0.37,0.437 -0.37,0.721 l 0,4.305 -5.818,-1.108 0,-4.381 c 0,-0.447 -0.332,-0.824 -0.775,-0.885 l -8.41,-1.152 c -0.039,-0.003 -0.081,-0.008 -0.121,-0.008 -0.214,0 -0.424,0.078 -0.588,0.22 -0.195,0.172 -0.306,0.416 -0.306,0.676 l 0,4.638 -4.341,-0.018 0,-10e-4 -0.318,10e-4 -0.319,-10e-4 0,10e-4 -4.34,0.018 0,-4.638 c 0,-0.26 -0.112,-0.504 -0.307,-0.676 -0.164,-0.142 -0.374,-0.22 -0.587,-0.22 -0.041,0 -0.082,0.005 -0.123,0.008 l -8.41,1.152 c -0.442,0.061 -0.774,0.438 -0.774,0.885 l 0,4.381 -5.819,1.108 0,-4.305 c 0,-0.284 -0.137,-0.553 -0.368,-0.721 -0.232,-0.17 -0.529,-0.219 -0.802,-0.128 l -6.215,2.006 c -0.369,0.118 -0.619,0.462 -0.619,0.852 l 0,3.942 -3.837,1.29 c -0.19,-0.811 -0.295,-1.642 -0.295,-2.481 0,-10.301 14.512,-18.252 32.448,-18.309 l 0.022,0 0.023,0 c 17.936,0.057 32.448,8.008 32.448,18.309 0,0.766 -0.088,1.521 -0.247,2.266 L 0,0 Z" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3414" /> - </g> - <g - id="g3416" - transform="matrix(12.995388,0,0,-12.995388,140.10982,467.34929)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 0,-16.047 2.163,-0.729 c 0.364,-0.122 0.61,-0.462 0.61,-0.847 l 0,-3.936 4.426,-1.428 0,4.154 c 0,0.27 0.118,0.52 0.323,0.689 0.206,0.172 0.474,0.241 0.739,0.192 l 7.608,-1.452 c 0.422,-0.079 0.728,-0.448 0.728,-0.877 l 0,-4.338 6.62,-0.904 0,4.509 c 0,0.241 0.096,0.467 0.264,0.635 0.167,0.166 0.394,0.259 0.633,0.259 l 0.002,0 5.551,-0.022 5.549,0.022 c 0.245,-10e-4 0.468,-0.093 0.635,-0.259 0.169,-0.168 0.264,-0.394 0.264,-0.635 l 0,-4.509 6.621,0.904 0,4.338 c 0,0.429 0.304,0.798 0.726,0.877 l 7.609,1.452 c 0.262,0.049 0.533,-0.02 0.738,-0.192 0.205,-0.169 0.325,-0.419 0.325,-0.689 l 0,-4.154 4.425,1.428 0,3.936 c 0,0.385 0.245,0.725 0.609,0.847 l 1.475,0.497 0,16.279 0.04,0 c 1.437,1.834 2.767,3.767 4.042,5.828 -1.694,2.883 -3.768,5.459 -5.986,7.846 -2.057,-1.035 -4.055,-2.208 -5.942,-3.456 -0.944,0.938 -2.008,1.706 -3.052,2.509 -1.027,0.824 -2.183,1.428 -3.281,2.132 0.327,2.433 0.489,4.828 0.554,7.327 -2.831,1.424 -5.85,2.369 -8.903,3.047 -1.219,-2.048 -2.334,-4.267 -3.304,-6.436 -1.152,0.192 -2.309,0.264 -3.467,0.277 l 0,0.002 c -0.008,0 -0.015,-0.002 -0.022,-0.002 -0.008,0 -0.015,0.002 -0.022,0.002 l 0,-0.002 c -1.16,-0.013 -2.316,-0.085 -3.468,-0.277 -0.97,2.169 -2.084,4.388 -3.305,6.436 C 19.475,24.555 16.456,23.61 13.626,22.186 13.69,19.687 13.852,17.292 14.18,14.859 13.081,14.155 11.925,13.551 10.898,12.727 9.855,11.924 8.79,11.156 7.846,10.218 5.958,11.466 3.961,12.639 1.904,13.674 -0.314,11.287 -2.388,8.711 -4.082,5.828 -2.807,3.767 -1.477,1.834 -0.04,0 L 0,0 Z" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3418" /> - </g> - <g - id="g3420" - transform="matrix(12.995388,0,0,-12.995388,411.4457,567.42812)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c 0,-3.611 -2.926,-6.537 -6.537,-6.537 -3.608,0 -6.535,2.926 -6.535,6.537 0,3.609 2.927,6.533 6.535,6.533 C -2.926,6.533 0,3.609 0,0" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3422" /> - </g> - <g - id="g3424" - transform="matrix(12.995388,0,0,-12.995388,391.00655,572.46636)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c 0,-2.396 -1.941,-4.337 -4.339,-4.337 -2.396,0 -4.339,1.941 -4.339,4.337 0,2.396 1.943,4.339 4.339,4.339 C -1.941,4.339 0,2.396 0,0" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3426" /> - </g> - <g - id="g3428" - transform="matrix(12.995388,0,0,-12.995388,526.30933,660.10985)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c -1.162,0 -2.104,0.856 -2.104,1.912 l 0,6.018 c 0,1.054 0.942,1.912 2.104,1.912 1.162,0 2.106,-0.858 2.106,-1.912 l 0,-6.018 C 2.106,0.856 1.162,0 0,0" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3430" /> - </g> - <g - id="g3432" - transform="matrix(12.995388,0,0,-12.995388,641.18731,567.42812)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c 0,-3.611 2.926,-6.537 6.537,-6.537 3.609,0 6.535,2.926 6.535,6.537 0,3.609 -2.926,6.533 -6.535,6.533 C 2.926,6.533 0,3.609 0,0" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3434" /> - </g> - <g - id="g3436" - transform="matrix(12.995388,0,0,-12.995388,661.63165,572.46636)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c 0,-2.396 1.941,-4.337 4.336,-4.337 2.398,0 4.339,1.941 4.339,4.337 0,2.396 -1.941,4.339 -4.339,4.339 C 1.941,4.339 0,2.396 0,0" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3438" /> - </g> - </g> - </g> - <path - style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436" - d="m 4,1041.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,1 a 2.0000174,2.0000174 0 0 1 2,2 2.0000174,2.0000174 0 0 1 -2,2 2.0000174,2.0000174 0 0 1 -2,-2 2.0000174,2.0000174 0 0 1 2,-2 z" - id="path4151" - inkscape:connector-curvature="0" /> - <path - inkscape:connector-curvature="0" - id="path4156" - d="m 12,1041.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,1 a 2.0000174,2.0000174 0 0 1 2,2 2.0000174,2.0000174 0 0 1 -2,2 2.0000174,2.0000174 0 0 1 -2,-2 2.0000174,2.0000174 0 0 1 2,-2 z" - style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436" /> - <rect - style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436" - id="rect4160" - width="4" - height="1" - x="6" - y="1043.3622" - ry="0" /> - </g> -</svg> diff --git a/editor/icons/source/icon_godot_docs.svg b/editor/icons/source/icon_godot_docs.svg new file mode 100644 index 0000000000..77aa92b31f --- /dev/null +++ b/editor/icons/source/icon_godot_docs.svg @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + viewBox="0 0 15 15" + id="svg2" + version="1.1" + inkscape:version="0.92.1 r15371" + inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + sodipodi:docname="icon_godot_docs.svg"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="22.627417" + inkscape:cx="-14.305844" + inkscape:cy="5.1981046" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + units="px" + inkscape:snap-bbox="true" + inkscape:bbox-paths="true" + inkscape:bbox-nodes="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-bbox-midpoints="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-center="true" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1"> + <inkscape:grid + type="xygrid" + id="grid3336" + originx="0" + originy="0" + spacingx="1" + spacingy="1" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-1037.3622)"> + <g + id="g78" + transform="matrix(0.06307836,0,0,-0.06307664,13.671143,1047.293)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,0 -0.325,1.994 -0.515,1.976 l -36.182,-3.491 c -2.879,-0.278 -5.115,-2.574 -5.317,-5.459 l -0.994,-14.247 -27.992,-1.997 -1.904,12.912 c -0.424,2.872 -2.932,5.037 -5.835,5.037 h -38.188 c -2.902,0 -5.41,-2.165 -5.834,-5.037 l -1.905,-12.912 -27.992,1.997 -0.994,14.247 c -0.202,2.886 -2.438,5.182 -5.317,5.46 l -36.2,3.49 c -0.187,0.018 -0.324,-1.978 -0.511,-1.978 l -0.049,-7.83 30.658,-4.944 1.004,-14.374 c 0.203,-2.91 2.551,-5.263 5.463,-5.472 l 38.551,-2.75 c 0.146,-0.01 0.29,-0.016 0.434,-0.016 2.897,0 5.401,2.166 5.825,5.038 l 1.959,13.286 h 28.005 l 1.959,-13.286 c 0.423,-2.871 2.93,-5.037 5.831,-5.037 0.142,0 0.284,0.005 0.423,0.015 l 38.556,2.75 c 2.911,0.209 5.26,2.562 5.463,5.472 l 1.003,14.374 30.645,4.966 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path80" + inkscape:connector-curvature="0" /> + </g> + <g + id="g82-3" + transform="matrix(0.06307836,0,0,-0.06307664,1.3279404,1043.5689)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 v -47.514 -6.035 -5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 h 38.188 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 v 4.711 l 0.015,0.005 V 0 h 0.134 c 4.795,6.12 9.232,12.569 13.487,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 v 0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 V 63.652 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.368,12.569 -4.928,6.12 -0.134,0 Z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path84-6" + inkscape:connector-curvature="0" /> + </g> + <g + id="g86-7" + transform="matrix(0.06307836,0,0,-0.06307664,11.62285,1047.9836)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 H -81.09 l -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 h 0.066 0.067 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path88-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g90-3" + transform="matrix(0.06307836,0,0,-0.06307664,5.6393685,1045.0806)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,-12.052 -9.765,-21.815 -21.813,-21.815 -12.042,0 -21.81,9.763 -21.81,21.815 0,12.044 9.768,21.802 21.81,21.802 C -9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path92-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g94-6" + transform="matrix(0.06307836,0,0,-0.06307664,5.3082938,1045.1623)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,-7.994 -6.479,-14.473 -14.479,-14.473 -7.996,0 -14.479,6.479 -14.479,14.473 0,7.994 6.483,14.479 14.479,14.479 C -6.479,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path96-2" + inkscape:connector-curvature="0" /> + </g> + <g + id="g98-9" + transform="matrix(0.06307836,0,0,-0.06307664,7.4998997,1046.5818)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 v 20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 V 6.381 C 7.028,2.858 3.878,0 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path100-1" + inkscape:connector-curvature="0" /> + </g> + <g + id="g102-2" + transform="matrix(0.06307836,0,0,-0.06307664,9.3606615,1045.0806)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,-12.052 9.765,-21.815 21.815,-21.815 12.041,0 21.808,9.763 21.808,21.815 0,12.044 -9.767,21.802 -21.808,21.802 C 9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path104-7" + inkscape:connector-curvature="0" /> + </g> + <g + id="g106-0" + transform="matrix(0.06307836,0,0,-0.06307664,9.6918191,1045.1623)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,-7.994 6.477,-14.473 14.471,-14.473 8.002,0 14.479,6.479 14.479,14.473 0,7.994 -6.477,14.479 -14.479,14.479 C 6.477,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path108-9" + inkscape:connector-curvature="0" /> + </g> + <path + inkscape:connector-curvature="0" + id="path4392" + d="m 4.3227149,1042.5597 a 2.5297459,2.5296773 0 0 0 -2.5297461,2.5297 2.5297459,2.5296773 0 0 0 2.5297461,2.5297 2.5297459,2.5296773 0 0 0 2.5297463,-2.5297 2.5297459,2.5296773 0 0 0 -2.5297463,-2.5297 z m 0,0.5084 a 2.0213759,2.021321 0 0 1 2.0213758,2.0213 2.0213759,2.021321 0 0 1 -2.0213758,2.0213 2.0213759,2.021321 0 0 1 -2.0213757,-2.0213 2.0213759,2.021321 0 0 1 2.0213757,-2.0213 z" + style="opacity:1;fill:#414042;fill-opacity:1;stroke:none;stroke-width:1.94780529;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4200);enable-background:new" /> + <path + style="opacity:1;fill:#414042;fill-opacity:1;stroke:none;stroke-width:1.94780529;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4200);enable-background:new" + d="m 10.679126,1042.5597 a 2.5297459,2.5296773 0 0 0 -2.5297472,2.5297 2.5297459,2.5296773 0 0 0 2.5297472,2.5297 2.5297459,2.5296773 0 0 0 2.529744,-2.5297 2.5297459,2.5296773 0 0 0 -2.529744,-2.5297 z m 0,0.5084 a 2.0213759,2.021321 0 0 1 2.021373,2.0213 2.0213759,2.021321 0 0 1 -2.021373,2.0213 2.0213759,2.021321 0 0 1 -2.0213767,-2.0213 2.0213759,2.021321 0 0 1 2.0213767,-2.0213 z" + id="path4403" + inkscape:connector-curvature="0" /> + <rect + style="opacity:1;fill:#414042;fill-opacity:1;stroke:none;stroke-width:5.625;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436" + id="rect4160" + width="2.3136585" + height="0.53352129" + x="6.3440895" + y="1043.9767" /> + </g> +</svg> diff --git a/editor/import/editor_import_plugin.cpp b/editor/import/editor_import_plugin.cpp new file mode 100644 index 0000000000..6dee5da538 --- /dev/null +++ b/editor/import/editor_import_plugin.cpp @@ -0,0 +1,152 @@ +/*************************************************************************/ +/* editor_import_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "editor_import_plugin.h" +#include "core/script_language.h" + +EditorImportPlugin::EditorImportPlugin() { +} + +String EditorImportPlugin::get_importer_name() const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_importer_name")), ""); + return get_script_instance()->call("get_importer_name"); +} + +String EditorImportPlugin::get_visible_name() const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_visible_name")), ""); + return get_script_instance()->call("get_visible_name"); +} + +void EditorImportPlugin::get_recognized_extensions(List<String> *p_extensions) const { + ERR_FAIL_COND(!(get_script_instance() && get_script_instance()->has_method("get_recognized_extensions"))); + Array extensions = get_script_instance()->call("get_recognized_extensions"); + for (int i = 0; i < extensions.size(); i++) { + p_extensions->push_back(extensions[i]); + } +} + +String EditorImportPlugin::get_preset_name(int p_idx) const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_preset_name")), ""); + return get_script_instance()->call("get_preset_name", p_idx); +} + +int EditorImportPlugin::get_preset_count() { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_preset_count")), 0); + return get_script_instance()->call("get_preset_count"); +} + +String EditorImportPlugin::get_save_extension() const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_save_extension")), ""); + return get_script_instance()->call("get_save_extension"); +} + +String EditorImportPlugin::get_resource_type() const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_resource_type")), ""); + return get_script_instance()->call("get_resource_type"); +} + +void EditorImportPlugin::get_import_options(List<ResourceImporter::ImportOption> *r_options, int p_preset) const { + + ERR_FAIL_COND(!(get_script_instance() && get_script_instance()->has_method("get_import_options"))); + Array needed; + needed.push_back("name"); + needed.push_back("default_value"); + Array options = get_script_instance()->call("get_import_options", p_preset); + for (int i = 0; i < options.size(); i++) { + Dictionary d = options[i]; + ERR_FAIL_COND(!d.has_all(needed)); + String name = d["name"]; + Variant default_value = d["default_value"]; + + PropertyHint hint = PROPERTY_HINT_NONE; + if (d.has("property_hint")) { + hint = (PropertyHint)d["property_hint"].operator int64_t(); + } + + String hint_string; + if (d.has("hint_string")) { + hint_string = d["hint_string"]; + } + + uint32_t usage = PROPERTY_USAGE_DEFAULT; + if (d.has("usage")) { + usage = d["usage"]; + } + + ImportOption option(PropertyInfo(default_value.get_type(), name, hint, hint_string, usage), default_value); + r_options->push_back(option); + } +} + +bool EditorImportPlugin::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_option_visibility")), true); + Dictionary d; + Map<StringName, Variant>::Element *E = p_options.front(); + while (E) { + d[E->key()] = E->get(); + E = E->next(); + } + return get_script_instance()->call("get_option_visibility", p_option, d); +} + +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) { + + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("import")), ERR_UNAVAILABLE); + Dictionary options; + Array platform_variants, gen_files; + + Map<StringName, Variant>::Element *E = p_options.front(); + while (E) { + options[E->key()] = E->get(); + E = E->next(); + } + Error err = (Error)get_script_instance()->call("import", p_source_file, p_save_path, options, platform_variants, gen_files).operator int64_t(); + + for (int i = 0; i < platform_variants.size(); i++) { + r_platform_variants->push_back(platform_variants[i]); + } + for (int i = 0; i < gen_files.size(); i++) { + r_gen_files->push_back(gen_files[i]); + } + return err; +} + +void EditorImportPlugin::_bind_methods() { + + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_importer_name")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_visible_name")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "get_preset_count")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_preset_name", PropertyInfo(Variant::INT, "preset"))); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::ARRAY, "get_recognized_extensions")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::ARRAY, "get_import_options", PropertyInfo(Variant::INT, "preset"))); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_save_extension")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_resource_type")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "get_option_visibility", PropertyInfo(Variant::STRING, "option"), PropertyInfo(Variant::DICTIONARY, "options"))); + 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, "r_platform_variants"), PropertyInfo(Variant::ARRAY, "r_gen_files"))); +} diff --git a/editor/import/editor_import_plugin.h b/editor/import/editor_import_plugin.h new file mode 100644 index 0000000000..3c16b79713 --- /dev/null +++ b/editor/import/editor_import_plugin.h @@ -0,0 +1,54 @@ +/*************************************************************************/ +/* editor_import_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef EDITOR_IMPORT_PLUGIN_H +#define EDITOR_IMPORT_PLUGIN_H + +#include "io/resource_import.h" + +class EditorImportPlugin : public ResourceImporter { + GDCLASS(EditorImportPlugin, Reference) +protected: + static void _bind_methods(); + +public: + EditorImportPlugin(); + virtual String get_importer_name() const; + virtual String get_visible_name() const; + virtual void get_recognized_extensions(List<String> *p_extensions) const; + virtual String get_preset_name(int p_idx) const; + virtual int get_preset_count(); + virtual String get_save_extension() const; + virtual String get_resource_type() const; + virtual void get_import_options(List<ImportOption> *r_options, int p_preset) const; + virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const; + virtual Error 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); +}; + +#endif //EDITOR_IMPORT_PLUGIN_H diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp index e00111b565..045084d2ec 100644 --- a/editor/plugins/path_2d_editor_plugin.cpp +++ b/editor/plugins/path_2d_editor_plugin.cpp @@ -81,7 +81,7 @@ bool Path2DEditor::forward_gui_input(const InputEvent &p_event) { Vector2 cpoint = !mb.mod.alt ? canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint)) : node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint))); //first check if a point is to be added (segment split) - real_t grab_treshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8); + real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8); // Test move point!! @@ -93,34 +93,57 @@ bool Path2DEditor::forward_gui_input(const InputEvent &p_event) { bool pointunder = false; - { - Point2 p = xform.xform(curve->get_point_pos(i)); - if (gpoint.distance_to(p) < grab_treshold) { + real_t dist_to_p = gpoint.distance_to(xform.xform(curve->get_point_pos(i))); + real_t dist_to_p_out = gpoint.distance_to(xform.xform(curve->get_point_pos(i) + curve->get_point_out(i))); + real_t dist_to_p_in = gpoint.distance_to(xform.xform(curve->get_point_pos(i) + curve->get_point_in(i))); - if (mb.button_index == BUTTON_LEFT && !mb.mod.shift && mode == MODE_EDIT) { + if (mb.button_index == BUTTON_LEFT && !mb.mod.shift && mode == MODE_EDIT) { + if (dist_to_p < grab_threshold) { - action = ACTION_MOVING_POINT; - action_point = i; - moving_from = curve->get_point_pos(i); - moving_screen_from = gpoint; - return true; - } else if ((mb.button_index == BUTTON_RIGHT && mode == MODE_EDIT) || (mb.button_index == BUTTON_LEFT && mode == MODE_DELETE)) { + action = ACTION_MOVING_POINT; + action_point = i; + moving_from = curve->get_point_pos(i); + moving_screen_from = gpoint; + return true; + } + } - undo_redo->create_action(TTR("Remove Point from Curve")); - undo_redo->add_do_method(curve.ptr(), "remove_point", i); - undo_redo->add_undo_method(curve.ptr(), "add_point", curve->get_point_pos(i), curve->get_point_in(i), curve->get_point_out(i), i); - undo_redo->add_do_method(canvas_item_editor->get_viewport_control(), "update"); - undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(), "update"); - undo_redo->commit_action(); - return true; - } else - pointunder = true; + if ((mb.button_index == BUTTON_RIGHT && mode == MODE_EDIT) || (mb.button_index == BUTTON_LEFT && mode == MODE_DELETE)) { + if (dist_to_p < grab_threshold) { + + undo_redo->create_action(TTR("Remove Point from Curve")); + undo_redo->add_do_method(curve.ptr(), "remove_point", i); + undo_redo->add_undo_method(curve.ptr(), "add_point", curve->get_point_pos(i), curve->get_point_in(i), curve->get_point_out(i), i); + undo_redo->add_do_method(canvas_item_editor->get_viewport_control(), "update"); + undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(), "update"); + undo_redo->commit_action(); + return true; + } else if (dist_to_p_out < grab_threshold) { + + undo_redo->create_action(TTR("Remove Out-Control from Curve")); + undo_redo->add_do_method(curve.ptr(), "set_point_out", i, Vector2()); + undo_redo->add_undo_method(curve.ptr(), "set_point_out", i, curve->get_point_out(i)); + undo_redo->add_do_method(canvas_item_editor->get_viewport_control(), "update"); + undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(), "update"); + undo_redo->commit_action(); + return true; + } else if (dist_to_p_in < grab_threshold) { + + undo_redo->create_action(TTR("Remove In-Control from Curve")); + undo_redo->add_do_method(curve.ptr(), "set_point_in", i, Vector2()); + undo_redo->add_undo_method(curve.ptr(), "set_point_in", i, curve->get_point_in(i)); + undo_redo->add_do_method(canvas_item_editor->get_viewport_control(), "update"); + undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(), "update"); + undo_redo->commit_action(); + return true; } } + if (dist_to_p < grab_threshold) + pointunder = true; + if (mb.button_index == BUTTON_LEFT && i < (curve->get_point_count() - 1)) { - Point2 p = xform.xform(curve->get_point_pos(i) + curve->get_point_out(i)); - if (gpoint.distance_to(p) < grab_treshold && (mode == MODE_EDIT || mode == MODE_EDIT_CURVE)) { + if (dist_to_p_out < grab_threshold && (mode == MODE_EDIT || mode == MODE_EDIT_CURVE)) { action = ACTION_MOVING_OUT; action_point = i; @@ -131,8 +154,7 @@ bool Path2DEditor::forward_gui_input(const InputEvent &p_event) { } if (mb.button_index == BUTTON_LEFT && i > 0) { - Point2 p = xform.xform(curve->get_point_pos(i) + curve->get_point_in(i)); - if (gpoint.distance_to(p) < grab_treshold && (mode == MODE_EDIT || mode == MODE_EDIT_CURVE)) { + if (dist_to_p_in < grab_threshold && (mode == MODE_EDIT || mode == MODE_EDIT_CURVE)) { action = ACTION_MOVING_IN; action_point = i; @@ -234,7 +256,7 @@ bool Path2DEditor::forward_gui_input(const InputEvent &p_event) { return true; } else { - if (wip.size()>1 && xform.xform(wip[0]).distance_to(gpoint)<grab_treshold) { + if (wip.size()>1 && xform.xform(wip[0]).distance_to(gpoint)<grab_threshold) { //wip closed _wip_close(); @@ -291,7 +313,7 @@ bool Path2DEditor::forward_gui_input(const InputEvent &p_event) { continue; //not valid to reuse point real_t d = cp.distance_to(gpoint); - if (d<closest_dist && d<grab_treshold) { + if (d<closest_dist && d<grab_threshold) { closest_dist=d; closest_pos=cp; closest_idx=i; @@ -322,7 +344,7 @@ bool Path2DEditor::forward_gui_input(const InputEvent &p_event) { Vector2 cp =xform.xform(poly[i]); real_t d = cp.distance_to(gpoint); - if (d<closest_dist && d<grab_treshold) { + if (d<closest_dist && d<grab_threshold) { closest_dist=d; closest_pos=cp; closest_idx=i; @@ -370,7 +392,7 @@ bool Path2DEditor::forward_gui_input(const InputEvent &p_event) { Vector2 cp =xform.xform(poly[i]); real_t d = cp.distance_to(gpoint); - if (d<closest_dist && d<grab_treshold) { + if (d<closest_dist && d<grab_threshold) { closest_dist=d; closest_pos=cp; closest_idx=i; diff --git a/editor/plugins/path_editor_plugin.cpp b/editor/plugins/path_editor_plugin.cpp index 9c95cee388..9e18a5c4c5 100644 --- a/editor/plugins/path_editor_plugin.cpp +++ b/editor/plugins/path_editor_plugin.cpp @@ -407,24 +407,38 @@ bool PathEditorPlugin::forward_spatial_gui_input(Camera* p_camera,const InputEve } else if (mb.pressed && ((mb.button_index==BUTTON_LEFT && curve_del->is_pressed()) || (mb.button_index==BUTTON_RIGHT && curve_edit->is_pressed()))) { - int erase_idx=-1; for(int i=0;i<c->get_point_count();i++) { - //find the offset and point index of the place to break up - if (p_camera->unproject_position(gt.xform(c->get_point_pos(i))).distance_to(mbpos)<click_dist) { - - erase_idx=i; - break; - } - } + real_t dist_to_p = p_camera->unproject_position(gt.xform(c->get_point_pos(i))).distance_to(mbpos); + real_t dist_to_p_out = p_camera->unproject_position(gt.xform(c->get_point_pos(i) + c->get_point_out(i))).distance_to(mbpos); + real_t dist_to_p_in = p_camera->unproject_position(gt.xform(c->get_point_pos(i) + c->get_point_in(i))).distance_to(mbpos); + + // Find the offset and point index of the place to break up. + // Also check for the control points. + if (dist_to_p < click_dist) { + + UndoRedo *ur = editor->get_undo_redo(); + ur->create_action(TTR("Remove Path Point")); + ur->add_do_method(c.ptr(),"remove_point",i); + ur->add_undo_method(c.ptr(),"add_point",c->get_point_pos(i),c->get_point_in(i),c->get_point_out(i),i); + ur->commit_action(); + return true; + } else if (dist_to_p_out < click_dist) { - if (erase_idx!=-1) { + UndoRedo *ur = editor->get_undo_redo(); + ur->create_action(TTR("Remove Out-Control Point")); + ur->add_do_method(c.ptr(),"set_point_out",i,Vector3()); + ur->add_undo_method(c.ptr(),"set_point_out",i,c->get_point_out(i)); + ur->commit_action(); + return true; + } else if (dist_to_p_in < click_dist) { - UndoRedo *ur = editor->get_undo_redo(); - ur->create_action(TTR("Remove Path Point")); - ur->add_do_method(c.ptr(),"remove_point",erase_idx); - ur->add_undo_method(c.ptr(),"add_point",c->get_point_pos(erase_idx),c->get_point_in(erase_idx),c->get_point_out(erase_idx),erase_idx); - ur->commit_action(); - return true; + UndoRedo *ur = editor->get_undo_redo(); + ur->create_action(TTR("Remove In-Control Point")); + ur->add_do_method(c.ptr(),"set_point_in",i,Vector3()); + ur->add_undo_method(c.ptr(),"set_point_in",i,c->get_point_in(i)); + ur->commit_action(); + return true; + } } } diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index a5414325d0..0b96570fd5 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -1037,7 +1037,7 @@ void ScriptEditor::_notification(int p_what) { EditorSettings::get_singleton()->connect("settings_changed", this, "_editor_settings_changed"); help_search->set_icon(get_icon("Help", "EditorIcons")); - site_search->set_icon(get_icon("Godot", "EditorIcons")); + site_search->set_icon(get_icon("GodotDocs", "EditorIcons")); class_search->set_icon(get_icon("ClassList", "EditorIcons")); script_forward->set_icon(get_icon("Forward", "EditorIcons")); @@ -1048,6 +1048,7 @@ void ScriptEditor::_notification(int p_what) { get_tree()->connect("tree_changed", this, "_tree_changed"); editor->connect("request_help", this, "_request_help"); + editor->connect("request_help_search", this, "_help_search"); } if (p_what == NOTIFICATION_EXIT_TREE) { Binary files differ@@ -13,11 +13,11 @@ height="1024" id="svg3030" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.92.1 r15371" sodipodi:docname="icon.svg" inkscape:export-filename="/home/akien/Projects/godot/godot.git/icon.png" - inkscape:export-xdpi="22.5" - inkscape:export-ydpi="22.5"> + inkscape:export-xdpi="24" + inkscape:export-ydpi="24"> <defs id="defs3032" /> <sodipodi:namedview @@ -28,13 +28,13 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.35" - inkscape:cx="-560.15123" - inkscape:cy="190.62119" + inkscape:cx="707.24666" + inkscape:cy="14.063809" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="1920" - inkscape:window-height="1015" + inkscape:window-height="1011" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" /> @@ -54,79 +54,86 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-28.362183)"> + transform="translate(0,-98.519719)"> <g - id="g4149" - transform="matrix(1.0688992,0,0,1.1334985,-45.061194,-81.689066)"> + id="g78" + transform="matrix(4.162611,0,0,-4.162611,919.24059,771.67186)" + style="stroke-width:0.32031175"> <path - sodipodi:nodetypes="cccccccccc" - inkscape:connector-curvature="0" - id="path3239" - d="m 116.99388,715.36604 43.13957,-74.51381 75.99672,-171.42666 271.088,-13.63746 282.06373,14.1696 138.45065,255.56931 -25.0756,66.96734 -376.12685,53.39482 -367.70391,-40.32222 z" - style="fill:#ffffff;fill-opacity:1;stroke:none" /> - <g - transform="matrix(12.995388,0,0,-12.995388,898.37246,704.73082)" - id="g3412"> - <path - id="path3414" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0,-3.942 c 0,-0.39 -0.25,-0.734 -0.621,-0.852 L -6.835,-6.8 c -0.273,-0.091 -0.57,-0.042 -0.8,0.128 -0.232,0.168 -0.37,0.437 -0.37,0.721 l 0,4.305 -5.818,-1.108 0,-4.381 c 0,-0.447 -0.332,-0.824 -0.775,-0.885 l -8.41,-1.152 c -0.039,-0.003 -0.081,-0.008 -0.121,-0.008 -0.214,0 -0.424,0.078 -0.588,0.22 -0.195,0.172 -0.306,0.416 -0.306,0.676 l 0,4.638 -4.341,-0.018 0,-10e-4 -0.318,10e-4 -0.319,-10e-4 0,10e-4 -4.34,0.018 0,-4.638 c 0,-0.26 -0.112,-0.504 -0.307,-0.676 -0.164,-0.142 -0.374,-0.22 -0.587,-0.22 -0.041,0 -0.082,0.005 -0.123,0.008 l -8.41,1.152 c -0.442,0.061 -0.774,0.438 -0.774,0.885 l 0,4.381 -5.819,1.108 0,-4.305 c 0,-0.284 -0.137,-0.553 -0.368,-0.721 -0.232,-0.17 -0.529,-0.219 -0.802,-0.128 l -6.215,2.006 c -0.369,0.118 -0.619,0.462 -0.619,0.852 l 0,3.942 -3.837,1.29 c -0.19,-0.811 -0.295,-1.642 -0.295,-2.481 0,-10.301 14.512,-18.252 32.448,-18.309 l 0.022,0 0.023,0 c 17.936,0.057 32.448,8.008 32.448,18.309 0,0.766 -0.088,1.521 -0.247,2.266 L 0,0 Z" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,140.10982,467.34929)" - id="g3416"> - <path - id="path3418" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0,-16.047 2.163,-0.729 c 0.364,-0.122 0.61,-0.462 0.61,-0.847 l 0,-3.936 4.426,-1.428 0,4.154 c 0,0.27 0.118,0.52 0.323,0.689 0.206,0.172 0.474,0.241 0.739,0.192 l 7.608,-1.452 c 0.422,-0.079 0.728,-0.448 0.728,-0.877 l 0,-4.338 6.62,-0.904 0,4.509 c 0,0.241 0.096,0.467 0.264,0.635 0.167,0.166 0.394,0.259 0.633,0.259 l 0.002,0 5.551,-0.022 5.549,0.022 c 0.245,-10e-4 0.468,-0.093 0.635,-0.259 0.169,-0.168 0.264,-0.394 0.264,-0.635 l 0,-4.509 6.621,0.904 0,4.338 c 0,0.429 0.304,0.798 0.726,0.877 l 7.609,1.452 c 0.262,0.049 0.533,-0.02 0.738,-0.192 0.205,-0.169 0.325,-0.419 0.325,-0.689 l 0,-4.154 4.425,1.428 0,3.936 c 0,0.385 0.245,0.725 0.609,0.847 l 1.475,0.497 0,16.279 0.04,0 c 1.437,1.834 2.767,3.767 4.042,5.828 -1.694,2.883 -3.768,5.459 -5.986,7.846 -2.057,-1.035 -4.055,-2.208 -5.942,-3.456 -0.944,0.938 -2.008,1.706 -3.052,2.509 -1.027,0.824 -2.183,1.428 -3.281,2.132 0.327,2.433 0.489,4.828 0.554,7.327 -2.831,1.424 -5.85,2.369 -8.903,3.047 -1.219,-2.048 -2.334,-4.267 -3.304,-6.436 -1.152,0.192 -2.309,0.264 -3.467,0.277 l 0,0.002 c -0.008,0 -0.015,-0.002 -0.022,-0.002 -0.008,0 -0.015,0.002 -0.022,0.002 l 0,-0.002 c -1.16,-0.013 -2.316,-0.085 -3.468,-0.277 -0.97,2.169 -2.084,4.388 -3.305,6.436 C 19.475,24.555 16.456,23.61 13.626,22.186 13.69,19.687 13.852,17.292 14.18,14.859 13.081,14.155 11.925,13.551 10.898,12.727 9.855,11.924 8.79,11.156 7.846,10.218 5.958,11.466 3.961,12.639 1.904,13.674 -0.314,11.287 -2.388,8.711 -4.082,5.828 -2.807,3.767 -1.477,1.834 -0.04,0 L 0,0 Z" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,411.4457,567.42812)" - id="g3420"> - <path - id="path3422" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-3.611 -2.926,-6.537 -6.537,-6.537 -3.608,0 -6.535,2.926 -6.535,6.537 0,3.609 2.927,6.533 6.535,6.533 C -2.926,6.533 0,3.609 0,0" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,391.00655,572.46636)" - id="g3424"> - <path - id="path3426" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-2.396 -1.941,-4.337 -4.339,-4.337 -2.396,0 -4.339,1.941 -4.339,4.337 0,2.396 1.943,4.339 4.339,4.339 C -1.941,4.339 0,2.396 0,0" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,526.30933,660.10985)" - id="g3428"> - <path - id="path3430" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -1.162,0 -2.104,0.856 -2.104,1.912 l 0,6.018 c 0,1.054 0.942,1.912 2.104,1.912 1.162,0 2.106,-0.858 2.106,-1.912 l 0,-6.018 C 2.106,0.856 1.162,0 0,0" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,641.18731,567.42812)" - id="g3432"> - <path - id="path3434" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-3.611 2.926,-6.537 6.537,-6.537 3.609,0 6.535,2.926 6.535,6.537 0,3.609 -2.926,6.533 -6.535,6.533 C 2.926,6.533 0,3.609 0,0" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,661.63165,572.46636)" - id="g3436"> - <path - id="path3438" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-2.396 1.941,-4.337 4.336,-4.337 2.398,0 4.339,1.941 4.339,4.337 0,2.396 -1.941,4.339 -4.339,4.339 C 1.941,4.339 0,2.396 0,0" - inkscape:connector-curvature="0" /> - </g> + d="m 0,0 c 0,0 -0.325,1.994 -0.515,1.976 l -36.182,-3.491 c -2.879,-0.278 -5.115,-2.574 -5.317,-5.459 l -0.994,-14.247 -27.992,-1.997 -1.904,12.912 c -0.424,2.872 -2.932,5.037 -5.835,5.037 h -38.188 c -2.902,0 -5.41,-2.165 -5.834,-5.037 l -1.905,-12.912 -27.992,1.997 -0.994,14.247 c -0.202,2.886 -2.438,5.182 -5.317,5.46 l -36.2,3.49 c -0.187,0.018 -0.324,-1.978 -0.511,-1.978 l -0.049,-7.83 30.658,-4.944 1.004,-14.374 c 0.203,-2.91 2.551,-5.263 5.463,-5.472 l 38.551,-2.75 c 0.146,-0.01 0.29,-0.016 0.434,-0.016 2.897,0 5.401,2.166 5.825,5.038 l 1.959,13.286 h 28.005 l 1.959,-13.286 c 0.423,-2.871 2.93,-5.037 5.831,-5.037 0.142,0 0.284,0.005 0.423,0.015 l 38.556,2.75 c 2.911,0.209 5.26,2.562 5.463,5.472 l 1.003,14.374 30.645,4.966 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path80" + inkscape:connector-curvature="0" /> + </g> + <g + id="g82-3" + transform="matrix(4.162611,0,0,-4.162611,104.69892,525.90697)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 v -47.514 -6.035 -5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 h 38.188 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 v 4.711 l 0.015,0.005 V 0 h 0.134 c 4.795,6.12 9.232,12.569 13.487,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 v 0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 V 63.652 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.368,12.569 -4.928,6.12 -0.134,0 Z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path84-6" + inkscape:connector-curvature="0" /> + </g> + <g + id="g86-7" + transform="matrix(4.162611,0,0,-4.162611,784.07144,817.24284)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 H -81.09 l -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 h 0.066 0.067 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path88-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g90-3" + transform="matrix(4.162611,0,0,-4.162611,389.21484,625.67104)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c 0,-12.052 -9.765,-21.815 -21.813,-21.815 -12.042,0 -21.81,9.763 -21.81,21.815 0,12.044 9.768,21.802 21.81,21.802 C -9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path92-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g94-6" + transform="matrix(4.162611,0,0,-4.162611,367.36686,631.05679)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c 0,-7.994 -6.479,-14.473 -14.479,-14.473 -7.996,0 -14.479,6.479 -14.479,14.473 0,7.994 6.483,14.479 14.479,14.479 C -6.479,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path96-2" + inkscape:connector-curvature="0" /> + </g> + <g + id="g98-9" + transform="matrix(4.162611,0,0,-4.162611,511.99336,724.73954)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 v 20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 V 6.381 C 7.028,2.858 3.878,0 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path100-1" + inkscape:connector-curvature="0" /> + </g> + <g + id="g102-2" + transform="matrix(4.162611,0,0,-4.162611,634.78706,625.67104)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c 0,-12.052 9.765,-21.815 21.815,-21.815 12.041,0 21.808,9.763 21.808,21.815 0,12.044 -9.767,21.802 -21.808,21.802 C 9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path104-7" + inkscape:connector-curvature="0" /> + </g> + <g + id="g106-0" + transform="matrix(4.162611,0,0,-4.162611,656.64056,631.05679)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c 0,-7.994 6.477,-14.473 14.471,-14.473 8.002,0 14.479,6.479 14.479,14.473 0,7.994 -6.477,14.479 -14.479,14.479 C 6.477,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path108-9" + inkscape:connector-curvature="0" /> </g> </g> </svg> Binary files differ@@ -11,19 +11,22 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg2" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.92.1 r15371" xml:space="preserve" - width="1052.3625" - height="744.09497" - viewBox="0 0 1052.3625 744.09497" - sodipodi:docname="godot_logo3.svg"><metadata + width="1024" + height="414" + viewBox="0 0 959.99998 388.125" + sodipodi:docname="logo.svg" + inkscape:export-filename="/home/akien/Projects/godot/godot.git/logo.png" + inkscape:export-xdpi="48" + inkscape:export-ydpi="48"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath clipPathUnits="userSpaceOnUse" id="clipPath16"><path - d="m 0,595.276 841.89,0 L 841.89,0 0,0 0,595.276 Z" + d="M 0,595.276 H 841.89 V 0 H 0 Z" id="path18" inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview pagecolor="#ffffff" @@ -34,157 +37,183 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1855" - inkscape:window-height="1056" + inkscape:window-width="1920" + inkscape:window-height="1011" id="namedview4" showgrid="false" inkscape:zoom="0.63432763" - inkscape:cx="601.9743" - inkscape:cy="324.47777" - inkscape:window-x="65" - inkscape:window-y="24" + inkscape:cx="166.44059" + inkscape:cy="101.14582" + inkscape:window-x="0" + inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="g10" /><g + inkscape:current-layer="g14" + fit-margin-top="48" + fit-margin-left="48" + fit-margin-right="48" + fit-margin-bottom="48" /><g id="g10" inkscape:groupmode="layer" inkscape:label="godot_engine_logo_2017_curves-01" - transform="matrix(1.25,0,0,-1.25,0,744.095)"><g + transform="matrix(1.25,0,0,-1.25,-94.249997,597.49874)"><g id="g12"><g id="g14" clip-path="url(#clipPath16)"><g id="g20" - transform="translate(482.779,337.7249)"><path + transform="matrix(1.1310535,0,0,1.1310535,531.44953,355.31567)" + style="stroke-width:0.88413143"><path d="m 0,0 c -3.611,0 -6.636,-1.659 -9.09,-4.967 -2.441,-3.311 -3.668,-7.958 -3.668,-13.938 0,-5.993 1.166,-10.581 3.503,-13.778 2.333,-3.207 5.398,-4.804 9.2,-4.804 3.8,0 6.887,1.617 9.258,4.862 2.371,3.233 3.559,7.861 3.559,13.886 0,6.02 -1.227,10.654 -3.673,13.89 C 6.646,-1.617 3.616,0 0,0 m -0.055,-59.493 c -10.573,0 -19.195,3.46 -25.859,10.379 -6.655,6.925 -9.984,17.03 -9.984,30.314 0,13.292 3.367,23.356 10.101,30.209 6.736,6.844 15.431,10.269 26.082,10.269 10.649,0 19.251,-3.363 25.794,-10.109 6.555,-6.733 9.827,-16.94 9.827,-30.591 0,-13.661 -3.348,-23.822 -10.05,-30.49 -6.702,-6.654 -15.333,-9.981 -25.911,-9.981" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path22" inkscape:connector-curvature="0" /></g><g id="g24" - transform="translate(550.3284,336.9427)"><path - d="m 0,0 0,-33.768 c 0,-1.577 0.116,-2.571 0.342,-2.988 0.224,-0.415 0.903,-0.623 2.029,-0.623 4.144,0 7.283,1.548 9.429,4.634 2.151,3.083 3.215,8.216 3.215,15.405 0,7.192 -1.113,11.878 -3.325,14.055 C 9.467,-1.102 5.946,0 1.129,0 L 0,0 Z m -21.675,-52.392 0,67.735 c 0,1.883 0.468,3.369 1.413,4.471 0.939,1.085 2.161,1.636 3.671,1.636 l 18.854,0 c 11.965,0 21.053,-3.018 27.257,-9.04 6.215,-6.02 9.322,-15.499 9.322,-28.447 0,-27.7 -11.821,-41.547 -35.456,-41.547 l -19.302,0 c -3.836,0 -5.759,1.727 -5.759,5.192" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,607.8515,354.43097)" + style="stroke-width:0.88413143"><path + d="m 0,0 v -33.768 c 0,-1.577 0.116,-2.571 0.342,-2.988 0.224,-0.415 0.903,-0.623 2.029,-0.623 4.144,0 7.283,1.548 9.429,4.634 2.151,3.083 3.215,8.216 3.215,15.405 0,7.192 -1.113,11.878 -3.325,14.055 C 9.467,-1.102 5.946,0 1.129,0 Z m -21.675,-52.392 v 67.735 c 0,1.883 0.468,3.369 1.413,4.471 0.939,1.085 2.161,1.636 3.671,1.636 H 2.263 c 11.965,0 21.053,-3.018 27.257,-9.04 6.215,-6.02 9.322,-15.499 9.322,-28.447 0,-27.7 -11.821,-41.547 -35.456,-41.547 h -19.302 c -3.836,0 -5.759,1.727 -5.759,5.192" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path26" inkscape:connector-curvature="0" /></g><g id="g28" - transform="translate(632.5165,337.7249)"><path + transform="matrix(1.1310535,0,0,1.1310535,700.81066,355.31567)" + style="stroke-width:0.88413143"><path d="m 0,0 c -3.612,0 -6.645,-1.659 -9.095,-4.967 -2.44,-3.311 -3.662,-7.958 -3.662,-13.938 0,-5.993 1.169,-10.581 3.499,-13.778 2.33,-3.207 5.398,-4.804 9.2,-4.804 3.801,0 6.89,1.617 9.258,4.862 2.372,3.233 3.56,7.861 3.56,13.886 0,6.02 -1.225,10.654 -3.671,13.89 C 6.642,-1.617 3.616,0 0,0 m -0.058,-59.493 c -10.577,0 -19.193,3.46 -25.851,10.379 -6.663,6.925 -9.993,17.03 -9.993,30.314 0,13.292 3.367,23.356 10.1,30.209 6.741,6.844 15.431,10.269 26.086,10.269 10.651,0 19.246,-3.363 25.797,-10.109 6.55,-6.733 9.822,-16.94 9.822,-30.591 0,-13.661 -3.349,-23.822 -10.05,-30.49 -6.699,-6.654 -15.338,-9.981 -25.911,-9.981" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path30" inkscape:connector-curvature="0" /></g><g id="g32" - transform="translate(710.4975,281.1577)"><path - d="m 0,0 c 0,-1.496 -3.721,-2.255 -11.176,-2.255 -7.448,0 -11.18,0.759 -11.18,2.255 l 0,56.681 -13.545,0 c -1.281,0 -2.185,1.727 -2.71,5.198 -0.226,1.652 -0.334,3.343 -0.334,5.077 0,1.724 0.108,3.422 0.334,5.077 0.525,3.462 1.429,5.202 2.71,5.202 l 49.112,0 c 1.279,0 2.179,-1.74 2.712,-5.202 0.221,-1.655 0.335,-3.353 0.335,-5.077 0,-1.734 -0.114,-3.425 -0.335,-5.077 C 15.39,58.408 14.49,56.681 13.211,56.681 L 0,56.681 0,0 Z" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,789.01132,291.33514)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,-1.496 -3.721,-2.255 -11.176,-2.255 -7.448,0 -11.18,0.759 -11.18,2.255 v 56.681 h -13.545 c -1.281,0 -2.185,1.727 -2.71,5.198 -0.226,1.652 -0.334,3.343 -0.334,5.077 0,1.724 0.108,3.422 0.334,5.077 0.525,3.462 1.429,5.202 2.71,5.202 h 49.112 c 1.279,0 2.179,-1.74 2.712,-5.202 0.221,-1.655 0.335,-3.353 0.335,-5.077 0,-1.734 -0.114,-3.425 -0.335,-5.077 C 15.39,58.408 14.49,56.681 13.211,56.681 H 0 Z" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path34" inkscape:connector-curvature="0" /></g><g id="g36" - transform="translate(426.916,321.2775)"><path - d="m 0,0 c -6.078,0.094 -13.034,-1.173 -13.034,-1.173 l 0,-11.863 6.995,0 -0.078,-5.288 c 0,-1.959 -1.942,-2.943 -5.815,-2.943 -3.878,0 -7.303,1.642 -10.274,4.917 -2.978,3.279 -4.459,8.072 -4.459,14.388 0,6.329 1.447,10.995 4.345,14.006 2.892,3.008 6.683,4.517 11.346,4.517 1.959,0 3.987,-0.316 6.096,-0.961 2.11,-0.639 3.519,-1.238 4.238,-1.799 0.713,-0.577 1.391,-0.85 2.032,-0.85 0.638,0 1.671,0.746 3.1,2.255 1.431,1.505 2.713,3.786 3.844,6.827 1.126,3.057 1.69,5.4 1.69,7.062 0,1.649 -0.036,2.786 -0.109,3.386 -1.581,1.73 -4.499,3.102 -8.755,4.122 -4.248,1.017 -9.011,1.522 -14.28,1.522 -11.594,0 -20.66,-3.65 -27.207,-10.95 -6.552,-7.303 -9.822,-16.783 -9.822,-28.452 0,-13.701 3.347,-24.087 10.041,-31.162 6.706,-7.074 15.51,-10.607 26.425,-10.607 5.87,0 11.08,0.505 15.632,1.522 4.557,1.013 7.586,2.053 9.093,3.105 l 0.452,35.33 C 11.496,-1.036 6.078,-0.104 0,0" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,468.26549,336.71278)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -6.078,0.094 -13.034,-1.173 -13.034,-1.173 v -11.863 h 6.995 l -0.078,-5.288 c 0,-1.959 -1.942,-2.943 -5.815,-2.943 -3.878,0 -7.303,1.642 -10.274,4.917 -2.978,3.279 -4.459,8.072 -4.459,14.388 0,6.329 1.447,10.995 4.345,14.006 2.892,3.008 6.683,4.517 11.346,4.517 1.959,0 3.987,-0.316 6.096,-0.961 2.11,-0.639 3.519,-1.238 4.238,-1.799 0.713,-0.577 1.391,-0.85 2.032,-0.85 0.638,0 1.671,0.746 3.1,2.255 1.431,1.505 2.713,3.786 3.844,6.827 1.126,3.057 1.69,5.4 1.69,7.062 0,1.649 -0.036,2.786 -0.109,3.386 -1.581,1.73 -4.499,3.102 -8.755,4.122 -4.248,1.017 -9.011,1.522 -14.28,1.522 -11.594,0 -20.66,-3.65 -27.207,-10.95 -6.552,-7.303 -9.822,-16.783 -9.822,-28.452 0,-13.701 3.347,-24.087 10.041,-31.162 6.706,-7.074 15.51,-10.607 26.425,-10.607 5.87,0 11.08,0.505 15.632,1.522 4.557,1.013 7.586,2.053 9.093,3.105 l 0.452,35.33 C 11.496,-1.036 6.078,-0.104 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path38" inkscape:connector-curvature="0" /></g><g id="g40" - transform="translate(403.1167,232.0142)"><path - d="m 0,0 c -0.624,-1.28 -1.771,-2.454 -3.449,-3.516 -1.676,-1.069 -3.805,-1.6 -6.391,-1.6 -3.412,0 -6.156,1.075 -8.24,3.249 -2.076,2.157 -3.116,5.266 -3.116,9.323 l 0,10.116 c 0,3.969 0.98,7.013 2.946,9.138 1.962,2.108 4.59,3.177 7.872,3.177 3.208,0 5.695,-0.844 7.455,-2.513 1.755,-1.675 2.677,-4.015 2.757,-7.003 l -0.044,-0.133 -2.619,0 c -0.094,2.29 -0.759,4.057 -2.01,5.305 -1.244,1.238 -3.095,1.864 -5.539,1.864 -2.473,0 -4.432,-0.837 -5.866,-2.516 -1.43,-1.675 -2.143,-4.103 -2.143,-7.293 l 0,-10.174 c 0,-3.308 0.771,-5.83 2.311,-7.567 1.54,-1.724 3.616,-2.588 6.236,-2.588 1.913,0 3.451,0.339 4.602,1.033 1.155,0.684 1.956,1.519 2.409,2.51 l 0,8.861 -7.06,0 0,2.463 9.889,0 L 0,0 Z" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,441.34721,235.75121)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -0.624,-1.28 -1.771,-2.454 -3.449,-3.516 -1.676,-1.069 -3.805,-1.6 -6.391,-1.6 -3.412,0 -6.156,1.075 -8.24,3.249 -2.076,2.157 -3.116,5.266 -3.116,9.323 v 10.116 c 0,3.969 0.98,7.013 2.946,9.138 1.962,2.108 4.59,3.177 7.872,3.177 3.208,0 5.695,-0.844 7.455,-2.513 1.755,-1.675 2.677,-4.015 2.757,-7.003 L -0.21,20.238 h -2.619 c -0.094,2.29 -0.759,4.057 -2.01,5.305 -1.244,1.238 -3.095,1.864 -5.539,1.864 -2.473,0 -4.432,-0.837 -5.866,-2.516 -1.43,-1.675 -2.143,-4.103 -2.143,-7.293 V 7.424 c 0,-3.308 0.771,-5.83 2.311,-7.567 1.54,-1.724 3.616,-2.588 6.236,-2.588 1.913,0 3.451,0.339 4.602,1.033 1.155,0.684 1.956,1.519 2.409,2.51 v 8.861 h -7.06 v 2.463 H 0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path42" inkscape:connector-curvature="0" /></g><g id="g44" - transform="translate(416.0852,229.427)"><path - d="m 0,0 c 1.553,0 2.936,0.44 4.144,1.336 1.21,0.9 2.058,2.037 2.561,3.422 l 0,5.468 -4.492,0 c -1.91,0 -3.44,-0.541 -4.585,-1.623 C -3.52,7.528 -4.088,6.185 -4.088,4.588 -4.088,3.239 -3.733,2.131 -3.014,1.277 -2.296,0.42 -1.292,0 0,0 M 7.124,-2.04 C 6.984,-1.164 6.875,-0.453 6.806,0.104 6.739,0.671 6.705,1.235 6.705,1.808 5.938,0.554 4.948,-0.486 3.725,-1.301 2.504,-2.122 1.146,-2.529 -0.35,-2.529 c -2.092,0 -3.701,0.648 -4.84,1.946 -1.132,1.303 -1.704,3.059 -1.704,5.276 0,2.343 0.823,4.223 2.473,5.618 1.649,1.395 3.89,2.092 6.709,2.092 l 4.417,0 0,3.106 c 0,1.786 -0.456,3.193 -1.351,4.21 -0.914,1.004 -2.17,1.512 -3.791,1.512 -1.508,0 -2.752,-0.479 -3.728,-1.45 -0.973,-0.965 -1.456,-2.144 -1.456,-3.549 l -2.623,0.023 -0.046,0.137 c -0.074,1.906 0.647,3.591 2.168,5.084 1.515,1.489 3.459,2.229 5.825,2.229 2.338,0 4.22,-0.711 5.657,-2.128 1.429,-1.431 2.146,-3.471 2.146,-6.124 l 0,-12.396 c 0,-0.903 0.042,-1.78 0.121,-2.617 0.081,-0.848 0.212,-1.665 0.417,-2.48 l -2.92,0 z" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,456.01527,232.82495)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 1.553,0 2.936,0.44 4.144,1.336 1.21,0.9 2.058,2.037 2.561,3.422 v 5.468 H 2.213 c -1.91,0 -3.44,-0.541 -4.585,-1.623 C -3.52,7.528 -4.088,6.185 -4.088,4.588 -4.088,3.239 -3.733,2.131 -3.014,1.277 -2.296,0.42 -1.292,0 0,0 M 7.124,-2.04 C 6.984,-1.164 6.875,-0.453 6.806,0.104 6.739,0.671 6.705,1.235 6.705,1.808 5.938,0.554 4.948,-0.486 3.725,-1.301 2.504,-2.122 1.146,-2.529 -0.35,-2.529 c -2.092,0 -3.701,0.648 -4.84,1.946 -1.132,1.303 -1.704,3.059 -1.704,5.276 0,2.343 0.823,4.223 2.473,5.618 1.649,1.395 3.89,2.092 6.709,2.092 h 4.417 v 3.106 c 0,1.786 -0.456,3.193 -1.351,4.21 -0.914,1.004 -2.17,1.512 -3.791,1.512 -1.508,0 -2.752,-0.479 -3.728,-1.45 -0.973,-0.965 -1.456,-2.144 -1.456,-3.549 l -2.623,0.023 -0.046,0.137 c -0.074,1.906 0.647,3.591 2.168,5.084 1.515,1.489 3.459,2.229 5.825,2.229 2.338,0 4.22,-0.711 5.657,-2.128 1.429,-1.431 2.146,-3.471 2.146,-6.124 V 3.057 c 0,-0.903 0.042,-1.78 0.121,-2.617 0.081,-0.848 0.212,-1.665 0.417,-2.48 z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path46" inkscape:connector-curvature="0" /></g><g id="g48" - transform="translate(434.4,252.6622)"><path - d="m 0,0 0.24,-3.923 c 0.664,1.404 1.554,2.486 2.657,3.255 1.107,0.759 2.41,1.138 3.906,1.138 1.527,0 2.814,-0.444 3.852,-1.343 1.039,-0.896 1.805,-2.252 2.292,-4.074 0.623,1.682 1.505,3.011 2.65,3.973 1.145,0.964 2.534,1.444 4.143,1.444 2.217,0 3.937,-0.897 5.156,-2.692 1.224,-1.799 1.834,-4.559 1.834,-8.288 l 0,-14.765 -2.823,0 0,14.814 c 0,3.1 -0.429,5.283 -1.263,6.538 -0.839,1.257 -2.042,1.89 -3.598,1.89 -1.637,0 -2.915,-0.691 -3.834,-2.096 -0.914,-1.405 -1.478,-3.161 -1.683,-5.282 l 0,-0.655 0,-15.209 -2.809,0 0,14.798 c 0,3.027 -0.424,5.194 -1.292,6.488 -0.864,1.294 -2.066,1.936 -3.609,1.936 -1.475,0 -2.668,-0.45 -3.562,-1.342 -0.9,-0.897 -1.54,-2.125 -1.928,-3.683 l 0,-18.197 -2.806,0 L -2.477,0 0,0 Z" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,476.7303,259.10521)" + style="stroke-width:0.88413143"><path + d="m 0,0 0.24,-3.923 c 0.664,1.404 1.554,2.486 2.657,3.255 1.107,0.759 2.41,1.138 3.906,1.138 1.527,0 2.814,-0.444 3.852,-1.343 1.039,-0.896 1.805,-2.252 2.292,-4.074 0.623,1.682 1.505,3.011 2.65,3.973 1.145,0.964 2.534,1.444 4.143,1.444 2.217,0 3.937,-0.897 5.156,-2.692 1.224,-1.799 1.834,-4.559 1.834,-8.288 v -14.765 h -2.823 v 14.814 c 0,3.1 -0.429,5.283 -1.263,6.538 -0.839,1.257 -2.042,1.89 -3.598,1.89 -1.637,0 -2.915,-0.691 -3.834,-2.096 -0.914,-1.405 -1.478,-3.161 -1.683,-5.282 v -0.655 -15.209 H 10.72 v 14.798 c 0,3.027 -0.424,5.194 -1.292,6.488 -0.864,1.294 -2.066,1.936 -3.609,1.936 -1.475,0 -2.668,-0.45 -3.562,-1.342 -0.9,-0.897 -1.54,-2.125 -1.928,-3.683 V -25.275 H -2.477 V 0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path50" inkscape:connector-curvature="0" /></g><g id="g52" - transform="translate(475.1518,250.6583)"><path - d="m 0,0 c -1.758,0 -3.202,-0.802 -4.334,-2.402 -1.133,-1.606 -1.718,-3.585 -1.765,-5.944 l 11.66,0 0,1.082 c 0,2.086 -0.489,3.823 -1.469,5.201 C 3.106,-0.684 1.745,0 0,0 m 0.397,-23.76 c -2.725,0 -4.954,1.026 -6.685,3.073 -1.726,2.043 -2.591,4.657 -2.591,7.841 l 0,4.197 c 0,3.19 0.867,5.85 2.602,7.965 1.739,2.105 3.828,3.158 6.277,3.158 2.648,0 4.699,-0.939 6.164,-2.823 1.468,-1.887 2.201,-4.422 2.201,-7.603 l 0,-2.773 -14.464,0 0,-2.102 c 0,-2.447 0.586,-4.484 1.752,-6.11 1.168,-1.63 2.755,-2.438 4.744,-2.438 1.382,0 2.585,0.244 3.588,0.724 1.003,0.491 1.863,1.179 2.578,2.082 l 1.149,-1.988 C 6.949,-21.525 5.96,-22.307 4.753,-22.887 3.549,-23.464 2.094,-23.76 0.397,-23.76" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,522.82277,256.83868)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -1.758,0 -3.202,-0.802 -4.334,-2.402 -1.133,-1.606 -1.718,-3.585 -1.765,-5.944 h 11.66 v 1.082 c 0,2.086 -0.489,3.823 -1.469,5.201 C 3.106,-0.684 1.745,0 0,0 m 0.397,-23.76 c -2.725,0 -4.954,1.026 -6.685,3.073 -1.726,2.043 -2.591,4.657 -2.591,7.841 v 4.197 c 0,3.19 0.867,5.85 2.602,7.965 1.739,2.105 3.828,3.158 6.277,3.158 2.648,0 4.699,-0.939 6.164,-2.823 1.468,-1.887 2.201,-4.422 2.201,-7.603 v -2.773 H -6.099 v -2.102 c 0,-2.447 0.586,-4.484 1.752,-6.11 1.168,-1.63 2.755,-2.438 4.744,-2.438 1.382,0 2.585,0.244 3.588,0.724 1.003,0.491 1.863,1.179 2.578,2.082 l 1.149,-1.988 C 6.949,-21.525 5.96,-22.307 4.753,-22.887 3.549,-23.464 2.094,-23.76 0.397,-23.76" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path54" inkscape:connector-curvature="0" /></g><g id="g56" - transform="translate(506.3243,250.6583)"><path - d="m 0,0 c -1.763,0 -3.21,-0.802 -4.341,-2.402 -1.126,-1.606 -1.712,-3.585 -1.763,-5.944 l 11.663,0 0,1.082 c 0,2.086 -0.488,3.823 -1.474,5.201 C 3.104,-0.684 1.744,0 0,0 m 0.394,-23.76 c -2.726,0 -4.951,1.026 -6.679,3.073 -1.733,2.043 -2.6,4.657 -2.6,7.841 l 0,4.197 c 0,3.19 0.871,5.85 2.602,7.965 1.744,2.105 3.834,3.158 6.283,3.158 2.643,0 4.703,-0.939 6.164,-2.823 1.463,-1.887 2.197,-4.422 2.197,-7.603 l 0,-2.773 -14.465,0 0,-2.102 c 0,-2.447 0.587,-4.484 1.76,-6.11 1.162,-1.63 2.742,-2.438 4.738,-2.438 1.387,0 2.585,0.244 3.585,0.724 1.007,0.491 1.866,1.179 2.589,2.082 l 1.141,-1.988 c -0.764,-0.968 -1.75,-1.75 -2.959,-2.33 -1.204,-0.577 -2.658,-0.873 -4.356,-0.873" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,558.0805,256.83868)" + style="stroke-width:0.88413143"><path + d="M 0,0 C -1.763,0 -3.21,-0.802 -4.341,-2.402 -5.467,-4.008 -6.053,-5.987 -6.104,-8.346 H 5.559 v 1.082 c 0,2.086 -0.488,3.823 -1.474,5.201 C 3.104,-0.684 1.744,0 0,0 m 0.394,-23.76 c -2.726,0 -4.951,1.026 -6.679,3.073 -1.733,2.043 -2.6,4.657 -2.6,7.841 v 4.197 c 0,3.19 0.871,5.85 2.602,7.965 1.744,2.105 3.834,3.158 6.283,3.158 2.643,0 4.703,-0.939 6.164,-2.823 1.463,-1.887 2.197,-4.422 2.197,-7.603 v -2.773 H -6.104 v -2.102 c 0,-2.447 0.587,-4.484 1.76,-6.11 1.162,-1.63 2.742,-2.438 4.738,-2.438 1.387,0 2.585,0.244 3.585,0.724 1.007,0.491 1.866,1.179 2.589,2.082 l 1.141,-1.988 c -0.764,-0.968 -1.75,-1.75 -2.959,-2.33 -1.204,-0.577 -2.658,-0.873 -4.356,-0.873" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path58" inkscape:connector-curvature="0" /></g><g id="g60" - transform="translate(522.0939,252.6622)"><path - d="m 0,0 0.23,-4.178 c 0.674,1.483 1.564,2.634 2.682,3.435 1.108,0.805 2.413,1.213 3.914,1.213 2.258,0 3.988,-0.835 5.189,-2.513 1.214,-1.675 1.815,-4.279 1.815,-7.812 l 0,-15.42 -2.825,0 0,15.394 c 0,2.888 -0.423,4.905 -1.264,6.075 -0.836,1.17 -2.065,1.753 -3.665,1.753 -1.435,0 -2.638,-0.466 -3.603,-1.414 -0.969,-0.939 -1.691,-2.19 -2.172,-3.767 l 0,-18.041 -2.805,0 L -2.504,0 0,0 Z" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,575.91679,259.10521)" + style="stroke-width:0.88413143"><path + d="m 0,0 0.23,-4.178 c 0.674,1.483 1.564,2.634 2.682,3.435 1.108,0.805 2.413,1.213 3.914,1.213 2.258,0 3.988,-0.835 5.189,-2.513 1.214,-1.675 1.815,-4.279 1.815,-7.812 v -15.42 h -2.825 v 15.394 c 0,2.888 -0.423,4.905 -1.264,6.075 -0.836,1.17 -2.065,1.753 -3.665,1.753 -1.435,0 -2.638,-0.466 -3.603,-1.414 C 1.504,-4.406 0.782,-5.657 0.301,-7.234 V -25.275 H -2.504 V 0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path62" inkscape:connector-curvature="0" /></g><g id="g64" - transform="translate(544.1545,237.812)"><path - d="m 0,0 c 0,-2.565 0.486,-4.605 1.472,-6.123 0.974,-1.532 2.457,-2.288 4.436,-2.288 1.356,0 2.498,0.361 3.435,1.101 0.934,0.74 1.672,1.77 2.218,3.077 l 0,12.52 c -0.525,1.346 -1.246,2.434 -2.157,3.272 -0.91,0.824 -2.062,1.238 -3.448,1.238 -1.975,0 -3.468,-0.86 -4.46,-2.587 C 0.497,8.48 0,6.224 0,3.454 L 0,0 Z m -2.833,3.454 c 0,3.582 0.723,6.459 2.177,8.627 1.442,2.157 3.448,3.239 6.004,3.239 1.419,0 2.664,-0.346 3.728,-1.04 1.066,-0.681 1.947,-1.678 2.654,-2.946 l 0.274,3.516 2.381,0 0,-25.298 c 0,-3.239 -0.751,-5.749 -2.26,-7.525 -1.511,-1.769 -3.657,-2.665 -6.428,-2.665 -0.996,0 -2.067,0.156 -3.212,0.459 -1.147,0.303 -2.162,0.701 -3.052,1.2 l 0.776,2.463 c 0.759,-0.492 1.608,-0.873 2.548,-1.141 0.932,-0.277 1.895,-0.41 2.894,-0.41 2.009,0 3.498,0.645 4.46,1.932 0.966,1.304 1.45,3.19 1.45,5.687 l 0,3.057 c -0.717,-1.138 -1.597,-2.011 -2.64,-2.614 -1.039,-0.606 -2.253,-0.909 -3.622,-0.909 -2.539,0 -4.53,0.994 -5.968,2.982 C -2.11,-5.948 -2.833,-3.301 -2.833,0 l 0,3.454 z" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,600.8685,242.30884)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,-2.565 0.486,-4.605 1.472,-6.123 0.974,-1.532 2.457,-2.288 4.436,-2.288 1.356,0 2.498,0.361 3.435,1.101 0.934,0.74 1.672,1.77 2.218,3.077 v 12.52 c -0.525,1.346 -1.246,2.434 -2.157,3.272 -0.91,0.824 -2.062,1.238 -3.448,1.238 -1.975,0 -3.468,-0.86 -4.46,-2.587 C 0.497,8.48 0,6.224 0,3.454 Z m -2.833,3.454 c 0,3.582 0.723,6.459 2.177,8.627 1.442,2.157 3.448,3.239 6.004,3.239 1.419,0 2.664,-0.346 3.728,-1.04 1.066,-0.681 1.947,-1.678 2.654,-2.946 l 0.274,3.516 h 2.381 v -25.298 c 0,-3.239 -0.751,-5.749 -2.26,-7.525 -1.511,-1.769 -3.657,-2.665 -6.428,-2.665 -0.996,0 -2.067,0.156 -3.212,0.459 -1.147,0.303 -2.162,0.701 -3.052,1.2 l 0.776,2.463 c 0.759,-0.492 1.608,-0.873 2.548,-1.141 0.932,-0.277 1.895,-0.41 2.894,-0.41 2.009,0 3.498,0.645 4.46,1.932 0.966,1.304 1.45,3.19 1.45,5.687 v 3.057 c -0.717,-1.138 -1.597,-2.011 -2.64,-2.614 -1.039,-0.606 -2.253,-0.909 -3.622,-0.909 -2.539,0 -4.53,0.994 -5.968,2.982 C -2.11,-5.948 -2.833,-3.301 -2.833,0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path66" inkscape:connector-curvature="0" /></g><path - d="m 567.986,227.387 -2.83,0 0,25.275 2.83,0 0,-25.275 z m 0,32.471 -2.83,0 0,3.982 2.83,0 0,-3.982 z" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 627.82321,230.5176 h -3.20089 v 28.58738 h 3.20089 z m 0,36.72644 h -3.20089 v 4.50385 h 3.20089 z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994" id="path68" inkscape:connector-curvature="0" /><g id="g70" - transform="translate(577.1196,252.6622)"><path - d="m 0,0 0.23,-4.178 c 0.676,1.483 1.562,2.634 2.678,3.435 1.115,0.805 2.422,1.213 3.916,1.213 2.258,0 3.995,-0.835 5.199,-2.513 1.211,-1.675 1.807,-4.279 1.807,-7.812 l 0,-15.42 -2.825,0 0,15.394 c 0,2.888 -0.422,4.905 -1.261,6.075 -0.843,1.17 -2.063,1.753 -3.668,1.753 -1.434,0 -2.635,-0.466 -3.599,-1.414 C 1.51,-4.406 0.785,-5.657 0.306,-7.234 l 0,-18.041 -2.809,0 L -2.503,0 0,0 Z" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,638.15379,259.10521)" + style="stroke-width:0.88413143"><path + d="m 0,0 0.23,-4.178 c 0.676,1.483 1.562,2.634 2.678,3.435 1.115,0.805 2.422,1.213 3.916,1.213 2.258,0 3.995,-0.835 5.199,-2.513 1.211,-1.675 1.807,-4.279 1.807,-7.812 v -15.42 h -2.825 v 15.394 c 0,2.888 -0.422,4.905 -1.261,6.075 -0.843,1.17 -2.063,1.753 -3.668,1.753 -1.434,0 -2.635,-0.466 -3.599,-1.414 C 1.51,-4.406 0.785,-5.657 0.306,-7.234 V -25.275 H -2.503 V 0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path72" inkscape:connector-curvature="0" /></g><g id="g74" - transform="translate(605.0184,250.6583)"><path - d="m 0,0 c -1.763,0 -3.208,-0.802 -4.334,-2.402 -1.129,-1.606 -1.718,-3.585 -1.768,-5.944 l 11.662,0 0,1.082 c 0,2.086 -0.486,3.823 -1.47,5.201 C 3.109,-0.684 1.747,0 0,0 m 0.401,-23.76 c -2.733,0 -4.958,1.026 -6.681,3.073 -1.73,2.043 -2.595,4.657 -2.595,7.841 l 0,4.197 c 0,3.19 0.865,5.85 2.6,7.965 1.739,2.105 3.831,3.158 6.275,3.158 2.646,0 4.706,-0.939 6.172,-2.823 1.462,-1.887 2.195,-4.422 2.195,-7.603 l 0,-2.773 -14.469,0 0,-2.102 c 0,-2.447 0.59,-4.484 1.757,-6.11 1.166,-1.63 2.748,-2.438 4.746,-2.438 1.382,0 2.579,0.244 3.578,0.724 1.012,0.491 1.869,1.179 2.591,2.082 l 1.147,-1.988 c -0.769,-0.968 -1.755,-1.75 -2.962,-2.33 -1.203,-0.577 -2.658,-0.873 -4.354,-0.873" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,669.70883,256.83868)" + style="stroke-width:0.88413143"><path + d="M 0,0 C -1.763,0 -3.208,-0.802 -4.334,-2.402 -5.463,-4.008 -6.052,-5.987 -6.102,-8.346 H 5.56 v 1.082 c 0,2.086 -0.486,3.823 -1.47,5.201 C 3.109,-0.684 1.747,0 0,0 m 0.401,-23.76 c -2.733,0 -4.958,1.026 -6.681,3.073 -1.73,2.043 -2.595,4.657 -2.595,7.841 v 4.197 c 0,3.19 0.865,5.85 2.6,7.965 1.739,2.105 3.831,3.158 6.275,3.158 2.646,0 4.706,-0.939 6.172,-2.823 1.462,-1.887 2.195,-4.422 2.195,-7.603 v -2.773 H -6.102 v -2.102 c 0,-2.447 0.59,-4.484 1.757,-6.11 1.166,-1.63 2.748,-2.438 4.746,-2.438 1.382,0 2.579,0.244 3.578,0.724 1.012,0.491 1.869,1.179 2.591,2.082 l 1.147,-1.988 c -0.769,-0.968 -1.755,-1.75 -2.962,-2.33 -1.203,-0.577 -2.658,-0.873 -4.354,-0.873" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path76" inkscape:connector-curvature="0" /></g><g id="g78" - transform="translate(320.7014,270.4877)"><path - d="m 0,0 c 0,0 -0.325,1.994 -0.515,1.976 l -36.182,-3.491 c -2.879,-0.278 -5.115,-2.574 -5.317,-5.459 l -0.994,-14.247 -27.992,-1.997 -1.904,12.912 c -0.424,2.872 -2.932,5.037 -5.835,5.037 l -38.188,0 c -2.902,0 -5.41,-2.165 -5.834,-5.037 l -1.905,-12.912 -27.992,1.997 -0.994,14.247 c -0.202,2.886 -2.438,5.182 -5.317,5.46 l -36.2,3.49 c -0.187,0.018 -0.324,-1.978 -0.511,-1.978 l -0.049,-7.83 30.658,-4.944 1.004,-14.374 c 0.203,-2.91 2.551,-5.263 5.463,-5.472 l 38.551,-2.75 c 0.146,-0.01 0.29,-0.016 0.434,-0.016 2.897,0 5.401,2.166 5.825,5.038 l 1.959,13.286 28.005,0 1.959,-13.286 c 0.423,-2.871 2.93,-5.037 5.831,-5.037 0.142,0 0.284,0.005 0.423,0.015 l 38.556,2.75 c 2.911,0.209 5.26,2.562 5.463,5.472 l 1.003,14.374 L 0.05,-7.81 0,0 Z" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,348.13109,279.2668)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,0 -0.325,1.994 -0.515,1.976 l -36.182,-3.491 c -2.879,-0.278 -5.115,-2.574 -5.317,-5.459 l -0.994,-14.247 -27.992,-1.997 -1.904,12.912 c -0.424,2.872 -2.932,5.037 -5.835,5.037 h -38.188 c -2.902,0 -5.41,-2.165 -5.834,-5.037 l -1.905,-12.912 -27.992,1.997 -0.994,14.247 c -0.202,2.886 -2.438,5.182 -5.317,5.46 l -36.2,3.49 c -0.187,0.018 -0.324,-1.978 -0.511,-1.978 l -0.049,-7.83 30.658,-4.944 1.004,-14.374 c 0.203,-2.91 2.551,-5.263 5.463,-5.472 l 38.551,-2.75 c 0.146,-0.01 0.29,-0.016 0.434,-0.016 2.897,0 5.401,2.166 5.825,5.038 l 1.959,13.286 h 28.005 l 1.959,-13.286 c 0.423,-2.871 2.93,-5.037 5.831,-5.037 0.142,0 0.284,0.005 0.423,0.015 l 38.556,2.75 c 2.911,0.209 5.26,2.562 5.463,5.472 l 1.003,14.374 30.645,4.966 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path80" inkscape:connector-curvature="0" /></g><g id="g82" - transform="translate(125.021,329.5287)"><path - d="m 0,0 0,-47.514 0,-6.035 0,-5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 l 38.188,0 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 l 0,4.711 0.015,0.005 0,54.325 0.134,0 c 4.795,6.12 9.232,12.569 13.487,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 l 0,0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 l 0,-0.006 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.368,12.569 -4.928,6.12 -0.134,0 L 0,0 Z" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,126.80608,346.04533)" + style="stroke-width:0.88413143"><path + d="m 0,0 v -47.514 -6.035 -5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 h 38.188 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 v 4.711 l 0.015,0.005 V 0 h 0.134 c 4.795,6.12 9.232,12.569 13.487,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 v 0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 V 63.652 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.368,12.569 -4.928,6.12 -0.134,0 Z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path84" inkscape:connector-curvature="0" /></g><g id="g86" - transform="translate(288.2292,259.54)"><path - d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 -31.459,0 -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 l 0.066,0 0.067,0 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 L 0,0 Z" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,311.40329,266.88437)" + style="stroke-width:0.88413143"><path + d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 H -81.09 l -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 h 0.066 0.067 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path88" inkscape:connector-curvature="0" /></g><g id="g90" - transform="translate(193.3713,305.562)"><path + transform="matrix(1.1310535,0,0,1.1310535,204.11393,318.93771)" + style="stroke-width:0.88413143"><path d="m 0,0 c 0,-12.052 -9.765,-21.815 -21.813,-21.815 -12.042,0 -21.81,9.763 -21.81,21.815 0,12.044 9.768,21.802 21.81,21.802 C -9.765,21.802 0,12.044 0,0" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path92" inkscape:connector-curvature="0" /></g><g id="g94" - transform="translate(188.1227,304.2682)"><path + transform="matrix(1.1310535,0,0,1.1310535,198.17748,317.47435)" + style="stroke-width:0.88413143"><path d="m 0,0 c 0,-7.994 -6.479,-14.473 -14.479,-14.473 -7.996,0 -14.479,6.479 -14.479,14.473 0,7.994 6.483,14.479 14.479,14.479 C -6.479,14.479 0,7.994 0,0" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path96" inkscape:connector-curvature="0" /></g><g id="g98" - transform="translate(222.8669,281.7624)"><path - d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 l 0,20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 l 0,-20.081 C 7.028,2.858 3.878,0 0,0" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + transform="matrix(1.1310535,0,0,1.1310535,237.47503,292.01909)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 v 20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 V 6.381 C 7.028,2.858 3.878,0 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path100" inkscape:connector-curvature="0" /></g><g id="g102" - transform="translate(252.3661,305.562)"><path + transform="matrix(1.1310535,0,0,1.1310535,270.84021,318.93771)" + style="stroke-width:0.88413143"><path d="m 0,0 c 0,-12.052 9.765,-21.815 21.815,-21.815 12.041,0 21.808,9.763 21.808,21.815 0,12.044 -9.767,21.802 -21.808,21.802 C 9.765,21.802 0,12.044 0,0" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path104" inkscape:connector-curvature="0" /></g><g id="g106" - transform="translate(257.616,304.2682)"><path + transform="matrix(1.1310535,0,0,1.1310535,276.77813,317.47435)" + style="stroke-width:0.88413143"><path d="m 0,0 c 0,-7.994 6.477,-14.473 14.471,-14.473 8.002,0 14.479,6.479 14.479,14.473 0,7.994 -6.477,14.479 -14.479,14.479 C 6.477,14.479 0,7.994 0,0" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" id="path108" inkscape:connector-curvature="0" /></g></g></g></g></svg>
\ No newline at end of file diff --git a/main/app_icon.png b/main/app_icon.png Binary files differindex eafae08d59..1d75cdc710 100644 --- a/main/app_icon.png +++ b/main/app_icon.png diff --git a/main/splash.png b/main/splash.png Binary files differindex 01ca2152ce..894a7d7aba 100644 --- a/main/splash.png +++ b/main/splash.png diff --git a/misc/dist/project_icon.svg b/misc/dist/project_icon.svg new file mode 100644 index 0000000000..650c71fd12 --- /dev/null +++ b/misc/dist/project_icon.svg @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="1024" + height="1024" + id="svg3030" + version="1.1" + inkscape:version="0.92.1 r15371" + sodipodi:docname="icon_default_project_icon.svg" + inkscape:export-filename="/home/akien/Projects/godot/godot.git/icon3.png" + inkscape:export-xdpi="6" + inkscape:export-ydpi="6"> + <defs + id="defs3032" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.5" + inkscape:cx="601.35476" + inkscape:cy="346.09731" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" /> + <metadata + id="metadata3035"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-98.519719)"> + <rect + style="fill:#1e1a21;fill-opacity:1;stroke:#2e2832;stroke-width:16;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect33" + width="1008" + height="1008" + x="8" + y="106.51972" + rx="176.28572" + ry="176.28572" /> + <g + id="g82-3" + transform="matrix(4.2343801,0,0,-4.2343764,97.676491,522.86238)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 v -47.514 -6.035 -5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 h 38.188 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 v 4.711 l 0.015,0.005 V 0 h 0.134 c 4.795,6.12 9.232,12.569 13.487,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 v 0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 V 63.652 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.368,12.569 -4.928,6.12 -0.134,0 Z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path84-6" + inkscape:connector-curvature="0" /> + </g> + <g + id="g86-7" + transform="matrix(4.2343801,0,0,-4.2343764,788.7623,819.22103)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 H -81.09 l -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 h 0.066 0.067 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path88-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g90-3" + transform="matrix(4.2343801,0,0,-4.2343764,387.09785,624.34645)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c 0,-12.052 -9.765,-21.815 -21.813,-21.815 -12.042,0 -21.81,9.763 -21.81,21.815 0,12.044 9.768,21.802 21.81,21.802 C -9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path92-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g94-6" + transform="matrix(4.2343801,0,0,-4.2343764,364.87318,629.82505)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c 0,-7.994 -6.479,-14.473 -14.479,-14.473 -7.996,0 -14.479,6.479 -14.479,14.473 0,7.994 6.483,14.479 14.479,14.479 C -6.479,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path96-2" + inkscape:connector-curvature="0" /> + </g> + <g + id="g98-9" + transform="matrix(4.2343801,0,0,-4.2343764,511.99324,725.12292)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 v 20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 V 6.381 C 7.028,2.858 3.878,0 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path100-1" + inkscape:connector-curvature="0" /> + </g> + <g + id="g102-2" + transform="matrix(4.2343801,0,0,-4.2343764,636.90407,624.34645)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c 0,-12.052 9.765,-21.815 21.815,-21.815 12.041,0 21.808,9.763 21.808,21.815 0,12.044 -9.767,21.802 -21.808,21.802 C 9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path104-7" + inkscape:connector-curvature="0" /> + </g> + <g + id="g106-0" + transform="matrix(4.2343801,0,0,-4.2343764,659.13434,629.82505)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c 0,-7.994 6.477,-14.473 14.471,-14.473 8.002,0 14.479,6.479 14.479,14.473 0,7.994 -6.477,14.479 -14.479,14.479 C 6.477,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path108-9" + inkscape:connector-curvature="0" /> + </g> + </g> +</svg> diff --git a/modules/gdnative/godot/godot_variant.h b/modules/gdnative/godot/godot_variant.h index 0a5771d2f6..bf0e2bf64e 100644 --- a/modules/gdnative/godot/godot_variant.h +++ b/modules/gdnative/godot/godot_variant.h @@ -62,7 +62,7 @@ typedef enum godot_variant_type { GODOT_VARIANT_TYPE_TRANSFORM2D, GODOT_VARIANT_TYPE_PLANE, GODOT_VARIANT_TYPE_QUAT, // 10 - GODOT_VARIANT_TYPE_RECT3, //sorry naming convention fail :( not like it's used often + GODOT_VARIANT_TYPE_RECT3, GODOT_VARIANT_TYPE_BASIS, GODOT_VARIANT_TYPE_TRANSFORM, diff --git a/modules/gdscript/gd_function.cpp b/modules/gdscript/gd_function.cpp index 608256c88a..fb32d23ad5 100644 --- a/modules/gdscript/gd_function.cpp +++ b/modules/gdscript/gd_function.cpp @@ -1433,9 +1433,21 @@ Variant GDFunctionState::_signal_callback(const Variant **p_args, int p_argcount return ret; } -bool GDFunctionState::is_valid() const { +bool GDFunctionState::is_valid(bool p_extended_check) const { + + if (function == NULL) + return false; + + if (p_extended_check) { + //class instance gone? + if (state.instance_id && !ObjectDB::get_instance(state.instance_id)) + return false; + //script gone? + if (state.script_id && !ObjectDB::get_instance(state.script_id)) + return false; + } - return function != NULL; + return true; } Variant GDFunctionState::resume(const Variant &p_arg) { @@ -1464,7 +1476,7 @@ Variant GDFunctionState::resume(const Variant &p_arg) { void GDFunctionState::_bind_methods() { ClassDB::bind_method(D_METHOD("resume:Variant", "arg"), &GDFunctionState::resume, DEFVAL(Variant())); - ClassDB::bind_method(D_METHOD("is_valid"), &GDFunctionState::is_valid); + ClassDB::bind_method(D_METHOD("is_valid", "extended_check"), &GDFunctionState::is_valid, DEFVAL(false)); ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "_signal_callback", &GDFunctionState::_signal_callback, MethodInfo("_signal_callback")); } diff --git a/modules/gdscript/gd_function.h b/modules/gdscript/gd_function.h index f0bf33147b..6d20b19777 100644 --- a/modules/gdscript/gd_function.h +++ b/modules/gdscript/gd_function.h @@ -237,7 +237,7 @@ protected: static void _bind_methods(); public: - bool is_valid() const; + bool is_valid(bool p_extended_check = false) const; Variant resume(const Variant &p_arg = Variant()); GDFunctionState(); ~GDFunctionState(); diff --git a/platform/android/java/res/drawable/icon.png b/platform/android/java/res/drawable/icon.png Binary files differindex a0a0f4af25..29c4a7b8fc 100644 --- a/platform/android/java/res/drawable/icon.png +++ b/platform/android/java/res/drawable/icon.png diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm index e075941d36..5dc0fb08b1 100644 --- a/platform/iphone/app_delegate.mm +++ b/platform/iphone/app_delegate.mm @@ -49,6 +49,8 @@ #import <Parse/Parse.h> #endif +#import "GameController/GameController.h" + #define kFilteringFactor 0.1 #define kRenderingFrequency 60 #define kAccelerometerFrequency 100.0 // Hz @@ -89,6 +91,282 @@ static ViewController *mainViewController = nil; return mainViewController; } +NSMutableDictionary *ios_joysticks = nil; + +- (GCControllerPlayerIndex)getFreePlayerIndex { + bool have_player_1 = false; + bool have_player_2 = false; + bool have_player_3 = false; + bool have_player_4 = false; + + if (ios_joysticks == nil) { + NSArray *keys = [ios_joysticks allKeys]; + for (NSNumber *key in keys) { + GCController *controller = [ios_joysticks objectForKey:key]; + if (controller.playerIndex == GCControllerPlayerIndex1) { + have_player_1 = true; + } else if (controller.playerIndex == GCControllerPlayerIndex2) { + have_player_2 = true; + } else if (controller.playerIndex == GCControllerPlayerIndex3) { + have_player_3 = true; + } else if (controller.playerIndex == GCControllerPlayerIndex4) { + have_player_4 = true; + }; + }; + }; + + if (!have_player_1) { + return GCControllerPlayerIndex1; + } else if (!have_player_2) { + return GCControllerPlayerIndex2; + } else if (!have_player_3) { + return GCControllerPlayerIndex3; + } else if (!have_player_4) { + return GCControllerPlayerIndex4; + } else { + return GCControllerPlayerIndexUnset; + }; +}; + +- (void)controllerWasConnected:(NSNotification *)notification { + // create our dictionary if we don't have one yet + if (ios_joysticks == nil) { + ios_joysticks = [[NSMutableDictionary alloc] init]; + }; + + // get our controller + GCController *controller = (GCController *)notification.object; + if (controller == nil) { + printf("Couldn't retrieve new controller\n"); + } else if ([[ios_joysticks allKeysForObject:controller] count] != 0) { + printf("Controller is already registered\n"); + } else { + // get a new id for our controller + int joy_id = OSIPhone::get_singleton()->get_unused_joy_id(); + if (joy_id != -1) { + // assign our player index + if (controller.playerIndex == GCControllerPlayerIndexUnset) { + controller.playerIndex = [self getFreePlayerIndex]; + }; + + // tell Godot about our new controller + OSIPhone::get_singleton()->joy_connection_changed( + joy_id, true, [controller.vendorName UTF8String]); + + // add it to our dictionary, this will retain our controllers + [ios_joysticks setObject:controller + forKey:[NSNumber numberWithInt:joy_id]]; + + // set our input handler + [self setControllerInputHandler:controller]; + } else { + printf("Couldn't retrieve new joy id\n"); + }; + }; +}; + +- (void)controllerWasDisconnected:(NSNotification *)notification { + if (ios_joysticks != nil) { + // find our joystick, there should be only one in our dictionary + GCController *controller = (GCController *)notification.object; + NSArray *keys = [ios_joysticks allKeysForObject:controller]; + for (NSNumber *key in keys) { + // tell Godot this joystick is no longer there + int joy_id = [key intValue]; + OSIPhone::get_singleton()->joy_connection_changed(joy_id, false, ""); + + // and remove it from our dictionary + [ios_joysticks removeObjectForKey:key]; + }; + }; +}; + +- (int)getJoyIdForController:(GCController *)controller { + if (ios_joysticks != nil) { + // find our joystick, there should be only one in our dictionary + NSArray *keys = [ios_joysticks allKeysForObject:controller]; + for (NSNumber *key in keys) { + int joy_id = [key intValue]; + return joy_id; + }; + }; + + return -1; +}; + +- (void)setControllerInputHandler:(GCController *)controller { + // Hook in the callback handler for the correct gamepad profile. + // This is a bit of a weird design choice on Apples part. + // You need to select the most capable gamepad profile for the + // gamepad attached. + if (controller.extendedGamepad != nil) { + // The extended gamepad profile has all the input you could possibly find on + // a gamepad but will only be active if your gamepad actually has all of + // these... + controller.extendedGamepad.valueChangedHandler = ^( + GCExtendedGamepad *gamepad, GCControllerElement *element) { + int joy_id = [self getJoyIdForController:controller]; + + if (element == gamepad.buttonA) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_0, + gamepad.buttonA.isPressed); + } else if (element == gamepad.buttonB) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_1, + gamepad.buttonB.isPressed); + } else if (element == gamepad.buttonX) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_2, + gamepad.buttonX.isPressed); + } else if (element == gamepad.buttonY) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_3, + gamepad.buttonY.isPressed); + } else if (element == gamepad.leftShoulder) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_L, + gamepad.leftShoulder.isPressed); + } else if (element == gamepad.rightShoulder) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_R, + gamepad.rightShoulder.isPressed); + } else if (element == gamepad.leftTrigger) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_L2, + gamepad.leftTrigger.isPressed); + } else if (element == gamepad.rightTrigger) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_R2, + gamepad.rightTrigger.isPressed); + } else if (element == gamepad.dpad) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_UP, + gamepad.dpad.up.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_DOWN, + gamepad.dpad.down.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_LEFT, + gamepad.dpad.left.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_RIGHT, + gamepad.dpad.right.isPressed); + }; + + InputDefault::JoyAxis jx; + jx.min = -1; + if (element == gamepad.leftThumbstick) { + jx.value = gamepad.leftThumbstick.xAxis.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_LX, jx); + jx.value = -gamepad.leftThumbstick.yAxis.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_LY, jx); + } else if (element == gamepad.rightThumbstick) { + jx.value = gamepad.rightThumbstick.xAxis.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_RX, jx); + jx.value = -gamepad.rightThumbstick.yAxis.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_RY, jx); + } else if (element == gamepad.leftTrigger) { + jx.value = gamepad.leftTrigger.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_L2, jx); + } else if (element == gamepad.rightTrigger) { + jx.value = gamepad.rightTrigger.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_R2, jx); + }; + }; + } else if (controller.gamepad != nil) { + // gamepad is the standard profile with 4 buttons, shoulder buttons and a + // D-pad + controller.gamepad.valueChangedHandler = ^(GCGamepad *gamepad, + GCControllerElement *element) { + int joy_id = [self getJoyIdForController:controller]; + + if (element == gamepad.buttonA) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_0, + gamepad.buttonA.isPressed); + } else if (element == gamepad.buttonB) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_1, + gamepad.buttonB.isPressed); + } else if (element == gamepad.buttonX) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_2, + gamepad.buttonX.isPressed); + } else if (element == gamepad.buttonY) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_3, + gamepad.buttonY.isPressed); + } else if (element == gamepad.leftShoulder) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_L, + gamepad.leftShoulder.isPressed); + } else if (element == gamepad.rightShoulder) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_R, + gamepad.rightShoulder.isPressed); + } else if (element == gamepad.dpad) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_UP, + gamepad.dpad.up.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_DOWN, + gamepad.dpad.down.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_LEFT, + gamepad.dpad.left.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_RIGHT, + gamepad.dpad.right.isPressed); + }; + }; +#ifdef ADD_MICRO_GAMEPAD // disabling this for now, only available on iOS 9+, + // while we are setting that as the minimum, seems our + // build environment doesn't like it + } else if (controller.microGamepad != nil) { + // micro gamepads were added in OS 9 and feature just 2 buttons and a d-pad + controller.microGamepad.valueChangedHandler = + ^(GCMicroGamepad *gamepad, GCControllerElement *element) { + int joy_id = [self getJoyIdForController:controller]; + + if (element == gamepad.buttonA) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_0, + gamepad.buttonA.isPressed); + } else if (element == gamepad.buttonX) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_2, + gamepad.buttonX.isPressed); + } else if (element == gamepad.dpad) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_UP, + gamepad.dpad.up.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_DOWN, + gamepad.dpad.down.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_LEFT, + gamepad.dpad.left.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_RIGHT, + gamepad.dpad.right.isPressed); + }; + }; +#endif + }; + + ///@TODO need to add support for controller.motion which gives us access to + /// the orientation of the device (if supported) + + ///@TODO need to add support for controllerPausedHandler which should be a + /// toggle +}; + +- (void)initGameControllers { + // get told when controllers connect, this will be called right away for + // already connected controllers + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(controllerWasConnected:) + name:GCControllerDidConnectNotification + object:nil]; + + // get told when controllers disconnect + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(controllerWasDisconnected:) + name:GCControllerDidDisconnectNotification + object:nil]; +}; + +- (void)deinitGameControllers { + [[NSNotificationCenter defaultCenter] + removeObserver:self + name:GCControllerDidConnectNotification + object:nil]; + [[NSNotificationCenter defaultCenter] + removeObserver:self + name:GCControllerDidDisconnectNotification + object:nil]; + + if (ios_joysticks != nil) { + [ios_joysticks dealloc]; + ios_joysticks = nil; + }; +}; + static int frame_count = 0; - (void)drawView:(GLView *)view; { @@ -97,8 +375,10 @@ static int frame_count = 0; case 0: { int backingWidth; int backingHeight; - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, + GL_RENDERBUFFER_WIDTH_OES, &backingWidth); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, + GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); OS::VideoMode vm; vm.fullscreen = true; @@ -112,25 +392,35 @@ static int frame_count = 0; }; ++frame_count; - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, + NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; - //NSString *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; - OSIPhone::get_singleton()->set_data_dir(String::utf8([documentsDirectory UTF8String])); + // NSString *documentsDirectory = [[[NSFileManager defaultManager] + // URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] + // lastObject]; + OSIPhone::get_singleton()->set_data_dir( + String::utf8([documentsDirectory UTF8String])); - NSString *locale_code = [[[NSLocale preferredLanguages] objectAtIndex:0] substringToIndex:2]; - OSIPhone::get_singleton()->set_locale(String::utf8([locale_code UTF8String])); + NSString *locale_code = + [[[NSLocale preferredLanguages] objectAtIndex:0] substringToIndex:2]; + OSIPhone::get_singleton()->set_locale( + String::utf8([locale_code UTF8String])); NSString *uuid; - if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { + if ([[UIDevice currentDevice] + respondsToSelector:@selector(identifierForVendor)]) { uuid = [UIDevice currentDevice].identifierForVendor.UUIDString; } else { // before iOS 6, so just generate an identifier and store it - uuid = [[NSUserDefaults standardUserDefaults] objectForKey:@"identiferForVendor"]; + uuid = [[NSUserDefaults standardUserDefaults] + objectForKey:@"identiferForVendor"]; if (!uuid) { CFUUIDRef cfuuid = CFUUIDCreate(NULL); uuid = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, cfuuid); CFRelease(cfuuid); - [[NSUserDefaults standardUserDefaults] setObject:uuid forKey:@"identifierForVendor"]; + [[NSUserDefaults standardUserDefaults] + setObject:uuid + forKey:@"identifierForVendor"]; } } @@ -138,9 +428,9 @@ static int frame_count = 0; }; break; /* - case 1: { - ++frame_count; - }; break; + case 1: { + ++frame_count; + }; break; */ case 1: { @@ -173,9 +463,9 @@ static int frame_count = 0; }; break; /* - case 3: { - ++frame_count; - }; break; + case 3: { + ++frame_count; + }; break; */ case 2: { @@ -186,53 +476,85 @@ static int frame_count = 0; default: { if (OSIPhone::get_singleton()) { - //OSIPhone::get_singleton()->update_accelerometer(accel[0], accel[1], accel[2]); + // OSIPhone::get_singleton()->update_accelerometer(accel[0], accel[1], + // accel[2]); if (motionInitialised) { - // Just using polling approach for now, we can set this up so it sends data to us in intervals, might be better. - // See Apple reference pages for more details: + // Just using polling approach for now, we can set this up so it sends + // data to us in intervals, might be better. See Apple reference pages + // for more details: // https://developer.apple.com/reference/coremotion/cmmotionmanager?language=objc - // Apple splits our accelerometer date into a gravity and user movement component. We add them back together + // Apple splits our accelerometer date into a gravity and user movement + // component. We add them back together CMAcceleration gravity = motionManager.deviceMotion.gravity; - CMAcceleration acceleration = motionManager.deviceMotion.userAcceleration; + CMAcceleration acceleration = + motionManager.deviceMotion.userAcceleration; - ///@TODO We don't seem to be getting data here, is my device broken or is this code incorrect? - CMMagneticField magnetic = motionManager.deviceMotion.magneticField.field; + ///@TODO We don't seem to be getting data here, is my device broken or + /// is this code incorrect? + CMMagneticField magnetic = + motionManager.deviceMotion.magneticField.field; - ///@TODO we can access rotationRate as a CMRotationRate variable (processed date) or CMGyroData (raw data), have to see what works best + ///@TODO we can access rotationRate as a CMRotationRate variable + ///(processed date) or CMGyroData (raw data), have to see what works + /// best CMRotationRate rotation = motionManager.deviceMotion.rotationRate; // Adjust for screen orientation. - // [[UIDevice currentDevice] orientation] changes even if we've fixed our orientation which is not - // a good thing when you're trying to get your user to move the screen in all directions and want consistent output - - ///@TODO Using [[UIApplication sharedApplication] statusBarOrientation] is a bit of a hack. Godot obviously knows the orientation so maybe we + // [[UIDevice currentDevice] orientation] changes even if we've fixed + // our orientation which is not a good thing when you're trying to get + // your user to move the screen in all directions and want consistent + // output + + ///@TODO Using [[UIApplication sharedApplication] statusBarOrientation] + /// is a bit of a hack. Godot obviously knows the orientation so maybe + /// we // can use that instead? (note that left and right seem swapped) switch ([[UIApplication sharedApplication] statusBarOrientation]) { case UIDeviceOrientationLandscapeLeft: { - OSIPhone::get_singleton()->update_gravity(-gravity.y, gravity.x, gravity.z); - OSIPhone::get_singleton()->update_accelerometer(-(acceleration.y + gravity.y), (acceleration.x + gravity.x), acceleration.z + gravity.z); - OSIPhone::get_singleton()->update_magnetometer(-magnetic.y, magnetic.x, magnetic.z); - OSIPhone::get_singleton()->update_gyroscope(-rotation.y, rotation.x, rotation.z); + OSIPhone::get_singleton()->update_gravity(-gravity.y, gravity.x, + gravity.z); + OSIPhone::get_singleton()->update_accelerometer( + -(acceleration.y + gravity.y), (acceleration.x + gravity.x), + acceleration.z + gravity.z); + OSIPhone::get_singleton()->update_magnetometer( + -magnetic.y, magnetic.x, magnetic.z); + OSIPhone::get_singleton()->update_gyroscope(-rotation.y, rotation.x, + rotation.z); }; break; case UIDeviceOrientationLandscapeRight: { - OSIPhone::get_singleton()->update_gravity(gravity.y, -gravity.x, gravity.z); - OSIPhone::get_singleton()->update_accelerometer((acceleration.y + gravity.y), -(acceleration.x + gravity.x), acceleration.z + gravity.z); - OSIPhone::get_singleton()->update_magnetometer(magnetic.y, -magnetic.x, magnetic.z); - OSIPhone::get_singleton()->update_gyroscope(rotation.y, -rotation.x, rotation.z); + OSIPhone::get_singleton()->update_gravity(gravity.y, -gravity.x, + gravity.z); + OSIPhone::get_singleton()->update_accelerometer( + (acceleration.y + gravity.y), -(acceleration.x + gravity.x), + acceleration.z + gravity.z); + OSIPhone::get_singleton()->update_magnetometer( + magnetic.y, -magnetic.x, magnetic.z); + OSIPhone::get_singleton()->update_gyroscope(rotation.y, -rotation.x, + rotation.z); }; break; case UIDeviceOrientationPortraitUpsideDown: { - OSIPhone::get_singleton()->update_gravity(-gravity.x, gravity.y, gravity.z); - OSIPhone::get_singleton()->update_accelerometer(-(acceleration.x + gravity.x), (acceleration.y + gravity.y), acceleration.z + gravity.z); - OSIPhone::get_singleton()->update_magnetometer(-magnetic.x, magnetic.y, magnetic.z); - OSIPhone::get_singleton()->update_gyroscope(-rotation.x, rotation.y, rotation.z); + OSIPhone::get_singleton()->update_gravity(-gravity.x, gravity.y, + gravity.z); + OSIPhone::get_singleton()->update_accelerometer( + -(acceleration.x + gravity.x), (acceleration.y + gravity.y), + acceleration.z + gravity.z); + OSIPhone::get_singleton()->update_magnetometer( + -magnetic.x, magnetic.y, magnetic.z); + OSIPhone::get_singleton()->update_gyroscope(-rotation.x, rotation.y, + rotation.z); }; break; default: { // assume portrait - OSIPhone::get_singleton()->update_gravity(gravity.x, gravity.y, gravity.z); - OSIPhone::get_singleton()->update_accelerometer(acceleration.x + gravity.x, acceleration.y + gravity.y, acceleration.z + gravity.z); - OSIPhone::get_singleton()->update_magnetometer(magnetic.x, magnetic.y, magnetic.z); - OSIPhone::get_singleton()->update_gyroscope(rotation.x, rotation.y, rotation.z); + OSIPhone::get_singleton()->update_gravity(gravity.x, gravity.y, + gravity.z); + OSIPhone::get_singleton()->update_accelerometer( + acceleration.x + gravity.x, acceleration.y + gravity.y, + acceleration.z + gravity.z); + OSIPhone::get_singleton()->update_magnetometer(magnetic.x, magnetic.y, + magnetic.z); + OSIPhone::get_singleton()->update_gyroscope(rotation.x, rotation.y, + rotation.z); }; break; }; } @@ -247,7 +569,8 @@ static int frame_count = 0; - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { printf("****************** did receive memory warning!\n"); - OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_OS_MEMORY_WARNING); + OS::get_singleton()->get_main_loop()->notification( + MainLoop::NOTIFICATION_OS_MEMORY_WARNING); }; - (void)applicationDidFinishLaunching:(UIApplication *)application { @@ -257,25 +580,29 @@ static int frame_count = 0; [application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; // disable idle timer - //application.idleTimerDisabled = YES; + // application.idleTimerDisabled = YES; - //Create a full-screen window + // Create a full-screen window window = [[UIWindow alloc] initWithFrame:rect]; - //window.autoresizesSubviews = YES; - //[window setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleWidth]; + // window.autoresizesSubviews = YES; + //[window setAutoresizingMask:UIViewAutoresizingFlexibleWidth | + // UIViewAutoresizingFlexibleWidth]; - //Create the OpenGL ES view and add it to the window + // Create the OpenGL ES view and add it to the window GLView *glView = [[GLView alloc] initWithFrame:rect]; printf("glview is %p\n", glView); //[window addSubview:glView]; glView.delegate = self; - //glView.autoresizesSubviews = YES; - //[glView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleWidth]; + // glView.autoresizesSubviews = YES; + //[glView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | + // UIViewAutoresizingFlexibleWidth]; int backingWidth; int backingHeight; - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, + GL_RENDERBUFFER_WIDTH_OES, &backingWidth); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, + GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); iphone_main(backingWidth, backingHeight, gargc, gargv); @@ -284,26 +611,30 @@ static int frame_count = 0; window.rootViewController = view_controller; _set_keep_screen_on(bool(GLOBAL_DEF("display/keep_screen_on", true)) ? YES : NO); - glView.useCADisplayLink = bool(GLOBAL_DEF("display.iOS/use_cadisplaylink", true)) ? YES : NO; + glView.useCADisplayLink = + bool(GLOBAL_DEF("display.iOS/use_cadisplaylink", true)) ? YES : NO; printf("cadisaplylink: %d", glView.useCADisplayLink); glView.animationInterval = 1.0 / kRenderingFrequency; [glView startAnimation]; - //Show the window + // Show the window [window makeKeyAndVisible]; - //Configure and start accelerometer + // Configure and start accelerometer if (!motionInitialised) { motionManager = [[CMMotionManager alloc] init]; if (motionManager.deviceMotionAvailable) { motionManager.deviceMotionUpdateInterval = 1.0 / 70.0; - [motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXMagneticNorthZVertical]; + [motionManager startDeviceMotionUpdatesUsingReferenceFrame: + CMAttitudeReferenceFrameXMagneticNorthZVertical]; motionInitialised = YES; }; }; - //OSIPhone::screen_width = rect.size.width - rect.origin.x; - //OSIPhone::screen_height = rect.size.height - rect.origin.y; + [self initGameControllers]; + + // OSIPhone::screen_width = rect.size.width - rect.origin.x; + // OSIPhone::screen_height = rect.size.height - rect.origin.y; mainViewController = view_controller; @@ -319,16 +650,22 @@ static int frame_count = 0; String adid = GLOBAL_DEF("mobileapptracker/advertiser_id", ""); String convkey = GLOBAL_DEF("mobileapptracker/conversion_key", ""); - NSString *advertiser_id = [NSString stringWithUTF8String:adid.utf8().get_data()]; - NSString *conversion_key = [NSString stringWithUTF8String:convkey.utf8().get_data()]; + NSString *advertiser_id = + [NSString stringWithUTF8String:adid.utf8().get_data()]; + NSString *conversion_key = + [NSString stringWithUTF8String:convkey.utf8().get_data()]; // Account Configuration info - must be set - [MobileAppTracker initializeWithMATAdvertiserId:advertiser_id MATConversionKey:conversion_key]; + [MobileAppTracker initializeWithMATAdvertiserId:advertiser_id + MATConversionKey:conversion_key]; // Used to pass us the IFA, enables highly accurate 1-to-1 attribution. // Required for many advertising networks. - [MobileAppTracker setAppleAdvertisingIdentifier:[[ASIdentifierManager sharedManager] advertisingIdentifier] - advertisingTrackingEnabled:[[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]]; + [MobileAppTracker + setAppleAdvertisingIdentifier:[[ASIdentifierManager sharedManager] + advertisingIdentifier] + advertisingTrackingEnabled:[[ASIdentifierManager sharedManager] + isAdvertisingTrackingEnabled]]; #endif }; @@ -337,6 +674,8 @@ static int frame_count = 0; printf("********************* will terminate\n"); + [self deinitGameControllers]; + if (motionInitialised) { ///@TODO is this the right place to clean this up? [motionManager stopDeviceMotionUpdates]; @@ -353,7 +692,8 @@ static int frame_count = 0; ///@TODO maybe add pause motionManager? and where would we unpause it? if (OS::get_singleton()->get_main_loop()) - OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); + OS::get_singleton()->get_main_loop()->notification( + MainLoop::NOTIFICATION_WM_FOCUS_OUT); [view_controller.view stopAnimation]; if (OS::get_singleton()->native_video_is_playing()) { @@ -363,14 +703,15 @@ static int frame_count = 0; - (void)applicationWillEnterForeground:(UIApplication *)application { printf("********************* did enter foreground\n"); - //OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); + // OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); [view_controller.view startAnimation]; } - (void)applicationWillResignActive:(UIApplication *)application { printf("********************* will resign active\n"); - //OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); - [view_controller.view stopAnimation]; // FIXME: pause seems to be recommended elsewhere + // OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); + [view_controller.view + stopAnimation]; // FIXME: pause seems to be recommended elsewhere } - (void)applicationDidBecomeActive:(UIApplication *)application { @@ -380,9 +721,11 @@ static int frame_count = 0; [MobileAppTracker measureSession]; #endif if (OS::get_singleton()->get_main_loop()) - OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); + OS::get_singleton()->get_main_loop()->notification( + MainLoop::NOTIFICATION_WM_FOCUS_IN); - [view_controller.view startAnimation]; // FIXME: resume seems to be recommended elsewhere + [view_controller.view + startAnimation]; // FIXME: resume seems to be recommended elsewhere if (OSIPhone::get_singleton()->native_video_is_playing()) { OSIPhone::get_singleton()->native_video_unpause(); }; @@ -397,14 +740,17 @@ static int frame_count = 0; } // For 4.2+ support -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation { #ifdef MODULE_PARSE_ENABLED NSLog(@"Handling application openURL"); - return [[FBSDKApplicationDelegate sharedInstance] - application:application - openURL:url - sourceApplication:sourceApplication - annotation:annotation]; + return + [[FBSDKApplicationDelegate sharedInstance] application:application + openURL:url + sourceApplication:sourceApplication + annotation:annotation]; #endif #ifdef MODULE_FACEBOOKSCORER_IOS_ENABLED @@ -414,21 +760,25 @@ static int frame_count = 0; #endif } -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { +- (void)application:(UIApplication *)application + didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { #ifdef MODULE_PARSE_ENABLED // Store the deviceToken in the current installation and save it to Parse. PFInstallation *currentInstallation = [PFInstallation currentInstallation]; - //NSString* token = [[NSString alloc] initWithData:deviceToken encoding:NSUTF8StringEncoding]; + // NSString* token = [[NSString alloc] initWithData:deviceToken + // encoding:NSUTF8StringEncoding]; NSLog(@"Device Token : %@ ", deviceToken); [currentInstallation setDeviceTokenFromData:deviceToken]; [currentInstallation saveInBackground]; #endif } -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { +- (void)application:(UIApplication *)application + didReceiveRemoteNotification:(NSDictionary *)userInfo { #ifdef MODULE_PARSE_ENABLED [PFPush handlePush:userInfo]; - NSDictionary *aps = [userInfo objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; + NSDictionary *aps = + [userInfo objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSLog(@"Push Notification Payload (app active) %@", aps); diff --git a/platform/iphone/os_iphone.cpp b/platform/iphone/os_iphone.cpp index bc25afabea..0a9d776421 100644 --- a/platform/iphone/os_iphone.cpp +++ b/platform/iphone/os_iphone.cpp @@ -357,6 +357,22 @@ void OSIPhone::update_gyroscope(float p_x, float p_y, float p_z) { input->set_gyroscope(Vector3(p_x, p_y, p_z)); }; +int OSIPhone::get_unused_joy_id() { + return input->get_unused_joy_id(); +}; + +void OSIPhone::joy_connection_changed(int p_idx, bool p_connected, String p_name) { + input->joy_connection_changed(p_idx, p_connected, p_name); +}; + +void OSIPhone::joy_button(int p_device, int p_button, bool p_pressed) { + input->joy_button(p_device, p_button, p_pressed); +}; + +void OSIPhone::joy_axis(int p_device, int p_axis, const InputDefault::JoyAxis &p_value) { + input->joy_axis(p_device, p_axis, p_value); +}; + void OSIPhone::delete_main_loop() { if (main_loop) { diff --git a/platform/iphone/os_iphone.h b/platform/iphone/os_iphone.h index 754dea073f..209bf00788 100644 --- a/platform/iphone/os_iphone.h +++ b/platform/iphone/os_iphone.h @@ -145,6 +145,11 @@ public: void update_magnetometer(float p_x, float p_y, float p_z); void update_gyroscope(float p_x, float p_y, float p_z); + int get_unused_joy_id(); + void joy_connection_changed(int p_idx, bool p_connected, String p_name); + void joy_button(int p_device, int p_button, bool p_pressed); + void joy_axis(int p_device, int p_axis, const InputDefault::JoyAxis &p_value); + static OSIPhone *get_singleton(); virtual void set_mouse_show(bool p_show); diff --git a/scene/resources/bit_mask.h b/scene/resources/bit_mask.h index c9be9f0cad..5ab7a3134d 100644 --- a/scene/resources/bit_mask.h +++ b/scene/resources/bit_mask.h @@ -30,7 +30,7 @@ #ifndef BIT_MASK_H #define BIT_MASK_H -#include "image.h" 0 +#include "image.h" #include "io/resource_loader.h" #include "resource.h" |