diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d413c70 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "godot-cpp"] + path = godot-cpp + url = https://github.com/Faless/godot-cpp.git diff --git a/SConstruct b/SConstruct new file mode 100644 index 0000000..41d0891 --- /dev/null +++ b/SConstruct @@ -0,0 +1,35 @@ +#!/usr/bin/env python +import os +import sys + +env = SConscript("godot-cpp/SConstruct") + +# For the reference: +# - CCFLAGS are compilation flags shared between C and C++ +# - CFLAGS are for C-specific compilation flags +# - CXXFLAGS are for C++-specific compilation flags +# - CPPFLAGS are for pre-processor flags +# - CPPDEFINES are for pre-processor defines +# - LINKFLAGS are for linking flags + +# tweak this if you want to use different folders, or more folders, to store your source code in. +env.Append(CPPPATH=["."]) +env.Append(CPPDEFINES=["GDEXTENSION"]) +sources = Glob("./*.cpp") + +if env["platform"] == "osx": + library = env.SharedLibrary( + "bin/libgdvisualscript.{}.{}.framework/libgdvisualscript.{}.{}".format( + env["platform"], env["target"], env["platform"], env["target"] + ), + source=sources, + ) +else: + library = env.SharedLibrary( + "bin/libgdvisualscript.{}.{}.{}{}".format( + env["platform"], env["target"], env["arch_suffix"], env["SHLIBSUFFIX"] + ), + source=sources, + ) + +Default(library) diff --git a/godot-cpp b/godot-cpp new file mode 160000 index 0000000..4a4ecdb --- /dev/null +++ b/godot-cpp @@ -0,0 +1 @@ +Subproject commit 4a4ecdb0148c47675b624463753dfa013c2aa4eb diff --git a/register_types.cpp b/register_types.cpp index 04a7442..59956e7 100644 --- a/register_types.cpp +++ b/register_types.cpp @@ -30,8 +30,19 @@ #include "register_types.h" +#ifdef GDEXTENSION +#include +#include +#include + +using namespace godot; + +#else +#include "modules/register_module_types.h" #include "core/config/engine.h" #include "core/io/resource_loader.h" +#endif + #include "visual_script.h" #include "visual_script_builtin_funcs.h" #include "visual_script_expression.h" @@ -148,3 +159,19 @@ void uninitialize_visual_script_module(ModuleInitializationLevel p_level) { } #endif } +#ifdef GDEXTENSION +extern "C" { + +// Initialization. + +GDNativeBool GDN_EXPORT example_library_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) { + godot::GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization); + + init_obj.register_initializer(initialize_visual_script_module); + init_obj.register_terminator(uninitialize_visual_script_module); + init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE); + + return init_obj.init(); +} +} +#endif diff --git a/register_types.h b/register_types.h index 90f84de..7499495 100644 --- a/register_types.h +++ b/register_types.h @@ -31,8 +31,17 @@ #ifndef VISUAL_SCRIPT_REGISTER_TYPES_H #define VISUAL_SCRIPT_REGISTER_TYPES_H +#ifdef GDEXTENSION +#include +#include +#define ModuleInitializationLevel GDNativeInitializationLevel +using namespace godot; + +#else #include "modules/register_module_types.h" +#endif + void initialize_visual_script_module(ModuleInitializationLevel p_level); void uninitialize_visual_script_module(ModuleInitializationLevel p_level); diff --git a/visual_script.cpp b/visual_script.cpp index 7324937..182d488 100644 --- a/visual_script.cpp +++ b/visual_script.cpp @@ -30,10 +30,18 @@ #include "visual_script.h" +#ifdef GDEXTENSION +#include +#include +#include +#else + #include "core/config/project_settings.h" #include "core/core_string_names.h" #include "core/os/os.h" #include "scene/main/node.h" +#endif + #include "visual_script_nodes.h" // Used by editor, this is not really saved. @@ -1783,15 +1791,19 @@ void VisualScriptInstance::notification(int p_notification) { } String VisualScriptInstance::to_string(bool *r_valid) { - if (has_method(CoreStringNames::get_singleton()->_to_string)) { + static StringName sname; + if (sname.is_empty()) { + sname = StringName("_to_string"); + } + if (has_method(sname)) { Callable::CallError ce; - Variant ret = callp(CoreStringNames::get_singleton()->_to_string, nullptr, 0, ce); + Variant ret = callp(sname, nullptr, 0, ce); if (ce.error == Callable::CallError::CALL_OK) { if (ret.get_type() != Variant::STRING) { if (r_valid) { *r_valid = false; } - ERR_FAIL_V_MSG(String(), "Wrong type for " + CoreStringNames::get_singleton()->_to_string + ", must be a String."); + ERR_FAIL_V_MSG(String(), "Wrong type for " + sname + ", must be a String."); } if (r_valid) { *r_valid = true; diff --git a/visual_script.h b/visual_script.h index d3a90d5..d3fa18c 100644 --- a/visual_script.h +++ b/visual_script.h @@ -31,12 +31,39 @@ #ifndef VISUAL_SCRIPT_H #define VISUAL_SCRIPT_H +#ifdef GDEXTENSION +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace godot; + +#define RES_BASE_EXTENSION(ext) + +// TODO This will need more work than just this. +#define ScriptLanguage ScriptLanguageExtension + +// TODO ScriptInstance (via C struct: GDNativeExtensionScriptInstanceInfo, see gdnative_interface.h). +class ScriptInstance { + +}; + +#else #include "core/debugger/engine_debugger.h" #include "core/debugger/script_debugger.h" #include "core/doc_data.h" #include "core/object/script_language.h" #include "core/os/thread.h" #include "core/templates/rb_set.h" +#endif class VisualScriptInstance; class VisualScriptNodeInstance; @@ -64,31 +91,31 @@ class VisualScriptNode : public Resource { public: Ref get_visual_script() const; - virtual int get_output_sequence_port_count() const = 0; - virtual bool has_input_sequence_port() const = 0; + virtual int get_output_sequence_port_count() const { return 0; } + virtual bool has_input_sequence_port() const { return false; } - virtual String get_output_sequence_port_text(int p_port) const = 0; + virtual String get_output_sequence_port_text(int p_port) const { return ""; } virtual bool has_mixed_input_and_sequence_ports() const { return false; } - virtual int get_input_value_port_count() const = 0; - virtual int get_output_value_port_count() const = 0; + virtual int get_input_value_port_count() const { return 0; } + virtual int get_output_value_port_count() const { return 0; } - virtual PropertyInfo get_input_value_port_info(int p_idx) const = 0; - virtual PropertyInfo get_output_value_port_info(int p_idx) const = 0; + virtual PropertyInfo get_input_value_port_info(int p_idx) const { return PropertyInfo(); } + virtual PropertyInfo get_output_value_port_info(int p_idx) const { return PropertyInfo(); } void set_default_input_value(int p_port, const Variant &p_value); Variant get_default_input_value(int p_port) const; - virtual String get_caption() const = 0; + virtual String get_caption() const { return ""; } virtual String get_text() const; - virtual String get_category() const = 0; + virtual String get_category() const { return ""; } // Used by editor, this is not really saved. void set_breakpoint(bool p_breakpoint); bool is_breakpoint() const; - virtual VisualScriptNodeInstance *instantiate(VisualScriptInstance *p_instance) = 0; + virtual VisualScriptNodeInstance *instantiate(VisualScriptInstance *p_instance) { return nullptr; } struct TypeGuess { Variant::Type type = Variant::NIL; @@ -154,6 +181,7 @@ class VisualScriptNodeInstance { virtual int get_working_memory_size() const { return 0; } + // TODO What to do with Callable::CallError ? Add to godot-cpp? Does it make sense? Is it exposed to extensions? virtual int step(const Variant **p_inputs, Variant **p_outputs, StartMode p_start_mode, Variant *p_working_mem, Callable::CallError &r_error, String &r_error_str) = 0; // Do a step, return which sequence port to go out. Ref get_base_node() { return Ref(base); } diff --git a/visual_script_builtin_funcs.h b/visual_script_builtin_funcs.h index 18935b9..09f77f3 100644 --- a/visual_script_builtin_funcs.h +++ b/visual_script_builtin_funcs.h @@ -146,7 +146,12 @@ class VisualScriptBuiltinFunc : public VisualScriptNode { VisualScriptBuiltinFunc(); }; +#ifdef GDEXTENSION +VARIANT_ENUM_CAST(VisualScriptBuiltinFunc, BuiltinFunc); + +#else VARIANT_ENUM_CAST(VisualScriptBuiltinFunc::BuiltinFunc) +#endif void register_visual_script_builtin_func_node(); diff --git a/visual_script_func_nodes.h b/visual_script_func_nodes.h index 70f6013..d32441c 100644 --- a/visual_script_func_nodes.h +++ b/visual_script_func_nodes.h @@ -132,9 +132,6 @@ class VisualScriptFunctionCall : public VisualScriptNode { VisualScriptFunctionCall(); }; -VARIANT_ENUM_CAST(VisualScriptFunctionCall::CallMode); -VARIANT_ENUM_CAST(VisualScriptFunctionCall::RPCCallMode); - class VisualScriptPropertySet : public VisualScriptNode { GDCLASS(VisualScriptPropertySet, VisualScriptNode); @@ -237,9 +234,6 @@ class VisualScriptPropertySet : public VisualScriptNode { VisualScriptPropertySet(); }; -VARIANT_ENUM_CAST(VisualScriptPropertySet::CallMode); -VARIANT_ENUM_CAST(VisualScriptPropertySet::AssignOp); - class VisualScriptPropertyGet : public VisualScriptNode { GDCLASS(VisualScriptPropertyGet, VisualScriptNode); @@ -321,8 +315,6 @@ class VisualScriptPropertyGet : public VisualScriptNode { VisualScriptPropertyGet(); }; -VARIANT_ENUM_CAST(VisualScriptPropertyGet::CallMode); - class VisualScriptEmitSignal : public VisualScriptNode { GDCLASS(VisualScriptEmitSignal, VisualScriptNode); @@ -360,4 +352,20 @@ class VisualScriptEmitSignal : public VisualScriptNode { void register_visual_script_func_nodes(); +#ifdef GDEXTENSION +VARIANT_ENUM_CAST(VisualScriptFunctionCall, CallMode); +VARIANT_ENUM_CAST(VisualScriptFunctionCall, RPCCallMode); +VARIANT_ENUM_CAST(VisualScriptPropertySet, CallMode); +VARIANT_ENUM_CAST(VisualScriptPropertySet, AssignOp); +VARIANT_ENUM_CAST(VisualScriptPropertyGet, CallMode); + +#else +VARIANT_ENUM_CAST(VisualScriptFunctionCall::CallMode); +VARIANT_ENUM_CAST(VisualScriptFunctionCall::RPCCallMode); +VARIANT_ENUM_CAST(VisualScriptPropertySet::CallMode); +VARIANT_ENUM_CAST(VisualScriptPropertySet::AssignOp); +VARIANT_ENUM_CAST(VisualScriptPropertyGet::CallMode); + +#endif + #endif // VISUAL_SCRIPT_FUNC_NODES_H diff --git a/visual_script_nodes.h b/visual_script_nodes.h index 72a99b9..f8f4bc1 100644 --- a/visual_script_nodes.h +++ b/visual_script_nodes.h @@ -31,9 +31,16 @@ #ifndef VISUAL_SCRIPT_NODES_H #define VISUAL_SCRIPT_NODES_H +#ifdef GDEXTENSION +#include +using namespace godot; + +#else #include "core/object/gdvirtual.gen.inc" #include "core/object/script_language.h" #include "scene/main/multiplayer_api.h" +#endif + #include "visual_script.h" class VisualScriptFunction : public VisualScriptNode { @@ -590,8 +597,6 @@ class VisualScriptMathConstant : public VisualScriptNode { VisualScriptMathConstant(); }; -VARIANT_ENUM_CAST(VisualScriptMathConstant::MathConstant) - class VisualScriptEngineSingleton : public VisualScriptNode { GDCLASS(VisualScriptEngineSingleton, VisualScriptNode); @@ -820,8 +825,6 @@ class VisualScriptCustomNode : public VisualScriptNode { VisualScriptCustomNode(); }; -VARIANT_ENUM_CAST(VisualScriptCustomNode::StartMode); - class VisualScriptSubCall : public VisualScriptNode { GDCLASS(VisualScriptSubCall, VisualScriptNode); @@ -1040,8 +1043,6 @@ class VisualScriptInputAction : public VisualScriptNode { VisualScriptInputAction(); }; -VARIANT_ENUM_CAST(VisualScriptInputAction::Mode) - class VisualScriptDeconstruct : public VisualScriptNode { GDCLASS(VisualScriptDeconstruct, VisualScriptNode); @@ -1089,4 +1090,16 @@ class VisualScriptDeconstruct : public VisualScriptNode { void register_visual_script_nodes(); void unregister_visual_script_nodes(); +#ifdef GDEXTENSION +VARIANT_ENUM_CAST(VisualScriptInputAction, Mode); +VARIANT_ENUM_CAST(VisualScriptMathConstant, MathConstant); +VARIANT_ENUM_CAST(VisualScriptCustomNode, StartMode); + +#else +VARIANT_ENUM_CAST(VisualScriptInputAction::Mode); +VARIANT_ENUM_CAST(VisualScriptMathConstant::MathConstant); +VARIANT_ENUM_CAST(VisualScriptCustomNode::StartMode); + +#endif + #endif // VISUAL_SCRIPT_NODES_H diff --git a/visual_script_yield_nodes.h b/visual_script_yield_nodes.h index 248f2b6..d848423 100644 --- a/visual_script_yield_nodes.h +++ b/visual_script_yield_nodes.h @@ -80,7 +80,6 @@ class VisualScriptYield : public VisualScriptNode { VisualScriptYield(); }; -VARIANT_ENUM_CAST(VisualScriptYield::YieldMode) class VisualScriptYieldSignal : public VisualScriptNode { GDCLASS(VisualScriptYieldSignal, VisualScriptNode); @@ -140,8 +139,17 @@ class VisualScriptYieldSignal : public VisualScriptNode { VisualScriptYieldSignal(); }; +void register_visual_script_yield_nodes(); + +#ifdef GDEXTENSION +VARIANT_ENUM_CAST(VisualScriptYield, YieldMode) +VARIANT_ENUM_CAST(VisualScriptYieldSignal, CallMode); + + +#else +VARIANT_ENUM_CAST(VisualScriptYield::YieldMode) VARIANT_ENUM_CAST(VisualScriptYieldSignal::CallMode); -void register_visual_script_yield_nodes(); +#endif #endif // VISUAL_SCRIPT_YIELD_NODES_H