diff options
-rw-r--r-- | DONORS.md | 26 | ||||
-rw-r--r-- | drivers/gles3/shader_compiler_gles3.cpp | 62 | ||||
-rw-r--r-- | drivers/gles3/shader_compiler_gles3.h | 2 | ||||
-rw-r--r-- | modules/gdnative/gdnative.cpp | 23 | ||||
-rw-r--r-- | modules/gdnative/gdnative.h | 9 | ||||
-rw-r--r-- | modules/gdnative/nativescript/nativescript.cpp | 22 | ||||
-rw-r--r-- | modules/mono/mono_gd/gd_mono_field.h | 2 |
7 files changed, 87 insertions, 59 deletions
@@ -35,24 +35,24 @@ generous deed immortalized in the next stable release of Godot Engine. Pascal Julien Ruslan Mustakov Slobodan Milnovic + Stephan Lanfermann + Thomas Mathews ## Gold donors 3Dexplorer Alexander Otto - Andy Meier Asdf cheese65536 Jake Bo - Javier Manuele Finocchiaro Officine Pixel S.n.c. Rémi Verschelde - Stephan Lanfermann Zaven Muradyan Andreas Schüle Austen McRae + Benjamin Botwin Bernhard Liebl Cody Brocious Gerald E Butler @@ -72,7 +72,6 @@ generous deed immortalized in the next stable release of Godot Engine. Guilherme Felipe de C. G. da Silva Henrique Alves Laurence Bannister - Leo Przemysław Gołąb (n-pigeon) Robert Willes Robin Arys @@ -97,11 +96,13 @@ generous deed immortalized in the next stable release of Godot Engine. François Cantin Giovanni Solimeno Jeppe Zapp + joe513 Justin Arnold Justo Delgado Baudí Leandro Voltolino Lucien Boudy - Noah + Markus Wiesner + Pablo Cholaky Patrick Schnorbus Pete Goodwin Ryan Estes @@ -112,16 +113,17 @@ generous deed immortalized in the next stable release of Godot Engine. ## Silver donors 1D_Inc - Abe Pazos Alder Stefano Alessandro Senese Alex Barsukov + Álvaro Domínguez López Andres Cuevas Anthony Bongiovanni Avencherus Bastian Böhm Ben Vercammen Blair Allen + Bryanna M Bryan Stevenson Casey Foote Christian Baune @@ -129,6 +131,7 @@ generous deed immortalized in the next stable release of Godot Engine. Collin Shooltz Daniel Egger Daniel Kaplan + Daniel Mircea David Cravens David May Diego Moreira Guimarães @@ -137,14 +140,13 @@ generous deed immortalized in the next stable release of Godot Engine. Fabian Becker fengjiongmax Francesco Lisi - Frank C. Simmons Fredy Romero Sam G3Dev sàrl Geequlim Gerrit Großkopf + Gilberto K. Otubo Guldoman HardRound - hatniX HeartBeast Heribert Hirth Hunter Jones @@ -152,13 +154,13 @@ generous deed immortalized in the next stable release of Godot Engine. Jeff Hungerford Jerry Chen Jesse Liles - joe513 Jonathon Josh 'Cheeseness' Bush Juan Negrier JuDelCo Julian Murgia Juraj Móza + Karonis KC Chan Kevin Boyer Kevin Kamper Meejach Petersen @@ -166,7 +168,6 @@ generous deed immortalized in the next stable release of Godot Engine. Linus Lind Lundgren Lisandro Lorea magodev - Markus Wiesner Martin Novák Matthew Fitzpatrick Matthias Hölzl @@ -174,9 +175,9 @@ generous deed immortalized in the next stable release of Godot Engine. memoryruins mhilbrunner Michael Gringauz - Michael Tintiuc Mikael Olsson MoM + monokrome Moritz Laass nee Neil Blakey-Milner @@ -191,16 +192,15 @@ generous deed immortalized in the next stable release of Godot Engine. Paweł Kowal Pierre-Igor Berthet Pietro Vertechi - rayos Richman Stewart Rodolfo Baeza Roger Burgess Roger Smith Roman Tinkov - Sam Van Campenhout Sasori Olkof Scott D. Yelich Sootstone + Stephen Traskal Theo Cranmore Thomas Norman Tom Larrow diff --git a/drivers/gles3/shader_compiler_gles3.cpp b/drivers/gles3/shader_compiler_gles3.cpp index ac43b3ce1b..875946f089 100644 --- a/drivers/gles3/shader_compiler_gles3.cpp +++ b/drivers/gles3/shader_compiler_gles3.cpp @@ -267,7 +267,7 @@ void ShaderCompilerGLES3::_dump_function_deps(SL::ShaderNode *p_node, const Stri } } -String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions) { +String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions, bool p_assigning) { String code; @@ -407,7 +407,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener //code for functions for (int i = 0; i < pnode->functions.size(); i++) { SL::FunctionNode *fnode = pnode->functions[i].function; - function_code[fnode->name] = _dump_node_code(fnode->body, p_level + 1, r_gen_code, p_actions, p_default_actions); + function_code[fnode->name] = _dump_node_code(fnode->body, p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning); } //place functions in actual code @@ -455,7 +455,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener for (int i = 0; i < bnode->statements.size(); i++) { - String scode = _dump_node_code(bnode->statements[i], p_level, r_gen_code, p_actions, p_default_actions); + String scode = _dump_node_code(bnode->statements[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); if (bnode->statements[i]->type == SL::Node::TYPE_CONTROL_FLOW || bnode->single_statement) { code += scode; //use directly @@ -481,7 +481,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener declaration += _mkid(vdnode->declarations[i].name); if (vdnode->declarations[i].initializer) { declaration += "="; - declaration += _dump_node_code(vdnode->declarations[i].initializer, p_level, r_gen_code, p_actions, p_default_actions); + declaration += _dump_node_code(vdnode->declarations[i].initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning); } } @@ -490,6 +490,10 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener case SL::Node::TYPE_VARIABLE: { SL::VariableNode *vnode = (SL::VariableNode *)p_node; + if (p_assigning && p_actions.write_flag_pointers.has(vnode->name)) { + *p_actions.write_flag_pointers[vnode->name] = true; + } + if (p_default_actions.usage_defines.has(vnode->name) && !used_name_defines.has(vnode->name)) { String define = p_default_actions.usage_defines[vnode->name]; if (define.begins_with("@")) { @@ -540,24 +544,18 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener case SL::OP_ASSIGN_BIT_AND: case SL::OP_ASSIGN_BIT_OR: case SL::OP_ASSIGN_BIT_XOR: - if (onode->arguments[0]->type == SL::Node::TYPE_VARIABLE) { - SL::VariableNode *vnode = (SL::VariableNode *)onode->arguments[0]; - if (p_actions.write_flag_pointers.has(vnode->name)) { - *p_actions.write_flag_pointers[vnode->name] = true; - } - } - code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions); + code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, true) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); break; case SL::OP_BIT_INVERT: case SL::OP_NEGATE: case SL::OP_NOT: case SL::OP_DECREMENT: case SL::OP_INCREMENT: - code = _opstr(onode->op) + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions); + code = _opstr(onode->op) + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); break; case SL::OP_POST_DECREMENT: case SL::OP_POST_INCREMENT: - code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions) + _opstr(onode->op); + code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + _opstr(onode->op); break; case SL::OP_CALL: case SL::OP_CONSTRUCT: { @@ -584,31 +582,31 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener for (int i = 1; i < onode->arguments.size(); i++) { if (i > 1) code += ", "; - code += _dump_node_code(onode->arguments[i], p_level, r_gen_code, p_actions, p_default_actions); + code += _dump_node_code(onode->arguments[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); } code += ")"; } break; case SL::OP_INDEX: { - code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions); + code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); code += "["; - code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions); + code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); code += "]"; } break; case SL::OP_SELECT_IF: { - code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions); + code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); code += "?"; - code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions); + code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); code += ":"; - code += _dump_node_code(onode->arguments[2], p_level, r_gen_code, p_actions, p_default_actions); + code += _dump_node_code(onode->arguments[2], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); } break; default: { - code = "(" + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions) + ")"; + code = "(" + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")"; break; } } @@ -618,29 +616,29 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener SL::ControlFlowNode *cfnode = (SL::ControlFlowNode *)p_node; if (cfnode->flow_op == SL::FLOW_OP_IF) { - code += _mktab(p_level) + "if (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions) + ")\n"; - code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions); + code += _mktab(p_level) + "if (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n"; + code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning); if (cfnode->blocks.size() == 2) { code += _mktab(p_level) + "else\n"; - code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions); + code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning); } } else if (cfnode->flow_op == SL::FLOW_OP_WHILE) { - code += _mktab(p_level) + "while (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions) + ")\n"; - code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions); + code += _mktab(p_level) + "while (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n"; + code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning); } else if (cfnode->flow_op == SL::FLOW_OP_FOR) { - String left = _dump_node_code(cfnode->blocks[0], p_level, r_gen_code, p_actions, p_default_actions); - String middle = _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions); - String right = _dump_node_code(cfnode->expressions[1], p_level, r_gen_code, p_actions, p_default_actions); + String left = _dump_node_code(cfnode->blocks[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + String middle = _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + String right = _dump_node_code(cfnode->expressions[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); code += _mktab(p_level) + "for (" + left + ";" + middle + ";" + right + ")\n"; - code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions); + code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning); } else if (cfnode->flow_op == SL::FLOW_OP_RETURN) { if (cfnode->expressions.size()) { - code = "return " + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions) + ";"; + code = "return " + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ";"; } else { code = "return;"; } @@ -658,7 +656,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener } break; case SL::Node::TYPE_MEMBER: { SL::MemberNode *mnode = (SL::MemberNode *)p_node; - code = _dump_node_code(mnode->owner, p_level, r_gen_code, p_actions, p_default_actions) + "." + mnode->name; + code = _dump_node_code(mnode->owner, p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + "." + mnode->name; } break; } @@ -694,7 +692,7 @@ Error ShaderCompilerGLES3::compile(VS::ShaderMode p_mode, const String &p_code, used_rmode_defines.clear(); used_flag_pointers.clear(); - _dump_node_code(parser.get_shader(), 1, r_gen_code, *p_actions, actions[p_mode]); + _dump_node_code(parser.get_shader(), 1, r_gen_code, *p_actions, actions[p_mode], false); if (r_gen_code.uniform_total_size) { //uniforms used? int md = sizeof(float) * 4; diff --git a/drivers/gles3/shader_compiler_gles3.h b/drivers/gles3/shader_compiler_gles3.h index 44141c09f1..85e8e02b8e 100644 --- a/drivers/gles3/shader_compiler_gles3.h +++ b/drivers/gles3/shader_compiler_gles3.h @@ -78,7 +78,7 @@ private: }; void _dump_function_deps(ShaderLanguage::ShaderNode *p_node, const StringName &p_for_func, const Map<StringName, String> &p_func_code, String &r_to_add, Set<StringName> &added); - String _dump_node_code(ShaderLanguage::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions); + String _dump_node_code(ShaderLanguage::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions, bool p_assigning); StringName current_func_name; StringName vertex_name; diff --git a/modules/gdnative/gdnative.cpp b/modules/gdnative/gdnative.cpp index 73754a72fa..dec42dc17a 100644 --- a/modules/gdnative/gdnative.cpp +++ b/modules/gdnative/gdnative.cpp @@ -38,9 +38,12 @@ #include "scene/main/scene_tree.h" -const String init_symbol = "gdnative_init"; -const String terminate_symbol = "gdnative_terminate"; -const String default_symbol_prefix = "godot_"; +static const String init_symbol = "gdnative_init"; +static const String terminate_symbol = "gdnative_terminate"; +static const String default_symbol_prefix = "godot_"; +static const bool default_singleton = false; +static const bool default_load_once = true; +static const bool default_reloadable = true; // Defined in gdnative_api_struct.gen.cpp extern const godot_gdnative_core_api_struct api_struct; @@ -51,6 +54,9 @@ GDNativeLibrary::GDNativeLibrary() { config_file.instance(); symbol_prefix = default_symbol_prefix; + load_once = default_load_once; + singleton = default_singleton; + reloadable = default_reloadable; if (GDNativeLibrary::loaded_libraries == NULL) { GDNativeLibrary::loaded_libraries = memnew((Map<String, Vector<Ref<GDNative> > >)); @@ -69,14 +75,17 @@ void GDNativeLibrary::_bind_methods() { ClassDB::bind_method(D_METHOD("should_load_once"), &GDNativeLibrary::should_load_once); ClassDB::bind_method(D_METHOD("is_singleton"), &GDNativeLibrary::is_singleton); ClassDB::bind_method(D_METHOD("get_symbol_prefix"), &GDNativeLibrary::get_symbol_prefix); + ClassDB::bind_method(D_METHOD("is_reloadable"), &GDNativeLibrary::is_reloadable); ClassDB::bind_method(D_METHOD("set_load_once", "load_once"), &GDNativeLibrary::set_load_once); ClassDB::bind_method(D_METHOD("set_singleton", "singleton"), &GDNativeLibrary::set_singleton); ClassDB::bind_method(D_METHOD("set_symbol_prefix", "symbol_prefix"), &GDNativeLibrary::set_symbol_prefix); + ClassDB::bind_method(D_METHOD("set_reloadable", "reloadable"), &GDNativeLibrary::set_reloadable); ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "load_once"), "set_load_once", "should_load_once"); ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "singleton"), "set_singleton", "is_singleton"); ADD_PROPERTYNZ(PropertyInfo(Variant::STRING, "symbol_prefix"), "set_symbol_prefix", "get_symbol_prefix"); + ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "reloadable"), "set_reloadable", "is_reloadable"); } GDNative::GDNative() { @@ -318,9 +327,10 @@ RES GDNativeLibraryResourceLoader::load(const String &p_path, const String &p_or *r_error = err; } - lib->set_singleton(config->get_value("general", "singleton", false)); - lib->set_load_once(config->get_value("general", "load_once", true)); + lib->set_singleton(config->get_value("general", "singleton", default_singleton)); + lib->set_load_once(config->get_value("general", "load_once", default_load_once)); lib->set_symbol_prefix(config->get_value("general", "symbol_prefix", default_symbol_prefix)); + lib->set_reloadable(config->get_value("general", "reloadable", default_reloadable)); String entry_lib_path; { @@ -389,6 +399,7 @@ RES GDNativeLibraryResourceLoader::load(const String &p_path, const String &p_or } void GDNativeLibraryResourceLoader::get_recognized_extensions(List<String> *p_extensions) const { + p_extensions->clear(); p_extensions->push_back("gdnlib"); } @@ -416,6 +427,7 @@ Error GDNativeLibraryResourceSaver::save(const String &p_path, const RES &p_reso config->set_value("general", "singleton", lib->is_singleton()); config->set_value("general", "load_once", lib->should_load_once()); config->set_value("general", "symbol_prefix", lib->get_symbol_prefix()); + config->set_value("general", "reloadable", lib->is_reloadable()); return config->save(p_path); } @@ -426,6 +438,7 @@ bool GDNativeLibraryResourceSaver::recognize(const RES &p_resource) const { void GDNativeLibraryResourceSaver::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const { if (Object::cast_to<GDNativeLibrary>(*p_resource) != NULL) { + p_extensions->clear(); p_extensions->push_back("gdnlib"); } } diff --git a/modules/gdnative/gdnative.h b/modules/gdnative/gdnative.h index 5fe705869e..3298ea950f 100644 --- a/modules/gdnative/gdnative.h +++ b/modules/gdnative/gdnative.h @@ -60,6 +60,7 @@ class GDNativeLibrary : public Resource { bool singleton; bool load_once; String symbol_prefix; + bool reloadable; public: GDNativeLibrary(); @@ -87,6 +88,10 @@ public: return symbol_prefix; } + _FORCE_INLINE_ bool is_reloadable() const { + return reloadable; + } + _FORCE_INLINE_ void set_load_once(bool p_load_once) { load_once = p_load_once; } @@ -97,6 +102,10 @@ public: symbol_prefix = p_symbol_prefix; } + _FORCE_INLINE_ void set_reloadable(bool p_reloadable) { + reloadable = p_reloadable; + } + static void _bind_methods(); }; diff --git a/modules/gdnative/nativescript/nativescript.cpp b/modules/gdnative/nativescript/nativescript.cpp index 61b59f92e8..2d94599ea0 100644 --- a/modules/gdnative/nativescript/nativescript.cpp +++ b/modules/gdnative/nativescript/nativescript.cpp @@ -1111,7 +1111,13 @@ void NativeReloadNode::_notification(int p_what) { NSL->_unload_stuff(); for (Map<String, Ref<GDNative> >::Element *L = NSL->library_gdnatives.front(); L; L = L->next()) { - L->get()->terminate(); + Ref<GDNative> gdn = L->get(); + + if (!gdn->get_library()->is_reloadable()) { + continue; + } + + gdn->terminate(); NSL->library_classes.erase(L->key()); } @@ -1129,21 +1135,23 @@ void NativeReloadNode::_notification(int p_what) { Set<StringName> libs_to_remove; for (Map<String, Ref<GDNative> >::Element *L = NSL->library_gdnatives.front(); L; L = L->next()) { - if (!L->get()->initialize()) { + Ref<GDNative> gdn = L->get(); + + if (!gdn->get_library()->is_reloadable()) { + continue; + } + + if (!gdn->initialize()) { libs_to_remove.insert(L->key()); continue; } NSL->library_classes.insert(L->key(), Map<StringName, NativeScriptDesc>()); - void *args[1] = { - (void *)&L->key() - }; - // here the library registers all the classes and stuff. void *proc_ptr; - Error err = L->get()->get_symbol(L->get()->get_library()->get_symbol_prefix() + "nativescript_init", proc_ptr); + Error err = gdn->get_symbol(gdn->get_library()->get_symbol_prefix() + "nativescript_init", proc_ptr); if (err != OK) { ERR_PRINT(String("No godot_nativescript_init in \"" + L->key() + "\" found").utf8().get_data()); } else { diff --git a/modules/mono/mono_gd/gd_mono_field.h b/modules/mono/mono_gd/gd_mono_field.h index bf73975bfe..a6b368c4d6 100644 --- a/modules/mono/mono_gd/gd_mono_field.h +++ b/modules/mono/mono_gd/gd_mono_field.h @@ -63,7 +63,7 @@ public: void set_value_raw(MonoObject *p_object, void *p_ptr); void set_value_from_variant(MonoObject *p_object, const Variant &p_value); - _FORCE_INLINE_ MonoObject *get_value(MonoObject *p_object); + MonoObject *get_value(MonoObject *p_object); bool get_bool_value(MonoObject *p_object); int get_int_value(MonoObject *p_object); |